IoT & MQTT February 15, 2026 | 10 min read

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.

#Victron #MQTT #IoT #Dashboard #Solar #Python
TL;DR

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.

What makes WebVB Studio different

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):

  1. Navigate to Settings → Services → MQTT
  2. Toggle MQTT to Enabled
  3. Note your device's IP address (e.g., 192.168.1.100)
  4. The WebSocket port is 9001 by default
Finding your Venus OS IP

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

Python — Victron MQTT Dashboard
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 ranges
  • Mqtt1_Connect — subscribes to the Victron MQTT topics you care about
  • Mqtt1_Message — routes incoming values to the right gauge, label, or chart

VB6 Version

Prefer Visual Basic? The same dashboard in VB6:

VB6 — Victron MQTT Dashboard
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
Python or VB6?

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
Three-phase systems

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

Python — Battery Alert
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

Python — Solar Chart
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

Python — Grid Flow
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:

Python — Publish Commands
# 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
Write topics use "W/" not "N/"

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:

  1. Open WebVB Studio — loads instantly, no sign-up
  2. Open the MQTT IoT Dashboard example from the Examples menu
  3. Change the broker URL to your Venus OS IP: ws://YOUR_IP:9001
  4. Click Run — watch live Victron data flow into gauges and charts
  5. 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.

Further reading

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.