NEWS
Rauchmelder - Ein Javascript ersetzt vier Blockly
-
Hallo,
ich habe heute mal einen Test gemacht und meinen vier Blocklys die mir eine Telegramnachricht schicken und das Licht im jeweiligen Rausm einschalten wenn ein Rauch/Co2 Melder Alarm gibt. Das ganze hab ich in die Ki geworfen und sie da es funktioniert einwandfrei.
Könnte vielleicht mal jemand ( @paul53 ) über den Code schauen ob der so OK ist oder nicht ?
Mir ging es darum meine Blockly ein wenig zu reduzieren und vielleicht auch ein wenig Last aus dem System zu nehmen.// ZUORDNUNG: Hier fließen deine echten Datenpunkte und Lichter zusammen const sicherheitsSchnittstelle = { // 1. Wohnzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, // 2. Schlafzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, // 3. Flur 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] // Im Flur soll laut deinem Blockly kein Licht geschaltet werden }, // 4. Küche (CO2) 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: [ 'alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET' ] } }; // Ab hier arbeitet das Skript vollautomatisch auf einem einzigen Gruppen-Trigger const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; let datum = formatDate(new Date(), "DD.MM."); let uhrzeit = formatDate(new Date(), "hh:mm"); // ========================================================================= // FALL 1: EIN MELDER SCHLÄGT ALARM (AN) // ========================================================================= if (alarmAktiv === true || alarmAktiv === 1) { let lichtWurdeGesteuert = false; // Alle zugeordneten Lichter für diesen Raum einschalten if (info.lichter && info.lichter.length > 0) { for (let i = 0; i < info.lichter.length; i++) { if (existsState(info.lichter[i])) { setState(info.lichter[i], true); lichtWurdeGesteuert = true; } } } // Elegante HTML-Nachricht zusammenbauen let nachrichtAn = "🚨 <b>GEFAHREN-ALARM !</b> 🚨\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Ein Sicherheitsmelder hat angesprochen:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AN)\n\n"; if (lichtWurdeGesteuert) { nachrichtAn += "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; } else { nachrichtAn += "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } // Per Telegram absenden im sauberen HTML-Modus sendTo('telegram.0', { text: nachrichtAn, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-ALARM AUSGELÖST: " + info.raum + " (" + info.typ + ")", 'warn'); } // ========================================================================= // FALL 2: EIN MELDER GEHT WIEDER AUS (AUS) // ========================================================================= else if (alarmAktiv === false || alarmAktiv === 0) { // Elegante HTML-Entwarnung zusammenbauen let nachrichtAus = "🟢 <b>Sicherheits-Entwarnung</b> 🟢\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Der Gefahrenbereich hat sich normalisiert:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AUS)\n\n" + "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; sendTo('telegram.0', { text: nachrichtAus, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Alarm beendet: " + info.raum, 'info'); } });und so sieht die Telegrammeldung aus (kurz mit der Testtaste getrickert)

Gruß Michael
-
hab ich aber nicht hinbekommen :)
-
Hallo,
ich habe heute mal einen Test gemacht und meinen vier Blocklys die mir eine Telegramnachricht schicken und das Licht im jeweiligen Rausm einschalten wenn ein Rauch/Co2 Melder Alarm gibt. Das ganze hab ich in die Ki geworfen und sie da es funktioniert einwandfrei.
Könnte vielleicht mal jemand ( @paul53 ) über den Code schauen ob der so OK ist oder nicht ?
Mir ging es darum meine Blockly ein wenig zu reduzieren und vielleicht auch ein wenig Last aus dem System zu nehmen.// ZUORDNUNG: Hier fließen deine echten Datenpunkte und Lichter zusammen const sicherheitsSchnittstelle = { // 1. Wohnzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, // 2. Schlafzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, // 3. Flur 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] // Im Flur soll laut deinem Blockly kein Licht geschaltet werden }, // 4. Küche (CO2) 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: [ 'alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET' ] } }; // Ab hier arbeitet das Skript vollautomatisch auf einem einzigen Gruppen-Trigger const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; let datum = formatDate(new Date(), "DD.MM."); let uhrzeit = formatDate(new Date(), "hh:mm"); // ========================================================================= // FALL 1: EIN MELDER SCHLÄGT ALARM (AN) // ========================================================================= if (alarmAktiv === true || alarmAktiv === 1) { let lichtWurdeGesteuert = false; // Alle zugeordneten Lichter für diesen Raum einschalten if (info.lichter && info.lichter.length > 0) { for (let i = 0; i < info.lichter.length; i++) { if (existsState(info.lichter[i])) { setState(info.lichter[i], true); lichtWurdeGesteuert = true; } } } // Elegante HTML-Nachricht zusammenbauen let nachrichtAn = "🚨 <b>GEFAHREN-ALARM !</b> 🚨\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Ein Sicherheitsmelder hat angesprochen:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AN)\n\n"; if (lichtWurdeGesteuert) { nachrichtAn += "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; } else { nachrichtAn += "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } // Per Telegram absenden im sauberen HTML-Modus sendTo('telegram.0', { text: nachrichtAn, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-ALARM AUSGELÖST: " + info.raum + " (" + info.typ + ")", 'warn'); } // ========================================================================= // FALL 2: EIN MELDER GEHT WIEDER AUS (AUS) // ========================================================================= else if (alarmAktiv === false || alarmAktiv === 0) { // Elegante HTML-Entwarnung zusammenbauen let nachrichtAus = "🟢 <b>Sicherheits-Entwarnung</b> 🟢\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Der Gefahrenbereich hat sich normalisiert:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AUS)\n\n" + "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; sendTo('telegram.0', { text: nachrichtAus, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Alarm beendet: " + info.raum, 'info'); } });und so sieht die Telegrammeldung aus (kurz mit der Testtaste getrickert)

