From d1f9199c0c30a61521004db859a782d45d8126c3 Mon Sep 17 00:00:00 2001 From: Olivier B Date: Sun, 22 Mar 2020 19:17:44 +0100 Subject: [PATCH] feat: add sentry mode availability flag (#66) --- teslajsonpy/sentry_mode.py | 23 +++++++++++++++++------ teslajsonpy/vehicle.py | 10 +++++++++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/teslajsonpy/sentry_mode.py b/teslajsonpy/sentry_mode.py index 2d15114b..0997e3ff 100644 --- a/teslajsonpy/sentry_mode.py +++ b/teslajsonpy/sentry_mode.py @@ -31,6 +31,7 @@ def __init__(self, data, controller): """ super().__init__(data, controller) self.__manual_update_time = 0 + self.__sentry_mode_available = False self.__sentry_mode = False self.type = "sentry mode switch" self.hass_type = "switch" @@ -43,11 +44,21 @@ async def async_update(self, wake_if_asleep=False): last_update = self._controller.get_last_update_time(self._id) if last_update >= self.__manual_update_time: data = self._controller.get_state_params(self._id) - self.__sentry_mode = data and data["sentry_mode"] + if data and "sentry_mode_available" in data: + self.__sentry_mode_available = data["sentry_mode_available"] + if self.__sentry_mode_available and "sentry_mode" in data: + self.__sentry_mode = data["sentry_mode"] + else: + self.__sentry_mode_available = False + self.__sentry_mode = False + + def available(self): + """Return whether the sentry mode is available.""" + return self.__sentry_mode_available - def get_value(self): - """Return whether the sentry mode is enabled.""" - return self.__sentry_mode + def is_on(self): + """Return whether the sentry mode is enabled, always False if sentry mode is not available.""" + return self.__sentry_mode_available and self.__sentry_mode @staticmethod def has_battery(): @@ -56,7 +67,7 @@ def has_battery(): async def enable_sentry_mode(self): """Enable the sentry mode.""" - if not self.__sentry_mode: + if self.__sentry_mode_available and not self.__sentry_mode: data = await self._controller.command( self._id, "set_sentry_mode", {"on": True}, wake_if_asleep=True ) @@ -66,7 +77,7 @@ async def enable_sentry_mode(self): async def disable_sentry_mode(self): """Disable the sentry mode.""" - if self.__sentry_mode: + if self.__sentry_mode_available and self.__sentry_mode: data = await self._controller.command( self._id, "set_sentry_mode", {"on": False}, wake_if_asleep=True ) diff --git a/teslajsonpy/vehicle.py b/teslajsonpy/vehicle.py index 88f6ac1e..a593bf76 100644 --- a/teslajsonpy/vehicle.py +++ b/teslajsonpy/vehicle.py @@ -40,6 +40,7 @@ def __init__(self, data, controller): self._state = data["state"] self._car_type = f"Model {str(self._vin[3]).upper()}" self._car_version = "" + self._sentry_mode_available = False self._controller = controller self.should_poll = True self.type = "device" @@ -84,6 +85,11 @@ def car_type(self): """Return the type of this Vehicle.""" return self._car_type + @property + def sentry_mode_available(self): + """Return True if sentry mode is available on this Vehicle.""" + return self._sentry_mode_available + def assumed_state(self): # pylint: disable=protected-access """Return whether the data is from an online vehicle.""" @@ -94,11 +100,13 @@ def assumed_state(self): ) async def async_update(self, wake_if_asleep=False): - """Update the car version.""" + """Update the vehicle data.""" await self._controller.update(self.id(), wake_if_asleep=wake_if_asleep) state = self._controller.get_state_params(self.id()) if state and "car_version" in state: self._car_version = state["car_version"] + if state and "sentry_mode_available" in state: + self._sentry_mode_available = state["sentry_mode_available"] @staticmethod def is_armable():