Neigungs-Umweg gilt fuer jedes Kommando, nicht nur setOrientation

Die Kugelschreiber-Mechanik haengt nicht am Kommando, sondern an der
Neigung selbst - "Position+Neigung" braucht den Umweg ueber 0 % genauso wie
"Neigung". Erkannt wird er deshalb am Parameter und nicht am Kommandonamen:
beide Kommandos nennen ihren Neigungsparameter "Neigung", das
Geraetemodell liefert die Zuordnung also mit.

Geprueft im Probelauf in beiden Versendern: Position+Neigung mit 20 % geht
direkt raus, mit 90 % mit vorgeschaltetem Umweg.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-31 20:14:05 +02:00
co-authored by Claude Opus 5
parent 1b9bbc9857
commit d557a1651f
2 changed files with 27 additions and 7 deletions
+15 -4
View File
@@ -391,9 +391,16 @@ class TahomaTransport(Transport):
# 0 % zurueck, sonst rastet sie nicht um - ein "Neigung 80 %" ohne # 0 % zurueck, sonst rastet sie nicht um - ein "Neigung 80 %" ohne
# diesen Umweg bleibt wirkungslos. # 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. # Dasselbe steht in restricted/commands.php: beide Versender brauchen es.
NEIGUNG_DIREKT_MAX = 30 NEIGUNG_DIREKT_MAX = 30
# So heisst der Neigungsparameter im Geraetemodell.
NEIGUNG_PARAMETER = "Neigung"
# So lange wird hoechstens auf das Ende einer Neigungsfahrt gewartet. # So lange wird hoechstens auf das Ende einer Neigungsfahrt gewartet.
# Auf core:MovingState ist dabei kein Verlass - gemessen hat die Box # Auf core:MovingState ist dabei kein Verlass - gemessen hat die Box
# waehrend einer Neigungsfahrt kein einziges Mal "faehrt" gemeldet, der # waehrend einer Neigungsfahrt kein einziges Mal "faehrt" gemeldet, der
@@ -453,13 +460,17 @@ class TahomaTransport(Transport):
# setClosureAndOrientation also erst Position, dann Winkel. # setClosureAndOrientation also erst Position, dann Winkel.
parameter = [self._zahl(p["wert"]) for p in aktion["params"]] 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 # Kugelschreiber-Mechanik, siehe NEIGUNG_DIREKT_MAX. Der Umweg gehoert
# hierher und nicht in die Automatik - sonst muesste ihn jeder kennen, # hierher und nicht in die Automatik - sonst muesste ihn jeder kennen,
# der eine Jalousie anspricht. # der eine Jalousie anspricht.
umweg = (aktion["command_url"] == "setOrientation" umweg = neigungsziel is not None and neigungsziel > self.NEIGUNG_DIREKT_MAX
and len(parameter) == 1
and isinstance(parameter[0], (int, float))
and parameter[0] > self.NEIGUNG_DIREKT_MAX)
if self.dry_run: if self.dry_run:
logger.info("[dry-run] Tahoma %s %s%s", aktion["command_url"], parameter, logger.info("[dry-run] Tahoma %s %s%s", aktion["command_url"], parameter,
+12 -3
View File
@@ -35,11 +35,18 @@ const MQTT_PORT = 1883;
* zurueck, sonst rastet sie nicht um. Ein "Neigung 80 %" ohne diesen Umweg * zurueck, sonst rastet sie nicht um. Ein "Neigung 80 %" ohne diesen Umweg
* bleibt wirkungslos. * 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 * Dasselbe steht in restricted/autoActions/transports.py - beide Versender
* brauchen es, und beide muessen es wissen. * brauchen es, und beide muessen es wissen.
*/ */
const NEIGUNG_DIREKT_MAX = 30; 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. * So lange wird hoechstens auf das Ende einer Neigungsfahrt gewartet.
* Gemessen braucht eine Jalousie von 100 % auf 0 % gut fuenfzehn Sekunden. * Gemessen braucht eine Jalousie von 100 % auf 0 % gut fuenfzehn Sekunden.
@@ -310,18 +317,20 @@ function warteAufNeigung($deviceUrl, $ziel)
function sendeTahoma($cmd, $werte, $probe) function sendeTahoma($cmd, $werte, $probe)
{ {
$parameter = []; $parameter = [];
$neigungsziel = null;
foreach (parameterWerte($cmd, $werte) as $p) { foreach (parameterWerte($cmd, $werte) as $p) {
// Die Box erwartet Zahlen als Zahlen, Text als Text. // Die Box erwartet Zahlen als Zahlen, Text als Text.
$parameter[] = is_numeric($p["wert"]) ? $p["wert"] + 0 : $p["wert"]; $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 // Kugelschreiber-Mechanik: ueber NEIGUNG_DIREKT_MAX hinaus rastet die
// Mechanik nur um, wenn sie vorher einmal auf 0 % war. Der Umweg gehoert // Mechanik nur um, wenn sie vorher einmal auf 0 % war. Der Umweg gehoert
// hierher und nicht in die Bedienung - sonst muesste ihn jeder kennen, // hierher und nicht in die Bedienung - sonst muesste ihn jeder kennen,
// der eine Jalousie anspricht. // der eine Jalousie anspricht.
$umweg = ($cmd["command_url"] === "setOrientation" $umweg = ($neigungsziel !== null && $neigungsziel > NEIGUNG_DIREKT_MAX);
&& count($parameter) === 1
&& $parameter[0] > NEIGUNG_DIREKT_MAX);
if ($probe) { if ($probe) {
$text = "Tahoma: " . $cmd["command_url"] . " " . json_encode($parameter); $text = "Tahoma: " . $cmd["command_url"] . " " . json_encode($parameter);