FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: roemi am 22 Februar 2023, 13:06:18

Titel: Gelöst - Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 13:06:18
Guten Morgen,

ich nutze nun auch SYSMON und möchte Werte daraus in meinem FTUI darstellen.
Dazu zerlege ich "Total: 909.63 MB, Used: 279.62 MB, 30.74 %, Free: 111.61 MB" und speiche das ergänzte Ergebnis in einem Userreadings.

ram_free:ram:.* {"Von ".(split / /,(split /: /, (split /, /, ReadingsVal($name,'ram',0))[0])[1])[0]." MB sind noch ".(split /: /, (split /, /, ReadingsVal($name,'ram',0))[3])[1]." frei.";;}

Das funktioniert auch alles.

Ich möchte aber nun aus den MBs GBs machen und die erste Zahl durch 1000 teilen und runden.
Und daran scheitere ich. Die 909,63 sind ein String und müssten eigentlich erst gewandelt werden. Richtig?
Wie aber funktioniert das?
Oder sollte ich den Wert zwischenspeichern?

Danke
Titel: Antw:Userreading erstellen
Beitrag von: rabehd am 22 Februar 2023, 13:09:20
Ist nicht in perl alles ein String?

Komma durch Punkt ersetzen und dann könnte es mit der Division klappen.
Titel: Antw:Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 13:23:22
Zitat von: rabehd am 22 Februar 2023, 13:09:20
Komma durch Punkt ersetzen und dann könnte es mit der Division klappen.

Das wäre natürlich eine Möglichkeit. Probiere ich nachher gleich aus.

Danke
Titel: Antw:Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 13:42:16
Nein. Mein Fehler.
Da ist ein Punkt. Ich habe das Komma fälschlicherweise hingezaubert.
Titel: Antw:Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 13:47:37
2023.02.22 13:44:48 3: eval: {"Von ".(split / /,(split /: /, (split /, /, ReadingsVal($name,'ram',0))[0])[1])[0]/1000." GB sind noch ".(split /: /, (split /, /, ReadingsVal($name,'ram',0))[3])[1]." frei.";;}
2023.02.22 13:44:48 1: Error evaluating sysmon userReading ram_free: syntax error at (eval 358146) line 1, near "1000." GB sind noch ""


Das findet man im Log wenn ich versuche zu teilen (aber kein Hinweis wg. String)

Römi
Titel: Antw:Userreading erstellen
Beitrag von: betateilchen am 22 Februar 2023, 14:24:41

my $text = "Total: 909.63 MB, Used: 279.62 MB, 30.74 %, Free: 111.61 MB";
my ($von,$belegt,$prozent,$frei) = $text=~m/([\d.]+)+/g;
$von/=1000; $frei/=1000;
return "Von $von GB sind $frei GB frei.";


Edit: das mit dem gewünschten Runden hatte ich übersehen, aber das geht genau so einfach.
Einfach die Rückgabezeile ersetzen durch:

return sprintf("Von %.2f GB sind %.2f GB frei.",$von,$frei);


--
Titel: Antw:Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 15:55:23
my ($von,$belegt,$prozent,$frei) = $text=~m/([\d.]+)+/g;

Das muss ich für mich noch analysieren und verstehen ... aber das Ergebnis passt nun.

Ich Danke Euch!!!!

Römi
Titel: Antw:Userreading erstellen
Beitrag von: betateilchen am 22 Februar 2023, 16:24:19
Zitat von: roemi am 22 Februar 2023, 15:55:23
Das muss ich für mich noch analysieren und verstehen

Das ist schnell erklärt.

Die regexp m/([\d.]+)+/g extrahiert alle numerischen Inhalte aus $text und weist die vier Ergebnisse den vier Variablen zu.
Die numerischen Inhalte werden als Gruppe - eingeschlossen in Klammer() - daran erkannt, dass nur Ziffern \d und Punkte . vorkommen.

Solch einen Codeblock würde ich übrigens immer in eine Funktion in der 99_myUtils.pm packen und nicht direkt in das userReading.
Dadurch wird das Ganze sehr viel übersichtlicher, nachvollziehbarer und leichter wartbar.


--
Titel: Antw:Gelöst - Userreading erstellen
Beitrag von: roemi am 22 Februar 2023, 20:17:38
ZitatDas ist schnell erklärt.

Und ich zerleg das Teil in 1000 Teile und bin auch noch hochzufrieden mit mir  8)

Danke Dir

Römi