Hallo,
ich splite aktuell folgendes reading:
stat_cpu_percent
1.23 0.00 0.31 98.42 0.01 0.00 0.03
mit folgendem userReading
Cpu_Prozent {round(100 - (split ' ',ReadingsVal("sysmon","stat_cpu_percent",0))[3],1)}
Das funktioniert auch.
Jetzt möchte ich ein weiteres reading im device sysmon spliten
dieses reading:
fs_root
Total: 14846 MB, Used: 6917 MB, 50 %, Available: 7156 MB at /
ich möchte gerne den letzten Wert 7156 MB in ein neues reading mit dem namen Speicher reinschreiben.
folgendes habe ich versucht,funktioniert aber nicht
Cpu_Prozent {round(100 - (split ' ',ReadingsVal("sysmon","stat_cpu_percent",0))[3],1)},
Speicher { (split ' ',ReadingsVal("sysmon","fs_root",0))[2],1)}
"funktioniert aber nicht" ist keine Fehlerbescgreibung.
Was genau steht denn statt dessen oder steht nicht?
Ja klar, das steht drin
Speicher
Error evaluating sysmon userReading Speicher: syntax error at (eval 375664) line 1, near "1)"
Auf die Schnelle fällt mir ein: Schau mal in die svg Files SM_DB_ usw (Edit Files)
Da stehen die regExp drin für den Sysmon wenn man in DBLog loggt. So in der Art:
$val=~s/^T:\s([-\d.]+).*H:\s([-\d.]+)/$1/eg
Damit testen auf regex101.com , damit bekommst Du das hin.
Hier (https://heinz-otto.blogspot.com/2019/10/file-log-und-gut.html)hab ich mir das mal aufgeschrieben.
Edit: So wäre der richtige Suchstring
s/.*Available:\s([-\d.]+)/$1/eg
In $1 steht Dein Wert
Gruß Otto
also so?
Speicher { (split ' s/.*Available:\s([-\d.]+)/$1/eg',ReadingsVal("sysmon","fs_root",0))[2],1)}?
nein, hat eigentlich nix mit split zu tun... Ob das funktioniert?
Eher so, ich hab es nicht probiert!!!
{my $val = ReadingsVal("sysmon","fs_root",0); $val=~s/.*Available:\s([-\d.]+)/$1/eg}
Edit:
So kann ich das auf FHEM Kommandozeile testen: Achtung bei mir root bei Dir fs_root!
{my $val = ReadingsVal("sysmon","root",0);; $val=~s/.*Available:\s([-\d.]+)/$1/eg;;return $1}
Oder kürzer:
(ReadingsVal("sysmon","fs_root",0) =~ "Available:.(.*MB).*")[0]
ok, da steht auch MB mit drin, das ist besser :)
Ich bin nicht so fit
Edit:
So kann ich das auf FHEM Kommandozeile testen: Achtung bei mir root bei Dir fs_root!
{my $val = ReadingsVal("sysmon","root",0);; $val=~s/.*Available:\s([-\d.]+)/$1/eg;;return $1}
[/quote]
Ja damit bekomme ich den Wert, aber ich würde das gerne mit userreding machen. da ich ja schon eins hab. Ich dachte das das zweite auch so ähnlich wäre. ich weis jetzt nicht was ich in dem userreading reinschreiben soll.
Zitat von: crusader am 07 Februar 2020, 22:07:10
Oder kürzer:
(ReadingsVal("sysmon","fs_root",0) =~ "Available:.(.*MB).*")[0]
und wie kombiniere ich das in userReadings damit er ein neues reading mit dem namen Speicher erzeugt und den Wert reinschreibt?
Genau so wie Du es in Deinem ersten Beitrag beschrieben hast, also hinter den Namen des Userreadings.
Übrigens kannst Du auch Ottos Vorschlag komplett in die Perl-Klammern des Userreadings setzen.
folgendes hab ich probiert mit Ottos code
Cpu_Prozent {round(100 - (split ' ',ReadingsVal("sysmon","stat_cpu_percent",0))[3],1)},
Speicher {my $val = ReadingsVal("sysmon","fs_root",0);; $val=~s/.*Available:\s([-\d.]+)/$1/eg;;return $1}
funktioniert
Weil dein reading fs_root heisst. Hat Otto doch extra geschrieben.
Ja mist, hab ich gerade gemerkt, jetzt tuts. Super
ich danke dir crusader
ich danke dir Otto
:)
ein Userreading ist doch nix weiter als ein Stück Perlcode {} und ein Name davor :)
Nur in der Kommandozeile muss man die ; doppelt machen, in der DEF vom userreadings reicht eins. In der Raw Def müssen es wieder zwei sein :)
Also geht auch
Speicher {(ReadingsVal("sysmon","fs_root",0) =~ "Available:.(.*MB).*")[0]}
da hat man das Problem mit den ; nicht :)