Prevent infinite loop in crossconfigured mqtt event streams (#5624)
* Prevent events about MQTT messages received to cause infinite loop when two HA instances are crossconfigured for mqtt_eventstream. * Fix linting * Publish all MQTT received events except incoming from eventstream. Also make it configurable.
This commit is contained in:
parent
68d6bcd3ed
commit
ae1f59970d
2 changed files with 57 additions and 0 deletions
|
@ -15,18 +15,23 @@ from homeassistant.const import (
|
|||
ATTR_SERVICE_DATA, EVENT_CALL_SERVICE, EVENT_SERVICE_EXECUTED,
|
||||
EVENT_STATE_CHANGED, EVENT_TIME_CHANGED, MATCH_ALL)
|
||||
from homeassistant.core import EventOrigin, State
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
from homeassistant.remote import JSONEncoder
|
||||
from .mqtt import EVENT_MQTT_MESSAGE_RECEIVED
|
||||
|
||||
DOMAIN = "mqtt_eventstream"
|
||||
DEPENDENCIES = ['mqtt']
|
||||
|
||||
CONF_PUBLISH_TOPIC = 'publish_topic'
|
||||
CONF_SUBSCRIBE_TOPIC = 'subscribe_topic'
|
||||
CONF_PUBLISH_EVENTSTREAM_RECEIVED = 'publish_eventstream_received'
|
||||
|
||||
CONFIG_SCHEMA = vol.Schema({
|
||||
DOMAIN: vol.Schema({
|
||||
vol.Optional(CONF_PUBLISH_TOPIC): valid_publish_topic,
|
||||
vol.Optional(CONF_SUBSCRIBE_TOPIC): valid_subscribe_topic,
|
||||
vol.Optional(CONF_PUBLISH_EVENTSTREAM_RECEIVED, default=False):
|
||||
cv.boolean,
|
||||
}),
|
||||
}, extra=vol.ALLOW_EXTRA)
|
||||
|
||||
|
@ -45,6 +50,15 @@ def setup(hass, config):
|
|||
if event.event_type == EVENT_TIME_CHANGED:
|
||||
return
|
||||
|
||||
# MQTT fires a bus event for every incoming message, also messages from
|
||||
# eventstream. Disable publishing these messages to other HA instances
|
||||
# and possibly creating an infinite loop if these instances publish
|
||||
# back to this one.
|
||||
if all([not conf.get(CONF_PUBLISH_EVENTSTREAM_RECEIVED),
|
||||
event.event_type == EVENT_MQTT_MESSAGE_RECEIVED,
|
||||
event.data.get('topic') == sub_topic]):
|
||||
return
|
||||
|
||||
# Filter out the events that were triggered by publishing
|
||||
# to the MQTT topic, or you will end up in an infinite loop.
|
||||
if event.event_type == EVENT_CALL_SERVICE:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue