From 915f260b59d751ecc2cb67faaa2c438658cbf3d4 Mon Sep 17 00:00:00 2001 From: David Mulcahey Date: Sun, 28 Mar 2021 17:13:59 -0400 Subject: [PATCH] support feedback for ZHA device reconfiguration --- homeassistant/components/zha/api.py | 33 ++++++++++++++++++-- homeassistant/components/zha/core/gateway.py | 9 ++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/zha/api.py b/homeassistant/components/zha/api.py index c8839acf8562e6..7e265d03c0940b 100644 --- a/homeassistant/components/zha/api.py +++ b/homeassistant/components/zha/api.py @@ -462,9 +462,38 @@ async def websocket_remove_group_members(hass, connection, msg): ) async def websocket_reconfigure_node(hass, connection, msg): """Reconfigure a ZHA nodes entities by its ieee address.""" - zha_gateway = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY] + zha_gateway: ZhaGatewayType = hass.data[DATA_ZHA][DATA_ZHA_GATEWAY] ieee = msg[ATTR_IEEE] - device = zha_gateway.get_device(ieee) + device: ZhaDeviceType = zha_gateway.get_device(ieee) + ieee_str = str(device.ieee) + nwk_str = device.nwk.__repr__() + + class DeviceLogFilterer(logging.Filter): + """Log filterer that limits messages to the specified device.""" + + def filter(self, record): + message = record.getMessage() + return nwk_str in message or ieee_str in message + + filterer = DeviceLogFilterer() + + async def forward_messages(data): + """Forward events to websocket.""" + connection.send_message(websocket_api.event_message(msg["id"], data)) + + remove_dispatcher_function = async_dispatcher_connect( + hass, "zha_gateway_message", forward_messages + ) + + @callback + def async_cleanup() -> None: + """Remove signal listener and turn off debug mode.""" + zha_gateway.async_disable_debug_mode(filterer=filterer) + remove_dispatcher_function() + + connection.subscriptions[msg["id"]] = async_cleanup + zha_gateway.async_enable_debug_mode(filterer=filterer) + _LOGGER.debug("Reconfiguring node with ieee_address: %s", ieee) hass.async_create_task(device.async_configure()) diff --git a/homeassistant/components/zha/core/gateway.py b/homeassistant/components/zha/core/gateway.py index e944196a40939d..de65ed6695e15c 100644 --- a/homeassistant/components/zha/core/gateway.py +++ b/homeassistant/components/zha/core/gateway.py @@ -473,24 +473,29 @@ def register_entity_reference( ) @callback - def async_enable_debug_mode(self): + def async_enable_debug_mode(self, filterer=None): """Enable debug mode for ZHA.""" self._log_levels[DEBUG_LEVEL_ORIGINAL] = async_capture_log_levels() async_set_logger_levels(DEBUG_LEVELS) self._log_levels[DEBUG_LEVEL_CURRENT] = async_capture_log_levels() + if filterer: + self._log_relay_handler.addFilter(filterer) + for logger_name in DEBUG_RELAY_LOGGERS: logging.getLogger(logger_name).addHandler(self._log_relay_handler) self.debug_enabled = True @callback - def async_disable_debug_mode(self): + def async_disable_debug_mode(self, filterer=None): """Disable debug mode for ZHA.""" async_set_logger_levels(self._log_levels[DEBUG_LEVEL_ORIGINAL]) self._log_levels[DEBUG_LEVEL_CURRENT] = async_capture_log_levels() for logger_name in DEBUG_RELAY_LOGGERS: logging.getLogger(logger_name).removeHandler(self._log_relay_handler) + if filterer: + self._log_relay_handler.removeFilter(filterer) self.debug_enabled = False @callback