Modul 98_monitoring zur Überwachung von Geräten

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

Vorheriges Thema - Nächstes Thema

igami

Zitat von: mrbreil am 11 Juni 2018, 11:13:49
Nehmen wir z.B. ein AMAD Device ohne jedes event-on-.. Attribut.
Nach einem "set Activity_monitoring clear all" landet dieses und jedes weitere Device welches ein Event erzeugt sofort auf der Warning und Error Liste.
Wo ist mein Denkfehler?
Das kann ich dir leider nicht sagen. Habe es gerade per copy & paste in mein FHEM übernommen und bei den Devices wird gewartet:

setstate Activity_monitoring 2018-06-11 17:38:21 errorAdd_global 2018-06-12 17:38:21
setstate Activity_monitoring 2018-06-11 17:38:21 warningAdd_global 2018-06-12 05:38:21

Gibt es irgendwelche Hinweise im Log (ggf. mit verbose 5)?
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

ToM_ToM

Hey igami,

kurzes Feedback zu meinen Pflanzenmonitor. Habe es nun ein paar Tage beobachtet und getestet. Es läuft jetzt seit dem Update wie es soll. :)

Vielen Dank!
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

mumpitzstuff

Wie sieht denn der Pflanzenmonitor aus? Würde mich interessieren...

ToM_ToM

#183
Meine Pflanzen heißen alle Pflanze_01 bis Pflanze_08. Den korrekten Pflanzennamen zur Unterscheidung vergebe ich über den Alias.

Das ist mein alter Pflanzenmonitor um den es hier ging, der Alarm schlägt sobald die Pflanze eine Bodenfeuchte von weniger als 10% erreicht.


defmod Flower_monitoring monitoring Pflanze_0?[0-9]*:moisture:.(1?[0-9])$ Pflanze_0?[0-9]*:moisture:.1?([2-9][0-9]|00)
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))\
}


Den habe ich jedoch heute geringfügig umgebaut, da die Pflanzen ja durchaus unterschiedliche Bodenfeuchten benötigen.

So sind die Pflanzen definiert:

defmod Pflanze_07 XiaomiBTLESens XX:XX:XX:XX:XX:XX
attr Pflanze_07 alias Gasteria
attr Pflanze_07 disabledForIntervals 21:00-24:00 00:00-06:00
attr Pflanze_07 interval 3600
attr Pflanze_07 maxFertility 1000
attr Pflanze_07 maxLux 30000
attr Pflanze_07 maxMoisture 50
attr Pflanze_07 maxTemp 35
attr Pflanze_07 minFertility 300
attr Pflanze_07 minLux 3500
attr Pflanze_07 minMoisture 7
attr Pflanze_07 minTemp 5
attr Pflanze_07 model flowerSens
attr Pflanze_07 room FlowerSens
attr Pflanze_07 userReadings moistureFeeling:moisture.* {\
if (ReadingsVal($name, "moisture", -1) < AttrVal($name, "minMoisture", 0)) {\
return "too dry";;\
}\
elsif (ReadingsVal($name, "moisture", -1) > AttrVal($name, "maxMoisture", 100)) {\
return "too wet";;\
}\
else {\
return "good";;\
}\
}


Hier der neue Monitor:

