Guten Abend,
in einem HTTPMOD-Device habe ich Readings im Hexadezimal-Format, jedoch mit einem vorangestellten "fl_", vorliegen.
Beispiel:
ENERGY_GUI_HOUSE_POW fl_441CA853
Um daraus eine Dezimalzahl zur Weiteren Verwendung zu generieren, gehe ich z.Zt. folgenden "Umweg":
Ich lege mir zwei userReadings an
1.test { (split '_',ReadingsVal($name,"ENERGY_GUI_HOUSE_POW",0))[1] }
2.test_2 { (unpack "f", pack "L", hex ReadingsVal($name,"test",0)) }
um 1. das "fl_" loszuwerden und 2. das Ganze in eine Dezimalzahl zu wandeln.
Klappt soweit auch.
Zwei Fragen aber dazu:
Kann man das auch innerhalb eines userReadings erschlagen? Wenn ja, wie?
Kann man diesen Prozess auch schon während des "Abholens" der Daten durchführen, damit im Beispiel die Dezimalzahl sofort im Reading "ENERGY_GUI_HOUSE_POW" erscheint? Wenn ja, wie?
Vielen Dank schonmal für jegliche Hife!
Gruß
Andreas
Hallo Andreas,
mit einer readingXXOExpr sollte das machbar sein.
Damit wird der gelesene Wert in einer Perl-Expression verarbeitet und das Ergebnis kommt ins Reading.
In der Expression kannst Du den gelesenen Wert als $val ansprechen.
Ich verwende das z.B. zum Umrechnen:
attr PM reading04OExpr $val * 25 / 100
Gruss
Stefan
Zitat von: Vize am 30 Mai 2016, 21:59:47
Kann man das auch innerhalb eines userReadings erschlagen? Wenn ja, wie?
hex(substr(ReadingsVal($name,"ENERGY_GUI_HOUSE_POW",'fl_0'),3,-1))
Das fl_0 als Standardwert dient lediglich dazu, perl Warnungen zu vermeiden, falls das reading wirklich nicht existiert.
Moin betateilchen,
danke für den Tipp, aber der funktioniert nicht ganz richtig...
Aktuell sollte im entsprechenden Reading 252.26 erscheinen, mit deiner Berechnung steht dann aber 70763601 drin...
Gruß
Andreas
Hallo Stefan,
mit readingXXOExpr bin ich schonmal einen Schritt weiter, so dass direkt beim Einlesen der Werte das "fl_" abgeschnitten wird.
reading01OExpr (split '_',$val,0)[1]
Perfekt wäre es, wenn nun noch zusätzlich direkt im gleichen Reading die Hex- in eine Dezimalzahl gewandelt werden könnte...leider kriege ich den code dafür aber nicht auf die Kette...
Sprich, erst
reading01OExpr (split '_',$val,0)[1]
und dann direkt im Anschluss
(unpack "f", pack "L", hex $val,0)
Wie müsste dann der entsprechende code in reading01OExpr aussehen?
Wenn ich beide Perl-codes mit ;; in reading01OExpr hintereinander packe, passt die Ausgabe nicht...
Vielleicht kann mir nochmal jemand helfen...
Danke!
Gruß
Andreas
Hallo zusammen,
konnte das Zusammenführen der Berechnungen nun doch selber lösen...
Folgende readingXXOExpr setzen:
{my @a = split('_',$val,0);; sprintf("%.0f", unpack "f", pack "L", hex $a[1],0);;}
und man bekommt das Reading direkt als Dezimalzahl...
Danke nochmal für eure Hilfe!
Gruß
Andreas
Zitat von: Vize am 31 Mai 2016, 12:44:50
Hallo zusammen,
konnte das Zusammenführen der Berechnungen nun doch selber lösen...
Folgende readingXXOExpr setzen:
{my @a = split('_',$val,0);; sprintf("%.0f", unpack "f", pack "L", hex $a[1],0);;}
und man bekommt das Reading direkt als Dezimalzahl...
Danke nochmal für eure Hilfe!
Gruß
Andreas
Hallo,
sollte auch so gehen:
{sprintf("%.0f", unpack "f", pack "L", (split('_',$val,0))[1],0);;}
Grüße Jörg
Hallo Jörg,
dein Vorschlag funktioniert leider so nicht...das Reading "springt" dann auf null.
Da fehlt irgendwas, damit die Hex- in eine Dezimalzahl umgewandelt wird...
Gruß
Andreas
Hallo Andreas,
das hex hatte sich verdünisiert und ich hatte einen Fehler in der Klammerung (nie so ein Post mit dem Smart-Phone).
{sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
Das führt in meinem Fhem zwar zu einer Zahl, die aber nicht richtig ist. Das gilt auch für Deine Lösung.
Für eine Dezimalzahl reicht eigentlich:
{hex( (split ('_',$val,0 ))[1] )}
hex EXPR
Interprets EXPR as a hex string and returns the corresponding numeric value. If EXPR is omitted, uses $_ .
Grüße Jörg
Hallo Jörg,
ZitatDas führt in meinem Fhem zwar zu einer Zahl, die aber nicht richtig ist. Das gilt auch für Deine Lösung.
Wenn du damit post Nr. 5 in diesem thread meinst...das funktioniert wunderbar und liefert bis auf zwei Kommastellen genau die identische Zahl zum offiziellen Datenportal des PV-Speichers...passt also.
Vielleicht passt das auch deshalb nicht, da das Portal eine "IEEE 754-Zahl" liefert.
Den passenden perl-code hab ich von hier (http://www.perl-community.de/bat/poard/thread/6722).
Hätte daher wahrscheinlich "IEEE 754 Hex to Float" schreiben sollen...
Gruß
Andreas
Hm,
dann weiß ich nicht was bei mir umgerechnet wird. Gib mir doch bitte das Ergebnis für: fl_441CA853. Damit habe ich rumgespielt.
Grüße Jörg
626.63007
Siehe meinen letzten post - hab ihn nochmal editiert...
Gruß
Andreas
Hallo Andreas,
danke für den Hinweis. Wieder etwas dazu gelernt. Damit gibt dann:
{sprintf("%.0f", unpack "f", pack "L", hex ((split('_',$val,0))[1]),0)}
das selbe Ergebnis. Puh
Grüße Jörg
Alles wird gut! 8) ;D
Danke nochmal für deine Mühe!
Gruß
Andreas