From f643e376766af90bae3777e0f0d393da57eaeff0 Mon Sep 17 00:00:00 2001 From: Moirtz Wagner Date: Sat, 5 Sep 2026 13:35:55 +0200 Subject: [PATCH] Ende der Fahrt abwarten, Umweg an die Hoehe binden Dieselben zwei Korrekturen wie im Web-Repo (Smart-Dashboard, fe8602a) - beide Versender muessen sich hier einig sein. nachlesen() brach auf "core:MovingState ist false" ab. Die Box meldet das Ende der Fahrt aber, bevor Hoehe und Neigung darauf nachgezogen haben; festgehalten wurde dann der Wert von kurz davor. Jetzt zaehlen zwei gleiche Ablesungen hintereinander. Der Umweg der Kugelschreiber-Mechanik haengt nicht mehr am Neigungswert (ueber 30 %), sondern daran, ob der Befehl die Hoehe mitsetzt: eine Hoehenfahrt rastet die Lamellen um, danach muss die Neigung ueber 0 % wieder angefahren werden, bei jedem Winkel. Eine Aktion, die nur die Neigung setzt, faehrt direkt; eine, die nur die Position setzt, hat kein Neigungsziel und kann nichts nachfahren - dafuer gibt es "Position+Neigung". Geprueft mit sieben Faellen gegen diese Datei: Position+Neigung 10 und 80 nehmen den Umweg, reine Neigung 10 und 80 gehen direkt, "Zu" wird zu 100/100 mit Umweg, ein Rollladen ohne Lamellen bleibt bei "down". Co-Authored-By: Claude Opus 5 --- autoActions/transports.py | 46 ++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/autoActions/transports.py b/autoActions/transports.py index 474b5cd..7372cb9 100644 --- a/autoActions/transports.py +++ b/autoActions/transports.py @@ -395,22 +395,16 @@ class TahomaTransport(Transport): schema = "io://" - # Bis zu dieser Neigung fahren die Aussenjalousien direkt. + # So heissen die beiden Parameter einer Jalousie im Geraetemodell. # - # Sie haben eine Kugelschreiber-Mechanik: beim Herunterfahren stehen die - # Lamellen bei etwa 30 %. In Richtung 0 % laesst sich von jeder Stellung - # aus direkt neigen; darueber hinaus muss die Mechanik erst einmal auf - # 0 % zurueck, sonst rastet sie nicht um - ein "Neigung 80 %" ohne - # diesen Umweg bleibt wirkungslos. - # - # Das gilt fuer jedes Kommando, das die Neigung setzt - "Neigung" ebenso - # wie "Position+Neigung". Erkannt wird es deshalb am Parameter und nicht - # am Kommandonamen: beide heissen ihren Neigungsparameter "Neigung". + # An ihnen wird die Kugelschreiber-Mechanik erkannt, nicht am + # Kommandonamen: eine Hoehenfahrt rastet die Lamellen um, und aus der + # neuen Raststellung heraus laesst sich die Neigung nicht direkt + # anfahren - die Mechanik muss dafuer erst auf 0 % zurueck. Setzt ein + # Befehl beide Parameter, war eine Hoehenfahrt dabei und der Umweg ist + # faellig; setzt er nur die Neigung, steht die Mechanik schon richtig. # # Dasselbe steht in restricted/commands.php: beide Versender brauchen es. - NEIGUNG_DIREKT_MAX = 30 - - # So heissen die beiden Parameter einer Jalousie im Geraetemodell. NEIGUNG_PARAMETER = "Neigung" POSITION_PARAMETER = "Position" @@ -509,16 +503,28 @@ class TahomaTransport(Transport): start = time.time() gestartet = False zustaende = None + letzter_stand = None while time.time() - start < self.JALOUSIE_WARTE_SEKUNDEN: time.sleep(2) gelesen = self._zustaende(actor_url) if gelesen is None: continue zustaende = gelesen - if zustaende.get("core:MovingState") is True: + faehrt = zustaende.get("core:MovingState") is True + # "faehrt nicht mehr" ist nicht "steht": die Box meldet das Ende + # der Fahrt, bevor Hoehe und Neigung darauf nachgezogen haben. + # Erst zwei gleiche Ablesungen hintereinander sind der Endstand. + stand = None if faehrt else ( + str(zustaende.get("core:ClosureState")), + str(zustaende.get("core:SlateOrientationState"))) + steht = stand is not None and stand == letzter_stand + letzter_stand = stand + + if faehrt: gestartet = True continue - if gestartet or time.time() - start >= self.JALOUSIE_VORLAUF_SEKUNDEN: + if steht and (gestartet + or time.time() - start >= self.JALOUSIE_VORLAUF_SEKUNDEN): break return self._zuordnen(actor_url, zustaende) if zustaende else {} @@ -546,13 +552,17 @@ class TahomaTransport(Transport): parameter = [100, 100] position_index, neigung_index = 0, 1 - # Kugelschreiber-Mechanik, siehe NEIGUNG_DIREKT_MAX. Geschickt wird + # Kugelschreiber-Mechanik, siehe NEIGUNG_PARAMETER. Geschickt wird # derselbe Befehl zweimal - erst mit Neigung 0, dann mit dem # gewuenschten Wert. Die Position bleibt dabei stehen, die Jalousie # faehrt also nur einmal. + # + # Eine Aktion, die nur die Position setzt, hat kein Neigungsziel - + # fuer die gibt es hier nichts zu tun. Wer die Neigung nach einer + # Hoehenfahrt gestellt haben will, nimmt "Position+Neigung". umweg = (neigung_index is not None - and isinstance(parameter[neigung_index], (int, float)) - and parameter[neigung_index] > self.NEIGUNG_DIREKT_MAX) + and position_index is not None + and isinstance(parameter[neigung_index], (int, float))) vorstufe = list(parameter) if umweg: vorstufe[neigung_index] = 0