snaptec / openWB

openWB - die modulare Wallbox
https://openwb.de
GNU General Public License v3.0
339 stars 204 forks source link

adapt watt.py to changed status response starting Tasmota 14.x #2840

Closed hawa-lc4 closed 5 months ago

hawa-lc4 commented 6 months ago

Since Tasmota version 14.x the json reporting is changed and it seems to be the case this beeing the new standard there. The documentation regarding this however seems to be weak. For smarthome devices based on Tasmota the actual power and power state is requested in "watt.py" by using the response of the Status command. The response for "Status" changed regarding the power state from an integer value (e.g. ...,"Power":3,.....) representing the power state of all configured relais to a string value showing each relais in a bitwise state (e.g. ...,"Power":"011",.....). As a result the script "watt.py" is no longer able to determine the power state correctly.

My working solution is as attached file watt.py and has an addition to report also the consumed energy. This works for Tasmota version 12.x/13.x and 14.x as well, assuming the primary relais controlled by openWB is always the first (or only) relais and is reported as "POWER" or "POWER1" by "Status 11" command.

benderl commented 5 months ago

@okaegi Kannst Du Dir das bitte ansehen? Ich habe die Änderungen grob überflogen und habe zumindest Bedenken wegen der Abwärtskompatibilität. Die alte URL "http://"+str(ipadr)+"/cm?cmnd=Status" wird jetzt gar nicht mehr berücksichtigt.

hawa-lc4 commented 5 months ago

@benderl wie weit zurück soll die Abwärtskompatibilität bezüglich der Tasmota Versionen gehen? Ich kann zumindest für die Versionen 12.3.x und höher bestätigen das die Ausgabe von "Status 11" aussagekräftig und verwertbar ist, wie in meinem Skript verwendet. Solche Geräte mit Versionen 12, 13 und 14 habe ich derzeit aktiv im Einsatz ohne Probleme.

Die meisten meiner SmartHome Geräte haben mehr als einen Schaltaktor und daher ist auch über die Ausgabe des "Status" bei Power nicht direkt mit Originalskript "watt.py" auszuwerten gewesen. Der Wert für Power war bisher immer der Dezimalwert für die Summe des Schaltzustandes aller Schaltaktoren. Bei 3 "Relais" z.B. war das daher ein Wert zwischen 0 und 7. In der Annahme das der für openWB relevante Schaltaktor immer der erste war mußte in der Rückgabewert mit Modulo 2 behandelt werden: r_status = int((answer2['Status']['Power']) % 2)

Aus diesem Dezimalwert für Power ist nun in der Version 14 ein Stringwert mit der binären Darstellung der Relais-Status geworden. Bei meinem Beispiel mit 3 Relais kommt dann etwas mit "000" bis "111" als Antwort. Hier müßte nun der Stringwert erst in eine Integer gewandelt werden und dann mit Bit-Vergleich auf den Status des relevanten Relais geprüft werden. Da ich zugegebenermaßen nicht der Python Spezialist bin habe ich nach den einfachsten Weg gesucht und das war eben weg von der Abfrage des einfachen Status hin zu "Status 11". Außerdem bin ich mir sicher das die meisten Anwender die Sache mit den Schaltaktoren nicht so aufwändig machen wie ich, daher habe ich mich auf die Verwendung der ersten bzw. einzigen Relais im Tasmota Device konzentriert.

Wenn ich hier bei Tests oder Dokumentationen helfen kann bin ich dazu gerne bereit.

hawa-lc4 commented 5 months ago

Rework of commit "adapt watt.py to changed status response starting Tasmota 14.x" PullRequest #2840

Regarding concerns of backward compatibility of this script to older versions of Tasmota the URL has been reverted to the previously one used and the evaluation of the relais status has been adopted to serve Tasmota pre version 14.x as well as newer versions.

see attached file watt.py.txt as a replacement of the original PullRequest watt.py.txt

benderl commented 5 months ago

"Abwärtskompatibilität" bedeutet in diesem Zusammenhang, dass durch den Commit alle bisher unterstützten Versionen weiterhin funktionieren müssen. Da sich die URL (vorher) geändert hat, hatte ich Bedenken deswegen. Jetzt sollte es ohne Benutzereingriff auch für bestehende Installationen weiter funktionieren.

okaegi commented 5 months ago

Was es hatte ein Tasmoto version wo kein on und off Status kam, sondern nur die aktuelle Leistungsaufnahme. Das wurde mit diesem coding erreicht, was ich nun nicht mehr sehe. Der Status vom tasmota wurde in zuerst in r_status gelesen. Mit dieser Bedigung kommt am schluss raus: Wenn von tasmota gemeldet Status = on oder mehr wie 50 Watt Leistungsaufnahme dann is tasmota an.... if (aktpower > 50) or (r_status == 1): relais = 1

hawa-lc4 commented 5 months ago

