Home Assistant Unofficial Reference 2024.12.1
floor_registry.py
Go to the documentation of this file.
1 """Websocket API to interact with the floor registry."""
2 
3 from typing import Any
4 
5 import voluptuous as vol
6 
7 from homeassistant.components import websocket_api
8 from homeassistant.components.websocket_api import ActiveConnection
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers import floor_registry as fr
11 from homeassistant.helpers.floor_registry import FloorEntry
12 
13 
14 @callback
15 def async_setup(hass: HomeAssistant) -> bool:
16  """Register the floor registry WS commands."""
17  websocket_api.async_register_command(hass, websocket_list_floors)
18  websocket_api.async_register_command(hass, websocket_create_floor)
19  websocket_api.async_register_command(hass, websocket_delete_floor)
20  websocket_api.async_register_command(hass, websocket_update_floor)
21  return True
22 
23 
24 @websocket_api.websocket_command( { vol.Required("type"): "config/floor_registry/list",
25  }
26 )
27 @callback
29  hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
30 ) -> None:
31  """Handle list floors command."""
32  registry = fr.async_get(hass)
33  connection.send_result(
34  msg["id"],
35  [_entry_dict(entry) for entry in registry.async_list_floors()],
36  )
37 
38 
39 @websocket_api.websocket_command( { vol.Required("type"): "config/floor_registry/create",
40  vol.Required("name"): str,
41  vol.Optional("aliases"): list,
42  vol.Optional("icon"): vol.Any(str, None),
43  vol.Optional("level"): vol.Any(int, None),
44  }
45 )
46 @websocket_api.require_admin
47 @callback
49  hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
50 ) -> None:
51  """Create floor command."""
52  registry = fr.async_get(hass)
53 
54  data = dict(msg)
55  data.pop("type")
56  data.pop("id")
57 
58  if "aliases" in data:
59  # Convert aliases to a set
60  data["aliases"] = set(data["aliases"])
61 
62  try:
63  entry = registry.async_create(**data)
64  except ValueError as err:
65  connection.send_error(msg["id"], "invalid_info", str(err))
66  else:
67  connection.send_result(msg["id"], _entry_dict(entry))
68 
69 
70 @websocket_api.websocket_command( { vol.Required("type"): "config/floor_registry/delete",
71  vol.Required("floor_id"): str,
72  }
73 )
74 @websocket_api.require_admin
75 @callback
77  hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
78 ) -> None:
79  """Delete floor command."""
80  registry = fr.async_get(hass)
81 
82  try:
83  registry.async_delete(msg["floor_id"])
84  except KeyError:
85  connection.send_error(msg["id"], "invalid_info", "Floor ID doesn't exist")
86  else:
87  connection.send_result(msg["id"])
88 
89 
90 @websocket_api.websocket_command( { vol.Required("type"): "config/floor_registry/update",
91  vol.Required("floor_id"): str,
92  vol.Optional("aliases"): list,
93  vol.Optional("icon"): vol.Any(str, None),
94  vol.Optional("level"): vol.Any(int, None),
95  vol.Optional("name"): str,
96  }
97 )
98 @websocket_api.require_admin
99 @callback
101  hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
102 ) -> None:
103  """Handle update floor websocket command."""
104  registry = fr.async_get(hass)
105 
106  data = dict(msg)
107  data.pop("type")
108  data.pop("id")
109 
110  if "aliases" in data:
111  # Convert aliases to a set
112  data["aliases"] = set(data["aliases"])
113 
114  try:
115  entry = registry.async_update(**data)
116  except ValueError as err:
117  connection.send_error(msg["id"], "invalid_info", str(err))
118  else:
119  connection.send_result(msg["id"], _entry_dict(entry))
120 
121 
122 @callback
123 def _entry_dict(entry: FloorEntry) -> dict[str, Any]:
124  """Convert entry to API format."""
125  return {
126  "aliases": list(entry.aliases),
127  "created_at": entry.created_at.timestamp(),
128  "floor_id": entry.floor_id,
129  "icon": entry.icon,
130  "level": entry.level,
131  "name": entry.name,
132  "modified_at": entry.modified_at.timestamp(),
133  }
134 
None websocket_create_floor(HomeAssistant hass, ActiveConnection connection, dict[str, Any] msg)
dict[str, Any] _entry_dict(FloorEntry entry)
None websocket_list_floors(HomeAssistant hass, ActiveConnection connection, dict[str, Any] msg)
None websocket_update_floor(HomeAssistant hass, ActiveConnection connection, dict[str, Any] msg)
None websocket_delete_floor(HomeAssistant hass, ActiveConnection connection, dict[str, Any] msg)