Compare commits

...
9 Commits
Author SHA1 Message Date
Linus Dietz 710ca2fcbc Bump version 2024-08-09 09:32:21 +02:00
Linus Dietz c1998f8938 Rework image function 2024-08-09 09:30:04 +02:00
Linus Dietz 693e0b0048 Fix typo 2024-08-09 08:26:22 +02:00
Linus Dietz f23f56e45e Take care of corrupted token files #220 2024-08-09 08:25:17 +02:00
Linus Dietz 17eaa8dde2 Added retain status to survive HA reboots #210 2024-07-29 10:10:59 +02:00
Linus DietzandGitHub 8f3bf5f3b1 add addon changelog 2024-07-08 11:22:52 +02:00
Linus DietzandGitHub 9d4f8fab0c Bump addon version 2024-07-08 11:21:24 +02:00
Linus Dietz 414ac503b1 Fix backend status URL #209 #208 2024-07-08 10:52:54 +02:00
Linus Dietz 18926b67e4 Fix typo 2024-05-29 20:11:36 +02:00
5 changed files with 69 additions and 23 deletions
+16
View File
@@ -1,3 +1,19 @@
## v1.9.6
### 🐛 Bug Fixes:
- Fixed interior and exterior Images #219
- Take care of broken token files #220
## v1.9.5
### 🚀 Features:
- Added "retain" states to survive HA reboot
## v1.9.4
### 🐛 Bug Fixes:
- Fix backend state API url
## v1.9.3
### 🐛 Bug Fixes:
+1 -1
View File
@@ -1,6 +1,6 @@
name: "Volvo2Mqtt"
description: "Volvo AAOS MQTT bridge"
version: "1.9.3"
version: "1.9.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.9.3"
VERSION = "v1.9.6"
OAUTH_TOKEN_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
OAUTH_AUTH_URL = "https://volvoid.eu.volvocars.com/as/authorization.oauth2"
@@ -22,7 +22,7 @@ STATISTICS_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/st
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"
WARNINGS_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/warnings"
API_BACKEND_STATUS = "https://oip-dev-bff.euwest1.production.volvo.care/api/v1/backend-status"
API_BACKEND_STATUS = "https://public-developer-portal-bff.weu-prod.ecpaz.volvocars.biz/api/v1/backend-status"
LENGTH_KILOMETERS = "km"
SPEED_KILOMETERS_PER_HOUR = "km/h"
+43 -17
View File
@@ -5,6 +5,7 @@ import json
import volvo
import util
import os
import requests
from threading import Thread, Timer
from datetime import datetime
from babel.dates import format_datetime
@@ -84,13 +85,14 @@ 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"
image_topic = f"homeassistant/image/{vin}_{entity['id']}/image_topic"
config = {
"name": entity["name"],
"object_id": f"volvo_{vin}_{entity['id']}",
"schema": "state",
"icon": "mdi:image-area",
"url_topic": url_topic,
"content_type": "image/png",
"image_topic": image_topic,
"device": device,
"unique_id": f"volvoAAOS2mqtt_{vin}_{entity['id']}",
"availability_topic": availability_topic
@@ -102,19 +104,41 @@ def send_car_images(vin, data, device):
retain=True
)
headers = {"User-Agent": "(Windows NT 10.0; Win64; x64)",
"sec-ch-ua-platform": "\"Windows\"", "sec-fetch-dest": "document", "Accept-Encoding": "gzip, deflate, br, zstd",
"sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "upgrade-insecure-requests": "1"}
# Post exterior image
if entity["id"] == "exterior_image":
mqtt_client.publish(
url_topic,
data["images"]["exteriorImageUrl"],
retain=True
)
if not os.path.exists("exterior_image.png"):
response = requests.get(data["images"]["exteriorImageUrl"], headers=headers)
if response.status_code == 200:
with open("exterior_image.png", 'wb') as image:
image.write(response.content)
if os.path.exists("exterior_image.png"):
ext_image = open("exterior_image.png", mode="rb").read()
mqtt_client.publish(
image_topic,
ext_image,
retain=True
)
if entity["id"] == "interior_image":
mqtt_client.publish(
url_topic,
data["images"]["internalImageUrl"],
retain=True
)
# Post interior Image
if not os.path.exists("interior_image.png"):
response = requests.get(data["images"]["internalImageUrl"], headers=headers)
if response.status_code == 200:
with open("interior_image.png", 'wb') as image:
image.write(response.content)
if os.path.exists("interior_image.png"):
int_image = open("interior_image.png", mode="rb").read()
mqtt_client.publish(
image_topic,
int_image,
retain=True
)
def on_connect(client, userdata, flags, rc):
@@ -136,7 +160,7 @@ def on_message(client, userdata, msg):
otp_code = payload
set_otp_state()
else:
logging.warning("Found retained OTP, this can't work! Pleas clean retained messages!")
logging.warning("Found retained OTP, this can't work! Please clean retained messages!")
return None
else:
try:
@@ -316,7 +340,8 @@ def update_car_data(force_update=False, overwrite={}):
elif entity["id"] == "warnings":
mqtt_client.publish(
f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/attributes",
json.dumps(state)
json.dumps(state),
retain=True
)
if state:
state = sum(value == "FAILURE" for value in state.values())
@@ -330,7 +355,8 @@ def update_car_data(force_update=False, overwrite={}):
if state or state == 0:
mqtt_client.publish(
topic,
json.dumps(state) if isinstance(state, dict) or isinstance(state, list) else state
json.dumps(state) if isinstance(state, dict) or isinstance(state, list) else state,
retain=True
)
update_ha_device(entity, vin, state)
@@ -441,11 +467,11 @@ def create_ha_devices():
def send_heartbeat():
mqtt_client.publish(availability_topic, "online")
mqtt_client.publish(availability_topic, "online", retain=True)
def send_offline():
mqtt_client.publish(availability_topic, "offline")
mqtt_client.publish(availability_topic, "offline", retain=True)
def delete_old_entities():
+7 -3
View File
@@ -40,9 +40,13 @@ def authorize(renew_tokenfile=False):
if os.path.isfile(token_path) and not renew_tokenfile:
logging.info("Using login from token file")
f = open(token_path)
data = json.load(f)
refresh_token = data["refresh_token"]
refresh_auth()
try:
data = json.load(f)
refresh_token = data["refresh_token"]
refresh_auth()
except ValueError:
logging.warning("Detected corrupted token file, restarting auth process")
authorize(True)
else:
logging.info("Starting login with OTP")
auth_session = requests.session()