From fb9415958c002fdfb1e3e9cfb04699e49bb855a4 Mon Sep 17 00:00:00 2001 From: Simon Hansen <67142049+DurgNomis-drol@users.noreply.github.com> Date: Thu, 1 Apr 2021 23:11:07 +0200 Subject: [PATCH] Version 2. (#14) * BREAKING CHANGE: Changed unique_id to be based on vin instead of alias. * BREAKING CHANGES. v2 --- .gitignore | 1 + README.md | 17 +- custom_components/toyota/__init__.py | 18 +- custom_components/toyota/config_flow.py | 16 +- custom_components/toyota/const.py | 46 ++-- custom_components/toyota/device_tracker.py | 30 ++- custom_components/toyota/manifest.json | 4 +- custom_components/toyota/sensor.py | 139 ++++------- poetry.lock | 263 +++++++++++++-------- pyproject.toml | 4 +- tests/fixtures/gather_all_information.json | 60 +++++ 11 files changed, 337 insertions(+), 261 deletions(-) create mode 100644 tests/fixtures/gather_all_information.json diff --git a/.gitignore b/.gitignore index 25ff4b0..9560f1b 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +/tests diff --git a/README.md b/README.md index 21f671d..bcb40f6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- logo + logo

Toyota community integration

@@ -21,16 +21,17 @@ it working but there are no promises. ## Features -Only Europe is supported right now. If you want to help to add other regions, please open an issue over at [`mytoyota`](https://github.com/DurgNomis-drol/mytoyota). +Only Europe is supported right now. If you want to help add other regions, please open an issue over at [`mytoyota`](https://github.com/DurgNomis-drol/mytoyota). This component will set up the following platforms: -| Platform | Sample sensor | Description | -| ---------------- | ----------------------- | --------------------------------- | -| `sensor` | `sensor.aygo` | Static data about your car | -| `sensor` | `sensor.aygo_fuel_tank` | Fuel tank information | -| `sensor` | `sensor.aygo_odometer` | Odometer information | -| `device_tracker` | `device_tracker.aygo` | Shows you last parked information | +| Platform | Sample sensor | Description | +| ---------------- | ----------------------------- | --------------------------------- | +| `sensor` | `sensor.aygo` | Static data about your car | +| `sensor` | `sensor.aygo_odometer` | Odometer information | +| `sensor` | `sensor.aygo_fuel_tank` | Fuel tank information | +| `sensor` | `sensor.aygo_starter_battery` | Starter battery health | +| `device_tracker` | `device_tracker.aygo` | Shows you last parked information | **Sensors displaying statistical information are coming soon...** diff --git a/custom_components/toyota/__init__.py b/custom_components/toyota/__init__.py index ddad566..ebdab40 100644 --- a/custom_components/toyota/__init__.py +++ b/custom_components/toyota/__init__.py @@ -7,7 +7,7 @@ from mytoyota.exceptions import ToyotaLoginError from homeassistant.config_entries import ConfigEntry -from homeassistant.const import CONF_API_TOKEN, CONF_EMAIL, CONF_PASSWORD, CONF_REGION +from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_REGION from homeassistant.core import Config, HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers.update_coordinator import ( @@ -18,21 +18,20 @@ from .const import ( ALIAS, CONF_LOCALE, - CONF_UUID, DATA_CLIENT, DATA_COORDINATOR, DETAILS, DOMAIN, HYBRID, + IMAGE, MODEL, + PLATFORMS, STARTUP_MESSAGE, VIN, ) _LOGGER = logging.getLogger(__name__) -PLATFORMS = ["sensor", "device_tracker"] - # Update sensors every 5 minutes UPDATE_INTERVAL = timedelta(seconds=300) @@ -51,26 +50,24 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): email = entry.data[CONF_EMAIL] password = entry.data[CONF_PASSWORD] locale = entry.data[CONF_LOCALE] - uuid = entry.data[CONF_UUID] - token = entry.data[CONF_API_TOKEN] region = entry.data[CONF_REGION] client = MyT( username=email, password=password, locale=locale, - uuid=uuid, region=region.lower(), - token=token, ) + await client.login() + async def async_update_data(): """Fetch data from Toyota API.""" vehicles = [] try: - vehicles = await client.gather_information() + vehicles = await client.gather_all_information() except ToyotaLoginError as ex: _LOGGER.error(ex) except Exception as ex: # pylint: disable=broad-except @@ -134,6 +131,7 @@ def __init__(self, coordinator, index): self.alias = self.coordinator.data[self.index][ALIAS] self.model = self.coordinator.data[self.index][DETAILS][MODEL] self.hybrid = self.coordinator.data[self.index][DETAILS][HYBRID] + self.image = self.coordinator.data[self.index][DETAILS][IMAGE] @property def device_info(self): @@ -142,5 +140,5 @@ def device_info(self): "identifiers": {(DOMAIN, self.vin)}, "name": self.alias, "model": self.model, - "manufacturer": "ha_toyota", + "manufacturer": DOMAIN, } diff --git a/custom_components/toyota/config_flow.py b/custom_components/toyota/config_flow.py index 45dbf32..b917d6f 100644 --- a/custom_components/toyota/config_flow.py +++ b/custom_components/toyota/config_flow.py @@ -11,21 +11,25 @@ import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import CONF_API_TOKEN, CONF_EMAIL, CONF_PASSWORD, CONF_REGION +from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_REGION -from .const import CONF_LOCALE, CONF_REGION_SUPPORTED, CONF_UUID +from .const import CONF_LOCALE, CONF_REGION_SUPPORTED # https://github.com/PyCQA/pylint/issues/3202 from .const import DOMAIN # pylint: disable=unused-import _LOGGER = logging.getLogger(__name__) +supported_regions = CONF_REGION_SUPPORTED + DATA_SCHEMA = vol.Schema( { vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str, vol.Required(CONF_LOCALE): str, - vol.Required(CONF_REGION): vol.In(CONF_REGION_SUPPORTED), + vol.Required(CONF_REGION): vol.In( + [region.capitalize() for region in supported_regions] + ), } ) @@ -53,11 +57,7 @@ async def async_step_user(self, user_input=None): region=region.lower(), ) - token = await client.get_token() - uuid = client.get_uuid() - - data = user_input - data.update({CONF_API_TOKEN: token, CONF_UUID: uuid}) + await client.login() except ToyotaLoginError as ex: errors["base"] = "invalid_auth" diff --git a/custom_components/toyota/const.py b/custom_components/toyota/const.py index 50fcabb..b582f5a 100644 --- a/custom_components/toyota/const.py +++ b/custom_components/toyota/const.py @@ -1,45 +1,47 @@ """Constants for the Toyota Connected Services integration.""" +PLATFORMS = ["sensor", "device_tracker"] + DOMAIN = "toyota" NAME = "Toyota Connected Services" ISSUES_URL = "https://github.com/DurgNomis-drol/ha_toyota/issues" -DATA_CLIENT = "toyota_client" -DATA_COORDINATOR = "coordinator" - # CONF CONF_LOCALE = "locale" -CONF_UUID = "uuid" CONF_REGION_SUPPORTED = [ - "Europe", + "europe", ] -# COORDINATOR DATA ATTRIBUTES -DETAILS = "details" -MODEL = "model" +# DATA COORDINATOR +DATA_CLIENT = "toyota_client" +DATA_COORDINATOR = "coordinator" + +# DATA COORDINATOR ATTRIBUTES ALIAS = "alias" -VIN = "vin" -STATUS = "status" -ODOMETER = "odometer" +BATTERY_HEALTH = "batteryHealth" +CONNECTED_SERVICES = "connectedServices" +DETAILS = "details" +ENGINE = "engine" +FUEL = "Fuel" +FUEL_TYPE = "fuel" +HYBRID = "hybrid" +IMAGE = "imageUrl" +LICENSE_PLATE = "licensePlate" MILEAGE = "mileage" MILEAGE_UNIT = "mileage_unit" -FUEL = "Fuel" -FUEL_TYPE = "fuel_type" +MODEL = "modelName" +ODOMETER = "odometer" PARKING = "parking" -BATTERY = "battery" -HVAC = "hvac" -HVAC_TEMPERATURE = "InsideTemperature" -HYBRID = "hybrid" -LAST_UPDATED = "last_updated" -IMAGE = "image" +STATUS = "status" +SERVICES = "servicesEnabled" +VIN = "vin" # ICONS +ICON_BATTERY = "mdi:car-battery" ICON_CAR = "mdi:car" ICON_FUEL = "mdi:gas-station" -ICON_ODOMETER = "mdi:speedometer" -ICON_HVAC = "mdi:hvac" +ICON_ODOMETER = "mdi:counter" ICON_PARKING = "mdi:map-marker" -ICON_BATTERY = "mdi:car-battery" STARTUP_MESSAGE = f""" diff --git a/custom_components/toyota/device_tracker.py b/custom_components/toyota/device_tracker.py index 9235c13..4b5c3f4 100644 --- a/custom_components/toyota/device_tracker.py +++ b/custom_components/toyota/device_tracker.py @@ -5,26 +5,27 @@ from homeassistant.components.device_tracker.config_entry import TrackerEntity from . import ToyotaEntity -from .const import DATA_COORDINATOR, DOMAIN, ICON_CAR, PARKING, STATUS +from .const import ( + CONNECTED_SERVICES, + DATA_COORDINATOR, + DOMAIN, + ICON_CAR, + PARKING, + SERVICES, + STATUS, +) _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass, config_entry, async_add_devices): """Set up the BMW ConnectedDrive tracker from config entry.""" - coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR] - tracker = [] - def check_if_enabled(service): - """Check if Toyota Connected Services is enabled for the car.""" - if "error" in service: - return False - - return True + coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR] for index, _ in enumerate(coordinator.data): - if check_if_enabled(coordinator.data[index][STATUS][PARKING]): + if coordinator.data[index][SERVICES][CONNECTED_SERVICES]: tracker.append(ToyotaParkingTracker(coordinator, index)) async_add_devices(tracker, True) @@ -46,12 +47,12 @@ def longitude(self): @property def name(self): """Return the name of the sensor.""" - return f"{self.alias}" + return f"{self.alias} parking location" @property def unique_id(self): """Return a unique identifier for this entity.""" - return f"{self.alias}/last_parked" + return f"{self.vin}/parking_location" @property def source_type(self): @@ -67,3 +68,8 @@ def icon(self): def force_update(self): """All updates do not need to be written to the state machine.""" return False + + @property + def entity_picture(self): + """Return entity picture.""" + return self.image diff --git a/custom_components/toyota/manifest.json b/custom_components/toyota/manifest.json index b46fcb4..a868543 100644 --- a/custom_components/toyota/manifest.json +++ b/custom_components/toyota/manifest.json @@ -6,6 +6,6 @@ "documentation": "https://github.com/DurgNomis-drol/ha_toyota", "issue_tracker": "https://github.com/DurgNomis-drol/ha_toyota/issues", "codeowners": ["@DurgNomis-drol"], - "requirements": ["mytoyota==0.1.4"], - "version": "0.1.0" + "requirements": ["mytoyota==0.2.1"], + "version": "0.2.0" } diff --git a/custom_components/toyota/sensor.py b/custom_components/toyota/sensor.py index e3de89f..70f8c17 100644 --- a/custom_components/toyota/sensor.py +++ b/custom_components/toyota/sensor.py @@ -1,54 +1,44 @@ """Platform for Toyota sensor integration.""" -from homeassistant.const import DEVICE_CLASS_TEMPERATURE, PERCENTAGE +from homeassistant.const import PERCENTAGE, STATE_UNKNOWN from . import ToyotaEntity from .const import ( - BATTERY, + BATTERY_HEALTH, + CONNECTED_SERVICES, DATA_COORDINATOR, DETAILS, DOMAIN, FUEL, FUEL_TYPE, - HVAC, - HVAC_TEMPERATURE, ICON_BATTERY, ICON_CAR, ICON_FUEL, - ICON_HVAC, ICON_ODOMETER, - IMAGE, + LICENSE_PLATE, MILEAGE, MILEAGE_UNIT, ODOMETER, + SERVICES, STATUS, ) async def async_setup_entry(hass, config_entry, async_add_devices): """Set up the sensor platform.""" - coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR] - sensors = [] - def check_if_enabled(service): - """Check if Toyota Connected Services is enabled for the car.""" - if "error" in service: - return False - - return True + coordinator = hass.data[DOMAIN][config_entry.entry_id][DATA_COORDINATOR] for index, _ in enumerate(coordinator.data): sensors.append(ToyotaCarSensor(coordinator, index)) # If Connected Services is setup for the car, setup additional sensors - if check_if_enabled(coordinator.data[index][STATUS][ODOMETER]): - sensors.append(ToyotaFuelRemainingSensor(coordinator, index)) + if coordinator.data[index][SERVICES][CONNECTED_SERVICES]: + sensors.append(ToyotaStarterBatterySensor(coordinator, index)) sensors.append(ToyotaOdometerSensor(coordinator, index)) - # if check_if_enabled(coordinator.data[index][STATUS][HVAC]): - # sensors.append(ToyotaHVACSensor(coordinator, index)) - # if coordinator.data[index][DETAILS][HYBRID]: - # sensors.append(ToyotaEVSensor(coordinator, index)) + if FUEL in coordinator.data[index][STATUS][ODOMETER]: + sensors.append(ToyotaFuelRemainingSensor(coordinator, index)) async_add_devices(sensors, True) @@ -64,7 +54,7 @@ def name(self): @property def unique_id(self): """Return a unique identifier for this entity.""" - return f"{self.alias}/car" + return f"{self.vin}/car" @property def device_state_attributes(self): @@ -79,146 +69,103 @@ def icon(self): @property def state(self): """Return the state of the sensor.""" - return self.model + if LICENSE_PLATE in self.coordinator.data[self.index][DETAILS]: + return self.coordinator.data[self.index][DETAILS][LICENSE_PLATE] - @property - def entity_picture(self): - """Return entity picture.""" - return self.coordinator.data[self.index][DETAILS][IMAGE] + return STATE_UNKNOWN -class ToyotaFuelRemainingSensor(ToyotaEntity): +class ToyotaStarterBatterySensor(ToyotaEntity): """Class for the fuel remaining sensor.""" @property def name(self): """Return the name of the sensor.""" - return f"{self.alias} fuel tank" + return f"{self.alias} starter battery health" @property def unique_id(self): """Return a unique identifier for this entity.""" - return f"{self.alias}/fuel_tank" - - @property - def unit_of_measurement(self): - """Return the unit of measurement.""" - return PERCENTAGE - - @property - def device_state_attributes(self): - """Return the state attributes.""" - return { - FUEL_TYPE: self.coordinator.data[self.index][DETAILS][FUEL_TYPE], - } + return f"{self.vin}/starter_battery_condition" @property def icon(self): """Return the icon to use in the frontend.""" - return ICON_FUEL + return ICON_BATTERY @property def state(self): """Return the state of the sensor.""" - return self.coordinator.data[self.index][STATUS][ODOMETER][FUEL] + if BATTERY_HEALTH in self.coordinator.data[self.index][DETAILS]: + return ( + self.coordinator.data[self.index][DETAILS][BATTERY_HEALTH] + .lower() + .capitalize() + ) + return STATE_UNKNOWN -class ToyotaOdometerSensor(ToyotaEntity): + +class ToyotaFuelRemainingSensor(ToyotaEntity): """Class for the fuel remaining sensor.""" @property def name(self): """Return the name of the sensor.""" - return f"{self.alias} Odometer" + return f"{self.alias} fuel tank" @property def unique_id(self): """Return a unique identifier for this entity.""" - return f"{self.alias}/odometer" + return f"{self.vin}/fuel_tank" @property def unit_of_measurement(self): """Return the unit of measurement.""" - return self.coordinator.data[self.index][STATUS][ODOMETER][MILEAGE_UNIT] - - @property - def icon(self): - """Return the icon to use in the frontend.""" - return ICON_ODOMETER - - @property - def state(self): - """Return the state of the sensor.""" - return self.coordinator.data[self.index][STATUS][ODOMETER][MILEAGE] - - -# Is disabled for now -class ToyotaHVACSensor(ToyotaEntity): - """Class for the fuel remaining sensor.""" - - @property - def name(self): - """Return the name of the sensor.""" - return f"{self.alias} HVAC" - - @property - def unique_id(self): - """Return a unique identifier for this entity.""" - return f"{self.alias}/hvac" + return PERCENTAGE @property - def device_class(self): - """Return the class of this device, from DEVICE_CLASS_*""" - return DEVICE_CLASS_TEMPERATURE + def device_state_attributes(self): + """Return the state attributes.""" + return { + FUEL_TYPE: self.coordinator.data[self.index][DETAILS][FUEL_TYPE], + } @property def icon(self): """Return the icon to use in the frontend.""" - return ICON_HVAC - - @property - def device_state_attributes(self): - """Return the state attributes.""" - return self.coordinator.data[self.index][STATUS][HVAC] + return ICON_FUEL @property def state(self): """Return the state of the sensor.""" - return self.coordinator.data[self.index][STATUS][HVAC][HVAC_TEMPERATURE] + return self.coordinator.data[self.index][STATUS][ODOMETER][FUEL] -# Is disabled for now -class ToyotaEVSensor(ToyotaEntity): +class ToyotaOdometerSensor(ToyotaEntity): """Class for the fuel remaining sensor.""" @property def name(self): """Return the name of the sensor.""" - return f"{self.alias} battery" + return f"{self.alias} Odometer" @property def unique_id(self): """Return a unique identifier for this entity.""" - return f"{self.alias}/battery" + return f"{self.vin}/odometer" @property def unit_of_measurement(self): """Return the unit of measurement.""" - return PERCENTAGE + return self.coordinator.data[self.index][STATUS][ODOMETER][MILEAGE_UNIT] @property def icon(self): """Return the icon to use in the frontend.""" - return ICON_BATTERY - - @property - def device_state_attributes(self): - """Return the state attributes.""" - return self.coordinator.data[self.index][STATUS][BATTERY] + return ICON_ODOMETER @property def state(self): """Return the state of the sensor.""" - return self.coordinator.data[self.index][STATUS][BATTERY][ - "ChargeRemainingAmount" - ] + return self.coordinator.data[self.index][STATUS][ODOMETER][MILEAGE] diff --git a/poetry.lock b/poetry.lock index 37e07d5..fe37088 100644 --- a/poetry.lock +++ b/poetry.lock @@ -214,16 +214,16 @@ python-versions = "*" [[package]] name = "flake8" -version = "3.8.4" +version = "3.9.0" description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [package.dependencies] mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" +pycodestyle = ">=2.7.0,<2.8.0" +pyflakes = ">=2.3.0,<2.4.0" [[package]] name = "h11" @@ -235,7 +235,7 @@ python-versions = ">=3.6" [[package]] name = "homeassistant" -version = "2021.3.3" +version = "2021.3.4" description = "Open-source home automation platform running on Python 3." category = "main" optional = false @@ -298,14 +298,14 @@ http2 = ["h2 (>=3.0.0,<4.0.0)"] [[package]] name = "identify" -version = "2.1.2" +version = "2.2.1" description = "File identification library for Python" category = "dev" optional = false python-versions = ">=3.6.1" [package.extras] -license = ["editdistance"] +license = ["editdistance-s"] [[package]] name = "idna" @@ -317,7 +317,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "isort" -version = "5.7.0" +version = "5.8.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -355,11 +355,11 @@ data = ["language_data (>=1.0)"] [[package]] name = "lazy-object-proxy" -version = "1.5.2" +version = "1.6.0" description = "A fast and thorough lazy object proxy." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "markupsafe" @@ -395,7 +395,7 @@ python-versions = "*" [[package]] name = "mytoyota" -version = "0.1.4" +version = "0.2.1" description = "Python client for Toyota Connected Services." category = "main" optional = false @@ -404,6 +404,7 @@ python-versions = "*" [package.dependencies] httpx = "*" langcodes = "*" +pendulum = "*" [[package]] name = "nodeenv" @@ -421,6 +422,18 @@ category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + [[package]] name = "pre-commit" version = "2.11.1" @@ -439,7 +452,7 @@ virtualenv = ">=20.0.8" [[package]] name = "pycodestyle" -version = "2.6.0" +version = "2.7.0" description = "Python style guide checker" category = "dev" optional = false @@ -455,7 +468,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pyflakes" -version = "2.2.0" +version = "2.3.1" description = "passive checker of Python programs" category = "dev" optional = false @@ -492,6 +505,17 @@ toml = ">=0.7.1" [package.extras] docs = ["sphinx (==3.5.1)", "python-docs-theme (==2020.12)"] +[[package]] +name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + [[package]] name = "python-slugify" version = "4.0.1" @@ -514,6 +538,14 @@ category = "main" optional = false python-versions = "*" +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "pyyaml" version = "5.4.1" @@ -524,7 +556,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "regex" -version = "2020.11.13" +version = "2021.3.17" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -624,20 +656,20 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.3" +version = "1.26.4" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "virtualenv" -version = "20.4.2" +version = "20.4.3" description = "Virtual Python Environment builder" category = "dev" optional = false @@ -695,7 +727,7 @@ multidict = ">=4.0" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "92fb9ae6ad193de0160dcaa4e668750a7c6e968e0fcd9248fccab5e7acbdb411" +content-hash = "59044a356046fd41fea9170b6d579840ce2790b11b04d9afc6a15f5a4e192a7d" [metadata.files] aiohttp = [ @@ -872,16 +904,16 @@ filelock = [ {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, ] flake8 = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, + {file = "flake8-3.9.0-py2.py3-none-any.whl", hash = "sha256:12d05ab02614b6aee8df7c36b97d1a3b2372761222b19b58621355e82acddcff"}, + {file = "flake8-3.9.0.tar.gz", hash = "sha256:78873e372b12b093da7b5e5ed302e8ad9e988b38b063b61ad937f26ca58fc5f0"}, ] h11 = [ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, ] homeassistant = [ - {file = "homeassistant-2021.3.3-py3-none-any.whl", hash = "sha256:53a804924fbd120d5749cd5c87a08389510d7c796626df8b48e5f9acfcc01fc4"}, - {file = "homeassistant-2021.3.3.tar.gz", hash = "sha256:d4831319d3ac333dcc6544e942d96dbaef33e3d892f292a04d055ff82a045c4d"}, + {file = "homeassistant-2021.3.4-py3-none-any.whl", hash = "sha256:aedadd2416f9fdb8787f34bfaa19f4123b642acc45dc4c78fed79550b630763b"}, + {file = "homeassistant-2021.3.4.tar.gz", hash = "sha256:fedcef096e10bd52f504fc86ac8888d750f49056077cba1a0e3b0efe596d385f"}, ] httpcore = [ {file = "httpcore-0.12.3-py3-none-any.whl", hash = "sha256:93e822cd16c32016b414b789aeff4e855d0ccbfc51df563ee34d4dbadbb3bcdc"}, @@ -892,16 +924,16 @@ httpx = [ {file = "httpx-0.16.1.tar.gz", hash = "sha256:126424c279c842738805974687e0518a94c7ae8d140cd65b9c4f77ac46ffa537"}, ] identify = [ - {file = "identify-2.1.2-py2.py3-none-any.whl", hash = "sha256:fab0d3a3ab0d7d5f513985b0335ccccad9d61420c5216fb779237bf7edc3e5d1"}, - {file = "identify-2.1.2.tar.gz", hash = "sha256:e3b7fd755b7ceee44fe22957005a92c2a085c863c2e65a6efdec35d0e06666db"}, + {file = "identify-2.2.1-py2.py3-none-any.whl", hash = "sha256:9cc5f58996cd359b7b72f0a5917d8639de5323917e6952a3bfbf36301b576f40"}, + {file = "identify-2.2.1.tar.gz", hash = "sha256:1cfb05b578de996677836d5a2dde14b3dffde313cf7d2b3e793a0787a36e26dd"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] isort = [ - {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, - {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, + {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, + {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] jinja2 = [ {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, @@ -911,30 +943,28 @@ langcodes = [ {file = "langcodes-3.1.0.tar.gz", hash = "sha256:1ccd37e3a68760d29ec3b17f5962cd1d8f242f4d9705ad1601c5cb7fab48199c"}, ] lazy-object-proxy = [ - {file = "lazy-object-proxy-1.5.2.tar.gz", hash = "sha256:5944a9b95e97de1980c65f03b79b356f30a43de48682b8bdd90aa5089f0ec1f4"}, - {file = "lazy_object_proxy-1.5.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:e960e8be509e8d6d618300a6c189555c24efde63e85acaf0b14b2cd1ac743315"}, - {file = "lazy_object_proxy-1.5.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:522b7c94b524389f4a4094c4bf04c2b02228454ddd17c1a9b2801fac1d754871"}, - {file = "lazy_object_proxy-1.5.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:3782931963dc89e0e9a0ae4348b44762e868ea280e4f8c233b537852a8996ab9"}, - {file = "lazy_object_proxy-1.5.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:429c4d1862f3fc37cd56304d880f2eae5bd0da83bdef889f3bd66458aac49128"}, - {file = "lazy_object_proxy-1.5.2-cp35-cp35m-win32.whl", hash = "sha256:cd1bdace1a8762534e9a36c073cd54e97d517a17d69a17985961265be6d22847"}, - {file = "lazy_object_proxy-1.5.2-cp35-cp35m-win_amd64.whl", hash = "sha256:ddbdcd10eb999d7ab292677f588b658372aadb9a52790f82484a37127a390108"}, - {file = "lazy_object_proxy-1.5.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ecb5dd5990cec6e7f5c9c1124a37cb2c710c6d69b0c1a5c4aa4b35eba0ada068"}, - {file = "lazy_object_proxy-1.5.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b6577f15d5516d7d209c1a8cde23062c0f10625f19e8dc9fb59268859778d7d7"}, - {file = "lazy_object_proxy-1.5.2-cp36-cp36m-win32.whl", hash = "sha256:c8fe2d6ff0ff583784039d0255ea7da076efd08507f2be6f68583b0da32e3afb"}, - {file = "lazy_object_proxy-1.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:fa5b2dee0e231fa4ad117be114251bdfe6afe39213bd629d43deb117b6a6c40a"}, - {file = "lazy_object_proxy-1.5.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1d33d6f789697f401b75ce08e73b1de567b947740f768376631079290118ad39"}, - {file = "lazy_object_proxy-1.5.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:57fb5c5504ddd45ed420b5b6461a78f58cbb0c1b0cbd9cd5a43ad30a4a3ee4d0"}, - {file = "lazy_object_proxy-1.5.2-cp37-cp37m-win32.whl", hash = "sha256:e7273c64bccfd9310e9601b8f4511d84730239516bada26a0c9846c9697617ef"}, - {file = "lazy_object_proxy-1.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f4e5e68b7af950ed7fdb594b3f19a0014a3ace0fedb86acb896e140ffb24302"}, - {file = "lazy_object_proxy-1.5.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cadfa2c2cf54d35d13dc8d231253b7985b97d629ab9ca6e7d672c35539d38163"}, - {file = "lazy_object_proxy-1.5.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e7428977763150b4cf83255625a80a23dfdc94d43be7791ce90799d446b4e26f"}, - {file = "lazy_object_proxy-1.5.2-cp38-cp38-win32.whl", hash = "sha256:2f2de8f8ac0be3e40d17730e0600619d35c78c13a099ea91ef7fb4ad944ce694"}, - {file = "lazy_object_proxy-1.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:38c3865bd220bd983fcaa9aa11462619e84a71233bafd9c880f7b1cb753ca7fa"}, - {file = "lazy_object_proxy-1.5.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:8a44e9901c0555f95ac401377032f6e6af66d8fc1fbfad77a7a8b1a826e0b93c"}, - {file = "lazy_object_proxy-1.5.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fa7fb7973c622b9e725bee1db569d2c2ee64d2f9a089201c5e8185d482c7352d"}, - {file = "lazy_object_proxy-1.5.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:71a1ef23f22fa8437974b2d60fedb947c99a957ad625f83f43fd3de70f77f458"}, - {file = "lazy_object_proxy-1.5.2-cp39-cp39-win32.whl", hash = "sha256:ef3f5e288aa57b73b034ce9c1f1ac753d968f9069cd0742d1d69c698a0167166"}, - {file = "lazy_object_proxy-1.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:37d9c34b96cca6787fe014aeb651217944a967a5b165e2cacb6b858d2997ab84"}, + {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win32.whl", hash = "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93"}, + {file = "lazy_object_proxy-1.6.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f"}, + {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd"}, + {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8"}, + {file = "lazy_object_proxy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, + {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1038,8 +1068,8 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] mytoyota = [ - {file = "mytoyota-0.1.4-py3-none-any.whl", hash = "sha256:cf52ea9ed2aebfcdc1cad872eec660400b47b5c4cbbda7fb22b83d1d096a8526"}, - {file = "mytoyota-0.1.4.tar.gz", hash = "sha256:ac0ba14237f57ec2968d9392e988084366155ed4c450851a586e8a82e00ced37"}, + {file = "mytoyota-0.2.1-py3-none-any.whl", hash = "sha256:d55bd67285e23ff303ad5fbf9f67ee945b9c25eb761e463a20a8d76dd8ab1c81"}, + {file = "mytoyota-0.2.1.tar.gz", hash = "sha256:f759f3065074560532c1ca724765b257a030bb997b6657d0d91b1aaaf20bce43"}, ] nodeenv = [ {file = "nodeenv-1.5.0-py2.py3-none-any.whl", hash = "sha256:5304d424c529c997bc888453aeaa6362d242b6b4631e90f3d4bf1b290f1c84a9"}, @@ -1049,21 +1079,44 @@ pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, ] +pendulum = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] pre-commit = [ {file = "pre_commit-2.11.1-py2.py3-none-any.whl", hash = "sha256:94c82f1bf5899d56edb1d926732f4e75a7df29a0c8c092559c77420c9d62428b"}, {file = "pre_commit-2.11.1.tar.gz", hash = "sha256:de55c5c72ce80d79106e48beb1b54104d16495ce7f95b0c7b13d4784193a00af"}, ] pycodestyle = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, + {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, + {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, ] pycparser = [ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ] pyflakes = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, + {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, + {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pyjwt = [ {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, @@ -1073,6 +1126,10 @@ pylint = [ {file = "pylint-2.7.2-py3-none-any.whl", hash = "sha256:d09b0b07ba06bcdff463958f53f23df25e740ecd81895f7d2699ec04bbd8dc3b"}, {file = "pylint-2.7.2.tar.gz", hash = "sha256:0e21d3b80b96740909d77206d741aa3ce0b06b41be375d92e1f3244a274c1f8a"}, ] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] python-slugify = [ {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, ] @@ -1080,6 +1137,10 @@ pytz = [ {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, ] +pytzdata = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, @@ -1112,47 +1173,47 @@ pyyaml = [ {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"}, + {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"}, + {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"}, + {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"}, + {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"}, + {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"}, + {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"}, + {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"}, + {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"}, + {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"}, + {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"}, + {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"}, + {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"}, ] requests = [ {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, @@ -1236,12 +1297,12 @@ typing-extensions = [ {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, ] urllib3 = [ - {file = "urllib3-1.26.3-py2.py3-none-any.whl", hash = "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80"}, - {file = "urllib3-1.26.3.tar.gz", hash = "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73"}, + {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, + {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, ] virtualenv = [ - {file = "virtualenv-20.4.2-py2.py3-none-any.whl", hash = "sha256:2be72df684b74df0ea47679a7df93fd0e04e72520022c57b479d8f881485dbe3"}, - {file = "virtualenv-20.4.2.tar.gz", hash = "sha256:147b43894e51dd6bba882cf9c282447f780e2251cd35172403745fc381a0a80d"}, + {file = "virtualenv-20.4.3-py2.py3-none-any.whl", hash = "sha256:83f95875d382c7abafe06bd2a4cdd1b363e1bb77e02f155ebe8ac082a916b37c"}, + {file = "virtualenv-20.4.3.tar.gz", hash = "sha256:49ec4eb4c224c6f7dd81bb6d0a28a09ecae5894f4e593c89b0db0885f565a107"}, ] voluptuous = [ {file = "voluptuous-0.12.1-py3-none-any.whl", hash = "sha256:8ace33fcf9e6b1f59406bfaf6b8ec7bcc44266a9f29080b4deb4fe6ff2492386"}, diff --git a/pyproject.toml b/pyproject.toml index 8b05359..b062a99 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "toyota" -version = "0.1.0" +version = "0.2.0" description = "Toyota Connected Services integration for Home Assistant" authors = ["DurgNomis-drol "] license = "MIT" @@ -9,7 +9,7 @@ license = "MIT" python = "^3.8" langcodes = "^3.1.0" homeassistant = "^2021.3.3" -mytoyota = "^0.1.4" +mytoyota = "^0.2.1" [tool.poetry.dev-dependencies] pre-commit = "^2.11.1" diff --git a/tests/fixtures/gather_all_information.json b/tests/fixtures/gather_all_information.json new file mode 100644 index 0000000..9d918c7 --- /dev/null +++ b/tests/fixtures/gather_all_information.json @@ -0,0 +1,60 @@ +[ + { + "alias": "Aygo", + "vin": "JTXXXXXXXXXXXXXXX", + "details": { + "batteryHealth": "GOOD", + "claimedBy": "MT-XXXX", + "engine": "1.0 benzin (72 hk)", + "entitledBy": "MT-XXXX", + "entitledOn": "2021-03-10T09:20:42.152Z", + "exteriorColour": "1E0 ", + "fuel": "PETROL", + "fullKatashiki": "KDDD0L-ADDGDD", + "grade": "Mid/High", + "horsePower": 72, + "hybrid": false, + "id": 1111111, + "imageUrl": "https://dj3z27z47basa.cloudfront.net/5957a713-f80f-483f-998c-97f956367048", + "interiorColour": "20", + "isEntitled": true, + "isNC": true, + "licensePlate": "CXXXXXX", + "modelCode": "AY", + "modelDescription": "Aygo 2B", + "modelDocumentId": "12345", + "modelName": "Aygo 2B", + "owner": true, + "ownerFlag": true, + "productionYear": "2021", + "source": "NMSC", + "startDate": "2021-03-11T09:20:42.152Z", + "transmission": "5-trins man. gear", + "transmissionType": "MT", + "vehicleAddedOn": "2021-03-01T09:43:42.350Z" + }, + "status": { + "battery": null, + "hvac": null, + "odometer": { + "mileage": 250, + "mileage_unit": "km", + "Fuel": 29.02 + }, + "parking": { + "event": { + "lat": "56.111111", + "lon": "9.111111", + "address": null, + "timestamp": "1616936418000" + }, + "tripStatus": "0", + "energy": null, + "protectionState": null + } + }, + "servicesEnabled": { + "connectedServices": true + } + } +]