forked from peter/volvo2mqtt
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
71f03e505b | ||
|
|
2b6a2a4f4c | ||
|
|
38cca04473 | ||
|
|
fbb98481f4 | ||
|
|
dad5f9aaaa | ||
|
|
c404356ee0 | ||
|
|
0516c29563 | ||
|
|
9b3f9b4c0b | ||
|
|
65d0214664 |
@@ -11,7 +11,7 @@ name: Create and publish a Docker image
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [created]
|
types: [created, edited]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -3,18 +3,23 @@
|
|||||||
This component establishes a connection between the newer AAOS Volvo cars and Home Assistant via MQTT.<br>
|
This component establishes a connection between the newer AAOS Volvo cars and Home Assistant via MQTT.<br>
|
||||||
Maybe this component works also with other Volvo cars. Please try out the native Volvo [integration](https://www.home-assistant.io/integrations/volvooncall/) before using this component! If the native component doesn't work for your car, try this mqtt bridge.
|
Maybe this component works also with other Volvo cars. Please try out the native Volvo [integration](https://www.home-assistant.io/integrations/volvooncall/) before using this component! If the native component doesn't work for your car, try this mqtt bridge.
|
||||||
|
|
||||||
|
## Confirmed working with
|
||||||
|
- Volvo XC40 BEV (2023)
|
||||||
|
|
||||||
|
Please let me know if your car works with this addon so I can expand the list!
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
Just install this addon with the following command.
|
Just install this addon with the following command.
|
||||||
Please note to fill in your settings inside the environment variables.
|
Please note to fill in your settings inside the environment variables.
|
||||||
|
|
||||||
`docker run -e CONF_updateInterval=300 -e CONF_babelLocale='de' -e CONF_mqtt='@json {"broker": "", "username": "", "password": ""}' -e CONF_volvoData='@json {"username": "", "password": "", "vin": "", "vccapikey": ""}' -e TZ='Europe/Berlin' --name volvo2mqtt ghcr.io/dielee/volvo2mqtt:latest`
|
`docker run --pull=always -e CONF_updateInterval=300 -e CONF_babelLocale='de' -e CONF_mqtt='@json {"broker": "", "username": "", "password": ""}' -e CONF_volvoData='@json {"username": "", "password": "", "vin": "", "vccapikey": ""}' -e TZ='Europe/Berlin' --name volvo2mqtt ghcr.io/dielee/volvo2mqtt:latest`
|
||||||
|
|
||||||
Here is what every option means:
|
Here is what every option means:
|
||||||
|
|
||||||
| Name | Type | Default | Description |
|
| Name | Type | Default | Description |
|
||||||
| -------------------- | :-------: | :----------: | --------------------------------------------------------------- |
|
| -------------------- | :-------: | :----------: | --------------------------------------------------------------- |
|
||||||
| `updateInterval` | `int` | **required** | Updateintervall in seconds. |
|
| `updateInterval` | `int` | **required** | Update intervall in seconds. |
|
||||||
| `babelLocale` | `string` | **required** | Locale for date Format |
|
| `babelLocale` | `string` | **required** | Locale for date Format |
|
||||||
| `mqtt` | `json` | **required** | Broker = Mqtt Broker IP / Username and Passwort are optional! |
|
| `mqtt` | `json` | **required** | Broker = Mqtt Broker IP / Username and Passwort are optional! |
|
||||||
| `volvoData` | `json` | **required** | Username and password are required. Car vin can be a single vin or a list of multiple vins like `["vin1", "vin2"]`. If no vin is provided, <b>ALL</b> of your vehicles will be used. Vccapi key is your api key from [here](https://developer.volvocars.com/account/). |
|
| `volvoData` | `json` | **required** | Username and password are required. Car vin can be a single vin or a list of multiple vins like `["vin1", "vin2"]`. If no vin is provided, <b>ALL</b> of your vehicles will be used. Vccapi key is your api key from [here](https://developer.volvocars.com/account/). |
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
VERSION = "v1.0.5"
|
||||||
|
|
||||||
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"
|
||||||
VEHICLE_DETAILS_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles/{0}"
|
VEHICLE_DETAILS_URL = "https://api.volvocars.com/connected-vehicle/v1/vehicles/{0}"
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
from volvo import authorize
|
from volvo import authorize
|
||||||
from mqtt import update_loop, connect
|
from mqtt import update_loop, connect
|
||||||
|
from const import VERSION
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
print("Starting volvo2mqtt version " + VERSION)
|
||||||
authorize()
|
authorize()
|
||||||
connect()
|
connect()
|
||||||
update_loop()
|
update_loop()
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import threading
|
|||||||
from datetime import datetime
|
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 VEHICLE_DETAILS_URL,CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_LOCK_URL, \
|
from const import VEHICLE_DETAILS_URL, CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_LOCK_URL, \
|
||||||
CAR_UNLOCK_URL, supported_sensors, supported_buttons, supported_switches, supported_locks
|
CAR_UNLOCK_URL, supported_sensors, supported_buttons, supported_switches, supported_locks
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +74,7 @@ def update_loop():
|
|||||||
while True:
|
while True:
|
||||||
print("Sending mqtt update...")
|
print("Sending mqtt update...")
|
||||||
update_car_data()
|
update_car_data()
|
||||||
|
print("Mqtt update done. Next run in " + str(settings["updateInterval"]) + " seconds.")
|
||||||
time.sleep(settings["updateInterval"])
|
time.sleep(settings["updateInterval"])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
requests~=2.29.0
|
requests~=2.29.0
|
||||||
dynaconf~=3.1.12
|
dynaconf~=3.1.12
|
||||||
paho-mqtt~=1.6.1
|
paho-mqtt~=1.6.1
|
||||||
pytz~=2023.3
|
|
||||||
Babel~=2.12.1
|
Babel~=2.12.1
|
||||||
@@ -115,18 +115,18 @@ def api_call(url, method, vin, sensor_id=None):
|
|||||||
# No API Data cached, get fresh data from API
|
# No API Data cached, get fresh data from API
|
||||||
print("Starting " + method + " call against " + url)
|
print("Starting " + method + " call against " + url)
|
||||||
response = session.get(url.format(vin), timeout=15)
|
response = session.get(url.format(vin), timeout=15)
|
||||||
recharge_response = response
|
recharge_response[vin] = response
|
||||||
recharge_last_update = datetime.now()
|
recharge_last_update = datetime.now()
|
||||||
else:
|
else:
|
||||||
if (datetime.now() - recharge_last_update).total_seconds() >= settings["updateInterval"]:
|
if (datetime.now() - recharge_last_update).total_seconds() >= settings["updateInterval"]:
|
||||||
# Old Data in Cache, updateing
|
# Old Data in Cache, updateing
|
||||||
print("Starting " + method + " call against " + url)
|
print("Starting " + method + " call against " + url)
|
||||||
response = session.get(url.format(vin), timeout=15)
|
response = session.get(url.format(vin), timeout=15)
|
||||||
recharge_response = response
|
recharge_response[vin] = response
|
||||||
recharge_last_update = datetime.now()
|
recharge_last_update = datetime.now()
|
||||||
else:
|
else:
|
||||||
# Data is up do date, returning cached data
|
# Data is up do date, returning cached data
|
||||||
response = recharge_response
|
response = recharge_response[vin]
|
||||||
elif method == "GET":
|
elif method == "GET":
|
||||||
print("Starting " + method + " call against " + url)
|
print("Starting " + method + " call against " + url)
|
||||||
response = session.get(url.format(vin), timeout=15)
|
response = session.get(url.format(vin), timeout=15)
|
||||||
@@ -147,7 +147,10 @@ def api_call(url, method, vin, sensor_id=None):
|
|||||||
else:
|
else:
|
||||||
print("API Call failed. Status Code: " + str(response.status_code) + ". Error: " + response.text)
|
print("API Call failed. Status Code: " + str(response.status_code) + ". Error: " + response.text)
|
||||||
return ""
|
return ""
|
||||||
|
return parse_api_data(url, data, sensor_id)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_api_data(url, data, sensor_id=None):
|
||||||
if url == VEHICLE_DETAILS_URL:
|
if url == VEHICLE_DETAILS_URL:
|
||||||
return data["data"]
|
return data["data"]
|
||||||
elif sensor_id == "battery_charge_level":
|
elif sensor_id == "battery_charge_level":
|
||||||
|
|||||||
Reference in New Issue
Block a user