mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 17:57:11 +00:00
Fix Sonos battery sensors on S1 firmware (#51585)
This commit is contained in:
parent
490c81aebc
commit
e257dd4d07
@ -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:
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user