Script zum Zähler auslesen zickt herum! Python-Frage
Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese
Script zum Zähler auslesen zickt herum! Python-Frage
Moin, mein Stromzähler liefert beim Einspeisen folgenden hex-String:
fff95284
das ist ein negativer Wert
Allerdings klappt das nicht mit
Leistung = int(power, 16) / 1e2
da kommt
raw: fff95284
Leistung : 42945296.68 W
Heraus kommen sollte was mit -4kw
Im Verbrauchsbetrieb funktioniert das, da kommt der richtige Positive Wert.
Wie mache ich das richtig?
fff95284
das ist ein negativer Wert
Allerdings klappt das nicht mit
Leistung = int(power, 16) / 1e2
da kommt
raw: fff95284
Leistung : 42945296.68 W
Heraus kommen sollte was mit -4kw
Im Verbrauchsbetrieb funktioniert das, da kommt der richtige Positive Wert.
Wie mache ich das richtig?
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Das ist Wweierkomplementdarstellung. Die Leistung ist damit (2^32-Zahl)/100, also 4376,28W.
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Das Ergebnis muss negativ sein! Ich speise ja ein
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Ist es doch auch...
Das ist ein signed int32. -437628 kommt da raus.
Bin nicht so der Schlangenexperte, aber bei der string Umwandlung nach int ist halt wichtig wie "breit" der Integer ist und ob er signed ist oder nicht. Soweit ich weiß ist das implementierungsabhängig ob int nun 32 bit oder 64 bit ist. Als signed int64 wären das halt 4294529668, als signed int32 -437628. Im Zweifelsfall das Ergebnis der string Umwandlung explizit in int32 umzucasten.
Da -1 als Zweierkomplement so dargestellt wird das alle bits "1"sind, ist es halt wichtig wie viel den "alle" sind.
-1 als int64 ist 0xFFFFFFFFFFFFFFFF
-1 als int32 ist 0xFFFFFFFF
Das ist ein signed int32. -437628 kommt da raus.
Bin nicht so der Schlangenexperte, aber bei der string Umwandlung nach int ist halt wichtig wie "breit" der Integer ist und ob er signed ist oder nicht. Soweit ich weiß ist das implementierungsabhängig ob int nun 32 bit oder 64 bit ist. Als signed int64 wären das halt 4294529668, als signed int32 -437628. Im Zweifelsfall das Ergebnis der string Umwandlung explizit in int32 umzucasten.
Da -1 als Zweierkomplement so dargestellt wird das alle bits "1"sind, ist es halt wichtig wie viel den "alle" sind.
-1 als int64 ist 0xFFFFFFFFFFFFFFFF
-1 als int32 ist 0xFFFFFFFF
- Bastelbruder
- Beiträge: 11550
- Registriert: Mi 14. Aug 2013, 18:28
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Ich glaube, Boris kann heute Nacht nicht schlafen.
- Fritzler
- Beiträge: 12600
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Kleines Problem großes Wirkung!
python nutzt intern sehr lange ints und nicht 32Bit.
Du hast da aber ne 32Bit Hexzahl, daher brauchste eine "Vorzeichenerweiterung" von 32 auf das interne python format.
Also hacken wir mal ganz böse mit der Python lib um c structs zu packen und unpacken
Lektüre:
https://docs.python.org/3/library/struct.html
python nutzt intern sehr lange ints und nicht 32Bit.
Du hast da aber ne 32Bit Hexzahl, daher brauchste eine "Vorzeichenerweiterung" von 32 auf das interne python format.
Also hacken wir mal ganz böse mit der Python lib um c structs zu packen und unpacken
Code: Alles auswählen
from struct import pack, unpack
hexStr = 'fff95284'
signed = unpack('l', pack('L', int(hexStr, 16)))[0]
print (signed/100)
-4376.28
https://docs.python.org/3/library/struct.html
Zuletzt geändert von Fritzler am Sa 14. Mai 2022, 21:31, insgesamt 2-mal geändert.
- Fritzler
- Beiträge: 12600
- Registriert: So 11. Aug 2013, 19:42
- Wohnort: D:/Berlin/Adlershof/Technologiepark
- Kontaktdaten:
Re: Script zum Zähler auslesen zickt herum! Python-Frage
falscher Button, bitte killen!
Re: Script zum Zähler auslesen zickt herum! Python-Frage
oder 4294967296 (also 2^32) abziehen. Je nach Position im Script auch 42949672.96 - wenn du deinen Wert schon durch 100 geteilt hast.
42945296.68 - 42949672.96 = -4376.28
42945296.68 - 42949672.96 = -4376.28
Re: Script zum Zähler auslesen zickt herum! Python-Frage
Perfekt!Fritzler hat geschrieben: ↑Sa 14. Mai 2022, 21:28 Kleines Problem großes Wirkung!
python nutzt intern sehr lange ints und nicht 32Bit.
Du hast da aber ne 32Bit Hexzahl, daher brauchste eine "Vorzeichenerweiterung" von 32 auf das interne python format.
Also hacken wir mal ganz böse mit der Python lib um c structs zu packen und unpacken
Lektüre:Code: Alles auswählen
from struct import pack, unpack hexStr = 'fff95284' signed = unpack('l', pack('L', int(hexStr, 16)))[0] print (signed/100) -4376.28
https://docs.python.org/3/library/struct.html
Mit unpack hatte ich schon mal was gemacht, kam aber nur Grüze raus.
Danke, läuft schon mal, Morgen abwarten, wenn der Zähler wieder nach - geht.