NSPanel Widegts

Die alternative Firmware für ESP8266 based devices

Moderatoren: seppy, udo1toni

Antworten
gsezz
Beiträge: 16
Registriert: 28. Sep 2020 12:40

NSPanel Widegts

Beitrag 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?
von udo1toni » 17. Aug 2022 14:12
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).
Gehe zur vollständigen Antwort

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

Re: NSPanel Widegts

Beitrag 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).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

gsezz
Beiträge: 16
Registriert: 28. Sep 2020 12:40

Re: NSPanel Widegts

Beitrag 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.

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

Re: NSPanel Widegts

Beitrag 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?

HABuserJM
Beiträge: 86
Registriert: 18. Apr 2021 11:30
Wohnort: Berlin

erledigt

Beitrag 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.

Antworten