diff --git a/homeassistant/components/sonos/speaker.py b/homeassistant/components/sonos/speaker.py index 26a75f94065..d7eb6ea8358 100644 --- a/homeassistant/components/sonos/speaker.py +++ b/homeassistant/components/sonos/speaker.py @@ -173,7 +173,7 @@ class SonosSpeaker: self.zone_name = speaker_info["zone_name"] # Battery - self.battery_info: dict[str, Any] | None = None + self.battery_info: dict[str, Any] = {} self._last_battery_event: datetime.datetime | None = None self._battery_poll_timer: Callable | None = None @@ -208,21 +208,15 @@ class SonosSpeaker: self.hass, f"{SONOS_SEEN}-{self.soco.uid}", self.async_seen ) - if (battery_info := fetch_battery_info_or_none(self.soco)) is None: - self._platforms_ready.update({BINARY_SENSOR_DOMAIN, SENSOR_DOMAIN}) - else: + if battery_info := fetch_battery_info_or_none(self.soco): self.battery_info = battery_info - # Only create a polling task if successful, may fail on S1 firmware - if battery_info: - # Battery events can be infrequent, polling is still necessary - self._battery_poll_timer = self.hass.helpers.event.track_time_interval( - self.async_poll_battery, BATTERY_SCAN_INTERVAL - ) - else: - _LOGGER.warning( - "S1 firmware detected, battery sensor may update infrequently" - ) + # Battery events can be infrequent, polling is still necessary + self._battery_poll_timer = self.hass.helpers.event.track_time_interval( + self.async_poll_battery, BATTERY_SCAN_INTERVAL + ) dispatcher_send(self.hass, SONOS_CREATE_BATTERY, self) + else: + self._platforms_ready.update({BINARY_SENSOR_DOMAIN, SENSOR_DOMAIN}) if new_alarms := self.update_alarms_for_speaker(): dispatcher_send(self.hass, SONOS_CREATE_ALARM, self, new_alarms) @@ -386,7 +380,7 @@ class SonosSpeaker: async def async_update_device_properties(self, event: SonosEvent) -> None: """Update device properties from an event.""" - if (more_info := event.variables.get("more_info")) is not None: + if more_info := event.variables.get("more_info"): battery_dict = dict(x.split(":") for x in more_info.split(",")) await self.async_update_battery_info(battery_dict) self.async_write_entity_states() @@ -515,12 +509,19 @@ class SonosSpeaker: if not self._battery_poll_timer: # Battery info received for an S1 speaker + new_battery = not self.battery_info self.battery_info.update( { "Level": int(battery_dict["BattPct"]), "PowerSource": "EXTERNAL" if is_charging else "BATTERY", } ) + if new_battery: + _LOGGER.warning( + "S1 firmware detected on %s, battery info may update infrequently", + self.zone_name, + ) + async_dispatcher_send(self.hass, SONOS_CREATE_BATTERY, self) return if is_charging == self.charging: diff --git a/tests/components/sonos/test_sensor.py b/tests/components/sonos/test_sensor.py index c8910b481f3..12c12821a0d 100644 --- a/tests/components/sonos/test_sensor.py +++ b/tests/components/sonos/test_sensor.py @@ -3,7 +3,7 @@ from pysonos.exceptions import NotSupportedException from homeassistant.components.sonos import DOMAIN from homeassistant.components.sonos.binary_sensor import ATTR_BATTERY_POWER_SOURCE -from homeassistant.const import STATE_OFF, STATE_ON, STATE_UNAVAILABLE +from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.setup import async_setup_component @@ -68,21 +68,18 @@ async def test_battery_on_S1(hass, config_entry, config, soco, battery_event): entity_registry = await hass.helpers.entity_registry.async_get_registry() - battery = entity_registry.entities["sensor.zone_a_battery"] - battery_state = hass.states.get(battery.entity_id) - assert battery_state.state == STATE_UNAVAILABLE - - power = entity_registry.entities["binary_sensor.zone_a_power"] - power_state = hass.states.get(power.entity_id) - assert power_state.state == STATE_UNAVAILABLE + assert "sensor.zone_a_battery" not in entity_registry.entities + assert "binary_sensor.zone_a_power" not in entity_registry.entities # Update the speaker with a callback event sub_callback(battery_event) await hass.async_block_till_done() + battery = entity_registry.entities["sensor.zone_a_battery"] battery_state = hass.states.get(battery.entity_id) assert battery_state.state == "100" + power = entity_registry.entities["binary_sensor.zone_a_power"] power_state = hass.states.get(power.entity_id) assert power_state.state == STATE_OFF assert power_state.attributes.get(ATTR_BATTERY_POWER_SOURCE) == "BATTERY"