{
  "spec_version": 1,
  "slug": "e3dc-s10",
  "manufacturer": "E3/DC",
  "model": "S10 Hauskraftwerk / Quattroporte / Q10 / P10 (E3/DC Simple Mode)",
  "category": "Home battery",
  "supplier_url": "https://www.e3dc.com/en/products/s10-xplus/",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 1,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 40001,
      "count": 1,
      "name": "Magic byte / Modbus ID",
      "data_type": "Hex",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Always 0xE3DC (58332 decimal). Read it first: if it is not there, the register offset of the client differs by one or two (see the vendor document, section 4.1)."
    },
    {
      "address": 40003,
      "count": 1,
      "name": "Number of supported registers",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "How many registers this firmware serves."
    },
    {
      "address": 40004,
      "count": 16,
      "name": "Manufacturer",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register; reads \"HagerEnergy GmbH\"."
    },
    {
      "address": 40020,
      "count": 16,
      "name": "Model",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register; e.g. \"S10 E AIO\" or \"Q10\"."
    },
    {
      "address": 40036,
      "count": 16,
      "name": "Serial number",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register; e.g. \"S10-12345678912\"."
    },
    {
      "address": 40052,
      "count": 16,
      "name": "Firmware release",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register; e.g. \"S10_2021_04\"."
    },
    {
      "address": 40068,
      "count": 2,
      "name": "Photovoltaic power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40070,
      "count": 2,
      "name": "Battery power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; negative values mean the battery is discharging."
    },
    {
      "address": 40072,
      "count": 2,
      "name": "House consumption power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40074,
      "count": 2,
      "name": "Power at the grid connection point",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; negative values mean feed-in to the grid."
    },
    {
      "address": 40076,
      "count": 2,
      "name": "Power of all additional generators",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40078,
      "count": 2,
      "name": "Wallbox power",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40080,
      "count": 2,
      "name": "Solar power used by the wallbox",
      "data_type": "Int32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40083,
      "count": 1,
      "name": "Battery state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40084,
      "count": 1,
      "name": "Emergency power status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = emergency power not supported by this device, 1 = emergency power active (grid failure), 2 = emergency power not active, 3 = emergency power not available, 4 = motor switch of an S10 E / S10 E PRO not in the ON position."
    },
    {
      "address": 40085,
      "count": 1,
      "name": "EMS status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Bit field: bit 0 = battery charging blocked, bit 1 = battery discharging blocked, bit 2 = emergency power possible (batteries charged), bit 3 = weather-based charging holds back capacity, bit 4 = output power curtailed because the feed-in limit is reached, bit 5 = charging lockout time active, bit 6 = discharging lockout time active."
    },
    {
      "address": 40088,
      "count": 1,
      "name": "Wallbox 0 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40089,
      "count": 1,
      "name": "Wallbox 1 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40090,
      "count": 1,
      "name": "Wallbox 2 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40091,
      "count": 1,
      "name": "Wallbox 3 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40092,
      "count": 1,
      "name": "Wallbox 4 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40093,
      "count": 1,
      "name": "Wallbox 5 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40094,
      "count": 1,
      "name": "Wallbox 6 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40095,
      "count": 1,
      "name": "Wallbox 7 control",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit field; bit 1 = solar / mixed operation, bit 2 = charging released or cancelled, bit 6 = Schuko socket on, bit 12 = one or three phases. Writing bits needs function code 05h."
    },
    {
      "address": 40096,
      "count": 1,
      "name": "DC voltage, string 1",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40097,
      "count": 1,
      "name": "DC voltage, string 2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40098,
      "count": 1,
      "name": "DC voltage, string 3",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Not used on devices without a third string."
    },
    {
      "address": 40099,
      "count": 1,
      "name": "DC current, string 1",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40100,
      "count": 1,
      "name": "DC current, string 2",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40101,
      "count": 1,
      "name": "DC current, string 3",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Not used on devices without a third string."
    },
    {
      "address": 40102,
      "count": 1,
      "name": "DC power, string 1",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40103,
      "count": 1,
      "name": "DC power, string 2",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40104,
      "count": 1,
      "name": "DC power, string 3",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Not used on devices without a third string."
    },
    {
      "address": 40105,
      "count": 1,
      "name": "Power meter 0 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40106,
      "count": 1,
      "name": "Power meter 0, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40107,
      "count": 1,
      "name": "Power meter 0, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40108,
      "count": 1,
      "name": "Power meter 0, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40109,
      "count": 1,
      "name": "Power meter 1 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40110,
      "count": 1,
      "name": "Power meter 1, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40111,
      "count": 1,
      "name": "Power meter 1, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40112,
      "count": 1,
      "name": "Power meter 1, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40113,
      "count": 1,
      "name": "Power meter 2 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40114,
      "count": 1,
      "name": "Power meter 2, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40115,
      "count": 1,
      "name": "Power meter 2, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40116,
      "count": 1,
      "name": "Power meter 2, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40117,
      "count": 1,
      "name": "Power meter 3 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40118,
      "count": 1,
      "name": "Power meter 3, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40119,
      "count": 1,
      "name": "Power meter 3, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40120,
      "count": 1,
      "name": "Power meter 3, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40121,
      "count": 1,
      "name": "Power meter 4 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40122,
      "count": 1,
      "name": "Power meter 4, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40123,
      "count": 1,
      "name": "Power meter 4, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40124,
      "count": 1,
      "name": "Power meter 4, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40125,
      "count": 1,
      "name": "Power meter 5 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40126,
      "count": 1,
      "name": "Power meter 5, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40127,
      "count": 1,
      "name": "Power meter 5, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40128,
      "count": 1,
      "name": "Power meter 5, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40129,
      "count": 1,
      "name": "Power meter 6 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40130,
      "count": 1,
      "name": "Power meter 6, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40131,
      "count": 1,
      "name": "Power meter 6, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40132,
      "count": 1,
      "name": "Power meter 6, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40133,
      "count": 1,
      "name": "Power meter 7 type",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "1 = root power meter (control point), 2 = external production, 3 = bidirectional meter, 4 = external consumption, 5 = farm, 6 = not used, 7 = wallbox, 8 = external farm meter, 9 = data display, 10 = control bypass."
    },
    {
      "address": 40134,
      "count": 1,
      "name": "Power meter 7, phase power L1",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40135,
      "count": 1,
      "name": "Power meter 7, phase power L2",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40136,
      "count": 1,
      "name": "Power meter 7, phase power L3",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 40137,
      "count": 1,
      "name": "SG Ready status",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    }
  ],
  "combined_registers": [],
  "notes": "Register map from the vendor document \"Modbus/TCP-Schnittstelle der HagerEnergy GmbH\", V1.80, 07.07.2021, section 3.1 \"E3/DC Simple Mode\" (copy read: https://za26.de/file_download/113/ModBus_E3DC_Speichersysteme_V1.80_2021-07-07.pdf; E3/DC ships it with the system rather than hosting it). Cross-checked against AlCalzone/e3dc-ess-modbus (unit ID 1, port 502, same register numbers). In the device menu the interface has to be switched on under Smart Functions > Smart Home > Modbus with the protocol set to \"E3/DC\"; the SunSpec mode of the same interface is a different map and is not described here. The register numbers are the document's 1-based 4xxxx numbers, hence one_based - the document warns that clients differ by an offset of one or two registers and recommends checking the magic byte in 40001 (0xE3DC) first, so 40001 is the first row. Every 32-bit value is sent low word first (section 4.2 works out the value as [40075] * 65536 + [40074]), hence word_order LowFirst; evcc's e3dc-modbus template decodes the same registers as int32s. Left out: 40002 (Uint8+Uint8 firmware version), 40082 (autonomy and self-consumption packed as Uint8+Uint8 without saying which byte is which) and the reserved 40086/40087. Battery power 40070 is negative while discharging and grid connection point power 40074 negative while feeding in, both as the document defines them; no scale factors are applied anywhere. The eight WallBox_x_CTRL registers 40088-40095 are the only writable ones and are switched with function code 05h. Each power meter 0-7 takes four registers: a type register followed by the three phase powers."
}
