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
    933

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

  • 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.5k 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.
  • DuffyD Offline
    DuffyD Offline
    Duffy
    schrieb am zuletzt editiert von
    #134

    @ro75 kurze Anmerkung meinerseits. Um die Funktion des importierten Blocklys zu testen habe ich den Adapter neu gestartet.
    Ich weis natürlich noch nicht wie es aussieht wenn er gelb wird / ist. (Hatte das bisher auch noch nicht beobachtet hatte das eben erst dazu gelernt :-) )

    Nix besonderes; iob auf Respberry pi 4 (8GB) mit 32 GB SSD
    Node.js: v22.23.1
    NPM: 10.9.4
    js-controller 7.1.2
    Linux: Trixie

    1 Antwort Letzte Antwort
    0
    • Ro75R Ro75

      @Negalein sagte:

      Datenpunkt „alexa2.0 alive

      Frage an dich. Selbst wenn der Adapter (aber auch irgendein anderer Adapter) auf gelb geht, ist bei mir dieser Datenpunkt immer noch true. Bei dir false?

      Ro75.

      NegaleinN Offline
      NegaleinN Offline
      Negalein
      schrieb am zuletzt editiert von
      #135

      @Ro75 sagte:

      Bei dir false?

      ja

      mit Gelb muss ich noch auf den nächsten ausfall warten.

      ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
      ° Node.js Fixer ---> iob nodejs-update
      ° Fixer ---> iob fix

      1 Antwort Letzte Antwort
      0
      • amg_666A Offline
        amg_666A Offline
        amg_666
        schrieb am zuletzt editiert von
        #136

        @Negalein Adapter "gelb" heisst doch, dass der Adapter "live" ist, aber noch keine Clients oder Webdienste angebunden sind. Wäre es da beim Alexa Adapter nicht sinnvoller auf

        alexa2.0.info.connection
        

        zu prüfen? Der ist auch bei "gelbem" Adapter false und das "Alexa Problem" in diesem Thread führt bei mir immer zu gelbem Adapter, nicht zu einem roten.

        iobroker auf proxmox container

        NegaleinN 1 Antwort Letzte Antwort
        0
        • amg_666A amg_666

          @Negalein Adapter "gelb" heisst doch, dass der Adapter "live" ist, aber noch keine Clients oder Webdienste angebunden sind. Wäre es da beim Alexa Adapter nicht sinnvoller auf

          alexa2.0.info.connection
          

          zu prüfen? Der ist auch bei "gelbem" Adapter false und das "Alexa Problem" in diesem Thread führt bei mir immer zu gelbem Adapter, nicht zu einem roten.

          NegaleinN Offline
          NegaleinN Offline
          Negalein
          schrieb am zuletzt editiert von
          #137

          @amg_666 sagte:

          alexa2.0.info.connection

          ah, stimmt.
          Das kommt davon, wenn man schnell Blöcke kopiert und nicht weiter überlegt.

          ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
          ° Node.js Fixer ---> iob nodejs-update
          ° Fixer ---> iob fix

          1 Antwort Letzte Antwort
          0
          • amg_666A Offline
            amg_666A Offline
            amg_666
            schrieb am zuletzt editiert von
            #138

            ist ja auch viel zu heiß um noch groß zu überlegen 😊

            iobroker auf proxmox container

            1 Antwort Letzte Antwort
            0
            • DuffyD Offline
              DuffyD Offline
              Duffy
              schrieb am zuletzt editiert von
              #139

              @amg_666

              meinst du den Datenpunkt?

              e851cb4a-ee9e-4ec9-bb0c-66855e225300-image.jpeg

              alexa2.0.info.connection
              

              finde ich keinen.

              Euch einen schönen Abend.

              Duffy

              Nix besonderes; iob auf Respberry pi 4 (8GB) mit 32 GB SSD
              Node.js: v22.23.1
              NPM: 10.9.4
              js-controller 7.1.2
              Linux: Trixie

              Thomas BraunT NegaleinN 2 Antworten Letzte Antwort
              0
              • DuffyD Duffy

                @amg_666

                meinst du den Datenpunkt?

                e851cb4a-ee9e-4ec9-bb0c-66855e225300-image.jpeg

                alexa2.0.info.connection
                

                finde ich keinen.

                Euch einen schönen Abend.

                Duffy

                Thomas BraunT Online
                Thomas BraunT Online
                Thomas Braun
                Most Active
                schrieb am zuletzt editiert von
                #140

                @Duffy

                alexa2.0.info.connection

                ist der Datenpunkt.

                Linux-Werkzeugkasten:
                https://forum.iobroker.net/topic/42952/der-kleine-iobroker-linux-werkzeugkasten
                NodeJS Fixer Skript:
                https://forum.iobroker.net/topic/68035/iob-node-fix-skript
                iob_diag: curl -sLf -o diag.sh https://iobroker.net/diag.sh && bash diag.sh

                1 Antwort Letzte Antwort
                1
                • DuffyD Duffy

                  @amg_666

                  meinst du den Datenpunkt?

                  e851cb4a-ee9e-4ec9-bb0c-66855e225300-image.jpeg

                  alexa2.0.info.connection
                  

                  finde ich keinen.

                  Euch einen schönen Abend.

                  Duffy

                  NegaleinN Offline
                  NegaleinN Offline
                  Negalein
                  schrieb am zuletzt editiert von
                  #141

                  @Duffy sagte:

                  finde ich keinen.

                  efaa7f01-6155-4b66-b4e1-b7bbd92a4bb8-image.jpeg

                  ° Node.js & System Update ---> sudo apt update, iob stop, sudo apt full-upgrade
                  ° Node.js Fixer ---> iob nodejs-update
                  ° Fixer ---> iob fix

                  1 Antwort Letzte Antwort
                  1
                  • DuffyD Offline
                    DuffyD Offline
                    Duffy
                    schrieb am zuletzt editiert von
                    #142

                    Danke habe den Datenpunkt gefunden und eingepflegt.

                    Wäre trotzdem schön wenn morgen nicht gleich schon eine Meldung auf Telegram da wäre ;-)

                    VG Duffy

                    Nix besonderes; iob auf Respberry pi 4 (8GB) mit 32 GB SSD
                    Node.js: v22.23.1
                    NPM: 10.9.4
                    js-controller 7.1.2
                    Linux: Trixie

                    1 Antwort Letzte Antwort
                    0
                    • Michael SchmittM Offline
                      Michael SchmittM Offline
                      Michael Schmitt
                      schrieb am zuletzt editiert von Michael Schmitt
                      #143

                      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 1 Antwort Letzte Antwort
                      1
                      • andiko2A Online
                        andiko2A Online
                        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 Offline
                            Michael SchmittM Offline
                            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 Offline
                              Michael SchmittM Offline
                              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 Online
                                  R Online
                                  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 Offline
                                          Michael SchmittM Offline
                                          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

                                          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

                                          377

                                          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