Gruß Michael
@Michael-Schmitt [sagte]: Code schauen ob der so OK ist oder nicht ?
Der Code ist OK, lässt sich aber vereinfachen, z.B. einfache Prüfung von obj.state.val und nur einmal sendTo('telegram.0'). Prinzip:
let nachricht = ''; // ========================================================================= // FALL 1: EIN MELDER SCHLÄGT ALARM (AN) // ========================================================================= if (obj.state.val) { // nachricht aufbereieten log("Sicherheits-ALARM AUSGELÖST: " + info.raum + " (" + info.typ + ")", 'warn'); } // ========================================================================= // FALL 2: EIN MELDER GEHT WIEDER AUS (AUS) // ========================================================================= else { // nachricht aufbereiten log("Sicherheits-Alarm beendet: " + info.raum, 'info'); } sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); -
ich hab mal deine Vorschläge in die Ki gefüttert und hab das bekommen.
const sicherheitsSchnittstelle = { 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] }, 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: ['alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET'] } }; let sperreAktiv = {}; const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; let istAn = (alarmAktiv === true || alarmAktiv === 1); // NEU: Die 5-Sekunden-Sperre blockiert ab jetzt NUR noch neue AN-Meldungen! // Wenn der Melder auf AUS geht, wird die Sperre komplett ignoriert. if (istAn && sperreAktiv[ausgeloesteID]) { return; } if (istAn) { // Sperre für dieses Gerät für 5 Sekunden aktivieren sperreAktiv[ausgeloesteID] = true; setTimeout(function () { delete sperreAktiv[ausgeloesteID]; }, 5000); // LICHTER NUR IM ERNSTFALL SCHALTEN UND TEXT ANPASSEN if (info.lichter && info.lichter.length > 0) { infoText = "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; info.lichter.forEach(function(lichtID) { if (existsState(lichtID)) setState(lichtID, true); }); } else { infoText = "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } } else { // TEXT FÜR DEN AUS-ZUSTAND (ENTWARNUNG) infoText = "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; } // 2. DYNAMISCHE TEXT-ERMITTLUNG JE NACH STATUS let emoji = istAn ? "🚨" : "🟢"; let titel = istAn ? "GEFAHREN-ALARM !" : "Sicherheits-Entwarnung"; let statusText = istAn ? "(AN)" : "(AUS)"; // 3. EINZIGER GEMEINSAMER TELEGRAM- & LOG-BEFEHL let nachricht = emoji + " <b>" + titel + "</b> " + emoji + "\n" + "🕒 <i>Am " + formatDate(new Date(), "DD.MM.") + " um " + formatDate(new Date(), "hh:mm") + " Uhr</i>\n\n" + "Statusänderung des Sicherheitsmelders:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " " + statusText + "\n\n" + infoText; sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Status (" + statusText + "): " + info.raum, istAn ? 'warn' : 'info'); });EDIT:
const sicherheitsSchnittstelle = { 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] }, 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: ['alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET'] } }; let sperreAktiv = {}; const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; if (!info) { log("Keine Konfiguration für: " + ausgeloesteID, 'error'); return; } let istAn = (alarmAktiv === true || alarmAktiv === 1); // NEU: Die 5-Sekunden-Sperre blockiert ab jetzt NUR noch neue AN-Meldungen! // Wenn der Melder auf AUS geht, wird die Sperre komplett ignoriert. if (istAn && sperreAktiv[ausgeloesteID]) { return; } let infoText = ""; if (istAn) { // Sperre für dieses Gerät für 5 Sekunden aktivieren sperreAktiv[ausgeloesteID] = true; setTimeout(function () { delete sperreAktiv[ausgeloesteID]; }, 5000); // LICHTER NUR IM ERNSTFALL SCHALTEN UND TEXT ANPASSEN if (info.lichter && info.lichter.length > 0) { infoText = "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; info.lichter.forEach(function(lichtID) { if (existsState(lichtID)) setState(lichtID, true); }); } else { infoText = "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } } else { // TEXT FÜR DEN AUS-ZUSTAND (ENTWARNUNG) infoText = "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; } // 2. DYNAMISCHE TEXT-ERMITTLUNG JE NACH STATUS let emoji = istAn ? "🚨" : "🟢"; let titel = istAn ? "GEFAHREN-ALARM !" : "Sicherheits-Entwarnung"; let statusText = istAn ? "(AN)" : "(AUS)"; // EINMAL Zeit erzeugen let jetzt = new Date(); // 3. EINZIGER GEMEINSAMER TELEGRAM- & LOG-BEFEHL let nachricht = emoji + " <b>" + titel + "</b> " + emoji + "\n" + "🕒 <i>Am " + formatDate(jetzt, "DD.MM.") + " um " + formatDate(jetzt, "hh:mm") + " Uhr</i>\n\n" + "Statusänderung des Sicherheitsmelders:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " " + statusText + "\n\n" + infoText; sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Status (" + statusText + "): " + info.raum, istAn ? 'warn' : 'info'); }); -
ich hab mal deine Vorschläge in die Ki gefüttert und hab das bekommen.
const sicherheitsSchnittstelle = { 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] }, 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: ['alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET'] } }; let sperreAktiv = {}; const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; let istAn = (alarmAktiv === true || alarmAktiv === 1); // NEU: Die 5-Sekunden-Sperre blockiert ab jetzt NUR noch neue AN-Meldungen! // Wenn der Melder auf AUS geht, wird die Sperre komplett ignoriert. if (istAn && sperreAktiv[ausgeloesteID]) { return; } if (istAn) { // Sperre für dieses Gerät für 5 Sekunden aktivieren sperreAktiv[ausgeloesteID] = true; setTimeout(function () { delete sperreAktiv[ausgeloesteID]; }, 5000); // LICHTER NUR IM ERNSTFALL SCHALTEN UND TEXT ANPASSEN if (info.lichter && info.lichter.length > 0) { infoText = "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; info.lichter.forEach(function(lichtID) { if (existsState(lichtID)) setState(lichtID, true); }); } else { infoText = "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } } else { // TEXT FÜR DEN AUS-ZUSTAND (ENTWARNUNG) infoText = "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; } // 2. DYNAMISCHE TEXT-ERMITTLUNG JE NACH STATUS let emoji = istAn ? "🚨" : "🟢"; let titel = istAn ? "GEFAHREN-ALARM !" : "Sicherheits-Entwarnung"; let statusText = istAn ? "(AN)" : "(AUS)"; // 3. EINZIGER GEMEINSAMER TELEGRAM- & LOG-BEFEHL let nachricht = emoji + " <b>" + titel + "</b> " + emoji + "\n" + "🕒 <i>Am " + formatDate(new Date(), "DD.MM.") + " um " + formatDate(new Date(), "hh:mm") + " Uhr</i>\n\n" + "Statusänderung des Sicherheitsmelders:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " " + statusText + "\n\n" + infoText; sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Status (" + statusText + "): " + info.raum, istAn ? 'warn' : 'info'); });EDIT:
const sicherheitsSchnittstelle = { 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] }, 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: ['alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET'] } }; let sperreAktiv = {}; const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let alarmAktiv = obj.state.val; let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; if (!info) { log("Keine Konfiguration für: " + ausgeloesteID, 'error'); return; } let istAn = (alarmAktiv === true || alarmAktiv === 1); // NEU: Die 5-Sekunden-Sperre blockiert ab jetzt NUR noch neue AN-Meldungen! // Wenn der Melder auf AUS geht, wird die Sperre komplett ignoriert. if (istAn && sperreAktiv[ausgeloesteID]) { return; } let infoText = ""; if (istAn) { // Sperre für dieses Gerät für 5 Sekunden aktivieren sperreAktiv[ausgeloesteID] = true; setTimeout(function () { delete sperreAktiv[ausgeloesteID]; }, 5000); // LICHTER NUR IM ERNSTFALL SCHALTEN UND TEXT ANPASSEN if (info.lichter && info.lichter.length > 0) { infoText = "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; info.lichter.forEach(function(lichtID) { if (existsState(lichtID)) setState(lichtID, true); }); } else { infoText = "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } } else { // TEXT FÜR DEN AUS-ZUSTAND (ENTWARNUNG) infoText = "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; } // 2. DYNAMISCHE TEXT-ERMITTLUNG JE NACH STATUS let emoji = istAn ? "🚨" : "🟢"; let titel = istAn ? "GEFAHREN-ALARM !" : "Sicherheits-Entwarnung"; let statusText = istAn ? "(AN)" : "(AUS)"; // EINMAL Zeit erzeugen let jetzt = new Date(); // 3. EINZIGER GEMEINSAMER TELEGRAM- & LOG-BEFEHL let nachricht = emoji + " <b>" + titel + "</b> " + emoji + "\n" + "🕒 <i>Am " + formatDate(jetzt, "DD.MM.") + " um " + formatDate(jetzt, "hh:mm") + " Uhr</i>\n\n" + "Statusänderung des Sicherheitsmelders:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " " + statusText + "\n\n" + infoText; sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); log("Sicherheits-Status (" + statusText + "): " + info.raum, istAn ? 'warn' : 'info'); });@Michael-Schmitt [sagte]: hab das bekommen.
Das komplette Skript mit den beiden Vereinfachungen:
// ZUORDNUNG: Hier fließen deine echten Datenpunkte und Lichter zusammen const sicherheitsSchnittstelle = { // 1. Wohnzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_WZ.ACTUAL': { raum: 'Wohnzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.WZ_Decke_hinten.SET', 'alias.0.Lichter.WZ_Decke_vorne.SET'] }, // 2. Schlafzimmer 'alias.0.Co2/Rauchmelder.Rauchmelder_Schlafzimmer.ACTUAL': { raum: 'Schlafzimmer', typ: '🔥 Rauchmelder', lichter: ['alias.0.Lichter.Schlafzimmer_Decke.SET', 'alias.0.Lichter.Schlafzimmer_Nachttischlampe.SET'] }, // 3. Flur 'alias.0.Co2/Rauchmelder.Rauchmelder_Flur.ACTUAL': { raum: 'Flur', typ: '🔥 Rauchmelder', lichter: [] // Im Flur soll laut deinem Blockly kein Licht geschaltet werden }, // 4. Küche (CO2) 'alias.0.Co2/Rauchmelder.Co2Melder_Küche.ACTUAL': { raum: 'Küche', typ: '⚠️ CO2-Melder', lichter: [ 'alias.0.Lichter.Küche_1.SET', 'alias.0.Lichter.Küche_2.SET', 'alias.0.Lichter.Küche_3.SET', 'alias.0.Lichter.Küche_4.SET' ] } }; // Ab hier arbeitet das Skript vollautomatisch auf einem einzigen Gruppen-Trigger const melderListe = Object.keys(sicherheitsSchnittstelle); on({id: melderListe, change: 'ne'}, function (obj) { let ausgeloesteID = obj.id; let info = sicherheitsSchnittstelle[ausgeloesteID]; let datum = formatDate(new Date(), "DD.MM."); let uhrzeit = formatDate(new Date(), "hh:mm"); let nachricht = ''; // ========================================================================= // FALL 1: EIN MELDER SCHLÄGT ALARM (AN) // ========================================================================= if (obj.state.val) { let lichtWurdeGesteuert = false; // Alle zugeordneten Lichter für diesen Raum einschalten if (info.lichter && info.lichter.length > 0) { for (let i = 0; i < info.lichter.length; i++) { if (existsState(info.lichter[i])) { setState(info.lichter[i], true); lichtWurdeGesteuert = true; } } } // Elegante HTML-Nachricht zusammenbauen nachricht = "🚨 <b>GEFAHREN-ALARM !</b> 🚨\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Ein Sicherheitsmelder hat angesprochen:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AN)\n\n"; if (lichtWurdeGesteuert) { nachricht += "💡 <i>Die Beleuchtung im Raum wurde automatisch eingeschaltet!</i>"; } else { nachricht += "ℹ️ <i>In diesem Raum ist keine Notbeleuchtung hinterlegt.</i>"; } log("Sicherheits-ALARM AUSGELÖST: " + info.raum + " (" + info.typ + ")", 'warn'); } // ========================================================================= // FALL 2: EIN MELDER GEHT WIEDER AUS (AUS) // ========================================================================= else { // Elegante HTML-Entwarnung zusammenbauen nachricht = "🟢 <b>Sicherheits-Entwarnung</b> 🟢\n" + "🕒 <i>Am " + datum + " um " + uhrzeit + " Uhr</i>\n\n" + "Der Gefahrenbereich hat sich normalisiert:\n" + "• <b>Typ:</b> " + info.typ + "\n" + "• <b>Raum:</b> " + info.raum + " (AUS)\n\n" + "✅ <i>Der Melder meldet wieder einen sicheren Zustand.</i>"; log("Sicherheits-Alarm beendet: " + info.raum, 'info'); } // Per Telegram absenden im sauberen HTML-Modus sendTo('telegram.0', { text: nachricht, user: 'Michael', parse_mode: 'HTML' }); });
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden