Readings formatieren, konkret: Einheiten entfernen

Begonnen von chrille76, 04 März 2017, 19:41:18

Vorheriges Thema - Nächstes Thema

chrille76

Guten Abend,

ich habe verschiedene Fibaro Produkte im Einsatz, deren Werte ich z. B. in ein DbLog schreibe. Konkret geht es z. B. um die Readings "temperature" des Motion Sensors und "power" beim Wall Plug. Diese enthalten bspw. folgende Werte: "22.3 C" oder "195.2 W"

Wenn ich damit Berechnungen durchführen oder ein SVG Plot erzeugen möchte, bekomme ich natürlich Fehler der Art "PERL WARNING: Argument "22.3 C" isn't numeric in sprintf at ./FHEM/98_SVG.pm line 209".

Ich suche jetzt schon eine Weile, kann aber irgendwie nicht das richtige finden. Alles beschäftigt sich irgendwie damit eine Einheit anzuhängen, nicht aber, sie abzuschneiden. Wie kann ich das Reading ändern? UserReading wäre evtl. eine Variante...!? Ich benötige allerdings das Reading im Originalzustand gar nicht und würde das am liebsten gleich anders erzeugen (lassen). Also so, dass von mir aus von vornherein gleich "22.3" im Reading steht.

Benötige einen Tipp für den Einstieg oder einen Hinweis, wonach genau ich suchen sollte.

Danke und Gruß,
Christian

CoolTux

Hallo Christian,

Das Reading selber kannst Du nicht beeinflussen. Es sei denn Du fummelst am Modulcode ein. Am besten Du machst ein userReading und logst das mit.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

JoWiemann

Kannst Du mit einem UserReading und der Perl Funktion split() regeln.


(split(/ /,<reading>))[0]


Grüße Jörg
Jörg Wiemann

Slave: RPi B+ mit 512 MB, COC (868 MHz), CUL V3 (433.92MHz SlowRF); FHEMduino, Aktuelles FHEM

Master: CubieTruck; Debian; Aktuelles FHEM

betateilchen

Oder Du nimmst einfach den Wert des readings und addierst 0 dazu.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

CoolTux

Zitat von: betateilchen am 04 März 2017, 19:48:52
Oder Du nimmst einfach den Wert des readings und addierst 0 dazu.

Interessant. Das muss ich mir mal ansehen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

chrille76

Danke für eure Tipps. Werde dann mit userReadings arbeiten. Zum Glück mache ich bisher damit noch nicht so viel, sonst hätte ich jetzt eine DB-Migration vor mir.

Zitat von: JoWiemann am 04 März 2017, 19:47:25
Kannst Du mit einem UserReading und der Perl Funktion split() regeln.


(split(/ /,<reading>))[0]


Grüße Jörg

Danke für den Tipp!

Zitat von: betateilchen am 04 März 2017, 19:48:52
Oder Du nimmst einfach den Wert des readings und addierst 0 dazu.


Interessante Variante. Hilft vermutlich bei Berechnungen, bei der Ploterzeugung wäre das Problem immer noch da. Oder beziehst du dich auf den Tipp von Jörg?


chrille76

Kleine Anmerkung noch. Die Variante mit der Addition mit 0 funktioniert grundsätzlich, sorgt im Log aber für unschöne Einträge der Art:

2017.03.04 20:38:43 3: eval: {(ReadingsVal($name,"power",0.0)) + 0}
2017.03.04 20:38:44 1: PERL WARNING: Argument "0.0 W" isn't numeric in addition (+) at (eval 13669) line 1.

Von daher scheint split besser geeignet zu sein.

CoolTux

Kannst auch gleich ReadingsNum nehmen. Das brauchst x 0 nicht
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen

ReadingsNum() funktioniert aber nicht, wenn man Daten aus dem Log im Plot verarbeiten will ;)

ZitatWenn ich damit Berechnungen durchführen oder ein SVG Plot erzeugen möchte,

Zitat von: chrille76 am 04 März 2017, 21:01:06
Kleine Anmerkung noch. Die Variante mit der Addition mit 0 funktioniert grundsätzlich, sorgt im Log aber für unschöne Einträge der Art:
...
Von daher scheint split besser geeignet zu sein.

