Ende der Fahrt abwarten, Umweg an die Hoehe binden
Zwei Sachen, beide an der Anlage aufgefallen. Abgebrochen wurde auf "core:MovingState ist false". Das ist nicht dasselbe wie "steht": die Box meldet das Ende der Fahrt, bevor Hoehe und Neigung darauf nachgezogen haben, und der festgehaltene Wert war dann der von kurz davor. Statt einer festen Wartezeit zaehlt jetzt Stabilitaet - fertig ist es, wenn zwei Abfragen hintereinander dasselbe sagen. Damit faellt auch die Bestaetigungsrunde weg, sie war genau dieser Gedanke in schlechter. Der Umweg der Kugelschreiber-Mechanik hing am Neigungswert (ueber 30 %). Er gehoert an die Hoehe: eine Hoehenfahrt rastet die Lamellen um, danach muss die Neigung ueber 0 % wieder angefahren werden - bei jedem Winkel, nicht erst bei grossen. Wird dagegen nur die Neigung verstellt, steht die Mechanik schon richtig und es geht direkt. NEIGUNG_DIREKT_MAX faellt damit weg. Der Hoehenregler im Raum-Modal schickt deshalb jetzt das kombinierte Kommando mit der Stellung des Neigungsreglers daneben - ohne Neigungsziel gaebe es nichts, was der Umweg anfahren koennte. Geprueft an der Wozi-Schiebetuer: Hoehe von 48 auf 60 bei Neigung 76, und die 76 standen danach wieder da. Vorher htte die Mechanik sie auf einen beliebigen Wert umgerastet. Dazu elf Faelle im Browser und sieben gegen transports.py, darunter "Position+Neigung 10" (Umweg) gegen "nur Neigung 80" (direkt). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -69,6 +69,37 @@ function kommandoMitParameter($d, $name)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Kommando, das Hoehe und Neigung zusammen setzt - null, wenn es keins gibt.
|
||||
*
|
||||
* Der Hoehenregler benutzt es statt des reinen "Position"-Kommandos: eine
|
||||
* Hoehenfahrt rastet die Lamellen um, danach muss die Neigung ueber 0 %
|
||||
* wieder angefahren werden. Den Umweg faehrt sendeTahoma(), aber nur, wenn
|
||||
* der Befehl ueberhaupt ein Neigungsziel mitbringt.
|
||||
*/
|
||||
function kombiKommando($d)
|
||||
{
|
||||
foreach ($d["commands"] as $c) {
|
||||
$namen = array_map(function ($p) { return $p["name"]; }, $c["params"]);
|
||||
sort($namen);
|
||||
if ($namen === [NEIGUNG_PARAMETER, POSITION_PARAMETER]) {
|
||||
return $c;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Der Parameter eines Kommandos mit diesem Namen, null wenn es ihn nicht gibt. */
|
||||
function parameterNamens($cmd, $name)
|
||||
{
|
||||
foreach ($cmd["params"] as $p) {
|
||||
if ($p["name"] === $name) {
|
||||
return $p;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/** Kommando mit Parametern rot/gruen/blau - eine Farbe zum Aussuchen. */
|
||||
function farbKommando($d)
|
||||
{
|
||||
@@ -292,15 +323,22 @@ function reglerFeld($min, $max, $wert, $einheit, $beschriftung = "")
|
||||
* bewegt sich in seinen eigenen Koordinaten waagerecht, wird von jedem
|
||||
* Browser unterstuetzt und traegt dieselbe Gestaltung wie die liegenden.
|
||||
*/
|
||||
function senkrechterRegler($cmd, $param, $wert, $titel, $oben, $unten, $rolle)
|
||||
function senkrechterRegler($cmd, $param, $wert, $titel, $oben, $unten, $rolle,
|
||||
$mitParam = null, $mitRolle = "")
|
||||
{
|
||||
$min = reglerMin($param);
|
||||
$max = reglerMax($param);
|
||||
$wert = reglerWert($wert, $min, $max);
|
||||
// $mitParam: ein zweiter Parameter desselben Kommandos, dessen Wert der
|
||||
// Regler mit der Rolle $mitRolle beisteuert. Damit schickt der
|
||||
// Hoehenregler die Neigung mit, ohne dass das JavaScript wissen muss,
|
||||
// welche Nummern das sind.
|
||||
$mit = $mitParam === null ? ""
|
||||
: " data-mit-param='" . intval($mitParam["id"]) . "' data-mit-rolle='" . $mitRolle . "'";
|
||||
// Keine Prozentzahl darunter: was der Regler bewirkt, zeigt das
|
||||
// Lamellenbild daneben, und die gesparte Zeile macht die Bahn laenger.
|
||||
return "<div class='raum-regler raum-spalte' data-cmd='" . intval($cmd["id"]) . "'"
|
||||
. " data-param='" . intval($param["id"]) . "' data-rolle='" . $rolle . "'>"
|
||||
. " data-param='" . intval($param["id"]) . "' data-rolle='" . $rolle . "'" . $mit . ">"
|
||||
. "<span class='raum-name'>" . htmlspecialchars($titel) . "</span>"
|
||||
. "<span class='raum-ende'>" . htmlspecialchars($oben) . "</span>"
|
||||
. "<div class='raum-senkrecht'>" . reglerFeld($min, $max, $wert, "%", $titel) . "</div>"
|
||||
@@ -424,8 +462,9 @@ function zeichneBeschattung($d)
|
||||
$auf = kommandoMitUrl($d, ["up"]);
|
||||
$stop = kommandoMitUrl($d, ["stop"]);
|
||||
$zu = kommandoMitUrl($d, ["down"]);
|
||||
$position = kommandoMitParameter($d, "Position");
|
||||
$neigung = kommandoMitParameter($d, "Neigung");
|
||||
$position = kommandoMitParameter($d, POSITION_PARAMETER);
|
||||
$neigung = kommandoMitParameter($d, NEIGUNG_PARAMETER);
|
||||
$kombi = kombiKommando($d);
|
||||
|
||||
// Was das Geraet zuletzt gemeldet hat. Bei Somfy heisst die Lamelle
|
||||
// "Lamellenausrichtung", die Hoehe schlicht "Position".
|
||||
@@ -433,7 +472,9 @@ function zeichneBeschattung($d)
|
||||
$standNeigung = zustandsWert($d, ["Lamellenausrichtung"]);
|
||||
$status = beschattungsStand($standPos, $standNeigung);
|
||||
|
||||
$benutzt = array_filter([$auf, $stop, $zu, $position, $neigung]);
|
||||
// $kombi gehoert dazu: es steckt jetzt hinter dem Hoehenregler und hat im
|
||||
// Mehr-Menue nichts mehr verloren.
|
||||
$benutzt = array_filter([$auf, $stop, $zu, $position, $neigung, $kombi]);
|
||||
$benutzteIds = array_map(function ($c) { return $c["id"]; }, $benutzt);
|
||||
$rest = array_values(array_filter($d["commands"], function ($c) use ($benutzteIds) {
|
||||
return !in_array($c["id"], $benutzteIds, true);
|
||||
@@ -464,8 +505,16 @@ function zeichneBeschattung($d)
|
||||
$html .= lamellenBild($d["id"]);
|
||||
}
|
||||
if ($position) {
|
||||
$html .= senkrechterRegler($position, $position["params"][0], $standPos,
|
||||
"Position", "oben", "unten", "position");
|
||||
// Kann das Geraet beides zusammen, geht die Hoehe ueber dieses
|
||||
// Kommando und nimmt die Neigung mit - sonst raste die Mechanik bei
|
||||
// der Hoehenfahrt um und niemand faehrt sie wieder an.
|
||||
$hoehenCmd = $kombi ?: $position;
|
||||
$hoehenParam = $kombi ? parameterNamens($kombi, POSITION_PARAMETER)
|
||||
: $position["params"][0];
|
||||
$mitParam = $kombi ? parameterNamens($kombi, NEIGUNG_PARAMETER) : null;
|
||||
$html .= senkrechterRegler($hoehenCmd, $hoehenParam, $standPos,
|
||||
"Position", "oben", "unten", "position",
|
||||
$neigung ? $mitParam : null, "neigung");
|
||||
}
|
||||
if ($neigung) {
|
||||
$html .= senkrechterRegler($neigung, $neigung["params"][0], $standNeigung,
|
||||
|
||||
Reference in New Issue
Block a user