Help mapping Modbus registers for Dura inverter with Home Assistant

Hi all,

I’m trying to integrate my Dura inverter with Home Assistant using the Modbus integration, and I’ve done a full scan of the registers, but I’m having trouble figuring out what each register actually represents. Some of the data seems obvious, but others don’t match what the inverter shows, and some are currently zero (likely because the inverter wasn’t active during the scan).

Here’s what I have so far from a scan of slave ID 1:

Registers 4100-4109: [35003, 5004, 0, 0, 0, 0, 5004, 0, 0, 0]
Registers 4110-4119: [0, 5004, 0, 0, 0, 0, 0, 0, 0, 0]
Registers 4120-4129: [0, 0, 0, 0, 55, 3, 0, 0, 0, 0]
Registers 4130-4139: [288, 0, 1831, 0, 0, 0, 956, 0, 0, 0]
Registers 4140-4149: [0, 0, 0, 0, 0, 0, 1000, 0, 65535, 65535]

Registers 8200-8209: [5596, 65535, 35036, 0, 231, 0, 22906, 0, 85, 0]
Registers 8210-8219: [19729, 0, 0, 0, 100, 3421, 0, 3400, 0, 20]
Registers 8220-8229: [21, 0, 20, 0, 0, 0, 0, 0, 0, 0]
Registers 6660-6669: [13102, 13899, 11591, 12544, 0, 0, 0, 0, 0, 0]
Registers 6680-6689: [1049, 12342, 12337, 12337, 12849, 12340, 13363, 12342, 12337, 12333]
Registers 6690-6699: [12336, 12854, 12337, 12595, 12338, 12338, 12336, 12341, 12338, 12589]

What I’ve confirmed so far:

  • Battery voltage: ~53.6V → register 4100 (but not always consistent)
  • Battery current: register 8200 → shows ~53.7A when charging
  • SOC: register 4102 → shows 18%
  • Inverter power: register 4870
  • Grid import/export: registers 4871/4872
  • Solar power: register 6660
  • PV voltage: register 6661

Issues / questions:

  1. Some registers like dura_total_energy and dura_daily_generation (I tried 4130 & 8202) give invalid values in HA or zero.
  2. Frequency seems to appear in what I thought was battery current (register 4101).
  3. Many registers are currently zero — unsure if they’re only active during certain operations.
  4. I want to map all relevant registers so I can reliably read battery, grid, PV, and inverter stats in HA.

Has anyone successfully mapped all or most Modbus registers for a Dura inverter? Any guidance on the registers for:

  • Daily energy / cumulative energy
  • Battery charge/discharge currents
  • Battery voltage & SOC
  • PV input voltage & current
  • Inverter temps

I can provide more raw scan data if needed — I have a full dump of all registers.

Thanks in advance

Maybe an obvious question but have search for a document that describe the registers. Or searched the Duea website for downloads. It might also help if you just ask Dura for it.

i have and theres nothing out there also i dont think duracell will give that info

Hey there. Just joyned the HA World and had a similar issue with my Solis converter. They dont share the documentation and i had to sniff the registers. Have a little py script for that and found some unofficial documents to give me a start. You can find all that and my first working scripts to connect to the smartmeter and converter on my github @ GitHub - toszlanyi/HomeAssistant: here I store my Home Assistant configurations

Maybe you gonna find that useful. Some hints from my side…

  1. connection via lan is much more reliable. Couldnt get modbus integration really to work maybe also because of the long wires and electric noise. So i baught a waveshare RS485-to-ETH (B) and installed it next to the smart meter inside the electric cabinett. It reads the rs485 signals and sends it as tcp packages into my lan.

  2. you maybe already know - but worth to repeat - that registers come as 16 and 32 bit (combining 2 16bit tegisters using a major and minor field to connect them). If you have strange values then this is maybe the reason that you picked only one of the two 32bit registers. In my Github you find a little py script to sniff registers through (w)lan in the tools directory. Maybe that helps. Obviously you need to adjust ip address etc

So in summary… i went away from modbus and use pyscript (from hacs). I didnt know py so well (but java script) so with a little help from Claude AI i could write some simple py code to read the registers and writing them to raw variables. I give them HA attributes in the corresponding yaml files , in a sub directory to keep my configuration.yaml sober.

Just in case you have some basic coding skills i recommend that way. Long story and doesn’t really help with registers of your device but maybe it could give some hints. Good luck

Perhaps it’ll be a good idea to first provide all information from your inverter. Somethings it’s likely that an inverter gets sold using differnt vendors/names depending upon countries.
Perhaps even with the link to the inverter you got.

Then as @OsZ mentioned as long as you aren’t sure about length of the values (number of addresses) or even which byte order to be used I’d say you need to consider this aswell. Not to mention that it’s a common pratice with inverter vendort that values do work incombination with scale factors. Sort of 1 value gets stored at an address while it’s real value is multiplied by another one containing -2 means multiplied by 10 to the power of -2.

Besides the scripts (haven’t had a look at these) you could also run something such as modbustester www.thepowerhud.com just to name one. It would allow to read multiple registers in one go while being able to present the results no matter if big endian or little endian or both of them swapped.

Without any documentation it’ll be a had one … since you must log all unknown addresses while defining something on the other hand which should put recognisable values into addresses/registers.

I’m half way through with a Fronius Ohmpilit right now, and it took me lots of time, since no official document and rather questionalbe information on the internet.

