FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Vize am 30 Mai 2016, 21:59:47

Titel: [gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 30 Mai 2016, 21:59:47
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

Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: StefanStrobel am 30 Mai 2016, 22:16:28
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
Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: betateilchen am 31 Mai 2016, 07:26:03
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.
Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 07:51:16
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
Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 09:14:37
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
Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag 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
Titel: Antw:[HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: JoWiemann am 31 Mai 2016, 12:49:10
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
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 18:44:08
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
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: JoWiemann am 31 Mai 2016, 20:44:51
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

Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 21:39:43
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
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: JoWiemann am 31 Mai 2016, 21:44:32
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
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 21:49:49
626.63007

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

Gruß
Andreas
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: JoWiemann am 31 Mai 2016, 21:55:25
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
Titel: Antw:[gelöst] [HTTPMOD] Hexadezimalzahl in Dezimalzahl
Beitrag von: Vize am 31 Mai 2016, 21:58:24
Alles wird gut!  8) ;D

Danke nochmal für deine Mühe!

Gruß
Andreas