Skip to content

Commit e9edd44

Browse files
committed
Update / Modification from the production live system: 2026-03-09 23:00
1 parent 4c0474e commit e9edd44

1 file changed

Lines changed: 42 additions & 9 deletions

File tree

iobroker/40_Beleuchtung/Allgemein/beleuchtung_szenen_steuern.js

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
* Script: Astro Szenen Steuerung
33
* Description: Steuert Smart Home Szenen (Tag, Nacht, Aus) basierend auf
44
* dem Astro-Status und der aktuellen Uhrzeit.
5-
* Version: 1.0.0
5+
* Version: 1.2.1
66
* Author: Sanweb
77
* Datum: 2026-03-09
88
* * Changelog:
9+
* 1.2.1 - Typen-Normalisierung in setIfChanged hinzugefügt für sichereren Vergleich.
10+
* 1.2.0 - Prüfung des Ist-Zustandes vor dem Schalten hinzugefügt (schont den ioBroker Bus/Funkverkehr).
911
* 1.1.1 - Eindeutiger Log-Prefix hinzugefügt für bessere Übersicht im ioBroker-Log.
1012
* 1.1.0 - Konfiguration in ein zentrales CONFIG-Objekt ausgelagert (Refactoring).
11-
* 1.0.0 - Initiale Version (Portierung aus Node-RED)
13+
* 1.0.0 - Initiale Version
1214
* inkl. RBE (Report By Exception) und robuster Fehlerprüfung.
1315
********************************************************************************/
1416

@@ -54,6 +56,37 @@ function initializeLastScene() {
5456
// Dann aufrufen:
5557
initializeLastScene();
5658

59+
// ==========================================
60+
// Hilfsfunktionen
61+
// ==========================================
62+
63+
// Schaltet einen Datenpunkt nur, wenn der neue Wert vom aktuellen Ist-Wert abweicht.
64+
// Das reduziert unnötigen Schaltverkehr im Smart Home Netzwerk.
65+
function setIfChanged(id, targetValue) {
66+
if (!existsState(id)) {
67+
log(`${CONFIG.LOG_PREFIX}Datenpunkt existiert nicht, kann nicht schalten: ${id}`, "warn");
68+
return;
69+
}
70+
71+
const currentState = getState(id).val;
72+
73+
// Typen normalisieren für sicheren Vergleich
74+
const normalizedCurrent = typeof currentState === 'boolean' ? currentState :
75+
currentState === 'true' || currentState === 1 ? true :
76+
currentState === 'false' || currentState === 0 ? false :
77+
currentState;
78+
79+
const normalizedTarget = typeof targetValue === 'boolean' ? targetValue :
80+
targetValue === 'true' || targetValue === 1 ? true :
81+
targetValue === 'false' || targetValue === 0 ? false :
82+
targetValue;
83+
84+
if (normalizedCurrent !== normalizedTarget) {
85+
log(`${CONFIG.LOG_PREFIX}Schalte ${id} von ${currentState} auf ${targetValue}`, "debug");
86+
setState(id, targetValue, false); // ack: false explizit gesetzt für Steuerbefehle
87+
}
88+
}
89+
5790
// ==========================================
5891
// Hauptlogik
5992
// ==========================================
@@ -113,31 +146,31 @@ function checkAstroScene() {
113146
}
114147

115148
// Debug-Logging für bessere Fehlersuche
116-
log(`${CONFIG.LOG_PREFIX}Prüfung: Astro=${astroStatus}, Zeit=${currentHours}:${currentMinutes}, Aktuelle Szene=${currentSceneName}, Letzte Szene=${lastScene}`, "debug");
149+
log(`${CONFIG.LOG_PREFIX}Prüfung: Astro=${astroStatus}, Zeit=${currentHours}:${currentMinutes}, Aktuelle Szene=${currentSceneName}, Letzte Szene=${lastScene}`, "info");
117150

118151
// --- RBE (Report By Exception) ---
119152
// Wir senden nur Befehle, wenn sich die aktive Szene ändert
120153
if (currentSceneName !== lastScene) {
121154
lastScene = currentSceneName;
122155
log(`${CONFIG.LOG_PREFIX}Status-Änderung erkannt: Aktiviere Szene -> ${currentSceneName}`);
123156

124-
// Ausgänge schalten (ack: false explizit gesetzt für Steuerbefehle)
125-
setState(CONFIG.SCENES.TAG, valTag, false);
126-
setState(CONFIG.SCENES.NACHT, valNacht, false);
127-
setState(CONFIG.SCENES.AUS, valAus, false);
157+
// Ausgänge nur schalten, wenn sich der Wert wirklich ändert (schont den Funkverkehr)
158+
setIfChanged(CONFIG.SCENES.TAG, valTag);
159+
setIfChanged(CONFIG.SCENES.NACHT, valNacht);
160+
setIfChanged(CONFIG.SCENES.AUS, valAus);
128161
}
129162
}
130163

131164
// ==========================================
132165
// Trigger
133166
// ==========================================
134167

135-
// 1. Trigger: Bei jeder Änderung des Astro-Datenpunkts (entspricht "ioBroker in" Node)
168+
// 1. Trigger: Bei jeder Änderung des Astro-Datenpunkts
136169
on({ id: CONFIG.ASTRO_ID, change: "ne" }, function (obj) {
137170
checkAstroScene();
138171
});
139172

140-
// 2. Trigger: Zeitplan alle 5 Minuten (entspricht "inject" Node mit repeat: 300)
173+
// 2. Trigger: Zeitplan alle 5 Minuten
141174
// Dieser Intervall-Check stellt sicher, dass zeitbasierte Wechsel (z.B. um 22:30 Uhr)
142175
// zuverlässig ausgelöst werden, auch wenn der Astro-Status ("Nacht") sich nicht ändert.
143176
schedule("*/5 * * * *", function () {

0 commit comments

Comments
 (0)