1 """Component for the Slide API."""
3 from datetime
import timedelta
6 from goslideapi
import GoSlideCloud, goslideapi
7 import voluptuous
as vol
34 _LOGGER = logging.getLogger(__name__)
38 CONFIG_SCHEMA = vol.Schema(
42 vol.Required(CONF_USERNAME): cv.string,
43 vol.Required(CONF_PASSWORD): cv.string,
45 CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL
47 vol.Optional(CONF_INVERT_POSITION, default=
False): cv.boolean,
51 extra=vol.ALLOW_EXTRA,
55 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
56 """Set up the Slide platform."""
58 async
def update_slides(now=None):
59 """Update slide information."""
60 result = await hass.data[DOMAIN][API].slides_overview()
63 _LOGGER.error(
"Slide API does not work or returned an error")
67 _LOGGER.debug(
"Slide API returned %d slide(s)", len(result))
69 _LOGGER.warning(
"Slide API returned 0 slides")
72 if "device_id" not in slide:
74 "Found invalid Slide entry, device_id is missing. Entry=%s", slide
78 uid = slide[
"device_id"].replace(
"slide_",
"")
79 slidenew = hass.data[DOMAIN][SLIDES].setdefault(uid, {})
81 slidenew[
"id"] = slide[
"id"]
82 slidenew[
"name"] = slide[
"device_name"]
83 slidenew[
"state"] =
None
84 oldpos = slidenew.get(
"pos")
85 slidenew[
"pos"] =
None
86 slidenew[
"online"] =
False
87 slidenew[
"invert"] = config[DOMAIN][CONF_INVERT_POSITION]
89 if "device_info" not in slide:
91 "Slide %s (%s) has no device_info Entry=%s",
99 if "pos" in slide[
"device_info"]:
100 slidenew[
"online"] =
True
101 slidenew[
"pos"] = slide[
"device_info"][
"pos"]
102 slidenew[
"pos"] =
max(0,
min(1, slidenew[
"pos"]))
104 if oldpos
is None or oldpos == slidenew[
"pos"]:
105 slidenew[
"state"] = (
107 if slidenew[
"pos"] > (1 - DEFAULT_OFFSET)
110 elif oldpos < slidenew[
"pos"]:
111 slidenew[
"state"] = (
113 if slidenew[
"pos"] >= (1 - DEFAULT_OFFSET)
117 slidenew[
"state"] = (
119 if slidenew[
"pos"] <= DEFAULT_OFFSET
122 elif "code" in slide[
"device_info"]:
124 "Slide %s (%s) is offline with code=%s",
127 slide[
"device_info"][
"code"],
131 "Slide %s (%s) has invalid device_info %s",
134 slide[
"device_info"],
137 _LOGGER.debug(
"Updated entry=%s", slidenew)
139 async
def retry_setup(now):
140 """Retry setup if a connection/timeout happens on Slide API."""
143 hass.data[DOMAIN] = {}
144 hass.data[DOMAIN][SLIDES] = {}
146 username = config[DOMAIN][CONF_USERNAME]
147 password = config[DOMAIN][CONF_PASSWORD]
148 scaninterval = config[DOMAIN][CONF_SCAN_INTERVAL]
150 hass.data[DOMAIN][API] = GoSlideCloud(username, password)
153 result = await hass.data[DOMAIN][API].login()
154 except (goslideapi.ClientConnectionError, goslideapi.ClientTimeoutError)
as err:
156 "Error connecting to Slide Cloud: %s, going to retry in %s second(s)",
164 _LOGGER.error(
"Slide API returned unknown error during authentication")
167 _LOGGER.debug(
"Slide API successfully authenticated")
169 await update_slides()
171 hass.async_create_task(
bool async_setup(HomeAssistant hass, ConfigType config)
None async_load_platform(core.HomeAssistant hass, Platform|str component, str platform, DiscoveryInfoType|None discovered, ConfigType hass_config)
CALLBACK_TYPE async_call_later(HomeAssistant hass, float|timedelta delay, HassJob[[datetime], Coroutine[Any, Any, None]|None]|Callable[[datetime], Coroutine[Any, Any, None]|None] action)
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)