diff --git a/restricted/autoActions/transports.py b/restricted/autoActions/transports.py index 8af1641..51a429d 100644 --- a/restricted/autoActions/transports.py +++ b/restricted/autoActions/transports.py @@ -391,9 +391,16 @@ class TahomaTransport(Transport): # 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". + # # Dasselbe steht in restricted/commands.php: beide Versender brauchen es. NEIGUNG_DIREKT_MAX = 30 + # So heisst der Neigungsparameter im Geraetemodell. + NEIGUNG_PARAMETER = "Neigung" + # So lange wird hoechstens auf das Ende einer Neigungsfahrt gewartet. # Auf core:MovingState ist dabei kein Verlass - gemessen hat die Box # waehrend einer Neigungsfahrt kein einziges Mal "faehrt" gemeldet, der @@ -453,13 +460,17 @@ class TahomaTransport(Transport): # setClosureAndOrientation also erst Position, dann Winkel. parameter = [self._zahl(p["wert"]) for p in aktion["params"]] + neigungsziel = None + for p in aktion["params"]: + if p["name"] == self.NEIGUNG_PARAMETER: + wert = self._zahl(p["wert"]) + if isinstance(wert, (int, float)): + neigungsziel = wert + # Kugelschreiber-Mechanik, siehe NEIGUNG_DIREKT_MAX. Der Umweg gehoert # hierher und nicht in die Automatik - sonst muesste ihn jeder kennen, # der eine Jalousie anspricht. - umweg = (aktion["command_url"] == "setOrientation" - and len(parameter) == 1 - and isinstance(parameter[0], (int, float)) - and parameter[0] > self.NEIGUNG_DIREKT_MAX) + umweg = neigungsziel is not None and neigungsziel > self.NEIGUNG_DIREKT_MAX if self.dry_run: logger.info("[dry-run] Tahoma %s %s%s", aktion["command_url"], parameter, diff --git a/restricted/commands.php b/restricted/commands.php index 3260200..c744eaf 100644 --- a/restricted/commands.php +++ b/restricted/commands.php @@ -35,11 +35,18 @@ const MQTT_PORT = 1883; * 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". + * * Dasselbe steht in restricted/autoActions/transports.py - beide Versender * brauchen es, und beide muessen es wissen. */ const NEIGUNG_DIREKT_MAX = 30; +/** So heisst der Neigungsparameter im Geraetemodell. */ +const NEIGUNG_PARAMETER = "Neigung"; + /** * So lange wird hoechstens auf das Ende einer Neigungsfahrt gewartet. * Gemessen braucht eine Jalousie von 100 % auf 0 % gut fuenfzehn Sekunden. @@ -310,18 +317,20 @@ function warteAufNeigung($deviceUrl, $ziel) function sendeTahoma($cmd, $werte, $probe) { $parameter = []; + $neigungsziel = null; foreach (parameterWerte($cmd, $werte) as $p) { // Die Box erwartet Zahlen als Zahlen, Text als Text. $parameter[] = is_numeric($p["wert"]) ? $p["wert"] + 0 : $p["wert"]; + if ($p["name"] === NEIGUNG_PARAMETER && is_numeric($p["wert"])) { + $neigungsziel = $p["wert"] + 0; + } } // Kugelschreiber-Mechanik: ueber NEIGUNG_DIREKT_MAX hinaus rastet die // Mechanik nur um, wenn sie vorher einmal auf 0 % war. Der Umweg gehoert // hierher und nicht in die Bedienung - sonst muesste ihn jeder kennen, // der eine Jalousie anspricht. - $umweg = ($cmd["command_url"] === "setOrientation" - && count($parameter) === 1 - && $parameter[0] > NEIGUNG_DIREKT_MAX); + $umweg = ($neigungsziel !== null && $neigungsziel > NEIGUNG_DIREKT_MAX); if ($probe) { $text = "Tahoma: " . $cmd["command_url"] . " " . json_encode($parameter);