Hauptmenü

Modbus Daten bearbeiten

Begonnen von jostmario, 19 Dezember 2022, 18:22:56

Vorheriges Thema - Nächstes Thema

jostmario

Hallo,

Ich Lese hier einen Stromzähler EM24 Von Victron aus.

Habe diesen Code.
define Victron_Gridpower ModbusAttr 100 5 192.168.178.19:502 TCP
attr Victron_Gridpower userattr dev-h-defPoll event-on-change-reading obj-h00820-reading obj-h00821-reading obj-h00822-reading stateFormat userReadings
attr Victron_Gridpower dev-h-defPoll 1
attr Victron_Gridpower event-on-change-reading .*:10
attr Victron_Gridpower obj-h00820-reading Gridpower_L1
attr Victron_Gridpower obj-h00821-reading Gridpower_L2
attr Victron_Gridpower obj-h00822-reading Gridpower_L3
attr Victron_Gridpower room Photovoltaik
attr Victron_Gridpower stateFormat Total:Gridpower_Total W - L1: Gridpower_L1 W - L2:Gridpower_L2 W - L3:Gridpower_L3: W
attr Victron_Gridpower userReadings Gridpower_Total { ReadingsVal("Victron_Gridpower","Gridpower_L1",0) + ReadingsVal("Victron_Gridpower","Gridpower_L2",0) + ReadingsVal("Victron_Gridpower","Gridpower_L3",0);;}


Wenn ich Strom beziehe dann passen die Werte von Gridpower_L1 , L2 , L3   wenn ich einspeise dann kommt der Wert nicht richtig an.
Anbei die Exel Liste von Victron und ein Bild wie die Werte bei etwa 216 Watt Einspeisung auf L1 aussehen.
Jemand eine Idee wie ich das am einfachsten umwandeln kann wenn - Werte kommen.

Gruß Josty


Raspberry Pi  ---  HM-LAN ---  8X HM_HM_CC_RT_DN --- OWL+USB Strommesser    UVR1611

rasti

Wie bereits im anderen Thread geschrieben steht als Variablentyp int16 in der Excelregistertabelle von Victron drin und  das Problem ist wohl , dass FHEM die gelieferten 16 Registerbits einfach als eine positive Zahl umrechnet nicht als 2K Zahl (Zweierkomplementzahl ).

Man braucht quasi eine Umrechnung der Registerwerte nach folgenden Regeln
Wenn Registerwert <= 32767, dann ist der Registerwert die Wattzahl (Strombezug, positive Werte)
Wenn Registerwert > 32767, dann ist die richtige Wattzahl Neuer_Wert  = -(65535-Wert+1)     (Einspeisung, negative Werte)

Oder sonst irgendwie einen Hinweis, ob oder wie sich FHEM Readings als 2K Zahlen "umformatieren" lassen ...

rasti

probier mal hier als userReadings aus =>

Gridpower_Total { ReadingsVal("Victron_Gridpower","Gridpower_L1",0) + ReadingsVal("Victron_Gridpower","Gridpower_L2",0) + ReadingsVal("Victron_Gridpower","Gridpower_L3",0);}, signed_Gridpower_L1 {unsigned16_signed16(ReadingsVal("Victron_Gridpower","Gridpower_L1",0));}

Das erzeugt dir ein zusätzliches Reading signed_Gridpower_L1.

Die Funktion unsigned16_signed16 also das hier

sub unsigned16_signed16 {
  my $v = shift;
  return ($v & 0x8000) ? -((~$v & 0xffff) + 1) : $v;
}


muss in die 99_myUtils.pm reinkopiert werden.

Hab ich hier => https://gist.github.com/ishikawa/256008 gefunden.
Frag mich nicht wie der Code funktioniert, ich weiss es nicht aber anscheinend tut er was er soll....



rasti

Dasselbe Problem dürfte auch noch bei Victron_Battery Bat_current bestehen wenn der Strom negativ wird.

rasti

Zitat von: rasti am 19 Dezember 2022, 23:28:38
Dasselbe Problem dürfte auch noch bei Victron_Battery Bat_current bestehen wenn der Strom negativ wird.

Die Lösung oben funktioniert.
Hier mein geändertes userreading für die Batterie :
attr Victron_Battery userReadings Battery_Power { round((ReadingsVal("Victron_Battery","Battery_current",0)*ReadingsVal("Victron_Battery","Bat_voltage",0) *0.01),0) ;;}, Battery_temperature { round(ReadingsNum("Temperatur_Keller","temperature",-1),1) ;;}, Battery_SOC { ReadingsVal("Victron_Battery","Bat_SOC",0) *0.1 ;;}, Battery_voltage { ReadingsVal("Victron_Battery","Bat_voltage",0) *0.01 ;;}, Battery_current { unsigned16_signed16(ReadingsVal("Victron_Battery","Bat_current",0)) *0.1;;}