diff --git a/src/const.py b/src/const.py index 69738e1..2e40068 100644 --- a/src/const.py +++ b/src/const.py @@ -19,6 +19,8 @@ ENGINE_STATE_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/ BATTERY_CHARGE_STATE_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/battery-charge-level" FUEL_STATE_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/fuel" STATISTICS_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/statistics" +DISTANCE_TO_EMPTY_URL = "https://api.volvocars.com/extended-vehicle/v1/vehicles/{0}/resources/distanceToEmpty" +WASHER_FLUID_LEVEL_URL = "https://api.volvocars.com/extended-vehicle/v1/vehicles/{0}/resources/washerFluidLevel" units = { "en_GB": { @@ -79,5 +81,7 @@ supported_entities = [ {"name": "Engine State", "domain": "sensor", "id": "engine_state", "icon": "engine", "url": ENGINE_STATE_URL}, {"name": "Fuel Level", "domain": "sensor", "id": "fuel_level", "unit": "liters", "icon": "fuel", "url": FUEL_STATE_URL}, {"name": "Average Fuel Consumption", "domain": "sensor", "id": "average_fuel_consumption", "unit": "liters", "icon": "fuel", "url": STATISTICS_URL}, - {"name": "Average Speed", "domain": "sensor", "id": "average_speed", "unit": "km/h" if not units.get(settings["babelLocale"]) else units[settings["babelLocale"]]["average_speed"]["unit"], "icon": "speedometer", "url": STATISTICS_URL} + {"name": "Average Speed", "domain": "sensor", "id": "average_speed", "unit": "km/h" if not units.get(settings["babelLocale"]) else units[settings["babelLocale"]]["average_speed"]["unit"], "icon": "speedometer", "url": STATISTICS_URL}, + {"name": "Distance to Empty", "domain": "sensor", "id": "distance_to_empty", "unit": "km" if not units.get(settings["babelLocale"]) else units[settings["babelLocale"]]["odometer"]["unit"], "icon": "map-marker-distance", "url": DISTANCE_TO_EMPTY_URL}, + {"name": "Washer Fluid Level", "domain": "sensor", "id": "washer_fluid_level", "icon": "wiper-wash", "url": WASHER_FLUID_LEVEL_URL}, ] diff --git a/src/volvo.py b/src/volvo.py index e272f2e..f71d22f 100644 --- a/src/volvo.py +++ b/src/volvo.py @@ -205,6 +205,9 @@ def api_call(url, method, vin, sensor_id=None, force_update=False): print("Car in use, cannot start pre climatization") mqtt.assumed_climate_state[vin] = "OFF" mqtt.update_car_data() + elif "extended-vehicle" in url and response.status_code == 403: + # Suppress 403 errors for unsupported extended-vehicle api cars + return None else: print("API Call failed. Status Code: " + str(response.status_code) + ". Error: " + response.text) return None @@ -225,10 +228,10 @@ def cached_request(url, method, vin, force_update=False): data = {"response": response, "last_update": datetime.now(util.TZ)} cached_requests[vin + "_" + url] = data else: - if (datetime.now(util.TZ) - cached_requests[vin + "_" + url]["last_update"]).total_seconds() >= settings[ - "updateInterval"] \ - or (force_update and ( - datetime.now(util.TZ) - cached_requests[vin + "_" + url]["last_update"]).total_seconds() >= 2): + if (datetime.now(util.TZ) - cached_requests[vin + "_" + url]["last_update"]).total_seconds() \ + >= settings["updateInterval"] or (force_update and + (datetime.now(util.TZ) - cached_requests[vin + "_" + url] + ["last_update"]).total_seconds() >= 2): # Old Data in Cache, or force mode active, updating print("Starting " + method + " call against " + url) try: @@ -380,5 +383,10 @@ def parse_api_data(data, sensor_id=None): "latitude": raw_data["coordinates"][1], "gps_accuracy": 1} return coordinates + elif sensor_id == "distance_to_empty": + return util.convert_metric_values(data["distanceToEmpty"]["value"]) \ + if util.keys_exists(data, "distanceToEmpty") else None + elif sensor_id == "washer_fluid_level": + return data["washerFluidLevel"]["value"] if util.keys_exists(data, "washerFluidLevel") else None else: return None