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:
@@ -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]".
|
||||
|
||||
Reference in New Issue
Block a user