Die perl Warnung tut erstens nicht wirklich weh und zweitens könnte man sie sogar abschalten. Aber wozu?

Und von der performance ist eine Addition immer besser geeignet als ein split.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

chrille76

#9
Zitat von: betateilchen am 04 März 2017, 21:09:47
ReadingsNum() funktioniert aber nicht, wenn man Daten aus dem Log im Plot verarbeiten will ;)

Naja, zukünftig ist das Ziel, die Plots aus dem DbLog zu erzeugen. Von daher spielt das dann keine Rolle mehr. Schaue mir also auch mal ReadingsNum an, hab ich bisher noch nicht verwendet.

Zitat von: betateilchen am 04 März 2017, 21:09:47
Die perl Warnung tut erstens nicht wirklich weh und zweitens könnte man sie sogar abschalten. Aber wozu?

Und von der performance ist eine Addition immer besser geeignet als ein split.

Nein, tut nicht weh. Außer, dass es momentan mein Log vollmüllt. Da muss ich aber sowieso noch optimieren. War ich noch nicht dran, das Device ist neu. Schreibt alle paar Sekunden den aktuellen Stromverbrauch und dementsprechend auch das Warning ins Log.

Performance ist ein Argument, hab ich mir schon gedacht, kenne den Nachteil von Stringoperationen aus anderen Programmiersprachen.

Edit: Kriege das erste Zitat irgendwie nicht hin :(
Edit2: Jetzt hab ich's :)

CoolTux

Zitat von: betateilchen am 04 März 2017, 21:09:47
ReadingsNum() funktioniert aber nicht, wenn man Daten aus dem Log im Plot verarbeiten will ;)

Ah jetzt verstehe ich erst die Zusammenhänge.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

christian66

Hallo,
ich komme einfach nicht klar! Möchte mir ein UserReading "power_2" schaffen, das den wert von "power" ohne Einheit hat bekomme das aber einfach nicht hin. Was mache ich falsch??
Internals:
   CHANGED   
   DEF        Powerline546E:E8_DF_70_16_6C_27 powerMeter,switch
   IODev      Powerline546E
   LASTInputDev Powerline546E
   MSGCNT     4704
   NAME       FBDECT_Powerline546E_E8_DF_70_16_6C_27
   NR         154
   Powerline546E_MSGCNT 4704
   Powerline546E_TIME 2018-08-12 21:32:23
   STATE      on
   TYPE       FBDECT
   id         E8_DF_70_16_6C_27
   props      powerMeter,switch
   READINGS:
     2018-08-12 21:32:23   AIN             E8:DF:70:16:6C:27
     2018-08-12 21:32:23   FBNAME          Garage-Freddy
     2018-08-12 21:32:23   FBPROP          powerMeter,switch
     2018-08-12 21:32:23   FBTYPE          FRITZ!Powerline 546E
     2018-08-12 21:32:23   ID              1000
     2018-08-12 21:32:23   devicelock      no
     2018-08-12 21:32:23   energy          476 Wh
     2018-08-12 21:32:23   fwversion       06.93
     2018-08-12 21:32:23   locked          no
     2018-08-12 21:32:23   mode            manuell
     2018-08-12 21:32:23   power           0.28 W
     2018-08-12 21:32:23   power_2         Error evaluating FBDECT_Powerline546E_E8_DF_70_16_6C_27 userReading power_2: Bareword "power" not allowed while "strict subs" in use at (eval 198483) line 1.

     2018-08-12 21:32:23   present         yes
     2018-08-12 21:32:23   state           on
Attributes:
   IODev      Powerline546E
   alias      Freddy_2
   devStateIcon on:remotecontrol/black_btn_GREEN off:remotecontrol/black_btn_RED
   event-on-change-reading power,state
   group      Freddy
   icon       message_socket
   room       1.2_Garten,FBDECT
   userReadings power_2 {(split(/ /,power))[0]}


Wäre für Hilfe echt dankbar!!

Christian

CoolTux


userReadings power_2:power:.* { ReadingsNum($name,'power',0) }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

christian66

Hm,
bleibt eigentlich das gleiche, im Error hat es sich nur auf  (eval 2799037) geändert ... ???

CoolTux

Zeig mal bitte noch mal ein list und die genaue Fehlermeldung aus dem Log
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net