Seite 1 von 2

Modbus Energiezähler (Victron EM24)

Verfasst: 8. Aug 2024 08:32
von spirit
Hallo zusammen,

ich verzweifle momentan an der Integration meines Victron EM24 (Carlo Gavazzi) in Openhab.

Bisher habe ich die Daten über einen Lesekopf direkt auf meinem Zähler exportiert, durch einen Umstieg auf Tibber und deren schlechter Umsetzung (Cloud und Anfälligkeit Tibber Pulse), kann ich diesen aber leider nicht mehr verwenden. Auch ein Lesekopfumbau auf Lese- und Sendekopf konnte dieses Problem nicht umgehen.

Da ich in Zukunft so oder so gern einen Speicher installieren möchte, habe ich mir also ein Energiezähler von Victron gekauft und direkt hinter dem Zähler montiert.

Ich würde diesen nun gern via Modbus auslesen. Dabei komme ich aber leider an meine Grenzen.

Aktuell lese ich bereits meine Wärmepumpe (Nibe S1155-6PC) und einen SolarEdge Wechselrichter mit Modbus aus, aber dort war die Integration irgendwie einfacher.

Für unsere EAutos verwende ich als Ladesteuerung EVCC. Dort war die Integration des EM24 recht einfach.

Es gibt vom Hersteller ein Verzeichnis über die einzelnen Register und im HomeAssistant Forum gibt es auch einen Beitrag.

Carlo Gavazzi Register EM24 Ethernet:
https://www.enika.eu/data/files/produkt ... t%20cp.pdf

HomeAssistant Forum EM24:
https://community.home-assistant.io/t/m ... /353336/16

Hat jemand eine Idee wie ich das ganze integriert bekomme? Meine PV Übersicht würde sich über neue Daten vom Zähler freuen :)
OpenhabPV.JPG

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 8. Aug 2024 09:53
von rbeudel
Hallo,
ich kann nur mein Beispiel(auch nicht selbst erfunden) für ein SMA Gerät zeigen. Mal die Parameter mit dem EM24 vergleichen und ersetzen.

Code: Alles auswählen

Bridge modbus:tcp:sma "SMA Inverter" @ "Modbus" [ host="192.168.1.68", port=502, id=3, connectMaxTries=3] {

// SMA Inverter Device Type
	Bridge poller DevType              [ start=30053, length=4, refresh=5000, type="input" ] {
	    	Thing data type            [ readStart="30053", readValueType="uint32" ] 
  	 }

// SMA Inverter Status
	Bridge poller SMA_Status           [ start=30201, length=36, refresh=6000, type="input" ] {
               Thing data status           [ readStart="30201", readValueType="int32" ]
               Thing data Grid_Contactor   [ readStart="30217", readValueType="int32" ]

               Thing data Max_Power        [ readStart="30231", readValueType="int32" ]
               Thing data Set_Max_Power    [ readStart="30233", readValueType="int32" ]
  	 }



// SMA Inverter Temperatur
Bridge poller SMA_Temp_Innen          [ start=34113, length=2, refresh=6000, type="input" ] {
			Thing data Temp1    [ readStart="34113", readValueType="uint32", readTransform="JS(smalimit10A.js)" ]
 }

// SMA Inverter Yield
	Bridge poller Yield                [ start=30517, length=16, refresh=5000, type="input" ] {
               Thing data Day_Yield        [ readStart="30517", readValueType="int64", readTransform="JS(divide1000.js)" ]
               Thing data Total_Yield      [ readStart="30529", readValueType="int32", readTransform="JS(divide1000000.js)" ]
   	 }

// SMA Inverter Power Section A
	Bridge poller power_a              [ start=30769, length=20, refresh=5000, type="input" ] {
	       Thing data current_input    [ readStart="30769", readValueType="int32", readTransform="JS(smalimit1000.js)" ]
	       Thing data voltage_input    [ readStart="30771", readValueType="uint32", readTransform="JS(smalimit100A.js)" ]
	       Thing data power_west       [ readStart="30773", readValueType="int32", readTransform="JS(smalimit1000.js)"]
	       Thing data active_powerWatt [ readStart="30775", readValueType="int32", readTransform="JS(smalimit.js)" ]
	       //Thing data power_L1         [ readStart="30777", readValueType="int32", readTransform="JS(smalimit1000.js)" ]
	       Thing data volt_G1          [ readStart="30783", readValueType="uint32", readTransform="JS(smalimit100A.js)" ]
	      
  	 }


	Bridge poller grid   [ start=30803, length=4, refresh=5000, type="holding" ] {
	       Thing data GridMs_Hz     [ readStart="30803", readValueType="uint32", readTransform="JS(smalimit100A.js)"]
   	 }


// SMA Inverter Operation
	Bridge poller SMA_Betriebszeit   [ start=30521, length=8, refresh=5000, type="input" ] {

	       Thing data Betriebszeit   [ readStart="30521", readValueType="uint64" ]
			Thing data Einspeisezeit  [ readStart="30525", readValueType="uint64" ]
   	 }
}
und die Items

