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