Runner liest nach einem Tahoma-Kommando gleich nach

Bewegt eine Automatik eine Jalousie, stand ihr alter Stand bis zu fuenf
Minuten in actor_states - so lange dauert es bis zur naechsten Runde von
poll_tahoma. Im Raum-Modal sah man dann eine Jalousie, die es so nicht
mehr gab.

Der Versandfaden wartet nach dem Kommando jetzt das Ende der Fahrt ab und
meldet den Stand des Geraets zurueck; geschrieben wird er wie alles andere
im Hauptfaden. Gewartet wird nur auf core:MovingState, ohne Zielwerte -
welche das waeren, weiss an dieser Stelle niemand, und nicht jedes
Kommando loest eine Fahrt aus. Dass der Faden dabei steht, ist gewollt:
das naechste Kommando an dieselbe Jalousie darf ohnehin erst nach der
Fahrt kommen.

Transport.nachlesen() gibt es fuer alle, liefert aber nur bei Tahoma
etwas. MQTT-Geraete melden sich von selbst, HTTP und WLED werden jede
Minute gefragt.

Nebenbei: das Lesen aller Zustaende eines Geraets steckt jetzt in
_zustaende(), die Zuordnung zu den Messwert-Nummern in _zuordnen().
zustaende_lesen() und die Warteschleife der Kugelschreiber-Mechanik
benutzen beide dasselbe.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 12:18:20 +02:00
co-authored by Claude Opus 5
parent 2e155ea4a7
commit 797d3dd6d9
2 changed files with 91 additions and 21 deletions
+20
View File
@@ -497,6 +497,7 @@ class Versand:
def __init__(self):
self.warteschlangen = {} # actor_url -> Queue
self.ergebnisse = queue.Queue()
self.messwerte = queue.Queue()
self.laeuft = True
def einreihen(self, automation_id, beschreibung, transport, auftrag):
@@ -518,6 +519,15 @@ class Versand:
try:
transport.senden(auftrag)
self.ergebnisse.put((automation_id, beschreibung, None))
# Was das Geraet danach meldet, gleich mitnehmen. Bei Tahoma
# laegen sonst bis zu fuenf Minuten zwischen der Fahrt und
# dem neuen Stand in der Tabelle; die anderen Transporte
# geben hier nichts zurueck. Dass das den Faden aufhaelt, ist
# gewollt: das naechste Kommando an dieselbe Jalousie darf
# ohnehin erst nach der Fahrt kommen.
werte = transport.nachlesen(auftrag["actor_url"])
if werte:
self.messwerte.put(werte)
except Exception as fehler:
self.ergebnisse.put((automation_id, beschreibung, str(fehler)))
finally:
@@ -532,6 +542,15 @@ class Versand:
except queue.Empty:
return fertig
def messwerte_abholen(self):
"""Was die Versandfaeden nach ihren Kommandos abgelesen haben."""
neu = {}
while True:
try:
neu.update(self.messwerte.get_nowait())
except queue.Empty:
return neu
def offen(self):
return sum(s.unfinished_tasks for s in self.warteschlangen.values())
@@ -767,6 +786,7 @@ class Runner:
if billig or auch_geraete:
neu.update(transport.zustaende_lesen())
neu.update(self.sammler.abholen())
neu.update(self.versand.messwerte_abholen())
if neu:
self.werte.update(neu)
self.werte_zurueckschreiben(neu)