Home Assistant Unofficial Reference 2024.12.1
scenes.py
Go to the documentation of this file.
1 """Web socket API for Insteon scenes."""
2 
3 from pyinsteon import devices
4 from pyinsteon.constants import ResponseStatus
5 from pyinsteon.managers.scene_manager import (
6  DeviceLinkSchema,
7  async_add_or_update_scene,
8  async_delete_scene,
9  async_get_scene,
10  async_get_scenes,
11 )
12 import voluptuous as vol
13 
14 from homeassistant.components import websocket_api
15 from homeassistant.core import HomeAssistant
16 
17 from ..const import ID, TYPE
18 
19 
20 def _scene_to_dict(scene):
21  """Return a dictionary mapping of a scene."""
22  device_dict = {}
23  for addr, links in scene["devices"].items():
24  str_addr = str(addr)
25  device_dict[str_addr] = []
26  for data in links:
27  device_dict[str_addr].append(
28  {
29  "data1": data.data1,
30  "data2": data.data2,
31  "data3": data.data3,
32  "has_controller": data.has_controller,
33  "has_responder": data.has_responder,
34  }
35  )
36  return {"name": scene["name"], "group": scene["group"], "devices": device_dict}
37 
38 
39 @websocket_api.websocket_command({vol.Required(TYPE): "insteon/scenes/get"})
40 @websocket_api.require_admin
41 @websocket_api.async_response
43  hass: HomeAssistant,
45  msg: dict,
46 ) -> None:
47  """Get all Insteon scenes."""
48  scenes = await async_get_scenes(work_dir=hass.config.config_dir)
49  scenes_dict = {
50  scene_num: _scene_to_dict(scene) for scene_num, scene in scenes.items()
51  }
52  connection.send_result(msg[ID], scenes_dict)
53 
54 
55 @websocket_api.websocket_command( {vol.Required(TYPE): "insteon/scene/get", vol.Required("scene_id"): int}
56 )
57 @websocket_api.require_admin
58 @websocket_api.async_response
59 async def websocket_get_scene(
60  hass: HomeAssistant,
62  msg: dict,
63 ) -> None:
64  """Get an Insteon scene."""
65  scene_id = msg["scene_id"]
66  scene = await async_get_scene(scene_num=scene_id, work_dir=hass.config.config_dir)
67  connection.send_result(msg[ID], _scene_to_dict(scene))
68 
69 
70 @websocket_api.websocket_command( { vol.Required(TYPE): "insteon/scene/save",
71  vol.Required("name"): str,
72  vol.Required("scene_id"): int,
73  vol.Required("links"): DeviceLinkSchema,
74  }
75 )
76 @websocket_api.require_admin
77 @websocket_api.async_response
78 async def websocket_save_scene(
79  hass: HomeAssistant,
81  msg: dict,
82 ) -> None:
83  """Save an Insteon scene."""
84  scene_id = msg["scene_id"]
85  name = msg["name"]
86  links = msg["links"]
87 
88  scene_id, result = await async_add_or_update_scene(
89  scene_num=scene_id, links=links, name=name, work_dir=hass.config.config_dir
90  )
91  await devices.async_save(workdir=hass.config.config_dir)
92  connection.send_result(
93  msg[ID], {"scene_id": scene_id, "result": result == ResponseStatus.SUCCESS}
94  )
95 
96 
97 @websocket_api.websocket_command( { vol.Required(TYPE): "insteon/scene/delete",
98  vol.Required("scene_id"): int,
99  }
100 )
101 @websocket_api.require_admin
102 @websocket_api.async_response
103 async def websocket_delete_scene(
104  hass: HomeAssistant,
106  msg: dict,
107 ) -> None:
108  """Delete an Insteon scene."""
109  scene_id = msg["scene_id"]
110 
111  result = await async_delete_scene(
112  scene_num=scene_id, work_dir=hass.config.config_dir
113  )
114  await devices.async_save(workdir=hass.config.config_dir)
115  connection.send_result(
116  msg[ID], {"scene_id": scene_id, "result": result == ResponseStatus.SUCCESS}
117  )
118 
None websocket_save_scene(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict msg)
Definition: scenes.py:85
None websocket_get_scenes(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict msg)
Definition: scenes.py:46
None websocket_delete_scene(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict msg)
Definition: scenes.py:112
None websocket_get_scene(HomeAssistant hass, websocket_api.connection.ActiveConnection connection, dict msg)
Definition: scenes.py:64