Modul 98_monitoring zur Überwachung von Geräten

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

Vorheriges Thema - Nächstes Thema

ToM_ToM

ZitatIch würde gerne auch den Raum, in dem das gemeldete Gerät ist, in die Meldung mit aufnehmen.
Das finde ich auch ziemlich interessant :)
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

clumsy

Hallo..

Ich versuche schon seit Stunden den <remove Event> so zu definieren, dass auch ein "attr <ueberwachtes device> disable 1" das entsprechende Device aus der Error und Warning Liste entfernt.
Sowas wie:
defmod mon_device monitoring device_.*:presence:.*absent device_.*:(presence.*present)|(disable.*)
nur leider funktioniert das nicht (weder so noch in den 100 Varianten die ich versucht habe ;)

Wenn ich beim blacklist Attribut ein
device_.*:FILTER=disable=
einbaue dann werden zwar devices die bereits disabled sind ignoriert und aus der Liste gelöscht, jedoch nur beim attribut setzen, danach (dynamisch) nicht mehr, d.h. wenn das disable später gesetzt wird...

kann mir da jemand helfen?

igami

Zitat von: clumsy am 08 März 2018, 23:21:56
kann mir da jemand helfen?
Ich weiß wie es funktioniert, die Umsetzung ist aber mit etwas Mühe verbunden:

Guck mal in deinen Event monitor, wenn du das disable Attribut setzt. Dann wird dir auffallen, dass das Event vom global device ausgeht und inetwa so lautet: "global ATTR <name> disable 1".
Folglich muss das monitoring auch auf global horchen.
Dann muss das ganze in der errorFuncRemove noch auf das eigentliche device gemappt werden.
Für meine DashButtons sieht das so aus:

{
  ($name) = ($event =~ m/^(.+):/g);
 
  return 1;
}

Hier kommt nun die Mühe, die Syntax so anzupassen, dass es funktioniert.
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

clumsy

Danke erstmal für den Tip, werd mir das mal genauer ansehen...

Müsste das aber eigentlich nicht im Modul selbst abgehandelt werden? Ich weiss nur dass andere Module (z.b. structure) "korrekt" darauf reagieren, d.h. das entsprechende Device aus der Struktur entfernen, resp. nicht mehr beachten für den Status.

Ist nur als Anregung gemeint, nicht als Kritik! Das monitoring Modul sonst ist (für meine Zwecke) super! Habs leider erst diese Woche entdeckt als ich meine Variante der Geräteüberwachung umbauen/erweitern wollte..

clumsy

#154
komm nicht weiter... ich schaffs schon nicht einen removeEvent zu definieren welcher auf das disable reagiert, egal ob global oder im device...

wenn ich das device mit attr ... disable 1 deaktiviere erhalte ich im monitor:
ESPEasy wemos_mini_11_nfx disabled
Global global ATTR wemos_mini_11_nfx disable 1


also generiert das device selbst einen event beim disable... nur wie kriege ich den korrekt in die definition?

im removeEvent habe ich im moment:
wemos_.*:(presence.*present|disabled)

schonmal danke im voraus...

nachtrag:
wenn ich zusätzlich ein notify mache mit:
defmod not_wemos_disabled notify wemos_.*:disabled set mon_wemos_presence errorRemove $NAME
dann wird das bei einem disable korrekt ausgeführt und löscht das device aus der error Liste....


ToM_ToM

ZitatHmm, ich sehe grade, dass meine Vermutung auf dich nicht zutreffen kann, da du kein warningWait verwendest.
Muss ich mir doch noch mal genau ansehen.

Hi igami, konntest du schon etwas wegen meines Pflanzenmonitor herausfinden (Warning wird auf Error kopiert statt verschoben)?

Anbei nochmal der Code:

