With the SmartgridOne Modbus TCP Slave external signal, an external controller (a PLC, a SCADA system, a third-party EMS, ...) can read the measurements of the site and send control signals to the SmartgridOne Controller over Modbus TCP.
The SmartgridOne Controller is the Modbus slave (server). The external controller is the Modbus master (client). Only Modbus TCP is supported.
This page describes version 0.0.5 of the protocol.
Registers that are not yet available Some registers of the protocol are not served by the current firmware yet. They are marked Not yet available in the tables below.
| Device Type | Variants | Supported |
|---|---|---|
| Solar Inverters | All | ✅ |
| Storage Devices | ||
| EV Chargers | ⌛ (coming soon) |
Log in to the commissioning interface and make sure the devices are added to the SmartgridOne Controller.
The grid limits in the settings of the SmartgridOne Controller always apply. Limits written over Modbus can only make them stricter.
The external controller must reach the SmartgridOne Controller on the local network, on TCP port 502. Make sure the SmartgridOne Controller always gets the same IP address (see Fixed IP addresses).
Add all assets Only the devices selected here are controlled by the signal. For grid power setpoint control, make sure all controllable assets are added to the external signal.
Devices of the same type are controlled together, as one (virtual) asset. A battery setpoint is shared out over the batteries in proportion to their nominal power.
The Modbus TCP server of the SmartgridOne Controller is now running. The Status column of the 'External signals' tab shows the state of the signal.
| Setting | Value |
|---|---|
| Protocol | Modbus TCP |
| IP address | IP address of the SmartgridOne Controller on the local network |
| TCP port | 502 |
| Modbus ID (unit ID) | 1 |
| Register addressing | Starts at 0 |
| Byte order | Big endian. For 32-bit and 64-bit values, the most significant register comes first. |
| Read only registers | Read Input Registers (0x04) |
| Read/write registers | Read Holding Registers (0x03), Write Single Holding Register (0x06), Write Multiple Holding Registers (0x10) |
Register numbering The addresses on this page start at 0. If your Modbus tool numbers registers from 1 (for example the 30001 / 40001 notation), add 1 to every address.
Writing 32-bit values
Write a 32-bit value with one Write Multiple Holding Registers (0x10) request covering both registers. For example, a battery setpoint of 5000 W is written as 0x0000 0x1388 to registers 1214-1215, and -5000 W as 0xFFFF 0xEC78.
| Type | Size (registers) | Not implemented value |
|---|---|---|
| UINT16 (16-bit unsigned integer) | 1 | 0xFFFF |
| INT16 (16-bit signed integer) | 1 | 0x8000 |
| UINT32 (32-bit unsigned integer) | 2 | 0xFFFFFFFF |
| INT32 (32-bit signed integer) | 2 | 0x80000000 |
| UINT64 (64-bit unsigned integer) | 4 | 0xFFFFFFFFFFFFFFFF |
| INT64 (64-bit signed integer) | 4 | 0x8000000000000000 |
STRING (UTF-8, padded with 0x00) | 16 | - |
Active and reactive power remote control are enabled separately:
| Active power | Reactive power | |
|---|---|---|
| Enable remote control | 1001 = 1 | 1002 = 1 |
| Control mode | 1003 | 1004 |
| Mode 0: Storage & PV setpoint control | Storage registers 1201, 1214 and PV registers 1301, 1303 | Storage registers 1202, 1216 and PV registers 1302, 1310 |
| Mode 1: Grid setpoint control | Grid power setpoint 1101 | Grid reactive power setpoint 1103 |
When remote control is disabled (0), the SmartgridOne Controller uses its own local control modes.
Active and reactive power control together Active and reactive power remote control are not executed at the same time. When both 1001 and 1002 are 1, only the active power control is executed if 1003 = 0, and only the reactive power control if 1003 = 1. Enable only the one you need.
Reactive power control Not every battery or PV inverter supports reactive power control. Check with our support team first.
Register 1000 is a fallback counter in seconds. It decreases by 1 every second. When it reaches 0, the SmartgridOne Controller stops applying the remote control signal and falls back to its local control modes, until the counter is written again.
0xFFFFFFFF) to remove them.Write setpoints and limits continuously Setpoints and limits are not guaranteed to be kept after a restart of the SmartgridOne Controller or of the signal. Write them continuously. Control modes, setpoints and thresholds only apply while remote control is enabled and the watchdog has not expired.
Charge the batteries at 5 kW
Keep the grid power at 0 W
Limit the PV production to 10 kW
Do not export to the grid
Supported Modbus function: Read Input Registers (0x04).
| Address | Type | Size | Unit | Name | Description |
|---|---|---|---|---|---|
| 0 | UINT32 | 2 | - | Magic number | Always 0x454E4952 (ASCII "ENIR"). Identifies a device that follows this protocol. |
| 2 | STRING | 16 | - | Manufacturer | Padded with 0x00. |
| 18 | STRING | 16 | - | Serial number | Serial number of the SmartgridOne Controller. Padded with 0x00. |
| 34 | UINT16 | 1 | - | Total / single device | 0 or 0xFFFF = the registers hold the totals of all connected inverters, EV chargers and loads, and the energy meter (if any) is the grid meter. 1 = the registers hold the data of a single inverter, EV charger, load or energy meter. The SmartgridOne Controller always reports totals (0). |
| 35 | UINT16 | 1 | - | Protocol version major number | 0 for this version of the protocol. |
| 36 | UINT16 | 1 | - | Protocol version minor number | 0 for this version of the protocol. |
| 37 | UINT16 | 1 | - | Protocol version patch number | 5 for this version of the protocol. The current firmware still reports version 0.0.1 in registers 35-37. |
| 38 | STRING | 16 | - | Model name | Padded with 0x00. |
Sign convention: for active power, negative is towards the grid and positive is towards the installation. For reactive power, negative is capacitive behaviour of the installation and positive is inductive behaviour.
| Address | Type | Size | Unit | Name | Description |
|---|---|---|---|---|---|
| 100 | UINT16 | 1 | - | Energy meter presence | 0 = no grid energy meter, 1 = there is a grid energy meter. Without a grid energy meter, the registers below can hold the not implemented value. |
| 101 | INT32 | 2 | W | Total active power | |
| 103 | UINT16 | 1 | 0.1 A | Current L1 | |
| 104 | UINT16 | 1 | 0.1 A | Current L2 | |
| 105 | UINT16 | 1 | 0.1 A | Current L3 | |
| 106 | UINT16 | 1 | 0.1 A | Current N | |
| 107 | UINT16 | 1 | V | Voltage L1-N | |
| 108 | UINT16 | 1 | V | Voltage L2-N | |
| 109 | UINT16 | 1 | V | Voltage L3-N | |
| 110 | UINT16 | 1 | V | Voltage L1-L2 | |
| 111 | UINT16 | 1 | V | Voltage L2-L3 | |
| 112 | UINT16 | 1 | V | Voltage L3-L1 | |
| 113 | UINT16 | 1 | mHz (0.001 Hz) | Frequency | |
| 114 | INT32 | 2 | W | Active power L1 | |
| 116 | INT32 | 2 | W | Active power L2 | |
| 118 | INT32 | 2 | W | Active power L3 | |
| 120 | INT32 | 2 | VAr | Total reactive power | |
| 122 | INT32 | 2 | VAr | Reactive power L1 | |
| 124 | INT32 | 2 | VAr | Reactive power L2 | |
| 126 | INT32 | 2 | VAr | Reactive power L3 | |
| 128 | UINT64 | 4 | 0.1 kWh | Total import active energy | |
| 132 | UINT64 | 4 | 0.1 kWh | Total export active energy | |
| 136 | UINT64 | 4 | 0.1 kVArh | Total inductive reactive energy | |
| 140 | UINT64 | 4 | 0.1 kVArh | Total capacitive reactive energy |
| Address | Type | Size | Unit | Name | Description |
|---|---|---|---|---|---|
| 200 | UINT32 | 2 | W | Total PV produced active power | Positive only. |
| 202 | INT32 | 2 | W | Total battery active power | Negative is towards the grid (discharging), positive is towards the installation (charging). |
| 204 | INT32 | 2 | W | Total EV active power | Negative is towards the grid (V2G), positive is towards the installation (charging). |
| 206 | UINT32 | 2 | W | Total on/off load power | Relays, boilers, HVAC. Positive only. |
| 208 | INT32 | 2 | W | Total uncontrolled load power | Negative is towards the grid (export), positive is towards the installation (import). Can be negative if some production devices have not been added to the SmartgridOne Controller. |
| 210 | INT32 | 2 | VAr | Total PV reactive power | Negative is capacitive behaviour of the installation, positive is inductive behaviour. |
| 212 | UINT16 | 1 | 0.1 % | Total battery state of charge (SoC) | Positive only. |
| 213 | INT32 | 2 | VAr | Total battery reactive power | Negative is capacitive behaviour of the installation, positive is inductive behaviour. Not yet available: reads 0. |
| 220 | UINT64 | 4 | 0.1 kWh | Total PV produced energy | |
| 224 | UINT64 | 4 | 0.1 kWh | Total battery charged energy | |
| 228 | UINT64 | 4 | 0.1 kWh | Total battery discharged energy | |
| 232 | UINT64 | 4 | 0.1 kWh | Total EV consumed energy | Not yet available: reads 0. |
| 240 | UINT32 | 2 | 0.1 kWh | Battery rated energy | Not yet available: not mapped yet. |
| 242 | UINT32 | 2 | 0.1 kWh | Battery available charge energy | Not yet available: not mapped yet. |
| 244 | UINT32 | 2 | 0.1 kWh | Battery available discharge energy | Not yet available: not mapped yet. |
| 250 | UINT32 | 2 | W | Total PV nominal power | Positive only. |
| 252 | UINT32 | 2 | W | Total storage nominal power | Positive only. |
| Address | Type | Size | Unit | Name | Description |
|---|---|---|---|---|---|
| 300 | UINT32 | 2 | W | Applied grid import power limit | The grid import limit the SmartgridOne Controller actually applies, after margins and safety factor. Can be lower than the written limit while a grid setpoint is active, because a grid setpoint is applied by adjusting the grid limits. |
| 302 | UINT32 | 2 | W | Applied grid export power limit | The grid export limit the SmartgridOne Controller actually applies, after margins and safety factor. Can be lower than the written limit while a grid setpoint is active, because a grid setpoint is applied by adjusting the grid limits. |
| 310 | INT32 | 2 | W | Applied storage active setpoint | |
| 312 | UINT32 | 2 | W | Applied PV active setpoint | |
| 320 | INT32 | 2 | VAr | Applied storage reactive setpoint | |
| 322 | INT32 | 2 | VAr | Applied PV reactive setpoint | |
| 350 | UINT32 | 2 | W | Available storage charge power | Absolute value: the present battery power is not taken into account. |
| 352 | UINT32 | 2 | W | Available storage discharge power | Absolute value: the present battery power is not taken into account. |
Supported Modbus functions: Read Holding Registers (0x03), Write Single Holding Register (0x06), Write Multiple Holding Registers (0x10).
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1000 | INT16 | 1 | s | 120 | Watchdog fallback counter | -1 = watchdog disabled, the last received command is always applied. 0 to 32400 = number of seconds the last received command is applied. Other values are invalid. Decreases by 1 every second until it reaches 0. See Watchdog. |
| 1001 | UINT16 | 1 | - | 0 | Active power remote control enabled | 0 = disabled, the SmartgridOne Controller falls back to local control. 1 = enabled. |
| 1002 | UINT16 | 1 | - | 0 | Reactive power remote control enabled | 0 = disabled, the SmartgridOne Controller falls back to local control. 1 = enabled. |
| 1003 | UINT16 | 1 | - | 0 | Active power control mode | 0 = Storage & PV active power setpoint control. 1 = Grid active power setpoint control. |
| 1004 | UINT16 | 1 | - | 0 | Reactive power control mode | 0 = Storage & PV reactive power setpoint control. 1 = Grid reactive power setpoint control. |
| 1010 | UINT32 | 2 | W | 0xFFFFFFFF | Grid import power limit | Maximum grid import power. Still applied when the watchdog counter reaches 0. |
| 1012 | UINT32 | 2 | W | 0xFFFFFFFF | Grid export power limit | Maximum grid export power. Still applied when the watchdog counter reaches 0. |
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1100 | UINT16 | 1 | - | 0 | Limit time base | Reserved for future use: the time scale in which the limits apply (instantaneous, quarter hour, ...). |
| 1101 | INT32 | 2 | W | 0x80000000 | Grid power setpoint | Positive is import, negative is export. Used when 1001 = 1 and 1003 = 1. |
| 1103 | INT32 | 2 | VAr | 0x80000000 | Grid reactive power setpoint | Positive is inductive / imported reactive power, negative is capacitive / exported reactive power. Used when 1002 = 1 and 1004 = 1. |
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1200 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use, not available). |
| 1201 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint (1214). 2 = self-consumption optimisation. 3 = cost optimisation. 4 = peak shaving (1218 to 1224). |
| 1202 | UINT16 | 1 | - | 0 | Reactive power control mode | 0 = local control. 1 = setpoint (1216). 2 = peak shaving (reserved for future use, not available). |
| 1203 | UINT32 | 2 | W | 0xFFFFFFFF | Charge power limit | Maximum battery charge power (positive number). Not yet available: accepted but ignored. |
| 1205 | UINT32 | 2 | W | 0xFFFFFFFF | Discharge power limit | Maximum battery discharge power (positive number). Not yet available: accepted but ignored. |
| 1207 | UINT32 | 2 | VAr | 0xFFFFFFFF | Inductive reactive power limit | Maximum inductive / consumed reactive power. Reserved for future use, not available. |
| 1209 | UINT32 | 2 | VAr | 0xFFFFFFFF | Capacitive reactive power limit | Maximum capacitive / exported reactive power. Reserved for future use, not available. |
| 1211 | UINT16 | 1 | A | 0xFFFF | Current limit | Maximum current (positive number). Not yet available: accepted but ignored. |
| 1212 | UINT16 | 1 | 0.1 % | 50 | Min. SoC | Minimum state of charge. The most restrictive of this value and the device settings applies: if 20 % is configured in the device settings and 10 % is written over Modbus, the minimum SoC is 20 %. Not yet available: accepted but ignored, the device settings apply. |
| 1213 | UINT16 | 1 | 0.1 % | 1000 | Max. SoC | Maximum state of charge. The most restrictive of this value and the device settings applies: if 95 % is configured in the device settings and 100 % is written over Modbus, the maximum SoC is 95 %. Not yet available: accepted but ignored, the device settings apply. |
| 1214 | INT32 | 2 | W | 0x80000000 | Battery active power setpoint | Positive is charging, negative is discharging. Used when 1201 = 1. |
| 1216 | INT32 | 2 | VAr | 0x80000000 | Battery reactive power setpoint | Positive is inductive / consumed reactive power, negative is capacitive / exported reactive power. Used when 1202 = 1. |
| 1218 | INT32 | 2 | W | 0x80000000 | Start discharging above (peak shaving) | Grid power above which the battery starts discharging. The grid power is tuned down to this value while discharging. |
| 1220 | INT32 | 2 | W | 0x80000000 | Stop discharging below (peak shaving) | Grid power below which a discharging battery stops discharging. |
| 1222 | INT32 | 2 | W | 0x80000000 | Stop charging above (peak shaving) | Grid power above which a charging battery stops charging. |
| 1224 | INT32 | 2 | W | 0x80000000 | Start charging below (peak shaving) | Grid power below which the battery starts charging. The grid power is tuned to this value while charging. |
For peak shaving (1201 = 4), all four thresholds 1218 to 1224 must be written. The grid power is positive for import and negative for export. See Peak shaving for an example of the thresholds.
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1300 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use, not available). |
| 1301 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint (1303). 2 = cost optimisation. 3 = feed-in restriction up to the allowed grid export limit. |
| 1302 | UINT16 | 1 | - | 0 | Reactive power control mode | 0 = local control. 1 = setpoint (1310). 2 = peak shaving (reserved for future use, not available). |
| 1303 | UINT32 | 2 | W | 0xFFFFFFFF | PV production power limit | Maximum PV production power (positive number). Used when 1301 = 1. |
| 1305 | UINT32 | 2 | VAr | 0xFFFFFFFF | Inductive reactive power limit | Maximum inductive / consumed reactive power. Reserved for future use, not available. |
| 1307 | UINT32 | 2 | VAr | 0xFFFFFFFF | Capacitive reactive power limit | Maximum capacitive / exported reactive power. Reserved for future use, not available. |
| 1309 | UINT16 | 1 | A | 0xFFFF | Current limit | Maximum current (positive number). Reserved for future use, not available. |
| 1310 | INT32 | 2 | VAr | 0 | PV reactive power setpoint | Positive is inductive / consumed reactive power, negative is capacitive / exported reactive power. Used when 1302 = 1. |
Not yet available. These registers can be written, but are ignored.
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1400 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use). |
| 1401 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint. 2 = self-consumption optimisation. 3 = cost optimisation. 4 = peak shaving (discretely controlled assets) / load balancing (continuously controlled assets). |
| 1402 | UINT16 | 1 | - | 0 | Discrete setpoint signal | 0 = autonomous operation (normal operation). 1 = encouraged on. 2 = forced on. 3 = forced off. Whether to heat or cool is left to the heat pump / airco / boiler. Ignored by continuously controlled devices. |
| 1403 | UINT32 | 2 | W | 0 | Power setpoint | Always positive. Whether to heat or cool is left to the heat pump / airco / boiler. Ignored by discretely controlled devices. |
| 1405 | INT32 | 2 | W | 0 | Forced off grid power threshold (peak shaving) | Discrete control: above this grid power, the asset is forced off. Ignored by continuously controlled devices. |
| 1407 | INT32 | 2 | W | 0 | Encouraged on grid power threshold (peak shaving) | Discrete control: below this grid power, the asset is encouraged to be on. Must be at least the nominal power below the forced off threshold. Ignored by continuously controlled devices. |
| 1409 | INT32 | 2 | W | 0 | Forced on grid power threshold (peak shaving) | Discrete control: below this grid power, the asset is forced on. Must be at least the nominal power below the forced off threshold, and below the encouraged on threshold. Ignored by continuously controlled devices. |
Not yet available. These registers can be written, but are ignored.
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1500 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use). |
| 1501 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint. 2 = self-consumption optimisation. 3 = cost optimisation. 4 = peak shaving. |
| 1502 | UINT16 | 1 | - | 0 | Discrete setpoint signal | 0 = off. 1 = on. The asset can be kept on or off for a minimum time, even if the signal changes, to prevent continuous switching. |
| 1503 | INT32 | 2 | W | 0 | Off grid power threshold (peak shaving) | Discrete control: above this grid power, the asset is switched off. |
| 1505 | INT32 | 2 | W | 0 | On grid power threshold (peak shaving) | Discrete control: below this grid power, the asset is switched on. |
Not yet available. These registers can be written, but are ignored.
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1600 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use). |
| 1601 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint. 2 = battery support. |
| 1602 | UINT16 | 1 | - | 0 | Discrete setpoint | 0 = switch the backup generator off. 1 = switch the backup generator on. The generator can be kept on for a minimum time to prevent wear; switching off is ignored during that time. |
| 1603 | UINT16 | 1 | 1 % | 0 | Battery SoC switch-on threshold | The backup generator switches on when the total battery state of charge is below this value. |
| 1604 | UINT16 | 1 | 1 % | 100 | Battery SoC switch-off threshold | The backup generator switches off when the total battery state of charge is above this value. Must be higher than the switch-on threshold. |
Not yet available. These registers can be written, but are ignored.
| Address | Type | Size | Unit | Initial value | Name | Description |
|---|---|---|---|---|---|---|
| 1700 | UINT16 | 1 | - | 0 | Control granularity | 0 = control all assets together. 1 = control assets individually (reserved for future use). |
| 1701 | UINT16 | 1 | - | 0 | Active power control mode | 0 = local control. 1 = setpoint (charge limit). 2 = self-consumption optimisation. 3 = cost optimisation. 4 = load balancing. |
| 1702 | UINT16 | 1 | 0.1 A | 0 | Total AC charge current limit | Used when 1701 = 1. The limit applies to all connectors of the EV chargers together. |
| Date | Version | Changes |
|---|---|---|
| 13/06/2025 | 0.0.1 | Initial draft of the protocol. |
| 20/04/2026 | 0.0.2 | Added the available storage charge and discharge power registers (350, 352). |
| 28/04/2026 | 0.0.3 | Added the battery state of charge register (212) and the nominal power registers (250, 252). |
| 07/08/2026 | 0.0.4 | Fixed the description of the total battery active power. Added the battery reactive power register (213). |
| 31/08/2026 | 0.0.5 | Added the battery energy registers (240, 242, 244). |