Boardstrom: local-only Victron monitor (Instant Readout BLE + MQTT, no cloud)

I’ve been building a phone app that reads Victron data locally, and this seems like the right crowd to share it with.

What it does:

Reads the encrypted Instant Readout BLE advertisements from Victron devices (SmartShunt, MPPT, Orion-Tr / XS, Phoenix inverters, Smart Battery Sense, VE.Bus, AC chargers). You paste each device’s encryption key once and it decodes on-device.
Connects to a GX over MQTT (Cerbo, Ekrano, Venus OS): plaintext 1883 on the local network, or over a VPN/Tailscale by pointing it at the GX’s remote address, since it just dials the broker. No cloud relay.
Everything stays on the phone. No account, no server, works offline.
Per-system profiles, so multiple GX setups (and mixed BLE + MQTT) sit side by side.
It also reads a few non-Victron BLE sensors (Ruuvi now, more coming) for temperature and tank data alongside the Victron readings.
Free, with an optional one-time Pro unlock. iOS and Android. Not affiliated with Victron.

I’d value feedback from this group in particular, especially on device types or firmware I might not be parsing correctly, and on less common GX/MQTT configs. Details and download: https://boardstrom.com/

While you can add an Orion XS, and it is supported, theres no information shown on the main page afterwards. The three standard “tiles” solar, battery and load stay as they are. I would expect the solar tile to change to alternator if theres no solar in the system.

I dont know how it behaves if both solar and alternator are present as charging sources, but id expect it to show both in their own tiles.

Adding the SmartLithium currently adds no value, but i do realize that its not on the list of supported devices. It would be nice to incorporate it as well, so if a SmartLithium is present it can also be read. A possible way could be to make the tiles openable, so if you tap on it you get to see details. On the battery tile this is currently only Shut information but could be combined with SmartLithium info in the detail view.


The setting “MQTT on LAN” was removed some time ago. MQTT is always active with GUIv2 now, but you need to enable external access under Settings, Integrations, MQTT Access. Also the connection is either secured/unsecured depending on the general connection security under Settings, General, Access&Security, Local network security profile.

Thanks, this is exactly the kind of feedback I was hoping for.

On the Orion XS: you’re right that it isn’t surfacing on the main page, and that’s a gap I want to close. Its charge contribution should show like any other source. I’d lean toward giving the alternator/DC-DC its own tile and flow rather than reusing the solar tile, so when you have both PV and an Orion you see them separately, and when there’s no PV the alternator still has a clear home. To help me reproduce: are you seeing this over Bluetooth, MQTT, or both, and does the Orion appear as a device with no values, or not show on the dashboard at all?

On SmartLithium: fair. It’s read but I don’t surface much from it yet. The tappable-tile idea is a good one and the direction I want to go, a tile you can open for detail (cell voltages, balancer, temperatures), which would help the multi-bank case too. It’s on the list.

And thank you for the MQTT correction. You’re right that “MQTT on LAN” is gone under GUIv2. I’ll update my docs to the current path (Settings → Integrations → MQTT Access, plus the Local network security profile under Settings → General → Access & Security). That move has been a recurring source of confusion as people get onto the newer firmware.

Appreciate you taking the time to dig in.

Over bluetooth, and it doesnt show up at all, or i havent found it.

Im currently playing around with my ESS over MQTT and there it showed a shore input in an additional tile. Adding the alternator/DC-DC like this would be just fine.

MQTT connection is very spotty for me, but ill first blame it on my network, since the GX is on an IoT Wifi while the phone is on another. So ill try with connecting my phone to the IoT Wifi

Edit: It seems to work reliably with my phone on the same Wifi, so it does look like an issue in my end

