Nachkommastellen und das ewie Leid

Begonnen von en-trust, 30 November 2020, 08:24:09

Vorheriges Thema - Nächstes Thema

en-trust

Ich habe mir aus der sysmon den Ram (Used) mal selektiert.

ram_used {if (ReadingsVal("$name","ram",0) =~ m/Used:\s(\d+)/)) {return $1;;;;}}

Den erhalte ich dann auch, allerdings ohne Nachkommastelle und ohne den Text MB.

ram_used {if (sprintf("%.2f", ReadingsVal("$name","ram",0))."MB" =~ m/Used:\s(\d+)/)) {return $1;;;;}}

Das mag fhem aber leider nicht.
Error evaluating System.Monitoring userReading ram_used: syntax error at (eval 861) line 1, near "if sprintf"
syntax error at (eval 861) line 1, near "}}"


Kann mir jemand helfen ?

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

en-trust

ram_used {if (ReadingsVal("$name","ram",0) =~ m/Used:.(\d+.\d+.MB)/) {return $1;;;;}}

Ist vermutlich so auch nicht korrekt...

Beta-User

Wenn du ein list einstellen würdest, wäre da evtl. einfacher zu helfen, aber so weiß z.B. keiner, ob da überhaupt MB im Reading stehen, ob es einen Tausender-Trenner gibt usw. usf.. Außerdem ist kein Trigger definiert, was mindestens eine Unsauberkeit ist...

Ins Blaue (für das Editieren des Attributinhalts via FHEMWEB):
ram_used:ram.* {if (ReadingsVal("$name","ram",0) =~ m/Used:.([0-9.,]+)/) {return qq($1 MB);}}
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Ich habe noch nicht verstanden, was Du mit der if-Abfrage im Code überhaupt willst.

Das hier funktioniert bei mir jedenfalls problemlos:

attr sysmon userReadings ram_used {ReadingsVal("$name","ram",0) =~ m/Used:.(\d+.\d+.MB)/;; return $1}


sysmon 2020-11-30 10:17:45 ram Total: 974.38 MB, Used: 273.72 MB, 28.09 %, Free: 160.89 MB
sysmon 2020-11-30 10:17:45 ram_used 273.72 MB


-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frank

wenn es ein eindeutiges "ende-zeichen" gibt, finde ich folgende regex-methode immer sehr einfach und nützlich.
in der regel auch "wartungsfreundlicher", da der modulautor den gesuchten teilstring auch ruhig etwas ändern kann:

attr sysmon userReadings ram_used {ReadingsVal("$name","ram",0) =~ m/Used:.([^,]+)/;; return $1}
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

en-trust

Zitat von: betateilchen am 30 November 2020, 10:19:39
Ich habe noch nicht verstanden, was Du mit der if-Abfrage im Code überhaupt willst.

Das hier funktioniert bei mir jedenfalls problemlos:

attr sysmon userReadings ram_used {ReadingsVal("$name","ram",0) =~ m/Used:.(\d+.\d+.MB)/;; return $1}


sysmon 2020-11-30 10:17:45 ram Total: 974.38 MB, Used: 273.72 MB, 28.09 %, Free: 160.89 MB
sysmon 2020-11-30 10:17:45 ram_used 273.72 MB


Klappt. Naja mein Statement hatte ich hier aus dem Forum, auch mit dem if.

Danke