Mark type "On/Off Switch" as a deCONZ switch entity (#70598)

Convert entity types of light platform to switch platform
This commit is contained in:
Robert Svensson 2022-04-25 08:25:38 +02:00 committed by GitHub
parent 9f11063724
commit 8eae572c93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 1 deletions

View File

@ -1,6 +1,8 @@
"""Constants for the deCONZ component.""" """Constants for the deCONZ component."""
import logging import logging
from pydeconz.models import ResourceType
from homeassistant.const import Platform from homeassistant.const import Platform
LOGGER = logging.getLogger(__package__) LOGGER = logging.getLogger(__package__)
@ -45,7 +47,12 @@ ATTR_ON = "on"
ATTR_VALVE = "valve" ATTR_VALVE = "valve"
# Switches # Switches
POWER_PLUGS = ["On/Off light", "On/Off plug-in unit", "Smart plug"] POWER_PLUGS = [
ResourceType.ON_OFF_LIGHT.value,
ResourceType.ON_OFF_OUTPUT.value,
ResourceType.ON_OFF_PLUGIN_UNIT.value,
ResourceType.SMART_PLUG.value,
]
CONF_ANGLE = "angle" CONF_ANGLE = "angle"
CONF_GESTURE = "gesture" CONF_GESTURE = "gesture"

View File

@ -4,6 +4,7 @@ from __future__ import annotations
from typing import Any, Generic, TypedDict, TypeVar from typing import Any, Generic, TypedDict, TypeVar
from pydeconz.interfaces.lights import LightResources from pydeconz.interfaces.lights import LightResources
from pydeconz.models import ResourceType
from pydeconz.models.group import Group from pydeconz.models.group import Group
from pydeconz.models.light import ( from pydeconz.models.light import (
ALERT_LONG, ALERT_LONG,
@ -31,6 +32,7 @@ from homeassistant.components.light import (
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import DeviceInfo from homeassistant.helpers.entity import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
@ -70,6 +72,17 @@ async def async_setup_entry(
gateway = get_gateway_from_config_entry(hass, config_entry) gateway = get_gateway_from_config_entry(hass, config_entry)
gateway.entities[DOMAIN] = set() gateway.entities[DOMAIN] = set()
entity_registry = er.async_get(hass)
# On/Off Output should be switch not light 2022.5
for light in gateway.api.lights.lights.values():
if light.type == ResourceType.ON_OFF_OUTPUT.value and (
entity_id := entity_registry.async_get_entity_id(
DOMAIN, DECONZ_DOMAIN, light.unique_id
)
):
entity_registry.async_remove(entity_id)
@callback @callback
def async_add_light(lights: list[LightResources] | None = None) -> None: def async_add_light(lights: list[LightResources] | None = None) -> None:
"""Add light from deCONZ.""" """Add light from deCONZ."""

View File

@ -2,12 +2,15 @@
from unittest.mock import patch from unittest.mock import patch
from homeassistant.components.deconz.const import DOMAIN as DECONZ_DOMAIN
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
from homeassistant.components.switch import ( from homeassistant.components.switch import (
DOMAIN as SWITCH_DOMAIN, DOMAIN as SWITCH_DOMAIN,
SERVICE_TURN_OFF, SERVICE_TURN_OFF,
SERVICE_TURN_ON, SERVICE_TURN_ON,
) )
from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, STATE_UNAVAILABLE from homeassistant.const import ATTR_ENTITY_ID, STATE_OFF, STATE_ON, STATE_UNAVAILABLE
from homeassistant.helpers import entity_registry as er
from .test_gateway import ( from .test_gateway import (
DECONZ_WEB_REQUEST, DECONZ_WEB_REQUEST,
@ -107,3 +110,32 @@ async def test_power_plugs(hass, aioclient_mock, mock_deconz_websocket):
await hass.config_entries.async_remove(config_entry.entry_id) await hass.config_entries.async_remove(config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
assert len(hass.states.async_all()) == 0 assert len(hass.states.async_all()) == 0
async def test_remove_legacy_on_off_output_as_light(hass, aioclient_mock):
"""Test that switch platform cleans up legacy light entities."""
unique_id = "00:00:00:00:00:00:00:00-00"
registry = er.async_get(hass)
switch_light_entity = registry.async_get_or_create(
LIGHT_DOMAIN, DECONZ_DOMAIN, unique_id
)
assert switch_light_entity
data = {
"lights": {
"1": {
"name": "On Off output device",
"type": "On/Off output",
"state": {"on": True, "reachable": True},
"uniqueid": unique_id,
},
}
}
with patch.dict(DECONZ_WEB_REQUEST, data):
await setup_deconz_integration(hass, aioclient_mock)
assert not registry.async_get("light.on_off_output_device")
assert registry.async_get("switch.on_off_output_device")
assert len(hass.states.async_all()) == 1