@okaegi Der Sinn der genannten Code-Zeile if (aktpower > 50) or (r_status == 1): hat sich mir nie erschlossen. Wenn ein Tasmota device korrekt arbeitet dann sollte immer ein korrekter Status für den Zustand des Relais (Power) abzufragen sein. Andernfalls kann auch den Werten im "Status 8" nicht vertraut werden, oder doch? Ist das device nicht erreichbar läuft das Programm bei der Abfrage der "answer" in die exception Routine und der Status "relais" wird auf 0 gesetzt. Etwas anderes macht für mich keinen Sinn denn im Grunde ist jeder Wert hier reine Hypothese.

Warum dann ausgerechnet ein Wert größer 50? Könnte doch auch 100 oder 1000 sein?? Wenn das Tasmota device einen Stromsensor hat und der nicht absolut korrekt kalibriert ist kommt auch im ausgeschalteten Zustand oft eine Leistung größer 50Watt zur Anzeige, was defakto Unsinn ist. Solche Falschmeldungen können bei Störungen im Netz auch nur temporär auftreten. Warum in dieser Situation also nicht dem Abfragewert "Power" im Status vertrauen sondern dann den Zustand eingeschaltet annehmen nur weil u.U. nur kurzzeitig eine Leistung größer 50Watt gemeldet wird?

Edit: den obigen Eintrag bitte einfach ignorieren und das coding lassen wie beschrieben: if (aktpower > 50) or (r_status == 1): relais = 1

okaegi commented 5 months ago

Es war ein Firmwareversion von tasmota die keinen Status geliefert hat. Wie häufig die ist weiss ich nicht. Der hat tatsächlichen keinen Status sondern nur Leistunggsmessung geliefert (gibt es bei Shellies häufiger).Bei shellies die nur zur Leistungsmessung verwendet werden (typ kein Gerät) hab ich diese Funktion derweilen ins openwb gezogen. Dort kann derweilen natürlich auch die entsprechende Grenze für Tasmota eingeben werden, aber wann der Shelly als eingeschaltet geführt wird. So gesehen braucht es das coding nicht mehr, aber kommt dein coding klar wenn es keinen on Status hat ? Kommt dann nur die Leidtungsaufnahme ?Gruss OliverAm 06.06.2024 17:43 schrieb hawa-lc4 @.***>: @okaegi Der Sinn der genannten Code-Zeile if (aktpower > 50) or (r_status == 1): hat sich mir nie erschlossen. Wenn ein Tasmota device korrekt arbeitet dann sollte immer ein korrekter Status für den Zustand des Relais (Power) abzufragen sein. Andernfalls kann auch den Werten im "Status 8" nicht vertraut werden, oder doch? Ist das device nicht erreichbar läuft das Programm bei der Abfrage der "answer" in die exception Routine und der Status "relais" wird auf 0 gesetzt. Etwas anderes macht für mich keinen Sinn denn im Grunde ist jeder Wert hier reine Hypothese. Warum dann ausgerechnet ein Wert größer 50? Könnte doch auch 100 oder 1000 sein?? Wenn das Tasmota device einen Stromsensor hat und der nicht absolut korrekt kalibriert ist kommt auch im ausgeschalteten Zustand oft eine Leistung größer 50Watt zur Anzeige, was defakto Unsinn ist. Solche Falschmeldungen können bei Störungen im Netz auch nur temporär auftreten. Warum in dieser Situation also nicht dem Abfragewert "Power" im Status vertrauen sondern dann den Zustand eingeschaltet annehmen nur weil u.U. nur kurzzeitig eine Leistung größer 50Watt gemeldet wird?

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

hawa-lc4 commented 5 months ago

Ich habe testweise die Firmware im Archiv von Tasmota zurück bis zur Version 7.2.0 installiert und alle zeigen bezüglich der hier relevanten Parameter das selbe Ausgabeformat wir die Version 13.x. Alle diese Versionen sollten mit dem Skript keine Probleme haben. Die noch älteren Versionen mit der Bezeichnung (von Theo Arends) Sonoff und den Versionen 6.7.1 und 5.14.0 habe ich auf die Schnelle nicht zum laufen bekommen und daher nicht weiter verfolgt. Ob also Versionen älter als die 7.2.0 ein solches Verhalten aufweisen kann ich nicht sagen bzw. werde es nicht weiter untersuchen. Sollte das ein k.o. Kriterium sein, dann ist das eben so. (siehe Migration Information) Die Änderung im Ausgabeformat wurde erst mit der V14.x implementiert.

Shellys die mit Tasmota geflasht sind (auch solche habe ich in Betrieb) betrachte ich als Tasmota device, nicht mehr als Shelly. Shellys mit Original-Firmware habe in openWB ein eigenes Modul mit eigenem Python Code. An dem ist nicht vorgesehen das etwas geändert werden soll.

