diff --git a/src/CHANGELOG.md b/src/CHANGELOG.md index 0a1c933..d414b0c 100644 --- a/src/CHANGELOG.md +++ b/src/CHANGELOG.md @@ -1,3 +1,8 @@ +## v1.7.9 +### 🚀 Features: + +- Added vehicle diagnostics sensors #75. Thanks to @aerrow5! + ## v1.7.8 ### 🐛 Bug Fixes: diff --git a/src/config.yaml b/src/config.yaml index 4db207e..d6536c4 100644 --- a/src/config.yaml +++ b/src/config.yaml @@ -1,6 +1,6 @@ name: "Volvo2Mqtt" description: "Volvo AAOS MQTT bridge" -version: "1.7.8" +version: "1.7.9" slug: "volvo2mqtt" init: false url: "https://github.com/Dielee/volvo2mqtt" diff --git a/src/const.py b/src/const.py index 76f352c..ce321cc 100644 --- a/src/const.py +++ b/src/const.py @@ -1,6 +1,6 @@ from config import settings -VERSION = "v1.7.8" +VERSION = "v1.7.9" OAUTH_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2" VEHICLES_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles" @@ -20,6 +20,7 @@ BATTERY_CHARGE_STATE_URL = "https://api.volvocars.com/connected-vehicle/v2/vehic 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" ENGINE_DIAGNOSTICS_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/engine" +VEHICLE_DIAGNOSTICS_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/diagnostics" units = { "en_GB": { @@ -109,5 +110,10 @@ supported_entities = [ {"name": "Fuel Level", "domain": "sensor", "id": "fuel_level", "unit": "liters", "icon": "fuel", "url": FUEL_STATE_URL, "state_class": "measurement"}, {"name": "Average Fuel Consumption", "domain": "sensor", "id": "average_fuel_consumption", "unit": "liters", "icon": "fuel", "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"]]["distance_to_empty"]["unit"], "icon": "map-marker-distance", "url": STATISTICS_URL, "state_class": "measurement"}, - {"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, "state_class": "measurement"} + {"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, "state_class": "measurement"}, + {"name": "Hours to Service", "domain": "sensor", "id": "hours_to_service", "unit": "hour", "icon": "wrench-clock", "url": VEHICLE_DIAGNOSTICS_URL}, + {"name": "Distance to Service", "domain": "sensor", "id": "km_to_service", "unit": "km" if not units.get(settings["babelLocale"]) else units[settings["babelLocale"]]["distance_to_service"]["unit"], "icon": "wrench-clock", "url": VEHICLE_DIAGNOSTICS_URL}, + {"name": "Months to Service", "domain": "sensor", "id": "months_to_service", "unit": "month", "icon": "wrench-clock", "url": VEHICLE_DIAGNOSTICS_URL}, + {"name": "Service warning status", "domain": "sensor", "id": "service_warning_status", "icon": "alert-outline", "url": VEHICLE_DIAGNOSTICS_URL}, + {"name": "Service warning trigger", "domain": "sensor", "id": "service_warning_trigger", "icon": "alert-outline", "url": VEHICLE_DIAGNOSTICS_URL} ] diff --git a/src/volvo.py b/src/volvo.py index 2bb50f8..7df81e1 100644 --- a/src/volvo.py +++ b/src/volvo.py @@ -228,7 +228,8 @@ def api_call(url, method, vin, sensor_id=None, force_update=False): if datetime.now(util.TZ) >= token_expires_at: refresh_auth() - if url in [RECHARGE_STATE_URL, WINDOWS_STATE_URL, LOCK_STATE_URL, TYRE_STATE_URL, STATISTICS_URL]: + if url in [RECHARGE_STATE_URL, WINDOWS_STATE_URL, LOCK_STATE_URL, TYRE_STATE_URL, + STATISTICS_URL, ENGINE_DIAGNOSTICS_URL]: # Minimize API calls for endpoints with multiple values response = cached_request(url, method, vin, force_update) if response is None: @@ -436,5 +437,19 @@ def parse_api_data(data, sensor_id=None): if distance_to_empty > 0: return util.convert_metric_values(data["distanceToEmpty"]["value"]) return None + elif sensor_id == "hours_to_service": + return data["engineHoursToService"]["value"] if util.keys_exists(data, "engineHoursToService") else None + elif sensor_id == "km_to_service": + if util.keys_exists(data, "kmToService"): + km_to_service = int(data["kmToService"]["value"]) + if km_to_service > 0: + return util.convert_metric_values(data["kmToService"]["value"]) + return None + elif sensor_id == "months_to_service": + return data["monthsToService"]["value"] if util.keys_exists(data, "monthsToService") else None + elif sensor_id == "service_warning_status": + return data["serviceWarningStatus"]["value"] if util.keys_exists(data, "serviceWarningStatus") else None + elif sensor_id == "service_warning_trigger": + return data["serviceWarningTrigger"]["value"] if util.keys_exists(data, "serviceWarningTrigger") else None else: return None