Seite 1 von 1

Switch Änderung über http Binding senden

Verfasst: 22. Nov 2024 12:08
von mschlee
Hallo zusammen,
für meine Torsteuerung habe ich die Übertragung von der Elektronik zu OpenHAB hinbekommen. Dabei benutze ich auch einen Switch als item, um anzuzeigen, ob die Batterie geladen wird. Jetzt will ich umgekehrt die Änderungen dieses Switches an die Elektronik übertragen und scheitere. Mit dem Befehl http://gate/data bekomme ich Daten im JSON Format, die ich in Openhab eingelesen bekomme. Um jetzt die Ladung der Batterie ein- und auszuschalten gibt es die Befehle http://gate/chargeon und http://gate/chargeoff. Dafür habe ich eine MAP Transformation gccharge.map im transform Ordner angelegt. MAP Transformation ist installiert.

Code: Alles auswählen

ON=chargeon
OFF=chargeoff
1=chargeon
0=chargeoff
Mein Thing sieht wie folgt aus:

Code: Alles auswählen

UID: http:url:f5bfdebcea
label: GateController
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://gate
  delay: 0
  stateMethod: GET
  refresh: 60
  commandMethod: GET
  contentType: application/json
  timeout: 3000
  bufferSize: 2048
channels:
  - id: last-failure
    channelTypeUID: http:request-date-time
    label: Last Failure
    configuration: {}
  - id: last-success
    channelTypeUID: http:request-date-time
    label: Last Success
    configuration: {}
  - id: gatecontrollerstatus
    channelTypeUID: http:string
    label: status
    description: ""
    configuration:
      stateExtension: /data
  - id: gatecontrollerpowervoltage
    channelTypeUID: http:number
    label: Power Voltage
    description: ""
    configuration:
      stateTransformation: JSONPATH:$.PowerVoltage
  - id: gatecontrollerbatteryvoltag
    channelTypeUID: http:number
    label: Battery Voltage
    description: ""
    configuration:
      stateExtension: /data
      stateTransformation: JSONPATH:$.BatteryVoltage
  - id: gatecontrollermovement
    channelTypeUID: http:number
    label: Movement
    description: ""
    configuration:
      stateExtension: /data
      stateTransformation: JSONPATH:$.Mode
  - id: gatecontrollerlightbarrier
    channelTypeUID: http:switch
    label: Lichtschranke
    description: ""
    configuration:
      onValue: "1"
      offValue: "0"
      stateExtension: /data
      stateTransformation: JSONPATH:$.LightBarrier
  - id: gatecontrollercontact
    channelTypeUID: http:switch
    label: Torkontakt
    description: ""
    configuration:
      onValue: "1"
      offValue: "0"
      stateExtension: /data
      stateTransformation: JSONPATH:$.GateClosed
  - id: gatecontrollercharging
    channelTypeUID: http:switch
    label: Batterieladung
    description: ""
    configuration:
      onValue: "1"
      commandTransformation: MAP(gccharge.map):$s
      offValue: "0"
      stateExtension: /data
      stateTransformation: JSONPATH:$.BatteryCharge
      commandExtension: /%2$s
  - id: gatecontrollerbatteryenabled
    channelTypeUID: http:switch
    label: Batterie aktiv
    description: ""
    configuration:
      onValue: "1"
      offValue: "0"
      stateExtension: /data
      stateTransformation: JSONPATH:$.BatteryEnabled

Das funktioniert leider nicht, die CommandExtension wird ignoriert bzw. die Transformation liefert einen Nullstring.
Ich habe nun versucht, die Transformation zu überprüfen, indem ich ein item mit der Transformation generiert habe:

Code: Alles auswählen

String TorStatus_Test "Map: [MAP(gccharge.map):%s]" <text> (gGateController) {channel="http:url:f5bfdebcea:gatecontrollercharging"}
Hier wird unabhängig von der Switch Position immer "-" angezeigt. Der Switch selbst zeigt den Zustand korrekt an.

Code: Alles auswählen

Switch GateController_BC "Batterieladung [%s]" <switch> (gGateController) {channel="http:url:f5bfdebcea:gatecontrollercharging"}
Wo ist mein Denkfehler ? Generiert der Switch als Eingangssignal für die MAP Transformation ein falsches Format ? Wie komme ich dazu, dass der Switch nicht nur die Daten von der Toreelektronik übernimmt (was funktioniert), sondern auch die Daten bei Änderung des Switches in die Elektronik übernommen werden ? Bisher habe ich so etwas kurzerhand über rules, bash und curl geregelt. Dachte, mit dem http Binding geht das eleganter.