defmod Flower_monitoring monitoring Pflanze_0?[0-9]*:moistureFeeling:.(too.dry|too.wet)$ Pflanze_0?[0-9]*:moistureFeeling:.(good)
attr Flower_monitoring DbLogExclude .*
attr Flower_monitoring errorReturn {return unless(@errors);;\
@errors = sort {lc($a) cmp lc($b)} @errors;;\
my $tooDryCount = 0;;\
my $tooDryFlowers = "";;\
my $tooWetCount = 0;;\
my $tooWetFlowers = "";;\
foreach(@errors) {\
my $alias = AttrVal($_, "alias", $_);;\
if (ReadingsVal($_,"moistureFeeling", "good") eq "too dry") {\
$tooDryCount += 1;;\
$tooDryFlowers += $alias +", ";;\
}\
elsif (ReadingsVal($_,"moistureFeeling", "good") eq "too wet") {\
$tooWetCount += 1;;\
$tooWetFlowers += $alias +", ";;\
}\
}\
\
my $returnText = "";;\
if ($tooDryCount == 1) {\
$returnText = $returnText . "Die Pflanze " . substr($tooDryFlowers, 0, length($tooDryFlowers)-2) . " ist schon völlig verdurstet und braucht dringend Wasser. ";;\
}\
elsif ($tooDryCount > 1) {\
$returnText = $returnText . "Die folgenden " . $tooDryCount . " Pflanzen sind schon völlig vertrocknet und brauchen dringend Wasser: " . $tooDryFlowers . ". ";;\
}\
if ($tooWetCount == 1) {\
$returnText = $returnText . "Die Pflanze " . substr($tooDryFlowers, 0, length($tooDryFlowers)-2) . " steht immer noch viel zu nass und droht schon zu faulen.";;\
}\
elsif ($tooWetCount > 1) {\
$returnText = $returnText . "Die folgenden " . $tooWetCount . " Pflanzen stehen immer noch viel zu nass und drohen zu faulen: " . $tooWetFlowers . ". ";;\
}\
return $returnText;;\
}
attr Flower_monitoring errorWait 60*60*24*7
attr Flower_monitoring group Monitoring
attr Flower_monitoring room FlowerSens
attr Flower_monitoring warningReturn {return unless(@warnings);;\
@warnings = sort {lc($a) cmp lc($b)} @warnings;;\
my $tooDryCount = 0;;\
my $tooDryFlowers = "";;\
my $tooWetCount = 0;;\
my $tooWetFlowers = "";;\
foreach(@warnings) {\
my $alias = AttrVal($_, "alias", $_);;\
if (ReadingsVal($_,"moistureFeeling", "good") eq "too dry") {\
$tooDryCount += 1;;\
$tooDryFlowers .= $alias .", ";;\
}\
elsif (ReadingsVal($_,"moistureFeeling", "good") eq "too wet") {\
$tooWetCount += 1;;\
$tooWetFlowers .= $alias .", ";;\
}\
}\
\
my $returnText = "";;\
if ($tooDryCount == 1) {\
$returnText = $returnText . "Die Pflanze " . substr($tooDryFlowers, 0, length($tooDryFlowers)-2) . " bekommt langsam Durst und müsste mal gegossen werden. ";;\
}\
elsif ($tooDryCount > 1) {\
$returnText = $returnText . "Die folgenden " . $tooDryCount . " Pflanzen bekommen langsam Durst und müssten mal gegossen werden: " . $tooDryFlowers . ". ";;\
}\
if ($tooWetCount == 1) {\
$returnText = $returnText . "Die Pflanze " . substr($tooDryFlowers, 0, length($tooDryFlowers)-2) . " steht viel zu nass.";;\
}\
elsif ($tooWetCount > 1) {\
$returnText = $returnText . "Die folgenden " . $tooWetCount . " Pflanzen stehen viel zu nass: " . $tooWetFlowers . ". ";;\
}\
return $returnText;;\
}


Der Neue meldet aktuell auch "zu trocken" wenn die Pflanzen eig. zu feucht sind. Für dieses Thema muss ich mir noch was einfallen lassen wie ich das abbilde.
Der Monitor mit korrekter Unterscheidung zwischen zu trocken und zu nass. Allerdings nur von mir eben zusammengeschrieben und aktuell noch ungetestet.
Hardware: BananaPi, Busmaster CUL, SanDisk 16GB Ultra SD, 16 GB USB-Stick | Software: Armbian, FHEM 5.8

mumpitzstuff


meier81

Hallo und schönen Abend,

vielleicht kann mir ja jemand weiterhelfen. Hab das Modul jetzt auch als Ersatz für das 98_DeviceMonitor eingesetzt und funktioniert auch soweit gut. Ist wie folgt konfiguriert:


define 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=.+

define ny_DeviceMonitor notify DeviceMonitor:error.(add|remove):..+ {\
  $EVENT =~ m/error (add|remove): (.+)/;;\
  readingsSingleUpdate(\
  $defs{$2}, "Activity", $1 eq "add" ? "dead" : "alive", 0);;\
  return;;\
}

define di_AlarmDeviceStatus DOIF ([":Activity: dead"] and [08:00-22:00])\
   (set Telegram message @411***976 ❗️ Das Gerät +++ $DEVICE +++ meldet sich nicht mehr)\
DOELSEIF ([":Activity: alive"] and [08:00-22:00])\
   (set Telegram message @411***976 ✔ Das Gerät +++ $DEVICE +++ meldet sich wieder)
attr di_AlarmDeviceStatus do always


Habe das DOIF aus folgendem Post benutzt:

Zitat von: friesenjung am 12 Mai 2017, 22:20:32
Hi und sorry für die späte Rückmeldung...

Also eigentlich meinte ich damit nichts besonderes. Nur dieses kleine DOIF

