Mastering Home Assistant's mqtt_eventstream: Advanced Event Routing for Scalable Automations

NGC 224
DIY Smart Home Creator
Introduction: Unlocking the Full Potential of Home Assistant Events
Home Assistant is a powerful smart home platform, generating a constant stream of events, state changes, and service calls. While its native automation engine is robust, integrating these critical data points with external systems, performing complex data transformations, or building highly decoupled, scalable automation architectures can be challenging. Directly polling the Home Assistant API can lead to overhead, and native integrations might not always offer the flexibility required for truly advanced setups.
Enter mqtt_eventstream
– a frequently underutilized Home Assistant component that publishes virtually all internal Home Assistant events to an MQTT broker. This seemingly simple bridge opens up a world of possibilities: external analytics, custom notification gateways, intricate Node-RED flows, data archival, and even inter-HA communication. If you're looking to push the boundaries of your smart home beyond basic YAML automations, understanding and mastering mqtt_eventstream
is a critical step.
Step-by-Step Setup: Enabling and Configuring `mqtt_eventstream`
Integrating mqtt_eventstream
into your Home Assistant setup is straightforward, provided you already have an MQTT broker configured and connected to Home Assistant. If not, set up the MQTT integration first.
1. Add `mqtt_eventstream` to `configuration.yaml`
Open your Home Assistant configuration.yaml
file and add the mqtt_eventstream
component. The simplest configuration will publish all events:
# configuration.yaml
mqtt_eventstream:
# This assumes you have the default MQTT integration configured.
# If you have multiple MQTT brokers or a non-default setup,
# you might need to specify 'mqtt_id' or other parameters.
# For a basic setup, this is often enough.
Explanation: By default, mqtt_eventstream
will publish all events under the base topic homeassistant/events
. Each event type (e.g., state_changed
, call_service
) will get its own sub-topic.
2. Filter Events for Performance and Relevance (Optional but Recommended)
Publishing all events can generate a significant amount of MQTT traffic, especially in large installations. It's often better to filter events to only those you care about. You can use include_event_type
and exclude_event_type
:
# configuration.yaml
mqtt_eventstream:
include_event_type:
- state_changed
- call_service
- automation_triggered
exclude_event_type:
- mqtt_json
- recorder_5min_stats
Explanation: This configuration tells Home Assistant to only publish state_changed
, call_service
, and automation_triggered
events, while explicitly ignoring specific MQTT-related events and internal recorder statistics.
3. Customize MQTT Topic Structure (Optional)
You can define a custom base topic for your event stream:
# configuration.yaml
mqtt_eventstream:
base_topic: my_ha_events/
include_event_type:
- state_changed
Explanation: Now, your state change events will be published to topics like my_ha_events/state_changed/light.living_room
instead of homeassistant/events/state_changed/light.living_room
. This helps organize your MQTT topics.
4. Restart Home Assistant
After modifying configuration.yaml
, restart your Home Assistant instance for the changes to take effect.
Verify: Use an MQTT client (like MQTT Explorer) to subscribe to your configured base topic (e.g., homeassistant/events/#
or my_ha_events/#
). You should start seeing a flood of JSON payloads reflecting your Home Assistant's activity.
(Placeholder: Screenshot of MQTT Explorer showing a live stream of Home Assistant events, highlighting topic structure and JSON payload.)
Troubleshooting Section
Here are common issues and how to resolve them:
Issue: No events appearing in MQTT Explorer or other clients
- Check MQTT Broker Status: Ensure your MQTT broker (e.g., Mosquitto) is running and accessible on your network.
- Verify Home Assistant MQTT Integration: Make sure Home Assistant is successfully connected to your MQTT broker. Check `Settings -> Devices & Services -> Integrations -> MQTT`. Look for any errors.
- `mqtt_eventstream` Configuration: Double-check your
configuration.yaml
for typos or incorrect indentation in themqtt_eventstream
section. Restart Home Assistant after any changes. - Home Assistant Logs: Review your Home Assistant logs (`Settings -> System -> Logs`) for any errors related to
mqtt
ormqtt_eventstream
. - Topic Subscription: Ensure your MQTT client is subscribing to the correct topic. If you used `base_topic: my_ha_events/`, subscribe to `my_ha_events/#`. If not specified, subscribe to `homeassistant/events/#`.
Issue: Event data is not in the expected format or missing information
- Payload Structure: The JSON payload for events like
state_changed
containsentity_id
,new_state
, andold_state
. Forcall_service
, it includesdomain
,service
, andservice_data
. Familiarize yourself with these standard structures. - Template Issues: If you're using templates to transform data (covered in Advanced Config), ensure your templates are valid Jinja2. Use the Home Assistant Developer Tools (Template tab) to test them.
Issue: Performance degradation or high CPU usage
- Excessive Events: If you're publishing all events on a large Home Assistant instance, the sheer volume can be overwhelming. Review the `include_event_type` and `exclude_event_type` options (Step 2) to drastically reduce traffic to only what's necessary for your external applications.
- MQTT Broker Load: Ensure your MQTT broker is adequately resourced. If it's running on the same low-power device as Home Assistant (e.g., Raspberry Pi), consider moving it to a more powerful machine or optimizing its configuration.
Advanced Configuration / Optimization
Once you have basic mqtt_eventstream
working, you can unlock its full power:
1. Selective Publishing for Granular Control
Beyond `include_event_type`, you can refine which specific entities or domains generate events:
# configuration.yaml
mqtt_eventstream:
include_event_type:
- state_changed
include_entity:
- sensor.temperature_outdoor
- binary_sensor.front_door
exclude_domain:
- updater # Exclude update checks
Explanation: This will only publish state_changed
events for the outdoor temperature sensor and the front door binary sensor. It also globally excludes all events from the `updater` domain.
2. Bridging Events to External Systems (e.g., Node-RED)
The primary power of mqtt_eventstream
is its ability to feed *any* Home Assistant event into an external processing engine like Node-RED. This allows for complex logic that might be difficult or impossible in YAML.
In Node-RED, you'd use an MQTT `in` node subscribing to `homeassistant/events/#` (or your custom base topic). You can then parse the JSON payload and route based on `event_type`, `entity_id`, or state attributes.
// Example Node-RED MQTT 'in' node configuration
{
"id": "mqtt_event_listener",
"type": "mqtt in",
"name": "HA EventStream",
"topic": "homeassistant/events/#",
"qos": "0",
"datatype": "json",
"broker": "your_mqtt_broker",
"x": 100, "y": 100, "wires": [["some_processing_node"]]
}
(Placeholder: Screenshot of a Node-RED flow with an MQTT input node subscribed to `homeassistant/events/#`, followed by a switch node to route by `msg.payload.event_type`.)
3. Securing MQTT Access
Always secure your MQTT broker with a username and password. For mqtt_eventstream
, it's good practice to use a dedicated MQTT user with read-only access to the event stream topics, or at least a user with limited permissions if Home Assistant also acts as an MQTT publisher for other devices. Use TLS/SSL for encrypted communication between Home Assistant and the broker.
Real-World Example: Building a Context-Aware Notification Gateway
Let's create a scenario: you want highly customized notifications for critical security events. Standard Home Assistant notifications might not be enough. We'll use mqtt_eventstream
to funnel `state_changed` events for door/window sensors to Node-RED, where we can add context (e.g., who is home, time of day), check conditions, and send rich notifications via multiple channels.
Home Assistant `configuration.yaml`
# configuration.yaml
mqtt_eventstream:
base_topic: ha/events/
include_event_type:
- state_changed
include_entity_glob:
- binary_sensor.*_door_window_sensor
Explanation: This ensures only state changes for entities matching `binary_sensor.*_door_window_sensor` (e.g., `binary_sensor.front_door_window_sensor`, `binary_sensor.back_door_window_sensor`) are published to ha/events/state_changed/
.
Node-RED Flow Logic (Simplified)
1. MQTT In Node: Subscribes to ha/events/state_changed/#
.
2. Filter Node (e.g., `switch` node): Filters for `msg.payload.event.new_state.state === 'on'` (door/window opened).
3. HA Current State Node: Retrieves additional context, such as `person.me`'s state (home
/not_home
) or `input_boolean.security_armed` state.
4. Function Node: Composes a custom message based on context. Example:
// Node-RED Function Node to compose message
const entityId = msg.payload.event.entity_id;
const friendlyName = msg.payload.event.new_state.attributes.friendly_name;
const armedState = flow.get('security_armed') || 'unknown'; // Get state from HA Current State node output
const presence = flow.get('me_presence') || 'unknown';
let message = `${friendlyName} was opened!`;
if (armedState === 'on') {
message += ` Security is ARMED!`;
}
if (presence === 'not_home') {
message += ` No one is home.`;
} else if (presence === 'home') {
message += ` Someone is home.`;
}
msg.payload = { message: message, title: 'Security Alert!' };
return msg;
5. Notification Nodes: Send the composed message via a Home Assistant `call_service` node (for persistent notifications), a Telegram node, or a webhook to an incident management system.
This flow demonstrates how mqtt_eventstream
provides the raw event data, and Node-RED adds the 'smarts' and flexible routing for a powerful, context-aware notification system.
Best Practices / Wrap-up
- Topic Naming Conventions: Adopt a consistent and hierarchical MQTT topic structure (e.g.,
ha/events/state_changed/light/living_room_light
) to make debugging and filtering easier. - Filter Aggressively: Only publish the events you genuinely need. Unnecessary event publishing consumes resources on both Home Assistant and your MQTT broker.
- QoS for Critical Events: For critical events (e.g., security, safety), consider setting the MQTT Quality of Service (QoS) to 1 or 2. This ensures messages are delivered even if the network is temporarily unstable, though it adds overhead. By default,
mqtt_eventstream
uses QoS 0. You might need an external script or Node-RED to re-publish events with a higher QoS if needed, asmqtt_eventstream
doesn't expose a QoS setting directly. - Security First: Always secure your MQTT broker with authentication and consider TLS/SSL for encrypted communication. If exposing MQTT externally, use a strong firewall.
- Monitor Performance: Keep an eye on your Home Assistant and MQTT broker's CPU/memory usage, especially after enabling
mqtt_eventstream
. Adjust filtering if you notice performance issues. - Backup Configuration: Your
mqtt_eventstream
configuration is part of yourconfiguration.yaml
. Ensure it's backed up regularly as part of your overall Home Assistant backup strategy.
By effectively using mqtt_eventstream
, you transform Home Assistant from a closed ecosystem into an open data source, enabling limitless possibilities for integration, advanced automation, and external analysis. Embrace this powerful component to build a truly robust and scalable smart home!

NGC 224
Author bio: DIY Smart Home Creator