Re: Switch Änderung über http Binding senden

Verfasst: 22. Nov 2024 13:30
von udo1toni
Herzlich willkommen im openHAB Forum (kleines open, großes HAB... ;) )

Erste Frage: wie sieht das von http://gate/data gelieferte JSON exakt aus?
Das Problem mit der nicht funktionerenden Transforamtion liegt (mindestens) an der Schreibweise, korrekt wäre

Code: Alles auswählen

commandTransformation: MAP:gccharge.map
Allerdings wäre mein Ratschlag, lieber eine verkettete stateTransformation zu nutzen:

Code: Alles auswählen

    configuration:
      onValue: "chargeon"
      commandTransformation: 
      offValue: "chargeoff"
      stateExtension: /data
      stateTransformation: JSONPATH:$.BatteryCharge∩MAP:gccharge.map
      commandExtension: /%2$s
Unter der Voraussetzung, dass $.BatteryCharge die Werte 0 oder 1 liefert, macht die verkettete Map Transformation daraus chargeon bzw. chargeoff, was von onValue bzw. offValue auf ON bzw.OFF gemappt wird. Umgekehrt wird aus dem Befehl ON/OFF direkt chargeon bzw. chargeoff und auch exakt so in die URL eingebaut.

Re: Switch Änderung über http Binding senden

Verfasst: 22. Nov 2024 14:59
von mschlee
Hmm, die korrigierte Schreibweise ändert nix. Hier noch mal der betreffende Teil, wie er jetzt steht:

Code: Alles auswählen

id: gatecontrollercharging
    channelTypeUID: http:switch
    label: Batterieladung
    description: ""
    configuration:
      onValue: "1"
      commandTransformation: MAP:gccharge.map
      offValue: "0"
      stateExtension: /data
      stateTransformation: JSONPATH:$.BatteryCharge
      commandExtension: /%2$s
  - 
Die JSON Antwort auf /data lautet:

Code: Alles auswählen

{"LightBarrier":1,"GateClosed":1,"LimitButton":0,"BatteryCharge":0,"BatteryEnabled":0,"Mode":0,"BatteryVoltage":23.54,"PowerVoltage":23.72,"RebootTime":"2024-11-22T08:56:42Z"}
Die auf /chargeon lautet:

Code: Alles auswählen

{"type":"BatteryCharge","value":1,"unit":""}
Diese sollte eigentlich ignoriert werden.

Irgendwie habe ich, glaube ich, diesen ganzen Mapping Kram nicht verstanden. Irgendwo habe ich gelesen, dass ein Switch Item im Grunde genommen ein numerischer Wert 0 oder 1 ist, der über ein eigenes Mapping auf OFF bzw. ON gemappt wird. Wenn ich jetzt den Schalter z. B. auf dem Handy umschalte, sollte ein Event generiert werden, das dann in die commandTransformation eingespeist wird (0/1 oder OFF/ON - was ist es in diesem Falle eigentlich ?). Aus der Transformation kommt dann ein String, den ich dann für die commandExtension benutze. Oder bin ich auf dem Holzweg ?

Re: Switch Änderung über http Binding senden

Verfasst: 22. Nov 2024 15:51
von mschlee
Die MAP Transformation kann ich als Fehlerursache ausschließen. Wenn ich meinen Switch zum Ein- und Ausschalten mit einem Mapping in der Anzeige versehe, wird mir das Erwartete angezeigt (je nach Switch Position chargeon oder chargeoff):

Code: Alles auswählen

Switch GateController_BC "Batterieladung [MAP(gccharge.map):%s]" <switch> (gGateController) {channel="http:url:f5bfdebcea:gatecontrollercharging"}

Re: Switch Änderung über http Binding senden

Verfasst: 22. Nov 2024 18:40
von mschlee
Die von Dir vorgeschlagene verkettete Transformation funktioniert leider nicht (hier stand erst etwas anderes). Die verkettete Transformation liefert kein zu verarbeitendes Ergebnis zurück. D. h., das Senden an die Elektronik funktioniert jetzt erwartungsgemäß, aber Änderungen in der Elektronik kommen nicht an den Switch zurück.

