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://"
# 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