Jalousie-Verfolgung an der Anlage nachgezogen
Am echten Geraet ausprobiert - drei Sachen stimmten nicht.
Die PHP-Warnung. Nicht jeder Tahoma-Zustand ist eine Zahl oder ein Wort,
manche sind Listen. strval() darauf ist eine Warnung, und die stand mitten
in der JSON-Antwort. response.json() scheiterte, raumRequest() lieferte
{error}, die Verfolgung brach still ab - genau das Bild, das der Bericht
"kommt noch nicht" beschreibt. Nicht-Skalare werden jetzt uebergangen, und
ein Fehler wird gemeldet statt verschluckt.
Das Mitziehen waehrend der Fahrt. Gemessen: die Hoehe steht die ganzen
zwanzig Sekunden auf dem alten Wert und springt erst am Ende um. Wer das
anzeigte, holte den Regler vom eingestellten Ziel auf den alten Stand
zurueck, um ihn danach wieder vorzuschieben. Angezeigt wird deshalb erst,
was am Ende dasteht.
Das vorzeitige Aufhoeren. Zwischen den beiden Befehlen der
Kugelschreiber-Mechanik steht die Jalousie still und meldet die
Zwischenstellung. Die Verfolgung hielt das fuer das Ende und schrieb
"Neigung 0" fest, wo 62 gemeint war. Sie laeuft jetzt mindestens, bis der
Auftrag zurueck ist, und danach noch vierzehn Sekunden - so lange dauert
eine Neigungsfahrt von Anschlag zu Anschlag.
Gegengeprueft an der Wozi-Schiebetuer: Position 49 -> 20 -> 100 -> 49,
Neigung 62 -> 80 -> 62. Die Neigung wanderte beim Herunterfahren von
selbst auf 100 und stand sofort richtig im Modal. Waehrend des zehn
Sekunden langen Kugelschreiber-Auftrags liefen drei Verfolgungsanfragen
durch - die Sitzungssperre ist also wirklich weg.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+53
-11
@@ -513,13 +513,14 @@ function switchFloor(floor){
|
|||||||
function raumKommando(cmdId, params, element) {
|
function raumKommando(cmdId, params, element) {
|
||||||
const karte = element.closest(".raum-geraet") || element;
|
const karte = element.closest(".raum-geraet") || element;
|
||||||
karte.classList.add("raum-warte");
|
karte.classList.add("raum-warte");
|
||||||
// Die Verfolgung beginnt sofort, nicht erst mit der Antwort: ein "Zu"
|
// Die Verfolgung laeuft neben dem Auftrag her, nicht nach ihm: ein "Zu"
|
||||||
// faehrt herunter, wartet und neigt danach - der Aufruf kommt also erst
|
// faehrt herunter, wartet und neigt danach - die Antwort kaeme also erst,
|
||||||
// zurueck, wenn die Jalousie schon steht. Beides nebeneinander geht,
|
// wenn die Jalousie schon steht. Beides nebeneinander geht, seit
|
||||||
// seit ajax/room.php die Sitzung freigibt.
|
// ajax/room.php die Sitzung freigibt. Der Auftrag geht mit, weil nur er
|
||||||
jalousieVerfolgen(karte);
|
// weiss, wann das Manoever zu Ende ist.
|
||||||
raumRequest("command", { command_id: cmdId, params: params })
|
const auftrag = raumRequest("command", { command_id: cmdId, params: params });
|
||||||
.then(antwort => {
|
jalousieVerfolgen(karte, auftrag);
|
||||||
|
auftrag.then(antwort => {
|
||||||
karte.classList.remove("raum-warte");
|
karte.classList.remove("raum-warte");
|
||||||
raumMeldung(antwort);
|
raumMeldung(antwort);
|
||||||
});
|
});
|
||||||
@@ -533,16 +534,33 @@ function switchFloor(floor){
|
|||||||
const JALOUSIE_VORLAUF_MS = 8000;
|
const JALOUSIE_VORLAUF_MS = 8000;
|
||||||
const JALOUSIE_MAX_MS = 120000;
|
const JALOUSIE_MAX_MS = 120000;
|
||||||
|
|
||||||
|
// Wie lange nach dem Ende des Auftrags noch nachgesehen wird. Eine
|
||||||
|
// Neigungsfahrt setzt core:MovingState nie (siehe warteAufJalousie() in
|
||||||
|
// restricted/commands.php), dauert aber gemessen bis zu fuenfzehn Sekunden
|
||||||
|
// von Anschlag zu Anschlag - ohne diesen Nachlauf stuende der Wert von
|
||||||
|
// vor dem letzten Schwenk in der Anzeige.
|
||||||
|
const JALOUSIE_NACHLAUF_MS = 14000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Eine Jalousie waehrend ihrer Fahrt nachfuehren.
|
* Nach einem Fahrbefehl abwarten, bis die Jalousie steht, und dann ihren
|
||||||
|
* wirklichen Stand zeigen.
|
||||||
*
|
*
|
||||||
* actor_states schreibt sonst nur der Runner fort, und der fragt die
|
* actor_states schreibt sonst nur der Runner fort, und der fragt die
|
||||||
* Tahoma-Box alle fuenf Minuten ab - so lange zeigte das Modal nach einem
|
* Tahoma-Box alle fuenf Minuten ab - so lange zeigte das Modal nach einem
|
||||||
* Fahrbefehl den Stand von davor. Hier wird genau dieses eine Geraet
|
* Fahrbefehl den Stand von davor. Hier wird genau dieses eine Geraet
|
||||||
* gefragt; ajax/room.php haelt den frischen Wert gleich in der Tabelle
|
* gefragt; ajax/room.php haelt den frischen Wert gleich in der Tabelle
|
||||||
* fest, damit auch das naechste Oeffnen und der Automatik-Editor ihn haben.
|
* fest, damit auch das naechste Oeffnen und der Automatik-Editor ihn haben.
|
||||||
|
*
|
||||||
|
* Waehrend der Fahrt wird bewusst nichts angezeigt. An der Anlage
|
||||||
|
* gemessen: die Hoehe (core:ClosureState) steht die ganze Fahrt ueber auf
|
||||||
|
* dem Wert von vor dem Kommando und springt erst am Ende um - wer sie
|
||||||
|
* anzeigte, holte den Regler vom eingestellten Ziel auf den alten Stand
|
||||||
|
* zurueck, nur um ihn zwanzig Sekunden spaeter wieder vorzuschieben. Die
|
||||||
|
* Neigung meldet zwar Zwischenwerte, aber ausgerechnet die der
|
||||||
|
* Kugelschreiber-Mechanik: bei "Neigung 80" liefe der Regler 62 -> 28 ->
|
||||||
|
* 38 -> 79, ueber einen Umweg, den niemand angefordert hat.
|
||||||
*/
|
*/
|
||||||
function jalousieVerfolgen(karte) {
|
function jalousieVerfolgen(karte, auftrag) {
|
||||||
if (!karte || !karte.querySelector(".raum-jalousie")) return;
|
if (!karte || !karte.querySelector(".raum-jalousie")) return;
|
||||||
const actor = Number(karte.dataset.actor);
|
const actor = Number(karte.dataset.actor);
|
||||||
if (!actor) return;
|
if (!actor) return;
|
||||||
@@ -555,6 +573,16 @@ function switchFloor(floor){
|
|||||||
|
|
||||||
const beginn = Date.now();
|
const beginn = Date.now();
|
||||||
let gefahren = false;
|
let gefahren = false;
|
||||||
|
// Solange der Auftrag laeuft, ist nichts entschieden: die
|
||||||
|
// Kugelschreiber-Mechanik schickt zwei Befehle mit einer Wartezeit
|
||||||
|
// dazwischen, und zwischen ihnen steht die Jalousie still. Wer da
|
||||||
|
// aufhoert, schreibt die Zwischenstellung fest - gemessen "Neigung 0",
|
||||||
|
// wo 62 gemeint war.
|
||||||
|
let ruheAb = Infinity;
|
||||||
|
Promise.resolve(auftrag).then(
|
||||||
|
function () { ruheAb = Date.now() + JALOUSIE_NACHLAUF_MS; },
|
||||||
|
function () { ruheAb = Date.now(); }
|
||||||
|
);
|
||||||
|
|
||||||
function aufhoeren() {
|
function aufhoeren() {
|
||||||
delete karte.dataset.jalousieLaeuft;
|
delete karte.dataset.jalousieLaeuft;
|
||||||
@@ -563,14 +591,24 @@ function switchFloor(floor){
|
|||||||
|
|
||||||
function runde(letzte) {
|
function runde(letzte) {
|
||||||
raumRequest("jalousie", { actor: actor }).then(stand => {
|
raumRequest("jalousie", { actor: actor }).then(stand => {
|
||||||
|
// Ein Fehler soll auffallen. Ohne die Meldung endet die Schleife
|
||||||
|
// still, und die Anzeige bleibt einfach stehen - nicht zu
|
||||||
|
// unterscheiden von "die Verfolgung gibt es gar nicht".
|
||||||
|
if (stand && stand.error) raumMeldung(stand);
|
||||||
// Modal zu, Box stumm, Geraet unbekannt - in jedem Fall aufhoeren
|
// Modal zu, Box stumm, Geraet unbekannt - in jedem Fall aufhoeren
|
||||||
// statt zwei Minuten lang ins Leere zu fragen.
|
// statt zwei Minuten lang ins Leere zu fragen.
|
||||||
if (!stand || stand.error || !document.body.contains(karte)) {
|
if (!stand || stand.error || !document.body.contains(karte)) {
|
||||||
aufhoeren();
|
aufhoeren();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (stand.faehrt) {
|
||||||
|
gefahren = true;
|
||||||
|
} else if (Date.now() >= ruheAb) {
|
||||||
|
// Erst wenn der Auftrag durch ist. Zwischen den beiden Befehlen der
|
||||||
|
// Kugelschreiber-Mechanik steht die Jalousie still und meldet
|
||||||
|
// "Neigung 0" - anzeigen hiesse, den Umweg vorzufuehren.
|
||||||
jalousieAnzeigen(karte, stand);
|
jalousieAnzeigen(karte, stand);
|
||||||
if (stand.faehrt) gefahren = true;
|
}
|
||||||
if (letzte || Date.now() > Number(karte.dataset.jalousieBis)) {
|
if (letzte || Date.now() > Number(karte.dataset.jalousieBis)) {
|
||||||
aufhoeren();
|
aufhoeren();
|
||||||
return;
|
return;
|
||||||
@@ -579,6 +617,7 @@ function switchFloor(floor){
|
|||||||
// haben fahren sehen oder der Vorlauf um ist. Eine letzte Runde
|
// haben fahren sehen oder der Vorlauf um ist. Eine letzte Runde
|
||||||
// danach holt den Wert, den die Box beim Anhalten setzt.
|
// danach holt den Wert, den die Box beim Anhalten setzt.
|
||||||
const fertig = !stand.faehrt
|
const fertig = !stand.faehrt
|
||||||
|
&& Date.now() >= ruheAb
|
||||||
&& (gefahren || Date.now() - beginn >= JALOUSIE_VORLAUF_MS);
|
&& (gefahren || Date.now() - beginn >= JALOUSIE_VORLAUF_MS);
|
||||||
setTimeout(() => runde(fertig), JALOUSIE_TAKT_MS);
|
setTimeout(() => runde(fertig), JALOUSIE_TAKT_MS);
|
||||||
});
|
});
|
||||||
@@ -586,7 +625,10 @@ function switchFloor(floor){
|
|||||||
setTimeout(() => runde(false), JALOUSIE_TAKT_MS);
|
setTimeout(() => runde(false), JALOUSIE_TAKT_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Die gemeldete Stellung in die beiden Regler und das Bild uebernehmen. */
|
/**
|
||||||
|
* Die gemeldete Stellung in die beiden Regler und das Bild uebernehmen.
|
||||||
|
* Aufgerufen nur im Stillstand, siehe jalousieVerfolgen().
|
||||||
|
*/
|
||||||
function jalousieAnzeigen(karte, stand) {
|
function jalousieAnzeigen(karte, stand) {
|
||||||
[["position", stand.position], ["neigung", stand.neigung]].forEach(paar => {
|
[["position", stand.position], ["neigung", stand.neigung]].forEach(paar => {
|
||||||
const wert = paar[1];
|
const wert = paar[1];
|
||||||
|
|||||||
@@ -336,6 +336,13 @@ function tahomaWertText($wert)
|
|||||||
if (is_bool($wert)) {
|
if (is_bool($wert)) {
|
||||||
return $wert ? "True" : "False";
|
return $wert ? "True" : "False";
|
||||||
}
|
}
|
||||||
|
// Nicht jeder Zustand der Box ist eine Zahl oder ein Wort: manche sind
|
||||||
|
// Listen oder Objekte. Als Messwert taugt das nicht, und strval() darauf
|
||||||
|
// ist eine PHP-Warnung - die stuende dann mitten in der JSON-Antwort und
|
||||||
|
// machte sie unlesbar, ohne dass irgendwo ein Fehler auftaucht.
|
||||||
|
if (!is_scalar($wert)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return strval($wert);
|
return strval($wert);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -376,7 +383,7 @@ function tahomaZustaendeSchreiben($deviceUrl, $zustaende)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$text = tahomaWertText($zustaende[$zeile["url"]]);
|
$text = tahomaWertText($zustaende[$zeile["url"]]);
|
||||||
if (strval($zeile["current_value"]) === $text) {
|
if ($text === null || strval($zeile["current_value"]) === $text) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$id = intval($zeile["id"]);
|
$id = intval($zeile["id"]);
|
||||||
|
|||||||
Reference in New Issue
Block a user