1 """Support for Vera devices."""
3 from __future__
import annotations
6 from collections
import defaultdict
9 import pyvera
as veraApi
10 from requests.exceptions
import RequestException
11 import voluptuous
as vol
13 from homeassistant
import config_entries
18 EVENT_HOMEASSISTANT_STOP,
29 get_configured_platforms,
33 from .config_flow
import fix_device_id_list, new_options
34 from .const
import CONF_CONTROLLER, DOMAIN
36 _LOGGER = logging.getLogger(__name__)
38 VERA_ID_LIST_SCHEMA = vol.Schema([int])
40 CONFIG_SCHEMA = vol.Schema(
42 cv.deprecated(DOMAIN),
46 vol.Required(CONF_CONTROLLER): cv.url,
47 vol.Optional(CONF_EXCLUDE, default=[]): VERA_ID_LIST_SCHEMA,
48 vol.Optional(CONF_LIGHTS, default=[]): VERA_ID_LIST_SCHEMA,
53 extra=vol.ALLOW_EXTRA,
57 async
def async_setup(hass: HomeAssistant, base_config: ConfigType) -> bool:
58 """Set up for Vera controllers."""
59 hass.data[DOMAIN] = {}
61 if not (config := base_config.get(DOMAIN)):
64 hass.async_create_task(
65 hass.config_entries.flow.async_init(
67 context={
"source": config_entries.SOURCE_IMPORT},
76 """Do setup of vera."""
78 if entry.data.get(CONF_LIGHTS)
or entry.data.get(CONF_EXCLUDE):
79 hass.config_entries.async_update_entry(
83 entry.data.get(CONF_LIGHTS, []),
84 entry.data.get(CONF_EXCLUDE, []),
88 saved_light_ids = entry.options.get(CONF_LIGHTS, [])
89 saved_exclude_ids = entry.options.get(CONF_EXCLUDE, [])
91 base_url = entry.data[CONF_CONTROLLER]
96 if light_ids != saved_light_ids
or exclude_ids != saved_exclude_ids:
97 hass.config_entries.async_update_entry(
98 entry=entry, options=
new_options(light_ids, exclude_ids)
103 controller = veraApi.VeraController(base_url, subscription_registry)
106 all_devices = await hass.async_add_executor_job(controller.get_devices)
108 all_scenes = await hass.async_add_executor_job(controller.get_scenes)
109 except RequestException
as exception:
111 _LOGGER.exception(
"Error communicating with Vera API")
112 raise ConfigEntryNotReady
from exception
115 devices = [device
for device
in all_devices
if device.device_id
not in exclude_ids]
117 vera_devices: defaultdict[Platform, list[veraApi.VeraDevice]] = defaultdict(list)
118 for device
in devices:
120 if device_type
is not None:
121 vera_devices[device_type].append(device)
124 controller=controller,
125 devices=vera_devices,
133 await hass.config_entries.async_forward_entry_setups(
137 def stop_subscription(event):
138 """Stop SubscriptionRegistry updates."""
141 await hass.async_add_executor_job(controller.start)
142 entry.async_on_unload(
143 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_subscription)
146 entry.async_on_unload(entry.add_update_listener(_async_update_listener))
151 """Unload vera config entry."""
153 await asyncio.gather(
155 hass.config_entries.async_unload_platforms(
158 hass.async_add_executor_job(controller_data.controller.stop),
165 """Handle options update."""
166 await hass.config_entries.async_reload(entry.entry_id)
170 vera_device: veraApi.VeraDevice, remap: list[int]
171 ) -> Platform |
None:
172 """Map vera classes to Home Assistant types."""
175 veraApi.VeraDimmer: Platform.LIGHT,
176 veraApi.VeraBinarySensor: Platform.BINARY_SENSOR,
177 veraApi.VeraSensor: Platform.SENSOR,
178 veraApi.VeraArmableDevice: Platform.SWITCH,
179 veraApi.VeraLock: Platform.LOCK,
180 veraApi.VeraThermostat: Platform.CLIMATE,
181 veraApi.VeraCurtain: Platform.COVER,
182 veraApi.VeraSceneController: Platform.SENSOR,
183 veraApi.VeraSwitch: Platform.SWITCH,
186 def map_special_case(instance_class: type, entity_type: Platform) -> Platform:
187 if instance_class
is veraApi.VeraSwitch
and vera_device.device_id
in remap:
188 return Platform.LIGHT
193 map_special_case(instance_class, entity_type)
194 for instance_class, entity_type
in type_map.items()
195 if isinstance(vera_device, instance_class)
None set_controller_data(HomeAssistant hass, ConfigEntry config_entry, ControllerData data)
set[Platform] get_configured_platforms(ControllerData controller_data)
ControllerData get_controller_data(HomeAssistant hass, ConfigEntry config_entry)
list[int] fix_device_id_list(list[Any] data)
dict[str, list[int]] new_options(list[int] lights, list[int] exclude)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
bool async_setup(HomeAssistant hass, ConfigType base_config)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
Platform|None map_vera_device(veraApi.VeraDevice vera_device, list[int] remap)
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)