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. Error/Bug
  4. [gelöst] Schwierigkeiten mit alexa-Adapter

NEWS

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    926

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    3.3k

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

[gelöst] Schwierigkeiten mit alexa-Adapter

Geplant Angeheftet Gesperrt Verschoben Ungelöst Error/Bug
170 Beiträge 39 Kommentatoren 8.4k Aufrufe 43 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.
  • andiko2A Offline
    andiko2A Offline
    andiko2
    schrieb am zuletzt editiert von
    #144

    ich überwache den Datenpunkt connection von Alexa mit der Eventlist. habe mir ein Event erstellt und lasse mir das Ergebnis per Telegram auf das Handy und mein Arbeits PC schicken. Da brauche ich nicht extra ein Script laufen lassen, da ich die Eventlist eh installiert habe. Funktioniert recht zuverlässig. Ohne Eventlist, hätte ich mir bestimmt auch ein Script gebastelt.

    1 Antwort Letzte Antwort
    1
    • Michael SchmittM Michael Schmitt

      Hi,
      hab mir mal mit ChatGPT und Google KI ein javascript gebaut (bauen lassen). Es meldet wenn Adapter Rot - GELB - GRÜN. Werde das mal testen bis Alexa wieder rum zickt und dann kann ich das posten.
      Für den ersten Test hab ich mal email.0 gestoppt und wieder gestartet ( kurze Zeit später) und das kam per Telegram. Bei einem normalen Neustart eines Adapters kommt nur eine Meldung "Iobroker Entwarnung".

      Screenshot 2026-06-24 211842.jpg

      amg_666A Offline
      amg_666A Offline
      amg_666
      schrieb am zuletzt editiert von
      #145

      @Michael-Schmitt sagte:

      hab mir mal mit ChatGPT und Google KI ein javascript gebaut

      Magst du das hier posten?

      iobroker auf proxmox container

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

        Wenn Alexa wieder spinnt und das korrekt gemeldet wird kann ich das gerne machen.

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

          Hi,
          so heute ist der Alexa2 Adapter wieder drei oder vier Tage gelaufen und ich habe mit einem Adapter Stopp und Adapter Start das "gelb" werden getriggert.

          Das war das Ergebniss des Scripts=
          Screenshot 2026-06-25 154822.jpg

          Ich bin nur Noobiuser, aber es sieht so aus als das es funktioniert. Ich übernehme aber keine Verantwortung über irgendwelche Schäden oder wenn was nicht geht ;) .

          In dem Script gibt es viele Erklärungen und ihr müßt darin nur Euren Telegram User rein schreiben oder komplett weglassen.

          Hier:

          const TELEGRAM_USER = "HierEuereUserNamen";
          

          hier ist das genze Javascript vielleicht kann da mal wer der Ahnung hat drüber schauen. (ver. 27.02.26)

          // ======================================================
          // 1. KONFIGURATION (Hier alle Einstellungen vornehmen)
          // ======================================================
          
          // Hier die gewünschte Telegram-Instanz eintragen (Standard: "telegram.0")
          const TELEGRAM_INSTANCE = "telegram.0";
          
          // Hier den exakten Telegram-Benutzernamen eintragen, der die Nachrichten erhalten soll.
          // WICHTIG: Soll die Nachricht an ALLE angemeldeten Geräte oder Gruppen gesendet werden,
          // trage hier einfach zwei doppelte Anführungszeichen "" ein (komplett leer lassen).
          const TELEGRAM_USER = "HierEuerenUserRein";
          
          // Liste von Adaptern, die komplett von der Überwachung ausgenommen werden sollen.
          // Der Filter prüft auf den Anfang des Instanznamens (Prefix).
          // BEISPIELE für die Nutzung:
          // const ignorePrefixes = ["ping.", "fb-checkpresence."]; -> Ignoriert alle Ping- und Fritzbox-Instanzen
          // const ignorePrefixes = ["alexa2.0"]; -> Ignoriert gezielt nur die erste Alexa-Instanz
          const ignorePrefixes = [];
          
          // Einstellbare Timer-Verzögerungen (Timeouts in Millisekunden)
          const DELAY_OFFLINE = 30 * 1000;      // Wartezeit vor einem Rot-Alarm (Prozess offline)
          const DELAY_CONNECTION = 30 * 1000;   // Wartezeit vor einem Gelb-Alarm (Verbindungsverlust)
          const DELAY_ONLINE = 30 * 1000;       // Stabilisierungszeit vor einem Grün-Alarm (Entwarnung)
          
          // Alarm-Sperrzeiten (Flap-Guard / Flatterschutz)
          const ALERT_SUPPRESSION = 90 * 1000;  // Mindestabstand zwischen zwei Fehlermeldungen desselben Adapters
          const ONLINE_SUPPRESSION = 5 * 60 * 1000; // Mindestabstand zwischen zwei Entwarnungen desselben Adapters
          
          // Aufbewahrungszeit der Alarm-Historie im RAM-Speicher (1 Stunde)
          const HISTORY_RETENTION = 60 * 60 * 1000;
          
          // ======================================================
          // 2. SPEICHER & CACHE
          // ======================================================
          
          const monitorState = {
              timeoutsAbsturz: {},
              timeoutsWiederstart: {},
              timeoutsVerbindung: {},
              lastAlertOffline: {},
              lastAlertOnline: {},
              lastAlertYellow: {}
          };
          
          const scheduleAdapterCache = {};
          let isCacheReady = false;
          
          // ======================================================
          // PRELOADER (Sicherer RAM-Preload über den State-Selektor)
          // ======================================================
          
          function preloadScheduleAdapters() {
              try {
                  // Findet alle echten Instanzen über deren systemweiten .alive-Datenpunkt
                  const aliveStates = $('system.adapter.*.*.alive');
                  
                  aliveStates.each((id) => {
                      const inst = id.replace("system.adapter.", "").replace(".alive", "");
                      const configObj = getObject("system.adapter." + inst);
                      
                      if (configObj) {
                          scheduleAdapterCache[inst] = configObj.common?.mode === "schedule";
                      }
                  });
          
                  isCacheReady = true;
                  log(`Adapter-Monitor: Cache erfolgreich geladen (${Object.keys(scheduleAdapterCache).length} Instanzen)`, "info");
          
              } catch (e) {
                  log("Adapter-Monitor: Preload-Fehler im System: " + e, "warn");
                  isCacheReady = true;
              }
          }
          
          preloadScheduleAdapters();
          
          // ======================================================
          // GC (Garbage Collector für die Historie)
          // ======================================================
          
          setInterval(() => {
              const now = Date.now();
          
              for (const group of [
                  monitorState.lastAlertOffline,
                  monitorState.lastAlertOnline,
                  monitorState.lastAlertYellow
              ]) {
                  for (const k in group) {
                      if (now - group[k] > HISTORY_RETENTION) {
                          delete group[k];
                      }
                  }
              }
          }, 15 * 60 * 1000);
          // ======================================================
          // HELPERS
          // ======================================================
          
          function clearMonitorTimeout(obj, key) {
              if (obj[key]) {
                  clearTimeout(obj[key]);
                  delete obj[key];
              }
          }
          
          function triggerYellowAlert(inst) {
              const now = Date.now();
              if (now - (monitorState.lastAlertYellow[inst] || 0) < ALERT_SUPPRESSION) return;
          
              sendTelegram(
          `⚠️ *ioBroker Status-Warnung* ⚠️
          ───────────────────
          • *Adapter:* \`${inst}\`
          • *Status:* \`keine Verbindung (Gelb)\`
          • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
          ───────────────────
          🔌 _Der Prozess läuft, aber die Verbindung zum Gerät oder Cloud-Dienst ist gestört!_`
              );
          
              monitorState.lastAlertYellow[inst] = now;
              log("Adapter-Zustand: " + inst + " hat keine Verbindung (Gelb)", "info");
          }
          
          function isScheduleAdapter(inst) {
              if (scheduleAdapterCache[inst] === undefined) {
                  const configObj = getObject("system.adapter." + inst);
          
                  scheduleAdapterCache[inst] =
                      configObj &&
                      configObj.common &&
                      configObj.common.mode === "schedule";
              }
          
              return scheduleAdapterCache[inst] === true;
          }
          
          function safeGetState(id) {
              try {
                  return getState(id) || null;
              } catch (e) {
                  return null;
              }
          }
          
          function sendTelegram(text) {
              const telegramOptions = {
                  text: text,
                  parse_mode: "Markdown"
              };
              
              // Nur filtern, wenn ein spezifischer Benutzername oben eingetragen wurde
              if (TELEGRAM_USER && TELEGRAM_USER.trim() !== "") {
                  telegramOptions.user = TELEGRAM_USER;
              }
          
              sendTo(TELEGRAM_INSTANCE, telegramOptions);
          }
          
          // ======================================================
          // MAIN HANDLER (Live-Event-Überwachung)
          // ======================================================
          
          on({ id: /^system\.adapter\..*\.(alive|connection)$/, change: "ne" }, handleAdapterChange);
          on({ id: /^([a-zA-Z0-9._\-]+)\.\d+\.info\.connection$/, change: "ne" }, handleAdapterChange);
          
          function handleAdapterChange(obj) {
          
              if (!isCacheReady) return;
              if (!obj?.state || !obj?.oldState) return;
              if (typeof obj.state.val !== "boolean") return;
          
              const status = obj.state.val;
              const previous = obj.oldState.val;
              let inst = "";
              let type = "";
          
              if (obj.id.startsWith("system.adapter.")) {
                  const match = obj.id.match(/^system\.adapter\.([a-zA-Z0-9._\-]+)\.(alive|connection)$/);
                  if (!match) return;
                  inst = match[1];
                  type = match[2];
              } else {
                  const match = obj.id.match(/^(([a-zA-Z0-9._\-]+)\.\d+)\.info\.connection$/);
                  if (!match) return;
                  inst = match[1];
                  type = "connection";
              }
          
              if (ignorePrefixes.some(p => inst.startsWith(p))) return;
          
              // ==================================================
              // 🔴 CRASH (Prozess offline)
              // ==================================================
              if (type === "alive" && status === false && previous === true) {
          
                  clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                  clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                  clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
          
                  monitorState.timeoutsAbsturz[inst] = setTimeout(() => {
                      delete monitorState.timeoutsAbsturz[inst];
                      if (isScheduleAdapter(inst)) return;
          
                      const alive = safeGetState("system.adapter." + inst + ".alive");
                      if (!alive || alive.val !== false) return;
          
                      const now = Date.now();
                      if (now - (monitorState.lastAlertOffline[inst] || 0) < ALERT_SUPPRESSION) return;
          
                      sendTelegram(
          `🚨 *ioBroker System-Warnung* 🚨
          ───────────────────
          • *Adapter:* \`${inst}\`
          • *Status:* \`offline (Prozess tot)\`
          • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
          ───────────────────
          ⚠️ _Der Instanz-Prozess ist unerwartet abgestürzt oder wurde gestoppt!_`
                      );
          
                      monitorState.lastAlertOffline[inst] = now;
                      log("Adapter-Zustand: " + inst + " ist offline (Rot)", "info"); 
          
                  }, DELAY_OFFLINE);
              }
          
              // ==================================================
              // 🟡 CONNECTION LOSS (Verbindungsverlust)
              // ==================================================
              else if (type === "connection" && status === false && previous === true) {
          
                  clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                  clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                  clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
          
                  monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                      delete monitorState.timeoutsVerbindung[inst];
          
                      const alive = safeGetState("system.adapter." + inst + ".alive");
                      if (!alive || alive.val !== true) return;
                      
                      const sysConnId = "system.adapter." + inst + ".connection";
                      const infoConnId = inst + ".info.connection";
                      
                      const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                      const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                      
                      if ((sysConn && sysConn.val === true) && (!infoConn || infoConn.val === true)) return;
          
                      triggerYellowAlert(inst);
          
                  }, DELAY_CONNECTION);
              }
          
              // ==================================================
              // 🟢 RECOVERY / START LOGIK (Entwarnung)
              // ==================================================
              else if ((type === "alive" || type === "connection") && status === true && previous === false) {
          
                  clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                  clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                  clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
          
                  monitorState.timeoutsWiederstart[inst] = setTimeout(() => {
                      delete monitorState.timeoutsWiederstart[inst];
          
                      const alive = safeGetState("system.adapter." + inst + ".alive");
                      if (!alive || alive.val !== true) return;
          
                      const sysConnId = "system.adapter." + inst + ".connection";
                      const infoConnId = inst + ".info.connection";
          
                      const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                      const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
          
                      if ((sysConn && sysConn.val === false) || (infoConn && infoConn.val === false)) {
                          
                          if (!monitorState.timeoutsVerbindung[inst]) {
                              monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                  delete monitorState.timeoutsVerbindung[inst];
                                  
                                  const currentAlive = safeGetState("system.adapter." + inst + ".alive");
                                  const currentSys = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                  const currentInfo = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                  
                                  if (currentAlive && currentAlive.val === true) {
                                      if ((currentSys && currentSys.val === false) || (currentInfo && currentInfo.val === false)) {
                                          triggerYellowAlert(inst);
                                      }
                                  }
                              }, DELAY_CONNECTION);
                          }
                          return;
                      }
          
                      if (isScheduleAdapter(inst)) return;
          
                      const hadOffline = monitorState.lastAlertOffline[inst];
                      const hadYellow  = monitorState.lastAlertYellow[inst];
          
                      if (hadOffline === undefined && hadYellow === undefined) return;
          
                      const now = Date.now();
                      if (now - (monitorState.lastAlertOnline[inst] || 0) < ONLINE_SUPPRESSION) return;
          
                      delete monitorState.lastAlertOffline[inst];
                      delete monitorState.lastAlertYellow[inst];
          
                      sendTelegram(
          `✅ *ioBroker Entwarnung* ✅
          ───────────────────
          • *Adapter:* \`${inst}\`
          • *Status:* \`online (Grün)\`
          • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
          ───────────────────
          👍 _Die Instanz läuft wieder vollständig stabil._`
                      );
          
                      monitorState.lastAlertOnline[inst] = now;
                      log("Adapter-Zustand: " + inst + " ist wieder stabil online (Grün)", "debug"); 
          
                      clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                      clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
          
                  }, DELAY_ONLINE);
              }
          }
          

          Gruß Michael

          Edit: das soll für alle Adapter funktionieren
          Email Stopp und Start
          email.jpg

          Linuxcontrol Stopp und Start
          linuscontrol.jpg

          amg_666A J 2 Antworten Letzte Antwort
          2
          • Michael SchmittM Michael Schmitt

            Hi,
            so heute ist der Alexa2 Adapter wieder drei oder vier Tage gelaufen und ich habe mit einem Adapter Stopp und Adapter Start das "gelb" werden getriggert.

            Das war das Ergebniss des Scripts=
            Screenshot 2026-06-25 154822.jpg

            Ich bin nur Noobiuser, aber es sieht so aus als das es funktioniert. Ich übernehme aber keine Verantwortung über irgendwelche Schäden oder wenn was nicht geht ;) .

            In dem Script gibt es viele Erklärungen und ihr müßt darin nur Euren Telegram User rein schreiben oder komplett weglassen.

            Hier:

            const TELEGRAM_USER = "HierEuereUserNamen";
            

            hier ist das genze Javascript vielleicht kann da mal wer der Ahnung hat drüber schauen. (ver. 27.02.26)

            // ======================================================
            // 1. KONFIGURATION (Hier alle Einstellungen vornehmen)
            // ======================================================
            
            // Hier die gewünschte Telegram-Instanz eintragen (Standard: "telegram.0")
            const TELEGRAM_INSTANCE = "telegram.0";
            
            // Hier den exakten Telegram-Benutzernamen eintragen, der die Nachrichten erhalten soll.
            // WICHTIG: Soll die Nachricht an ALLE angemeldeten Geräte oder Gruppen gesendet werden,
            // trage hier einfach zwei doppelte Anführungszeichen "" ein (komplett leer lassen).
            const TELEGRAM_USER = "HierEuerenUserRein";
            
            // Liste von Adaptern, die komplett von der Überwachung ausgenommen werden sollen.
            // Der Filter prüft auf den Anfang des Instanznamens (Prefix).
            // BEISPIELE für die Nutzung:
            // const ignorePrefixes = ["ping.", "fb-checkpresence."]; -> Ignoriert alle Ping- und Fritzbox-Instanzen
            // const ignorePrefixes = ["alexa2.0"]; -> Ignoriert gezielt nur die erste Alexa-Instanz
            const ignorePrefixes = [];
            
            // Einstellbare Timer-Verzögerungen (Timeouts in Millisekunden)
            const DELAY_OFFLINE = 30 * 1000;      // Wartezeit vor einem Rot-Alarm (Prozess offline)
            const DELAY_CONNECTION = 30 * 1000;   // Wartezeit vor einem Gelb-Alarm (Verbindungsverlust)
            const DELAY_ONLINE = 30 * 1000;       // Stabilisierungszeit vor einem Grün-Alarm (Entwarnung)
            
            // Alarm-Sperrzeiten (Flap-Guard / Flatterschutz)
            const ALERT_SUPPRESSION = 90 * 1000;  // Mindestabstand zwischen zwei Fehlermeldungen desselben Adapters
            const ONLINE_SUPPRESSION = 5 * 60 * 1000; // Mindestabstand zwischen zwei Entwarnungen desselben Adapters
            
            // Aufbewahrungszeit der Alarm-Historie im RAM-Speicher (1 Stunde)
            const HISTORY_RETENTION = 60 * 60 * 1000;
            
            // ======================================================
            // 2. SPEICHER & CACHE
            // ======================================================
            
            const monitorState = {
                timeoutsAbsturz: {},
                timeoutsWiederstart: {},
                timeoutsVerbindung: {},
                lastAlertOffline: {},
                lastAlertOnline: {},
                lastAlertYellow: {}
            };
            
            const scheduleAdapterCache = {};
            let isCacheReady = false;
            
            // ======================================================
            // PRELOADER (Sicherer RAM-Preload über den State-Selektor)
            // ======================================================
            
            function preloadScheduleAdapters() {
                try {
                    // Findet alle echten Instanzen über deren systemweiten .alive-Datenpunkt
                    const aliveStates = $('system.adapter.*.*.alive');
                    
                    aliveStates.each((id) => {
                        const inst = id.replace("system.adapter.", "").replace(".alive", "");
                        const configObj = getObject("system.adapter." + inst);
                        
                        if (configObj) {
                            scheduleAdapterCache[inst] = configObj.common?.mode === "schedule";
                        }
                    });
            
                    isCacheReady = true;
                    log(`Adapter-Monitor: Cache erfolgreich geladen (${Object.keys(scheduleAdapterCache).length} Instanzen)`, "info");
            
                } catch (e) {
                    log("Adapter-Monitor: Preload-Fehler im System: " + e, "warn");
                    isCacheReady = true;
                }
            }
            
            preloadScheduleAdapters();
            
            // ======================================================
            // GC (Garbage Collector für die Historie)
            // ======================================================
            
            setInterval(() => {
                const now = Date.now();
            
                for (const group of [
                    monitorState.lastAlertOffline,
                    monitorState.lastAlertOnline,
                    monitorState.lastAlertYellow
                ]) {
                    for (const k in group) {
                        if (now - group[k] > HISTORY_RETENTION) {
                            delete group[k];
                        }
                    }
                }
            }, 15 * 60 * 1000);
            // ======================================================
            // HELPERS
            // ======================================================
            
            function clearMonitorTimeout(obj, key) {
                if (obj[key]) {
                    clearTimeout(obj[key]);
                    delete obj[key];
                }
            }
            
            function triggerYellowAlert(inst) {
                const now = Date.now();
                if (now - (monitorState.lastAlertYellow[inst] || 0) < ALERT_SUPPRESSION) return;
            
                sendTelegram(
            `⚠️ *ioBroker Status-Warnung* ⚠️
            ───────────────────
            • *Adapter:* \`${inst}\`
            • *Status:* \`keine Verbindung (Gelb)\`
            • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
            ───────────────────
            🔌 _Der Prozess läuft, aber die Verbindung zum Gerät oder Cloud-Dienst ist gestört!_`
                );
            
                monitorState.lastAlertYellow[inst] = now;
                log("Adapter-Zustand: " + inst + " hat keine Verbindung (Gelb)", "info");
            }
            
            function isScheduleAdapter(inst) {
                if (scheduleAdapterCache[inst] === undefined) {
                    const configObj = getObject("system.adapter." + inst);
            
                    scheduleAdapterCache[inst] =
                        configObj &&
                        configObj.common &&
                        configObj.common.mode === "schedule";
                }
            
                return scheduleAdapterCache[inst] === true;
            }
            
            function safeGetState(id) {
                try {
                    return getState(id) || null;
                } catch (e) {
                    return null;
                }
            }
            
            function sendTelegram(text) {
                const telegramOptions = {
                    text: text,
                    parse_mode: "Markdown"
                };
                
                // Nur filtern, wenn ein spezifischer Benutzername oben eingetragen wurde
                if (TELEGRAM_USER && TELEGRAM_USER.trim() !== "") {
                    telegramOptions.user = TELEGRAM_USER;
                }
            
                sendTo(TELEGRAM_INSTANCE, telegramOptions);
            }
            
            // ======================================================
            // MAIN HANDLER (Live-Event-Überwachung)
            // ======================================================
            
            on({ id: /^system\.adapter\..*\.(alive|connection)$/, change: "ne" }, handleAdapterChange);
            on({ id: /^([a-zA-Z0-9._\-]+)\.\d+\.info\.connection$/, change: "ne" }, handleAdapterChange);
            
            function handleAdapterChange(obj) {
            
                if (!isCacheReady) return;
                if (!obj?.state || !obj?.oldState) return;
                if (typeof obj.state.val !== "boolean") return;
            
                const status = obj.state.val;
                const previous = obj.oldState.val;
                let inst = "";
                let type = "";
            
                if (obj.id.startsWith("system.adapter.")) {
                    const match = obj.id.match(/^system\.adapter\.([a-zA-Z0-9._\-]+)\.(alive|connection)$/);
                    if (!match) return;
                    inst = match[1];
                    type = match[2];
                } else {
                    const match = obj.id.match(/^(([a-zA-Z0-9._\-]+)\.\d+)\.info\.connection$/);
                    if (!match) return;
                    inst = match[1];
                    type = "connection";
                }
            
                if (ignorePrefixes.some(p => inst.startsWith(p))) return;
            
                // ==================================================
                // 🔴 CRASH (Prozess offline)
                // ==================================================
                if (type === "alive" && status === false && previous === true) {
            
                    clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                    clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                    clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
            
                    monitorState.timeoutsAbsturz[inst] = setTimeout(() => {
                        delete monitorState.timeoutsAbsturz[inst];
                        if (isScheduleAdapter(inst)) return;
            
                        const alive = safeGetState("system.adapter." + inst + ".alive");
                        if (!alive || alive.val !== false) return;
            
                        const now = Date.now();
                        if (now - (monitorState.lastAlertOffline[inst] || 0) < ALERT_SUPPRESSION) return;
            
                        sendTelegram(
            `🚨 *ioBroker System-Warnung* 🚨
            ───────────────────
            • *Adapter:* \`${inst}\`
            • *Status:* \`offline (Prozess tot)\`
            • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
            ───────────────────
            ⚠️ _Der Instanz-Prozess ist unerwartet abgestürzt oder wurde gestoppt!_`
                        );
            
                        monitorState.lastAlertOffline[inst] = now;
                        log("Adapter-Zustand: " + inst + " ist offline (Rot)", "info"); 
            
                    }, DELAY_OFFLINE);
                }
            
                // ==================================================
                // 🟡 CONNECTION LOSS (Verbindungsverlust)
                // ==================================================
                else if (type === "connection" && status === false && previous === true) {
            
                    clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                    clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                    clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
            
                    monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                        delete monitorState.timeoutsVerbindung[inst];
            
                        const alive = safeGetState("system.adapter." + inst + ".alive");
                        if (!alive || alive.val !== true) return;
                        
                        const sysConnId = "system.adapter." + inst + ".connection";
                        const infoConnId = inst + ".info.connection";
                        
                        const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                        const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                        
                        if ((sysConn && sysConn.val === true) && (!infoConn || infoConn.val === true)) return;
            
                        triggerYellowAlert(inst);
            
                    }, DELAY_CONNECTION);
                }
            
                // ==================================================
                // 🟢 RECOVERY / START LOGIK (Entwarnung)
                // ==================================================
                else if ((type === "alive" || type === "connection") && status === true && previous === false) {
            
                    clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                    clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                    clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
            
                    monitorState.timeoutsWiederstart[inst] = setTimeout(() => {
                        delete monitorState.timeoutsWiederstart[inst];
            
                        const alive = safeGetState("system.adapter." + inst + ".alive");
                        if (!alive || alive.val !== true) return;
            
                        const sysConnId = "system.adapter." + inst + ".connection";
                        const infoConnId = inst + ".info.connection";
            
                        const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                        const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
            
                        if ((sysConn && sysConn.val === false) || (infoConn && infoConn.val === false)) {
                            
                            if (!monitorState.timeoutsVerbindung[inst]) {
                                monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                    delete monitorState.timeoutsVerbindung[inst];
                                    
                                    const currentAlive = safeGetState("system.adapter." + inst + ".alive");
                                    const currentSys = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                    const currentInfo = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                    
                                    if (currentAlive && currentAlive.val === true) {
                                        if ((currentSys && currentSys.val === false) || (currentInfo && currentInfo.val === false)) {
                                            triggerYellowAlert(inst);
                                        }
                                    }
                                }, DELAY_CONNECTION);
                            }
                            return;
                        }
            
                        if (isScheduleAdapter(inst)) return;
            
                        const hadOffline = monitorState.lastAlertOffline[inst];
                        const hadYellow  = monitorState.lastAlertYellow[inst];
            
                        if (hadOffline === undefined && hadYellow === undefined) return;
            
                        const now = Date.now();
                        if (now - (monitorState.lastAlertOnline[inst] || 0) < ONLINE_SUPPRESSION) return;
            
                        delete monitorState.lastAlertOffline[inst];
                        delete monitorState.lastAlertYellow[inst];
            
                        sendTelegram(
            `✅ *ioBroker Entwarnung* ✅
            ───────────────────
            • *Adapter:* \`${inst}\`
            • *Status:* \`online (Grün)\`
            • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
            ───────────────────
            👍 _Die Instanz läuft wieder vollständig stabil._`
                        );
            
                        monitorState.lastAlertOnline[inst] = now;
                        log("Adapter-Zustand: " + inst + " ist wieder stabil online (Grün)", "debug"); 
            
                        clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                        clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
            
                    }, DELAY_ONLINE);
                }
            }
            

            Gruß Michael

            Edit: das soll für alle Adapter funktionieren
            Email Stopp und Start
            email.jpg

            Linuxcontrol Stopp und Start
            linuscontrol.jpg

            amg_666A Offline
            amg_666A Offline
            amg_666
            schrieb am zuletzt editiert von
            #148

            @Michael-Schmitt sagte:

            so heute ist der Alexa2 Adapter wieder drei oder vier Tage gelaufen und ich habe mit einem Adapter Stopp und Adapter Start das "gelb" werden getriggert

            Danke für das Skript. Läuft super, ich hab zum Testen mal den Promox Adapter neu gestartet, der braucht bei mir immer "ewig" bis er grün wird, da kam dann eine Telegram Benachrichtigung.
            Neustart von Adaptern, die relativ schnell wieder grün werden -> Keine Benachrichtigung. Die Timer scheinen also auch sinnvolle Größen zu haben.

            iobroker auf proxmox container

            1 Antwort Letzte Antwort
            1
            • R Offline
              R Offline
              RISSN
              schrieb am zuletzt editiert von
              #149

              hier auch seit ein paar Tagen keine Ausfälle mehr, Amazon hat hier wohl den Fehler selbst korrigiert

              1 Antwort Letzte Antwort
              0
              • K Offline
                K Offline
                Kanumouse
                schrieb am zuletzt editiert von
                #150

                Ich muss immer noch meine Cookies jeden Tag aktualisieren.

                H 1 Antwort Letzte Antwort
                0
                • K Kanumouse

                  Ich muss immer noch meine Cookies jeden Tag aktualisieren.

                  H Offline
                  H Offline
                  Hothouse1602
                  schrieb am zuletzt editiert von
                  #151

                  @Kanumouse sagte:

                  Ich muss immer noch meine Cookies jeden Tag aktualisieren.

                  Ich bestätige , ich muß nach neustart auch Cookies immer noch holen.

                  1 Antwort Letzte Antwort
                  0
                  • Michael SchmittM Michael Schmitt

                    Hi,
                    so heute ist der Alexa2 Adapter wieder drei oder vier Tage gelaufen und ich habe mit einem Adapter Stopp und Adapter Start das "gelb" werden getriggert.

                    Das war das Ergebniss des Scripts=
                    Screenshot 2026-06-25 154822.jpg

                    Ich bin nur Noobiuser, aber es sieht so aus als das es funktioniert. Ich übernehme aber keine Verantwortung über irgendwelche Schäden oder wenn was nicht geht ;) .

                    In dem Script gibt es viele Erklärungen und ihr müßt darin nur Euren Telegram User rein schreiben oder komplett weglassen.

                    Hier:

                    const TELEGRAM_USER = "HierEuereUserNamen";
                    

                    hier ist das genze Javascript vielleicht kann da mal wer der Ahnung hat drüber schauen. (ver. 27.02.26)

                    // ======================================================
                    // 1. KONFIGURATION (Hier alle Einstellungen vornehmen)
                    // ======================================================
                    
                    // Hier die gewünschte Telegram-Instanz eintragen (Standard: "telegram.0")
                    const TELEGRAM_INSTANCE = "telegram.0";
                    
                    // Hier den exakten Telegram-Benutzernamen eintragen, der die Nachrichten erhalten soll.
                    // WICHTIG: Soll die Nachricht an ALLE angemeldeten Geräte oder Gruppen gesendet werden,
                    // trage hier einfach zwei doppelte Anführungszeichen "" ein (komplett leer lassen).
                    const TELEGRAM_USER = "HierEuerenUserRein";
                    
                    // Liste von Adaptern, die komplett von der Überwachung ausgenommen werden sollen.
                    // Der Filter prüft auf den Anfang des Instanznamens (Prefix).
                    // BEISPIELE für die Nutzung:
                    // const ignorePrefixes = ["ping.", "fb-checkpresence."]; -> Ignoriert alle Ping- und Fritzbox-Instanzen
                    // const ignorePrefixes = ["alexa2.0"]; -> Ignoriert gezielt nur die erste Alexa-Instanz
                    const ignorePrefixes = [];
                    
                    // Einstellbare Timer-Verzögerungen (Timeouts in Millisekunden)
                    const DELAY_OFFLINE = 30 * 1000;      // Wartezeit vor einem Rot-Alarm (Prozess offline)
                    const DELAY_CONNECTION = 30 * 1000;   // Wartezeit vor einem Gelb-Alarm (Verbindungsverlust)
                    const DELAY_ONLINE = 30 * 1000;       // Stabilisierungszeit vor einem Grün-Alarm (Entwarnung)
                    
                    // Alarm-Sperrzeiten (Flap-Guard / Flatterschutz)
                    const ALERT_SUPPRESSION = 90 * 1000;  // Mindestabstand zwischen zwei Fehlermeldungen desselben Adapters
                    const ONLINE_SUPPRESSION = 5 * 60 * 1000; // Mindestabstand zwischen zwei Entwarnungen desselben Adapters
                    
                    // Aufbewahrungszeit der Alarm-Historie im RAM-Speicher (1 Stunde)
                    const HISTORY_RETENTION = 60 * 60 * 1000;
                    
                    // ======================================================
                    // 2. SPEICHER & CACHE
                    // ======================================================
                    
                    const monitorState = {
                        timeoutsAbsturz: {},
                        timeoutsWiederstart: {},
                        timeoutsVerbindung: {},
                        lastAlertOffline: {},
                        lastAlertOnline: {},
                        lastAlertYellow: {}
                    };
                    
                    const scheduleAdapterCache = {};
                    let isCacheReady = false;
                    
                    // ======================================================
                    // PRELOADER (Sicherer RAM-Preload über den State-Selektor)
                    // ======================================================
                    
                    function preloadScheduleAdapters() {
                        try {
                            // Findet alle echten Instanzen über deren systemweiten .alive-Datenpunkt
                            const aliveStates = $('system.adapter.*.*.alive');
                            
                            aliveStates.each((id) => {
                                const inst = id.replace("system.adapter.", "").replace(".alive", "");
                                const configObj = getObject("system.adapter." + inst);
                                
                                if (configObj) {
                                    scheduleAdapterCache[inst] = configObj.common?.mode === "schedule";
                                }
                            });
                    
                            isCacheReady = true;
                            log(`Adapter-Monitor: Cache erfolgreich geladen (${Object.keys(scheduleAdapterCache).length} Instanzen)`, "info");
                    
                        } catch (e) {
                            log("Adapter-Monitor: Preload-Fehler im System: " + e, "warn");
                            isCacheReady = true;
                        }
                    }
                    
                    preloadScheduleAdapters();
                    
                    // ======================================================
                    // GC (Garbage Collector für die Historie)
                    // ======================================================
                    
                    setInterval(() => {
                        const now = Date.now();
                    
                        for (const group of [
                            monitorState.lastAlertOffline,
                            monitorState.lastAlertOnline,
                            monitorState.lastAlertYellow
                        ]) {
                            for (const k in group) {
                                if (now - group[k] > HISTORY_RETENTION) {
                                    delete group[k];
                                }
                            }
                        }
                    }, 15 * 60 * 1000);
                    // ======================================================
                    // HELPERS
                    // ======================================================
                    
                    function clearMonitorTimeout(obj, key) {
                        if (obj[key]) {
                            clearTimeout(obj[key]);
                            delete obj[key];
                        }
                    }
                    
                    function triggerYellowAlert(inst) {
                        const now = Date.now();
                        if (now - (monitorState.lastAlertYellow[inst] || 0) < ALERT_SUPPRESSION) return;
                    
                        sendTelegram(
                    `⚠️ *ioBroker Status-Warnung* ⚠️
                    ───────────────────
                    • *Adapter:* \`${inst}\`
                    • *Status:* \`keine Verbindung (Gelb)\`
                    • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                    ───────────────────
                    🔌 _Der Prozess läuft, aber die Verbindung zum Gerät oder Cloud-Dienst ist gestört!_`
                        );
                    
                        monitorState.lastAlertYellow[inst] = now;
                        log("Adapter-Zustand: " + inst + " hat keine Verbindung (Gelb)", "info");
                    }
                    
                    function isScheduleAdapter(inst) {
                        if (scheduleAdapterCache[inst] === undefined) {
                            const configObj = getObject("system.adapter." + inst);
                    
                            scheduleAdapterCache[inst] =
                                configObj &&
                                configObj.common &&
                                configObj.common.mode === "schedule";
                        }
                    
                        return scheduleAdapterCache[inst] === true;
                    }
                    
                    function safeGetState(id) {
                        try {
                            return getState(id) || null;
                        } catch (e) {
                            return null;
                        }
                    }
                    
                    function sendTelegram(text) {
                        const telegramOptions = {
                            text: text,
                            parse_mode: "Markdown"
                        };
                        
                        // Nur filtern, wenn ein spezifischer Benutzername oben eingetragen wurde
                        if (TELEGRAM_USER && TELEGRAM_USER.trim() !== "") {
                            telegramOptions.user = TELEGRAM_USER;
                        }
                    
                        sendTo(TELEGRAM_INSTANCE, telegramOptions);
                    }
                    
                    // ======================================================
                    // MAIN HANDLER (Live-Event-Überwachung)
                    // ======================================================
                    
                    on({ id: /^system\.adapter\..*\.(alive|connection)$/, change: "ne" }, handleAdapterChange);
                    on({ id: /^([a-zA-Z0-9._\-]+)\.\d+\.info\.connection$/, change: "ne" }, handleAdapterChange);
                    
                    function handleAdapterChange(obj) {
                    
                        if (!isCacheReady) return;
                        if (!obj?.state || !obj?.oldState) return;
                        if (typeof obj.state.val !== "boolean") return;
                    
                        const status = obj.state.val;
                        const previous = obj.oldState.val;
                        let inst = "";
                        let type = "";
                    
                        if (obj.id.startsWith("system.adapter.")) {
                            const match = obj.id.match(/^system\.adapter\.([a-zA-Z0-9._\-]+)\.(alive|connection)$/);
                            if (!match) return;
                            inst = match[1];
                            type = match[2];
                        } else {
                            const match = obj.id.match(/^(([a-zA-Z0-9._\-]+)\.\d+)\.info\.connection$/);
                            if (!match) return;
                            inst = match[1];
                            type = "connection";
                        }
                    
                        if (ignorePrefixes.some(p => inst.startsWith(p))) return;
                    
                        // ==================================================
                        // 🔴 CRASH (Prozess offline)
                        // ==================================================
                        if (type === "alive" && status === false && previous === true) {
                    
                            clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                            clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                            clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                    
                            monitorState.timeoutsAbsturz[inst] = setTimeout(() => {
                                delete monitorState.timeoutsAbsturz[inst];
                                if (isScheduleAdapter(inst)) return;
                    
                                const alive = safeGetState("system.adapter." + inst + ".alive");
                                if (!alive || alive.val !== false) return;
                    
                                const now = Date.now();
                                if (now - (monitorState.lastAlertOffline[inst] || 0) < ALERT_SUPPRESSION) return;
                    
                                sendTelegram(
                    `🚨 *ioBroker System-Warnung* 🚨
                    ───────────────────
                    • *Adapter:* \`${inst}\`
                    • *Status:* \`offline (Prozess tot)\`
                    • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                    ───────────────────
                    ⚠️ _Der Instanz-Prozess ist unerwartet abgestürzt oder wurde gestoppt!_`
                                );
                    
                                monitorState.lastAlertOffline[inst] = now;
                                log("Adapter-Zustand: " + inst + " ist offline (Rot)", "info"); 
                    
                            }, DELAY_OFFLINE);
                        }
                    
                        // ==================================================
                        // 🟡 CONNECTION LOSS (Verbindungsverlust)
                        // ==================================================
                        else if (type === "connection" && status === false && previous === true) {
                    
                            clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                            clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                            clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                    
                            monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                delete monitorState.timeoutsVerbindung[inst];
                    
                                const alive = safeGetState("system.adapter." + inst + ".alive");
                                if (!alive || alive.val !== true) return;
                                
                                const sysConnId = "system.adapter." + inst + ".connection";
                                const infoConnId = inst + ".info.connection";
                                
                                const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                
                                if ((sysConn && sysConn.val === true) && (!infoConn || infoConn.val === true)) return;
                    
                                triggerYellowAlert(inst);
                    
                            }, DELAY_CONNECTION);
                        }
                    
                        // ==================================================
                        // 🟢 RECOVERY / START LOGIK (Entwarnung)
                        // ==================================================
                        else if ((type === "alive" || type === "connection") && status === true && previous === false) {
                    
                            clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                            clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                            clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                    
                            monitorState.timeoutsWiederstart[inst] = setTimeout(() => {
                                delete monitorState.timeoutsWiederstart[inst];
                    
                                const alive = safeGetState("system.adapter." + inst + ".alive");
                                if (!alive || alive.val !== true) return;
                    
                                const sysConnId = "system.adapter." + inst + ".connection";
                                const infoConnId = inst + ".info.connection";
                    
                                const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                    
                                if ((sysConn && sysConn.val === false) || (infoConn && infoConn.val === false)) {
                                    
                                    if (!monitorState.timeoutsVerbindung[inst]) {
                                        monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                            delete monitorState.timeoutsVerbindung[inst];
                                            
                                            const currentAlive = safeGetState("system.adapter." + inst + ".alive");
                                            const currentSys = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                            const currentInfo = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                            
                                            if (currentAlive && currentAlive.val === true) {
                                                if ((currentSys && currentSys.val === false) || (currentInfo && currentInfo.val === false)) {
                                                    triggerYellowAlert(inst);
                                                }
                                            }
                                        }, DELAY_CONNECTION);
                                    }
                                    return;
                                }
                    
                                if (isScheduleAdapter(inst)) return;
                    
                                const hadOffline = monitorState.lastAlertOffline[inst];
                                const hadYellow  = monitorState.lastAlertYellow[inst];
                    
                                if (hadOffline === undefined && hadYellow === undefined) return;
                    
                                const now = Date.now();
                                if (now - (monitorState.lastAlertOnline[inst] || 0) < ONLINE_SUPPRESSION) return;
                    
                                delete monitorState.lastAlertOffline[inst];
                                delete monitorState.lastAlertYellow[inst];
                    
                                sendTelegram(
                    `✅ *ioBroker Entwarnung* ✅
                    ───────────────────
                    • *Adapter:* \`${inst}\`
                    • *Status:* \`online (Grün)\`
                    • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                    ───────────────────
                    👍 _Die Instanz läuft wieder vollständig stabil._`
                                );
                    
                                monitorState.lastAlertOnline[inst] = now;
                                log("Adapter-Zustand: " + inst + " ist wieder stabil online (Grün)", "debug"); 
                    
                                clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                                clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                    
                            }, DELAY_ONLINE);
                        }
                    }
                    

                    Gruß Michael

                    Edit: das soll für alle Adapter funktionieren
                    Email Stopp und Start
                    email.jpg

                    Linuxcontrol Stopp und Start
                    linuscontrol.jpg

                    J Offline
                    J Offline
                    jrudolph
                    schrieb am zuletzt editiert von
                    #152

                    @Michael-Schmitt Danke für das Script.

                    Gut dass man Adapter bzw. Instanzen ausschließen kann. Mein deyeidc verbindet sich regelmäßig neu.

                    In den Zeilen 159, 174, 236 und 262 ist meines Erachtens ein Fehler drin.

                    //on({ id: /^system\.adapter\..*\.(alive|connection)$/, change: "ne" }, handleAdapterChange);
                    on({ id: /^system\.adapter\..*\.(alive|connected)$/, change: "ne" }, handleAdapterChange);
                    

                    In system.adapter heißen die Connection States nicht connection sondern connected. Da hat die KI eigentlich logisch richtig gedacht, aber es ist leider nicht einheitlich. In system heißt es connected, in den Adaptern selbst heißt es üblicherweise connection. Manche Adapter weichen selbst davon ab (z.B. Enigma2).

                    Gruß,
                    Jürgen

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

                      Hi,
                      hab den oberen Post editiert und das Javascript nochmal ändern lassen.

                      // ======================================================
                      // 1. KONFIGURATION (Hier alle Einstellungen vornehmen)
                      // ======================================================
                      
                      // Hier die gewünschte Telegram-Instanz eintragen (Standard: "telegram.0")
                      const TELEGRAM_INSTANCE = "telegram.0";
                      
                      // Hier den exakten Telegram-Benutzernamen eintragen, der die Nachrichten erhalten soll.
                      // WICHTIG: Soll die Nachricht an ALLE angemeldeten Geräte oder Gruppen gesendet werden,
                      // trage hier einfach zwei doppelte Anführungszeichen "" ein (komplett leer lassen).
                      const TELEGRAM_USER = "HierEuerenUserRein";
                      
                      // Liste von Adaptern, die komplett von der Überwachung ausgenommen werden sollen.
                      // Der Filter prüft auf den Anfang des Instanznamens (Prefix).
                      // BEISPIELE für die Nutzung:
                      // const ignorePrefixes = ["ping.", "fb-checkpresence."]; -> Ignoriert alle Ping- und Fritzbox-Instanzen
                      // const ignorePrefixes = ["alexa2.0"]; -> Ignoriert gezielt nur die erste Alexa-Instanz
                      const ignorePrefixes = [];
                      
                      // Einstellbare Timer-Verzögerungen (Timeouts in Millisekunden)
                      const DELAY_OFFLINE = 30 * 1000;      // Wartezeit vor einem Rot-Alarm (Prozess offline)
                      const DELAY_CONNECTION = 30 * 1000;   // Wartezeit vor einem Gelb-Alarm (Verbindungsverlust)
                      const DELAY_ONLINE = 30 * 1000;       // Stabilisierungszeit vor einem Grün-Alarm (Entwarnung)
                      
                      // Alarm-Sperrzeiten (Flap-Guard / Flatterschutz)
                      const ALERT_SUPPRESSION = 90 * 1000;  // Mindestabstand zwischen zwei Fehlermeldungen desselben Adapters
                      const ONLINE_SUPPRESSION = 5 * 60 * 1000; // Mindestabstand zwischen zwei Entwarnungen desselben Adapters
                      
                      // Aufbewahrungszeit der Alarm-Historie im RAM-Speicher (1 Stunde)
                      const HISTORY_RETENTION = 60 * 60 * 1000;
                      
                      // ======================================================
                      // 2. SPEICHER & CACHE
                      // ======================================================
                      
                      const monitorState = {
                          timeoutsAbsturz: {},
                          timeoutsWiederstart: {},
                          timeoutsVerbindung: {},
                          lastAlertOffline: {},
                          lastAlertOnline: {},
                          lastAlertYellow: {}
                      };
                      
                      const scheduleAdapterCache = {};
                      let isCacheReady = false;
                      
                      // ======================================================
                      // PRELOADER (Sicherer RAM-Preload über den State-Selektor)
                      // ======================================================
                      
                      function preloadScheduleAdapters() {
                          try {
                              // Findet alle echten Instanzen über deren systemweiten .alive-Datenpunkt
                              const aliveStates = $('system.adapter.*.*.alive');
                              
                              aliveStates.each((id) => {
                                  const inst = id.replace("system.adapter.", "").replace(".alive", "");
                                  const configObj = getObject("system.adapter." + inst);
                                  
                                  if (configObj) {
                                      scheduleAdapterCache[inst] = configObj.common?.mode === "schedule";
                                  }
                              });
                      
                              isCacheReady = true;
                              log(`Adapter-Monitor: Cache erfolgreich geladen (${Object.keys(scheduleAdapterCache).length} Instanzen)`, "info");
                      
                          } catch (e) {
                              log("Adapter-Monitor: Preload-Fehler im System: " + e, "warn");
                              isCacheReady = true;
                          }
                      }
                      
                      preloadScheduleAdapters();
                      
                      // ======================================================
                      // GC (Garbage Collector für die Historie)
                      // ======================================================
                      
                      setInterval(() => {
                          const now = Date.now();
                      
                          for (const group of [
                              monitorState.lastAlertOffline,
                              monitorState.lastAlertOnline,
                              monitorState.lastAlertYellow
                          ]) {
                              for (const k in group) {
                                  if (now - group[k] > HISTORY_RETENTION) {
                                      delete group[k];
                                  }
                              }
                          }
                      }, 15 * 60 * 1000);
                      // ======================================================
                      // HELPERS
                      // ======================================================
                      
                      function clearMonitorTimeout(obj, key) {
                          if (obj[key]) {
                              clearTimeout(obj[key]);
                              delete obj[key];
                          }
                      }
                      
                      function triggerYellowAlert(inst) {
                          const now = Date.now();
                          if (now - (monitorState.lastAlertYellow[inst] || 0) < ALERT_SUPPRESSION) return;
                      
                          sendTelegram(
                      `⚠️ *ioBroker Status-Warnung* ⚠️
                      ───────────────────
                      • *Adapter:* \`${inst}\`
                      • *Status:* \`keine Verbindung (Gelb)\`
                      • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                      ───────────────────
                      🔌 _Der Prozess läuft, aber die Verbindung zum Gerät oder Cloud-Dienst ist gestört!_`
                          );
                      
                          monitorState.lastAlertYellow[inst] = now;
                          log("Adapter-Zustand: " + inst + " hat keine Verbindung (Gelb)", "info");
                      }
                      
                      function isScheduleAdapter(inst) {
                          if (scheduleAdapterCache[inst] === undefined) {
                              const configObj = getObject("system.adapter." + inst);
                      
                              scheduleAdapterCache[inst] =
                                  configObj &&
                                  configObj.common &&
                                  configObj.common.mode === "schedule";
                          }
                      
                          return scheduleAdapterCache[inst] === true;
                      }
                      
                      function safeGetState(id) {
                          try {
                              return getState(id) || null;
                          } catch (e) {
                              return null;
                          }
                      }
                      
                      function sendTelegram(text) {
                          const telegramOptions = {
                              text: text,
                              parse_mode: "Markdown"
                          };
                          
                          // Nur filtern, wenn ein spezifischer Benutzername oben eingetragen wurde
                          if (TELEGRAM_USER && TELEGRAM_USER.trim() !== "") {
                              telegramOptions.user = TELEGRAM_USER;
                          }
                      
                          sendTo(TELEGRAM_INSTANCE, telegramOptions);
                      }
                      
                      // ======================================================
                      // MAIN HANDLER (Live-Event-Überwachung)
                      // ======================================================
                      
                      on({ id: /^system\.adapter\..*\.(alive|connection)$/, change: "ne" }, handleAdapterChange);
                      on({ id: /^([a-zA-Z0-9._\-]+)\.\d+\.info\.connection$/, change: "ne" }, handleAdapterChange);
                      
                      function handleAdapterChange(obj) {
                      
                          if (!isCacheReady) return;
                          if (!obj?.state || !obj?.oldState) return;
                          if (typeof obj.state.val !== "boolean") return;
                      
                          const status = obj.state.val;
                          const previous = obj.oldState.val;
                          let inst = "";
                          let type = "";
                      
                          if (obj.id.startsWith("system.adapter.")) {
                              const match = obj.id.match(/^system\.adapter\.([a-zA-Z0-9._\-]+)\.(alive|connection)$/);
                              if (!match) return;
                              inst = match[1];
                              type = match[2];
                          } else {
                              const match = obj.id.match(/^(([a-zA-Z0-9._\-]+)\.\d+)\.info\.connection$/);
                              if (!match) return;
                              inst = match[1];
                              type = "connection";
                          }
                      
                          if (ignorePrefixes.some(p => inst.startsWith(p))) return;
                      
                          // ==================================================
                          // 🔴 CRASH (Prozess offline)
                          // ==================================================
                          if (type === "alive" && status === false && previous === true) {
                      
                              clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                              clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                              clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                      
                              monitorState.timeoutsAbsturz[inst] = setTimeout(() => {
                                  delete monitorState.timeoutsAbsturz[inst];
                                  if (isScheduleAdapter(inst)) return;
                      
                                  const alive = safeGetState("system.adapter." + inst + ".alive");
                                  if (!alive || alive.val !== false) return;
                      
                                  const now = Date.now();
                                  if (now - (monitorState.lastAlertOffline[inst] || 0) < ALERT_SUPPRESSION) return;
                      
                                  sendTelegram(
                      `🚨 *ioBroker System-Warnung* 🚨
                      ───────────────────
                      • *Adapter:* \`${inst}\`
                      • *Status:* \`offline (Prozess tot)\`
                      • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                      ───────────────────
                      ⚠️ _Der Instanz-Prozess ist unerwartet abgestürzt oder wurde gestoppt!_`
                                  );
                      
                                  monitorState.lastAlertOffline[inst] = now;
                                  log("Adapter-Zustand: " + inst + " ist offline (Rot)", "info"); 
                      
                              }, DELAY_OFFLINE);
                          }
                      
                          // ==================================================
                          // 🟡 CONNECTION LOSS (Verbindungsverlust)
                          // ==================================================
                          else if (type === "connection" && status === false && previous === true) {
                      
                              clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                              clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                              clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                      
                              monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                  delete monitorState.timeoutsVerbindung[inst];
                      
                                  const alive = safeGetState("system.adapter." + inst + ".alive");
                                  if (!alive || alive.val !== true) return;
                                  
                                  const sysConnId = "system.adapter." + inst + ".connection";
                                  const infoConnId = inst + ".info.connection";
                                  
                                  const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                  const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                  
                                  if ((sysConn && sysConn.val === true) && (!infoConn || infoConn.val === true)) return;
                      
                                  triggerYellowAlert(inst);
                      
                              }, DELAY_CONNECTION);
                          }
                      
                          // ==================================================
                          // 🟢 RECOVERY / START LOGIK (Entwarnung)
                          // ==================================================
                          else if ((type === "alive" || type === "connection") && status === true && previous === false) {
                      
                              clearMonitorTimeout(monitorState.timeoutsWiederstart, inst);
                              clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                              clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                      
                              monitorState.timeoutsWiederstart[inst] = setTimeout(() => {
                                  delete monitorState.timeoutsWiederstart[inst];
                      
                                  const alive = safeGetState("system.adapter." + inst + ".alive");
                                  if (!alive || alive.val !== true) return;
                      
                                  const sysConnId = "system.adapter." + inst + ".connection";
                                  const infoConnId = inst + ".info.connection";
                      
                                  const sysConn = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                  const infoConn = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                      
                                  if ((sysConn && sysConn.val === false) || (infoConn && infoConn.val === false)) {
                                      
                                      if (!monitorState.timeoutsVerbindung[inst]) {
                                          monitorState.timeoutsVerbindung[inst] = setTimeout(() => {
                                              delete monitorState.timeoutsVerbindung[inst];
                                              
                                              const currentAlive = safeGetState("system.adapter." + inst + ".alive");
                                              const currentSys = existsState(sysConnId) ? safeGetState(sysConnId) : null;
                                              const currentInfo = existsState(infoConnId) ? safeGetState(infoConnId) : null;
                                              
                                              if (currentAlive && currentAlive.val === true) {
                                                  if ((currentSys && currentSys.val === false) || (currentInfo && currentInfo.val === false)) {
                                                      triggerYellowAlert(inst);
                                                  }
                                              }
                                          }, DELAY_CONNECTION);
                                      }
                                      return;
                                  }
                      
                                  if (isScheduleAdapter(inst)) return;
                      
                                  const hadOffline = monitorState.lastAlertOffline[inst];
                                  const hadYellow  = monitorState.lastAlertYellow[inst];
                      
                                  if (hadOffline === undefined && hadYellow === undefined) return;
                      
                                  const now = Date.now();
                                  if (now - (monitorState.lastAlertOnline[inst] || 0) < ONLINE_SUPPRESSION) return;
                      
                                  delete monitorState.lastAlertOffline[inst];
                                  delete monitorState.lastAlertYellow[inst];
                      
                                  sendTelegram(
                      `✅ *ioBroker Entwarnung* ✅
                      ───────────────────
                      • *Adapter:* \`${inst}\`
                      • *Status:* \`online (Grün)\`
                      • *Zeit:* ${formatDate(new Date(), "hh:mm")} Uhr
                      ───────────────────
                      👍 _Die Instanz läuft wieder vollständig stabil._`
                                  );
                      
                                  monitorState.lastAlertOnline[inst] = now;
                                  log("Adapter-Zustand: " + inst + " ist wieder stabil online (Grün)", "debug"); 
                      
                                  clearMonitorTimeout(monitorState.timeoutsAbsturz, inst);
                                  clearMonitorTimeout(monitorState.timeoutsVerbindung, inst);
                      
                              }, DELAY_ONLINE);
                          }
                      }
                      
                      1 Antwort Letzte Antwort
                      0
                      • R Offline
                        R Offline
                        RISSN
                        schrieb am zuletzt editiert von RISSN
                        #154

                        ich korrigiere mich, nach tatsächlich ein paar Tagen, ist der Adapter wieder gelb geworden und lief nicht mehr, also zu früh gefreut

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

                          @bluefox gibt es zu dem Thema Alexa2 + cookie schon etwas neues ?

                          1 Antwort Letzte Antwort
                          1
                          • C Nicht stören
                            C Nicht stören
                            com27
                            schrieb am zuletzt editiert von
                            #156

                            Würde mich auch Interessieren, da ich sehr viele Meldungen über Alexa Sprachausgabe schicke. Müsste sonst wechseln zu Home Assistant.

                            Dr. BakteriusD 1 Antwort Letzte Antwort
                            0
                            • C com27

                              Würde mich auch Interessieren, da ich sehr viele Meldungen über Alexa Sprachausgabe schicke. Müsste sonst wechseln zu Home Assistant.

                              Dr. BakteriusD Offline
                              Dr. BakteriusD Offline
                              Dr. Bakterius
                              Most Active
                              schrieb am zuletzt editiert von
                              #157

                              @com27 sagte:

                              Müsste sonst wechseln zu Home Assistant.

                              Da bleibt die Verbindung zu Amazon aufrecht? Und ich glaube, @apollon77 ist für Nachfragen der richtige Ansprechpartner. Er arbeitet sicher bereits an einer Lösung...

                              Samson71S 1 Antwort Letzte Antwort
                              0
                              • Dr. BakteriusD Dr. Bakterius

                                @com27 sagte:

                                Müsste sonst wechseln zu Home Assistant.

                                Da bleibt die Verbindung zu Amazon aufrecht? Und ich glaube, @apollon77 ist für Nachfragen der richtige Ansprechpartner. Er arbeitet sicher bereits an einer Lösung...

                                Samson71S Offline
                                Samson71S Offline
                                Samson71
                                schrieb am zuletzt editiert von
                                #158

                                @Dr.-Bakterius sagte:
                                Da bleibt die Verbindung zu Amazon aufrecht?

                                Tut sie, zumindest wenn man die offizielle Nabu Casa Integration nutzt. Wie das bei den DIY-/Selfhost-Lösungen aussieht weis ich natürlich nicht.

                                Markus

                                Bitte beachten:
                                Hinweise für gute Forenbeiträge
                                Maßnahmen zum Schutz des Forums

                                1 Antwort Letzte Antwort
                                0
                                • M Offline
                                  M Offline
                                  mayer
                                  schrieb am zuletzt editiert von mayer
                                  #159

                                  Ich habe im Issue 1376 den Lösungsansatz und die notwendigen Codeänderungen, welche mir die KI die ich selber zum programmieren nutze ausgespuckt hat, ergänzt. Vielleicht hilft es ja: Cookie refresh scheint nicht mehr zu funktionieren #1376

                                  M Dr. BakteriusD 2 Antworten Letzte Antwort
                                  0
                                  • da_WoodyD Online
                                    da_WoodyD Online
                                    da_Woody
                                    Most Active
                                    schrieb am zuletzt editiert von
                                    #160

                                    mädelz, hört auf mit jammern. das problem ist im moment da. thats it. musste mich auch gerade neu anmelden.
                                    es wird daran gewerkelt, wait n c...

                                    gruß vom Woody
                                    HAPPINESS is not a DESTINATION, it's a WAY of LIFE!

                                    1 Antwort Letzte Antwort
                                    1
                                    • M mayer

                                      Ich habe im Issue 1376 den Lösungsansatz und die notwendigen Codeänderungen, welche mir die KI die ich selber zum programmieren nutze ausgespuckt hat, ergänzt. Vielleicht hilft es ja: Cookie refresh scheint nicht mehr zu funktionieren #1376

                                      M Offline
                                      M Offline
                                      mayer
                                      schrieb am zuletzt editiert von
                                      #161

                                      Das Problem gibt es schon seit über 3 Wochen und keiner jammert sondern wartet auf eine Lösung. Bis jetzt wurde nur an den Symptomen gebastelt, aber nicht an der Ursache. Kann ja sein, dass eine funktionierende Sprachausgabe über Alexa nicht wichtig ist für Sie. Für mich ist es wichtig und wenn es keine Lösung gibt, fixe ich mir den Adapter für mich eben selber.

                                      Ro75R 1 Antwort Letzte Antwort
                                      -1
                                      • M mayer

                                        Das Problem gibt es schon seit über 3 Wochen und keiner jammert sondern wartet auf eine Lösung. Bis jetzt wurde nur an den Symptomen gebastelt, aber nicht an der Ursache. Kann ja sein, dass eine funktionierende Sprachausgabe über Alexa nicht wichtig ist für Sie. Für mich ist es wichtig und wenn es keine Lösung gibt, fixe ich mir den Adapter für mich eben selber.

                                        Ro75R Offline
                                        Ro75R Offline
                                        Ro75
                                        schrieb am zuletzt editiert von
                                        #162

                                        @mayer sagte:

                                        aber nicht an der Ursache.

                                        Es tut mir leid, aber die Ursache ist Amazon. Und ja, es ist gerade schwer, aber wenn du Lösungen schaffen kannst, dann mache es – davon können wir hier leben.

                                        Kleiner Hinweis: Auch ich habe mich mit dem Thema Login, Cookies, Erneuerung usw. beschäftigt. Aber ganz so trivial ist es nicht.

                                        Ro75.

                                        SERVER = Beelink U59 16GB DDR4 RAM 512GB SSD, FB 7490, FritzDect 200+301+440, ConBee II, Zigbee Aqara Sensoren + NOUS A1Z, NOUS A1T, Philips Hue ** ioBroker, REDIS, influxdb2, Grafana, PiHole, Plex-Mediaserver, paperless-ngx (Docker), MariaDB + phpmyadmin *** VIS-Runtime = Intel NUC 8GB RAM 128GB SSD + 24" Touchscreen

                                        1 Antwort Letzte Antwort
                                        0
                                        • M mayer

                                          Ich habe im Issue 1376 den Lösungsansatz und die notwendigen Codeänderungen, welche mir die KI die ich selber zum programmieren nutze ausgespuckt hat, ergänzt. Vielleicht hilft es ja: Cookie refresh scheint nicht mehr zu funktionieren #1376

                                          Dr. BakteriusD Offline
                                          Dr. BakteriusD Offline
                                          Dr. Bakterius
                                          Most Active
                                          schrieb am zuletzt editiert von
                                          #163

                                          @mayer sagte:

                                          Vielleicht hilft es ja

                                          Bei mir klappt das leider nicht. Habe es 2x versucht. Ich erhalte:

                                          2026-06-29 14:50:22.137 - error: alexa2.0 (327852) uncaught exception: minCookieRefreshAge is not defined
                                          2026-06-29 14:50:22.138 - error: alexa2.0 (327852) ReferenceError: minCookieRefreshAge is not defined
                                          at getCookie (/opt/iobroker/node_modules/alexa-remote2/alexa-remote.js:231:60)
                                          at AlexaRemote.init (/opt/iobroker/node_modules/alexa-remote2/alexa-remote.js:253:9)
                                          at main (/opt/iobroker/node_modules/iobroker.alexa2/main.js:5115:11)
                                          at Immediate. (/opt/iobroker/node_modules/iobroker.alexa2/main.js:629:9)
                                          at processImmediate (node:internal/timers:506:21)
                                          2026-06-29 14:50:22.138 - error: alexa2.0 (327852) minCookieRefreshAge is not defined
                                          2026-06-29 14:50:22.150 - info: alexa2.0 (327852) terminating
                                          2026-06-29 14:50:22.150 - warn: alexa2.0 (327852) Terminated (UNCAUGHT_EXCEPTION): Without reason
                                          2026-06-29 14:50:22.651 - info: alexa2.0 (327852) terminating
                                          2026-06-29 14:50:22.652 - info: alexa2.0 (327852) terminating
                                          2026-06-29 14:50:22.719 - error: host.iobroker instance system.adapter.alexa2.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
                                          2026-06-29 14:50:54.294 - error: alexa2.0 (327995) adapter disabled
                                          2026-06-29 14:50:54.339 - warn: alexa2.0 (327995) Terminated (NO_ADAPTER_CONFIG_FOUND): Without reason
                                          2026-06-29 14:50:54.880 - error: host.iobroker instance system.adapter.alexa2.0 terminated with code 3 (NO_ADAPTER_CONFIG_FOUND)
                                          
                                          M 1 Antwort Letzte Antwort
                                          0

                                          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

                                          277

                                          Online

                                          33.0k

                                          Benutzer

                                          83.3k

                                          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