FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: cwagner am 20 Juli 2015, 06:52:02

Titel: [Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: cwagner am 20 Juli 2015, 06:52:02
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
Titel: Antw:Zerlegen eines Readings von SYSMON
Beitrag von: krikan am 20 Juli 2015, 22:00:02
Man könnte "split" mit Regex ", " nehmen und dann auf Arrayelement 2 zugreifen: http://perlmaven.com/perl-split (unter Slice on the fly)
Titel: Antw:Zerlegen eines Readings von SYSMON
Beitrag von: stromer-12 am 20 Juli 2015, 22:16:19
Wenn du nur nach Leerzeichen splittest bekommst du als Arrayelement 6 deine 7.99.
Titel: Antw:Zerlegen eines Readings von SYSMON
Beitrag von: krikan am 20 Juli 2015, 22:34:53
Nebenbei: Erzeugt SYSMON für dieses Reading keinen Event? Falls Event, wäre der Weg über EVTPARTx wohl überdenkenswert.
Titel: Antw:Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 20 Juli 2015, 22:49:01
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
Titel: Antw:Zerlegen eines Readings von SYSMON
Beitrag von: cwagner am 20 Juli 2015, 23:02:28
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: DJ_SAMMY190 am 21 Juli 2015, 16:18:37
Kannst du mal
Das fertige Posten??? Mfg

Gesendet von meinem Z30 mit Tapatalk

Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: cwagner am 22 Juli 2015, 21:50:35
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag 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

Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 22 Oktober 2015, 21:40:28
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: cwagner am 23 Oktober 2015, 22:46:00
Funktioniert sehr gut.
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag 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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 31 Oktober 2015, 12:37:43
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag 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
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 31 Oktober 2015, 16:46:18
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag 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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 31 Oktober 2015, 18:16:50
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Ralf W. am 31 Oktober 2015, 18:23:09
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Damian am 31 Oktober 2015, 18:43:30
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
Titel: Antw:[Gelöst] Zerlegen eines Readings von SYSMON
Beitrag von: Ralf W. am 31 Oktober 2015, 19:23:51
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