Hallo zusammen,
ich habe das Script erweitert um alle 3 Statuswerte der Instanzen abzufragen.
Damit werden auch folgende Situationen erkannt:
- InfluxDB ist nicht erreichbar (oder User gesperrt/ungültig)
- Plex verweigert die Verbindung weil Token abgelaufen ist (passiert manchmal nach Updates
- Spotify Login-Token ist abgelaufen
- ....und viele mehr
Funktionsweise (am Beispiel von Instanz plex.0):
- "Connected to host" wird über Event system.adapter.plex.0.connected geprüft
- "Connected to device or service" wird über Event plex.0.info.connection geprüft
- "Heartbeat" wird über Event system.adapter.plex.0.alive geprüft
// Überwacht alle 3 Statuswerte der laufenden Adapter
var G_TelegramChatId = 37342026;
function alarmMeldung(txt) {
//txt = txt;
//sendeStatusPerTelegram(txt);
sendTo('telegram.0', 'Instanzmonitoring: ' + txt);
sendTo("telegram.0", "send", {
text: ('Instanzmonitoring: ' + txt),
chatId: G_TelegramChatId
});
log('Sende via Telegram: ' + txt);
}
var cnt = 0,
timeoutZeit = 1 * 30000;
//Prüfen auf: Connected to host
//['system','adapter','plex','0','connected']
on(/^system\.adapter\..+\.connected$/, function (dp) {
log("CONNECTED-EVENT " + ( JSON.stringify(dp)));
var id = dp.id.split('.');
//log(dp.id);
//log(id);
if (id[2] != 'admin') {
if (dp.state.val) {
cnt--;
if (cnt <= 0) {
log('"Connected to host" Adapter laufen fehlerfrei');
cnt = 0; // falls verzählt und cnt < 0
}
} else {
log('### "Connected to host"-Fehler entdeckt. Warte auf Selbstheilung: ' + id[2]);
var newid = ('system.adapter.' + id[2] + '.' + id[3]);
recheckWithIntervall(dp.common.name, newid, id[2], "Connected to host");
cnt++;
}
}
});
//Prüfen auf: Connected to device or service
//plex.0.info.connection
on(/^.*info\.connection.*$/, function (dp) {
log("INFO-EVENT " + ( JSON.stringify(dp)));
var id = dp.id.split('.');
//log(dp.id);
//log(id);
if (id[0] != 'admin') {
if (dp.state.val) {
cnt--;
if (cnt <= 0) {
log('"Connected to device or service" Adapter laufen fehlerfrei');
cnt = 0; // falls verzählt und cnt < 0
}
} else {
log('### "Connected to device or service"-Fehler entdeckt. Warte auf Selbstheilung: ' + id[2]);
var newid = ('system.adapter.' + id[2] + '.' + id[3]);
recheckWithIntervall(dp.common.name, newid, id[2], "Connected to device or service");
cnt++;
}
}
});
//Prüfen auf: Heartbeat
on(/^system\.adapter\..+\.alive$/, function (dp) {
//if (dp.state.val)
// log('trigger für Adapterüberwachung aktiv');
var id = dp.id.split('.');
//log(dp.id);
//log(id);
// Ausnahmen definieren. id[2] != 'admin' && id[2] != 'yahka'
if (id[2] != 'admin' && id[2] != 'openweathermap') {
if (dp.state.val) {
cnt--;
if (cnt <= 0) {
log('"Heartbeat"-Adapter laufen fehlerfrei');
cnt = 0; // falls verzählt und cnt < 0
}
} else {
log('### "Heartbeat"-Fehler entdeckt. Warte auf Selbstheilung: ' + id[2]);
var dpname = ('system.adapter.' + id[2] + '.' + id[3] + '.' + id[4]);
var newid = ('system.adapter.' + id[2] + '.' + id[3]);
recheckWithIntervall(dp.common.name, newid, id[2], "Heartbeat");
cnt++;
}
}
});
function recheckWithIntervall(dpname, newid, adapter, eventtyp) {
var timeout = setTimeout(function () {
var instance = getObject(newid);
log('### "' + eventtyp + '"-Wartezeit vorrüber. Prüfe noch mal: ' + newid);
// nur einen Fehler melden, wenn der Adapter vorher auch mal aktiv war. Bzw. deaktivierte Adapter ignorieren
if (!getState(dpname).val) {
if (instance.common.enabled) {
alarmMeldung('"' + eventtyp + '"-Fehler bei Instanz: ' + dpname);
cnt = 0; // falls verzählt und cnt < 0
}
} else {
log('### Der "' + eventtyp + '"-Fehler hat selbst geheilt: '+ newid);
}
}, timeoutZeit);
}