defmod Flower_monitoring monitoring Pflanze_0?[0-9]*:moisture:.(1?[0-9])$ Pflanze_0?[0-9]*:moisture:.(1?[2-9][0-9])
attr Flower_monitoring DbLogExclude .*
attr Flower_monitoring errorReturn {return unless(@errors);;\
$_ = AttrVal($_, "alias", $_) foreach(@errors);;\
return("Die Pflanze \"$errors[0]\" ist sehr durstig und vertrocknet bald.") if(int(@errors) == 1);;\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
return(join("\n - ", "Die folgenden ".@errors." Pflanzen sind sehr durstig und vertrocknen bald: ", @errors))\
}
attr Flower_monitoring errorWait 60*60*24*7
attr Flower_monitoring group Monitoring
attr Flower_monitoring room FlowerSens
attr Flower_monitoring userReadings warning_count:warning.+ {split(",", ReadingsVal($name, "warning", ""))}, \
error_count:error.+ {split(",", ReadingsVal($name, "error", ""))}, \
all_count:(warning.+|error.+) {split(",", ReadingsVal($name, "warning", "")) + split(",", ReadingsVal($name, "error", ""))}
attr Flower_monitoring warningReturn {return unless(@warnings);;\
$_ = AttrVal($_, "alias", $_) foreach(@warnings);;\
return("Die Pflanze \"$warnings[0]\" bekommt langsam Durst und müsste mal gegossen werden.") if(int(@warnings) == 1);;\
@warnings = sort {lc($a) cmp lc($b)} @warnings;;\
return(join("\n - ", "Die folgenden ".@warnings." Pflanzen bekommen langsam Durst und müssten mal gegossen werden: ", @warnings))\
}


VG, Thomas
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

raiderxxl

#156
Hallo Tolles Modul ! Habs auch gleichmal eingebunden (Die Zwei Vorschläge Monitoring und Batterie) :-)
Eins hab ich mir noch für Lanpings eingerichtet presence absent/present funktioniert alles Tutti!

Nun eine kleine Frage könnte mir jemand Helfen beim erstellen einer Temperaturüberwachung?
Ich habe im ganzen Haus Sensoren und möchte nun diese auf ungewöhnliche Temperaturen Überwachen.
Also wenn die Temperatur kleiner als 5 (Frostwächter) oder Größer als 50 (Brandalarm) ist...

Vielleicht mit Abstufungen ... Warnung ab 45°C Error ab 50°C und umgekehrt Warnung ab 10°C und Error ab 5°C

Natürlich inkl. Meldung per Push und Lichtan in einem Raum usw...

wie bekomme ich das hin...
FHEM VM Ubuntu-Server auf Intel® NUC-Kit NUC6i5SYH ESXi 6.5
FHEM auf Raspberry2 OSMC Hyperion und TTS

Homematic,TradfriHub und Lampen,WIFILight,Fritzbox,FritzDECT,NanoCul433,IT Steckdosen,Diverse Nachbar-Sensoren,XiaomiZigbee,
ESP_Signalduino,ESPEasy,Amad,HarmonyHub,WLED,MQTT,Tasmota....

igami

Habe mich nun schon lange nicht mehr gemeldet, aber dieses Wochenende setze ich mich da mal wieder dran!
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

choetzu

Super modul! Ein tolles Ostenest hab ich da gefunden :)
Kann man das Reading warning oder error mit Umbruch darstellen anstelle von , ?
Raspi3, EnOcean, Zwave, Homematic

moonsorrox

Ich setze das Modul noch nicht ein, meine Frage gibt es in dem Modul ein reading was einfach nur zählt, z.B. Batterieüberwachung 1 Gerät  das es eine 1 anzeigt oder 2 Geräte eben eine 2..?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Reinerlein

#160
Hi igami,

danke für das Modul. Ich bin gerade dabei mein System damit auszustatten.

Dabei habe ich mir für meine Bequemlichkeit das Modul etwas angepasst:
Ich habe mir ein globales "userAttr" geschaffen: "ActivityTimeout".
Wenn ich jetzt an einem Device dieses Attribut auch setze, soll der dafür zuständige Aktivitätsmonitor dieses Device entsprechend überwachen.

Dafür ist es notwendig, dass man beim Definieren des Monitors nicht nur eine AddRegex angeben kann, sondern auch eine DevSpec für das Device.
Ich habe das (zunächst mal nur für den AddRegex-Teil) relativ schlank eingebaut (ab Zeile 279):

  my ($addRegex, $removeRegex) = split(/[\s]+/, InternalVal($SELF, "DEF", ""));
 
  # Hier wird der Device-Teil als DevSpec verarbeitet, und um transparent weitermachen zu können, wird der "alte" $addRegex auf den aktuellen Event-Devicenamen gesetzt
  my ($device, $tail) = split(/:/, $addRegex);
  return unless(exists {map { $_ => 1 } devspec2array($device)}->{$name});
  $addRegex = $name.':'.$tail;
 
  # Hier braucht dann kein Ausstieg für das Device gemacht werden...
  return unless(
    $removeRegex && $removeRegex =~ m/^$name:/
    || $events
  );