Code: Alles auswählen

// Inverter SB 2.5
Group      SMA                  "Wechselrichter"                                    <solarplant>        (boilerroom)         ["Inverter"]
Number     Sma_DevType          "Gerätetyp [MAP(SMA.map):%s]"                       <softener>          (SMA)    ["Status"]                       {channel="modbus:data:sma:DevType:type:number"}

Number     Sma_Status           "Gerätestatus [MAP(SMA.map):%s]"                    <switch>            (SMA)    ["Status"]                       {channel="modbus:data:sma:SMA_Status:status:number"}
Contact    Sma_GridContactor    "Netzrelais/-schütz [MAP(SMA.map):%s]"              <switch>            (SMA)    ["Status"]                       {channel="modbus:data:sma:SMA_Status:Grid_Contactor:contact"}

Number     Sma_MaxPower         "Nennwirkleistung [%s W]"                           <Energy>            (SMA)    ["Measurement","Power"]          {channel="modbus:data:sma:SMA_Status:Max_Power:number"}
Number     Sma_SetMaxPower      "max. Einspeiseleistung [%s W]"                     <Energy>            (SMA)    ["Measurement","Power"]          {channel="modbus:data:sma:SMA_Status:Set_Max_Power:number"}
Number     Sma_Temp             "Temp Gehäuse [%.1f °C]"                            <temperature>       (SMA)    ["Measurement","Temperature"]    {channel="modbus:data:sma:SMA_Temp_Innen:Temp1:number"}

Number     Sma_DaylyYield       "Tagesertrag [%s kWh]"                              <line>              (SMA)    ["Measurement","Energy"]         {channel="modbus:data:sma:Yield:Day_Yield:number"}
Number     Sma_TotalYield       "Gesamtertrag [%.2f MWh]"                             <line>              (SMA)    ["Measurement","Energy"]         {channel="modbus:data:sma:Yield:Total_Yield:number"}

Number     Sma_DC1Cur_input     "DC Strom [%s A]"                                   <solarplant>        (SMA)    ["Measurement","Current"]        {channel="modbus:data:sma:power_a:current_input:number"}
Number     Sma_DC1Volt_input    "DC Spannung [%s V]"                                <solarplant>        (SMA)    ["Measurement","Voltage"]        {channel="modbus:data:sma:power_a:voltage_input:number"}
Number     Sma_PowerA           "DC Leistung [%s kW]"                               <solarplant>        (SMA)    ["Measurement","Power"]          {channel="modbus:data:sma:power_a:power_west:number"}
Number     GridMs_Hz      "Grid Frequenz [%s Hz]"                               <poweroutlet_eu>    (SMA)    ["Measurement","Frequency"]          {channel="modbus:data:sma:grid:GridMs_Hz:number"}
Number:Power     Sma_ActivePowerWatt  "AC Leistung [%.0f W]"                                <poweroutlet_eu>    (SMA)    ["Measurement","Power"]          {channel="modbus:data:sma:power_a:active_powerWatt:number"}

Number     Sma_voltG1           "Netzspannung L1 [%s V]"                            <poweroutlet_eu>    (SMA)    ["Measurement","Voltage"]        {channel="modbus:data:sma:power_a:volt_G1:number"}

Number     Sma_Betriebszeit     "Betriebszeit [JS(sectohms.js):%s]"                             <time>              (SMA)    ["Measurement","Duration"]       {channel="modbus:data:sma:SMA_Betriebszeit:Betriebszeit:number"}
Number     Sma_Einspeisezeit    "Einspeisezeit [JS(sectohms.js):%s]"                            <time>              (SMA)    ["Measurement","Duration"]       {channel="modbus:data:sma:SMA_Betriebszeit:Einspeisezeit:number"}