defmod DI_AlarmDeviceStatus DOIF ([":Activity: dead"] and [?$SELF:B_$DEVICE] ne "dead") (set Pushover msg 'Device-Alarm' 'Das Gerät +++ $DEVICE +++ meldet sich nicht mehr!' 'iPhone6s' 0 '', setreading $SELF B_$DEVICE dead)\
DOELSEIF ([":Activity: alive"] and [?$SELF:B_$DEVICE] ne "alive") (setreading $SELF B_$DEVICE alive)
attr DI_AlarmDeviceStatus DbLogExclude .*
attr DI_AlarmDeviceStatus do always
attr DI_AlarmDeviceStatus group Benachrichtigung
attr DI_AlarmDeviceStatus room 9.1_Steuerung


Das reagiert sowohl auf das Activity eines Homematic-Devices, als auch bspw. auf die durch das monitoring-Modul überwachten Lacrosse-Sensoren.

Hoffe das beantwortet Deine Frage...

VG...

Habe aber das Problem das nur alive-Nachrichten geschickt werden, die dead-Nachrichten funktionieren nicht. Das notify funktioniert auch und trägt den Activity-Status am Device auch richtig ein. Jetzt meine Frage kann es sein das der dead-Eintrag nicht triggert? Hab mittlerweile keine Ahnung mehr wo das Problem liegen sollte, vielleicht hat ja von euch noch jemand eine Idee.

Gruß

Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

igami

Zitat von: meier81 am 21 Juli 2018, 22:00:04
Jetzt meine Frage kann es sein das der dead-Eintrag nicht triggert?
Deine Vermutung ist richtig, das setzen des Activity Readings löst kein Event aus.
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

meier81

Ist es möglich das notify so umzubauen das das setzen und rücksetzen des Activity readings einen event auslöst? Falls nicht was müsste ich denn beim doif ändern?

Gruß Markus
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

igami

Ja, das ist möglich, dann würde es aber wieder auf alive springen, da das Gerät ja wieder ein Event sendet :D
Es gilt also das monitoring umzubauen, sodass es nicht auf Activity reagiert.
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

igami

#189
Ich hatte damit schon angefangen:

defmod global_Monitoring_DeviceActivity monitoring ^[^:]+:(?!Activity).+$
attr global_Monitoring_DeviceActivity errorWait AttrVal($name, "ActivityTimeout", 60*60*6)
attr global_Monitoring_DeviceActivity whitelist ActivityTimeout=.+
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

meier81

Na dann sag ich doch mercy für die Hilfe, werde schauen ob ich das heute morgen noch eingebaut und getestet bekomme, bin dann nämlich mal 2 Tage weg.

Ich sag auch jeden Fall Bescheid was als Ergebnis rauskam.

Gruß

Markusd
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

igami

Beim notify müsste dann nur noch die 0 durch eine 1 ersetzt werden.
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

meier81

So kam heute mal zum testen deiner Änderung:

Zitat von: igami am 22 Juli 2018, 07:48:27
Ich hatte damit schon angefangen:

defmod global_Monitoring_DeviceActivity monitoring ^[^:]+:(?!Activity).+$
attr global_Monitoring_DeviceActivity errorWait AttrVal($name, "ActivityTimeout", 60*60*6)
attr global_Monitoring_DeviceActivity whitelist ActivityTimeout=.+


muß leider berichten das nach der Änderung jetzt gar nichts mehr passiert, habe zum testen bei einem neuen Fühler die Überwachungszeit gesetzt und es wird kein errorAdd-Eintrag im monitoring-Modul hinzugefügt. Habe im notify auch die 0 gegen eine 1 getauscht, ist ja aber erstmal nicht relevant bei dem Problem.
Hier mal meine COnfig zur Sicherheit:

define DeviceMonitor monitoring ^[^:]+:(?!Activity).+$
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=.+


Hast du noch eine Idee wo da der Fehler steckt? Bei dem regex Ausdruck hört bei mir nämlich der Horizont auf (leider). Ich glaube damit muß ich mich aber mal auseinandersetzen in Zukunft das ich das auch mal verstehe.
QNAP NAS mit Debian VM, darauf FHEM, debmatic, influxdb2 und Grafana || HB-RF-ETH || SIGNALduino 433MHz mit Maple mini || WS980 Wetterstation || Xiaomi Mi Robot mit valetudo-FW || Buderus web KM100 || div. Tasmota-Devices

ToM_ToM

Hallo igami,

da scheint sich ein Bug in deinem Modul eingeschlichen zu haben.

Meinen Fehler habe ich hier beschrieben:
https://forum.fhem.de/index.php/topic,89546.0.html#top

und folgenden Hinweis erhalten:

ZitatDas Modul 98_monitoring.pm setzt NOTIFYDEV selbst, und erzeugt dabei einen falschen Regexp.
Der empfohlene Weg ist die vom FHEM Framework bereitgestellte notifyRegexpChanged Funktion zu verwenden.

Könntest du dir das bitte mal anschauen?

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

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