Des weiteren habe ich natürlich das Attribut "errorWait" (und auch "warningWait") wie folgt gesetzt:

{ eval(AttrVal($name, 'ActivityTimeout', '24*60*60')) }
Damit kann ich an dem jeweiligen Device auch weiterhin eine Formel reinschreiben, die dann evaluiert wird.
Des Weiteren natürlich die von dir schon beschriebenen Attribute und Activity-Notify am Monitor...

Das wars. Jetzt brauche ich nur noch an jedem gewünschten Device das Attribut setzen, und der Monitor überwacht es...

Für meine einfache Lösung reichte es mir, dass die DevSpec momentan keine Doppelpunkte enthalten kann (da es der Trenner zum Reading/Event ist).
Wenn man das offiziell übernimmt, müsste man das vielleicht noch eruieren und entsprechend erweitern...

Vielleicht kannst du es ja in die offizielle Version bringen...

EDIT: Hier noch die Definition des Monitor-Devices:

defmod global_Monitoring_DeviceActivity monitoring ActivityTimeout=.+:.*
Hatte ich ganz vergessen :)

Grüße
Reinerlein

Reinerlein

Hi igami,

hach, wenn man einmal anfängt :)

Ich habe noch etwas hinzugefügt, was die Perfomance massiv steigern dürfte.

Im Define (bei Zeile 84):

  my ($device, $tail) = split(/:/, $re[0]);
  $hash->{NOTIFYDEV} = $device;
Damit werden bereits nur noch die Events der angegebenen Geräte gemeldet.

Außerdem muss ich mir nochmal die Notify-Funktion anschauen. Ich habe z.B. in meinem Activity-Reading-Setzen-Notify den Aufruf für readingsSingleUpdate mit Trigger auf 1 aufgerufen, damit ich auch auf die Änderung des Reading "Activity" reagieren kann, bzw. dieses Reading in einer Readingsgroup auf der Oberfläche auch per longpoll aktualisiert wird.

Leider ist das natürlich eine Reaktion vom überwachten Device, womit es wieder von der error-Liste heruntergenommen wird :(
Irgendwie muss dieses indirekte Event auch noch unterbunden werden, nur weiß ich noch nicht wie... Vielleicht indem man dieses Reading-Setzen direkt ins Modul verbaut, und damit weiß, dass nicht darauf zu reagieren ist.
Alternativ könnte man natürlich auch den Regex entsprechend anpassen... Wobei ich mich mit diesen Negationen immer sehr schwer tue.
Ein einfaches

(?!Activity)

oder

^(?!Activity)$
geht jedenfalls nicht...

Grüße
Reinerlein


Reinerlein

#163
Hi,

habe es doch noch herausgefunden:

^(?!Activity$)


Bei meiner obigen Definition also:

ActivityTimeout=.+:^(?!Activity$)
Aber das geht so nicht, da intern noch ein "$" angehangen wird...

Grüße
Reinerlein

Reinerlein

Hi igami,

für das Activity-Reading hätte ich jetzt eine Lösung.

Man muss ein neues Attribut einführen, mit dem man dann direkt ein Event blacklisten kann.

Ich hatte es bei mir einfach mal "blacklistRegex" genannt.
Dieses habe ich dann in der Eventverarbeitung als zusätzlichen Überspringer eingebaut:

  my $blacklistRegex = AttrVal($SELF, 'blacklistRegex', '');

  foreach my $event (@{$events}){
    next unless($event);
   
    # Hier das neue Attribut prüfen, um einzelne Readings/Events ausschließen zu können...
    next if ($event =~ m/$blacklistRegex/);
Wenn ich dieses Attribut jetzt mit

^Activity:
belege, kann ich das Setzen dieses Reading mit aktiviertem Event durchführen (und mir daraufhin mit meinem Notify auch eine Nachricht beim Setzen dieses Reading zukommen kann, welches dann auch direkt den Homematic-Actiondetector mit abdeckt).

Wenn man das ganze mal schön umsetzt, dann müsste man vermutlich auch wieder über ein entsprechendes Whitelisting-Attribut nachdenken.
Das wird hier jetzt aber nicht benötigt...

Wie sieht es denn überhaupt aus?
Bist du denn bereit solche Änderungen in die offizielle Version zu übernehmen?

Danke schon mal...

Grüße
Reinerlein