Update flux_led to use async_set_brightness in the lib (#60315)

This commit is contained in:
J. Nick Koston 2021-11-25 05:41:32 -06:00 committed by GitHub
parent a78f0eae39
commit 213be1f15e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 38 additions and 78 deletions

View File

@ -11,7 +11,6 @@ from flux_led.utils import (
rgbcw_brightness,
rgbcw_to_rgbwc,
rgbw_brightness,
rgbww_brightness,
)
import voluptuous as vol
@ -24,12 +23,7 @@ from homeassistant.components.light import (
ATTR_RGBW_COLOR,
ATTR_RGBWW_COLOR,
ATTR_WHITE,
COLOR_MODE_BRIGHTNESS,
COLOR_MODE_COLOR_TEMP,
COLOR_MODE_RGB,
COLOR_MODE_RGBW,
COLOR_MODE_RGBWW,
COLOR_MODE_WHITE,
PLATFORM_SCHEMA,
SUPPORT_EFFECT,
SUPPORT_TRANSITION,
@ -51,8 +45,6 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.color import (
color_hs_to_RGB,
color_RGB_to_hs,
color_temperature_kelvin_to_mired,
color_temperature_mired_to_kelvin,
)
@ -79,7 +71,7 @@ from .const import (
TRANSITION_STROBE,
)
from .entity import FluxOnOffEntity
from .util import _flux_color_mode_to_hass, _hass_color_modes
from .util import _effect_brightness, _flux_color_mode_to_hass, _hass_color_modes
_LOGGER = logging.getLogger(__name__)
@ -262,10 +254,7 @@ class FluxLight(FluxOnOffEntity, CoordinatorEntity, LightEntity):
@property
def rgb_color(self) -> tuple[int, int, int]:
"""Return the rgb color value."""
# Note that we call color_RGB_to_hs and not color_RGB_to_hsv
# to get the unscaled value since this is what the frontend wants
# https://github.com/home-assistant/frontend/blob/e797c017614797bb11671496d6bd65863de22063/src/dialogs/more-info/controls/more-info-light.ts#L263
rgb: tuple[int, int, int] = color_hs_to_RGB(*color_RGB_to_hs(*self._device.rgb))
rgb: tuple[int, int, int] = self._device.rgb_unscaled
return rgb
@property
@ -280,12 +269,6 @@ class FluxLight(FluxOnOffEntity, CoordinatorEntity, LightEntity):
rgbcw: tuple[int, int, int, int, int] = self._device.rgbcw
return rgbcw
@property
def rgbwc_color(self) -> tuple[int, int, int, int, int]:
"""Return the rgbwc color value."""
rgbwc: tuple[int, int, int, int, int] = self._device.rgbww
return rgbwc
@property
def color_mode(self) -> str:
"""Return the color mode of the light."""
@ -311,7 +294,7 @@ class FluxLight(FluxOnOffEntity, CoordinatorEntity, LightEntity):
if MODE_ATTRS.intersection(kwargs):
await self._async_set_mode(**kwargs)
return
await self._async_adjust_brightness(self._async_brightness(**kwargs))
await self._device.async_set_brightness(self._async_brightness(**kwargs))
async def _async_set_effect(self, effect: str, brightness: int) -> None:
"""Set an effect."""
@ -324,9 +307,10 @@ class FluxLight(FluxOnOffEntity, CoordinatorEntity, LightEntity):
self._custom_effect_transition,
)
return
effect_brightness = round(brightness / 255 * 100)
await self._device.async_set_effect(
effect, self._device.speed or DEFAULT_EFFECT_SPEED, effect_brightness
effect,
self._device.speed or DEFAULT_EFFECT_SPEED,
_effect_brightness(brightness),
)
@callback
@ -385,35 +369,6 @@ class FluxLight(FluxOnOffEntity, CoordinatorEntity, LightEntity):
await self._device.async_set_levels(w=white)
return
async def _async_adjust_brightness(self, brightness: int) -> None:
"""Adjust brightness."""
# Handle brightness adjustment in effect mode
if effect := self.effect:
await self._async_set_effect(effect, brightness)
return
if self.color_mode == COLOR_MODE_COLOR_TEMP:
await self._device.async_set_white_temp(self._device.color_temp, brightness)
return
# Handle brightness adjustment in RGB Color Mode
if self.color_mode == COLOR_MODE_RGB:
await self._device.async_set_levels(*self.rgb_color, brightness=brightness)
return
# Handle brightness adjustment in RGBW Color Mode
if self.color_mode == COLOR_MODE_RGBW:
await self._device.async_set_levels(
*rgbw_brightness(self.rgbw_color, brightness)
)
return
# Handle brightness adjustment in RGBWW Color Mode
if self.color_mode == COLOR_MODE_RGBWW:
rgbwc = self.rgbwc_color
await self._device.async_set_levels(*rgbww_brightness(rgbwc, brightness))
return
# Handle Brightness Only Color Mode
if self.color_mode in {COLOR_MODE_WHITE, COLOR_MODE_BRIGHTNESS}:
await self._device.async_set_levels(w=brightness)
return
async def async_set_custom_effect(
self, colors: list[tuple[int, int, int]], speed_pct: int, transition: str
) -> None:

View File

@ -3,7 +3,7 @@
"name": "Flux LED/MagicHome",
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/flux_led",
"requirements": ["flux_led==0.24.34"],
"requirements": ["flux_led==0.24.35"],
"quality_scale": "platinum",
"codeowners": ["@icemanch"],
"iot_class": "local_push",

View File

@ -15,7 +15,7 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import FluxLedUpdateCoordinator
from .const import DOMAIN, EFFECT_SPEED_SUPPORT_MODES
from .entity import FluxEntity
from .util import _hass_color_modes
from .util import _effect_brightness, _hass_color_modes
async def async_setup_entry(
@ -68,7 +68,6 @@ class FluxNumber(FluxEntity, CoordinatorEntity, NumberEntity):
async def async_set_value(self, value: float) -> None:
"""Set the flux speed value."""
current_effect = self._device.effect
current_brightness = self._device.brightness
new_speed = int(value)
if not current_effect:
raise HomeAssistantError(
@ -76,8 +75,7 @@ class FluxNumber(FluxEntity, CoordinatorEntity, NumberEntity):
)
if self._device.original_addressable and not self._device.is_on:
raise HomeAssistantError("Speed can only be adjusted when the light is on")
effect_brightness = round(current_brightness / 255 * 100)
await self._device.async_set_effect(
current_effect, new_speed, effect_brightness
current_effect, new_speed, _effect_brightness(self._device.brightness)
)
await self.coordinator.async_request_refresh()

View File

@ -25,3 +25,8 @@ def _flux_color_mode_to_hass(flux_color_mode: str, flux_color_modes: set[str]) -
return COLOR_MODE_WHITE
return COLOR_MODE_BRIGHTNESS
return FLUX_COLOR_MODE_TO_HASS.get(flux_color_mode, COLOR_MODE_ONOFF)
def _effect_brightness(brightness: int) -> int:
"""Convert hass brightness to effect brightness."""
return round(brightness / 255 * 100)

View File

@ -658,7 +658,7 @@ fjaraskupan==1.0.2
flipr-api==1.4.1
# homeassistant.components.flux_led
flux_led==0.24.34
flux_led==0.24.35
# homeassistant.components.homekit
fnvhash==0.1.0

View File

@ -399,7 +399,7 @@ fjaraskupan==1.0.2
flipr-api==1.4.1
# homeassistant.components.flux_led
flux_led==0.24.34
flux_led==0.24.35
# homeassistant.components.homekit
fnvhash==0.1.0

View File

@ -64,6 +64,7 @@ def _mocked_bulb() -> AIOWifiLedBulb:
bulb.async_set_preset_pattern = AsyncMock()
bulb.async_set_effect = AsyncMock()
bulb.async_set_white_temp = AsyncMock()
bulb.async_set_brightness = AsyncMock()
bulb.async_stop = AsyncMock()
bulb.async_update = AsyncMock()
bulb.async_turn_off = AsyncMock()
@ -76,6 +77,7 @@ def _mocked_bulb() -> AIOWifiLedBulb:
bulb.getRgbww = MagicMock(return_value=[255, 0, 0, 50, 0])
bulb.getRgbcw = MagicMock(return_value=[255, 0, 0, 0, 50])
bulb.rgb = (255, 0, 0)
bulb.rgb_unscaled = (255, 0, 0)
bulb.rgbw = (255, 0, 0, 50)
bulb.rgbww = (255, 0, 0, 50, 0)
bulb.rgbcw = (255, 0, 0, 0, 50)

View File

@ -240,8 +240,8 @@ async def test_rgb_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(255, 0, 0, brightness=100)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
await hass.services.async_call(
LIGHT_DOMAIN,
@ -331,8 +331,8 @@ async def test_rgb_cct_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(255, 0, 0, brightness=100)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
await hass.services.async_call(
LIGHT_DOMAIN,
@ -391,8 +391,8 @@ async def test_rgb_cct_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 255},
blocking=True,
)
bulb.async_set_white_temp.assert_called_with(5000, 255)
bulb.async_set_white_temp.reset_mock()
bulb.async_set_brightness.assert_called_with(255)
bulb.async_set_brightness.reset_mock()
await hass.services.async_call(
LIGHT_DOMAIN,
@ -400,8 +400,8 @@ async def test_rgb_cct_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 128},
blocking=True,
)
bulb.async_set_white_temp.assert_called_with(5000, 128)
bulb.async_set_white_temp.reset_mock()
bulb.async_set_brightness.assert_called_with(128)
bulb.async_set_brightness.reset_mock()
async def test_rgbw_light(hass: HomeAssistant) -> None:
@ -451,8 +451,8 @@ async def test_rgbw_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(168, 0, 0, 33)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
state = hass.states.get(entity_id)
assert state.state == STATE_ON
@ -553,8 +553,8 @@ async def test_rgb_or_w_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(255, 0, 0, brightness=100)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
state = hass.states.get(entity_id)
assert state.state == STATE_ON
@ -612,8 +612,8 @@ async def test_rgb_or_w_light(hass: HomeAssistant) -> None:
},
blocking=True,
)
bulb.async_set_levels.assert_called_with(w=100)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
async def test_rgbcw_light(hass: HomeAssistant) -> None:
@ -663,8 +663,8 @@ async def test_rgbcw_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(250, 0, 0, 49, 0)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
bulb.is_on = True
await hass.services.async_call(
@ -751,8 +751,8 @@ async def test_rgbcw_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 255},
blocking=True,
)
bulb.async_set_effect.assert_called_with("purple_fade", 50, 100)
bulb.async_set_effect.reset_mock()
bulb.async_set_brightness.assert_called_with(255)
bulb.async_set_brightness.reset_mock()
async def test_white_light(hass: HomeAssistant) -> None:
@ -802,8 +802,8 @@ async def test_white_light(hass: HomeAssistant) -> None:
{ATTR_ENTITY_ID: entity_id, ATTR_BRIGHTNESS: 100},
blocking=True,
)
bulb.async_set_levels.assert_called_with(w=100)
bulb.async_set_levels.reset_mock()
bulb.async_set_brightness.assert_called_with(100)
bulb.async_set_brightness.reset_mock()
async def test_rgb_light_custom_effects(hass: HomeAssistant) -> None: