The RV Link Architecture
An end-to-end bridge from your RV’s physical control network to a modern, web-based interface. Decode status messages, create entities automatically, and send commands back to the coach—all with reliable, spec-compliant flows.
End-to-End Data Path
- Physical Layer (RV-C): The RV-C CAN bus carries messages between all the smart devices in your coach, like light controllers, tank sensors, and HVAC systems.
- CAN to MQTT Bridge: The RV Link hardware taps into this bus. A lightweight Home Assistant add-on reads every message and publishes it as a raw data packet to a central MQTT message broker.
- Node-RED Processing: The heart of RV Link, a Node-RED project, subscribes to the raw CAN data. A series of decoder functions parse these messages according to the RV-C specification, identifying the device and its status.
- Home Assistant Integration: Once decoded, Node-RED publishes two types of messages: a "config" message to tell Home Assistant a new device exists (MQTT Discovery), and ongoing "state" messages to update its status (e.g., "On," "75%," "Locked").
- User Interface: Home Assistant automatically creates entities for each discovered device, which you can then add to your dashboard for control and monitoring. When you tap a button in the app, the process happens in reverse, with Node-RED encoding your command into an RV-C message and sending it back to the bus.
Core Software Components
CAN to MQTT Bridge Add-on
This custom Home Assistant add-on is a simple but crucial utility. It runs in the background, listening for raw data on the CAN bus and forwarding it to MQTT. It also subscribes to a specific MQTT topic, and any message it receives is immediately written back to the CAN bus.
- Publishes raw CAN frames to the
can/rawMQTT topic - Listens on the
can/sendtopic to transmit frames back to the RV - Configurable for any CAN interface and bitrate
Node-RED Project
This is where the magic happens. The project is a collection of flows that receive the raw CAN data and turn it into meaningful information. It's responsible for decoding status messages and encoding commands.
- Parses RV-C Data Group Numbers (DGNs) to identify devices
- Uses MQTT Discovery to automatically create Home Assistant entities
- Translates simple Home Assistant commands (e.g., "ON") into valid RV-C frames
MQTT Topics & Message Flow
RV Link uses a standardized set of MQTT topics to communicate between the bridge, Node-RED, and Home Assistant. This ensures reliability and makes troubleshooting straightforward.
From CAN Bus to Home Assistant
- Bridge Publishes:
can/raw→19FEDA8C#3AFF00FDFF2100FF - Node-RED Decodes & Publishes Discovery:
homeassistant/light/switch_5/config→{"name": "Ceiling Light", ...}(retained) - Node-RED Publishes State:
homeassistant/light/switch_5/state→ON
From Home Assistant to CAN Bus
- Home Assistant Publishes Command:
homeassistant/light/switch_5/set→OFF - Node-RED Encodes & Publishes to Bridge:
can/send→19FEDA8C#3A0000FDFF2100FF - Bridge Transmits: The raw frame is sent onto the RV-C CAN bus.
The exact topic names are generated dynamically based on the device type and instance number discovered on the bus.
Node-RED Flows & Decoders
The Node-RED project is organized by function with clear tabs for Status, Entities, Commands, and Config. Each decoder is a self-contained function node that adheres to the RV-C specification, making the system easy to extend.
Compatibility & Reliability
Device Coverage
RV Link targets standard RV-C devices and has been validated against real-world CAN captures from multiple manufacturers.
- Control: Lights, Shades, Locks, Water Pump, Autofill
- Monitor: Tanks, Batteries, Chargers, Inverters, Generators, ATS, HVAC
System Reliability
The architecture is designed for robustness, with features to ensure stability even after restarts or network interruptions.
- Retained MQTT Messages: Home Assistant automatically rediscovers all devices after a reboot.
- RV-C Address Claiming: The system properly negotiates a unique address on the CAN bus to avoid conflicts.
- Stateless Encoders: Command functions are simple and non-blocking, ensuring responsive control.
For more background on RV-C and similar projects, see the excellent resources at myervin.com.