Ich habe leider keine Lösung gefunden wie ich Vorkommastellen kürzen kann.
Nachkommestellen mit %.4f ZB ist kein Thema.
Ich habe eine Hex Zahl die ich in Dezimal umwandle und ergibt die Dezimalzahl 00030000.
Diese Zahl muss ich auf 0003 reduzieren. Auch eine Änderung auf 30000 ist keine Thema, hilft mir aber im konkretem Fall nicht.
Und diese Zahl 0003 wird dann mit %s in Import_kWh umgewandelt.
Ich benötige dies zur Modbus Registerauswertung.
Chris
Vorkommastellen kürzen
Integer mit führenden Nullen sind in Python als Literale syntaktisch nicht zulässig. Insofern kannst du diese Ziffernfolge überhaupt nur als String haben. Und hier kannst du dann mit den üblichen Stringoperationen arbeiten. Oder du konvertierst es halt in einen Integer und dividierst; das ist, was ich vmtl. machen würde. Die spätere Darstellung als String mit führenden Nullen ist davon ja unbenommen.
Z.B.
Wenn du es flexibler brauchst, musst du bitte ausführlicher werden.
Z.B.
Code: Alles auswählen
>>> f"{int('00030000')//10000:0>4}"
'0003'
…
>>> '00030000'.rstrip('0')
'0003'
- noisefloor
- User
- Beiträge: 4172
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du machst ziemlich sicher bei der Umwandlung irgendwas falsch, weil Python keine führenden Nullen bei der Umwandlung von einem Hex-String in einen Integer Wert generiert:
Gruß, noisefloor
du machst ziemlich sicher bei der Umwandlung irgendwas falsch, weil Python keine führenden Nullen bei der Umwandlung von einem Hex-String in einen Integer Wert generiert:
Code: Alles auswählen
>>> int('0xfedc', 16)
65244
>>>
- __blackjack__
- User
- Beiträge: 13998
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Oder um ein bisschen Korinthen zu kacken: Ganze Zahlen haben gar keine Dezimalziffern. Die hat nur die Darstellung als Zeichenkette, und wenn *dort* führende 0en stehen, dann muss man explizit etwas gemacht haben, damit die dort stehen. Und *das* muss man dann einfach sein lassen. 
Die Darstellung einer 0 als Zeichenkette hat natürlich eine ”führende” 0, aber das Beispiel sieht ja anders aus.
Wobei ich mich gerade Frage ob eventuell auch eine von diesen Varianten gemeint war/ist:
Aber da müsste Burny4600 wohl mehr verraten was da tatsächlich in was und wie umgewandelt wurde.
Die Darstellung einer 0 als Zeichenkette hat natürlich eine ”führende” 0, aber das Beispiel sieht ja anders aus.
Wobei ich mich gerade Frage ob eventuell auch eine von diesen Varianten gemeint war/ist:
Code: Alles auswählen
In [132]: int("00030000", 16)
Out[132]: 196608
In [133]: int.from_bytes(bytes.fromhex("00030000"), "little")
Out[133]: 768
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Es handelt sich um zwei ModBus Register eines Stromzählers bei deren Umsetzung ich ein Problem hatte.
Ich habe aber schon eine Lösung gefunden. Leider dachte ich zu kompliziert.
ModBus Register
Lösung
Mit dieser Lösung funktioniert jedenfalls die benötigte Darstellung.
Ich habe aber schon eine Lösung gefunden. Leider dachte ich zu kompliziert.
ModBus Register
Code: Alles auswählen
Adresse Parameter Adresse Valid range
Register Hex
463761 Pulse 1 constant F9 10 0000: 0.001kwh(kvarh)/imp (default)
0001: 0.01kwh(kvarh)/imp
0002: 0.1kwh(kvarh)/imp
0003: 1kwh(kvarh)/imp
Data Format:Hex(length:2 byte)
463776 Measurement mode F9 20 0001:mode 1(total = import)
0002:mode 2(total = import + export) (default)
0003:mode 3(total = import - export)
Data Format:Hex(length:2 byte)
Code: Alles auswählen
"h63760" => { # holding register 0xF910
# Relay 1 Pulse Constant:
# 00000000=0.001_kWh_or_kVArh/Imp, 00010000=0.01_kWh_or_kVArh/Imp, 00020000=0.1_kWh_or_kVArh/Imp, 00030000=1_kWh_or_kVArh/Imp
name => "Relay1_Pulse Constant", # internal name of this register in the hardware doc
reading => "Relay1_Pulse_Constant_Imp", # name of the reading for this value
map => "00000000:0.001, 00010000:0.01, 00020000:0.1, 00030000:1", # map to convert visible values to internal numbers (for reading and writing)
hint => "0.001,0.01,0.1,1", # string for fhemweb to create a selection or slider
unpack => "H*", # hex pack / unpack code to convert raw values
format => '%s', # format string for sprintf
poll => "once", # only poll once after define (or after a set)
# set => 1, # this value can be set
},
"h63776" => { # holding register 0xF920
# Measurement Mode Meter.
name => "Measurement Mode", # internal name of this register in the hardware doc
reading => "Measurement_Mode", # name of the reading for this value
map => "00010000:Total_Import, 00020000:Total_Import_plus_Export, 00030000:Total_Import_minus_Export", # map to convert visible values to internal numbers (for reading and writing)
hint => "Total_Import,Total_Import_plus_Export,Total_Import_minus_Export", # string for fhemweb to create a selection or slider
unpack => "H*", # hex pack / unpack code to convert raw values
format => '%s', # format string for sprintf
poll => "once", # only poll once after define (or after a set)
set => 1, # this value can be set
},
LG
Chris
Chris
- __blackjack__
- User
- Beiträge: 13998
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das ist aber kein Python‽
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis