diff --git a/homeassistant/components/avea/light.py b/homeassistant/components/avea/light.py index a22129f0f4ff..ca72f7aa7e68 100644 --- a/homeassistant/components/avea/light.py +++ b/homeassistant/components/avea/light.py @@ -195,6 +195,16 @@ class AveaLight(LightEntity): def update(self) -> None: """Fetch new state data for this light.""" - if (brightness := self._light.get_brightness()) is not None: + connected = self._light.connect() + + try: + brightness = self._light.get_brightness() + rgb_color = self._light.get_rgb() + finally: + if connected: + self._light.disconnect() + + if brightness is not None: self._attr_is_on = brightness != 0 self._attr_brightness = round(255 * (brightness / 4095)) + self._attr_hs_color = color_util.color_RGB_to_hs(*rgb_color) diff --git a/tests/components/avea/test_light.py b/tests/components/avea/test_light.py index c45edc578bc8..ad6527a31bf5 100644 --- a/tests/components/avea/test_light.py +++ b/tests/components/avea/test_light.py @@ -2,7 +2,7 @@ from collections.abc import AsyncGenerator from datetime import timedelta -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock, call, patch from freezegun.api import FrozenDateTimeFactory import pytest @@ -27,7 +27,9 @@ def mock_bulb() -> MagicMock: bulb = MagicMock() bulb.name = "Unknown" bulb.brightness = 0 + bulb.connect.return_value = True bulb.get_brightness.return_value = 0 + bulb.get_rgb.return_value = (0, 0, 0) return bulb @@ -116,13 +118,57 @@ async def test_update_state( assert state.attributes[ATTR_BRIGHTNESS] is None bulb = setup_integration + bulb.reset_mock() + bulb.connect.return_value = True bulb.get_brightness.return_value = 2048 + bulb.get_rgb.return_value = (0, 255, 0) freezer.tick(timedelta(seconds=30)) async_fire_time_changed(hass) await hass.async_block_till_done(wait_background_tasks=True) + bulb.connect.assert_called_once() + bulb.get_brightness.assert_called_once() + bulb.get_rgb.assert_called_once() + bulb.disconnect.assert_called_once() + + bulb.assert_has_calls( + [ + call.connect(), + call.get_brightness(), + call.get_rgb(), + call.disconnect(), + ] + ) + state = hass.states.get("light.bedroom") assert state is not None assert state.state == STATE_ON assert state.attributes[ATTR_BRIGHTNESS] == 128 + assert state.attributes[ATTR_HS_COLOR] == (120.0, 100.0) + + +async def test_update_state_uses_cached_values_when_connect_fails( + hass: HomeAssistant, setup_integration: MagicMock, freezer: FrozenDateTimeFactory +) -> None: + """Test updating the entity state when the shared connection fails.""" + bulb = setup_integration + bulb.reset_mock() + bulb.connect.return_value = False + bulb.get_brightness.return_value = 2048 + bulb.get_rgb.return_value = (0, 255, 0) + + freezer.tick(timedelta(seconds=30)) + async_fire_time_changed(hass) + await hass.async_block_till_done(wait_background_tasks=True) + + bulb.connect.assert_called_once() + bulb.get_brightness.assert_called_once() + bulb.get_rgb.assert_called_once() + bulb.disconnect.assert_not_called() + + state = hass.states.get("light.bedroom") + assert state is not None + assert state.state == STATE_ON + assert state.attributes[ATTR_BRIGHTNESS] == 128 + assert state.attributes[ATTR_HS_COLOR] == (120.0, 100.0)