Auf Alter von Readings im Dummy triggern. Syntax?

Begonnen von Frank_Huber, 11 August 2017, 09:14:19

Vorheriges Thema - Nächstes Thema

Ellert

#15
vielleicht klappt es mit DOIF und at

defmod DOIF_Whatchdog_Temp DOIF ([Temperaturen]) ((defmod Temperaruren["^Temperaturen$:":"(.*)?:\s"] at {time+600} set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))
attr DOIF_Whatchdog_Temp do always

Ich habs nicht probiert, die Idee dahinter ist, dass für jedes Temperaturreading ein at innerhalb von 600 s mit einer neuen Auslösezeit aktualisiert wird. Und wenn nicht, wird die Nachricht abgesetzt. Das klappt aber nur, wenn im Befehlsteil noch einmal das Event ausgewertet werden kann. Der jeweilige Name des at sollte dann Temperaruren<Reading> lauten.

Per

Das funktioniert schon, nur hast du auch hier 14, wenn auch automatisch erstellte, at.

Ellert

Zitat von: Per am 14 August 2017, 16:13:39
Das funktioniert schon, nur hast du auch hier 14, wenn auch automatisch erstellte, at.
Dann würde es wohl auch mit benannten sleep-Befehlen klappen, im Prinzip ist es doch gleich, wer einen Timer setzt DOIF, at oder sleep.

((sleep 600 Temperaruren["^Temperaturen$:":"(.*)?:\s"] quiet;set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))

Frank_Huber

Zitat von: Ellert am 14 August 2017, 18:05:25
Dann würde es wohl auch mit benannten sleep-Befehlen klappen, im Prinzip ist es doch gleich, wer einen Timer setzt DOIF, at oder sleep.

((sleep 600 Temperaruren["^Temperaturen$:":"(.*)?:\s"] quiet;set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))

So, kann heute wieder etwas testen...
Ich vermute DOIF wird nicht wirklich funktionieren weil ja die 14 verschiedenen readings jeweils den vorigen Befehl innerhalb vom Wait überschreiben.
Es sei denn ich mach 14 DOIF Pfade. Und da fänd ich den notify mit at sinnvoller. zudem ich da dann auch mit EVTPART0$ arbeiten kann.

Frank_Huber

Zitatdefmod Temperaruren["^Temperaturen$:":"(.*)?:\s"] at {time+600} set TelegramBot message Temperatur OG_Schlafzimmer: 22.125 scheint offline zu sein, bitte prüfen!:
Invalid characters in name (not A-Za-z0-9._): Temperaruren["^Temperaturen$:":"(.*)?:\s"]

schade, scheint so nicht zu gehen. oder ist da noch was mit den Klammern falsch?

Frank_Huber

So, DOIF mit 14 Pfaden, jetzt meckert er den define vom at an. {time+600}

Zitatdefmod Whatchdog_T_DG_Ost at {time+600} set TelegramBot message Temperatursensor DG_Ost scheint offline zu sein, bitte prüfen!:
the function "time+600" must return a timespec and not 1502785019.

AxelSchweiss

Ich habe das mit dem DeviceMonitor Modul gemacht.

define DeviceCheck DeviceMonitor

define DeviceTotAlarm notify .*health_state:.*dead.* { { DebianMail('XXX@XXX.de','FHEM-Sensor-Ausfall',' Sensor - '.$NAME.' - ist ausgefallen!') ;; } }

und dann bei jedem Device diese Attribut gesetzt:
attr BZ.Temperatur device_timeout 30
Wobei BZ.Temperatur ein LaCrosse Sensor ist.

Funktioniert seit Jahren einwandfrei.

Frank_Huber

Zitat von: AxelSchweiss am 15 August 2017, 10:23:16
Ich habe das mit dem DeviceMonitor Modul gemacht.

define DeviceCheck DeviceMonitor

define DeviceTotAlarm notify .*health_state:.*dead.* { { DebianMail('XXX@XXX.de','FHEM-Sensor-Ausfall',' Sensor - '.$NAME.' - ist ausgefallen!') ;; } }

und dann bei jedem Device diese Attribut gesetzt:
attr BZ.Temperatur device_timeout 30
Wobei BZ.Temperatur ein LaCrosse Sensor ist.

Funktioniert seit Jahren einwandfrei.

"Problem" bei mir ist dass es EIN device ist und ich die Readings überwachen will.
Denke das DOIF mit 14 Pfaden wird die Lösung sein. muss nur die timespec richtig hinbekommen.

amenomade

#23
(übrigens: meine Lösung mit DOIF geht nicht, da immer nur ein Timer für das ganze DOIF gesetzt wird.)
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Frank_Huber

Zitat von: amenomade am 15 August 2017, 10:28:58
(übrigens: meine Lösung mit DOIF geht nicht, da immer nur einen Timer für das ganze DOIF gesetzt wird.)

Ja, deswegen 14 Pfade im DOIF mit jeweils einem "defmod at"

nils_

kannst du nicht _ein_ DOIF bauen was jede minute nachguckt ob deine readings zu alt sind?
(evtl. habe ich nur die ganze problemstellung noch nicht durchblickt, dann sorry für die nachfrage!)



define DOIF_Watchdog_Temp DOIF ([+:01] and [?Temperaturen:.*:sec] > 600) ((set TelegramBot message Temperatur $EVENT scheint offline zu sein, bitte prüfen!))
viele Wege in FHEM es gibt!

amenomade

#26
Getestete Lösung: ein "at", der regelmässig die ReadingsAge prüft:

+*00:00:10 {
  my $hash = $defs{"Temperaturen"};
  foreach my $key (keys %{$hash->{READINGS}}){
    if (ReadingsAge("Temperaturen",$key,0) > 30)
      {Log3 "Temperaturen",1,"$key antwortet nicht mehr"};
  }
}


Je 10 Sekunden prüfen, ob die Readings mehr als 30 Sekunden verältet sind.

EDIT: die Idee von nils_ ist auch interessant. Muss man aber testen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Per

Zitat von: nils_ am 15 August 2017, 10:53:26[?Temperaturen:.*:sec] > 600
Ich sehe hier eher die Aggregatsfunktion # am Zug. $EVENT ergibt hier nämlich nichts Sinnvolles, weil der Timer das Event lievert, nicht der Sensor, der wird nur abgefragt.

Achja: siehe hier!

Frank_Huber

Zitat von: amenomade am 15 August 2017, 11:39:12
Getestete Lösung: ein "at", der regelmässig die ReadingsAge prüft:

+*00:00:10 {
  my $hash = $defs{"Temperaturen"};
  foreach my $key (keys %{$hash->{READINGS}}){
    if (ReadingsAge("Temperaturen",$key,0) > 30)
      {Log3 "Temperaturen",1,"$key antwortet nicht mehr"};
  }
}


Je 10 Sekunden prüfen, ob die Readings mehr als 30 Sekunden verältet sind.

EDIT: die Idee von nils_ ist auch interessant. Muss man aber testen.

DANKE!!!!!

genau was ich gesucht habe. das funktioniert super! :)

Bei der Idee von Nils dürfte aber auch $EVENT nichts vernünftiges liefern oder?

Ellert

Zitat von: Frank_Huber am 15 August 2017, 10:15:20
So, DOIF mit 14 Pfaden, jetzt meckert er den define vom at an. {time+600}
Dann müsstest Du time+600 noch in HH:MM:SS umwandeln siehe http://search.cpan.org/~dexter/POSIX-strftime-GNU-0.02/lib/POSIX/strftime/GNU.pm