{
  "spec_version": 1,
  "slug": "varta-pulse-element",
  "manufacturer": "VARTA",
  "model": "pulse / pulse neo / element / element backup",
  "category": "Home battery",
  "supplier_url": "https://www.varta-ag.com/en/consumer/product-categories/energy-storage-systems",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 255,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 1000,
      "count": 17,
      "name": "EMS software version",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register."
    },
    {
      "address": 1051,
      "count": 1,
      "name": "Register table version",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Version of the register layout the firmware implements. VARTA has moved registers between versions, so check this value before trusting the map on an unknown firmware."
    },
    {
      "address": 1054,
      "count": 10,
      "name": "Serial number",
      "data_type": "Ascii",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "One character per register."
    },
    {
      "address": 1064,
      "count": 1,
      "name": "Installed battery modules",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1065,
      "count": 1,
      "name": "Operating state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = busy, 1 = run, 2 = charging, 3 = discharging, 4 = standby, 5 = error, 6 = passive, 7 = islanding."
    },
    {
      "address": 1066,
      "count": 1,
      "name": "Battery power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; the sign gives the direction of power flow. The two cited clients disagree on which direction is positive (evcc negates the raw value, aiovarta reports positive as charging), so the raw value is left untouched here."
    },
    {
      "address": 1067,
      "count": 1,
      "name": "Apparent power",
      "data_type": "Int16",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1068,
      "count": 1,
      "name": "Battery state of charge",
      "data_type": "UInt16",
      "units": "%",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1069,
      "count": 2,
      "name": "Total charged energy",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 0.001,
      "offset": 0,
      "access": "R",
      "description": "Raw value is in Wh, split low word first - hence word_order LowFirst for this device. Only multi-register value in the map."
    },
    {
      "address": 1071,
      "count": 1,
      "name": "Installed battery capacity",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "The register holds tens of Wh: 587 means 5.87 kWh."
    },
    {
      "address": 1072,
      "count": 1,
      "name": "Error code",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1074,
      "count": 1,
      "name": "Maximum discharge power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "The value has to be written negative to allow discharge, 0 blocks discharge. This is what evcc writes for battery control."
    },
    {
      "address": 1078,
      "count": 1,
      "name": "Grid power",
      "data_type": "Int16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Signed; the sign gives the direction of power flow (import or export). evcc negates the raw value to get its import-positive convention, so raw positive means export."
    },
    {
      "address": 1102,
      "count": 1,
      "name": "PV sensor power",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Only available when an extra PV sensor is installed: the power of the devices registered in the VARTA SunSpec manager is not exposed over Modbus."
    }
  ],
  "combined_registers": [],
  "notes": "VARTA does not publish the register table on its website, so the map is taken from two independent open-source clients that read it from real hardware: the evcc template https://raw.githubusercontent.com/evcc-io/evcc/master/templates/definition/meter/varta.yaml and the register table in typozh/aiovarta https://github.com/typozh/aiovarta/blob/main/src/aiovarta/const.py (that library was tested against firmware reporting register table version 12, and documents registers 1069/1070 as Wh with the low word first). Modbus TCP on port 502 with unit ID 255. Only a handful of registers are published, which is why this map is short: it carries the three values a battery needs at minimum - state of charge (1068), battery power (1066) and grid power (1078) - plus the state, capacity and error registers. VARTA has moved addresses between firmware versions, so read 1051 (register table version) first. Energy counters are 32-bit and low word first, hence word_order LowFirst; every other entry is a single register and unaffected. Only 1074 is writable. The 'element backup' needs firmware F21000612 or later for battery control, and the firmware update is released on request by VARTA's technical service."
}