Re: Modbus Energiezähler (Victron EM24)

Verfasst: 8. Aug 2024 11:11
von spirit
Leider hilft mir das nicht weiter, ich bekomme immer eine Fehlermeldung zurück.

Habe schon einige Kombinationen versucht. Modbus ist echt der letzte Mist!

Code: Alles auswählen

2024-08-08 11:06:38.378 [WARN ] [rt.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=2, functionCode=READ_MULTIPLE_REGISTERS, start=300001, length=2, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 826b5630-cf52-4d86-b475-e0db366cac4b]
2024-08-08 11:06:38.460 [WARN ] [rt.modbus.internal.ModbusManagerImpl] - Try 2 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=2, functionCode=READ_MULTIPLE_REGISTERS, start=300001, length=2, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 826b5630-cf52-4d86-b475-e0db366cac4b]
2024-08-08 11:06:38.542 [ERROR] [rt.modbus.internal.ModbusManagerImpl] - Last try 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=2, functionCode=READ_MULTIPLE_REGISTERS, start=300001, length=2, maxTries=3]). Aborting. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 826b5630-cf52-4d86-b475-e0db366cac4b]
Hier mal meine Modbus.things:

Code: Alles auswählen

Bridge modbus:tcp:VictronEM24 "Modbus Victron EM24"  [ host="192.168.1.220", port=502, id=2, connectMaxTries=3] {

   Bridge poller Registers                     "Register"                [ start=300001, length=2, refresh=5000, type="holding" ] {
        Thing data Vl1                         "V L1-N"                  [ readStart="300001", readValueType="int32" ]   
}
 }   

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 8. Aug 2024 12:11
von rbeudel
Mal versucht die "300001" in "400001" zu ändern?

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 8. Aug 2024 13:43
von spirit
Hatte ich ebenfalls schon mal versucht.

Ich bekomme egal was ich eintippe diese Fehlermeldungen:

Code: Alles auswählen

2024-08-08 13:38:06.332 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:Vl1' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_INPUT_REGISTERS, start=30001, length=2, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-08 13:38:06.333 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:poller:VictronEM24:Registers' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveErrorResponseExceptionImpl: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-08 13:38:06.333 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:Vl1' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_INPUT_REGISTERS, start=30001, length=2, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS) to OFFLINE (BRIDGE_OFFLINE): No online bridge
Was mich wundert, ist das hier im Forum ganz andere Adressen genommen werden:
https://forum.iobroker.net/topic/47991/ ... m24-lan/52

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 9. Aug 2024 08:43
von rbeudel
Das einzige was ich dazu sagen kann ist das der Code 2 darauf hinweist das ein nicht vorhandenes Register abgefragt wurde. Mehr kann ich dazu leider nicht sagen.

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 10. Aug 2024 16:48
von mad-mike
Moin,
auf der zum Ziel habe ich folgende Hilfe genommen: :idea:

eine App (Android) (Modbus Viewer) wo man direkt suchen und Ansprechen kann...
Die App zeigte mir sehr schnell was an, wo ich stundenlang im openHAB versucht habe...

Zwischen Holding und input wechseln und auch die read addr. mal schnell umgetippt...



Dann weiter habe ich über die Konsole mit mbpoll weiter nach werten gesucht: (diente mehr zur kontrolle des 485 gateways)
beispiel von mir:

Code: Alles auswählen

mbpoll -a 1 -t 3 -c 125 -1  192.168.178.198
erst dann habe ich mich in mühevoller Kleinarbeit bei gemacht, das ganze ich Thing und Item datein zu schreiben.

Eventuell solltest du mal versuchen von "holding" auf "input" zu wechseln...

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 11. Aug 2024 07:39
von Tokamak
Wenn ich Posts in anderen Foren richtig verstehe, sind die Register ab 3... Holding Register, die gleichen Zahlen mit einer 4... Input Register.

Daher dürfte 300001 und "holding" grundsätzlich stimmen.

Was ich merkwürdig finde, ist, dass ich keine Info über die modbus id gefunden habe. Ich würde es daher mit id=1 oder id=0 versuchen, wobei ich eine id 0 noch nie gesehen habe.

Solltest du erfolgreich lesen können, aber merkwürdige Werte rausbekommen, tausche die endianness des Typs in int32_swap.

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 12. Aug 2024 14:24
von spirit
mad-mike hat geschrieben: 10. Aug 2024 16:48 Moin,
auf der zum Ziel habe ich folgende Hilfe genommen: :idea:

