1 """Support for Supla devices."""
3 from __future__
import annotations
6 from datetime
import timedelta
9 from asyncpysupla
import SuplaAPI
10 import voluptuous
as vol
20 _LOGGER = logging.getLogger(__name__)
23 CONF_SERVER =
"server"
24 CONF_SERVERS =
"servers"
28 SUPLA_FUNCTION_HA_CMP_MAP = {
29 "CONTROLLINGTHEROLLERSHUTTER": Platform.COVER,
30 "CONTROLLINGTHEGATE": Platform.COVER,
31 "CONTROLLINGTHEGARAGEDOOR": Platform.COVER,
32 "LIGHTSWITCH": Platform.SWITCH,
34 SUPLA_FUNCTION_NONE =
"NONE"
35 SUPLA_SERVERS =
"supla_servers"
36 SUPLA_COORDINATORS =
"supla_coordinators"
38 SERVER_CONFIG = vol.Schema(
40 vol.Required(CONF_SERVER): cv.string,
41 vol.Required(CONF_ACCESS_TOKEN): cv.string,
45 CONFIG_SCHEMA = vol.Schema(
48 {vol.Required(CONF_SERVERS): vol.All(cv.ensure_list, [SERVER_CONFIG])}
51 extra=vol.ALLOW_EXTRA,
55 async
def async_setup(hass: HomeAssistant, base_config: ConfigType) -> bool:
56 """Set up the Supla component."""
58 server_confs = base_config[DOMAIN][CONF_SERVERS]
60 hass.data[DOMAIN] = {SUPLA_SERVERS: {}, SUPLA_COORDINATORS: {}}
64 for server_conf
in server_confs:
65 server_address = server_conf[CONF_SERVER]
67 server = SuplaAPI(server_address, server_conf[CONF_ACCESS_TOKEN], session)
71 srv_info = await server.get_server_info()
72 if srv_info.get(
"authenticated"):
73 hass.data[DOMAIN][SUPLA_SERVERS][server_conf[CONF_SERVER]] = server
77 "Server: %s not configured. API call returned: %s",
84 "Server: %s not configured. Error on Supla API access: ", server_address
94 """Run periodically to discover new devices.
96 Currently it is only run at startup.
98 component_configs: dict[Platform, dict[str, dict]] = {}
100 for server_name, server
in hass.data[DOMAIN][SUPLA_SERVERS].items():
102 async
def _fetch_channels():
103 async
with asyncio.timeout(SCAN_INTERVAL.total_seconds()):
105 channel[
"id"]: channel
106 for channel
in await server.get_channels(
107 include=[
"iodevice",
"state",
"connected"]
114 name=f
"{DOMAIN}-{server_name}",
115 update_method=_fetch_channels,
116 update_interval=SCAN_INTERVAL,
119 await coordinator.async_refresh()
121 hass.data[DOMAIN][SUPLA_COORDINATORS][server_name] = coordinator
123 for channel_id, channel
in coordinator.data.items():
124 channel_function = channel[
"function"][
"name"]
126 if channel_function == SUPLA_FUNCTION_NONE:
128 "Ignored function: %s, channel ID: %s",
134 component_name = SUPLA_FUNCTION_HA_CMP_MAP.get(channel_function)
136 if component_name
is None:
138 "Unsupported function: %s, channel ID: %s",
144 channel[
"server_name"] = server_name
145 component_config = component_configs.setdefault(component_name, {})
146 component_config[f
"{server_name}_{channel_id}"] = {
147 "channel_id": channel_id,
148 "server_name": server_name,
149 "function_name": channel[
"function"][
"name"],
153 for component_name, config
in component_configs.items():
bool async_setup(HomeAssistant hass, ConfigType base_config)
def discover_devices(hass, hass_config)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)