NEWS
[gelöst] Schwierigkeiten mit alexa-Adapter
-
Guten Morgen Freunede des IOB,
hat einer der Experten eine Idee ob und wenn ja wie man sich über Telegram eine Meldung schicken lassen kann wenn der Alexa Adapter wieder gelb wurde?
Es schein ja hier keine schnelle Lösung zu geben und so hätte man wenigstens die Meldung das man den Adapter neu verbinden muss bevor einem vielleicht wichtige Meldungen durch gehen.
VG Duffy
-
Danke, das sieht kompliziert aus mit dem Datenpunkt „alexa2.0 alive =".
Woher bekomme ich den Datenpunkt „alexa2.0 alive =„?Aber ja, so war es gemeint.
Viele Grüße duffy
Danke, das sieht kompliziert aus mit dem Datenpunkt „alexa2.0 alive =".
importier dir das als Blockly
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="WE+VJp5#;[c.pS.Y8L5|" x="2713" y="-87"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="u6%B-.^[ajqADl)$zNCN"> <field name="oid">system.adapter.alexa2.0.alive</field> </shadow> </value> <value name="OID1"> <shadow type="field_oid" id=",)T`%UBZv`0FkgN((mek"> <field name="oid">system.adapter.alexa2.1.alive</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="fK)Ve3xi.3[Pe9(EN?7x"> <value name="IF0"> <block type="logic_multi_or" id="3GPfPQ;xZ|{#,ROMEi9E"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <value name="OR0"> <block type="logic_compare" id="6V$|WQ#GOk3~h[vJ}0`5"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id=".{w{p;.o{ckDT33D-v,?"> <field name="ATTR">val</field> <field name="OID">system.adapter.alexa2.0.alive</field> </block> </value> <value name="B"> <block type="logic_boolean" id="[U[vhH8X}Hs=AcULKEl["> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="OR1"> <block type="logic_compare" id="1r`iu7=4FMwTK3Tr6ij^"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="!hC(Z`mYn{62{z3R3;Zp"> <field name="ATTR">val</field> <field name="OID">system.adapter.alexa2.1.alive</field> </block> </value> <value name="B"> <block type="logic_boolean" id="~Ko/bj)(0ED`vK~*wP/}"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="7+7su45k7v/^^dj%qz7!"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">lgtv.0.states.popup</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="PuCmeF@y(,):ku}2ctUj"> <field name="TEXT">☠️ Alexa Adapter ist tot!! ⚰️</field> </block> </value> <next> <block type="telegram" id="P1/JGUw5@WcW*a`H``yq"> <field name="INSTANCE">.0</field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <field name="ESCAPING">FALSE</field> <field name="DISABLE_WEB_PAGE_PREVIEW">FALSE</field> <value name="MESSAGE"> <shadow type="text" id="S%/du|tfxh-zWTMNE-}H"> <field name="TEXT">☠️ Alexa Adapter ist tot!! ⚰️</field> </shadow> </value> </block> </next> </block> </statement> </block> </statement> </block> </xml> -
Danke, das sieht kompliziert aus mit dem Datenpunkt „alexa2.0 alive =".
importier dir das als Blockly
<xml xmlns="https://developers.google.com/blockly/xml"> <block type="on_ext" id="WE+VJp5#;[c.pS.Y8L5|" x="2713" y="-87"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="u6%B-.^[ajqADl)$zNCN"> <field name="oid">system.adapter.alexa2.0.alive</field> </shadow> </value> <value name="OID1"> <shadow type="field_oid" id=",)T`%UBZv`0FkgN((mek"> <field name="oid">system.adapter.alexa2.1.alive</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="fK)Ve3xi.3[Pe9(EN?7x"> <value name="IF0"> <block type="logic_multi_or" id="3GPfPQ;xZ|{#,ROMEi9E"> <mutation xmlns="http://www.w3.org/1999/xhtml" items="2"></mutation> <value name="OR0"> <block type="logic_compare" id="6V$|WQ#GOk3~h[vJ}0`5"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id=".{w{p;.o{ckDT33D-v,?"> <field name="ATTR">val</field> <field name="OID">system.adapter.alexa2.0.alive</field> </block> </value> <value name="B"> <block type="logic_boolean" id="[U[vhH8X}Hs=AcULKEl["> <field name="BOOL">FALSE</field> </block> </value> </block> </value> <value name="OR1"> <block type="logic_compare" id="1r`iu7=4FMwTK3Tr6ij^"> <field name="OP">EQ</field> <value name="A"> <block type="get_value" id="!hC(Z`mYn{62{z3R3;Zp"> <field name="ATTR">val</field> <field name="OID">system.adapter.alexa2.1.alive</field> </block> </value> <value name="B"> <block type="logic_boolean" id="~Ko/bj)(0ED`vK~*wP/}"> <field name="BOOL">FALSE</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="7+7su45k7v/^^dj%qz7!"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">lgtv.0.states.popup</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="PuCmeF@y(,):ku}2ctUj"> <field name="TEXT">☠️ Alexa Adapter ist tot!! ⚰️</field> </block> </value> <next> <block type="telegram" id="P1/JGUw5@WcW*a`H``yq"> <field name="INSTANCE">.0</field> <field name="LOG"></field> <field name="SILENT">FALSE</field> <field name="PARSEMODE">default</field> <field name="ESCAPING">FALSE</field> <field name="DISABLE_WEB_PAGE_PREVIEW">FALSE</field> <value name="MESSAGE"> <shadow type="text" id="S%/du|tfxh-zWTMNE-}H"> <field name="TEXT">☠️ Alexa Adapter ist tot!! ⚰️</field> </shadow> </value> </block> </next> </block> </statement> </block> </statement> </block> </xml> -
@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 :-) ) -
-
@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.connectionzu 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.
-
@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.connectionzu 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.
-
meinst du den Datenpunkt?

alexa2.0.info.connectionfinde ich keinen.
Euch einen schönen Abend.
Duffy
-
meinst du den Datenpunkt?

alexa2.0.info.connectionfinde ich keinen.
Euch einen schönen Abend.
Duffy
-
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".
-
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.
-
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".
-
Wenn Alexa wieder spinnt und das korrekt gemeldet wird kann ich das gerne machen.
-
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=

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

Linuxcontrol Stopp und Start

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


