From cc8170fcfec8ed9070ebdc903c19246b228d8e60 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Tue, 28 Jun 2022 08:50:31 +0200 Subject: [PATCH] Align code between group platforms (#74057) --- .../components/group/binary_sensor.py | 21 +++++++++---------- homeassistant/components/group/light.py | 18 +++++++--------- homeassistant/components/group/switch.py | 1 + 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/group/binary_sensor.py b/homeassistant/components/group/binary_sensor.py index ff0e58badfb..473a5a5e885 100644 --- a/homeassistant/components/group/binary_sensor.py +++ b/homeassistant/components/group/binary_sensor.py @@ -88,6 +88,8 @@ async def async_setup_entry( class BinarySensorGroup(GroupEntity, BinarySensorEntity): """Representation of a BinarySensorGroup.""" + _attr_available: bool = False + def __init__( self, unique_id: str | None, @@ -127,27 +129,24 @@ class BinarySensorGroup(GroupEntity, BinarySensorEntity): @callback def async_update_group_state(self) -> None: """Query all members and determine the binary sensor group state.""" - all_states = [self.hass.states.get(x) for x in self._entity_ids] - - # filtered_states are members currently in the state machine - filtered_states: list[str] = [x.state for x in all_states if x is not None] + states = [ + state.state + for entity_id in self._entity_ids + if (state := self.hass.states.get(entity_id)) is not None + ] # Set group as unavailable if all members are unavailable or missing - self._attr_available = any( - state != STATE_UNAVAILABLE for state in filtered_states - ) + self._attr_available = any(state != STATE_UNAVAILABLE for state in states) valid_state = self.mode( - state not in (STATE_UNKNOWN, STATE_UNAVAILABLE) for state in filtered_states + state not in (STATE_UNKNOWN, STATE_UNAVAILABLE) for state in states ) if not valid_state: # Set as unknown if any / all member is not unknown or unavailable self._attr_is_on = None else: # Set as ON if any / all member is ON - states = list(map(lambda x: x == STATE_ON, filtered_states)) - state = self.mode(states) - self._attr_is_on = state + self._attr_is_on = self.mode(state == STATE_ON for state in states) @property def device_class(self) -> str | None: diff --git a/homeassistant/components/group/light.py b/homeassistant/components/group/light.py index b9741085c2d..e0645da6141 100644 --- a/homeassistant/components/group/light.py +++ b/homeassistant/components/group/light.py @@ -46,7 +46,7 @@ from homeassistant.const import ( STATE_UNAVAILABLE, STATE_UNKNOWN, ) -from homeassistant.core import Event, HomeAssistant, State, callback +from homeassistant.core import Event, HomeAssistant, callback from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.event import async_track_state_change_event @@ -214,15 +214,15 @@ class LightGroup(GroupEntity, LightEntity): @callback def async_update_group_state(self) -> None: """Query all members and determine the light group state.""" - all_states = [self.hass.states.get(x) for x in self._entity_ids] - states: list[State] = list(filter(None, all_states)) + states = [ + state + for entity_id in self._entity_ids + if (state := self.hass.states.get(entity_id)) is not None + ] on_states = [state for state in states if state.state == STATE_ON] - # filtered_states are members currently in the state machine - filtered_states: list[str] = [x.state for x in all_states if x is not None] - valid_state = self.mode( - state not in (STATE_UNKNOWN, STATE_UNAVAILABLE) for state in filtered_states + state.state not in (STATE_UNKNOWN, STATE_UNAVAILABLE) for state in states ) if not valid_state: @@ -230,9 +230,7 @@ class LightGroup(GroupEntity, LightEntity): self._attr_is_on = None else: # Set as ON if any / all member is ON - self._attr_is_on = self.mode( - list(map(lambda x: x == STATE_ON, filtered_states)) - ) + self._attr_is_on = self.mode(state.state == STATE_ON for state in states) self._attr_available = any(state.state != STATE_UNAVAILABLE for state in states) self._attr_brightness = reduce_attribute(on_states, ATTR_BRIGHTNESS) diff --git a/homeassistant/components/group/switch.py b/homeassistant/components/group/switch.py index 6b879e55cea..8b60e1f1402 100644 --- a/homeassistant/components/group/switch.py +++ b/homeassistant/components/group/switch.py @@ -170,4 +170,5 @@ class SwitchGroup(GroupEntity, SwitchEntity): # Set as ON if any / all member is ON self._attr_is_on = self.mode(state == STATE_ON for state in states) + # Set group as unavailable if all members are unavailable or missing self._attr_available = any(state != STATE_UNAVAILABLE for state in states)