Victron cerbo modbus device onboarding
Use when a new Victron Modbus-TCP device (EV Charging Station, energy meter, inverter) is connected to the Cerbo GX LAN but does not appear in the Cerbo UI or D-Bus, despite being reachable via ping. Trigger on phrases like "EVCS not visible in Cerbo", "new Modbus device does not appear", "Cerbo does not detect wallbox", "dbus-modbus-client does not find device", "Victron device not showing in GX", "Cerbo Device List empty even though device is on the network". Do NOT load for VE.Can/VE.Bus devices (different bus protocol), for Cerbo-Setup-from-scratch (different skill scope), or for VRM cloud connectivity problems.From its SKILL.md
npx -y skills add Ed3Design/ed3design-engineering-bundles --skill victron-cerbo-modbus-device-onboardingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 6 commands, including `ping -c 2 <device-ip>` and 5 more.
SKILL.md
5.5 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
Victron Cerbo GX — Onboarding a new Modbus-TCP device
Pattern verified against a real Cerbo GX with a JK-BMS that remained invisible at the Modbus layer despite correct VLAN routing. The non-obvious cause is the per-port
Enabled=0factory-default. The 5-step sequence +dbus-sendfix is the deterministic onboarding workflow; the fallback branch coversEnabled=1cases where the device is still invisible.
The non-obvious problem
dbus-modbus-client discovers new Modbus devices via TCP subnet scan (port 502, every 25 s) — creates settings in localsettings and sets Enabled = 0 as the default. The device is registered but invisible. No hint in the log, no error in the UI.
Applies to all Victron Modbus-TCP devices: EV Charging Station, Carlo Gavazzi meters, SolarEdge, external inverters.
Diagnostic sequence (5 steps)
SSH access pattern (replace placeholders with your own credentials and hosts):
ssh -J <your-jumphost-user>@<your-jumphost-ip> root@<cerbo-ip>
Note: the Cerbo's root SSH access is enabled via the Cerbo UI under Settings → General → Access Level → Superuser. Use ssh-copy-id to set up key-auth and avoid password prompts. Do NOT hardcode passwords into shell scripts or skill bodies.
1 — Network check
ping -c 2 <device-ip>
No response → LAN/VLAN problem, check DHCP. Response → continue.
2 — D-Bus check
dbus -y | grep -i "evcharger\|evc_\|<device-type>"
Empty → settings problem (Enabled=0 candidate). Service visible → check UI refresh / VRM cache.
3 — Read the modbus-client log
cat /var/log/dbus-modbus-client/current | tr -d "\000" | grep -v "^$" | tail -30
Watch for these patterns:
Found EV charger: Victron Energy AC22NS→ device detected ✓Setting /Settings/Devices/<id>/Enabled does not exist yet→ default-Enabled problem
4 — Check the Enabled value
dbus -y com.victronenergy.settings /Settings/Devices/<device-id>/Enabled GetValue
Returns 0 → that's the bug. Device-ID from log (format: evc_<Serial>).
5 — Fix: set Enabled to 1
dbus-send --system --print-reply \
--dest=com.victronenergy.settings \
/Settings/Devices/<device-id>/Enabled \
com.victronenergy.BusItem.SetValue \
variant:int32:1
Return int32 0 = success. Device appears in D-Bus and the Cerbo UI within a few seconds.
Fallback: Enabled=1 set but device still not visible
# Restart the service (re-reads settings)
killall dbus-modbus-client
# Cerbo waits ~25s for dbus-modbus-client to rescan — then check again:
dbus -y | grep -i evc_
Alternative path (without SSH)
Cerbo Remote Console (web UI on port 80 or via VRM) → Settings → Device List → find device → toggle Enable.
BusyBox compatibility on Venus OS
Standard GNU flags do not work on the Cerbo — use BusyBox variants:
| What you want | GNU (does not work) | BusyBox (works) |
|---|---|---|
| Limit bytes | cat file | head -c 2000 | cat file (truncate if needed) |
| Processes | ps aux | ps (no flag) |
| Read file with NUL bytes | cat file | cat file | tr -d "\000" |
Example setup (anonymized reference)
| Device | IP (example) | Serial (example) | D-Bus path |
|---|---|---|---|
| Victron EVCS NS | <charger-ip> | <charger-serial> | com.victronenergy.evcharger.evc_<charger-serial> |
| Cerbo GX | <cerbo-ip> | <cerbo-serial> | — |
| SSH Jump-Host (optional) | <user>@<jumphost-ip> | — | e.g. Tailscale, WireGuard |
SSH pattern (use key-auth, never hardcoded passwords):
ssh -J <user>@<jumphost-ip> root@<cerbo-ip>
Background: TDD log (Bulletproofing-Log)
Cycle 1 — 2026-05-27 (PASS)
-
RED sub-agent (without skill): Suggested generic steps — check Modbus TCP settings, power-cycle, VLAN, firmware compatibility. Explicitly admitted "I don't know the concrete onboarding protocol for this device class". No knowledge of the
Enabled=0default — would lead to long false-trail diagnostics. -
GREEN sub-agent (with skill): Directly applied the 5-step sequence,
dbus -y→dbus-sendfix within seconds. Self-reflection: missing fallback branch whenEnabled=1but still no device → polish item integrated directly (killall dbus-modbus-client). -
Refactor: Fallback section added after step 5. Do-NOT-load clause added. No R1-R3 needed.
Cycle-2 backlog (polish, non-blocking)
- Multi-device onboarding: when 2+ Modbus devices appear on the LAN simultaneously — identify device IDs in the log when multiple
Foundlines appear - VRM remote activation: when SSH access is not possible (e.g. Cerbo behind NAT without VPN) — document the VRM Console path in more detail
- Automatic Enable on first discovery: long-term a Cerbo update might change the default → check whether Venus OS 3.4+ handles this differently
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.