Modul 98_monitoring zur Überwachung von Geräten

Begonnen von igami, 09 März 2017, 22:12:42

Vorheriges Thema - Nächstes Thema

igami

Gucken wir uns dazu mal das Beispiel aus der Commandref an;
Zitat

defmod Activity_monitoring monitoring .*:.*
attr Activity_monitoring errorReturn {return unless(@errors);;\
$_ = AttrVal($_, "alias", $_) foreach(@errors);;\
return("Das Gerät \"$errors[0]\" hat sich seit mehr als 24 Stunden nicht mehr gemeldet.") if(int(@errors) == 1);;\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
return(join("\n - ", "Die folgenden ".@errors." Geräten haben sich seit mehr als 24 Stunden nicht mehr gemeldet:", @errors))\
}
attr Activity_monitoring errorWait 60*60*24
attr Activity_monitoring warningReturn {return unless(@warnings);;\
$_ = AttrVal($_, "alias", $_) foreach(@warnings);;\
return("Das Gerät \"$warnings[0]\" hat sich seit mehr als 12 Stunden nicht mehr gemeldet.") if(int(@warnings) == 1);;\
@warnings = sort {lc($a) cmp lc($b)} @warnings;;\
return(join("\n - ", "Die folgenden ".@warnings." Geräten haben sich seit mehr als 12 Stunden nicht mehr gemeldet:", @warnings))\
}
attr Activity_monitoring warningWait 60*60*12

Geräte werden erst überwacht, wenn sie mindestens ein Event ausgelöst haben. Sollte das Gerät in 12 Stunden kein weiterer Event auslösen, wird es auf die warning-Liste gesetzt. Sollte das Gerät in 24 Stunden kein weiteres Event auslösen, wird es von der warning- auf die error-Liste verschoben.
Dabei ändern wir das errorWait Attribut auf {ReadingsVal($name, "device_timeout", 0)} und ergänzen das monitoring um das Attribut whitelist device_timeout=.+
Um den das Reading Activity auf dead or alive zu setzen wird noch ein notify benötigt.

Zusammengefasst haben wir dann folgendens (ungetestet):

defmod DeviceMonitor monitoring .*:.*
attr DeviceMonitor errorReturn {return unless(@errors);;\
\
$_ = AttrVal($_, "alias", $_) foreach(@errors);;\
\
return("Das Gerät \"$errors[0]\" scheint nicht mehr aktiv zu sein.")\
   if(int(@errors) == 1);;\
\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
\
return(join("\n - ", "Die folgenden ".@errors." Geräten scheinen nicht mehr aktiv zu sein:", @errors))\\
}
attr DeviceMonitor errorWait {AttrVal($name, "device_timeout", 0)}
attr DeviceMonitor whitelist device_timeout=.+

defmod DeviceMonitorSetActivity notify DeviceMonitor:error.(add|remove):..+ {\
  $EVENT =~ m/error (add|remove): (.+)/;;\
  \
  readingsSingleUpdate(\
    $defs{$2}, "Activity", $1 eq "add" ? "dead" : "alive", 0\
  );;\
  \
  return;;\
}
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

ioT4db

Hi und Danke, das scheint schonmal zu klappen!

Ich Versuch das mal weiter zu Stricken.

Wenn ich das in einem DOIF abbilden will, scheitere ich aber momentan noch den DeviceNamen richtig rauszufiltern. Ich bleib dran...


Gesendet von iPhone mit Tapatalk
FHEM auf Synology mittels Docker,  Jeelink-Clone 1x für PCA301 und 1x für Lacrosse, THZ304SOL, Homematic: CUL_HM / M-MOD-RPI-PCB, Pushover, Xiaomi s50

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

ioT4db

Bei meinem jetzigen DeviceMonitor-Modul setze ich das setzen der Readings und die Benachrichtigungen in einem DOIF-Modul um. Klar kann man es auch mit dem Notify machen. Ich seh es für mich auch als kleine Herausforderung...


Gesendet von iPhone mit Tapatalk
FHEM auf Synology mittels Docker,  Jeelink-Clone 1x für PCA301 und 1x für Lacrosse, THZ304SOL, Homematic: CUL_HM / M-MOD-RPI-PCB, Pushover, Xiaomi s50

igami

Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

ioT4db

