Compare commits

..
6 Commits
Author SHA1 Message Date
Linus Dietz 3be0a4edbf Bump version 2023-11-20 07:49:34 +01:00
Linus Dietz 22cf71f007 Fix distance to empty sensor 2023-11-20 07:46:37 +01:00
Linus Dietz b7feb9713b Remove unused service warning trigger 2023-11-20 07:43:42 +01:00
Linus DietzandGitHub 1f53ef0198 Update CHANGELOG.md 2023-11-17 17:58:31 +01:00
Linus Dietz d07e6dfe6e Add "Time to Service" sensor 2023-11-17 17:57:30 +01:00
Linus Dietz 80473d5120 Fix apparmor for Debian 12 2023-11-11 14:56:41 +01:00
6 changed files with 50 additions and 27 deletions
+13
View File
@@ -1,3 +1,16 @@
## v1.8.14
### 🐛 Bug Fixes:
- Fix distance to empty sensor #127
- Remove unused service warning trigger sensor
## v1.8.13
### 🐛 Bug Fixes:
- Add "Time to Service" sensor #125<p>
<b>Breaking change: The "Months to Service" sensor will be automatically deleted.<br>
"Time to Service" contains this information now.
## v1.8.12 ## v1.8.12
### 🐛 Bug Fixes: ### 🐛 Bug Fixes:
+2
View File
@@ -4,8 +4,10 @@ profile volvo2mqtt flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/base> #include <abstractions/base>
# Capabilities # Capabilities
capability,
file, file,
signal (send) set=(kill,term,int,hup,cont), signal (send) set=(kill,term,int,hup,cont),
network,
# S6-Overlay # S6-Overlay
/init ix, /init ix,
+1 -1
View File
@@ -1,6 +1,6 @@
name: "Volvo2Mqtt" name: "Volvo2Mqtt"
description: "Volvo AAOS MQTT bridge" description: "Volvo AAOS MQTT bridge"
version: "1.8.12" version: "1.8.14"
slug: "volvo2mqtt" slug: "volvo2mqtt"
init: false init: false
url: "https://github.com/Dielee/volvo2mqtt" url: "https://github.com/Dielee/volvo2mqtt"
+5 -4
View File
@@ -1,6 +1,6 @@
from config import settings from config import settings
VERSION = "v1.8.12" VERSION = "v1.8.14"
OAUTH_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2" OAUTH_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
VEHICLES_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles" VEHICLES_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles"
@@ -114,7 +114,8 @@ supported_entities = [
{"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": "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": "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": "Time to Service", "domain": "sensor", "id": "time_to_service", "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 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}
] ]
old_entity_ids = ["months_to_service", "service_warning_trigger"]
+7 -2
View File
@@ -10,8 +10,7 @@ from datetime import datetime
from babel.dates import format_datetime from babel.dates import format_datetime
from config import settings from config import settings
from const import CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_LOCK_URL, \ from const import CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_LOCK_URL, \
CAR_UNLOCK_URL, availability_topic, icon_states CAR_UNLOCK_URL, availability_topic, icon_states, old_entity_ids
mqtt_client: mqtt.Client mqtt_client: mqtt.Client
subscribed_topics = [] subscribed_topics = []
@@ -361,3 +360,9 @@ def send_heartbeat():
def send_offline(): def send_offline():
mqtt_client.publish(availability_topic, "offline") mqtt_client.publish(availability_topic, "offline")
def delete_old_entities():
for vin in volvo.vins:
for entity in old_entity_ids:
topic = f"homeassistant/sensor/volvoAAOS2mqtt/{vin}_{entity}/config"
mqtt_client.publish(topic, payload="", retain=True)
+10 -8
View File
@@ -116,6 +116,7 @@ def get_vehicles():
else: else:
initialize_climate(vins) initialize_climate(vins)
initialize_scheduler(vins) initialize_scheduler(vins)
mqtt.delete_old_entities()
logging.info("Vin: " + str(vins) + " found!") logging.info("Vin: " + str(vins) + " found!")
@@ -364,7 +365,7 @@ def api_call(url, method, vin, sensor_id=None, force_update=False, key_change=Fa
return None return None
elif response.status_code == 403 and "message" in data: elif response.status_code == 403 and "message" in data:
if "Out of call volume quota" in data["message"]: if "Out of call volume quota" in data["message"]:
logging.warn("Quota extended. Try to change VCCAPIKEY!") logging.warning("Quota extended. Try to change VCCAPIKEY!")
change_vcc_api_key() change_vcc_api_key()
api_call(url, method, vin, sensor_id, force_update, True) api_call(url, method, vin, sensor_id, force_update, True)
else: else:
@@ -535,10 +536,10 @@ def parse_api_data(data, sensor_id=None):
"gps_accuracy": 1} "gps_accuracy": 1}
return coordinates return coordinates
elif sensor_id == "distance_to_empty": elif sensor_id == "distance_to_empty":
if util.keys_exists(data, "distanceToEmpty"): if util.keys_exists(data, "distanceToEmptyTank"):
distance_to_empty = int(data["distanceToEmpty"]["value"]) distance_to_empty = int(data["distanceToEmptyTank"]["value"])
if distance_to_empty > 0: if distance_to_empty > 0:
return util.convert_metric_values(data["distanceToEmpty"]["value"]) return util.convert_metric_values(data["distanceToEmptyTank"]["value"])
return None return None
elif sensor_id == "hours_to_service": elif sensor_id == "hours_to_service":
return data["engineHoursToService"]["value"] if util.keys_exists(data, "engineHoursToService") else None return data["engineHoursToService"]["value"] if util.keys_exists(data, "engineHoursToService") else None
@@ -548,11 +549,12 @@ def parse_api_data(data, sensor_id=None):
if km_to_service > 0: if km_to_service > 0:
return util.convert_metric_values(data["distanceToService"]["value"]) return util.convert_metric_values(data["distanceToService"]["value"])
return None return None
elif sensor_id == "months_to_service": elif sensor_id == "time_to_service":
return data["timeToService"]["value"] if util.keys_exists(data, "timeToService") else None if util.keys_exists(data, "timeToService"):
return str(data["timeToService"]["value"]) + " " + data["timeToService"]["unit"]
else:
return None
elif sensor_id == "service_warning_status": elif sensor_id == "service_warning_status":
return data["serviceWarning"]["value"] if util.keys_exists(data, "serviceWarning") else None return data["serviceWarning"]["value"] if util.keys_exists(data, "serviceWarning") else None
elif sensor_id == "service_warning_trigger":
return data["serviceTrigger"]["value"] if util.keys_exists(data, "serviceTrigger") else None
else: else:
return None return None