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