Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Rauchmelder - Ein Javascript ersetzt vier Blockly

NEWS

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    2.1k

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    11
    1
    989

Rauchmelder - Ein Javascript ersetzt vier Blockly

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 3 Kommentatoren 102 Aufrufe 3 Beobachtet
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Michael SchmittM Online
    Michael SchmittM Online
    Michael Schmitt
    schrieb am zuletzt editiert von
    #1

    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)
    Screenshot 2026-05-28 182629.jpg

    Gruß Michael

    paul53P 1 Antwort Letzte Antwort
    0
    • skvarelS Offline
      skvarelS Offline
      skvarel
      Developer
      schrieb am zuletzt editiert von
      #2

      Das wäre aber doch mit einem Blockly nicht anders geworden ?!

      #TeamInventwo
      Unsere Adapter:
      Autodarts, FoxESS, Enpal, Life360ng, Tidy, vis-inventwo, vis-2-widgets-inventwo, vis-icontwo, vis-2-widgets-icontwo

      Wer uns mit einem Kaffee unterstützen möchte: PayPal

      1 Antwort Letzte Antwort
      1
      • Michael SchmittM Online
        Michael SchmittM Online
        Michael Schmitt
        schrieb am zuletzt editiert von
        #3

        hab ich aber nicht hinbekommen :)

        1 Antwort Letzte Antwort
        0
        • Michael SchmittM Michael Schmitt

          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)
          Screenshot 2026-05-28 182629.jpg

          Gruß Michael

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

          @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' });
          
          

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

          1 Antwort Letzte Antwort
          1
          • Michael SchmittM Online
            Michael SchmittM Online
            Michael Schmitt
            schrieb am zuletzt editiert von Michael Schmitt
            #5

            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');
            });
            
            paul53P 1 Antwort Letzte Antwort
            0
            • Michael SchmittM Michael Schmitt

              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');
              });
              
              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von paul53
              #6

              @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' });
              });
              

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB

              1 Antwort Letzte Antwort
              1

              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
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              276

              Online

              32.9k

              Benutzer

              83.1k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2026
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe