Compare commits

...
2 Commits
Author SHA1 Message Date
Linus Dietz 1d07644a9c Rework api data handling 2023-06-22 16:45:00 +02:00
Linus Dietz e0152fa82d Breaking change: change mqtt entity ids 2023-06-22 15:48:03 +02:00
4 changed files with 32 additions and 37 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
name: "Volvo2Mqtt"
description: "Volvo AAOS MQTT bridge"
version: "1.2.0"
version: "1.2.1"
slug: "volvo2mqtt"
init: false
url: "https://github.com/Dielee/volvo2mqtt"
+1 -1
View File
@@ -1,6 +1,6 @@
from config import settings
VERSION = "v1.2.0"
VERSION = "v1.2.1"
OAUTH_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
VEHICLES_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles"
+5 -6
View File
@@ -133,10 +133,9 @@ def create_ha_devices():
for device_tracker in supported_device_trackers:
config = {
"name": device_tracker['name'],
"object_id": device_tracker['id'],
"object_id": f"volvo_{vin}_{device_tracker['id']}",
"schema": "state",
"icon": f"mdi:{device_tracker['icon']}",
"state_topic": f"homeassistant/device_tracker/{vin}_{device_tracker['id']}/state",
"device": device,
"unique_id": f"volvoAAOS2mqtt_{vin}_{device_tracker['id']}",
@@ -151,7 +150,7 @@ def create_ha_devices():
command_topic = f"homeassistant/button/{vin}_{button['id']}/command"
config = {
"name": button['name'],
"object_id": button['id'],
"object_id": f"volvo_{vin}_{button['id']}",
"schema": "state",
"icon": f"mdi:{button['icon']}",
"state_topic": f"homeassistant/button/{vin}_{button['id']}/state",
@@ -170,7 +169,7 @@ def create_ha_devices():
command_topic = f"homeassistant/lock/{vin}_{lock['id']}/command"
config = {
"name": lock['name'],
"object_id": lock['id'],
"object_id": f"volvo_{vin}_{lock['id']}",
"schema": "state",
"icon": f"mdi:{lock['icon']}",
"state_topic": f"homeassistant/lock/{vin}_{lock['id']}/state",
@@ -190,7 +189,7 @@ def create_ha_devices():
command_topic = f"homeassistant/switch/{vin}_{switch['id']}/command"
config = {
"name": switch['name'],
"object_id": switch['id'],
"object_id": f"volvo_{vin}_{switch['id']}",
"schema": "state",
"icon": f"mdi:{switch['icon']}",
"state_topic": f"homeassistant/switch/{vin}_{switch['id']}/state",
@@ -209,7 +208,7 @@ def create_ha_devices():
for sensor in supported_sensors:
config = {
"name": sensor['name'],
"object_id": sensor['id'],
"object_id": f"volvo_{vin}_{sensor['id']}",
"schema": "state",
"icon": f"mdi:{sensor['icon']}",
"state_topic": f"homeassistant/sensor/{vin}_{sensor['id']}/state",
+25 -29
View File
@@ -180,7 +180,12 @@ def api_call(url, method, vin, sensor_id=None, force_update=False):
else:
print("API Call failed. Status Code: " + str(response.status_code) + ". Error: " + response.text)
return ""
return parse_api_data(data, sensor_id)
state = parse_api_data(data, sensor_id)
if not state:
return ""
else:
return state
def pull_door_api(url, method, vin, force_update=False):
@@ -248,18 +253,12 @@ def pull_recharge_api(url, method, vin, force_update=False):
def parse_api_data(data, sensor_id=None):
if sensor_id == "battery_charge_level":
if "batteryChargeLevel" in data["data"]:
return data["data"]["batteryChargeLevel"]["value"]
else:
return ""
return data["data"].get("batteryChargeLevel").get("value")
elif sensor_id == "electric_range":
if "electricRange" in data["data"]:
return data["data"]["electricRange"]["value"]
else:
return ""
return data["data"].get("electricRange").get("value")
elif sensor_id == "charging_system_status":
if "chargingSystemStatus" in data["data"]:
return charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
return charging_system_states[data["data"].get("chargingSystemStatus").get("value")]
else:
return ""
elif sensor_id == "estimated_charging_time":
@@ -273,9 +272,9 @@ def parse_api_data(data, sensor_id=None):
return ""
elif sensor_id == "estimated_charging_finish_time":
if "chargingSystemStatus" in data["data"]:
charging_system_state = charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
charging_system_state = charging_system_states[data["data"].get("chargingSystemStatus").get("value")]
if charging_system_state == "Charging":
charging_time = int(data["data"]["estimatedChargingTime"]["value"])
charging_time = int(data["data"].get("estimatedChargingTime").get("value"))
charging_finished = datetime.now() + timedelta(minutes=charging_time)
return format_datetime(charging_finished, format="medium", locale=settings["babelLocale"])
else:
@@ -283,38 +282,35 @@ def parse_api_data(data, sensor_id=None):
else:
return None
elif sensor_id == "lock_status":
return data["data"]["carLocked"]["value"]
return data["data"].get("carLocked").get("value")
elif sensor_id == "odometer":
return data["data"]["odometer"]["value"]
return data["data"].get("odometer").get("value")
elif sensor_id == "window_front_left":
return data["data"]["frontLeftWindowOpen"]["value"]
return data["data"].get("frontLeftWindowOpen").get("value")
elif sensor_id == "window_front_right":
return data["data"]["frontRightWindowOpen"]["value"]
return data["data"].get("frontRightWindowOpen").get("value")
elif sensor_id == "window_rear_left":
return data["data"]["rearLeftWindowOpen"]["value"]
return data["data"].get("rearLeftWindowOpen").get("value")
elif sensor_id == "window_rear_right":
return data["data"]["rearRightWindowOpen"]["value"]
return data["data"].get("rearRightWindowOpen").get("value")
elif sensor_id == "door_front_left":
return data["data"]["frontLeftDoorOpen"]["value"]
return data["data"].get("frontLeftDoorOpen").get("value")
elif sensor_id == "door_front_right":
return data["data"]["frontRightDoorOpen"]["value"]
return data["data"].get("frontRightDoorOpen").get("value")
elif sensor_id == "door_rear_left":
return data["data"]["rearLeftDoorOpen"]["value"]
return data["data"].get("rearLeftDoorOpen").get("value")
elif sensor_id == "door_rear_right":
return data["data"]["rearRightDoorOpen"]["value"]
return data["data"].get("rearRightDoorOpen").get("value")
elif sensor_id == "tailgate":
return data["data"]["tailGateOpen"]["value"]
return data["data"].get("tailGateOpen").get("value")
elif sensor_id == "engine_hood":
return data["data"]["hoodOpen"]["value"]
return data["data"].get("hoodOpen").get("value")
elif sensor_id == "tank_lid":
if "tankLidOpen" in data["data"]:
return data["data"]["tankLidOpen"]["value"]
else:
return ""
return data["data"].get("tankLidOpen").get("value")
elif sensor_id == "location":
coordinates = {}
if "geometry" in data["data"]:
raw_data = data["data"]["geometry"]["coordinates"]
raw_data = data["data"].get("geometry").get("coordinates")
coordinates = {"longitude": raw_data[0], "latitude": raw_data[1], "gps_accuracy": 1}
return coordinates
else: