Add scene.create service (#28300)

* Initial commit

* Fix scene.create
pull/28455/head
Santobert 2019-11-01 23:53:42 +01:00 committed by Paulus Schoutsen
parent c0e1b97119
commit 6655b7db2c
3 changed files with 74 additions and 0 deletions

View File

@ -54,6 +54,8 @@ def _convert_states(states):
return result
CONF_SCENE_ID = "scene_id"
STATES_SCHEMA = vol.All(dict, _convert_states)
PLATFORM_SCHEMA = vol.Schema(
@ -72,7 +74,12 @@ PLATFORM_SCHEMA = vol.Schema(
extra=vol.ALLOW_EXTRA,
)
CREATE_SCENE_SCHEMA = vol.Schema(
{vol.Required(CONF_SCENE_ID): cv.slug, vol.Required(CONF_ENTITIES): STATES_SCHEMA}
)
SERVICE_APPLY = "apply"
SERVICE_CREATE = "create"
SCENECONFIG = namedtuple("SceneConfig", [CONF_NAME, STATES])
_LOGGER = logging.getLogger(__name__)
@ -129,6 +136,20 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info=
vol.Schema({vol.Required(CONF_ENTITIES): STATES_SCHEMA}),
)
async def create_service(call):
"""Create a scene."""
scene_config = SCENECONFIG(call.data[CONF_SCENE_ID], call.data[CONF_ENTITIES])
entity_id = f"{SCENE_DOMAIN}.{scene_config.name}"
if hass.states.get(entity_id) is not None:
_LOGGER.warning("The scene %s already exists", entity_id)
return
async_add_entities([HomeAssistantScene(hass, scene_config)])
hass.services.async_register(
SCENE_DOMAIN, SERVICE_CREATE, create_service, CREATE_SCENE_SCHEMA
)
def _process_scenes_config(hass, async_add_entities, config):
"""Process multiple scenes and add them."""

View File

@ -20,3 +20,17 @@ apply:
light.ceiling:
state: "on"
brightness: 80
create:
description: Creates a new scene.
fields:
scene_id:
description: The entity_id of the new scene.
example: all_lights
entities:
description: The entities to control with the scene.
example:
light.tv_back_light: "on"
light.ceiling:
state: "on"
brightness: 200

View File

@ -51,3 +51,42 @@ async def test_apply_service(hass):
state = hass.states.get("light.bed_light")
assert state.state == "on"
assert state.attributes["brightness"] == 50
async def test_create_service(hass, caplog):
"""Test the create service."""
assert await async_setup_component(hass, "scene", {})
assert hass.states.get("scene.hallo") is None
assert await hass.services.async_call(
"scene",
"create",
{
"scene_id": "hallo",
"entities": {"light.bed_light": {"state": "on", "brightness": 50}},
},
blocking=True,
)
await hass.async_block_till_done()
scene = hass.states.get("scene.hallo")
assert scene is not None
assert scene.domain == "scene"
assert scene.name == "hallo"
assert scene.state == "scening"
assert scene.attributes.get("entity_id") == ["light.bed_light"]
assert await hass.services.async_call(
"scene",
"create",
{
"scene_id": "hallo",
"entities": {"light.bed_light": {"state": "on", "brightness": 50}},
},
blocking=True,
)
await hass.async_block_till_done()
assert "The scene scene.hallo already exists" in caplog.text
assert hass.states.get("scene.hallo") is not None
assert hass.states.get("scene.hallo_2") is None