{
  "spec_version": 1,
  "slug": "victron-solarcharger-mppt",
  "manufacturer": "Victron Energy",
  "model": "SmartSolar MPPT / BlueSolar MPPT charge controllers (solarcharger service on a GX device)",
  "category": "Charge controller",
  "supplier_url": "https://github.com/victronenergy/dbus_modbustcp",
  "default_configuration": {
    "protocol": "modbus_tcp",
    "port": 502,
    "unit_id": 239,
    "addressing": "zero_based",
    "byte_order": "BigEndian",
    "word_order": "HighFirst"
  },
  "coils": [],
  "discrete_inputs": [],
  "input_registers": [],
  "holding_registers": [
    {
      "address": 771,
      "count": 1,
      "name": "Battery voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 772,
      "count": 1,
      "name": "Battery current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Positive while charging."
    },
    {
      "address": 773,
      "count": 1,
      "name": "Battery temperature",
      "data_type": "Int16",
      "units": "°C",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Only reported by VE.Can MPPTs."
    },
    {
      "address": 774,
      "count": 1,
      "name": "Charger on/off",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "RW",
      "description": "1 = on, 4 = off. Only available on VE.Can MPPTs."
    },
    {
      "address": 775,
      "count": 1,
      "name": "Charge state",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 2 = fault, 3 = bulk, 4 = absorption, 5 = float, 6 = storage, 7 = equalize, 11 = other (Hub-1), 245 = wake-up, 252 = external control."
    },
    {
      "address": 776,
      "count": 1,
      "name": "PV voltage",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Not available when multiple VE.Can chargers are combined."
    },
    {
      "address": 777,
      "count": 1,
      "name": "PV current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Calculated by the GX device from /Yield/Power and /Pv/V."
    },
    {
      "address": 778,
      "count": 1,
      "name": "Equalization pending",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no, 1 = yes, 2 = error, 3 = unavailable/unknown."
    },
    {
      "address": 779,
      "count": 1,
      "name": "Equalization time remaining",
      "data_type": "UInt16",
      "units": "s",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 780,
      "count": 1,
      "name": "Relay on the charger",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = open, 1 = closed."
    },
    {
      "address": 781,
      "count": 1,
      "name": "Alarm (deprecated)",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no alarm, 2 = alarm. The register list marks it deprecated: the value is always 0."
    },
    {
      "address": 784,
      "count": 1,
      "name": "Yield today",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 785,
      "count": 1,
      "name": "Maximum charge power today",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 786,
      "count": 1,
      "name": "Yield yesterday",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 787,
      "count": 1,
      "name": "Maximum charge power yesterday",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 788,
      "count": 1,
      "name": "Error code",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = no error, 1 = battery temperature too high, 2 = battery voltage too high, 3 = battery temperature sensor miswired (+), 4 = battery temperature sensor miswired (-), 5 = battery temperature sensor disconnected, 6 = battery voltage sense miswired (+), 7 = battery voltage sense miswired (-), 8 = battery voltage sense disconnected, 9 = battery voltage wire losses too high, 17 = charger temperature too high, 18 = charger over-current, 19 = charger current polarity reversed, 20 = bulk time limit reached, 22 = charger temperature sensor miswired, 23 = charger temperature sensor disconnected, 34 = input current too high."
    },
    {
      "address": 789,
      "count": 1,
      "name": "PV power (16-bit)",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Older 16-bit variant of the 32-bit PV power at 792."
    },
    {
      "address": 790,
      "count": 1,
      "name": "User yield",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Energy generated since the last user reset."
    },
    {
      "address": 791,
      "count": 1,
      "name": "MPP operation mode",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = voltage/current limited, 2 = MPPT active, 255 = not available."
    },
    {
      "address": 792,
      "count": 2,
      "name": "PV power",
      "data_type": "UInt32",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "32-bit PV power; occupies 792 and 793."
    },
    {
      "address": 794,
      "count": 1,
      "name": "Load current",
      "data_type": "Int16",
      "units": "A",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R",
      "description": "Load output current on models with a load output."
    },
    {
      "address": 3700,
      "count": 1,
      "name": "PV voltage, tracker 1",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R",
      "description": "Multi-tracker models (MPPT RS). The register list labels this first tracker block 'tracker 0' (/Pv/0) while its MPP-operation-mode and enabled rows below are labelled 'tracker 1' over the same /Pv/0 path; these rows number the trackers 1-4 throughout, so tracker 1 here is the register list's tracker 0."
    },
    {
      "address": 3701,
      "count": 1,
      "name": "PV voltage, tracker 2",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3702,
      "count": 1,
      "name": "PV voltage, tracker 3",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3703,
      "count": 1,
      "name": "PV voltage, tracker 4",
      "data_type": "UInt16",
      "units": "V",
      "scale_factor": 0.01,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3708,
      "count": 1,
      "name": "Yield today, tracker 1",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3709,
      "count": 1,
      "name": "Yield today, tracker 2",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3710,
      "count": 1,
      "name": "Yield today, tracker 3",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3711,
      "count": 1,
      "name": "Yield today, tracker 4",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3712,
      "count": 1,
      "name": "Yield yesterday, tracker 1",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3713,
      "count": 1,
      "name": "Yield yesterday, tracker 2",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3714,
      "count": 1,
      "name": "Yield yesterday, tracker 3",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3715,
      "count": 1,
      "name": "Yield yesterday, tracker 4",
      "data_type": "UInt16",
      "units": "kWh",
      "scale_factor": 0.1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3716,
      "count": 1,
      "name": "Maximum charge power today, tracker 1",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3717,
      "count": 1,
      "name": "Maximum charge power today, tracker 2",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3718,
      "count": 1,
      "name": "Maximum charge power today, tracker 3",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3719,
      "count": 1,
      "name": "Maximum charge power today, tracker 4",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3720,
      "count": 1,
      "name": "Maximum charge power yesterday, tracker 1",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3721,
      "count": 1,
      "name": "Maximum charge power yesterday, tracker 2",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3722,
      "count": 1,
      "name": "Maximum charge power yesterday, tracker 3",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3723,
      "count": 1,
      "name": "Maximum charge power yesterday, tracker 4",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3724,
      "count": 1,
      "name": "PV power, tracker 1",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3725,
      "count": 1,
      "name": "PV power, tracker 2",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3726,
      "count": 1,
      "name": "PV power, tracker 3",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3727,
      "count": 1,
      "name": "PV power, tracker 4",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3728,
      "count": 2,
      "name": "User yield (32-bit)",
      "data_type": "UInt32",
      "units": "kWh",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "Energy generated since the last user reset; 32-bit variant."
    },
    {
      "address": 3730,
      "count": 1,
      "name": "PV power (16-bit)",
      "data_type": "UInt16",
      "units": "W",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3731,
      "count": 1,
      "name": "MPP operation mode, tracker 1",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = off, 1 = voltage/current limited, 2 = MPPT active, 255 = not available."
    },
    {
      "address": 3732,
      "count": 1,
      "name": "MPP operation mode, tracker 2",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3733,
      "count": 1,
      "name": "MPP operation mode, tracker 3",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3734,
      "count": 1,
      "name": "MPP operation mode, tracker 4",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R"
    },
    {
      "address": 3735,
      "count": 1,
      "name": "Tracker 1 enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled, 1 = enabled. Only available on MPPT RS."
    },
    {
      "address": 3736,
      "count": 1,
      "name": "Tracker 2 enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled, 1 = enabled."
    },
    {
      "address": 3737,
      "count": 1,
      "name": "Tracker 3 enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled, 1 = enabled."
    },
    {
      "address": 3738,
      "count": 1,
      "name": "Tracker 4 enabled",
      "data_type": "UInt16",
      "units": "",
      "scale_factor": 1,
      "offset": 0,
      "access": "R",
      "description": "0 = disabled, 1 = enabled."
    }
  ],
  "combined_registers": [],
  "notes": "A SmartSolar or BlueSolar MPPT controller has no Modbus port of its own: it speaks VE.Direct (or VE.Can) to a GX device, and these registers are the com.victronenergy.solarcharger service on that GX device's Modbus TCP server. Read them with the solar charger's own unit ID, not the system unit ID 100 used by the victron-gx-cerbo seed: the register list's Unit ID mapping sheet gives the preferred IDs (e.g. 239 = VE.Direct via USB, ttyUSB0; 226 = Cerbo GX VE.Direct port 1). Since Venus OS 2.60 unit IDs are assigned dynamically, so check Settings > Integrations > Modbus TCP server > Available services on the GX device and use the ID listed there; 239 is only the preferred value for a VE.Direct-to-USB charger. Addresses are the decimal addresses of the CCGX Modbus TCP register list (revision 55), used unchanged as wire addresses; that list's 'Scalefactor' column is a divisor, so the factors here are the equivalent multipliers. 792 is a 32-bit value and occupies 792 and 793, which is why 793 is not listed. Left out: the custom-name string at 3740 and the RESERVED rows 782, 783 and 3704-3707 (revision 55 lists no serial-number register for this service). The register list numbers the PV-voltage, yield and maximum-power blocks 'tracker 0'-'tracker 3' but the MPP-operation-mode and enabled rows 'tracker 1'-'tracker 4' over the same /Pv/0.../Pv/3 paths; the rows here number the trackers 1-4, so tracker 1 is the register list's 'tracker 0'. Register 777 is a value the GX device calculates, not a measurement the charger reports. Source: Victron Energy 'CCGX-Modbus-TCP-register-list.xlsx', revision 55, in the vendor's dbus_modbustcp repository."
}