Ich hatte heute nur 15 min Zeit um Dein Notify zu testen und auch mal das DOIF anzupassen. Es scheitert vorerst daran aus dem Event nur den Devicenamen rauszuziehen für die weitereVrrarbeitung im DOIF. Also bspw. In der Pushnachricht nicht "error add Devicename" sondern eben nur "Devicename" zu schicken oder eben um ein Userreading beim entsprechenden Device setzen zu können.


Gesendet von iPhone mit Tapatalk
FHEM auf Synology mittels Docker,  Jeelink-Clone 1x für PCA301 und 1x für Lacrosse, THZ304SOL, Homematic: CUL_HM / M-MOD-RPI-PCB, Pushover, Xiaomi s50

igami

Also ich nutze auch viel DOIF, aber wenn es nur ein Event gibt auf das ich reagieren will ist meiner Meinung nach notify die bessere Wahl.
Wenn du das mit dem DOIF weiter besprechen möchtes bitte ich dich ein neues Thema dafür zu erstellen, da es ja eigentlich nichts mit dem Monitoring Modul zu tun hat.

Aber wenn du den DeviceMonitor nun mal eine Woche getestet hast und alles funktioniert bitte Bescheid geben, dann packe ich das mit in die CommandRef zu dem Modul.
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

ioT4db

So, nun mal ein Feedback zum DeviceMonitoring:

Das funktioniert eigentlich ganz wunderbar!

Ich habe mittlerweile das bisher von mir verwendete, aber nicht supportete Modul "98_DeviceMonitor.pm" (aus dem Contrib-Verzeichnis) komplett entfernt und durch das hier beschriebene "98_monitoring" ersetzt!

Der hier weiter oben schon gepostete Code von igami tut was er soll:
Zitat von: igami am 25 April 2017, 21:05:10
Gucken wir uns dazu mal das Beispiel aus der Commandref an;Dabei ändern wir ...

Dazu habe ich noch unter "global" das Userattribut "device_timeout" gesetzt. Damit kann ich nun bei den Devices, die ich überwachen möchte einen Zeitwert hinterlegen, in dem sich das Device gemeldet haben muss, damit es noch als "alive" gilt, ansonsten gilt es als "dead". Diese Info wir beim Reading "Activity" der Devices hinterlegt.

Den Status dieses Readings kann man dann zum Absetzen von Nachrichten mittels DOIF oder notify verwenden.

Dabei sollte man aber beachten, dass für einige Devices (z.B. Homematic) das Reading "Activity" schon gibt und dieses vom Device selbst befüllt wird! Diese Devices bzw. das Reading "Activity" dieser Devices braucht/darf man also nicht über den hier beschriebenen DeviceMonitor ändern. Eigentlich logisch, ich sags aber trotzdem nochmal.

Der Vorteil, wenn man das Reading auch Activity nennt, liegt auf der Hand: Meine Benachrichtigungslogik, die ich schon für meine Homematic-Komponenten habe funktioniert auch direkt mit den vom monitoring-modul überwachten (bei mir Lacrosse-Sensoren)!

Eine Sache ist aber noch nicht ganz "sauber", ich habe Sie für mich aber pragmatisch gelöst: Ein neues Device bekommt das userreading "Activity" erst, wenn es mintestens 1x "dead" gewesen ist. Das liegt daran, dass das notify erst reagiert, wenn ein "error add:" oder "error remove:" vom monitoring-Modul erzeugt wird. Eigentlich wäre es schön, dass es zu Beginn direkt "alive" wäre. Aber nur eigentlich, da es ja mein Ziel ist, erst bei "dead" eine Nachricht zu bekommen. Wenn man trotzdem gleich zu Beginn das Reading "alive" haben möchte (z.B. für eine grüne OK-Anzeige o.ä.), dann kann man im monitoring-Modul die gelisteten Devices manuell kurz auf dead setzen. Dann wird das reading gleich erzeugt.
Aber ich schätze da gibts auch noch bessere Möglichkeiten...


VG...
FHEM auf Synology mittels Docker,  Jeelink-Clone 1x für PCA301 und 1x für Lacrosse, THZ304SOL, Homematic: CUL_HM / M-MOD-RPI-PCB, Pushover, Xiaomi s50

igami

