1 """StarLine Account."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from datetime
import datetime, timedelta
9 from starline
import StarlineApi, StarlineDevice
23 DEFAULT_SCAN_INTERVAL,
24 DEFAULT_SCAN_OBD_INTERVAL,
30 if dt_str
is None or (parsed := dt_util.parse_datetime(dt_str))
is None:
32 return parsed.replace(tzinfo=dt_util.UTC).isoformat()
36 """StarLine Account class."""
38 def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) ->
None:
39 """Initialize StarLine account."""
40 self._hass: HomeAssistant = hass
41 self._config_entry: ConfigEntry = config_entry
46 self._api: StarlineApi = StarlineApi(
47 config_entry.data[DATA_USER_ID], config_entry.data[DATA_SLNET_TOKEN]
51 """Check SLNet token expiration and update if needed."""
52 now = datetime.now().timestamp()
53 slnet_token_expires = self._config_entry.data[DATA_EXPIRES]
55 if now + interval > slnet_token_expires:
59 """Update SLNet token."""
60 slid_token = self._config_entry.data[DATA_SLID_TOKEN]
63 slnet_token, slnet_token_expires, user_id = self._api.get_user_id(
66 self._api.set_slnet_token(slnet_token)
67 self._api.set_user_id(user_id)
71 **self._config_entry.data,
72 DATA_SLNET_TOKEN: slnet_token,
73 DATA_EXPIRES: slnet_token_expires,
74 DATA_USER_ID: user_id,
77 except Exception
as err:
78 _LOGGER.error(
"Error updating SLNet token: %s", err)
82 self._hass.config_entries.async_update_entry(
88 """Update StarLine data."""
93 """Update StarLine OBD data."""
98 def api(self) -> StarlineApi:
99 """Return the instance of the API."""
103 """Update StarLine data."""
104 await self._hass.async_add_executor_job(self.
_update_data_update_data)
107 """Update StarLine OBD data."""
108 await self._hass.async_add_executor_job(self.
_update_obd_data_update_obd_data)
111 """Set StarLine API update interval."""
112 _LOGGER.debug(
"Setting update interval: %ds", interval)
119 self._hass, self.
updateupdate, delta
123 """Set StarLine API OBD update interval."""
124 _LOGGER.debug(
"Setting OBD update interval: %ds", interval)
135 """Unload StarLine API."""
136 _LOGGER.debug(
"Unloading StarLine API")
146 """Device information for entities."""
148 identifiers={(DOMAIN, device.device_id)},
149 manufacturer=
"StarLine",
150 model=device.typename,
152 sw_version=device.fw_version,
153 configuration_url=
"https://starline-online.ru/",
157 def gps_attrs(device: StarlineDevice) -> dict[str, Any]:
158 """Attributes for device tracker."""
160 "updated": dt_util.utc_from_timestamp(device.position[
"ts"]).isoformat(),
161 "online": device.online,
166 """Attributes for balance sensor."""
168 "operator": device.balance.get(
"operator"),
169 "state": device.balance.get(
"state"),
174 def gsm_attrs(device: StarlineDevice) -> dict[str, Any]:
175 """Attributes for GSM sensor."""
177 "raw": device.gsm_level,
179 "phone": device.phone,
180 "online": device.online,
185 """Attributes for engine switch."""
187 "autostart": device.car_state.get(
"r_start"),
188 "ignition": device.car_state.get(
"run"),
193 """Attributes for errors sensor."""
194 return {
"errors": device.errors.get(
"errors")}
None set_update_obd_interval(self, int interval)
None _check_slnet_token(self, int interval)
def _update_obd_data(self)
def update_obd(self, unused=None)
_unsubscribe_auto_obd_updater
dict[str, Any] errors_attrs(StarlineDevice device)
None _update_slnet_token(self)
dict[str, Any] engine_attrs(StarlineDevice device)
def update(self, unused=None)
_unsubscribe_auto_updater
None _save_slnet_token(self, data)
DeviceInfo device_info(StarlineDevice device)
dict[str, Any] gps_attrs(StarlineDevice device)
dict[str, Any] gsm_attrs(StarlineDevice device)
None set_update_interval(self, int interval)
None __init__(self, HomeAssistant hass, ConfigEntry config_entry)
dict[str, Any] balance_attrs(StarlineDevice device)
str|None _parse_datetime(str|None dt_str)
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)