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 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 13:35:55 +02:00
co-authored by Claude Opus 5
parent 797d3dd6d9
commit f643e37676
+28 -18
View File
@@ -395,22 +395,16 @@ class TahomaTransport(Transport):
schema = "io://" 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 # An ihnen wird die Kugelschreiber-Mechanik erkannt, nicht am
# Lamellen bei etwa 30 %. In Richtung 0 % laesst sich von jeder Stellung # Kommandonamen: eine Hoehenfahrt rastet die Lamellen um, und aus der
# aus direkt neigen; darueber hinaus muss die Mechanik erst einmal auf # neuen Raststellung heraus laesst sich die Neigung nicht direkt
# 0 % zurueck, sonst rastet sie nicht um - ein "Neigung 80 %" ohne # anfahren - die Mechanik muss dafuer erst auf 0 % zurueck. Setzt ein
# diesen Umweg bleibt wirkungslos. # Befehl beide Parameter, war eine Hoehenfahrt dabei und der Umweg ist
# # faellig; setzt er nur die Neigung, steht die Mechanik schon richtig.
# 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".
# #
# Dasselbe steht in restricted/commands.php: beide Versender brauchen es. # 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" NEIGUNG_PARAMETER = "Neigung"
POSITION_PARAMETER = "Position" POSITION_PARAMETER = "Position"
@@ -509,16 +503,28 @@ class TahomaTransport(Transport):
start = time.time() start = time.time()
gestartet = False gestartet = False
zustaende = None zustaende = None
letzter_stand = None
while time.time() - start < self.JALOUSIE_WARTE_SEKUNDEN: while time.time() - start < self.JALOUSIE_WARTE_SEKUNDEN:
time.sleep(2) time.sleep(2)
gelesen = self._zustaende(actor_url) gelesen = self._zustaende(actor_url)
if gelesen is None: if gelesen is None:
continue continue
zustaende = gelesen 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 gestartet = True
continue continue
if gestartet or time.time() - start >= self.JALOUSIE_VORLAUF_SEKUNDEN: if steht and (gestartet
or time.time() - start >= self.JALOUSIE_VORLAUF_SEKUNDEN):
break break
return self._zuordnen(actor_url, zustaende) if zustaende else {} return self._zuordnen(actor_url, zustaende) if zustaende else {}
@@ -546,13 +552,17 @@ class TahomaTransport(Transport):
parameter = [100, 100] parameter = [100, 100]
position_index, neigung_index = 0, 1 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 # derselbe Befehl zweimal - erst mit Neigung 0, dann mit dem
# gewuenschten Wert. Die Position bleibt dabei stehen, die Jalousie # gewuenschten Wert. Die Position bleibt dabei stehen, die Jalousie
# faehrt also nur einmal. # 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 umweg = (neigung_index is not None
and isinstance(parameter[neigung_index], (int, float)) and position_index is not None
and parameter[neigung_index] > self.NEIGUNG_DIREKT_MAX) and isinstance(parameter[neigung_index], (int, float)))
vorstufe = list(parameter) vorstufe = list(parameter)
if umweg: if umweg:
vorstufe[neigung_index] = 0 vorstufe[neigung_index] = 0