[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl

Begonnen von Vize, 30 Mai 2016, 21:59:47

Vorheriges Thema - Nächstes Thema

Vize

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


StefanStrobel

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

betateilchen

#2
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Vize

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

Vize

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

Vize

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

JoWiemann

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
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

Vize

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

JoWiemann

#8
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

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

Vize

#9
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.
Hätte daher wahrscheinlich "IEEE 754 Hex to Float" schreiben sollen...

Gruß
Andreas

JoWiemann

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
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

Vize

626.63007

Siehe meinen letzten post - hab ihn nochmal editiert...

Gruß
Andreas

JoWiemann

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
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

Vize

Alles wird gut!  8) ;D

Danke nochmal für deine Mühe!

Gruß
Andreas