Haltezeit im Rahmen: "Auslösen erst nach X ununterbrochen"

Der Gegenspieler zur Sperre, direkt daneben: die bremst die Wiederholung,
die Haltezeit den ersten Lauf. Damit lassen sich Dauerzustände abfragen,
die in einem einzelnen Messwert nicht zu sehen sind - "der Wasserzähler
läuft seit einer halben Stunde ohne Pause".

Gespeichert wird in automations.hold_secs (haltezeit.sql im SolarManager),
gezählt wird im Runner. Angeboten werden feste Stufen, wie bei der Sperre:
eine weitere ist eine Zeile in haltezeitChoices().

0 ist die Vorgabe und heißt "sofort" - vorhandene Automatiken ändern sich
nicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 08:57:27 +02:00
co-authored by Claude Opus 5
parent d3ff959574
commit 01d04e8f56
4 changed files with 120 additions and 13 deletions
+14 -1
View File
@@ -26,6 +26,7 @@
let autoModel = null;
let autoDevices = [];
let autoLockouts = [];
let autoHaltezeiten = [];
let autoFerien = [];
let autoFeiertage = [];
let autoTagVorlagen = [];
@@ -1125,6 +1126,9 @@ function rahmenKurzText() {
teile.push(autoModel.window_from === "00:00" && autoModel.window_to === "23:59"
? "rund um die Uhr"
: autoModel.window_from + "" + autoModel.window_to);
if (autoModel.hold_secs > 0) {
teile.push("erst nach " + Math.floor(autoModel.hold_secs / 60) + " Min.");
}
if (autoModel.lockout_secs > 0) {
teile.push("Sperre " + (autoModel.lockout_secs >= 60
? Math.floor(autoModel.lockout_secs / 60) + " Min."
@@ -1143,6 +1147,7 @@ function rahmenIstVorgabe() {
&& autoModel.window_from === "00:00"
&& autoModel.window_to === "23:59"
&& !autoModel.once_per_day
&& !autoModel.hold_secs
&& !autoModel.force_once;
}
@@ -1173,6 +1178,9 @@ function fuelleFormular() {
const sperre = document.getElementById("lockoutSecs");
optionListe(sperre, autoLockouts.map(o => ({ value: o.value, text: o.label })),
autoModel.lockout_secs);
optionListe(document.getElementById("holdSecs"),
autoHaltezeiten.map(o => ({ value: o.value, text: o.label })),
autoModel.hold_secs);
document.getElementById("autoName").value = autoModel.name;
// Kennt die Liste die Etage nicht, bleibt eine Auswahlliste sonst leer
// stehen und schickt beim Speichern "" mit.
@@ -1207,6 +1215,7 @@ function leseFormular() {
autoModel.once_per_day = document.getElementById("oncePerDay").checked;
autoModel.next_day = document.getElementById("nextDay").checked;
autoModel.lockout_secs = Number(document.getElementById("lockoutSecs").value);
autoModel.hold_secs = Number(document.getElementById("holdSecs").value);
}
/**
@@ -1214,7 +1223,8 @@ function leseFormular() {
* Ohne das stuende dort "rund um die Uhr", waehrend darunter 08:45 steht.
*/
function rahmenFelderVerdrahten() {
["tSpanFrom", "tSpanTo", "lockoutSecs", "runOnce", "oncePerDay", "nextDay"].forEach(id => {
["tSpanFrom", "tSpanTo", "lockoutSecs", "holdSecs",
"runOnce", "oncePerDay", "nextDay"].forEach(id => {
const feld = document.getElementById(id);
if (feld) feld.addEventListener("change", () => { leseFormular(); renderRahmen(); });
});
@@ -1242,6 +1252,7 @@ function loadAutomatic() {
const daten = JSON.parse(document.getElementById("autoActionData").textContent);
autoDevices = daten.devices;
autoLockouts = daten.lockouts;
autoHaltezeiten = daten.haltezeiten || [];
autoFerien = daten.ferien || [];
autoFeiertage = daten.feiertage || [];
autoTagVorlagen = daten.tagvorlagen || [];
@@ -1263,6 +1274,7 @@ function loadAutomatic() {
force_once: a.force_once,
once_per_day: a.once_per_day,
lockout_secs: a.lockout_secs,
hold_secs: a.hold_secs || 0,
groups: [],
actions: a.actions.map(x => ({ command_id: x.command_id, params: Object.assign({}, x.params) }))
};
@@ -1352,6 +1364,7 @@ function submitAutoAction() {
force_once: autoModel.force_once,
once_per_day: autoModel.once_per_day,
lockout_secs: autoModel.lockout_secs,
hold_secs: autoModel.hold_secs,
conditions: [],
actions: autoModel.actions
};