{
  "spec_version": 1,
  "slug": "wattnode-wnc-modbus",
  "manufacturer": "Continental Control Systems",
  "model": "WattNode Modbus WNC-3Y-208-MB / -3Y-400-MB / -3Y-480-MB / -3Y-600-MB / -3D-240-MB / -3D-400-MB / -3D-480-MB",
  "category": "Energy meter",
  "supplier_url": "https://ctlsys.com/wp-content/uploads/2016/10/WNC-MODBUS-Manual-V16.pdf",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 0,
    "addressing": "one_based",
    "byte_order": "BigEndian",
    "word_order": "LowFirst",
    "native_interface": "rs485",
    "serial": {
      "parity": "None",
      "baud_rate": 9600,
      "data_bits": 8,
      "stop_bits": 1
    }
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [
    {
      "address": 1001,
      "count": 2,
      "name": "EnergySum (total net energy)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Net real energy of all active phases; negative energy is subtracted. Preserved across power failures."
    },
    {
      "address": 1003,
      "count": 2,
      "name": "EnergyPosSum (total positive energy)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1005,
      "count": 2,
      "name": "EnergySumNR (total net energy, non-resettable)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1007,
      "count": 2,
      "name": "EnergyPosSumNR (total positive energy, non-resettable)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1009,
      "count": 2,
      "name": "PowerSum (real power, sum of active phases)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1011,
      "count": 2,
      "name": "PowerA (real power, phase A)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1013,
      "count": 2,
      "name": "PowerB (real power, phase B)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1015,
      "count": 2,
      "name": "PowerC (real power, phase C)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1017,
      "count": 2,
      "name": "VoltAvgLN (average line-to-neutral voltage)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1019,
      "count": 2,
      "name": "VoltA (phase A to neutral voltage)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1021,
      "count": 2,
      "name": "VoltB (phase B to neutral voltage)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1023,
      "count": 2,
      "name": "VoltC (phase C to neutral voltage)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1025,
      "count": 2,
      "name": "VoltAvgLL (average line-to-line voltage)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1027,
      "count": 2,
      "name": "VoltAB (line-to-line voltage A-B)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1029,
      "count": 2,
      "name": "VoltBC (line-to-line voltage B-C)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1031,
      "count": 2,
      "name": "VoltAC (line-to-line voltage A-C)",
      "data_type": "Float32",
      "units": "V",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1033,
      "count": 2,
      "name": "Freq (power line frequency)",
      "data_type": "Float32",
      "units": "Hz",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1101,
      "count": 2,
      "name": "EnergyA (net energy, phase A)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1103,
      "count": 2,
      "name": "EnergyB (net energy, phase B)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1105,
      "count": 2,
      "name": "EnergyC (net energy, phase C)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1107,
      "count": 2,
      "name": "EnergyPosA (positive energy, phase A)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1109,
      "count": 2,
      "name": "EnergyPosB (positive energy, phase B)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1111,
      "count": 2,
      "name": "EnergyPosC (positive energy, phase C)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1113,
      "count": 2,
      "name": "EnergyNegSum (negative energy, sum of active phases)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1115,
      "count": 2,
      "name": "EnergyNegSumNR (negative energy, sum of active phases, non-resettable)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1117,
      "count": 2,
      "name": "EnergyNegA (negative energy, phase A)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1119,
      "count": 2,
      "name": "EnergyNegB (negative energy, phase B)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1121,
      "count": 2,
      "name": "EnergyNegC (negative energy, phase C)",
      "data_type": "Float32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1123,
      "count": 2,
      "name": "EnergyReacSum (reactive energy, sum of active phases)",
      "data_type": "Float32",
      "units": "kVARh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1125,
      "count": 2,
      "name": "EnergyReacA (net reactive energy, phase A)",
      "data_type": "Float32",
      "units": "kVARh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1127,
      "count": 2,
      "name": "EnergyReacB (net reactive energy, phase B)",
      "data_type": "Float32",
      "units": "kVARh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1129,
      "count": 2,
      "name": "EnergyReacC (net reactive energy, phase C)",
      "data_type": "Float32",
      "units": "kVARh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1131,
      "count": 2,
      "name": "EnergyAppSum (apparent energy, sum of active phases)",
      "data_type": "Float32",
      "units": "kVAh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1133,
      "count": 2,
      "name": "EnergyAppA (apparent energy, phase A)",
      "data_type": "Float32",
      "units": "kVAh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1135,
      "count": 2,
      "name": "EnergyAppB (apparent energy, phase B)",
      "data_type": "Float32",
      "units": "kVAh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1137,
      "count": 2,
      "name": "EnergyAppC (apparent energy, phase C)",
      "data_type": "Float32",
      "units": "kVAh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1139,
      "count": 2,
      "name": "PowerFactorAvg (power factor, average)",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1141,
      "count": 2,
      "name": "PowerFactorA (power factor, phase A)",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1143,
      "count": 2,
      "name": "PowerFactorB (power factor, phase B)",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1145,
      "count": 2,
      "name": "PowerFactorC (power factor, phase C)",
      "data_type": "Float32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1147,
      "count": 2,
      "name": "PowerReacSum (reactive power, sum of active phases)",
      "data_type": "Float32",
      "units": "VAR",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1149,
      "count": 2,
      "name": "PowerReacA (reactive power, phase A)",
      "data_type": "Float32",
      "units": "VAR",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1151,
      "count": 2,
      "name": "PowerReacB (reactive power, phase B)",
      "data_type": "Float32",
      "units": "VAR",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1153,
      "count": 2,
      "name": "PowerReacC (reactive power, phase C)",
      "data_type": "Float32",
      "units": "VAR",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1155,
      "count": 2,
      "name": "PowerAppSum (apparent power, sum of active phases)",
      "data_type": "Float32",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1157,
      "count": 2,
      "name": "PowerAppA (apparent power, phase A)",
      "data_type": "Float32",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1159,
      "count": 2,
      "name": "PowerAppB (apparent power, phase B)",
      "data_type": "Float32",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1161,
      "count": 2,
      "name": "PowerAppC (apparent power, phase C)",
      "data_type": "Float32",
      "units": "VA",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1163,
      "count": 2,
      "name": "CurrentA (phase A current)",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1165,
      "count": 2,
      "name": "CurrentB (phase B current)",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1167,
      "count": 2,
      "name": "CurrentC (phase C current)",
      "data_type": "Float32",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1169,
      "count": 2,
      "name": "Demand (real power demand)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Real power averaged over the demand period (DemPerMins, default 15 minutes)."
    },
    {
      "address": 1171,
      "count": 2,
      "name": "DemandMin (minimum power demand)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1173,
      "count": 2,
      "name": "DemandMax (maximum power demand)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1177,
      "count": 2,
      "name": "DemandA (real power demand, phase A)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1179,
      "count": 2,
      "name": "DemandB (real power demand, phase B)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1181,
      "count": 2,
      "name": "DemandC (real power demand, phase C)",
      "data_type": "Float32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1701,
      "count": 2,
      "name": "SerialNumber (meter serial number)",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1703,
      "count": 2,
      "name": "UptimeSecs (time since last power on)",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1705,
      "count": 2,
      "name": "TotalSecs (total seconds of operation)",
      "data_type": "UInt32",
      "units": "s",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1707,
      "count": 1,
      "name": "Model (encoded WattNode model)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1708,
      "count": 1,
      "name": "Version (firmware version)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1709,
      "count": 1,
      "name": "Options (WattNode meter options)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1710,
      "count": 1,
      "name": "ErrorStatus (list of recent errors and events)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1711,
      "count": 1,
      "name": "PowerFailCount (power failure count)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1712,
      "count": 1,
      "name": "CrcErrorCount (Modbus CRC communication errors)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1713,
      "count": 1,
      "name": "FrameErrorCount (Modbus framing errors)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1714,
      "count": 1,
      "name": "PacketErrorCount (bad Modbus packets)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1715,
      "count": 1,
      "name": "OverrunCount (Modbus buffer overruns)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1716,
      "count": 1,
      "name": "ErrorStatus1 (newest error or event, 0 = no errors)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1717,
      "count": 1,
      "name": "ErrorStatus2 (next oldest error or event)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 1718,
      "count": 1,
      "name": "ErrorStatus3 (next oldest error or event)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    }
  ],
  "holding_registers": [
    {
      "address": 1601,
      "count": 2,
      "name": "ConfigPasscode (configuration passcode, 0 = disabled)",
      "data_type": "UInt32",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "As shipped from the factory the passcode is 0 (disabled). Writing 1 twice locks the meter."
    },
    {
      "address": 1603,
      "count": 1,
      "name": "CtAmps (global CT rated current, default 5 A)",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Shortcut that sets CtAmpsA, CtAmpsB and CtAmpsC together. Default value is five amps."
    },
    {
      "address": 1604,
      "count": 1,
      "name": "CtAmpsA (phase A CT rated current, default 5 A)",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1605,
      "count": 1,
      "name": "CtAmpsB (phase B CT rated current, default 5 A)",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1606,
      "count": 1,
      "name": "CtAmpsC (phase C CT rated current, default 5 A)",
      "data_type": "UInt16",
      "units": "A",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1607,
      "count": 1,
      "name": "CtDirections (CT orientation, default 0 = all CTs normal)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Bit map: 1 = flip phase A, 2 = flip phase B, 4 = flip phase C."
    },
    {
      "address": 1651,
      "count": 1,
      "name": "ApplyComConfig (write 1234 to apply the communication settings)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "Reads 1 while changed communication settings have not been applied yet."
    },
    {
      "address": 1652,
      "count": 1,
      "name": "Address (Modbus address, overrides the DIP switches when non-zero)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1653,
      "count": 1,
      "name": "BaudRate (0 = DIP switch, 1 = 1200, 2 = 2400, 3 = 4800, 4 = 9600, 5 = 19200, 6 = 38400)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1654,
      "count": 1,
      "name": "ParityMode (0 = no parity one stop bit, 1 = even parity one stop bit)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1655,
      "count": 1,
      "name": "ModbusMode (0 = RTU, 1 = TCP-RTU)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW"
    },
    {
      "address": 1656,
      "count": 1,
      "name": "ReplyDelay (minimum Modbus reply delay)",
      "data_type": "UInt16",
      "units": "ms",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "5 to 180 ms."
    }
  ],
  "combined_registers": [],
  "notes": "Source: Continental Control Systems 'WattNode Modbus Installation and Operation Manual', WNC-MB-1.16d, Rev 1.16d, firmware version 16, revision date 28 January 2011, https://ctlsys.com/wp-content/uploads/2016/10/WNC-MODBUS-Manual-V16.pdf. Serial defaults from Table 4 and the Modbus Communication chapter: 9,600 baud (DIP switch 8 down), 8 data bits, no parity and one stop bit; the manual states the meter does not follow the Modbus RTU even-parity default and that even parity is available as factory Option EP or through ParityMode 1654. Unit ID: as shipped the DIP-switch address is 0, which the manual describes as an invalid broadcast address that prevents communication, so 0 is stored here as the documented factory state - set DIP switches 1-7 (addresses 1-127) or register 1652 before polling; Option AD orders a pre-programmed address. Addressing: the manual documents one-based register numbers (EnergySum at 1001 = wire address 0x03E8) so the printed numbers are stored with addressing 'one_based'. Word order: for 32-bit float and long-integer registers the lower address holds the least significant 16 bits, so word_order is 'LowFirst'. The meter treats holding and input registers interchangeably; measurements are seeded as input registers and configuration registers as holding registers. Deliberate omissions: the parallel integer register lists (1201-1221, 1301-1362) duplicate the floating-point values in scaled integer form; the apparent-power demand register (1175) is left out because the register list prints 'W' next to a value named DemandApp (apparent demand, documented in VA elsewhere); the Averaging (1608), PowerIntScale (1609), DemPerMins (1610), DemSubints (1611), GainAdjust (1612-1614) and PhaseAdjust (1615-1617) default values are printed in a configuration table whose default column does not align with the register rows, so they are omitted rather than guessed; the custom register map block (2000+) is installation-specific."
}