Zitat von: friesenjung am 02 Mai 2017, 18:09:33
Eine Sache ist aber noch nicht ganz "sauber", ich habe Sie für mich aber pragmatisch gelöst: Ein neues Device bekommt das userreading "Activity" erst, wenn es mintestens 1x "dead" gewesen ist. Das liegt daran, dass das notify erst reagiert, wenn ein "error add:" oder "error remove:" vom monitoring-Modul erzeugt wird. Eigentlich wäre es schön, dass es zu Beginn direkt "alive" wäre. Aber nur eigentlich, da es ja mein Ziel ist, erst bei "dead" eine Nachricht zu bekommen. Wenn man trotzdem gleich zu Beginn das Reading "alive" haben möchte (z.B. für eine grüne OK-Anzeige o.ä.), dann kann man im monitoring-Modul die gelisteten Devices manuell kurz auf dead setzen. Dann wird das reading gleich erzeugt.
Aber ich schätze da gibts auch noch bessere Möglichkeiten...
du kannst ein notify auf "global:ATTR..+device_timeout.+ setzen
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

kvo1

Hallo  friesenjung,

ZitatDer Vorteil, wenn man das Reading auch Activity nennt, liegt auf der Hand: Meine Benachrichtigungslogik, die ich schon für meine Homematic-Komponenten habe funktioniert auch direkt mit den vom monitoring-modul überwachten (bei mir Lacrosse-Sensoren)!

ist vlt. etwas offtop aber kannst Du die Benachrichtigungslogik mal bitte kurz beschreiben ?

danke

vko1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

l2r

hi,

ich nutze monitoring auch seit heute und habe unter anderem das Beispiel mit dem Beamerfilter übernommen.

Ich bekomme folgende Fehlermeldung im Log:
Argument "60*60*200" isn't numeric in addition (+) at (eval 425115) line 1.

das ist ja der Wert vom userAttribut errorInterval.

Ich kann den Fehler aber noch nicht ganz nachvollziehen.

Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

igami

Zitat von: l2r am 09 Mai 2017, 12:07:23
hi,

ich nutze monitoring auch seit heute und habe unter anderem das Beispiel mit dem Beamerfilter übernommen.

Ich bekomme folgende Fehlermeldung im Log:
Argument "60*60*200" isn't numeric in addition (+) at (eval 425115) line 1.

das ist ja der Wert vom userAttribut errorInterval.

Ich kann den Fehler aber noch nicht ganz nachvollziehen.

Gruß Michael
Vielen Dank fürs testen.
Mach doch mal bitte aus

+ (AttrVal($SELF, "errorInterval", 0))

ein

+ eval(AttrVal($SELF, "errorInterval", 0))

und sag dann ob es funktioniert.

Ich selbst habe so eine Meldung noch gar nicht im Einsatz ::)
Verrrätst du mir noch für welche Anwendung du das einsetzt?
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

l2r

#57
hi,

funktioniert. Die Meldung aus dem Log ist weg.

Ich nutze das Beispiel für meinen Beamer, den ich über meine Harmony schalte. den HourCounter habe ich auf das Power-Reading vom Beamer-Harmony-Device gelegt. Da ich keinen DashButton besitzte habe ich das signalisieren von Reiningen der Filter über einen Dummy angestoßen. Funktioniert auch soweit (der Dummy wird nach dem betätigen direkt wieder auf off gesetzt (siehe das List und dort errorFuncRemove)

Allerdings scheint bei errorFuncRermove noch etwas nicht richtig zu laufen. Zum einen wird das error-Reading nicht geleert und zum anderen wird das Service-Reading nicht im HourCounter vom Beamer gesetzt. Laut meinem Verständnis kann ich aber keinen SyntaxError ausmachen und im Log steht u

Hier noch das List:
Internals:
   CFGFN
   DEF        hc_Beamer:pulseTimeOverall BeamerLampenwechsel:on
   NAME       mon_BeamerFilter
   NR         48009
   NTFY_ORDER 50-mon_BeamerFilter
   STATE      active
   TYPE       monitoring
   Readings:
     2017-05-09 12:12:53   error           hc_Beamer
     2017-05-09 12:17:38   state           active
   Powermap:
   Readingsdesc:
     Pm_consumption:
       rtype      w
     Pm_energy:
       rtype      whr
Attributes:
   errorFuncAdd {return 1
   if(ReadingsVal($name, "pulseTimeOverall", 0) >=
        ReadingsVal($name, "pulseTimeService", 0)
      + eval(AttrVal($SELF, "errorInterval", 0))
      && $addMatch
   );
return;
}
   errorFuncRemove {return unless($removeMatch);
fhem(
    "setreading $name pulseTimeService "
   .ReadingsVal($name, "pulseTimeOverall", 0)
);
fhem ("set BeamerLampenwechsel off");
return 1;
}
   errorInterval 60*60*200
   errorReturn {return unless(@errors);
return "Der Filter vom Beamer muss gereinigt werden.";
}
   room       FHEM
   userattr   errorInterval
   warningFuncAdd {return}
   warningFuncRemove {return}


und das Log bei Verbose 52017.05.09 13:11:47 4: monitoring (mon_BeamerFilter) triggered by "BeamerLampenwechsel on"
2017.05.09 13:11:47 5: monitoring (mon_BeamerFilter) addRegex (hc_Beamer:pulseTimeOverall) and removeRegex (BeamerLampenwechsel:on) are defined
2017.05.09 13:11:47 5: monitoring (mon_BeamerFilter) addRegex (hc_Beamer:pulseTimeOverall) and removeRegex (BeamerLampenwechsel:on) are defined
2017.05.09 13:11:47 5: monitoring (mon_BeamerFilter)
    entering monitoring_modify
        reading:   error
        operation: remove
        value:     BeamerLampenwechsel
        at:        now


Scheint das $name auf das triggernde Device gesetzt ist und nicht auf das Device im Error

EDIT: nach nochmaligem Lesen der Commandref ja auch richtig!!! dann muss der Code angepasst werden... Sprich es ist aktuell nicht out of the Box (außer man ruft die Funktion manuell auf) möglich, ein Error-Device zurückzusetzen, wenn es nicht selber das auslösende Device ist.

gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.

igami

Zitat von: l2r am 09 Mai 2017, 13:14:00
Scheint das $name auf das triggernde Device gesetzt ist und nicht auf das Device im Error

EDIT: nach nochmaligem Lesen der Commandref ja auch richtig!!! dann muss der Code angepasst werden...
Ja, so ist das auch. hatte es damals nur mit einem dummy getestet ::)