Thanks, that confirms it. Over Bluetooth the Orion broadcast carries no output current, so there was genuinely no power value to show and the tile never appeared. I shipped a fix for exactly this (it arrives as an over-the-air update on its own, OTA #290 in the changelog if you want to confirm you have it): when a paired Orion reports an active charging state, an Alternator tile now shows with its state (Bulk/Absorption/Float), and a measured figure when there’s enough signal to infer one. Same additional-tile approach you saw for shore over MQTT.

On the MQTT spottiness, your edit nailed it. With the GX on an IoT VLAN and the phone on another, the two usually can’t reach each other, and “Scan network for broker” only looks on the phone’s own subnet so it won’t find it across VLANs. You don’t have to leave the phone on the IoT WiFi though. Two options that keep your separation:

Add a firewall rule allowing your phone’s network to reach the GX’s IP on port 1883, then enter that IP by hand (not Scan).
Or put the GX on Tailscale and use its Tailscale address as the broker host, which works across networks (and remotely) without touching firewall rules.

Appreciate the detailed testing.

They are on the same VLAN but IoT has no local network access, except for some IP:Port exceptions, and those also only to specific adresses like the HA server. Or so i thought. Im more confused about that it managed to connect sometimes, rather than the times it didnt because thats what i was expecting.

Currently im tending to, that the times it ended up connecting, my phone and the GX were connected to the same AP, although on different SSIDs, and because of that the connection worked directly on the AP. Only when the traffic has to go over the LAN it gets blocked by the rules. But thats something for me to sort out.

I have received the OTA, now i also know what the little number in the top right means (tapping on it could bring you to the release notes). Ill give it a try tomorrow and report.

That matches the behavior. Two clients on the same AP can be bridged locally without ever hitting the router’s inter-VLAN rules, so same-AP worked and anything crossing the LAN got blocked. A firewall exception to the GX’s IP on 1883 (or putting it on Tailscale) will make it consistent.

Good idea on the number. It’s the build, and it ticks every update so you can tell at a glance whether a change landed; making it tappable to open the release notes (What's new · Boardstrom) is an easy win and I’ll wire it up. Looking forward to your Orion report tomorrow.

Does not look like it worked

The equalize state is due to me manually starting that, to charge to 14.2V, since otherwise the battery would have not taken any actual charge

Found it. Two things were against you: your system has no solar, so the old method (which works out the alternator from battery minus solar) had nothing to subtract, and your Orion XS in charger mode reports under the GX’s “alternator” service, which I wasn’t reading. I now read the Orion’s actual output power directly from the GX, under either service, so it shows a real figure with no solar needed. It’s in the latest update (OTA #297, the number top-right). Update and have a look on Live and Flow. If it still shows nothing, the quickest way to nail it would be a peek at your MQTT topics for the Orion, but hopefully it just works now.

While the Transit has a GX, i did not connect to it. The data is solely from instant readout over bluetooth.

Just tried it with v297, no alternator tile shows up. But the Transit does not use MQTT so the update was unlikely to change it

I need to correct something I said earlier: I told you the Orion broadcasts no output current over Bluetooth. That’s true for the older Orion-Tr, but the Orion XS uses a different broadcast record that does include output current, and I simply wasn’t decoding that record yet. That was the real reason nothing showed, not the no-solar thing. It’s fixed in OTA #299: the XS now shows a measured Alternator tile with live current and power straight over Bluetooth, no GX needed. Update and have a look. Thanks for being clear that you’re BT-only, that’s what pinned it down.

Im using esphome_victron_ble to read out some victron device into HA, and i just searched a bit in the code, maybe this would have helped you

Nice. Now i guess the difference would be the load :upside_down_face:

That’s the right next step. Now that the alternator output is a measured value rather than an estimate, I can include it in the loads balance as a real source, so the Loads figure stays accurate while the Orion charges instead of dropping out. That’s live in OTA #301. Thanks also for the esphome struct link, good to confirm the record layout matches what I decoded.

Looks like theres still a bug in the load calculation

You were right, it is a real bug. Thanks for pushing on it.

The cause: Boardstrom refused to compute Loads whenever there was no solar reading at all. Your Transit has no MPPT, so it never reports solar, and that made the loads calculation bail out to 0, even though it had the alternator and battery figures it needed. The measured-alternator fix from earlier never got a chance to run on your setup because of it.

Fixed now, and already going out as an update (OTA 314): a system with no solar charger is treated as 0 W of solar rather than “unknown”, so Loads is computed from the alternator and battery balance. On your last screenshot that comes out around 16 W (Orion 436 W in, 420 W into the battery), not 0.

Appreciate the detailed screenshots and the VictronConnect side by side, that is what made it obvious.

Merten

Since the alternator output can change rapidly depending on the driving situation, its output can change quite fast. Since both orion and shunt dont report a change at the same time, the resulting difference can be quite high just for a brief moment.

it might be nice to add some rolling mean, or some other delay, to the load figure.

Also, the alternator tile could stay visible for an active session, so it doesnt pop in and out with every gear change or engine load change