Seite 1 von 1

NSPanel Widegts

Verfasst: 17. Aug 2022 12:21
von gsezz
Hi,
Ich versuche gerade ein Sonoff NSPanel mit Tasmota über MQTT an Openhab anzubinden. Die Kommunikation funktioniert auch schon in beide Richtungen. Ich kann von einem Widget des Panels ein Item in Openhab schalten, und wenn das Item ein Command von wo anders bekommt wird der neue Zustand auch erfolgreich ans NSPanel übergeben.
Meine Thing Konfiguration sieht so aus:

Code: Alles auswählen

Thing topic NSPanelWohnzimmer "Panel Wohnzimer"{
      Channels:
         Type switch : ID4Switch0 "Test" [stateTopic="NSPanel_WZ/tele/RESULT", transformationPattern="JSONPATH:$.NSPanel[?(@.id =='4')].params.switches[0].switch", on="on", off="off", commandTopic="NSPanel_WZ/cmnd/nspsend", formatBeforePublish="{\"relation\":{\"id\":\"4\",\"params\":{\"switches\":[{\"switch\":\"%s\",\"outlet\":0}]}}}", postCommand="true" ]  
   }
Das Problem ist jetzt nur noch, wie ich es hin bekomme dass nach dem schalten am NSPanel der neue Zustand des Items auch wieder zum NSPanel zurück gemeldet wird. Sonst springt das Widget nach einer Sekunde wieder auf den vorherigen Zustand zurück.
Ich dachte, ich lasse einfach per rule jede Statusänderung nochmal als Command ans selbe Item schicken:

Code: Alles auswählen

rule "ID4 Switch 0"
when
    Item Rollo_Automatik changed 
then
    logInfo("Test", "changed to: {}", newState)
    Rollo_Automatik.sendCommand(newState)
end
Die triggert zwar, und newState enthält auch den richtigen Wert, aber irgendwie weigert sie sich diesen als Command zu senden.

Code: Alles auswählen

2022-08-17 12:04:08.311 [INFO ] [org.openhab.core.model.script.Test  ] - changed to: ON
2022-08-17 12:04:08.313 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'NSPanel-1' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.actions.BusEvent.sendCommand(org.openhab.core.items.Item,java.lang.String) on instance: null in NSPanel
Also nochmal in Kurzform. Das Ziel ist, dass beim erfolgreichen Empfang einer Statusänderung im State Topic der neue Status ins Command Topic wieder zurück geschickt wird.

Noch eine Frage am Rande: Ich habe Schwierigkeiten damit dass Änderungen an bestehenden Thing Definitionen im MQTT Binding übernommen werden. Die einzige Möglichkeit die ich gefunden habe, wie das zuverlässig klappt ist:
1. Thing Definition komplett entfernen, bzw auskommentieren und Datei speichern
2. Definitionen von verknüpften Items komplett entfernen oder auskommentieren und Datei speichern
3. MQTT Bridge Thing im Openhab Webinterface Deaktivieren
4. Bridge wieder aktivieren
5. Auskommentierung aus der Thing Definition entfernen und Datei speichern
6. Auskommentierung aus der Item Datei entfernen und speichern.
Gibt es da eine einfachere Lösung?

Re: NSPanel Widegts

Verfasst: 17. Aug 2022 14:12
von udo1toni
Versuche es mal mit newState.toString.

Hintergrund: newState ist per Definition ein Status. sendCommand() erwartet aber ein Command als Wert.
Es gibt meines Wissens keinen direkten Weg, aus dem Status ein Command zu generieren (also sowas wie "newState as Command"). Glücklicherweise kann sendCommand() aber auch mit Strings als Wert umgehen.
Wir wandeln also den Status in einen String, womit openHAB keine Chance mehr hat, zu erkennen, dass es sich um einen Status handelt. :)

Wenn Du möchtest, dass openHAB als Aktor auftritt, musst Du den Channel als Command definieren - zu finden in den erweiterten Einstellungen (Show Advanced) und dort Is Command einschalten. Ab diesem Zeitpunkt interpretiert openHAB eine über das stateTopic eintrudelnde Nachricht als Befehl und nicht als Status. Umgekehrt sollte es Status Updates der verlinkten Items als Status über das commandTopic versenden.
Damit sollte es unnötig sein, eine entsprechende Rule laufen zu lassen. Den Aktor Channel verlinkst Du einfach mit dem selben (!) Item und schon sollte automatisch geschaltet werden (vorausgesetzt, alle Befehle und Status passen zueinander).

Re: NSPanel Widegts

Verfasst: 17. Aug 2022 20:54
von gsezz
Erstmal Danke.

Mit state.toString hat es schon funktioniert. Den Tipp muss ich mir merken.

Im Weiteren war aber der Tipp mit dem zusätzlichen Channel der Hinweis der mir gefehlt hatte. Ich bin gar nicht auf die Idee gekommen zwei Channels zu verwenden. Mit einem Channel der auf das state topic reagiert, und einem weiteren der ins command topic sendet funktioniert es auch ohne die Regel.
postCommand="true" hatte ich schon gesetzt, und was im state topic ankam hat auch ein Command ausgelöst. Aber ein auf dem Channel ankommender Command hat eben keinen ausgehenden auf dem gleichen Channel ausgelöst. Das command topic ging nur raus wenn der Command von wo anders ausgelöst wurde, z.b. von einer Regel oder einem Button im Webinterface.

Re: NSPanel Widegts

Verfasst: 15. Okt 2022 10:58
von HABuserJM
Hallo,
mein Problem ist, dass ich den Status der Schalter über MQTT irgendwie nicht abgefragt bekomme.
Das NSPanel liefert bei mir den Status nämlich nicht über "tele/nspanel_01/RESULT", sondern über "stat/nspanel_01/RESULT" als JSON-String und "stat/nspanal_01/POWER1 und POWER2" für die beiden Schalter(jeweils ON oder OFF).
Wenn ich nun einen Switch-Channel definiere und die MQTT-state und -command Topics definiere, kann ich zwar im gelinkten Item die Schalter ein- und ausschalten und habe den Status des Items, nur nicht wenn ich die Taster am Panel schalte.
Ist vielleicht der Channeltyp Switch falsch?

erledigt

Verfasst: 15. Okt 2022 12:19
von HABuserJM
Das Problem hat sich erledigt. Ich hatte dei der Channel-Definition eine "Incoming Value Transformations" drin, die ich nicht brauchte, nun bekomme ich den Status zurück.