From 52808562ab236ada838b94e4f17cad420ffc55aa Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 23 May 2022 21:32:03 +0200 Subject: [PATCH] Improve DEVICE_TRIGGERS typing in tasmota (#72149) * Improve DEVICE_TRIGGERS typing in tasmota * fix CI * Simplify * Simplify some more --- .../components/tasmota/device_trigger.py | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/tasmota/device_trigger.py b/homeassistant/components/tasmota/device_trigger.py index 26b1d9debf1..69cb3a0bd72 100644 --- a/homeassistant/components/tasmota/device_trigger.py +++ b/homeassistant/components/tasmota/device_trigger.py @@ -188,11 +188,13 @@ async def async_setup_trigger( _LOGGER.debug( "Got update for trigger with hash: %s '%s'", discovery_hash, trigger_config ) + device_triggers: dict[str, Trigger] = hass.data[DEVICE_TRIGGERS] if not trigger_config.is_active: # Empty trigger_config: Remove trigger _LOGGER.debug("Removing trigger: %s", discovery_hash) - if discovery_id in hass.data[DEVICE_TRIGGERS]: - device_trigger = hass.data[DEVICE_TRIGGERS][discovery_id] + if discovery_id in device_triggers: + device_trigger = device_triggers[discovery_id] + assert device_trigger.tasmota_trigger await device_trigger.tasmota_trigger.unsubscribe_topics() device_trigger.detach_trigger() clear_discovery_hash(hass, discovery_hash) @@ -200,7 +202,8 @@ async def async_setup_trigger( remove_update_signal() return - device_trigger = hass.data[DEVICE_TRIGGERS][discovery_id] + device_trigger = device_triggers[discovery_id] + assert device_trigger.tasmota_trigger if device_trigger.tasmota_trigger.config_same(trigger_config): # Unchanged payload: Ignore to avoid unnecessary unsubscribe / subscribe _LOGGER.debug("Ignoring unchanged update for: %s", discovery_hash) @@ -209,6 +212,7 @@ async def async_setup_trigger( # Non-empty, changed trigger_config: Update trigger _LOGGER.debug("Updating trigger: %s", discovery_hash) device_trigger.tasmota_trigger.config_update(trigger_config) + assert remove_update_signal await device_trigger.update_tasmota_trigger( trigger_config, remove_update_signal ) @@ -230,7 +234,8 @@ async def async_setup_trigger( if DEVICE_TRIGGERS not in hass.data: hass.data[DEVICE_TRIGGERS] = {} - if discovery_id not in hass.data[DEVICE_TRIGGERS]: + device_triggers: dict[str, Trigger] = hass.data[DEVICE_TRIGGERS] + if discovery_id not in device_triggers: device_trigger = Trigger( hass=hass, device_id=device.id, @@ -240,10 +245,10 @@ async def async_setup_trigger( type=tasmota_trigger.cfg.type, remove_update_signal=remove_update_signal, ) - hass.data[DEVICE_TRIGGERS][discovery_id] = device_trigger + device_triggers[discovery_id] = device_trigger else: # This Tasmota trigger is wanted by device trigger(s), set them up - device_trigger = hass.data[DEVICE_TRIGGERS][discovery_id] + device_trigger = device_triggers[discovery_id] await device_trigger.set_tasmota_trigger(tasmota_trigger, remove_update_signal) await device_trigger.arm_tasmota_trigger() @@ -251,14 +256,20 @@ async def async_setup_trigger( async def async_remove_triggers(hass: HomeAssistant, device_id: str) -> None: """Cleanup any device triggers for a Tasmota device.""" triggers = await async_get_triggers(hass, device_id) + + if not triggers: + return + device_triggers: dict[str, Trigger] = hass.data[DEVICE_TRIGGERS] for trig in triggers: - device_trigger = hass.data[DEVICE_TRIGGERS].pop(trig[CONF_DISCOVERY_ID]) + device_trigger = device_triggers.pop(trig[CONF_DISCOVERY_ID]) if device_trigger: discovery_hash = device_trigger.discovery_hash + assert device_trigger.tasmota_trigger await device_trigger.tasmota_trigger.unsubscribe_topics() device_trigger.detach_trigger() clear_discovery_hash(hass, discovery_hash) + assert device_trigger.remove_update_signal device_trigger.remove_update_signal() @@ -271,7 +282,8 @@ async def async_get_triggers( if DEVICE_TRIGGERS not in hass.data: return triggers - for discovery_id, trig in hass.data[DEVICE_TRIGGERS].items(): + device_triggers: dict[str, Trigger] = hass.data[DEVICE_TRIGGERS] + for discovery_id, trig in device_triggers.items(): if trig.device_id != device_id or trig.tasmota_trigger is None: continue @@ -297,12 +309,13 @@ async def async_attach_trigger( """Attach a device trigger.""" if DEVICE_TRIGGERS not in hass.data: hass.data[DEVICE_TRIGGERS] = {} + device_triggers: dict[str, Trigger] = hass.data[DEVICE_TRIGGERS] device_id = config[CONF_DEVICE_ID] discovery_id = config[CONF_DISCOVERY_ID] - if discovery_id not in hass.data[DEVICE_TRIGGERS]: + if discovery_id not in device_triggers: # The trigger has not (yet) been discovered, prepare it for later - hass.data[DEVICE_TRIGGERS][discovery_id] = Trigger( + device_triggers[discovery_id] = Trigger( hass=hass, device_id=device_id, discovery_hash=None, @@ -311,5 +324,5 @@ async def async_attach_trigger( subtype=config[CONF_SUBTYPE], tasmota_trigger=None, ) - trigger: Trigger = hass.data[DEVICE_TRIGGERS][discovery_id] + trigger: Trigger = device_triggers[discovery_id] return await trigger.add_trigger(action, automation_info)