Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
wants to merge 2 commits into from

Conversation

hawa-lc4
Copy link

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 benderl linked an issue May 30, 2024 that may be closed by this pull request
@benderl benderl added the enhancement New feature or request label May 30, 2024
@benderl
Copy link
Collaborator

benderl commented Jun 6, 2024

@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
Copy link
Author

hawa-lc4 commented Jun 6, 2024

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

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

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.
@hawa-lc4
Copy link
Author

hawa-lc4 commented Jun 6, 2024

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
Copy link
Collaborator

benderl commented Jun 6, 2024

"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
Copy link
Contributor

okaegi commented Jun 6, 2024

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
Copy link
Author

hawa-lc4 commented Jun 6, 2024

@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
Copy link
Contributor

okaegi commented Jun 7, 2024 via email

@hawa-lc4
Copy link
Author

hawa-lc4 commented Jun 7, 2024

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
Copy link
Contributor

okaegi commented Jun 7, 2024 via email

@hawa-lc4
Copy link
Author

hawa-lc4 commented Jun 7, 2024

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
Copy link
Author

hawa-lc4 commented Jun 7, 2024

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

@hawa-lc4 hawa-lc4 closed this Jun 7, 2024
@hawa-lc4 hawa-lc4 deleted the topic-smarthome-tasmota branch June 7, 2024 11:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

smarthome Tasmota: changed json reporting since version 14.x
3 participants