@issi sagte in Variablen innerhalb des Scriptes definieren:
/** * Haustür-Lampensteuerung: * - Nur bei Dunkelheit: Beim Öffnen der Tür wird die Hue Außenlampe auf 100% gesetzt. * Dabei wird der vorherige Helligkeitswert gespeichert. * - Beim Schließen: Nach 2 Minuten wird der vorherige Wert wiederhergestellt. * - Entprellung, Schutz gegen Überschneidungen und Logging. * - Nur der persistente State wird bei Bedarf erstellt; andere States müssen existieren. * - Gespeichert wird als number mit -1 = "kein Wert gespeichert" */ // === Konfiguration / Konstanten === const doorSensor = 'alias.0.Sensor Haustür.opened'; // Tür geöffnet/geschlossen const hueDoorLevel = 'hue.0.Haustür.level'; // Hue Außenlampe Level const savedLevelState = 'javascript.0.Aussenlampe_Zustand'; // Persistenter interner Speicher (-1 = leer) // === Robustheits-Einstellungen === const DEBOUNCE_MS = 2000; // Entprellzeit in ms let busy = false; let lastEventTime = 0; // Logging ein/aus const enableLogging = true; function logInfo(msg) { if (enableLogging) log(`[Haustür-Script] ${msg}`, 'info'); } function logWarn(msg) { if (enableLogging) log(`[Haustür-Script] ${msg}`, 'warn'); } // === Helfer === // Prüft, ob das Level eine valide Zahl zwischen 0 und 100 ist function isValidLevel(lvl) { return typeof lvl === 'number' && lvl >= 0 && lvl <= 100; } // Prüft, ob es gerade dunkel ist (also NICHT zwischen sunrise und sunset) function isDark() { return !compareTime(getAstroDate('sunrise', undefined, 0), getAstroDate('sunset', undefined, 0), 'between', null); } // === Persistenten State sicherstellen === if (!existsState(savedLevelState)) { createState(savedLevelState, -1, { read: true, write: true, name: 'Gespeichertes Haustür-Level vor Änderung', role: 'level', type: 'number', def: -1, min: -1, max: 100 }); logInfo(`State "${savedLevelState}" (number mit -1 als Leerwert) wurde angelegt.`); } // === Hauptlistener auf Tür-Statusänderung === on({ id: doorSensor, change: 'ne' }, async (obj) => { const now = Date.now(); // Entprellung: zu schnelle Folgetrigger ignorieren if (now - lastEventTime < DEBOUNCE_MS) { logInfo('Event verworfen wegen Entprellung.'); return; } lastEventTime = now; // Schutz gegen parallele Ausführung if (busy) { logWarn('Übersprungen: Script ist noch in Bearbeitung.'); return; } busy = true; try { const isOpen = obj.state.val === true; const stored = getState(savedLevelState)?.val; // -1 = leer const currentLevelObj = getState(hueDoorLevel); const currentLevel = currentLevelObj?.val; if (isOpen) { logInfo('Tür geöffnet erkannt.'); if (isDark()) { logInfo('Es ist dunkel – Lampenstatus wird angepasst.'); // Vorheriges Level nur speichern, wenn noch nichts gespeichert ist und aktueller Level gültig if (stored === -1 && isValidLevel(currentLevel)) { setState(savedLevelState, currentLevel, true); logInfo(`Vorheriges Level gespeichert: ${currentLevel}`); } else if (stored !== -1) { logInfo(`Vorheriger Level war bereits gespeichert: ${stored}`); } else if (!isValidLevel(currentLevel)) { logWarn('Kein gültiger aktueller Level zum Speichern vorhanden.'); } // Hue-Lampe auf 100 setzen if (existsState(hueDoorLevel)) { setState(hueDoorLevel, 100); logInfo('Haustür-Lampe auf 100 gesetzt.'); } else { logWarn(`State "${hueDoorLevel}" existiert nicht. Kann Lampen-Level nicht setzen.`); } } else { logInfo('Es ist Tag – keine Änderung an der Lampe.'); // nichts tun bei Tageslicht } } else { logInfo('Tür geschlossen erkannt.'); if (stored !== -1) { if (existsState(hueDoorLevel)) { logInfo(`Haustür-Lampe wird in 2 Minuten auf gespeicherten Wert (${stored}) zurückgesetzt.`); setStateDelayed(hueDoorLevel, stored, 120000, false); } else { logWarn(`State "${hueDoorLevel}" existiert nicht. Kann Lampen-Level nicht zurücksetzen.`); } // Gespeicherten Level zurücksetzen setState(savedLevelState, -1, true); logInfo('Gespeicherter Level danach gelöscht.'); } else { logInfo('Kein gespeicherter Level vorhanden – nichts zurückzusetzen.'); } } } catch (e) { logWarn(`Fehler im Script: ${e.message}`); } finally { busy = false; } });
1000 Dank. Scheint zu laufen.