Hallo !
Ich frage mittels ModbusAttr von meinem Solax WR einen int32 Wert ab. Allerdings bekomme ich diesen nicht richtig als Dezimalzahl konvertiert.
attr Solax obj-i70-reading Feedin_Power
attr Solax obj-i70-revRegs 1
attr Solax obj-i70-showGet 1
attr Solax obj-i70-unpack I
Im Log findet sich:
2022.12.22 18:05:07 5 : Solax: ParseDataString called from HandleResponse with data hex ffd1ffff, type i, adr 70, op read
2022.12.22 18:05:07 5 : Solax: SplitDataString called from ParseDataString with data hex ffd1ffff, type i, adr 70, valuesLen 2, op read
2022.12.22 18:05:07 5 : Solax: CreateDataObjects called from ParseDataString with objList i70
2022.12.22 18:05:07 5 : Solax: CreateDataObjects sortedList i70
2022.12.22 18:05:07 5 : Solax: CreateParseInfoCache called
2022.12.22 18:05:07 5 : Solax: ReverseWordOrder is reversing order of up to 2 registers
2022.12.22 18:05:07 5 : Solax: ReverseWordOrder for CreateDataObjects is transforming ffd1ffff to ffffffd1
2022.12.22 18:05:07 5 : Solax: CreateDataObjects unpacked ffffffd1 with I to 3523215359
2022.12.22 18:05:07 4 : Solax: CreateDataObjects assigns value 3523215359 to Feedin_Power
Der Wert 3523215359 ist natürlich Käse.
Wenn man vor dem unpack den Hex Wert noch durch pack schickt, dann kommt der richtige Wert raus:
$ perl -e 'printf "%d\n", unpack "l", pack "L", hex "ffffffd1"'
-47
Lässt sich die Konvertierung auch irgendwie direkt mit der ModbusAttr unpack Funktion abbilden?
Danke
Matze
Habe es endlich herausgefunden. Durch -revRegs 1 dreht sich wohl die byte-order. Somit wird aus little-endian (laut Doku zum WR) dann big-endian. Mit -unpack l> funktioniert es nun.
attr Solax obj-i70-len 2
attr Solax obj-i70-reading Feedin_Power
attr Solax obj-i70-revRegs 1
attr Solax obj-i70-showGet 1
attr Solax obj-i70-unpack l>