Hallo,
ich suche schon einige Zeit nach einer Lösung für meine Idee, aber entweder finde ich nichts passendes oder ich verstehe es einfach nicht.
Ich hoffe das sich jemand die Mühe machen kann mir hier zu helfen.
Folgendes:
Immer wieder passiert es das meine Thermometer (LaCrosse) "unbemerkt" ausfallen. D.h. die Werte im Reading sind dann auch entsprechend veraltet.
Mein Gedanke war:
Sende eine eMail wenn das Reading <temperature> von <Esszimmer_Klima> über einen Zeitraum von >7200sec unverändert bleibt.
Eine email Benachrichtigung für diverse Dinge über ein Notify habe ich in folgender Form schon zur Hand {exmail('FHEM@FHEM.de', 'FHEM Warnung', 'Warntext, je nach Anforderung ')}
Kann mir bitte jemand einen Weg aufzeigen wie ich das lösen kann.
Vielen Dank.
Grüße
Nachtrag:
define di_push DOIF ([Esszimmer_Klima])( {exmail('FEHM@FHEM.de', 'FHEM Warnung', ' Keine aktuellen Daten')})
setuuid di_push 5da73052
attr di_push do resetwait
attr di_push room 1 TEST
attr di_push wait 20
Folgendes erschien mir sehr Erfolgversprechend.
Ab und an kommen sogar Mails, aber was nicht funktioniert hat war das attr Wait auf 2 zu stellen.
Dann hätte ja eigentlich alle 2sec eine Mail kommen müssen. Da das Themometer nur alle 4 sec. einen neuen Wert sendet.
Es gibt auch ein Modul dafür: https://fhem.de/commandref_DE.html#readingsWatcher
ZitatAb und an kommen sogar Mails, aber was nicht funktioniert hat war das attr Wait auf 2 zu stellen.
Dann hätte ja eigentlich alle 2sec eine Mail kommen müssen. Da das Themometer nur alle 4 sec. einen neuen Wert sendet.
Ich dachte Du willst aber 7200? Warum willst Du jetzt 2 oder 4 - oder 20 - setzen?
https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#wait (https://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen#wait)
ZitatDann hätte ja eigentlich alle 2sec eine Mail kommen müssen.
Aber nicht weil Du wait auf 2 gesetzt hast.
ich hatte mal was gefunden und bei mir dann so implementiert...
+*1:30:00 {
my @lcdev=devspec2array("TYPE=LaCrosse");
my $age_in_seconds;;
my $max_seconds;;
$max_seconds=1800;
foreach(@lcdev){
$age_in_seconds=ReadingsAge("$_","temperature","");;
if ($age_in_seconds>$max_seconds) {
fhem("set myTelegramBot send $_ - Reading zu alt ($age_in_seconds sec.)");
}
}
}
Ein AT, welches die Devices vom Type LaCrosse auf alte Temperatur-Readings (hier älter als 30min) prüft und im Fehlerfall per Telegram informiert.
Das Modul readingsWatcher kannte ich noch nicht - mal anschauen...
Zitat von: Knallfrosch am 16 Oktober 2019, 20:39:57
wenn das Reading <temperature> von <Esszimmer_Klima> über einen Zeitraum von >7200sec unverändert bleibt.
Fast richtig der Gedankengang :) aber nicht der Wert ist entscheidend sondern der Zeitstempel, und genau da setzt readingsWatcher an .....
Zitat von: amenomade am 16 Oktober 2019, 21:57:10
Es gibt auch ein Modul dafür: https://fhem.de/commandref_DE.html#readingsWatcher
Ich dachte Du willst aber 7200? Warum willst Du jetzt 2 oder 4 - oder 20 - setzen?
Damit er den Ausfall mitbekommt, muss er wenigstens ein Event vom Device mitbekommen, damit der Timer aktiviert werden kann. Wenn das Device bereits nicht mehr sendet - wird auch nichts mehr kommen
Alternativ, eine Lösung, die immer funktioniert:
DOIF ([+02:00] and [Esszimmer_Klima:temperature:sec] > 7200) {exmail('FEHM@FHEM.de', 'FHEM Warnung', ' Keine aktuellen Daten')}
attr repeatsame 3
Hallo,
danke für eure Antworten.
Ich werde mir eure Lösungsvorschläge am WE in Ruhe anschauen.
Spontan scheint mir der readingsWatcher passend zu sein.
Den "Überwachungswert" habe ich nur zu Testzwecken so tief gestellt. Über Nacht kamen auch eine Vielzahl an "Warnmeldungen".
Mein "Versuch" scheint also doch (irgendwie) zu funktionieren.
Grüße
Hallo,
ich hatte etwas Zeit mich mit der Lösung zu beschäftigen.
Entschieden habe ich mich für readingsWatcher.
Falls jemand so etwas nachbauen möchte, ich habe es folgend gelöst:
define Readings_Ueberwachung readingsWatcher global
setuuid Readings_Ueberwachung 5da9abd8-f33f-a358-4aca-3e8a292e61790e2f
attr Readings_Ueberwachung interval 60
attr Readings_Ueberwachung readingActivity none
attr Readings_Ueberwachung room Raum-Klima
in den zu überwachenden Thermometern kam jeweils folgendes hinzu:
attr Aussen_Klima readingsWatcher 3600,???,temperature,humidity
um auch eine Nachricht zu erhalten:
define Readings_Ueberwachung_push at +*02:00:00 {if (ReadingsVal("Readings_Ueberwachung","state",0) eq "timeout") {my $test=ReadingsVal("Readings_Ueberwachung","timeoutdevs",0);; fhem ("set Pushnachricht msg 'TIMEOUT' 'Werte sind nicht aktuell.\\n$test \\nmuss geprüft werden.'")}}
setuuid Readings_Ueberwachung_push 5da9b7b0-f33f-a358-0fb8-a8674de90d586eb0
attr Readings_Ueberwachung_push room Benachrichtigungen
Vielen Dank nochmal.
Grüße
Ähh es freut mich ja das du dich für readingsWatcher entschieden hast , aber warum das at ?
So kann es bis zu drei Stunden dauern bis die Nachricht kommt, ich hätte ein notify genommen das auf timeoutdevs != none triggert
Hallo,
ja, mit zeitverzögerung kann ich leben.
Jedoch kommt so dann alle 2h eine "Erinnerung".
Push-Nachrichten können ja auch mal ungünstig kommen und dann vergessen werden.
Daher alle 2h eine Nachricht, bis der Fehler behoben ist.
Oder gibt es da eine "schönere" Lösung?
schöner geht immer :)
Ok, das mit der Erinnerung ist ein Argument. Das hatte ich so damals nicht auf meinem Radar, da ich meine Meldungen am TV dauerhaft unten einblende.
Ich könnte dem Modul allerdings intern noch einen Timer spendieren bzw ein temp at anlegen, dann könnte der User beim notify bleiben für die sofortige Meldung
und optional den Trigger für die Erinnerungen wiederholen. Ich schau mal nächste Woche danach.
Zitat von: Knallfrosch am 19 Oktober 2019, 18:50:55
Oder gibt es da eine "schönere" Lösung?
Weniger als einen Einzeiler, kann ich auch nicht ;)
@WZUT, wenn du da etwas einbauen könntest wäre das natürlich toll.
Ich als absoluter Laie, der sich alles mühsam zusammen bastelt, gehe sicherlich oft komplizierte Wege. :-)
Ich bin erstmal froh, das es so funktioniert.
@Damian, deinen Einzeiler habe ich mir natürlich auch angeschaut.
Aber dann hätte ich für jedes Thermometer (14St.) ein DoIf bauen müssen.
Das hat mir nicht so zugesagt.
Auch wenn das "Problem" für mich erstmal gelöst ist, sind Erweiterungen/Verbesserungen natürlich toll.
Grüße
Zitat von: Knallfrosch am 19 Oktober 2019, 23:56:03
@Damian, deinen Einzeiler habe ich mir natürlich auch angeschaut.
Aber dann hätte ich für jedes Thermometer (14St.) ein DoIf bauen müssen.
Das hat mir nicht so zugesagt.
Hättest du gesagt, dass du verschiedene Devices überwachen willst, dann hätte ich dir einen Einzeiler für alle präsentiert.
Zitat von: Damian am 20 Oktober 2019, 00:38:48
Hättest du gesagt, dass du verschiedene Devices überwachen willst, dann hätte ich dir einen Einzeiler für alle präsentiert.
Bin interessiert ;)
Vor allem, wie man den Alter der Readings in aggr Funktionen testet.
Das hatten wir doch erst vor kurzem: https://forum.fhem.de/index.php/topic,104133.msg979445.html#msg979445
Zitat von: Damian am 20 Oktober 2019, 00:45:20
Das hatten wir doch erst vor kurzem: https://forum.fhem.de/index.php/topic,104133.msg979445.html#msg979445
Ah ja, mit ReadingsAge, stimmt! Danke!
Also, wenn ich selbst versuche z.B. :
DOIF ([+02:00] and [#".*Klima$":"(temperature|humidity)":ReadingsAge("$name","$_",0) > 7200]) {exmail...
?
Ist $_ an der Stelle richtig, wenn ich entweder temperature oder humidity abfragen möchte?
EDIT: wobei... in der Bedingung wäre es besser nur [+02:00] zu haben, und einfach die Aggregation dann im exmail Nachricht zu machen. Aber das ist eine andere Geschichte ;)
EDIT2: und wenn $_ falsch ist, kann man auch 2x ReadingsAge mit "or" kombinieren
defmod doif_Age DOIF {[18:00];;my $s=[?@:"":temperature:ReadingsAge($name,"temperature",0) > 3600,"keine"];;if ($s ne "keine") {exmail('FEHM@FHEM.de', 'Folgende Sensoren sind ausgefallen', $s)}}
Bedeutung: Um 18:00 Uhr gibt es eine Mail mit Sensoren, deren Reading "temperature" älter als eine Stunde ist, aber nur falls es welche gibt, sonst wird keine Mail versendet.
Zitat von: Damian am 20 Oktober 2019, 10:23:25
defmod doif_Age DOIF {[18:00];;my $s=[?@:"":temperature:ReadingsAge($name,"temperature",0) > 3600,"keine"];;if ($s ne "keine") {exmail('FEHM@FHEM.de', 'Folgende Sensoren sind ausgefallen', $s)}}
Bedeutung: Um 18:00 Uhr gibt es eine Mail mit Sensoren, deren Reading "temperature" älter als eine Stunde ist, aber nur falls es welche gibt, sonst wird keine Mail versendet.
Hi, bin gerade auf das DOIF gestoßen, das sehr vielversprechend für mein Problen klingt. Ich möchte meine LaCrosse-Temperatursensoren auf Erreichbarkeit überwachen (alle anderen Devices sind Zigbee-Devices, da habe ich ein NOTIFY auf das reachable-Reading). Readingswatcher wäre zwar eine Alternative, aber das DOIF finde ich dann doch eleganter.
Wie kann ich das DOIF ändern, damit nicht alle Devices mit einem temperature-Reading, sondern nur LaCrosse-Devices abgegriffen werden, d.h. idealerweise alle mit LaCrosse im Internal TYPE? Falls das nicht möglich ist, könnte ich natürlich auch überall LaCrosse im Namen ergänzen - das sollte dann ja auf alle Fälle gehen?
Es soll auch nicht nur einmal täglich um 18 Uhr benachrichtigen, sondern alle 2 Stunden. Das sollte mit [+02:00] gehen, oder?
Mit der Perl-Syntax komme ich bisher leider noch nicht so recht klar - das ?@:"": verstehe ich insbesondere noch nicht wirklich...
Vielen Dank für jede Hilfe!