Shelly und MQTT: Schalten geht, Zustand wird nicht zurückgemeldet

Geflasht oder ungeflasht ...

Moderator: seppy

Antworten
Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Shelly und MQTT: Schalten geht, Zustand wird nicht zurückgemeldet

Beitrag von Moadin »

Liebes Forum

ich versuche schon länger verzweifelt meinen Shelly mit Openhab 4.2 zum Schalten zu bringen. Nach vielen Versuchen hat es nun endlich geklappt. Leider aber wird der Schaltzustand aber nicht übernommen. Wenn ich den Shelly mit der Shelly-App anschalte, bleibt in Openhab der Schalter auf aus. Hier ist mein Code:

Code: Alles auswählen

UID: mqtt:topic:mqtt_binding:heizung_eltern
label: Heizung Eltern
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mqtt_binding
location: Elternzimmer
channels:
  - id: schalten_heizung_eltern
    channelTypeUID: mqtt:switch
    label: Schalten Heizung Eltern
    description: ""
    configuration:
      commandTopic: shellyplus1pm-eltern/rpc
      postCommand: false
      stateTopic: shellyplus1pm-eltern/status/switch:0
      transformationPattern: JSONPATH:$.outputnMAP:false_true.map
      off: '{"method":"Switch.Set","params":{"id":0,"on":false}}'
      on: '{"method":"Switch.Set","params":{"id":0,"on":true}}'
Irgendetwas mache ich falsch, nur weiss ich nicht was. Hängt es mit dem transfomrationPattern zusammen? In der false_true.map habe ich folgendes drinstehen:

Code: Alles auswählen

false=off
true=on
Ich danke euch für eure Lösungsideen.

Liebe Grüsse

Moadin

Benutzeravatar
udo1toni
Beiträge: 15240
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Shelly und MQTT: Schalten geht, Zustand wird nicht zurückgemeldet

Beitrag von udo1toni »

Herzlich willkommen im openHAB Forum!

Das Problem bei einem Channel ist: beide Richtungen (ankommend/abgehend) müssen identische Werte liefern. Bei einem Switch Item, verknüpft mit einem switch Channel, sind das die Werte ON und OFF.
Shelly liefert den Zustand des Switches über das Topic status/switch:0, und zwar als JSON. Das bedeutet, Du musst als transformationPattern einfach JSONPATH:$.output setzen. Das Ergebnis ist dann true oder false.
Damit steht fest, was als on und off gesetzt werden muss, damit aus diesen beiden Werten ON bzw. OFF wird.
Zum Senden muss nun das ausgehende Kommando noch formatiert werden, das geschieht über den Parameter formatBeforePublish. Hier wird das abgehende JSON angegeben, wobei der Wert true/false mit dem Platzhalter %s übergeben wird. Dein Thing müsste also so aussehen:

Code: Alles auswählen

UID: mqtt:topic:mqtt_binding:heizung_eltern
label: Heizung Eltern
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mqtt_binding
location: Elternzimmer
channels:
  - id: schalten_heizung_eltern
    channelTypeUID: mqtt:switch
    label: Schalten Heizung Eltern
    description: ""
    configuration:
      commandTopic: shellyplus1pm-eltern/rpc
      postCommand: false
      stateTopic: shellyplus1pm-eltern/status/switch:0
      transformationPattern: JSONPATH:$.output
      off: 'false'
      on: 'true'
      formatBeforePublish: '{"method": "Switch.Set", "params": {"id": 0, "on": %s}}'
Tipp zu den UIDs:
mqtt_binding ist kein günstiger Name für die mqtt Bridge. Besser wäre broker (um den handelt es sich ja), oder meinetwegen mosquitto.
Als UID für den Channel erscheint schalten_heizung_eltern reichlich doppelt gemoppelt. Die UID des Channels lautet dann vollständig mqtt:topic:mqtt_binding:heizung_eltern:schalten_heizung_eltern dabei wäre mqtt:topic:mosquitto:heizung_eltern:schalten genauso aussagekräftig, nur ohne den Ballast.

Deine Konfiguration liefert ankommend über das Mapping die Werte on und off. Diese Werte werden anschließend mit dem Inhalt von on und off verglichen. Dort steht aber {"method":"Switch.Set","params":{"id":0,"on":false}} bzw. {"method":"Switch.Set","params":{"id":0,"on":true}}, was etwas anderes als on bzw. off ist. Im Übrigen müsste wenn, dann ON bzw. OFF geliefert werden, aber wie oben erwähnt, ist die saubere Lösung eine andere...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Moadin
Beiträge: 6
Registriert: 11. Apr 2020 14:08
Answers: 0

Re: Shelly und MQTT: Schalten geht, Zustand wird nicht zurückgemeldet

Beitrag von Moadin »

Vielen Dank, funktioniert tadellos!
Ich habe auch gleich Deine Vorschläge umgesetzt, smile:

Code: Alles auswählen

UID: mqtt:topic:mosquitto:heizung_eltern
label: Heizung Eltern
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:mosquitto
location: Elternzimmer
channels:
  - id: schalten
    channelTypeUID: mqtt:switch
    label: Schalten
    description: ""
    configuration:
      postCommand: false
      formatBeforePublish: '{"method": "Switch.Set", "params": {"id": 0, "on": %s}}'
      commandTopic: shellyplus1pm-eltern/rpc
      stateTopic: shellyplus1pm-eltern/status/switch:0
      transformationPattern: JSONPATH:$.output
      off: "false"
      on: "true"
Liebe Grüsse

Antworten