235 lines
7.4 KiB
Python
235 lines
7.4 KiB
Python
"""deCONZ light platform tests."""
|
|
from copy import deepcopy
|
|
|
|
from asynctest import patch
|
|
|
|
from homeassistant.components import deconz
|
|
import homeassistant.components.light as light
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from .test_gateway import DECONZ_WEB_REQUEST, setup_deconz_integration
|
|
|
|
GROUPS = {
|
|
"1": {
|
|
"id": "Light group id",
|
|
"name": "Light group",
|
|
"type": "LightGroup",
|
|
"state": {"all_on": False, "any_on": True},
|
|
"action": {},
|
|
"scenes": [],
|
|
"lights": ["1", "2"],
|
|
},
|
|
"2": {
|
|
"id": "Empty group id",
|
|
"name": "Empty group",
|
|
"type": "LightGroup",
|
|
"state": {},
|
|
"action": {},
|
|
"scenes": [],
|
|
"lights": [],
|
|
},
|
|
}
|
|
|
|
LIGHTS = {
|
|
"1": {
|
|
"id": "RGB light id",
|
|
"name": "RGB light",
|
|
"state": {
|
|
"on": True,
|
|
"bri": 255,
|
|
"colormode": "xy",
|
|
"effect": "colorloop",
|
|
"xy": (500, 500),
|
|
"reachable": True,
|
|
},
|
|
"type": "Extended color light",
|
|
"uniqueid": "00:00:00:00:00:00:00:00-00",
|
|
},
|
|
"2": {
|
|
"id": "Tunable white light id",
|
|
"name": "Tunable white light",
|
|
"state": {"on": True, "colormode": "ct", "ct": 2500, "reachable": True},
|
|
"type": "Tunable white light",
|
|
"uniqueid": "00:00:00:00:00:00:00:01-00",
|
|
},
|
|
"3": {
|
|
"id": "On off switch id",
|
|
"name": "On off switch",
|
|
"type": "On/Off plug-in unit",
|
|
"state": {"reachable": True},
|
|
"uniqueid": "00:00:00:00:00:00:00:02-00",
|
|
},
|
|
}
|
|
|
|
|
|
async def test_platform_manually_configured(hass):
|
|
"""Test that we do not discover anything or try to set up a gateway."""
|
|
assert (
|
|
await async_setup_component(
|
|
hass, light.DOMAIN, {"light": {"platform": deconz.DOMAIN}}
|
|
)
|
|
is True
|
|
)
|
|
assert deconz.DOMAIN not in hass.data
|
|
|
|
|
|
async def test_no_lights_or_groups(hass):
|
|
"""Test that no lights or groups entities are created."""
|
|
gateway = await setup_deconz_integration(hass)
|
|
assert len(gateway.deconz_ids) == 0
|
|
assert len(hass.states.async_all()) == 0
|
|
|
|
|
|
async def test_lights_and_groups(hass):
|
|
"""Test that lights or groups entities are created."""
|
|
data = deepcopy(DECONZ_WEB_REQUEST)
|
|
data["groups"] = deepcopy(GROUPS)
|
|
data["lights"] = deepcopy(LIGHTS)
|
|
gateway = await setup_deconz_integration(hass, get_state_response=data)
|
|
assert "light.rgb_light" in gateway.deconz_ids
|
|
assert "light.tunable_white_light" in gateway.deconz_ids
|
|
assert "light.light_group" in gateway.deconz_ids
|
|
assert "light.empty_group" not in gateway.deconz_ids
|
|
assert "light.on_off_switch" not in gateway.deconz_ids
|
|
# 4 entities + 2 groups (one for switches and one for lights)
|
|
assert len(hass.states.async_all()) == 6
|
|
|
|
rgb_light = hass.states.get("light.rgb_light")
|
|
assert rgb_light.state == "on"
|
|
assert rgb_light.attributes["brightness"] == 255
|
|
assert rgb_light.attributes["hs_color"] == (224.235, 100.0)
|
|
assert rgb_light.attributes["is_deconz_group"] is False
|
|
|
|
tunable_white_light = hass.states.get("light.tunable_white_light")
|
|
assert tunable_white_light.state == "on"
|
|
assert tunable_white_light.attributes["color_temp"] == 2500
|
|
|
|
light_group = hass.states.get("light.light_group")
|
|
assert light_group.state == "on"
|
|
assert light_group.attributes["all_on"] is False
|
|
|
|
empty_group = hass.states.get("light.empty_group")
|
|
assert empty_group is None
|
|
|
|
state_changed_event = {
|
|
"t": "event",
|
|
"e": "changed",
|
|
"r": "lights",
|
|
"id": "1",
|
|
"state": {"on": False},
|
|
}
|
|
gateway.api.async_event_handler(state_changed_event)
|
|
await hass.async_block_till_done()
|
|
|
|
rgb_light = hass.states.get("light.rgb_light")
|
|
assert rgb_light.state == "off"
|
|
|
|
rgb_light_device = gateway.api.lights["1"]
|
|
|
|
with patch.object(rgb_light_device, "_request", return_value=True) as set_callback:
|
|
await hass.services.async_call(
|
|
light.DOMAIN,
|
|
light.SERVICE_TURN_ON,
|
|
{
|
|
"entity_id": "light.rgb_light",
|
|
"color_temp": 2500,
|
|
"brightness": 200,
|
|
"transition": 5,
|
|
"flash": "short",
|
|
"effect": "colorloop",
|
|
},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
set_callback.assert_called_with(
|
|
"put",
|
|
"/lights/1/state",
|
|
json={
|
|
"ct": 2500,
|
|
"bri": 200,
|
|
"transitiontime": 50,
|
|
"alert": "select",
|
|
"effect": "colorloop",
|
|
},
|
|
)
|
|
|
|
with patch.object(rgb_light_device, "_request", return_value=True) as set_callback:
|
|
await hass.services.async_call(
|
|
light.DOMAIN,
|
|
light.SERVICE_TURN_ON,
|
|
{
|
|
"entity_id": "light.rgb_light",
|
|
"hs_color": (20, 30),
|
|
"flash": "long",
|
|
"effect": "None",
|
|
},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
set_callback.assert_called_with(
|
|
"put",
|
|
"/lights/1/state",
|
|
json={"xy": (0.411, 0.351), "alert": "lselect", "effect": "none"},
|
|
)
|
|
|
|
with patch.object(rgb_light_device, "_request", return_value=True) as set_callback:
|
|
await hass.services.async_call(
|
|
light.DOMAIN,
|
|
light.SERVICE_TURN_OFF,
|
|
{"entity_id": "light.rgb_light", "transition": 5, "flash": "short"},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
set_callback.assert_called_with(
|
|
"put",
|
|
"/lights/1/state",
|
|
json={"bri": 0, "transitiontime": 50, "alert": "select"},
|
|
)
|
|
|
|
with patch.object(rgb_light_device, "_request", return_value=True) as set_callback:
|
|
await hass.services.async_call(
|
|
light.DOMAIN,
|
|
light.SERVICE_TURN_OFF,
|
|
{"entity_id": "light.rgb_light", "flash": "long"},
|
|
blocking=True,
|
|
)
|
|
await hass.async_block_till_done()
|
|
set_callback.assert_called_with(
|
|
"put", "/lights/1/state", json={"alert": "lselect"}
|
|
)
|
|
|
|
await gateway.async_reset()
|
|
|
|
assert len(hass.states.async_all()) == 2
|
|
|
|
|
|
async def test_disable_light_groups(hass):
|
|
"""Test successful creation of sensor entities."""
|
|
data = deepcopy(DECONZ_WEB_REQUEST)
|
|
data["groups"] = deepcopy(GROUPS)
|
|
data["lights"] = deepcopy(LIGHTS)
|
|
gateway = await setup_deconz_integration(
|
|
hass,
|
|
options={deconz.gateway.CONF_ALLOW_DECONZ_GROUPS: False},
|
|
get_state_response=data,
|
|
)
|
|
assert "light.rgb_light" in gateway.deconz_ids
|
|
assert "light.tunable_white_light" in gateway.deconz_ids
|
|
assert "light.light_group" not in gateway.deconz_ids
|
|
assert "light.empty_group" not in gateway.deconz_ids
|
|
assert "light.on_off_switch" not in gateway.deconz_ids
|
|
# 4 entities + 2 groups (one for switches and one for lights)
|
|
assert len(hass.states.async_all()) == 5
|
|
|
|
rgb_light = hass.states.get("light.rgb_light")
|
|
assert rgb_light is not None
|
|
|
|
tunable_white_light = hass.states.get("light.tunable_white_light")
|
|
assert tunable_white_light is not None
|
|
|
|
light_group = hass.states.get("light.light_group")
|
|
assert light_group is None
|
|
|
|
empty_group = hass.states.get("light.empty_group")
|
|
assert empty_group is None
|