{
  "spec_version": 1,
  "slug": "goodwe-et-eh",
  "manufacturer": "GoodWe",
  "model": "ET / EH / BT / BH hybrid inverter",
  "category": "Solar inverter",
  "supplier_url": "https://en.goodwe.com/support",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 247,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 35103,
      "count": 1,
      "name": "PV1 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35104,
      "count": 1,
      "name": "PV1 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35105,
      "count": 2,
      "name": "PV1 power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35107,
      "count": 1,
      "name": "PV2 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35108,
      "count": 1,
      "name": "PV2 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35109,
      "count": 2,
      "name": "PV2 power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35113,
      "count": 2,
      "name": "PV3 power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35117,
      "count": 2,
      "name": "PV4 power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35121,
      "count": 1,
      "name": "On-grid L1 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35122,
      "count": 1,
      "name": "On-grid L1 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35123,
      "count": 1,
      "name": "On-grid L1 frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35125,
      "count": 1,
      "name": "On-grid L1 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35126,
      "count": 1,
      "name": "On-grid L2 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35127,
      "count": 1,
      "name": "On-grid L2 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35128,
      "count": 1,
      "name": "On-grid L2 frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35130,
      "count": 1,
      "name": "On-grid L2 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35131,
      "count": 1,
      "name": "On-grid L3 voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35132,
      "count": 1,
      "name": "On-grid L3 current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35133,
      "count": 1,
      "name": "On-grid L3 frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35135,
      "count": 1,
      "name": "On-grid L3 power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35136,
      "count": 1,
      "name": "Grid mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = on-grid, 1 = off-grid (backup), 2 = fault."
    },
    {
      "address": 35138,
      "count": 1,
      "name": "Total inverter power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35140,
      "count": 1,
      "name": "Active power (grid connection point)",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Positive = export to the grid, negative = import."
    },
    {
      "address": 35142,
      "count": 1,
      "name": "Reactive power",
      "data_type": "Int16",
      "units": "var",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35144,
      "count": 1,
      "name": "Apparent power",
      "data_type": "Int16",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35164,
      "count": 1,
      "name": "Load L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "House load per phase, derived from the inverter's own measurement."
    },
    {
      "address": 35166,
      "count": 1,
      "name": "Load L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35168,
      "count": 1,
      "name": "Load L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35172,
      "count": 1,
      "name": "Load total",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35173,
      "count": 1,
      "name": "UPS load",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35174,
      "count": 1,
      "name": "Inverter temperature (air)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35176,
      "count": 1,
      "name": "Inverter temperature (radiator)",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35180,
      "count": 1,
      "name": "Battery voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35181,
      "count": 1,
      "name": "Battery current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Positive = charging."
    },
    {
      "address": 35182,
      "count": 2,
      "name": "Battery power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Positive = charging, negative = discharging."
    },
    {
      "address": 35184,
      "count": 1,
      "name": "Battery mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = standby, 2 = discharging, 3 = charging, 4 = waiting."
    },
    {
      "address": 35185,
      "count": 1,
      "name": "Warning code",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35187,
      "count": 1,
      "name": "Work mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "See the work mode table (0 = wait, 1 = normal, 2 = error/off, ...)."
    },
    {
      "address": 35188,
      "count": 1,
      "name": "Operation mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35189,
      "count": 2,
      "name": "Error codes",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit field of active error codes; 0 = no error."
    },
    {
      "address": 35191,
      "count": 2,
      "name": "Total PV generation",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35193,
      "count": 2,
      "name": "Today's PV generation",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35195,
      "count": 2,
      "name": "Total energy (export)",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35197,
      "count": 2,
      "name": "Total working hours",
      "data_type": "UInt32",
      "units": "h",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35199,
      "count": 1,
      "name": "Today's energy (export)",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35200,
      "count": 2,
      "name": "Total energy (import)",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35202,
      "count": 1,
      "name": "Today's energy (import)",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35203,
      "count": 2,
      "name": "Total load",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35205,
      "count": 1,
      "name": "Today's load",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35206,
      "count": 2,
      "name": "Total battery charge",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35208,
      "count": 1,
      "name": "Today's battery charge",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35209,
      "count": 2,
      "name": "Total battery discharge",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35211,
      "count": 1,
      "name": "Today's battery discharge",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 35220,
      "count": 2,
      "name": "Diagnosis result",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit field of diagnostic status codes."
    },
    {
      "address": 36004,
      "count": 1,
      "name": "Meter communication status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = meter not connected, 1 = communicating."
    },
    {
      "address": 36008,
      "count": 1,
      "name": "Meter active power, total",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36014,
      "count": 1,
      "name": "Meter frequency",
      "data_type": "UInt16",
      "units": "Hz",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36015,
      "count": 2,
      "name": "Meter total energy (export)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36017,
      "count": 2,
      "name": "Meter total energy (import)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36025,
      "count": 2,
      "name": "Meter active power, total (32-bit)",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Preferred meter power register."
    },
    {
      "address": 36052,
      "count": 1,
      "name": "Meter voltage, L1",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36053,
      "count": 1,
      "name": "Meter voltage, L2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36054,
      "count": 1,
      "name": "Meter voltage, L3",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36055,
      "count": 1,
      "name": "Meter current, L1",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36056,
      "count": 1,
      "name": "Meter current, L2",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 36057,
      "count": 1,
      "name": "Meter current, L3",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 37004,
      "count": 1,
      "name": "Battery charge current limit",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 37005,
      "count": 1,
      "name": "Battery discharge current limit",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 37007,
      "count": 1,
      "name": "Battery state of charge (SOC)",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 37008,
      "count": 1,
      "name": "Battery state of health (SOH)",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 47500,
      "count": 1,
      "name": "Battery SOC protection",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disabled, 1 = enabled. Blocks charging above the upper SOC limit."
    },
    {
      "address": 47509,
      "count": 1,
      "name": "Grid export limit enable",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = no export limit, 1 = limit active."
    },
    {
      "address": 47510,
      "count": 1,
      "name": "Grid export limit",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Maximum export power in W; write the value before enabling the limit in 47509."
    },
    {
      "address": 47511,
      "count": 1,
      "name": "EMS power mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = normal operation, 2 = charge from PV (standby), 4 = import-AC charge, 6 = conserve."
    },
    {
      "address": 47512,
      "count": 1,
      "name": "EMS power set",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Maximum power drawn from the grid for battery charging in EMS mode 2/4; 0 = PV only."
    },
    {
      "address": 47760,
      "count": 1,
      "name": "SOC upper limit",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    }
  ],
  "combined_registers": [
    {
      "id": "pv-power-total",
      "label": "PV power, all strings (calculated)",
      "operator": "+",
      "operand_a": {
        "combined_id": "pv-power-strings-1-2"
      },
      "operand_b": {
        "combined_id": "pv-power-strings-3-4"
      },
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "description": "PV1 + PV2 + PV3 + PV4. GoodWe has no single total-PV-power register; unused strings report 0."
    },
    {
      "id": "pv-power-strings-1-2",
      "label": "PV power, strings 1+2 (calculated)",
      "operator": "+",
      "operand_a": {
        "register_type": "holding_registers",
        "register_address": 35105
      },
      "operand_b": {
        "register_type": "holding_registers",
        "register_address": 35109
      },
      "units": "W",
      "scale_factor": 1,
      "offset": 0
    },
    {
      "id": "pv-power-strings-3-4",
      "label": "PV power, strings 3+4 (calculated)",
      "operator": "+",
      "operand_a": {
        "register_type": "holding_registers",
        "register_address": 35113
      },
      "operand_b": {
        "register_type": "holding_registers",
        "register_address": 35117
      },
      "units": "W",
      "scale_factor": 1,
      "offset": 0
    }
  ],
  "notes": "GoodWe hybrid inverters (platform 205/745/753: ET, EH, BT, BH, and GE's GEH) speak Modbus TCP through the LAN/WiFi dongle on port 502. Unit ID 247 is the usual address for the ET/EH family; some firmware versions answer on 0 or 255 instead, and the AA55 UDP protocol on port 48899 (unit ID 0) exposes the same register map and is what the manufacturer's own tools use. All registers in this file are holding registers. Scale factors: voltages and currents are 0.1, frequency 0.01, temperature 0.1, energy counters 0.1 kWh, and the power registers are plain watts. The 36000 block is only valid with a GoodWe smart meter (or CT) installed; without one, the meter registers return 0 and register 36004 reports 0. The 35100-35102 registers that precede the measurement block hold the inverter date/time as three byte-packed registers (year-2000, month, day, hour, minute, second) and are not represented here. The 37000 block is only valid on models with a battery. Large reads work: the whole 35100-35224 block can be read with one request of 125 registers, and 35100 is the natural polling start. Settings in the 47500 block take effect immediately and are stored by the inverter, so write them only when a setpoint changes. Source: GoodWe's hybrid-inverter Modbus register list as used by the open-source goodwe Python library and the evcc GoodWe templates. Battery compatibility: GoodWe's compatibility overview (V029.1, 2026-10-22) approves GoodWe's own Lynx Home F / F PLUS+ / F G2, Lynx C / D / D G2 and BAT high-voltage packs on the ET (5-10 kW), EH, BT and BH columns, and also ticks BYD Battery-Box Premium HVM 13.8-22.1 and HVS on all of those columns plus EHB, ET 15-30 and ET G2, while HVM 8.3 carries ticks only on ET 5-10, EH, BT and BH; Pylontech Force H1/H2/H3 is ticked on EH/BT/BH (Force also ET G2), LG RESU Type-R/Prime on EHB only, and the Dyness Tower/Tower Pro range is listed - https://en.goodwe.com/Ftp/EN/Downloads/User%20Manual/GW_Battery%20Compatibility%20Overview-EN.pdf."
}
