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
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.
Kannst Du mit einem UserReading und der Perl Funktion split() regeln.
(split(/ /,<reading>))[0]
Grüße Jörg
Oder Du nimmst einfach den Wert des readings und addierst 0 dazu.
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.
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?
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.
Kannst auch gleich ReadingsNum nehmen. Das brauchst x 0 nicht
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.
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 :)
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
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
userReadings power_2:power:.* { ReadingsNum($name,'power',0) }
Hm,
bleibt eigentlich das gleiche, im Error hat es sich nur auf (eval 2799037) geändert ... ???
Zeig mal bitte noch mal ein list und die genaue Fehlermeldung aus dem Log
Nach update und restart von fhem funktioniert es jetzt ;D, super !!
Vielen, vielen Dank. (y)