mach daraus doch mal bitte folgendes:

errorFuncRemove {return unless($removeMatch);
  fhem ("set $name off");
 
  $name = InternalVal($SELF, "DEF", "") =~ m/([A-Za-z0-9._]+):.*/ ? $1 : $name;

  fhem(
     "setreading $name pulseTimeService "
    .ReadingsVal($name, "pulseTimeOverall", 0)
  );

return 1;
}

dadurch sollte $name pasend ersetzt werden.

Wenn alles funktioniert bitte noch ein list posten, dann änderere ich das entsprechend in der commandref ab
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

l2r

hi,

funktioniert!
Internals:
   CFGFN
   DEF        hc_Beamer:pulseTimeOverall BeamerLampenwechsel:on
   NAME       mon_BeamerFilter
   NR         48009
   NTFY_ORDER 50-mon_BeamerFilter
   STATE      error remove: hc_Beamer
   TYPE       monitoring
   Readings:
     2017-05-09 13:29:11   error
     2017-05-09 13:29:11   state           error remove: hc_Beamer
   Powermap:
   Readingsdesc:
     Pm_consumption:
       rtype      w
     Pm_energy:
       rtype      whr
Attributes:
   errorFuncAdd {return 1
   if(ReadingsVal($name, "pulseTimeOverall", 0) >=
        ReadingsVal($name, "pulseTimeService", 0)
      + eval(AttrVal($SELF, "errorInterval", 0))
      && $addMatch
   );
return;
}
   errorFuncRemove {return unless($removeMatch);
  fhem ("set $name off");

  $name = InternalVal($SELF, "DEF", "") =~ m/([A-Za-z0-9._]+):.*/ ? $1 : $name;

  fhem(
     "setreading $name pulseTimeService "
    .ReadingsVal($name, "pulseTimeOverall", 0)
  );

return 1;
}
   errorInterval 60*60*200
   errorReturn {return unless(@errors);
return "Der Filter vom Beamer muss gereinigt werden.";
}
   room       FHEM
   userattr   errorInterval
   verbose    5
   warningFuncAdd {return}
   warningFuncRemove {return}



Wenn ich das richtig verstehe werden dann aber für den Fall dass ich beispielsweise 2 Beamer damit überwache  und beide im Error-Reading stehen auch beide wieder raus geworfen, oder? Sprich eine Zuordnung vom Auslösenden Device und dem Error-Device ist nicht möglich, oder? (Ist jetzt auch keine Anforderung von mir, ist mir nur gerade in den Sinn gekommen)
Wobei es rein logisch ja auch sinn macht, wenn beide im Error sind auch beide zu reinigen?!

Gruß Michael
Wissen ist Macht.
Ich weiß nix.
Macht nix.