1 """The motion_blinds component."""
4 from datetime
import timedelta
6 from typing
import TYPE_CHECKING
8 from motionblinds
import AsyncMotionMulticast
19 DEFAULT_WAIT_FOR_PUSH,
24 KEY_MULTICAST_LISTENER,
30 from .coordinator
import DataUpdateCoordinatorMotionBlinds
31 from .gateway
import ConnectMotionGateway
33 _LOGGER = logging.getLogger(__name__)
37 """Set up the motion_blinds components from a config entry."""
38 hass.data.setdefault(DOMAIN, {})
39 setup_lock = hass.data[DOMAIN].setdefault(KEY_SETUP_LOCK, asyncio.Lock())
40 host = entry.data[CONF_HOST]
41 key = entry.data[CONF_API_KEY]
42 multicast_interface = entry.data.get(CONF_INTERFACE, DEFAULT_INTERFACE)
43 wait_for_push = entry.options.get(CONF_WAIT_FOR_PUSH, DEFAULT_WAIT_FOR_PUSH)
46 async
with setup_lock:
47 if KEY_MULTICAST_LISTENER
not in hass.data[DOMAIN]:
50 hass, interface=multicast_interface
52 working_interface = await check_multicast_class.async_check_interface(
55 if working_interface != multicast_interface:
56 data = {**entry.data, CONF_INTERFACE: working_interface}
57 hass.config_entries.async_update_entry(entry, data=data)
60 "Motionblinds interface updated from %s to %s, "
61 "this should only occur after a network change"
67 multicast = AsyncMotionMulticast(interface=working_interface)
68 hass.data[DOMAIN][KEY_MULTICAST_LISTENER] = multicast
70 await multicast.Start_listen()
73 def stop_motion_multicast(event):
74 """Stop multicast thread."""
75 _LOGGER.debug(
"Shutting down Motion Listener")
76 multicast.Stop_listen()
78 unsub = hass.bus.async_listen_once(
79 EVENT_HOMEASSISTANT_STOP, stop_motion_multicast
81 hass.data[DOMAIN][KEY_UNSUB_STOP] = unsub
84 multicast = hass.data[DOMAIN][KEY_MULTICAST_LISTENER]
86 if not await connect_gateway_class.async_connect_gateway(host, key):
87 raise ConfigEntryNotReady
88 motion_gateway = connect_gateway_class.gateway_device
89 api_lock = asyncio.Lock()
91 KEY_GATEWAY: motion_gateway,
92 KEY_API_LOCK: api_lock,
93 CONF_WAIT_FOR_PUSH: wait_for_push,
103 update_interval=
timedelta(seconds=UPDATE_INTERVAL),
107 await coordinator.async_config_entry_first_refresh()
109 hass.data[DOMAIN][entry.entry_id] = {
110 KEY_GATEWAY: motion_gateway,
111 KEY_COORDINATOR: coordinator,
115 assert entry.unique_id
is not None
117 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
119 entry.async_on_unload(entry.add_update_listener(update_listener))
125 """Unload a config entry."""
126 unload_ok = await hass.config_entries.async_unload_platforms(
127 config_entry, PLATFORMS
131 multicast = hass.data[DOMAIN][KEY_MULTICAST_LISTENER]
132 multicast.Unregister_motion_gateway(config_entry.data[CONF_HOST])
133 hass.data[DOMAIN].pop(config_entry.entry_id)
137 for entry
in hass.config_entries.async_entries(DOMAIN)
138 if entry.state == ConfigEntryState.LOADED
140 if len(loaded_entries) == 1:
142 unsub_stop = hass.data[DOMAIN].pop(KEY_UNSUB_STOP)
144 _LOGGER.debug(
"Shutting down Motion Listener")
145 multicast = hass.data[DOMAIN].pop(KEY_MULTICAST_LISTENER)
146 multicast.Stop_listen()
152 """Handle options update."""
153 await hass.config_entries.async_reload(config_entry.entry_id)
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)
None update_listener(HomeAssistant hass, ConfigEntry config_entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)