{
  "spec_version": 1,
  "slug": "fox-ess-h3-pro-smart",
  "manufacturer": "FoxESS",
  "model": "H3-Pro / H3 Smart hybrid inverter (also A-Tronix AX Plus)",
  "category": "Solar inverter",
  "supplier_url": "https://www.foxess.com/",
  "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": 37612,
      "count": 1,
      "name": "Battery state of charge",
      "data_type": "Int16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 38816,
      "count": 2,
      "name": "Meter power, phase R",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": -0.1,
      "offset": 0,
      "access": "R",
      "description": "The cited template negates and scales it by 0.1, so a positive register value means export."
    },
    {
      "address": 38818,
      "count": 2,
      "name": "Meter power, phase S",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": -0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 38820,
      "count": 2,
      "name": "Meter power, phase T",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": -0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39237,
      "count": 2,
      "name": "Battery charge/discharge power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39279,
      "count": 2,
      "name": "PV1 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39281,
      "count": 2,
      "name": "PV2 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39283,
      "count": 2,
      "name": "PV3 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39285,
      "count": 2,
      "name": "PV4 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39287,
      "count": 2,
      "name": "PV5 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39289,
      "count": 2,
      "name": "PV6 power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 39617,
      "count": 2,
      "name": "Grid consumption total",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 46001,
      "count": 1,
      "name": "Remote control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The cited template writes 0 (disabled) and 1 (enabled)."
    },
    {
      "address": 46002,
      "count": 1,
      "name": "Remote control timeout",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The cited template writes 60."
    },
    {
      "address": 46003,
      "count": 2,
      "name": "Remote active power setpoint",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The template writes a negative value to force charging; the word layout is high word at 46003 and low word at 46004."
    },
    {
      "address": 46608,
      "count": 1,
      "name": "Battery maximum discharge current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "The template writes the configured current multiplied by 10. Its help text says the inverter factory default is 50 A on H3-Pro/Smart (26 A on the older H3), and that 0 blocks discharge completely."
    },
    {
      "address": 46609,
      "count": 1,
      "name": "Minimum state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 46610,
      "count": 1,
      "name": "Maximum state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 46611,
      "count": 1,
      "name": "Minimum state of charge, on-grid reserve",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Discharge floor that must stay below the maximum state of charge; the inverter rejects a maximum SOC at or below this value."
    },
    {
      "address": 49203,
      "count": 1,
      "name": "Work mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The cited template writes 1 for self use and 3 for back-up."
    }
  ],
  "combined_registers": [],
  "notes": "Source: the evcc meter template https://raw.githubusercontent.com/evcc-io/evcc/master/templates/definition/meter/fox-ess-h3-smart.yaml, used as a secondary source; no FoxESS register document was retrieved. It covers the FoxESS H3-Pro / H3 Smart series hybrid inverter and the A-Tronix AX Plus. This is NOT the same map as the older H3 generation in the fox-ess-h3 seed: that one lives in the 31xxx/41xxx/44xxx blocks, while this generation reports PV, battery and meter data in the 37xxx/38xxx/39xxx blocks and is controlled through 46xxx/49xxx. Do not use the two interchangeably. The template offers RS-485 and TCP access with unit ID 247; this seed records the TCP path (port 502, unit ID 247) because the template states no RS-485 baud rate or framing. All rows are holding registers; the PV rows are read as one 12-register block (39279-39290). Scales, types and the write values above are the template's own encoding. The template needs the battery's maximum discharge current as a parameter (it writes it back when leaving hold mode), which is why the 0.1 A scaling of 46608 is recorded here."
}
