Compare commits

...
3 Commits
Author SHA1 Message Date
Linus Dietz 96805d439d Add interior and exterior image entities #62 2023-07-09 16:06:13 +02:00
Linus DietzandGitHub 10c3e7bd97 Update README.md 2023-07-06 22:05:46 +02:00
Dielee ad691b6153 Update CHANGELOG.md 2023-07-06 13:26:56 +02:00
6 changed files with 83 additions and 12 deletions
+1 -1
View File
@@ -42,7 +42,7 @@ Please let me know if your car works with this addon so I can expand the list!<b
- Sensor "Battery Charge Level"
- Sensor "Electric Range"
- Sensor "Charging System Status"
- Sensor "Charging Connection Status"
- Sensor "Charging Connection Status" (partly broken since 2.10 car update)
- Sensor "Estimated Charging Finish Time"
- Sensor "Door Lock Status (All doors, tank lid, and engine hood)"
- Sensor "Window Lock Status (All windows and sunroof - Thanks to @navet)"
+12
View File
@@ -1,3 +1,15 @@
## v1.7.6
### 🚀 Features:
- Added support for interior and exterior images via the new [MQTT Image](https://www.home-assistant.io/integrations/image.mqtt/) entity. #62
<b>NOTE: This feature is only available using homeassistant version 2023.7.1 or greater.</b>
## v1.7.5
### 🚀 Features:
- Added support for `LOCKING` and `UNLOCKING` state (Lock entity)
## v1.7.4
### 🐛 Bug Fixes:
+1 -1
View File
@@ -1,6 +1,6 @@
name: "Volvo2Mqtt"
description: "Volvo AAOS MQTT bridge"
version: "1.7.4"
version: "1.7.6"
slug: "volvo2mqtt"
init: false
url: "https://github.com/Dielee/volvo2mqtt"
+2 -2
View File
@@ -1,6 +1,6 @@
from config import settings
VERSION = "v1.7.4"
VERSION = "v1.7.6"
OAUTH_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
VEHICLES_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles"
@@ -52,7 +52,7 @@ door_states = {"CLOSED": "OFF", "OPEN": "ON"}
engine_states = {"RUNNING": "ON", "STOPPED": "OFF", "true": "ON", "false": "OFF"}
icon_states = {
"lock_status": {"UNLOCKED": "lock-open-alert", "LOCKED": "lock"},
"lock_status": {"UNLOCKED": "lock-open-alert", "LOCKED": "lock", "UNLOCKING": "lock-reset", "LOCKING": "lock-reset"},
"door_front_left": {"ON": "car-door", "OFF": "car-door-lock"},
"door_front_right": {"ON": "car-door", "OFF": "car-door-lock"},
"door_rear_left": {"ON": "car-door", "OFF": "car-door-lock"},
+52 -8
View File
@@ -42,6 +42,43 @@ def connect():
mqtt_client = client
def send_car_images(vin, data, device):
if util.keys_exists(data, "images"):
for entity in [{"name": "Exterior Image", "id": "exterior_image"},
{"name": "Interior Image", "id": "interior_image"}]:
url_topic = f"homeassistant/image/{vin}_{entity['id']}/image_url"
config = {
"name": entity["name"],
"object_id": f"volvo_{vin}_{entity['id']}",
"schema": "state",
"icon": "mdi:image-area",
"url_topic": url_topic,
"device": device,
"unique_id": f"volvoAAOS2mqtt_{vin}_{entity['id']}",
"availability_topic": availability_topic
}
mqtt_client.publish(
f"homeassistant/image/volvoAAOS2mqtt/{vin}_{entity['id']}/config",
json.dumps(config),
retain=True
)
if entity["id"] == "exterior_image":
mqtt_client.publish(
url_topic,
data["images"]["exteriorDefaultUrl"],
retain=True
)
if entity["id"] == "interior_image":
mqtt_client.publish(
url_topic,
data["images"]["interiorDefaultUrl"],
retain=True
)
def on_connect(client, userdata, flags, rc):
send_heartbeat()
if len(subscribed_topics) > 0:
@@ -96,15 +133,21 @@ def on_message(client, userdata, msg):
update_car_data()
elif "lock_status" in msg.topic:
if payload == "LOCK":
volvo.api_call(CAR_LOCK_URL, "POST", vin)
# Start the api call in another thread for HA performance
Thread(target=volvo.api_call, args=(CAR_LOCK_URL, "POST", vin)).start()
# Force set unlocked state in HA because of slow api response
update_car_data(True, {"entity_id": "lock_status", "vin": vin, "state": "LOCKED"})
# Force set locking state
update_car_data(False, {"entity_id": "lock_status", "vin": vin, "state": "LOCKING"})
# Fetch API lock state until locking finished
Thread(target=volvo.check_lock_status, args=(vin, "UNLOCKED")).start()
elif payload == "UNLOCK":
volvo.api_call(CAR_UNLOCK_URL, "POST", vin)
# Start the api call in another thread for HA performance
Thread(target=volvo.api_call, args=(CAR_UNLOCK_URL, "POST", vin)).start()
# Force set unlocked state in HA because of slow api response
update_car_data(True, {"entity_id": "lock_status", "vin": vin, "state": "UNLOCKED"})
# Force set unlocking state
update_car_data(False, {"entity_id": "lock_status", "vin": vin, "state": "UNLOCKING"})
# Fetch API lock state until unlocking finished
Thread(target=volvo.check_lock_status, args=(vin, "LOCKED")).start()
elif "update_data" in msg.topic:
if payload == "PRESS":
update_car_data(True)
@@ -226,12 +269,13 @@ def create_ha_devices():
if entity.get("domain") == "device_tracker":
config["json_attributes_topic"] = f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/attributes"
if entity.get("domain") in ["switch", "lock", "button"]:
elif entity.get("domain") in ["switch", "lock", "button"]:
command_topic = f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/command"
config["command_topic"] = command_topic
subscribed_topics.append(command_topic)
mqtt_client.subscribe(command_topic)
elif entity.get("domain") == "image":
config["url_topic"] = f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/image_url"
mqtt_client.publish(
f"homeassistant/{entity['domain']}/volvoAAOS2mqtt/{vin}_{entity['id']}/config",
+15
View File
@@ -125,6 +125,7 @@ def get_vehicle_details(vin):
"model": data['descriptions']['model'],
"name": f"{data['descriptions']['model']} ({data['modelYear']}) - {vin}",
}
mqtt.send_car_images(vin, data, device)
elif response.status_code == 500 and not settings.volvoData["vin"]:
# Workaround for some cars that are not returning vehicle details
device = {
@@ -179,6 +180,20 @@ def disable_climate(vin):
mqtt.update_car_data()
def check_lock_status(vin, old_state):
max_runs = 10
done_runs = 0
lock_state = api_call(LOCK_STATE_URL, "GET", vin, "lock_status", True)
while lock_state == old_state:
done_runs = done_runs + 1
if done_runs >= max_runs:
break
lock_state = api_call(LOCK_STATE_URL, "GET", vin, "lock_status", True)
time.sleep(2)
mqtt.update_car_data()
def check_engine_status(vin):
endpoint_url = ""
engine_state_supported = False