{
  "spec_version": 1,
  "slug": "fox-ess-ev-charger",
  "manufacturer": "Fox ESS",
  "model": "EV Charger (EVC, A/C series)",
  "category": "EV charger",
  "supplier_url": "https://www.fox-ess.com/products/ev-charger/c-series",
  "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": 4096,
      "count": 1,
      "name": "Device address",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Modbus device address of the charger (factory default 1)."
    },
    {
      "address": 4097,
      "count": 1,
      "name": "Software version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Example: 0x0110 = version 1.16."
    },
    {
      "address": 4098,
      "count": 1,
      "name": "Stop reason",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = none, 1 = stopped on command, 2 = timed charging completed, 3 = S2 timeout, 4 = charging pause timeout, 5 = emergency stop button pressed, 6 = abnormal CP voltage, 7 = abnormal connector removal, 8 = abnormal AC contactor, 9 = abnormal electronic lock, 10 = abnormal card reader, 11 = overcurrent, 12 = overvoltage, 13 = undervoltage, 14 = charging port overtemperature, 15 = leakage current, 16 = N line reversed, 17 = abnormal frequency, 18 = charging stop button pressed, 19 = abnormal circuit breaker, 20 = phase loss, 21 = abnormal PE, 22 = abnormal external meter, 23 = environment overtemperature, 24 = metering chip failure, 25 = access control failure, 26 = phase-switch box fault, 27 = predetermined energy reached."
    },
    {
      "address": 4099,
      "count": 1,
      "name": "Connector status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = idle, 1 = connect, 2 = start, 3 = charging, 4 = pause, 5 = finish, 6 = fault, 7 = reserve, 8 = locked."
    },
    {
      "address": 4100,
      "count": 1,
      "name": "CP status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = CP fault, 1 = CP 12 V (not connected), 2 = CP 9 V (connected), 3 = CP 6 V (car ready)."
    },
    {
      "address": 4101,
      "count": 1,
      "name": "CC connection status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = plug unconnected, 1 = plug connected."
    },
    {
      "address": 4102,
      "count": 1,
      "name": "Charging port temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": -50,
      "access": "R",
      "description": "Raw * 0.1 - 50. Not fitted on the plug version; fixed 0xFFFF from certain firmware versions."
    },
    {
      "address": 4103,
      "count": 1,
      "name": "EVC environment temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": -50,
      "access": "R",
      "description": "Raw * 0.1 - 50."
    },
    {
      "address": 4104,
      "count": 1,
      "name": "Voltage phase A",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4105,
      "count": 1,
      "name": "Voltage phase B",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4106,
      "count": 1,
      "name": "Voltage phase C",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4107,
      "count": 1,
      "name": "Current phase A",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4108,
      "count": 1,
      "name": "Current phase B",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4109,
      "count": 1,
      "name": "Current phase C",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4110,
      "count": 1,
      "name": "Active power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4111,
      "count": 1,
      "name": "Electronic lock status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = unlocked, 1 = locked."
    },
    {
      "address": 4112,
      "count": 1,
      "name": "Current phase sequence",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = three-phase, 1 = L2, 2 = L3, 3 = reserve. Only meaningful with the external phase-switch box."
    },
    {
      "address": 4113,
      "count": 1,
      "name": "Max supported power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Model rating."
    },
    {
      "address": 4114,
      "count": 1,
      "name": "Min supported power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4115,
      "count": 1,
      "name": "Max supported current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Per phase; model rating."
    },
    {
      "address": 4116,
      "count": 1,
      "name": "Min supported current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4117,
      "count": 1,
      "name": "System alarm information",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Alarm bitfield, see the alarm code appendix of the protocol."
    },
    {
      "address": 4118,
      "count": 2,
      "name": "Current energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Internal meter reading."
    },
    {
      "address": 4120,
      "count": 2,
      "name": "Total charging energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4122,
      "count": 2,
      "name": "System fault information",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Fault bitfield, see the fault code appendix of the protocol."
    },
    {
      "address": 4124,
      "count": 2,
      "name": "RFID card",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "UID of the card that started the current session."
    },
    {
      "address": 4126,
      "count": 4,
      "name": "Id model code",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "8 bytes, e.g. A022KP1."
    },
    {
      "address": 4130,
      "count": 16,
      "name": "Id serial number",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "32 bytes, zero padded."
    },
    {
      "address": 4146,
      "count": 10,
      "name": "Extended RFID card",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "20 bytes, zero padded; only on some models."
    },
    {
      "address": 4156,
      "count": 1,
      "name": "Connector number",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = single connector, 2 = dual connector."
    },
    {
      "address": 4157,
      "count": 1,
      "name": "Single/three-phase switching status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = idle, 1 = switching 3-phase to single-phase, 2 = switching single-phase to 3-phase."
    },
    {
      "address": 4158,
      "count": 1,
      "name": "Single/three-phase work status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = idle, 1 = three-phase charging, 2 = single-phase charging."
    },
    {
      "address": 4159,
      "count": 1,
      "name": "Real-time power phase A",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4160,
      "count": 1,
      "name": "Real-time power phase B",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 4161,
      "count": 1,
      "name": "Real-time power phase C",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 12288,
      "count": 1,
      "name": "Work mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = controlled mode, 1 = plug and charge, 2 = lock mode. Takes effect only while no connector is connected."
    },
    {
      "address": 12289,
      "count": 1,
      "name": "Max charging current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Applies for one minute, then reverts to the rated maximum; 0 stops charging."
    },
    {
      "address": 12290,
      "count": 1,
      "name": "Max charging power",
      "data_type": "UInt16",
      "units": "kW",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Applies for one minute, then reverts to the rated maximum; 0 stops charging."
    },
    {
      "address": 12291,
      "count": 1,
      "name": "Allowable charge time",
      "data_type": "UInt16",
      "units": "min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xFFFF = no limit."
    },
    {
      "address": 12292,
      "count": 1,
      "name": "Allowable charge energy",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0xFFFF = no limit."
    },
    {
      "address": 12293,
      "count": 1,
      "name": "Time validity",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "How long the last command value is valid; default 180 s, range 10-255 s."
    },
    {
      "address": 12294,
      "count": 1,
      "name": "Default current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Current used when the link to the EMS is lost."
    },
    {
      "address": 12298,
      "count": 1,
      "name": "Single/three-phase automatic switching",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = disabled, 1 = enabled; switches at 4.2 kW. Not supported on single-phase models."
    },
    {
      "address": 12299,
      "count": 1,
      "name": "EVC suspend switching minimum interval",
      "data_type": "UInt16",
      "units": "min",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0-30 min, default 12 min."
    },
    {
      "address": 12300,
      "count": 1,
      "name": "Current charging connector number",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = connector 1 (default), 0 = the EVC itself; only multi-connector models."
    },
    {
      "address": 12301,
      "count": 1,
      "name": "Minimum interval for EVC suspended status change",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0-1800 s, default 720 s; finer-grained form of register 12299."
    },
    {
      "address": 16384,
      "count": 1,
      "name": "Electronic lock control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "0 = no action, 1 = unlock, 2 = lock."
    },
    {
      "address": 16385,
      "count": 1,
      "name": "Charging control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "0 = no action, 1 = start charging, 2 = stop charging."
    },
    {
      "address": 16386,
      "count": 1,
      "name": "Phase sequence switching",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "0 = three-phase, 1 = L2, 2 = L3; only with the external phase-switch box."
    },
    {
      "address": 16387,
      "count": 1,
      "name": "Restart",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "W",
      "description": "Write 0xA5A5 to restart the charger."
    }
  ],
  "combined_registers": [],
  "notes": "MIRROR-SOURCED (vendor-authored, hosting unconfirmed). Source: Fox ESS \"EV Charger - Modbus TCP & RTU Protocol V1.06\" (file number MTWH-2024-0001, dated 2025-07-02), chapter 2 \"Register List\" and sections 2.1-2.50 for types, scaling and enums; the vendor's EV charger protocol document, read from the copy of the protocol document in Fox ESS's own website asset storage (the vendor download pages serve the user manuals, not this protocol) at https://cdn.prod.website-files.com/6a7ae62372cb780ff5be747e/6abaad94818d6bac9bad9d21_Fox-ESS-EV-Charger-Modbus-TCP---RTU-Protocol-1.06-(1).pdf. Section 1.4 item (5) documents the Modbus TCP default port 502, and the MBAP unit-identification field (§1.6.1.1) and §2.1 both give the device address range with default 1; the table prints hex register addresses (0x1000 = 4096) which are stored here unchanged as zero-based wire addresses. All rows are holding registers on function codes 3/6/16. Temperatures scale as raw * 0.1 - 50 C. The document's RTU baud rate is not stated anywhere, so only the TCP transport is declared; the RTU path would need the site's own gateway settings. Alarm and fault bit fields are referenced by register, not transcribed row by row. This is the wallbox itself, a different device family from the library's Fox ESS inverter seeds (fox-ess-h3, fox-ess-h3-pro-smart, fox-ess-avocado), whose register map it does not share. File identity: SHA-256 5a47f709341d34d53b04e12fc466d84fc6ea78db3379dc933f4ea41d98df1e68 (PDF, downloaded 2026-11-07)."
}