Re: Switch Änderung über http Binding senden

Verfasst: 23. Nov 2024 01:24
von udo1toni
Du hast die Schreibweise nicht korrekt übernommen... Da fehlt das Symbol ∩ ("Schnittmenge", in der Windows Zeichentabelle fälschlich als "Durchschnitt" bezeichnet)
Du kannst das Zeichen im Hilfetext zur stateTransformation innerhalb der Main UI finden. Auf der normalen Tastatur ist es nicht ohen Klimmzüge erreichbar (utf-Codierung ist 2229, aber das Ziel muss die Eingabe über die Codes unterstützen... Einfacher ist es, das Zeichen in die Zwishenablage zu kopieren und von dort einzufügen)
mschlee hat geschrieben: 22. Nov 2024 14:59 Irgendwie habe ich, glaube ich, diesen ganzen Mapping Kram nicht verstanden. Irgendwo habe ich gelesen, dass ein Switch Item im Grunde genommen ein numerischer Wert 0 oder 1 ist, der über ein eigenes Mapping auf OFF bzw. ON gemappt wird.
Nein.
Ein Switch Item hält einen Status vom Typ OnOffType. OnOffType hat entweder den Wert ON oder den Wert OFF. Weiterhin gibt es noch zwei weitere Zustände, die OnOffType erbt, das sind NULL und UNDEF. Beide Werte signalisieren keinen bzw. einen ungültigen Status. Und openHAB ist sehr pingelig mit den Werten.
Im Channel gibt es zwei Richtungen, rein und raus :) Vom Item kommend wird der Status ON/OFF über die beiden Parameter onValue/offValue in zwei andere beliebige String umgewandelt, an dieser Stelle kann man also 0/1, on/off oder auch Hugendubel/Konstantinopel als Werte definieren.
Der Punkt ist aber: an dieser Stelle werden die Werte ankommend exakt umgekehrt gewandelt, wenn Du also ankommend ein Wertepaar 0/1 hast, abgehend aber das Wertepaar chargeon/chargeoff benötigst, dann musst Du zwingend in der ankommenden Kette aus 1/0 chargeon/chargeoff machen, oder alternativ auf der abgehenden Seite aus 0/1 das chargeon/chargeoff erzeugen, dafür dann aber onValue und offValue auf 1/0 setzen.

Die Senderichtung sieht so aus: Itemcommand -> onValue/offValue -> comandTransformation -> Übergabe an commandExtension über den Platzhalter %2$s.
Die Empfangsrichtung läuft im Grunge genau andersherum, ankommender Wert -> stateTransformation -> onValue/offValue -> Itemstate.

Zum testen kann es sinnvoll sein, statt eines switch Channels einfach einen string Channel zu verwenden. Dort gibt es (logischerweise) kein onValue/offValue, dafür kannst Du aber in einem verlinkten String Item exakt sehen, was das Ergebnis der stateTransformation ist.

Re: Switch Änderung über http Binding senden

Verfasst: 23. Nov 2024 13:11
von mschlee
Ups, ich habe mich gestern Nacht noch mit dem ganzen Kram rumgeschlagen, ohne Deine Nachricht noch gelesen zu haben :o. Ich musste feststellen, dass die von Dir genannte Schreibweise der MAP Transformation tatsächlich das korrekte Ergebnis erzielt. Ich wurde dadurch irritiert, dass trotzdem Anfragen an http://gate/ gestellt wurden. Die hatten aber mit dem Switch nichts zu tun. Der Switch sendet jetzt die richtigen Daten, aber eben nur bei Änderung der Schalterstellung.

Die Schreibweise der verketteten Transformation wird mir auf dem alten Mac hier im Forum nicht korrekt angezeigt. Vielleicht hat dadurch das Copy'n'Paste nicht korrekt funktioniert.

Vielen Dank nochmal für Deine Hilfe und für die Darstellung der Konversionen und Transformation des http-Bindings. So etwas habe ich in der Original-Doku zum Binding vermisst.

Re: Switch Änderung über http Binding senden

Verfasst: 23. Nov 2024 13:47
von udo1toni
Immer gerne :)
mschlee hat geschrieben: 23. Nov 2024 13:11 Die Schreibweise der verketteten Transformation wird mir auf dem alten Mac hier im Forum nicht korrekt angezeigt.
Dann verwendet der Mac keine UTF-8 oder UTF-16 Codierung?