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:
+37
-13
@@ -367,6 +367,16 @@ function switchFloor(floor){
|
||||
schieber.addEventListener("change", () => {
|
||||
const params = {};
|
||||
params[regler.dataset.param] = schieber.value;
|
||||
// Der Hoehenregler nimmt die Neigung mit: eine Hoehenfahrt rastet die
|
||||
// Lamellen um, und der Server faehrt sie nur dann wieder an, wenn der
|
||||
// Befehl ein Neigungsziel dabei hat (Kugelschreiber-Mechanik, siehe
|
||||
// sendeTahoma() in restricted/commands.php). Welcher Parameter das
|
||||
// ist, sagt der Server ueber data-mit-param.
|
||||
if (regler.dataset.mitParam) {
|
||||
const daneben = regler.closest(".raum-jalousie")
|
||||
.querySelector("[data-rolle='" + regler.dataset.mitRolle + "'] input[type=range]");
|
||||
if (daneben) params[regler.dataset.mitParam] = daneben.value;
|
||||
}
|
||||
raumKommando(Number(regler.dataset.cmd), params, regler);
|
||||
});
|
||||
});
|
||||
@@ -584,6 +594,11 @@ function switchFloor(floor){
|
||||
|
||||
const beginn = Date.now();
|
||||
let gefahren = false;
|
||||
// Der zuletzt im Stillstand gelesene Stand. "core:MovingState ist false"
|
||||
// heisst noch nicht "steht": die Box meldet das Ende der Fahrt, bevor die
|
||||
// Werte darauf nachgezogen haben. Fertig ist es erst, wenn zwei Abfragen
|
||||
// hintereinander dasselbe sagen.
|
||||
let letzterStand = null;
|
||||
// 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
|
||||
@@ -603,7 +618,7 @@ function switchFloor(floor){
|
||||
delete karte.dataset.jalousieBis;
|
||||
}
|
||||
|
||||
function runde(letzte) {
|
||||
function runde() {
|
||||
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
|
||||
@@ -615,6 +630,12 @@ function switchFloor(floor){
|
||||
aufhoeren();
|
||||
return;
|
||||
}
|
||||
const abgelesen = stand.faehrt
|
||||
? null
|
||||
: String(stand.position) + "/" + String(stand.neigung);
|
||||
const steht = abgelesen !== null && abgelesen === letzterStand;
|
||||
letzterStand = abgelesen;
|
||||
|
||||
if (stand.faehrt) {
|
||||
gefahren = true;
|
||||
} else if (Date.now() >= ruheAb) {
|
||||
@@ -623,31 +644,34 @@ function switchFloor(floor){
|
||||
// "Neigung 0" - anzeigen hiesse, den Umweg vorzufuehren.
|
||||
jalousieAnzeigen(karte, stand);
|
||||
}
|
||||
if (letzte || Date.now() > Number(karte.dataset.jalousieBis)) {
|
||||
if (Date.now() > Number(karte.dataset.jalousieBis)) {
|
||||
aufhoeren();
|
||||
return;
|
||||
}
|
||||
// Steht sie still, ist die Fahrt vorbei - aber erst, wenn wir sie
|
||||
// haben fahren sehen oder der Vorlauf um ist. Eine letzte Runde
|
||||
// danach holt den Wert, den die Box beim Anhalten setzt.
|
||||
const fertig = !stand.faehrt
|
||||
&& Date.now() >= ruheAb
|
||||
&& (gefahren || !vorlaufNoetig
|
||||
|| Date.now() - beginn >= JALOUSIE_VORLAUF_MS);
|
||||
// Die Bestaetigungsrunde faengt Werte ab, die die Box erst nach dem
|
||||
// Anhalten nachreicht. Beim blossen Aufmachen eines Raums, in dem
|
||||
// sich nichts geruehrt hat, gibt es nichts nachzureichen - dann
|
||||
// bleibt es bei einer Abfrage je Jalousie.
|
||||
if (fertig && !vorlaufNoetig && !gefahren) {
|
||||
// Beim blossen Aufmachen eines Raums, in dem sich nichts geruehrt
|
||||
// hat, gibt es nichts abzuwarten - dann bleibt es bei einer Abfrage
|
||||
// je Jalousie.
|
||||
if (!vorlaufNoetig && !gefahren && !stand.faehrt) {
|
||||
aufhoeren();
|
||||
return;
|
||||
}
|
||||
setTimeout(() => runde(fertig), JALOUSIE_TAKT_MS);
|
||||
const fertig = steht
|
||||
&& Date.now() >= ruheAb
|
||||
&& (gefahren || !vorlaufNoetig
|
||||
|| Date.now() - beginn >= JALOUSIE_VORLAUF_MS);
|
||||
if (fertig) {
|
||||
aufhoeren();
|
||||
return;
|
||||
}
|
||||
setTimeout(() => runde(false), JALOUSIE_TAKT_MS);
|
||||
});
|
||||
}
|
||||
// Beim Oeffnen sofort nachsehen, nach einem Kommando erst im Takt: da
|
||||
// stuende die Box ohnehin noch auf dem alten Wert.
|
||||
setTimeout(() => runde(false), auftrag ? JALOUSIE_TAKT_MS : 0);
|
||||
setTimeout(runde, auftrag ? JALOUSIE_TAKT_MS : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user