Roam Assistant
Phone-accessible Home Assistant build on a Raspberry Pi CM5 — consolidates 12V relays, wireless switches, Zigbee/Matter sensors, and Victron energy monitoring into one local interface, no internet required.
A custom smart control system for my truck camper that consolidates every 12V electrical system into one phone-accessible interface. The system runs a custom Home Assistant OS image on a Raspberry Pi Compute Module 5 with pre-configured automations, a branded TypeScript dashboard, and a golden-image provisioning pipeline for reproducible deployments. The hub creates its own WiFi access point — no existing network or internet required. Connect from any phone, control everything locally, and optionally add internet via Ethernet or WiFi uplink.
Problem
Off-grid vehicle living means juggling separate apps and physical switches for every 12V system — lights, water, heat, fans, awning, battery monitoring. Each manufacturer ships its own ecosystem, none of them interoperate, and most assume an internet connection that's unreliable on the road. I wanted one interface — fully local, phone-accessible — that pulls every system into a single dashboard and survives the realities of mobile use.
What it does
- Shelly relay switches
- Shelly 1 Mini Gen4 wireless switches installed inline with each 12V load (lights, water pump, exhaust fan, heater, awning). Auto-discovered by Home Assistant with zero configuration.
- Custom relay board
- Seeed Studio 6-channel ESP32-C6 relay board running custom ESPHome firmware as a centralized wiring alternative — mobile-optimized WiFi config (fast connect, max TX power for metal vehicle bodies, extended reboot timeout for driving).
- Zigbee / Matter sensors
- Temperature, humidity, leak detection, door/window contact, and motion sensors via USB Zigbee coordinator (ZHA integration). System expands over time as sensors are added.
- Victron energy monitoring
- Battery state-of-charge, solar production, charging mode, and shore power detection via an ESP32 UART bridge reading Victron's VE.Direct protocol at 19200 baud. MQTT also supported for users with a Victron GX device.
- Scenes + safety interlocks
- Camp / Travel / Sleep modes, heater max run timer, water pump leak detection shutoff, freeze protection, wind-triggered awning retract, low-battery load shedding.
Approach
Built a custom Home Assistant OS image on a Raspberry Pi CM5 with pre-configured automations, a Lit/TypeScript dashboard, and a golden-image provisioning pipeline targeting Pi 3, Pi 5, and CM5. Devices auto-discover (Shelly relays, ESPHome boards, Zigbee/Matter sensors, Victron energy monitor); a 4-step onboarding wizard replaces HA's default setup. The hub spins up its own WiFi access point so nothing depends on roadside connectivity, with Ethernet or WiFi uplink available as an opt-in.
Notable engineering decisions
Custom TypeScript dashboard
Lit 3.x web component panel registered in Home Assistant's sidebar — relay toggle grid, mode selector, energy gauges, and system status, all reactive via HA's real-time hass object and service call API. Bundled with Rollup and dropped into HAOS as a registered panel rather than a Lovelace card so it gets a full-page surface.
4-step onboarding wizard
Replaces Home Assistant's default setup. Auto-discovers Shelly devices on the local network, lets you assign each to a load via dropdown, renames entity IDs through the WebSocket API, and scans + connects to WiFi networks via the Supervisor API. Owner provisioning a fresh hub never touches YAML.
8 automation packages, dormant until paired
Domain-organized YAML configs (climate, water, lighting, awning, security, electrical, connectivity, relay system) using HA's packages pattern. All automations are dormant until matching devices are paired — the image ships with the full automation surface without breaking when a sensor isn't installed yet.
ESPHome device configs
Full configurations for the Seeed 6-channel ESP32-C6 relay board and the Victron VE.Direct UART bridge (ESP32) — mobile-optimized WiFi (fast connect, max TX power, extended reboot timeout), safety timers on relay outputs, and sliding-window sensor filters to smooth noisy 12V readings.
Golden image provisioning pipeline
Bash build pipeline that overlays the full HA config and pre-seeded .storage/ files onto a stock HAOS image, skipping the default onboarding entirely. Supports Pi 3, Pi 5, and CM5 targets — fresh hardware boots straight into the configured environment instead of running through HA's first-launch flow.
Architecture
A phone or browser connects via the Pi's own WiFi access point — no external network required. The Pi CM5 runs Home Assistant OS with the custom Lit/TypeScript panel, a USB Zigbee/Thread/Matter coordinator, an MQTT broker, and an optional internet uplink. From there: Shelly switches drive 12V loads, Zigbee sensors feed automations, and an ESP32 UART bridge reads Victron VE.Direct (battery, solar, inverter).
Outcome
Centralized control over Camp / Travel / Sleep modes with safety interlocks (heater max run timer, water pump leak shutoff, freeze protection, wind-triggered awning retract, low-battery load shedding) — all reactive in real time via HA's hass object and service call API. Reproducible deployments via the golden-image pipeline mean fresh hardware boots straight into the configured environment.