Ich schreibe gerade an einem monitoring Modul welches devices erst auf eine warning und dann auf eine error Liste setzt nachdem ein ein Ereignis eingetroffen ist und in einer gewissen Zeit nicht ein Ereignis zwei empfangen wurden. Imprinzip ein erweitertes watchdog welches ich für Sammelmeldungen verwernden will.
Beispiel einer Sammelmeldung für Geräte mit einer niedrigen Batteriespannung:
defmod battery_monitoring monitoring .*:battery:.low .*:battery:.ok
attr battery_monitoring errorWait 60*15
setstate battery_monitoring error add: HM_36CF07
setstate battery_monitoring 2017-03-07 07:20:05 error HM_26B05C,HM_36CF07
setstate battery_monitoring 2017-03-07 07:20:05 state error add: HM_36CF07
setstate battery_monitoring 2017-03-07 07:20:05 warning
Über weitere Attribute lässt sich auch die Ausgabe formatieren:
attr battery_monitoring errorReturn {return unless(@errors);;\
return("Bei dem Gerät \"$errors[0]\" muss die Batterie gewechselt werden.") if(int(@errors) == 1);;\
$_ = AttrVal($_, "alias", $_) for(@errors);;\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
return(join("\n - ", 'Bei den folgenden Geräten muss die Batterie gewechselt werden:', @errors));;\
}
attr battery_monitoring warningReturn {return unless(@warnings);;\
return("Bei dem Gerät \"$warnings[0]\" muss die Batterie demnächst gewechselt werden.") if(int(@warnings) == 1);;\
$_ = AttrVal($_, "alias", $_) for(@warnings);;\
@warnings = sort {lc($a) cmp lc($b)} @warnings;;\
return(join("\n - ", 'Bei den folgenden Geräten muss die Batterie demnächst gewechselt werden:', @warnings));;\
}
Wenn nun nicht event-on-change-reading auf battery gesetzt ist würde der Timer erneut gestartet werden. Da das nicht gewollt ist kam mir in den Sinn zu überprüfen ob ein solcher Timer schon läuft.