Broadlink Integration add support for LB1 (#50953)

Co-authored-by: Felipe Martins Diel <41558831+felipediel@users.noreply.github.com>
This commit is contained in:
L-I-Am 2021-10-27 04:20:11 +02:00 committed by GitHub
parent b57b2e0243
commit 3727fb5288
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 152 additions and 4 deletions

View file

@ -131,6 +131,7 @@ omit =
homeassistant/components/braviatv/remote.py
homeassistant/components/broadlink/__init__.py
homeassistant/components/broadlink/const.py
homeassistant/components/broadlink/light.py
homeassistant/components/broadlink/remote.py
homeassistant/components/broadlink/switch.py
homeassistant/components/broadlink/updater.py

View file

@ -78,7 +78,7 @@ homeassistant/components/bmw_connected_drive/* @gerard33 @rikroe
homeassistant/components/bond/* @bdraco @prystupa @joshs85
homeassistant/components/bosch_shc/* @tschamm
homeassistant/components/braviatv/* @bieniu @Drafteed
homeassistant/components/broadlink/* @danielhiversen @felipediel
homeassistant/components/broadlink/* @danielhiversen @felipediel @L-I-Am
homeassistant/components/brother/* @bieniu
homeassistant/components/brunt/* @eavanvalkenburg
homeassistant/components/bsblan/* @liudger

View file

@ -1,4 +1,5 @@
"""Constants for the Broadlink integration."""
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
from homeassistant.components.remote import DOMAIN as REMOTE_DOMAIN
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
@ -33,6 +34,7 @@ DOMAINS_AND_TYPES = {
"SP4",
"SP4B",
},
LIGHT_DOMAIN: {"LB1"},
}
DEFAULT_PORT = 80

View file

@ -0,0 +1,136 @@
"""Support for Broadlink lights."""
import logging
from broadlink.exceptions import BroadlinkException
from homeassistant.components.light import (
ATTR_BRIGHTNESS,
ATTR_COLOR_MODE,
ATTR_COLOR_TEMP,
ATTR_HS_COLOR,
COLOR_MODE_BRIGHTNESS,
COLOR_MODE_COLOR_TEMP,
COLOR_MODE_HS,
COLOR_MODE_UNKNOWN,
LightEntity,
)
from .const import DOMAIN
from .entity import BroadlinkEntity
_LOGGER = logging.getLogger(__name__)
BROADLINK_COLOR_MODE_RGB = 0
BROADLINK_COLOR_MODE_WHITE = 1
BROADLINK_COLOR_MODE_SCENES = 2
async def async_setup_entry(hass, config_entry, async_add_entities):
"""Set up the Broadlink light."""
device = hass.data[DOMAIN].devices[config_entry.entry_id]
if device.api.type == "LB1":
lights = [BroadlinkLight(device)]
async_add_entities(lights)
class BroadlinkLight(BroadlinkEntity, LightEntity):
"""Representation of a Broadlink light."""
def __init__(self, device):
"""Initialize the light."""
super().__init__(device)
self._attr_name = f"{device.name} Light"
self._attr_unique_id = device.unique_id
self._attr_supported_color_modes = set()
data = self._coordinator.data
if {"hue", "saturation"}.issubset(data):
self._attr_supported_color_modes.add(COLOR_MODE_HS)
if "colortemp" in data:
self._attr_supported_color_modes.add(COLOR_MODE_COLOR_TEMP)
if not self.supported_color_modes:
self._attr_supported_color_modes = {COLOR_MODE_BRIGHTNESS}
self._update_state(data)
def _update_state(self, data):
"""Update the state of the entity."""
if "pwr" in data:
self._attr_is_on = bool(data["pwr"])
if "brightness" in data:
self._attr_brightness = round(data["brightness"] * 2.55)
if self.supported_color_modes == {COLOR_MODE_BRIGHTNESS}:
self._attr_color_mode = COLOR_MODE_BRIGHTNESS
return
if {"hue", "saturation"}.issubset(data):
self._attr_hs_color = [data["hue"], data["saturation"]]
if "colortemp" in data:
self._attr_color_temp = round((data["colortemp"] - 2700) / 100 + 153)
if "bulb_colormode" in data:
if data["bulb_colormode"] == BROADLINK_COLOR_MODE_RGB:
self._attr_color_mode = COLOR_MODE_HS
elif data["bulb_colormode"] == BROADLINK_COLOR_MODE_WHITE:
self._attr_color_mode = COLOR_MODE_COLOR_TEMP
else:
# Scenes are not yet supported.
self._attr_color_mode = COLOR_MODE_UNKNOWN
async def async_turn_on(self, **kwargs):
"""Turn on the light."""
state = {"pwr": 1}
if ATTR_BRIGHTNESS in kwargs:
brightness = kwargs[ATTR_BRIGHTNESS]
state["brightness"] = round(brightness / 2.55)
if self.supported_color_modes == {COLOR_MODE_BRIGHTNESS}:
state["bulb_colormode"] = BROADLINK_COLOR_MODE_WHITE
elif ATTR_HS_COLOR in kwargs:
hs_color = kwargs[ATTR_HS_COLOR]
state["hue"] = int(hs_color[0])
state["saturation"] = int(hs_color[1])
state["bulb_colormode"] = BROADLINK_COLOR_MODE_RGB
elif ATTR_COLOR_TEMP in kwargs:
color_temp = kwargs[ATTR_COLOR_TEMP]
state["colortemp"] = (color_temp - 153) * 100 + 2700
state["bulb_colormode"] = BROADLINK_COLOR_MODE_WHITE
elif ATTR_COLOR_MODE in kwargs:
color_mode = kwargs[ATTR_COLOR_MODE]
if color_mode == COLOR_MODE_HS:
state["bulb_colormode"] = BROADLINK_COLOR_MODE_RGB
elif color_mode == COLOR_MODE_COLOR_TEMP:
state["bulb_colormode"] = BROADLINK_COLOR_MODE_WHITE
else:
# Scenes are not yet supported.
state["bulb_colormode"] = BROADLINK_COLOR_MODE_SCENES
await self._async_set_state(state)
async def async_turn_off(self, **kwargs):
"""Turn off the light."""
await self._async_set_state({"pwr": 0})
async def _async_set_state(self, state):
"""Set the state of the light."""
try:
state = await self._device.async_request(
self._device.api.set_state, **state
)
except (BroadlinkException, OSError) as err:
_LOGGER.error("Failed to set state: %s", err)
return False
self._update_state(state)
self.async_write_ha_state()
return True

View file

@ -3,7 +3,7 @@
"name": "Broadlink",
"documentation": "https://www.home-assistant.io/integrations/broadlink",
"requirements": ["broadlink==0.18.0"],
"codeowners": ["@danielhiversen", "@felipediel"],
"codeowners": ["@danielhiversen", "@felipediel", "@L-I-Am"],
"config_flow": true,
"dhcp": [
{

View file

@ -16,6 +16,7 @@ def get_update_manager(device):
update_managers = {
"A1": BroadlinkA1UpdateManager,
"BG1": BroadlinkBG1UpdateManager,
"LB1": BroadlinkLB1UpdateManager,
"MP1": BroadlinkMP1UpdateManager,
"RM4MINI": BroadlinkRMUpdateManager,
"RM4PRO": BroadlinkRMUpdateManager,
@ -175,3 +176,11 @@ class BroadlinkSP4UpdateManager(BroadlinkUpdateManager):
async def async_fetch_data(self):
"""Fetch data from the device."""
return await self.device.async_request(self.device.api.get_state)
class BroadlinkLB1UpdateManager(BroadlinkUpdateManager):
"""Manages updates for Broadlink LB1 devices."""
async def async_fetch_data(self):
"""Fetch data from the device."""
return await self.device.async_request(self.device.api.get_state)

View file

@ -71,9 +71,9 @@ BROADLINK_DEVICES = {
"Kitchen": ( # Not supported.
"192.168.0.64",
"34ea34b61d2c",
"LB1",
"SB800TD",
"Broadlink",
"LB1",
"SB800TD",
0x504E,
57,
5,