[Gelöst] Zerlegen eines Readings von SYSMON

Begonnen von cwagner, 20 Juli 2015, 06:52:02

Vorheriges Thema - Nächstes Thema

cwagner

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
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

krikan

Man könnte "split" mit Regex ", " nehmen und dann auf Arrayelement 2 zugreifen: http://perlmaven.com/perl-split (unter Slice on the fly)

stromer-12

Wenn du nur nach Leerzeichen splittest bekommst du als Arrayelement 6 deine 7.99.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

krikan

#3
Nebenbei: Erzeugt SYSMON für dieses Reading keinen Event? Falls Event, wäre der Weg über EVTPARTx wohl überdenkenswert.

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

#5
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
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

DJ_SAMMY190

Kannst du mal
Das fertige Posten??? Mfg

Gesendet von meinem Z30 mit Tapatalk

FHEM auf Raspberry Pi 2 b mit Homematic Komponenten

cwagner

#7
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
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

zYloriC

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


Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

zYloriC

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

zYloriC

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

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF