Messwerte je Wert zuteilen, damit Gen2-Shellys ueber MQTT gelesen werden

Das Discovery-Modul adressiert die neueren Shellys neu: ihre Messwerte
stehen nicht mehr als Feldname zu einer HTTP-Adresse in actor_states,
sondern als Topic mit dem Feld in value_path. Geschaltet werden sie weiter
ueber HTTP - das Geraet bleibt also ein http://-Aktor, waehrend seine Werte
ueber den Broker kommen.

Der Runner teilte Messwerte bisher allein nach der Geraete-URL zu. Die
umgestellten Werte waeren damit beim HTTP-Transport gelandet, der in der
JSON-Antwort nach einem Feld namens "Power_EG/status/em:0" gesucht und nie
gefunden haette: die Werte waeren still auf ihrem letzten Stand
eingefroren. Zugeteilt wird deshalb je Messwert - was wie ein Topic
aussieht (ist_topic()), liest der MQTT-Transport, alles andere geht den
alten Weg. Fuer die aelteren Shellys aendert sich nichts, sie koennen kein
MQTT und bleiben ganz bei HTTP.

Zweitens haette der Runner den Wechsel gar nicht bemerkt. Sein
Fingerabdruck fuers Neuladen zaehlt die Zeilen von actor_states, und ein
Discovery-Lauf schreibt die Zeilen um, statt neue anzulegen - gleiche
Zeilenzahl, keine Reaktion, bis zum naechsten Neustart. Jetzt gehen url und
value_path als CRC-Summe mit ein, ebenso die command_url der Kommandos.

Nach dem naechsten Suchlauf faellt damit das Polling fuer vier Geraete weg:
34 der 35 HTTP-Messwerte wandern zum Broker, gefragt wird nur noch der
Handtuchtrockner.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-09 00:07:04 +02:00
co-authored by Claude Opus 5
parent 1e7b1d8b21
commit cc96e990fa
2 changed files with 71 additions and 11 deletions
+23
View File
@@ -14,6 +14,12 @@ URL des Aktors in der Tabelle `actors`:
entschieden, sondern an der Box-Kennung in der URL
Logic das gerechnete Geraet "Zeitpunkt" (Uhrzeit, Datum, Sonne)
Eine Ausnahme gibt es beim Lesen: meldet ein Geraet seine Messwerte an den
Broker, obwohl es ueber HTTP geschaltet wird, so steht in `actor_states.url`
ein Topic. Solche Werte liest der MQTT-Transport - siehe ist_topic() und
Runner.transport_fuer_messwert(). Das betrifft die Shellys der zweiten
Generation; die aelteren koennen kein MQTT und bleiben ganz bei HTTP.
Alle liegen in einer Datei statt in einem Paket wie bei deviceDiscovery: es
sind fuenf kurze Klassen, und wer eine sechste Geraeteart anschliesst, sieht
hier auf einen Blick, was dafuer zu tun ist.
@@ -46,6 +52,23 @@ logger = logging.getLogger("autoaction.transport")
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def ist_topic(state_url):
"""
Sieht diese Zustands-URL nach einem MQTT-Topic aus?
Gebraucht fuer die neueren Shellys: sie melden ihre Messwerte von selbst
an den Broker, geschaltet werden sie aber weiter ueber HTTP. Ihr Geraet
steht deshalb mit einer http://-Adresse in `actors`, waehrend in ihren
Messwerten ein Topic steht ("Power_EG/status/em:0"). Wer nur auf das
Geraet schaut, wuerde solche Werte im Poll-Takt suchen - und nie finden.
Ein Topic hat Schraegstriche und kein Schema davor. Feldnamen der anderen
Transporte haben beides nicht: "a_voltage", "core:ClosureState",
"seg[0].col[0]".
"""
return bool(state_url) and "/" in state_url and "://" not in state_url
def wert_aus_pfad(daten, pfad):
"""
Einen Teilwert aus einer Nutzlast holen: "[3]", "ssid", "seg[0].col[0]".