How to Build a Custom Victron Energy MQTT Dashboard — Free, No Install
Step-by-step guide to building a real-time Victron Energy monitoring dashboard with MQTT, gauges, charts, and alerts. Works with Cerbo GX, Venus OS, MultiPlus, MPPT, and BMV — all in your browser.
Your Victron Cerbo GX (or any Venus OS device) already has a built-in MQTT broker. WebVB Studio connects to it over WebSocket and lets you build a custom dashboard with Gauges, Charts, Labels, and alerts — all in your browser. No Node-RED, no Grafana, no Docker, no installation. Free and open source. See the full Victron page →
Why Build a Custom Victron Dashboard?
If you own a Victron Energy system — whether it's a home ESS, off-grid cabin, marine setup, or RV — you're already sitting on a goldmine of real-time data. Your Cerbo GX, Venus GX, or Raspberry Pi running Venus OS publishes hundreds of MQTT topics every second:
- Solar PV: power (W), voltage (V), current (A), daily yield (kWh), MPPT tracker state
- Battery: state of charge (%), voltage, current, power, temperature, time-to-go
- Grid / AC: grid power, voltage, frequency, AC consumption, import/export
- Inverter: MultiPlus/Quattro state, AC output, alarms, relay status
- System: ESS mode, generator status, tank levels, GPS position
The Victron VRM portal shows some of this data, but it's delayed, not customizable, and you can't add your own logic. Node-RED and Grafana are powerful but require a server, Docker, and significant setup time. Home Assistant is an entire home automation platform when you might just want a clean energy dashboard.
WebVB Studio is a visual GUI builder that runs entirely in your browser. You drag Gauges, Charts, and Labels onto a form, write a few lines of Python or VB6 event handlers to wire up MQTT topics, and hit Run. No backend server, no containers, no terminal commands. Your Cerbo GX is the only infrastructure you need.
What You Need
Before we start, here's the checklist:
| Requirement | Details |
|---|---|
| Victron GX device | Cerbo GX, Venus GX, Ekrano GX, or Raspberry Pi with Venus OS |
| MQTT enabled | Settings → Services → MQTT on your GX device |
| WebSocket enabled | Venus OS MQTT broker on port 9001 (WebSocket) |
| Browser | Chrome, Firefox, Safari, or Edge — any modern browser |
| Same network | Your browser and GX device on the same LAN (or VPN for remote) |
That's it. No server to set up, no packages to install, no Docker compose files. Let's build.
Step 1: Enable MQTT on Your Venus OS
On your Cerbo GX (or other Venus OS device):
- Navigate to Settings → Services → MQTT
- Toggle MQTT to Enabled
- Note your device's IP address (e.g.,
192.168.1.100) - The WebSocket port is 9001 by default
On the Cerbo GX, go to Settings → Ethernet or Settings → Wi-Fi to see the assigned IP address. You can also find it in your router's DHCP client list.
Step 2: Open WebVB Studio
Go to app.webvbstudio.com. No account needed, no sign-up, nothing to download. The IDE loads in your browser with a visual form designer, a toolbox of 25+ controls, and a code editor.
You can start from the MQTT IoT Dashboard example (available in the Examples menu) or build from scratch. For this guide, we'll build from scratch so you understand every piece.
Step 3: Design Your Dashboard Layout
This is where WebVB Studio shines — you design visually. From the toolbox, drag these controls onto your form:
| Control | Purpose | Victron Use Case |
|---|---|---|
| Gauge | Radial/linear meter with color zones | Battery SOC, solar power, battery voltage |
| Chart | Line/bar/pie chart with live updates | Solar production over time, energy flow history |
| Label | Text display | Current values, status messages, timestamps |
| ProgressBar | Horizontal bar with percentage | Battery SOC bar, daily yield progress |
| Shape | Colored rectangle | Status indicators (green/red for grid/inverter state) |
| MQTT | MQTT client control (invisible at runtime) | Connects to your Venus OS broker |
| Timer | Periodic trigger | Auto-refresh, data logging, keepalive |
A typical Victron dashboard might have:
- 3 Gauges — Battery SOC (%), Solar Power (W), Battery Voltage (V)
- 1 Chart — Solar production timeline throughout the day
- 4–6 Labels — Grid power, AC consumption, inverter state, system mode
- 1 MQTT control — for the broker connection
Arrange them however you like. Resize, align, and position controls by dragging. No CSS, no layout managers, no grid-template-columns.
Step 4: Write the MQTT Event Handlers
Here's where a few lines of code bring everything to life. Switch to the Code tab and choose Python (or VB6 if you prefer). The code is event-driven — you just handle the events that matter.
Python Version
def Form1_Load():
# Configure the MQTT connection
Mqtt1.BrokerUrl = "ws://192.168.1.100:9001"
# Configure gauges
GaugeSoc.MinValue = 0
GaugeSoc.MaxValue = 100
GaugeSoc.Title = "Battery SOC"
GaugeSoc.Unit = "%"
GaugeSoc.ThresholdLow = 20
GaugeSoc.ThresholdHigh = 80
GaugeSolar.MinValue = 0
GaugeSolar.MaxValue = 5000
GaugeSolar.Title = "Solar Power"
GaugeSolar.Unit = "W"
GaugeVolts.MinValue = 44
GaugeVolts.MaxValue = 56
GaugeVolts.Title = "Battery"
GaugeVolts.Unit = "V"
def Mqtt1_Connect():
# Subscribe to key Victron topics
Mqtt1.Subscribe("N/+/system/0/Dc/Battery/Soc")
Mqtt1.Subscribe("N/+/system/0/Dc/Pv/Power")
Mqtt1.Subscribe("N/+/system/0/Dc/Battery/Voltage")
Mqtt1.Subscribe("N/+/system/0/Dc/Battery/Power")
Mqtt1.Subscribe("N/+/system/0/Ac/Grid/L1/Power")
Mqtt1.Subscribe("N/+/system/0/Ac/Consumption/L1/Power")
lblStatus.Caption = "Connected to Venus OS"
def Mqtt1_Message(topic, payload):
val = float(payload)
if "Battery/Soc" in topic:
GaugeSoc.Value = val
lblSoc.Caption = f"SOC: {val:.0f}%"
elif "Pv/Power" in topic:
GaugeSolar.Value = val
lblSolar.Caption = f"Solar: {val:.0f} W"
Chart1.AddPoint("Now", val, "orange")
elif "Battery/Voltage" in topic:
GaugeVolts.Value = val
lblVolts.Caption = f"Battery: {val:.1f} V"
elif "Grid/L1/Power" in topic:
lblGrid.Caption = f"Grid: {val:.0f} W"
elif "Consumption/L1/Power" in topic:
lblConsumption.Caption = f"Load: {val:.0f} W"
def Mqtt1_Error(err):
lblStatus.Caption = f"Error: {err}" That's the entire dashboard. Three event handlers:
Form1_Load— configures the broker URL and gauge rangesMqtt1_Connect— subscribes to the Victron MQTT topics you care aboutMqtt1_Message— routes incoming values to the right gauge, label, or chart
VB6 Version
Prefer Visual Basic? The same dashboard in VB6:
Sub Form1_Load
Mqtt1.BrokerUrl = "ws://192.168.1.100:9001"
GaugeSoc.MinValue = 0
GaugeSoc.MaxValue = 100
GaugeSoc.Title = "Battery SOC"
GaugeSoc.Unit = "%"
GaugeSoc.ThresholdLow = 20
GaugeSoc.ThresholdHigh = 80
GaugeSolar.MinValue = 0
GaugeSolar.MaxValue = 5000
GaugeSolar.Title = "Solar Power"
GaugeSolar.Unit = "W"
End Sub
Sub Mqtt1_Connect
Mqtt1.Subscribe "N/+/system/0/Dc/Battery/Soc"
Mqtt1.Subscribe "N/+/system/0/Dc/Pv/Power"
Mqtt1.Subscribe "N/+/system/0/Dc/Battery/Voltage"
Mqtt1.Subscribe "N/+/system/0/Ac/Grid/L1/Power"
lblStatus.Caption = "Connected to Venus OS"
End Sub
Sub Mqtt1_Message(topic, payload)
Dim val As Double
val = CDbl(payload)
If InStr(topic, "Battery/Soc") Then
GaugeSoc.Value = val
lblSoc.Caption = "SOC: " & CStr(CInt(val)) & "%"
ElseIf InStr(topic, "Pv/Power") Then
GaugeSolar.Value = val
lblSolar.Caption = "Solar: " & CStr(CInt(val)) & " W"
ElseIf InStr(topic, "Battery/Voltage") Then
lblVolts.Caption = "Battery: " & Format(val, "0.0") & " V"
ElseIf InStr(topic, "Grid/L1/Power") Then
lblGrid.Caption = "Grid: " & CStr(CInt(val)) & " W"
End If
End Sub Both languages have identical MQTT capabilities in WebVB Studio. Choose whichever you're more comfortable with. Python gives you access to Pandas and NumPy for data analysis; VB6 has a gentler learning curve for beginners.
Essential Victron MQTT Topics
Venus OS publishes data under the topic pattern N/{portalId}/{service}/{deviceInstance}/{path}. Using + as a wildcard for the portal ID makes your dashboard work with any Victron installation. Here are the most useful topics:
Battery & DC System
| MQTT Topic | Value | Unit |
|---|---|---|
N/+/system/0/Dc/Battery/Soc | State of Charge | % |
N/+/system/0/Dc/Battery/Voltage | Battery Voltage | V |
N/+/system/0/Dc/Battery/Current | Battery Current | A |
N/+/system/0/Dc/Battery/Power | Battery Power | W |
N/+/system/0/Dc/Battery/Temperature | Battery Temperature | °C |
N/+/system/0/Dc/Battery/TimeToGo | Time to empty | seconds |
Solar / PV
| MQTT Topic | Value | Unit |
|---|---|---|
N/+/system/0/Dc/Pv/Power | Total PV Power | W |
N/+/solarcharger/0/Yield/Power | MPPT Power | W |
N/+/solarcharger/0/Pv/V | PV Voltage | V |
N/+/solarcharger/0/History/Daily/0/Yield | Today's Yield | kWh |
N/+/solarcharger/0/State | Charger State | 0=Off, 3=Bulk, 4=Absorption, 5=Float |
Grid & AC
| MQTT Topic | Value | Unit |
|---|---|---|
N/+/system/0/Ac/Grid/L1/Power | Grid Power (L1) | W |
N/+/system/0/Ac/Consumption/L1/Power | AC Consumption (L1) | W |
N/+/vebus/0/Ac/ActiveIn/L1/V | Grid Voltage | V |
N/+/vebus/0/Ac/ActiveIn/L1/F | Grid Frequency | Hz |
N/+/vebus/0/Ac/Out/L1/P | Inverter AC Output | W |
For three-phase Victron setups, replace L1 with L2 or L3 for the other phases. Subscribe to all three and sum them for total power.
Advanced Dashboard Features
Once the basics are working, here's how to level up your Victron dashboard:
Low Battery Alerts
def Mqtt1_Message(topic, payload):
val = float(payload)
if "Battery/Soc" in topic:
GaugeSoc.Value = val
if val < 20:
lblWarning.Caption = "LOW BATTERY!"
lblWarning.ForeColor = "red"
Shape1.FillColor = "red" # Red warning indicator
elif val < 50:
lblWarning.Caption = "Battery moderate"
lblWarning.ForeColor = "orange"
Shape1.FillColor = "orange"
else:
lblWarning.Caption = "Battery OK"
lblWarning.ForeColor = "green"
Shape1.FillColor = "green" Solar Production Timeline
from datetime import datetime
def Form1_Load():
Chart1.Title = "Solar Production Today"
Chart1.ChartType = "1 - Line"
def Mqtt1_Message(topic, payload):
if "Pv/Power" in topic:
val = float(payload)
now = datetime.now().strftime("%H:%M")
Chart1.AddPoint(now, val, "#f59e0b") Grid Import/Export Indicator
def Mqtt1_Message(topic, payload):
if "Grid/L1/Power" in topic:
val = float(payload)
if val > 0:
lblGrid.Caption = f"Importing {val:.0f} W"
lblGrid.ForeColor = "red"
elif val < 0:
lblGrid.Caption = f"Exporting {abs(val):.0f} W"
lblGrid.ForeColor = "green"
else:
lblGrid.Caption = "Grid: 0 W"
lblGrid.ForeColor = "gray" Controlling Your Victron System
WebVB Studio can also publish MQTT messages to your Venus OS, allowing you to control your system from your dashboard:
# Switch ESS mode to "Keep batteries charged"
def cmdChargeMode_Click():
Mqtt1.Publish("W/+/settings/0/Settings/CGwacs/BatteryLife/State", "9")
# Set grid setpoint (target grid power in watts)
def cmdSetpoint_Click():
Mqtt1.Publish("W/+/settings/0/Settings/CGwacs/AcPowerSetPoint", txtSetpoint.Text)
# Switch inverter on/off
def cmdInverterOn_Click():
Mqtt1.Publish("W/+/vebus/0/Mode", "3") # 3 = On
def cmdInverterOff_Click():
Mqtt1.Publish("W/+/vebus/0/Mode", "4") # 4 = Off Victron uses the W/ prefix for write commands and N/ for notifications (read). Always double-check the topic path before publishing — writing to the wrong topic can change inverter settings.
How Does It Compare to Node-RED, Grafana & Home Assistant?
This is the question every Victron forum thread asks. Here's an honest comparison:
| Feature | WebVB Studio | Node-RED | Grafana | Home Assistant |
|---|---|---|---|---|
| Installation | None (browser) | Docker or npm | Docker or package | OS image or Docker |
| Server required | No | Yes | Yes | Yes |
| Visual GUI builder | Drag & drop | Flow-based | Panel config | Card YAML |
| Real-time MQTT | Direct WebSocket | Via broker node | Via data source | Via integration |
| Custom logic | Python / VB6 | JavaScript / nodes | Limited | Automations / YAML |
| Gauges & charts | Built-in | Dashboard plugin | Built-in | Cards / add-ons |
| Publish MQTT | Yes | Yes | No | Yes |
| Data persistence | Session (no DB) | File or DB | InfluxDB/Prometheus | SQLite/MariaDB |
| Learning curve | Low | Medium | Medium-High | High |
| Cost | Free | Free | Free (OSS) | Free |
Where WebVB Studio excels: speed of setup, visual form design, zero infrastructure, direct MQTT control. Where it doesn't: it has no built-in data persistence or historical database (yet). If you need weeks of historical Grafana-style graphs with InfluxDB, use Grafana. If you want a live operational dashboard you can build in 10 minutes, WebVB Studio is hard to beat.
Real-World Use Cases
Off-Grid Cabin Monitor
Monitor a remote cabin's MultiPlus inverter, MPPT charge controller, and battery bank. Set alerts for low SOC, high consumption, or generator start. Run the dashboard on a wall-mounted tablet powered by the system itself.
Home ESS Dashboard
Track your grid import/export in real time, visualize self-consumption rate, and watch the energy flow between solar panels, battery, and grid. Add buttons to switch ESS modes or set grid power targets from the dashboard.
Marine & RV Power Panel
Build a compact power panel for your boat or motorhome. Show battery bank status, shore power connection, alternator charge, and solar input. The dashboard works on tablets and phones — mount it on the helm or dashboard.
Installer Multi-Site View
For Victron installers managing multiple sites: connect to different broker URLs and build a summary dashboard that shows the health of every installation at a glance. Compare solar yields across locations and identify underperforming systems.
Troubleshooting Common Issues
| Problem | Solution |
|---|---|
| Can't connect to broker | Verify MQTT is enabled on Venus OS. Check the IP and port (9001 for WebSocket). Ensure you're on the same network. |
| Connected but no data | Venus OS requires a keepalive. Try subscribing with R/+/system/0/... first to request a value, then subscribe to N/+/system/0/... for live updates. |
| Values show as JSON | Some topics return JSON objects like {"value": 48.2}. Parse with json.loads(payload)["value"]. |
| Gauge range doesn't fit | Adjust MinValue and MaxValue on your Gauge to match your system. A 48V battery bank might need 42–58V range. |
| Remote access | Set up a VPN (WireGuard/Tailscale) or use an MQTT bridge to a cloud broker. Don't expose port 9001 directly to the internet. |
Start Building Your Dashboard
Ready to go? Here's the fastest path:
- Open WebVB Studio — loads instantly, no sign-up
- Open the MQTT IoT Dashboard example from the Examples menu
- Change the broker URL to your Venus OS IP:
ws://YOUR_IP:9001 - Click Run — watch live Victron data flow into gauges and charts
- Customize — add more gauges, change topics, add alerts
Or explore the full Victron Energy dashboard guide with more examples, screenshots, and step-by-step instructions.
- Victron Energy MQTT Dashboard Builder — full landing page with screenshots
- MQTT Integration Documentation — complete API reference
- MQTT IoT Dashboard Example — pre-built, ready to customize
- Control Reference — Gauge, Chart, MQTT control properties and events
- Tkinter vs WebVB Studio — how WebVB compares for Python GUI development
Questions? Join the WebVB community or ask on the Victron Community Forum.
Ready to try WebVB Studio?
Build your first Python GUI app in under 5 minutes. No installation, no sign-up. Just open your browser and start coding.
Related Posts
Introduction to WebVB Studio for Python Developers
Building Python GUIs has always been painful — until now. WebVB Studio lets you design forms visually, write Python event handlers, and run everything in the browser. No pip install, no virtual envs, no config files.
Python GUI in 2026: Tkinter vs WebVB Studio — Which Should You Use?
Tkinter ships with Python, but is it still the best option in 2026? We compare Tkinter and WebVB Studio head-to-head across 10 real-world tasks — from a simple form to a Pandas dashboard — with full code examples for both.