Das Wochenende ist vorbei und ich bin an meinen rudimentären Kenntnissen gescheitert: SYSMON liefert verschiedene Angaben in einem durch Kommas und Doppelpunkte gegliederten String, zum Beispiel:
Total: 973.61 MB, Used: 77.80 MB, 7.99 %, Free: 895.81 MB
Nun möchte ich am liebsten mit einem Einzeiler oder einem RegEX die dritte Angabe, also zwischen 2. und 3. Komma auswerten um einen automatischen Alert auszulösen, wenn ein Grenzwert überschritten ist (THRESHOLD scheint mir da perfekt).
Nur: wie extrahiere ich die 7.99 %?
Ich kann nicht mit fester Position z.B. von 34. bis 43. Position arbeiten, da die Angaben je nach Dezimalstellen "verrutschen".
Mit RegEXs á la /,a*(...)/g kriege ich Kommas markiert, aber dann wird es bei offenbar zu dünn, alles weitere, was ich probierte, klappte nicht.
Schenkt mir jemand aus seinem Erfahrungsschatz einen Ansatz?
Christian
Man könnte "split" mit Regex ", " nehmen und dann auf Arrayelement 2 zugreifen: http://perlmaven.com/perl-split (unter Slice on the fly)
Wenn du nur nach Leerzeichen splittest bekommst du als Arrayelement 6 deine 7.99.
Nebenbei: Erzeugt SYSMON für dieses Reading keinen Event? Falls Event, wäre der Weg über EVTPARTx wohl überdenkenswert.
Zitat von: stromer-12 am 20 Juli 2015, 22:16:19
Wenn du nur nach Leerzeichen splittest bekommst du als Arrayelement 6 deine 7.99.
Oder suche Dezimalzahl mit Leer- und Prozentzeichen
if ($string=~ /((\d+(\.\d+)?)*) \%/) {
print ("$1\n");
}
Gruß
Damian
kirkan und Damian: Euch allen ganz herzlichen Dank für Eure hilfreichen Vorschläge.
Auf die in FHEM ja vorhandene Zerlegemöglichkeit für Events mit $EVTPART1....$EVTPARTN hätte ich selbst kommen sollen!
Damians REGEX funktioniert ebenfalls prima (und wieder ein DOIF mehr :-))
Christian
Kannst du mal
Das fertige Posten??? Mfg
Gesendet von meinem Z30 mit Tapatalk
Als Beispiel:
define N_RAM notify SYSMON_Device:ram.* IF ($EVTPART7>30) ({DebianMail('Name@provider.de','Speicherwarnung PI','Ram ist zu '.$EVTPART7 ."% ausgelastet")})
An 7. Stelle steht bei ram die Prozentangabe für die Speicherauslastung, bei root ebenfalls bezüglich der Plattenbelegung.
Christian
Hallo Christian, hallo Damian,
ihr hattet ja auch von DOIF gesprochen. Ich bin großer Doif-Fan und würde es gerne mit EVTPART7 von fs_root (von sysmon) lösen.
Leider weiß ich nicht, ob und wie EVTPART7 in einer DOIF-Anweisung funktioniert. Habt ihr eine Idee?
Gruß, zYloriC
Zitat von: zYloriC am 22 Oktober 2015, 15:34:38
Hallo Christian, hallo Damian,
ihr hattet ja auch von DOIF gesprochen. Ich bin großer Doif-Fan und würde es gerne mit EVTPART7 von fs_root (von sysmon) lösen.
Leider weiß ich nicht, ob und wie EVTPART7 in einer DOIF-Anweisung funktioniert. Habt ihr eine Idee?
Gruß, zYloriC
EVTPART gibt es in DOIF nicht, dafür
undocumented Feature in DOIF für die harten Fälle: ;)
z. B.
DOIF ([dein_device:Total:[((\d+(\.\d+)?)*) \%]] >30 ) (set bla [dein_device:Total:[((\d+(\.\d+)?)*) \%]])
Gruß
Damian
Funktioniert sehr gut.
Hey Damian und alle anderen,
danke für deinen Hinweis.
Ich habe Folgendes probiert, aber leider funktioniert es nicht:
define doif_fs_root DOIF ([sysmon:Total:[((\d+(\.\d+)?)*) \%]] >60 ) (set fR_push_App message "ALARM: rPi SD voll!! [sysmon:Total:[((\d+(\.\d+)?)*) \%]]")
Mein SYSMON Modul heißt "sysmon". Das reading zur Belegung der SD heißt "fs_root". Muss ich das oben noch irgendwie einbauen, damit es funktioniert?
[sysmon:fs_root:Total:[( ... hat nciht geklappt.
"Total" ist ja der Beginn des Sting vom Reading [sysmon:fs_root], bei mir jedenfalls ;)
Bin für kleine Hinweise sehr dankbar!!
Gruß, zYloriC
Zitat von: zYloriC am 31 Oktober 2015, 11:33:46
Hey Damian und alle anderen,
danke für deinen Hinweis.
Ich habe Folgendes probiert, aber leider funktioniert es nicht:
define doif_fs_root DOIF ([sysmon:Total:[((\d+(\.\d+)?)*) \%]] >60 ) (set fR_push_App message "ALARM: rPi SD voll!! [sysmon:Total:[((\d+(\.\d+)?)*) \%]]")
Mein SYSMON Modul heißt "sysmon". Das reading zur Belegung der SD heißt "fs_root". Muss ich das oben noch irgendwie einbauen, damit es funktioniert?
[sysmon:fs_root:Total:[( ... hat nciht geklappt.
"Total" ist ja der Beginn des Sting vom Reading [sysmon:fs_root], bei mir jedenfalls ;)
Bin für kleine Hinweise sehr dankbar!!
Gruß, zYloriC
Ich ging davon aus, dass das Reading "Total" heißt. Wenn das Reading "fs_root" heißt, dann musst du entsprechend
[sysmon:fs_root:[((\d+(\.\d+)?)*) \%]]
angeben.
Gruß
Damian
Oh sorry, dass mit "fs_root" habe ich vergessen oder missverständlich ausgedrückt....
Wie kann ich den Ausdruck/Filter denn mit der fhem Command-Line testen??
Bei
{[sysmon:fs_root:[((\d+(\.\d+)?)*) \%]]}
bekomme ich immer
Zitatsyntax error at (eval 35808) line 1, near "sysmon:"
Missing right curly or square bracket at (eval 35808) line 2, at end of line
Irgendwie komisch ;)
Gruß, zYloriC
Zitat von: zYloriC am 31 Oktober 2015, 14:50:48
Oh sorry, dass mit "fs_root" habe ich vergessen oder missverständlich ausgedrückt....
Wie kann ich den Ausdruck/Filter denn mit der fhem Command-Line testen??
Bei
{[sysmon:fs_root:[((\d+(\.\d+)?)*) \%]]}
bekomme ich immer
Irgendwie komisch ;)
Gruß, zYloriC
gar nicht - es ist DOIF-Syntax mit einem preprocessor für regexp.
Gruß
Damian
Kann man das nicht hier testen?
http://www.regexr.com/ (http://www.regexr.com/)
Expression
/((\d+(\.\d+)?)*) \%/g
Text
Total: 108115 MB, Used: 16902 MB, 17 %, Available: 85699 MB at
Ergibt 1 match.
/ und /g werden unter flags / global gesetzt.
MfG
Zitat von: Ralf W. am 31 Oktober 2015, 17:29:39
Kann man das nicht hier testen?
http://www.regexr.com/ (http://www.regexr.com/)
Expression
/((\d+(\.\d+)?)*) \%/g
Text
Total: 108115 MB, Used: 16902 MB, 17 %, Available: 85699 MB at
Ergibt 1 match.
/ und /g werden unter flags / global gesetzt.
MfG
Klar, wenn man weiß, was zum DOIF gehört und was nicht.
Man kann es aber auch gleich einbauen und sich freuen, getestet habe ich bereits ;)
Gruß
Damian
Hallo Damian,
Zitat von: Damian am 31 Oktober 2015, 18:16:50
Klar, wenn man weiß, was zum DOIF gehört und was nicht.
Logo!
Darf ich mal fragen, warum das undokumentiert?
MfG
Zitat von: Ralf W. am 31 Oktober 2015, 18:23:09
Hallo Damian,
Logo!
Darf ich mal fragen, warum das undokumentiert?
MfG
Es steht noch rudimentär in der englischen Commandref zum FHEM-IF-Befehl und da hat seit zwei Jahren keiner danach gefragt. Das Konzept des Moduls ist es, möglichst einfach zu sein und weniger kryptisch - regexp ist das nicht. Es ist, wie ich schon geschrieben habe, eine Hintertür für besondere Fälle. Auf der anderen Seite habe ich für häufige Filterungsanliegen Buchstaben vorgesehen. Es ist bisher beim "d" geblieben für das Filtern nach Zahlen. Zukünftig können auch andere Sachen dazukommen, die häufig angefragt werden. Wenn die Verbreitung des Moduls weiter so zunimmt, wie bisher und mehr ausgefallene Sachen angefragt werden, kann ich irgendwann für Freaks auch dieses Features vollständig dokumentieren.
Gruß
Damian
Hallo Damian,
danke. Mir reicht es, zu wissen das es das gibt. Mal sehen, vielleicht kann ich das gebrauchen, da ich gerade dabei bin das ganze "Gewurschtel" aus der Anfangszeit mit notify, at, watchdog auf DOIF umzustellen. Dadurch wird alles viel übersichtlicher und ich habe auch schon Fehler gefunden. Aber das gehört nicht hier hin und soll auch jetzt gut sein.
MfG