{
  "spec_version": 1,
  "slug": "sens-energenius-iq2",
  "manufacturer": "SENS",
  "model": "EnerGenius iQ2",
  "category": "Battery charger",
  "supplier_url": "https://www.sens-usa.com/product/energenius-iq2-battery-charger",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 10,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [
    {
      "address": 16,
      "count": 1,
      "name": "Start/stop manual boost",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON (0xFF00) to start a manual boost, OFF (0x0000) to stop it. Write access via Modbus is a separate setting on the charger and must be enabled first."
    },
    {
      "address": 17,
      "count": 1,
      "name": "Reset periodic boost charge schedule",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to reset the periodic boost charge schedule; OFF is a no-op."
    },
    {
      "address": 18,
      "count": 1,
      "name": "Start/stop battery check",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to start a battery check, OFF to stop it."
    },
    {
      "address": 19,
      "count": 1,
      "name": "Reset periodic battery check schedule",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to reset the periodic battery check schedule; OFF is a no-op."
    },
    {
      "address": 20,
      "count": 1,
      "name": "Clear battery check failure",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to reset the battery check failure alarm; OFF is a no-op."
    },
    {
      "address": 22,
      "count": 1,
      "name": "Force DC Startup",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to start, OFF to stop. The forced startup feature overrides the DC below startup voltage lockout (bit 23 of the basic charging alarms)."
    },
    {
      "address": 23,
      "count": 1,
      "name": "Reset Latched Alarms",
      "data_type": "Binary",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Write ON to reset latched alarms; OFF is a no-op."
    }
  ],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 0,
      "count": 2,
      "name": "Unit Serial",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Serial number of the system the device was built into and shipped as part of."
    },
    {
      "address": 2,
      "count": 2,
      "name": "Program Revision",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Version of the main program."
    },
    {
      "address": 4,
      "count": 2,
      "name": "Bootloader Version",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Version of the bootloader."
    },
    {
      "address": 6,
      "count": 2,
      "name": "Type",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Device type. The manual documents this as an enumerated value but does not publish the enumeration."
    },
    {
      "address": 8,
      "count": 2,
      "name": "Serial",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Serial number of the device. SENS uses it to verify the connection: read it as a 32-bit value and the first six digits must match the serial number on the product label (the manual's example is register 9, which is address 8 in a zero-based client). If they do not match, change the zero/one offset, swap the words, or both."
    },
    {
      "address": 10,
      "count": 2,
      "name": "Build Date",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Build date packed into one value as year (16 bit), month (8 bit) and day (8 bit). The manual does not say which end of the value the fields are taken from."
    },
    {
      "address": 12,
      "count": 2,
      "name": "Model Num 1_4",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 1-4, packed as four ASCII characters in the 32-bit value; read it as text, not as a number. The 32-character model number field runs from address 12 to 27."
    },
    {
      "address": 14,
      "count": 2,
      "name": "Model Num 5_8",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 5-8, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 16,
      "count": 2,
      "name": "Model Num 9_12",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 9-12, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 18,
      "count": 2,
      "name": "Model Num 13_16",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 13-16, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 20,
      "count": 2,
      "name": "Model Num 17_20",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 17-20, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 22,
      "count": 2,
      "name": "Model Num 21_24",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 21-24, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 24,
      "count": 2,
      "name": "Model Num 25_28",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 25-28, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 26,
      "count": 2,
      "name": "Model Num 29_32",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Model number characters 29-32, packed as ASCII (see Model Num 1_4)."
    },
    {
      "address": 42,
      "count": 2,
      "name": "Basic Charging Alarms",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Alarm status bits: 0 AC fail, 1 high DC voltage, 2 low DC voltage, 3 charger fail, 4 over voltage shutdown, 5 reverse polarity, 7 incompatible battery, 8 invalid settings, 10 thermal fold back, 11 temperature probe fault, 12 current limiting, 13 ground fault on the positive terminal, 14 low output current, 15 load share fault, 16 boost lockout active, 18 SENSbus inactive, 19 battery on discharge, 20 battery end discharge, 21 ground fault on the negative terminal, 22 DC negative open, 23 DC below startup voltage, 27 battery check failed. Bits 6 and 9 are unused; bits 24-26 and 28-31 are not defined by SENS."
    },
    {
      "address": 44,
      "count": 2,
      "name": "Charging Status",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Charging state bits: 0 output idle, 1 follower mode, 2 helix float charge, 3 float charge, 4 helix refresh charge, 5 auto boost charge, 6 periodic boost charge, 7 battery check active, 8 commission charge, 9 high charger current, 12 using battery temperature, 13 UltraCap mode active, 14 battery check passed. Bits 10 and 11 are unused; bits 15-31 are not defined by SENS."
    },
    {
      "address": 46,
      "count": 2,
      "name": "Charging Alarms Extended",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Extended alarm bits: 0 check filter (thermal roll back, e.g. a clogged input air filter), 1 thermal fault (over-heating, fold back reached zero watts, output disabled), 2 high battery temperature, 3 high battery temperature shutdown, 4 high AC ripple detected on output, 5 DC output open, 6 charger low temperature (output may be derated), 7 battery low temperature. Bits 8-31 are not defined by SENS."
    },
    {
      "address": 48,
      "count": 2,
      "name": "Charging AC Alarms",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "AC alarm bits: 1 AC phase missing (three-phase units only), 2 AC voltage over maximum (three second delay, output disabled), 3 AC voltage low, 4 AC frequency out of range, 5 AC voltage high. Bit 0 is unused; bits 6-31 are not defined by SENS."
    },
    {
      "address": 50,
      "count": 2,
      "name": "Accessory Channel Alarms",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Accessory channel alarm bits: 0 invalid settings for this channel, 1 low current on the channel, 2 invalid system configuration. Bits 3-31 are not defined by SENS."
    },
    {
      "address": 52,
      "count": 2,
      "name": "Accessory System Alarms",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Accessory system alarm bits: 0 invalid system configuration, 1 AC1 surge protector expired, 2 AC1 breaker open or tripped (Breaker Status option only), 5 DC surge protector expired, 6 DC breaker open or tripped (Breaker Status option only), 11 configured as system display board, 13 SENSbus inactive (no other devices found), 18 no power board data. Bits 3, 4, 7-10, 12 and 14-17 are unused; bits 19-31 are not defined by SENS."
    },
    {
      "address": 54,
      "count": 2,
      "name": "Accessory Assigned Charger Alarms",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Assigned charger alarm bits: 0 invalid configuration of one or more power modules in the unit, 1 a power module has faulted. The manual heads this table \"Accessory Assigned Channel Alarms\" while the register itself is called Accessory Assigned Charger Alarms. Bits 2-31 are not defined by SENS."
    },
    {
      "address": 62,
      "count": 2,
      "name": "Uptime Counter Value",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Charger uptime counter."
    },
    {
      "address": 212,
      "count": 2,
      "name": "Unit Voltage",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Voltage currently being supplied by the unit to the battery/loads."
    },
    {
      "address": 214,
      "count": 2,
      "name": "Unit Current",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Current currently being supplied by the unit to the battery/loads."
    },
    {
      "address": 216,
      "count": 2,
      "name": "Unit Power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Power currently being supplied by the unit."
    },
    {
      "address": 218,
      "count": 2,
      "name": "Unit Float Voltage",
      "data_type": "UInt32",
      "units": "V/cell",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Float voltage setting of the unit."
    },
    {
      "address": 220,
      "count": 2,
      "name": "Unit Boost Voltage",
      "data_type": "UInt32",
      "units": "V/cell",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Boost voltage setting of the unit."
    },
    {
      "address": 222,
      "count": 2,
      "name": "Unit Battery Temp",
      "data_type": "UInt32",
      "units": "°C",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Battery temperature."
    },
    {
      "address": 224,
      "count": 2,
      "name": "Unit Internal temp",
      "data_type": "UInt32",
      "units": "°C",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "Internal temperature of the unit."
    },
    {
      "address": 226,
      "count": 2,
      "name": "Unit Boost Timer",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Boost timer."
    },
    {
      "address": 228,
      "count": 2,
      "name": "Unit Periodic Boost Countdown",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Time until the next boost."
    },
    {
      "address": 230,
      "count": 2,
      "name": "Unit Line Frequency",
      "data_type": "UInt32",
      "units": "Hz",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "AC line frequency."
    },
    {
      "address": 232,
      "count": 2,
      "name": "Unit Line Voltage 1",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 1 voltage."
    },
    {
      "address": 234,
      "count": 2,
      "name": "Unit Line Current 1",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 1 current. The manual marks it as not applicable to single-phase chargers."
    },
    {
      "address": 236,
      "count": 2,
      "name": "Unit Line Voltage 2",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 2 voltage; only applicable on three-phase units."
    },
    {
      "address": 238,
      "count": 2,
      "name": "Unit Line Current 2",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 2 current; only applicable on three-phase units."
    },
    {
      "address": 240,
      "count": 2,
      "name": "Unit Line Voltage 3",
      "data_type": "UInt32",
      "units": "V",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 3 voltage; only applicable on three-phase units."
    },
    {
      "address": 242,
      "count": 2,
      "name": "Unit Line Current 3",
      "data_type": "UInt32",
      "units": "A",
      "scale_factor": 0.000030517578125,
      "offset": 0,
      "access": "R",
      "description": "AC line 3 current; only applicable on three-phase units."
    },
    {
      "address": 244,
      "count": 2,
      "name": "Unit Battery Check Time Elapsed",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Battery check time elapsed."
    },
    {
      "address": 246,
      "count": 2,
      "name": "Unit Battery Check Due",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Time until the next battery check."
    },
    {
      "address": 248,
      "count": 2,
      "name": "Unit Number of Chargers",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Number of power modules in the unit."
    }
  ],
  "combined_registers": [],
  "notes": "Applies to EnerGenius iQ2 chargers fitted with the optional communications board, which is model-number option code M or N (option N is options C and M, e.g. Q1200358L574NE); without that option the charger has no Modbus port. Modbus has to be enabled on the charger, and the factory defaults are server address 10, TCP port 502, zero-based registers and 32-bit big-endian values; the ethernet port ships on DHCP (0.0.0.0) and RS-485 on 19200 baud, 8 data bits, even parity, 1 stop bit, address 10. Writing needs the separate Modbus write-access setting switched on, and only one RS-485 protocol (Modbus or DNP3) can be active at a time. Every documented holding register is a 32-bit value in two consecutive registers, and values with a scaling factor are obtained by dividing the raw reading by that factor, which is why the volt/ampere/watt registers use 1/32768. SENS describes this map as the \"common registers that are applicable to most applications\" and supplies the rest on request, so addresses that are not listed here are undocumented rather than known to be empty; the manual lists no input registers or discrete inputs for the iQ2, and it reads \"bit\" as the unit for the eight model-number registers even though they carry four ASCII characters each. Source: SENS EnerGenius IQ2 Installation & Operation Manual, part 101340-1 Rev F, section 10 (pages 46-57), linked from the supplier page."
}
