The home bus exposes room-centric and user-facing telemetry, state, and control topics for the living environment.
Typical systems connected to this bus include:
The home bus models living-space behavior, not electrical topology.
This document defines the home-specific topic grammar and semantic ownership.
Shared rules for payload profiles, metadata, time semantics, quality, and operational topics are defined in mqtt_contract.md.
The home bus owns room and automation semantics.
The energy bus owns electrical accounting semantics.
Examples:
vad/home/living-room/power/tv/value is room control statevad/home/living-room/power/tv/set is room control commandvad/energy/load/living-room-entertainment/active_power/value is electrical telemetryRule:
homeenergyAll home topics MUST follow:
<site>/home/<location>/<capability>/<device_id>/<stream>
Where:
<site>: deployment/site id, for example vad<location>: normalized area identifier in kebab-case<capability>: semantic capability in snake_case<device_id>: stable device/entity identifier in kebab-case<stream>: one of value, last, set, meta, availabilityExamples:
vad/home/bedroom/temperature/bedroom-sensor/valuevad/home/living-room/motion/radar-south/valuevad/home/kitchen/light/ceiling-switch/valuevad/home/living-room/power/tv/setThe home bus is built around stable room semantics.
Rules:
<location> MUST describe the living-space area, not the vendor room name if the two differ<device_id> MUST identify the logical endpoint exposed to consumers<device_id><device_id> when the logical endpoint remains the sameExamples:
bedroom-sensor is a logical endpoint0x00158d0008aa1111 is a vendor identity and belongs in meta.source_ref, not in the topic pathThis keeps HomeKit, historian, and automations insulated from vendor identity churn.
value: live semantic sample, whether measurement, held state, or transition notificationlast: retained last-known timestamped sample for startup/bootstrap decisionsset: command/request topic for controllable capabilitiesmeta: static or slowly-changing metadataavailability: online/offline stateRules:
valuevalue samples when the semantic value did not changelast for the latest known timestamped samplestate and event topics SHOULD be treated as compatibility-only during migrationCommand safety:
set MUST NOT be retainedvaluemqtt_contract.mdTo keep Node-RED flows efficient, two payload profiles are allowed.
For frequent updates, payload SHOULD be scalar.
Examples:
vad/home/bedroom/temperature/bedroom-sensor/value -> 23.6vad/home/living-room/motion/radar-south/value -> trueMetadata is published separately on retained meta.
Example:
vad/home/bedroom/temperature/bedroom-sensor/meta{
"unit": "C",
"source": "zigbee_adapter",
"precision": 0.1
}
For streams that need inline quality/timestamp:
{
"value": 23.6,
"unit": "C",
"observed_at": "2026-03-08T10:15:12Z",
"quality": "good"
}
Recommendation:
last with Profile B and observed_at when control consumers need a startup sample with freshness informationvalue payloadsEnvironmental capabilities:
temperaturehumiditypressureilluminanceco2vocpm25pm10Presence and safety capabilities:
motionpresencecontactwater_leaksmokegastamperControl and user-facing capabilities:
lightpowerlockcover_positionthermostat_modetarget_temperaturefan_modebuttonDevice health capabilities that are still user-relevant:
batterybattery_lowRules:
power on home only for control semanticsactive_power and cumulative counters such as energy_total on energylinkquality SHOULD NOT go on home by defaultpresence SHOULD normally be a higher-level derived state, not a raw single-device detectionpresence with fading_time=0, SHOULD be published as motionDefault policy:
value: QoS 1, retain falselast: QoS 1, retain trueset: QoS 1, retain falsemeta: QoS 1, retain trueavailability: QoS 1, retain true (LWT preferred)Cold-start rule:
last to obtain the latest known sample at startuplast SHOULD include observed_at so staleness can be evaluated immediately after subscribelast after bootstrap and continue consuming lightweight live updates on valueIf uncertain, choose QoS 1.
Translation is done in Node-RED, so the contract is optimized for low processing overhead.
Guidelines:
meta to avoid payload repetitionmsg objectsvalue streams extremely lightweight# subscriptions in hot pathsSuggested Node-RED subscriptions:
+/home/+/+/+/value+/home/+/+/+/last+/home/+/+/+/setCross-bus correlations are implemented by consumers, not by changing bus semantics.
Examples:
home presence with energy load telemetry for occupancy-aware energy decisionshome climate data with network device state for diagnosticsThe home bus is a major historian source.
For ingestion worker compatibility, each message should map to:
metric_namedevice_idvalueobserved_atdevice_id recommendation:
<location>.<device_id>Historian defaults:
value streams SHOULD be ingested by defaultlast streams SHOULD NOT be ingested as normal telemetry samplesmeta.historian.mode SHOULD describe whether a value stream represents sample, state, or event semanticsobserved_at will usually fall back to ingestion timeExample:
vad/home/bedroom/temperature/bedroom-sensor/valuemetric_name = temperaturedevice_id = bedroom.bedroom-sensorZigbee2MQTT projection examples:
zigbee2mqtt/bedroom_sensor.temperature -> vad/home/bedroom/temperature/bedroom-sensor/valuezigbee2mqtt/front_door_contact.contact -> vad/home/entrance/contact/front-door/valuezigbee2mqtt/bedside_remote.action -> vad/home/bedroom/button/bedside-remote/valueThe home bus is a primary source for HomeKit adapters.
HomeKit integration remains a consumer layer concern:
The home bus contract SHOULD remain independent from HomeKit-specific modeling constraints.
home) from electrical accounting (energy)