From 456582ed2d6f8e13fd6c087992f15a918aef2da9 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 28 Aug 2026 18:13:19 +0200 Subject: [PATCH] Apply AiDot color when brightness is sent along with it (#180391) --- homeassistant/components/aidot/light.py | 10 ++++-- tests/components/aidot/test_light.py | 44 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/aidot/light.py b/homeassistant/components/aidot/light.py index a216e788f8cd..1f0ec3d7eac7 100644 --- a/homeassistant/components/aidot/light.py +++ b/homeassistant/components/aidot/light.py @@ -92,13 +92,16 @@ class AidotLight(CoordinatorEntity[AidotDeviceUpdateCoordinator], LightEntity): @override async def async_turn_on(self, **kwargs: Any) -> None: - """Turn the light on, applying brightness, color temperature, RGBW, or plain on.""" + """Turn the light on, applying any requested brightness and color.""" + # Brightness is independent of color: a scene sends both at once, and + # the color must not be dropped just because brightness came with it. if ATTR_BRIGHTNESS in kwargs: brightness = kwargs.get(ATTR_BRIGHTNESS, 255) await self.coordinator.device_client.async_set_brightness(brightness) self.coordinator.data.dimming = brightness self._attr_brightness = brightness - elif ATTR_COLOR_TEMP_KELVIN in kwargs: + + if ATTR_COLOR_TEMP_KELVIN in kwargs: color_temp_kelvin = kwargs.get(ATTR_COLOR_TEMP_KELVIN) await self.coordinator.device_client.async_set_cct(color_temp_kelvin) self.coordinator.data.cct = color_temp_kelvin @@ -110,7 +113,8 @@ class AidotLight(CoordinatorEntity[AidotDeviceUpdateCoordinator], LightEntity): self.coordinator.data.rgbw = rgbw_color self._attr_rgbw_color = rgbw_color self._attr_color_mode = ColorMode.RGBW - else: + elif ATTR_BRIGHTNESS not in kwargs: + # Nothing was requested to apply, so just switch it on. await self.coordinator.device_client.async_turn_on() self.coordinator.data.on = True diff --git a/tests/components/aidot/test_light.py b/tests/components/aidot/test_light.py index 920343f8f2a9..ab34198d5501 100644 --- a/tests/components/aidot/test_light.py +++ b/tests/components/aidot/test_light.py @@ -1,11 +1,13 @@ """Test the aidot device.""" +from typing import Any from unittest.mock import AsyncMock, MagicMock, Mock from aidot.const import CONF_DEVICE_LIST from aidot.device_client import DeviceStatusData from aidot.exceptions import AidotAuthFailed from freezegun.api import FrozenDateTimeFactory +import pytest from syrupy.assertion import SnapshotAssertion from homeassistant.components.aidot.coordinator import UPDATE_DEVICE_LIST_INTERVAL @@ -136,6 +138,48 @@ async def test_turn_on_with_rgbw( mocked_device_client.async_set_rgbw.assert_called_once() +@pytest.mark.parametrize( + ("color_data", "applied_call", "ignored_call"), + [ + pytest.param( + {ATTR_RGBW_COLOR: (0, 0, 255, 0)}, + "async_set_rgbw", + "async_set_cct", + id="rgbw", + ), + pytest.param( + {ATTR_COLOR_TEMP_KELVIN: 3000}, + "async_set_cct", + "async_set_rgbw", + id="color_temp", + ), + ], +) +async def test_turn_on_with_brightness_and_color( + hass: HomeAssistant, + mock_config_entry: MockConfigEntry, + mocked_device_client: MagicMock, + color_data: dict[str, Any], + applied_call: str, + ignored_call: str, +) -> None: + """Test brightness and color are both applied when sent together.""" + await async_init_integration(hass, mock_config_entry) + + # Scenes send brightness and color in a single call. + await hass.services.async_call( + LIGHT_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: ENTITY_LIGHT, ATTR_BRIGHTNESS: 100, **color_data}, + blocking=True, + ) + + mocked_device_client.async_set_brightness.assert_called_once_with(100) + getattr(mocked_device_client, applied_call).assert_called_once() + getattr(mocked_device_client, ignored_call).assert_not_called() + mocked_device_client.async_turn_on.assert_not_called() + + async def test_light_unavailable( hass: HomeAssistant, mock_config_entry: MockConfigEntry,