eine App (Android) (Modbus Viewer) wo man direkt suchen und Ansprechen kann...
Die App zeigte mir sehr schnell was an, wo ich stundenlang im openHAB versucht habe...

Zwischen Holding und input wechseln und auch die read addr. mal schnell umgetippt...



Dann weiter habe ich über die Konsole mit mbpoll weiter nach werten gesucht: (diente mehr zur kontrolle des 485 gateways)
beispiel von mir:

Code: Alles auswählen

mbpoll -a 1 -t 3 -c 125 -1  192.168.178.198
erst dann habe ich mich in mühevoller Kleinarbeit bei gemacht, das ganze ich Thing und Item datein zu schreiben.

Eventuell solltest du mal versuchen von "holding" auf "input" zu wechseln...
Ich hatte mir schon ein Windows Programm zum auslesen der Modbusadressen runtergeladen.

Dabei kommt auch das raus was in der PDF von Carlo Gavazzi steht.

Habe schon diverse Konstellationen probiert. Dabei natürlich auch zwischen Input/Holding, Slave ID 0/1/2/3/4 und diversen Registern gewechselt.

Es scheint an der Abfragemethode von Openhab zu liegen.. Hat jemand eine Idee?

Things:

Code: Alles auswählen

Bridge modbus:tcp:VictronEM24 "Modbus Victron EM24"  [ host="192.168.1.220", port=502, id=3] {

  Bridge poller Registers                     "Register"                [ start=30001, length=4, refresh=5000, type="holding" ] {
        Thing data test01                     "V L1-N"                  [ readStart="30001", readValueType="int32" ]  
        Thing data test02                     "V L1-N"                  [ readStart="30002", readValueType="int32" ] 
        Thing data test03                     "V L1-N"                  [ readStart="30003", readValueType="int32" ] 
        Thing data test03                     "V L1-N"                  [ readStart="30004", readValueType="int32" ]  
  }
}   

Code: Alles auswählen

2024-08-12 14:13:40.309 [WARN ] [rt.modbus.internal.ModbusManagerImpl] - Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 27dbf959-1d35-4823-b9a9-32f1e1c77689]
2024-08-12 14:13:40.391 [WARN ] [rt.modbus.internal.ModbusManagerImpl] - Try 2 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]). Will try again soon. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 27dbf959-1d35-4823-b9a9-32f1e1c77689]
2024-08-12 14:13:40.473 [ERROR] [rt.modbus.internal.ModbusManagerImpl] - Last try 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]). Aborting. Error was: net.wimpi.modbus.ModbusSlaveException Error Code = 2 [operation ID 27dbf959-1d35-4823-b9a9-32f1e1c77689]
==> /var/log/openhab/events.log <==
2024-08-12 14:13:40.474 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test01' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test02' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test03' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:poller:VictronEM24:Registers' changed from ONLINE to OFFLINE (COMMUNICATION_ERROR): Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveErrorResponseExceptionImpl: Slave responded with error=2 (ILLEGAL_DATA_ACCESS)
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test03' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS) to OFFLINE (BRIDGE_OFFLINE): No online bridge
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test02' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS) to OFFLINE (BRIDGE_OFFLINE): No online bridge
2024-08-12 14:13:40.475 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'modbus:data:VictronEM24:Registers:test01' changed from OFFLINE (COMMUNICATION_ERROR): Error (ModbusSlaveErrorResponseExceptionImpl) with read. Request: ModbusReadRequestBlueprint [slaveId=3, functionCode=READ_MULTIPLE_REGISTERS, start=30001, length=4, maxTries=3]. Description: ModbusSlaveErrorResponseException(error=2). Message: Slave responded with error=2 (ILLEGAL_DATA_ACCESS) to OFFLINE (BRIDGE_OFFLINE): No online bridge

Re: Modbus Energiezähler (Victron EM24)

Verfasst: 12. Aug 2024 15:31
von Tokamak
In der Version der .things fehlt eine 0. Es sollte 300001 sein, nicht 30001.

Am Rande: An einen Fehler glaube ich nicht. Ich lese einige Devices mit modbus aus, insgesamt vier verschiedene. Ab und an steigt mal ein Gerät für kurze Zeit aus, aber das Binding hat noch keinen Fehler gezeigt.