1 """Support for the (unofficial) Tado API."""
3 from datetime
import timedelta
6 import requests.exceptions
19 CONST_OVERLAY_TADO_DEFAULT,
20 CONST_OVERLAY_TADO_MODE,
21 CONST_OVERLAY_TADO_OPTIONS,
24 from .services
import setup_services
25 from .tado_connector
import TadoConnector
27 _LOGGER = logging.getLogger(__name__)
31 Platform.BINARY_SENSOR,
33 Platform.DEVICE_TRACKER,
35 Platform.WATER_HEATER,
42 CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
45 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
53 type TadoConfigEntry = ConfigEntry[TadoConnector]
57 """Set up Tado from a config entry."""
61 username = entry.data[CONF_USERNAME]
62 password = entry.data[CONF_PASSWORD]
63 fallback = entry.options.get(CONF_FALLBACK, CONST_OVERLAY_TADO_DEFAULT)
65 tadoconnector =
TadoConnector(hass, username, password, fallback)
68 await hass.async_add_executor_job(tadoconnector.setup)
70 _LOGGER.error(
"Failed to login to tado")
72 except RuntimeError
as exc:
73 _LOGGER.error(
"Failed to setup tado: %s", exc)
75 except requests.exceptions.Timeout
as ex:
76 raise ConfigEntryNotReady
from ex
77 except requests.exceptions.HTTPError
as ex:
78 if ex.response.status_code > 400
and ex.response.status_code < 500:
79 _LOGGER.error(
"Failed to login to tado: %s", ex)
81 raise ConfigEntryNotReady
from ex
84 await hass.async_add_executor_job(tadoconnector.update)
87 entry.async_on_unload(
90 lambda now: tadoconnector.update(),
95 entry.async_on_unload(
98 lambda now: tadoconnector.update_mobile_devices(),
99 SCAN_MOBILE_DEVICE_INTERVAL,
103 entry.async_on_unload(entry.add_update_listener(_async_update_listener))
105 entry.runtime_data = tadoconnector
107 await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
114 options =
dict(entry.options)
115 if CONF_FALLBACK
not in options:
116 options[CONF_FALLBACK] = entry.data.get(
117 CONF_FALLBACK, CONST_OVERLAY_TADO_DEFAULT
119 hass.config_entries.async_update_entry(entry, options=options)
121 if options[CONF_FALLBACK]
not in CONST_OVERLAY_TADO_OPTIONS:
122 if options[CONF_FALLBACK]:
123 options[CONF_FALLBACK] = CONST_OVERLAY_TADO_MODE
125 options[CONF_FALLBACK] = CONST_OVERLAY_MANUAL
126 hass.config_entries.async_update_entry(entry, options=options)
130 """Handle options update."""
131 await hass.config_entries.async_reload(entry.entry_id)
135 """Unload a config entry."""
136 return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
None setup_services(HomeAssistant hass)
bool async_unload_entry(HomeAssistant hass, TadoConfigEntry entry)
None _async_update_listener(HomeAssistant hass, ConfigEntry entry)
def _async_import_options_from_data_if_missing(HomeAssistant hass, ConfigEntry entry)
bool async_setup(HomeAssistant hass, ConfigType config)
bool async_setup_entry(HomeAssistant hass, TadoConfigEntry entry)
CALLBACK_TYPE async_track_time_interval(HomeAssistant hass, Callable[[datetime], Coroutine[Any, Any, None]|None] action, timedelta interval, *str|None name=None, bool|None cancel_on_shutdown=None)