{
  "spec_version": 1,
  "slug": "hoymiles-dtu-pro-s",
  "manufacturer": "Hoymiles",
  "model": "HMT / HMS micro-inverters via DTU PRO S datalogger",
  "category": "Micro-inverter gateway",
  "supplier_url": "https://www.hoymiles.com/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 4104,
      "count": 1,
      "name": "Micro-inverter 1 AC power",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Byte offset 0x10 in the inverter's block; the DTU reports 0.1 W steps."
    },
    {
      "address": 4106,
      "count": 2,
      "name": "Micro-inverter 1 lifetime production",
      "data_type": "UInt32",
      "units": "Wh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Byte offset 0x14 in the inverter's block."
    }
  ],
  "combined_registers": [],
  "notes": "Register layout of the DTU PRO S Modbus TCP server, taken from the evcc implementation meter/hoymiles-dtu-mbtcp.go (evcc-io/evcc) and checked against Hoymiles' DTU Modbus register map. Modbus TCP on port 502, unit ID 1, holding registers; Modbus TCP has to be enabled on the datalogger, which then has to be connected to the LAN. Each micro-inverter occupies a 0x28 byte (20 register) block starting at 0x1000: inverter 1 at 0x1000, inverter 2 at 0x1014, inverter 3 at 0x1028 and so on. Inside a block the inverter serial number is in bytes 0x01-0x06, the port number in byte 0x07, the AC power in bytes 0x10-0x11 (0.1 W steps) and the lifetime production in bytes 0x14-0x17 (Wh). The registers below are block 1; add 20 registers per further inverter. The datalogger returns zeros for unoccupied slots, which is how the scan stops."
}
