{
  "spec_version": 1,
  "slug": "cfos-power-brain",
  "manufacturer": "cFos",
  "model": "Power Brain Controller / Wallbox",
  "category": "EV charger",
  "supplier_url": "https://www.cfos-emobility.de/en/cfos-power-brain/modbus-registers.htm",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 4701,
    "unit_id": 1,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 8040,
      "count": 1,
      "name": "Modbus slave ID",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Slave ID the controller answers on, factory default 1."
    },
    {
      "address": 8057,
      "count": 1,
      "name": "Meter flags",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit 0 = the attached counter has individual phases."
    },
    {
      "address": 8062,
      "count": 2,
      "name": "Active power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Active power of the attached counter."
    },
    {
      "address": 8064,
      "count": 2,
      "name": "Current L1",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8066,
      "count": 2,
      "name": "Current L2",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8068,
      "count": 2,
      "name": "Current L3",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8080,
      "count": 1,
      "name": "Default fixed current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Value the cable current returns to after a restart."
    },
    {
      "address": 8081,
      "count": 1,
      "name": "Default charging current limit",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Value the charging current limit returns to after a restart; 6-63 A."
    },
    {
      "address": 8082,
      "count": 1,
      "name": "Default charging enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = charging disabled, 1 = charging enabled after a restart."
    },
    {
      "address": 8083,
      "count": 2,
      "name": "Failsafe duration",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Seconds without a Modbus read or write before the failsafe current is applied; 0 deactivates, default 300."
    },
    {
      "address": 8085,
      "count": 1,
      "name": "Failsafe current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Current applied during inactivity; 0 disables charging."
    },
    {
      "address": 8086,
      "count": 1,
      "name": "Disconnect CP",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write: seconds until the control pilot is switched off. Read: seconds remaining."
    },
    {
      "address": 8087,
      "count": 1,
      "name": "Relay select",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = 3-phase contactor, 1 = 1-phase contactor, for wallboxes that support phase switching (controller revision F or newer)."
    },
    {
      "address": 8088,
      "count": 1,
      "name": "Relay 2",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = relay 2 off, 1 = relay 2 on (only while relay 1 is off), for wallboxes that support it."
    },
    {
      "address": 8090,
      "count": 1,
      "name": "Cable current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Maximum cable current from the control pilot proximity pin; 0 = no cable."
    },
    {
      "address": 8091,
      "count": 1,
      "name": "Fixed current",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Overrides the cable current from the proximity pin."
    },
    {
      "address": 8092,
      "count": 1,
      "name": "Charge pilot state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = A (waiting), 1 = B (vehicle detected), 2 = C (charging), 3 = D (charging with ventilation), 4 = E (no current), 5 = F (error), 9 = DC sensor error; other values are errors."
    },
    {
      "address": 8093,
      "count": 1,
      "name": "Charging current limit",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "RW",
      "description": "Charging current limit, 6-63 A; may be capped by the model (a Power Brain 11 kW stops at 16 A)."
    },
    {
      "address": 8094,
      "count": 1,
      "name": "Charging enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "0 = charging disabled, 1 = charging enabled."
    },
    {
      "address": 8095,
      "count": 1,
      "name": "Charging current measured",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8096,
      "count": 15,
      "name": "Last RFID",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Hex string of the last RFID card that was read."
    },
    {
      "address": 8111,
      "count": 1,
      "name": "Detected RFID inputs",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 8112,
      "count": 1,
      "name": "Has meter",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 when a counter is attached, so that 8057-8068 deliver values."
    },
    {
      "address": 8113,
      "count": 1,
      "name": "S0 inputs",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit 0 = S0 input 1 state, bit 1 = S0 input 2 state, bit 8 = switching between 1 and 3 phases is permitted while plugged in, bit 9 = bit 10 is valid, bit 10 = second relay present, bit 11 = relay 2 is controlled externally (8088)."
    },
    {
      "address": 8120,
      "count": 2,
      "name": "Restart counter",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 8122,
      "count": 1,
      "name": "Controller temperature",
      "data_type": "UInt16",
      "units": "°C",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Only for the cFos Power Brain Controller and the Wallbox Booster, controller revision 3.0 and newer."
    }
  ],
  "combined_registers": [],
  "notes": "Source: cFos eMobility, \"Modbus Registers\" for the cFos Power Brain Controller (https://www.cfos-emobility.de/en/cfos-power-brain/modbus-registers.htm and the PDF \"cFos-Modbus\", revision of 2024). The controller is the Modbus server on TCP port 4701 (not 502) with slave ID 1, and supports function codes 03, 06 and 16 on holding registers. A second S0 meter answers on slave ID 2 / TCP port 4702 and a third on 3 / 4703, so those registers are not part of this map. The 64-bit import-energy counter at 8058 (four registers) and the 64-bit pulse counter at 8050 are omitted because the app has no 64-bit integer data type; power and the per-phase currents give the same information in 32-bit form. The register summary in the German PDF and the English web page differ in the layout of the identification block (8000-8040), so only the slave ID register, which both render identically, is listed from that block. Writing registers other than charging_cur_limit/fixed_current/charging_enable/disconnect_cp/relay_select/relay2 is stored to flash, so keep write cycles low."
}
