NEWS
"entprellen" eines States
-
Hallo,
ich nutze den Ping-Adapter, um meinen Rademacher Homepilot alle 60s zu überprüfen.
Wenn der Homepilot auf Ping nicht antwortet, schicke ich eine Telegramm Botschaft.
Nun passiert es ca. jede Stunde einmal, dass Homepilot für eine Minute nicht verfügbar ist.
Ich möchte jetzt keine große Suche starten, warum dass so ist. Vielmehr würde ich gerne das Ping-Signal entprellen und mir nur eine Nachricht schicken, wenn der Homepilot z.B. für länger als 3 Minuten offline ist.
Hat jemand schon solch eine Entprelllogik implementiert?
Danke
Christof
-
das Ping-Signal entprellen und mir nur eine Nachricht schicken, wenn der Homepilot z.B. für länger als 3 Minuten offline ist. `
Dafür verzögert man das Telegramm um 3 Minuten mit timer = setTimeout(). Bei jedem Ping wird der Timer mit clearTimeout(timer) gestoppt. -
Hi,
danke für den Tip.
So habe ich es nun gelöst:
var PingProblemSchedule; on({id: "ping.0.ioBroker-RasPi.192_168_178_49"/*HomePilot*/, change: "ne"}, function (obj) { if (getState("ping.0.ioBroker-RasPi.192_168_178_49"/*HomePilot*/).val === false) { PingProblemSchedule = setTimeout(function () {sendTo('telegram', 'Fehler: Homepilot 192.168.178.49 nicht erreichbar');}, 3*60*1000); } else { //Wenn OK Zustand nach länger als 3 Minuten, sende: Alles OK if ((dp.state.lc - dp.oldState.lc) > 3*60*1000) sendTo('telegram', 'Homepilot 192.168.178.49 wieder erreichbar'); //Ansonsten, OK Zustand nach weniger als 3 Minuten hergestellt, Fehlernachricht abbrechen else clearTimeout(PingProblemSchedule); } });
-
Das geht einfacher, da Ping zyklisch aktualisiert wird.
const idPing = "ping.0.ioBroker-RasPi.192_168_178_49"/*HomePilot*/; var timer = null; on({id: idPing, val: true}, function() { sendTo('telegram', 'Homepilot 192.168.178.49 wieder erreichbar'); clearTimeout(timer); timer = setTimeout(function() { sendTo('telegram', 'Fehler: Homepilot 192.168.178.49 nicht erreichbar'); }, 3*60*1000); });
-
@paul53 sagte in "entprellen" eines States:
Das geht einfacher, da Ping zyklisch aktualisiert wird.
const idPing = "ping.0.ioBroker-RasPi.192_168_178_49"/*HomePilot*/; var timer = null; on({id: idPing, val: true}, function() { sendTo('telegram', 'Homepilot 192.168.178.49 wieder erreichbar'); clearTimeout(timer); timer = setTimeout(function() { sendTo('telegram', 'Fehler: Homepilot 192.168.178.49 nicht erreichbar'); }, 3*60*1000); });
Dieses Script schickt mir minütlich (ping adapter intervall?): xyz wieder erreichbar.
Kann jemand helfen wie es richtig geht? -
const idPing = "ping.0.ioBroker-RasPi.192_168_178_49"/*HomePilot*/; var timer = null; on({id: idPing, val: true}, function() { if(!timer) sendTo('telegram', 'Homepilot 192.168.178.49 wieder erreichbar'); else clearTimeout(timer); timer = setTimeout(function() { sendTo('telegram', 'Fehler: Homepilot 192.168.178.49 nicht erreichbar'); timer = null; }, 3*60*1000); });
-
Danke für das Update. Leider springt er jetztj wild zwischen "nicht erreichbar" und "wieder erreichbar" hin und her. Der ping Status ist aber konstat auf true... Hier der verwendete code:
const idPing = "ping.0.IoBroker-VM-Debian.192_168_178_50"/*Rainyman*/; var timer = null; on({id: idPing, val: true}, function() { if(!timer) //sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar'); console.log('Rainyman 192.168.178.50 wieder erreichbar'); else clearTimeout(timer); timer = setTimeout(function() { //sendTo('pushover.0', 'Fehler: Rainyman 192.168.178.50 nicht erreichbar'); console.log('Fehler: Rainyman 192.168.178.50 nicht erreichbar'); timer = null; }, 1*5*1000); });
-
@passuff sagte:
Hier der verwendete code:
Ja, bei nur 5 s Verzögerung muss das so sein. Die Verzögerung muss auf jeden Fall größer sein, als das Intervall, in dem der Ping-Status aktualisiert wird.
-
Sorry, mein Fehler. Funktioniert tadellos.
Danke dafür!
-
Ich bekomme im Schnitt alle 2-3 Tage eine "wieder erreichbar" Meldung. Laut Aufzeichnung kannn ich aber nicht erkennen, dass sich am PingStatus etwas geändert hat.
Jemand eine Idee?Code:
-
@passuff sagte in "entprellen" eines States:
if(!timer) {sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar') + setState("CalcVal.0.Szenen.Dachfensterautomatik"/Dachfensterautomatik/, true)
- console.log('Rainyman 192.168.178.50 wieder erreichbar');
else clearTimeout(timer);
Was soll das für Code sein ? Javascript ist es nicht.
if(!timer) { sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar'); setState("CalcVal.0.Szenen.Dachfensterautomatik"/Dachfensterautomatik/, true); console.log('Rainyman 192.168.178.50 wieder erreichbar'); } else clearTimeout(timer);
-
@paul53 sagte in "entprellen" eines States:
Was soll das für Code sein ? Javascript ist es nicht.
ja, da kannst du recht haben. Ich hatte es auch so wie du proiert, doch dann bekam ich einen Fehler beim compile:
javascript.0 script.js.common.Sonstige.Überwachung_Rainyman_Kopieren compile failed: at script.js.common.Sonstige.Überwachung_Rainyman_Kopieren:8
-
@passuff sagte in "entprellen" eines States:
} else clearTimeout(timer); else clearTimeout(timer);
Das zweite else ... muss raus.
Bitte Jacascript-Code in Code tags posten ! -
Sorry, da komme ich nicht weiter:
const idPing = "ping.0.IoBroker-VM-Debian.192_168_178_50"/*Rainyman*/; var timer = null; on({id: idPing, val: true}, function() { if(!timer) { sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar'); setState("CalcVal.0.Szenen.Dachfensterautomatik"/Dachfensterautomatik/, true); console.log('Rainyman 192.168.178.50 wieder erreichbar'); } else clearTimeout(timer); timer = setTimeout(function() { sendTo('pushover.0', 'Fehler: Rainyman 192.168.178.50 nicht erreichbar'); setState("CalcVal.0.Szenen.Dachfensterautomatik"/*Dachfensterautomatik*/, false); setState("hm-rpc.0.OEQ1301523.1.LEVEL"/*HM-LC-Bl1PBU-FM OEQ1301523:1.LEVEL*/, 0); //console.log('Fehler: Rainyman 192.168.178.50 nicht erreichbar'); timer = null; }, 5*60*1000); });
-
@passuff
Funktioniert es so nicht ? Sollte eigentlich. Damit die Struktur zu erkennen ist:const idPing = "ping.0.IoBroker-VM-Debian.192_168_178_50"/*Rainyman*/; var timer = null; on({id: idPing, val: true}, function() { if(!timer) { sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar'); setState("CalcVal.0.Szenen.Dachfensterautomatik"/*Dachfensterautomatik*/, true); console.log('Rainyman 192.168.178.50 wieder erreichbar'); } else clearTimeout(timer); timer = setTimeout(function() { sendTo('pushover.0', 'Fehler: Rainyman 192.168.178.50 nicht erreichbar'); setState("CalcVal.0.Szenen.Dachfensterautomatik"/*Dachfensterautomatik*/, false); setState("hm-rpc.0.OEQ1301523.1.LEVEL"/*HM-LC-Bl1PBU-FM OEQ1301523:1.LEVEL*/, 0); //console.log('Fehler: Rainyman 192.168.178.50 nicht erreichbar'); timer = null; }, 5*60*1000); });
-
Nein, funktioniert leider nicht:
00:00:23.053 error javascript.0 script.js.common.Sonstige.Überwachung_Rainyman_Kopieren compile failed: at script.js.common.Sonstige.Überwachung_Rainyman_Kopieren:8
-
@passuff
In Zeile 8 ist der Kommentar(Name) falsch eingebaut. Ich habe es oben korrigiert. -
Super, vielen Dank!
-
@paul53 Bei neustart des Skripts wird einmalig die Bedingung " if(!timer)" wahr un somit eine pushover abgesetzt. Hast du eine Lösung dafür?
const idPing = "ping.0.IoBroker-VM-Debian.192_168_178_50"/*Rainyman*/; var timer = null; on({id: idPing, val: true}, function() { if(!timer) { sendTo('pushover.0', 'Rainyman 192.168.178.50 wieder erreichbar'); console.log('Rainyman 192.168.178.50 wieder erreichbar'); } else clearTimeout(timer); timer = setTimeout(function() { sendTo('pushover.0', 'Fehler: Rainyman 192.168.178.50 nicht erreichbar'); setState("hm-rpc.0.OEQ1301523.1.LEVEL"/*HM-LC-Bl1PBU-FM OEQ1301523:1.LEVEL*/, 0); //console.log('Fehler: Rainyman 192.168.178.50 nicht erreichbar'); timer = null; }, 5*60*1000); });
-
@passuff
In Zeile 3 den Timer setzenvar timer = setTimeout(function() {}, 0);