The VOOL LMC has a Modbus TCP server for local integrations. A building management system (BMS), energy management system (EMS), Home Assistant or any other Modbus client can read the site’s mains currents and voltages per phase, and — with write access — set the grid connection current limit used by load management. Available from LMC software v6.4.0.
This is separate from the charger’s own Modbus interface (see the Charger Modbus manual). The LMC map does not provide individual charger measurements, energy counters or charger start/stop registers — for those, use the charger’s interface.
Getting started
Modbus TCP is disabled on the LMC by default and is enabled by VOOL support. Email [email protected] with the LMC serial number and say whether you need read-only access (monitoring) or write access too. Write access is also off by default and enabled by support. Activation and port settings cannot be changed through Modbus itself.
Arrange activation with support — LMC serial number, read-only or read/write.
Confirm the local connection details. Get the LMC’s local IPv4 address from your installer or network administrator (or your router’s list of connected devices). Use its Ethernet or Wi-Fi connection; if both are connected, confirm which address serves Modbus — the server listens on one address at a time.
Configure your Modbus client with the settings below and read your first measurement.
Setting | Value |
Protocol | Modbus TCP — the LMC is the server, your system is the client |
Server address | The LMC’s local IPv4 address |
TCP port | 502 by default (use the port confirmed by support) |
Unit ID / device ID | Use 1 if your client requires a value. The LMC ignores it — it does not select a downstream charger. |
Numeric format | Float32, two registers per value, high word first and high byte first (ABCD, “big-endian, no word swap”) |
Address convention | Zero-based decimal addresses (see “Addresses and encoding”) |
Modbus TCP has no authentication or encryption. Anything that can reach the port can read the interface. Restrict access to trusted systems and never expose the port to the internet. Write access applies to all writable registers — including the device and list commands — and cannot be limited to the current-limit setting.
Your first measurement
Read the current on phase L1: function 03 (Read Holding Registers), start address 600 (decimal, zero-based), quantity 2 registers, decode as float32 ABCD. Unit: amperes.
Example: if the two registers return 0x41A4 and 0x0000, the value is 20.5 A. Combine both registers into one 32-bit float — do not treat either register as a separate value and do not apply a scaling factor.
Measurement registers (read-only)
Read with FC03 (holding registers) or FC04 (input registers) at the same zero-based addresses.
Registers | Measurement | Unit | Position in a 26-register read |
600–601 | Mains current L1 | A | 0–1 |
602–603 | Mains current L2 | A | 2–3 |
604–605 | Mains current L3 | A | 4–5 |
606–619 | Reserved — reads return zero | — | 6–19 (ignore) |
620–621 | Mains voltage L1 | V | 20–21 |
622–623 | Mains voltage L2 | V | 22–23 |
624–625 | Mains voltage L3 | V | 24–25 |
Read everything at once with start 600, quantity 26. Or read only currents (start 600, quantity 6) or only voltages (start 620, quantity 6). The “position” column counts from zero within the returned array — it is not the register address.
What “mains current” means: it is the LMC’s calculated total current per phase. With the meter (CTs) at the main connection, it comes from the meter. If the meter measures other building loads only, the LMC adds the charger currents. The installer’s metering configuration therefore matters when comparing readings with another system. A zero or unchanged reading on its own does not prove the meter is working.
Setting the grid connection current limit (write access)
Requires write access enabled by VOOL support. A wrong current limit can allow loads above the installation’s capacity and trip protective devices. Use only limits confirmed by your installer and never exceed the installation’s rated capacity.
The grid connection current limit is the per-phase current budget load management works with. It applies to the whole grid connection, including other building loads — it is not an individual charger’s current.
Registers | Setting | Unit | Format / access |
104–105 | Grid connection current limit | A | Float32 / read-write |
Read the existing value — FC03, start 104, quantity 2. Keep it in case you need to restore it.
Write the agreed limit as one float32 with FC16 (Write Multiple Registers), two registers in a single request. Example for 32 A: register 104 =
0x4200, register 105 =0x0000.Read back and confirm, then observe the installation. A write response alone does not prove the change took effect.
Configuration changes are persistent and affect load management during operation.
Addresses and encoding
All addresses here are zero-based decimal protocol addresses. A quantity is the number of 16-bit registers, not the number of values — each numeric value uses two consecutive registers. Clients use different conventions; for the L1 current read, enter:
Client convention | Enter |
Zero-based address / offset | 600 |
One-based register number (register 1 = address 0) | 601 |
Holding-register reference (40001 = address 0) | 40601 |
Do not send 40601 as the protocol address.
Measurements and settings are in engineering units, no scaling.
Switches: float32 0.0 = off, 1.0 = on (any non-zero value is treated as on).
Modes: the documented integer choice encoded as float32, e.g. 1.0.
Common values: 0.0 =
0x0000 0x0000; 1.0 =0x3F80 0x0000; 20.5 =0x41A4 0x0000; 32.0 =0x4200 0x0000.List commands use raw integers — see below.
Request rules
Function | Use |
03 — Read Holding Registers | Any readable region |
04 — Read Input Registers | Measurements only (600–625) |
16 (0x10) — Write Multiple Registers | Writable values and command blocks |
FC06 (Write Single Register) is not supported and returns exception 02 — use FC16 even for a single value. Coils are not used.
Readable region (inclusive) | Contents | Functions |
104–111 | Grid limit, operating modes, antenna setting | FC03 |
240–283 | Load-management tuning | FC03 |
600–625 | Measurements and reserved zeros | FC03, FC04 |
Each read must stay within one region. Reads outside them — including command registers — return exception 02.
Write numeric values starting at their first register and write both registers. Consecutive writable values can be combined in one request, but not across an unmapped gap.
Write command blocks at their exact start address and quantity.
The interface does not enforce the commissioning ranges in this article — validate values in your client and use finite numbers.
A normal write response only acknowledges the request. Read back settings, and verify that commands completed before retrying.
Troubleshooting
Symptom | What to check |
Connection refused or timed out | Confirm with support that Modbus is enabled; check the LMC’s local IPv4 address and port, reachability and firewall rules. If both Ethernet and Wi-Fi are connected, confirm which address is listening. Modbus does not cross subnets or VLANs. |
Read returns exception 02 | Check address convention, quantity and region boundaries. FC04 only reads 600–625. Command registers cannot be read. |
Write returns exception 02 | Confirm write access with support. Use FC16, a writable address and a complete value or block. FC06 is rejected. |
Implausibly large or tiny numbers | Decode as float32 ABCD, two registers per value, no scaling. Check for an off-by-one address. |
Zero or unchanged measurements | Check response positions and the reserved range. Ask support to verify the meter and metering configuration. |
Write succeeds but value is unchanged | Read back, check encoding and allowed values. Acknowledgement alone does not guarantee the change was applied. |
Integration worked, then stopped | The LMC’s local IP may have changed after a router change or update — set a static IP or DHCP reservation for the LMC (and the chargers). A software update or service restart also drops the session; do not automatically repeat an update command after a timeout. |
Exceptions: 01 Illegal Function — unrecognised function. 02 Illegal Data Address — register-map validation failures and disabled writes. 03 Illegal Data Value — invalid protocol quantity (e.g. an FC16 write outside 1–123 registers); it does not mean a setting’s range was checked.
Advanced settings (write access — agree values with VOOL support)
These change load-management behaviour or hardware configuration. All are read-write float32 values. Ranges are commissioning limits, not recommended settings — read the installed values before changing anything.
Operating modes and antenna
Registers | Setting | Values |
106–107 | Mains metering mode | 0 = meter at main connection, including chargers; 1 = meter measures other building loads, LMC adds charger currents |
108–109 | Load management mode | 0 = prioritised sharing; 1 = equal power sharing |
110–111 | Use external Wi-Fi antenna | 0 = off; 1 = on. Needs compatible hardware and antenna; takes effect after the LMC restarts |
Load-management tuning
Registers | Setting | Unit | Range / values |
240–241 | Reference rate limit enabled (current ramping) | — | 0 = off; 1 = on |
242–243 | Reference rate limit rate | A/s | 0–32 |
244–245 | Current threshold for completing start-up ramping | A | 0–32 |
246–247 | Equal power sharing: initial current step | A | 0.01–32 |
248–249 | Equal power sharing: default current step | A | 0.01–32 |
250–251 | Equal power sharing: minimum equal current threshold | A | 0–32 |
252–253 | Equal power sharing: delay before disabling charger charging | s | 0–86400 |
254–255 | Equal power sharing: delay before allowing charger charging | s | 0–86400 |
256–257 | Phase load management enabled | — | 0 = off; 1 = on |
258–259 | Phase switch delay | s | 0–30 |
260–261 | Phase switch current threshold | A | 0–1000 |
262–263 | Phase switch imbalance threshold | % | 0–100 |
264–265 | Phase overload suspension enabled | — | 0 = off; 1 = on |
266–267 | Force single-phase charging during phase overload handling | — | 0 = off; 1 = on |
268–269 | Phase overload off time | s | 0–86400 |
270–271 | Suspension avoidance enabled | — | 0 = off; 1 = on |
272–273 | Suspension stage 1 current threshold | A | 0–32 |
274–275 | Suspension stage 1 hold time | s | 0–600 |
276–277 | Suspension stage 2 current threshold | A | 0–32 |
278–279 | Suspension stage 2 hold time | s | 0–600 |
280–281 | Suspension stage 3 current threshold | A | 0–32 |
282–283 | Suspension stage 3 hold time | s | 0–600 |
Device and list commands (write-only)
Commands need write access, cannot be read (exception 02) and can interrupt operation or change the installation’s configuration — use them only as part of an agreed service or commissioning procedure.
Device commands
FC16, exactly two registers at the start address. Writing float32 1.0 (0x3F80 0x0000) — or any non-zero value — triggers the command; 0.0 does nothing.
Registers | Command | Effect |
4–5 | Update LMC software | Starts the default software update. Completion is not reported over Modbus. |
12–13 | Restart LMC service | Restarts the controller application and drops the Modbus connection. |
Charger list
Write exactly 7 registers starting at 8900 in one FC16 request. Raw unsigned integers, not float32. The list cannot be read back over Modbus.
Register | Field | Encoding / use |
8900 | Sub-command | 1 = add; 2 = remove; 3 = update; 4 = purge |
8901–8903 | Charger serial number | 6 bytes, high byte first per register. Serial 112233445566 → 0x1122, 0x3344, 0x5566 |
8904 | Multipoint ID | 0–255, low byte only — the point the charger is assigned to |
8905 | Flags | Bit 0 enables OCPP 1.6 for the charger (use 1); keep other bits zero |
8906 | Reserved | Write 0 |
Remove uses only the serial number (write zero in the other fields). Purge resets the list to defaults and ignores the payload. An unknown sub-command is acknowledged but ignored.
Multipoint list
A multipoint is a connection point with its own current limit. Write exactly 4 registers starting at 8920 in one FC16 request, raw unsigned integers. The list cannot be read back over Modbus.
Register | Field | Encoding / use |
8920 | Sub-command | 1 = add; 2 = remove; 3 = update; 4 = purge |
8921 | Multipoint ID | 1–255. Point 0 is the grid connection and cannot be changed with these commands |
8922 | Current limit | Whole amperes, uint16 (0–65535), within the installation’s agreed capacity |
8923 | Parent multipoint ID | Write 0 (no parent) — non-zero parents are not supported by this command |
Remove uses only the multipoint ID. Remove assigned chargers and child points before removing a point. Purge restores defaults. Confirm the resulting configuration with support.
Contact support
For activation, write access or integration help, email [email protected] with the LMC serial number. When reporting a problem also include the client software, the LMC’s local IP and port, the function code, start address, quantity, the response or exception, the time it happened and the LMC software version if known.
This article covers the LMC Modbus interface introduced in LMC software v6.4.0. Ask support to confirm the available functions for your installed software before commissioning an advanced integration.