Meine Geräte haben alle die Leistungsmessung im Gerät integriert, genauso wie die Schaltfunktion. Wenn ich also Daten vom Gerät bekomme dann alles, oder das Gerät ist nicht erreichbar (oder vom Netz getrennt, o.ä.) dann bekomme ich gar nichts und das Skript nimmt den Zustand "ausgeschaltet" an. Wenn die Daten (z.B. wegen eines Gerätedefekts) beschädigt oder verstümmelt (=Müll) geliefert werden dann sollte das alles durch die Exception Routine abgefangen werden und das Gerät ebenfalls aus "ausgeschaltet" angenommen werden.

Ein besonderer Punkt ist noch die Konfiguration für Geräte mit separater Leistungsmessung. Hier wird im entsprechenden SmartHome Gerät von openWB noch eine zweite Geräte-Instanz mit eigener IP-Adresse hinzugefügt. Da kenne ich jetzt den vor dem Modul Code (on.py, off.py, watt.py) liegenden Code nicht welche Informationen dann über die IP des Schaltaktor-Device und welche über die des Leistungsmessungs-Device geholt werden. Die Möglichkeit der Situationen wird dann durchaus komplex. Wenn das Schaltaktor-Device eingeschaltet ist aber nicht erreichbar kann das Leistungsmessungs-Device durchaus noch gültige Werte liefern. Tja, was nun? Ich hatte jetzt nicht vor den gesamten Code von openWB bezüglich SmartHome Devices durchzuarbeiten. ;) Wie immer im coding: 90% sind Fehlerbehandlung und nur 10% sind die Funktion.

okaegi commented 5 months ago

HalloEin besonderer Punkt ist noch die Konfiguration für Geräte mit separater LeistungsmessungHier wird dann einfach der watt.py noch mal separat mit der zweiten ip adresse aufgerufen. Und es werden die akruelle Leistung und der Zähler übernommen.Gruss OliverAm 07.06.2024 12:19 schrieb hawa-lc4 @.***>: Ich habe testweise die Firmware im Archiv von Tasmota zurück bis zur Version 7.2.0 installiert und alle zeigen bezüglich der hier relevanten Parameter das selbe Ausgabeformat wir die Version 13.x. Alle diese Versionen sollten mit dem Skript keine Probleme haben. Die noch älteren Versionen mit der Bezeichnung (von Theo Arends) Sonoff und den Versionen 6.7.1 und 5.14.0 habe ich auf die Schnelle nicht zum laufen bekommen und daher nicht weiter verfolgt. Ob also Versionen älter als die 7.2.0 ein solches Verhalten aufweisen kann ich nicht sagen bzw. werde es nicht weiter untersuchen. Sollte das ein k.o. Kriterium sein, dann ist das eben so. (siehe Migration Information) Die Änderung im Ausgabeformat wurde erst mit der V14.x implementiert. Shellys die mit Tasmota geflasht sind (auch solche habe ich in Betrieb) betrachte ich als Tasmota device, nicht mehr als Shelly. Shellys mit Original-Firmware habe in openWB ein eigenes Modul mit eigenem Python Code. An dem ist nicht vorgesehen das etwas geändert werden soll. Meine Geräte haben alle die Leistungsmessung im Gerät integriert, genauso wie die Schaltfunktion. Wenn ich also Daten vom Gerät bekomme dann alles, oder das Gerät ist nicht erreichbar (oder vom Netz getrennt, o.ä.) dann bekomme ich gar nichts und das Skript nimmt den Zustand "ausgeschaltet" an. Wenn die Daten (z.B. wegen eines Gerätedefekts) beschädigt oder verstümmelt (=Müll) geliefert werden dann sollte das alles durch die Exception Routine abgefangen werden und das Gerät ebenfalls aus "ausgeschaltet" angenommen werden. Ein besonderer Punkt ist noch die Konfiguration für Geräte mit separater Leistungsmessung. Hier wird im entsprechenden SmartHome Gerät von openWB noch eine zweite Geräte-Instanz mit eigener IP-Adresse hinzugefügt. Da kenne ich jetzt den vor dem Modul Code (on.py, off.py, watt.py) liegenden Code nicht welche Informationen dann über die IP des Schaltaktor-Device und welche über die des Leistungsmessungs-Device geholt werden. Die Möglichkeit der Situationen wird dann durchaus komplex. Wenn das Schaltaktor-Device eingeschaltet ist aber nicht erreichbar kann das Leistungsmessungs-Device durchaus noch gültige Werte liefern. Tja, was nun? Ich hatte jetzt nicht vor den gesamten Code von openWB bezüglich SmartHome Devices durchzuarbeiten. ;) Wie immer im coding: 90% sind Fehlerbehandlung und nur 10% sind die Funktion.

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you were mentioned.Message ID: @.***>

hawa-lc4 commented 5 months ago

Wie ich schon früher schrieb: dann den Code an dieser Stelle lassen wie er ist. if (aktpower > 50) or (r_status == 1): relais = 1

hawa-lc4 commented 5 months ago

Please refer to issue #2839. Coding needed not clear regarding required functionality of this module.