@tonymul - what i forgot yesterday and @justone already asked for your hardware… It is more than likely that Dura didn’t invent their own modbus/tcp module and use some purchased parts instead. If you can find out what modeles they use, then you may have a reference spec from that module manufacturer. Obviously its likely that dura changed sth but it could well give you better hints for register sniffing. Your AC informations are best to get from the smart meter, if one is installed depending on the size and usage of your PV system. I use the Eastron SDM630 and they have got an official modbus dokumentation. If thats a similar case for you then you can read the modbus requests from your inverter to the smartmeter which gives more hints how the inverter is working.

So yeah, check your hardware including surroundings as detailed as you possibly can and feel free to share your findings.

Don’t do assumptions on something as simple as just asking to be sure.

Other then this I can only say you are into a tough and time consuming battle.
Good luck and I hope you get the data you need.

I just grabbed the hoymiles documents and feed that into Claude, along with the .py scripts I was able to get all the info via modbus/tcp from my Duracell inverters / DTU.

From what I’ve gathered all they are is just rebranded hoymiles products.

I can send you over what I have if you want?

hi all im very new to this stuff but i have been busy and have got a few sensors working here is a basic config so if you have the same inverter you can test this is modbus tcp on port 502

modbus:

  • name: duracell_durai
    type: tcp
    host: 192.168.1.50 # ← change to your inverter IP
    port: 502

    sensors:

    ########################################

    LIVE DATA

    ########################################

    • name: “Duracell Battery SOC”
      address: 8192
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”
      scan_interval: 2

    • name: “Duracell BMS Code”
      address: 8194
      input_type: holding
      data_type: uint16
      scan_interval: 2

    • name: “Duracell Battery Voltage”
      address: 8198
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “V”
      device_class: voltage
      scan_interval: 2

    • name: “Duracell Battery Current”
      address: 8200
      input_type: holding
      data_type: int16
      scale: 0.01
      unit_of_measurement: “A”
      device_class: current
      scan_interval: 2

    • name: “Duracell Battery Power”
      address: 8202
      input_type: holding
      data_type: int16
      scale: 0.1
      unit_of_measurement: “W”
      device_class: power
      scan_interval: 2

    • name: “Duracell Battery Temperature”
      address: 8219
      input_type: holding
      data_type: uint16
      unit_of_measurement: “°C”
      device_class: temperature
      scan_interval: 2

    • name: “Duracell Inverter Temperature”
      address: 4124
      input_type: holding
      data_type: uint16
      unit_of_measurement: “°C”
      device_class: temperature
      scan_interval: 2

    • name: “Duracell Grid Voltage”
      address: 4097
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “V”
      device_class: voltage
      scan_interval: 2

    • name: “Duracell Grid Frequency”
      address: 4101
      input_type: holding
      data_type: uint16
      scale: 0.01
      unit_of_measurement: “Hz”
      device_class: frequency
      scan_interval: 2

    • name: “Duracell PV Power Total”
      address: 4100
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “W”
      device_class: power
      scan_interval: 2

    • name: “Duracell MPPT1 Voltage”
      address: 4112
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “V”
      device_class: voltage
      scan_interval: 2

    • name: “Duracell MPPT1 Current”
      address: 4113
      input_type: holding
      data_type: uint16
      scale: 0.01
      unit_of_measurement: “A”
      device_class: current
      scan_interval: 2

    • name: “Duracell MPPT1 Power”
      address: 4115
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “W”
      device_class: power
      scan_interval: 2

    • name: “Duracell Grid Power”
      address: 2041
      input_type: holding
      data_type: int16
      scale: 0.01
      unit_of_measurement: “W”
      device_class: power
      scan_interval: 2

    • name: “Duracell Load Power”
      address: 2046
      input_type: holding
      data_type: int16
      scale: 0.01
      unit_of_measurement: “W”
      device_class: power
      scan_interval: 2

    • name: “Duracell Grid/CT Current”
      address: 4894
      input_type: holding
      data_type: int16
      scale: 0.01
      unit_of_measurement: “A”
      device_class: current
      scan_interval: 2

    ########################################

    STATISTICS

    ########################################

    • name: “Duracell PV Peak Power”
      address: 4156
      input_type: holding
      data_type: uint16
      scale: 0.1
      unit_of_measurement: “W”
      device_class: power

    • name: “Duracell Energy Total”
      address: 4130
      input_type: holding
      data_type: uint16
      unit_of_measurement: “kWh”

    • name: “Duracell Energy Today”
      address: 4136
      input_type: holding
      data_type: uint16
      scale: 0.001
      unit_of_measurement: “kWh”

    ########################################

    CONFIGURATION REGISTERS

    ########################################

    • name: “Duracell Grid Charge Max Power”
      address: 8470
      input_type: holding
      data_type: uint16
      unit_of_measurement: “W”

    • name: “Duracell Max Charge Power”
      address: 8472
      input_type: holding
      data_type: uint16
      unit_of_measurement: “W”

    • name: “Duracell Max Discharge Power”
      address: 8474
      input_type: holding
      data_type: uint16
      unit_of_measurement: “W”

    • name: “Duracell Charge End SOC”
      address: 8473
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”

    • name: “Duracell Discharge End SOC”
      address: 8475
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”

    • name: “Duracell Discharge End SOC On-Grid”
      address: 8522
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”

    • name: “Duracell Force Charge SOC Start”
      address: 8516
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”

    • name: “Duracell Force Charge SOC Stop”
      address: 8517
      input_type: holding
      data_type: uint16
      unit_of_measurement: “%”

    • name: “Duracell Max Grid Input”
      address: 8485
      input_type: holding
      data_type: uint16
      unit_of_measurement: “W”

    • name: “Duracell Max Grid Force Charge”
      address: 8528
      input_type: holding
      data_type: uint16
      unit_of_measurement: “W”