mirror of
https://github.com/Dielee/volvo2mqtt.git
synced 2026-08-11 18:29:53 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
37e663620b | ||
|
|
6021a57e6b | ||
|
|
e85b2ef31e | ||
|
|
8f210c9fd7 | ||
|
|
701551e7e4 | ||
|
|
01c7ef46d5 |
@@ -73,6 +73,22 @@ Please let me know if your car works with this addon so I can expand the list!<b
|
||||
|
||||
NOTE: Energy status currently available only for cars in the Europe / Middle East / Africa regions. [source](https://developer.volvocars.com/apis/energy/v1/overview/#availability)
|
||||
|
||||
## OTP Authentication
|
||||
|
||||
As of version <b>v1.9.0</b>, this addon uses the same OTP authentication as the Volvo app.
|
||||
The following steps are required for authentication in exactly this order:
|
||||
|
||||
1. Setup volvo2Mqtt, either via Docker, or via HA addon (take a look at the "Setup" section below)
|
||||
2. Fill in your settings and start volvo2Mqtt
|
||||
3. Your log will show the following lines <br>
|
||||
```Waiting for otp code... Please check your mailbox and post your otp code to the following mqtt topic "volvoAAOS2mqtt/otp_code". Retry 0/15```<br>
|
||||
```Waiting for otp code... Please check your mailbox and post your otp code to the following mqtt topic "volvoAAOS2mqtt/otp_code". Retry 1/15```<br>
|
||||
```etc ...```
|
||||
4. Now, open your mailbox and copy your OTP Code
|
||||
5. Open HomeAssistant and search for the entity ID ```text.volvo_otp```
|
||||
6. Paste your OTP into the text entity and press Enter
|
||||
7. If everything has worked, your addon is now authenticated. In the future, OTP authentication only needs to be done when updating, not when restarting the container.
|
||||
|
||||
## Setup
|
||||
<b>Docker:</b>
|
||||
|
||||
@@ -106,7 +122,6 @@ Here is what every option means:
|
||||
| `TZ` | `string` | | **required** | Container timezone eg "Europe/Berlin" from [here](https://docs.diladele.com/docker/timezones.html)|
|
||||
|
||||
|
||||
|
||||
[aarch64-shield]: https://img.shields.io/badge/aarch64-yes-green.svg
|
||||
[amd64-shield]: https://img.shields.io/badge/amd64-yes-green.svg
|
||||
[armhf-shield]: https://img.shields.io/badge/armhf-yes-green.svg
|
||||
|
||||
+3
-2
@@ -1,5 +1,6 @@
|
||||
requests~=2.29.0
|
||||
requests~=2.31.0
|
||||
dynaconf~=3.1.12
|
||||
paho-mqtt~=1.6.1
|
||||
Babel~=2.12.1
|
||||
pytz~=2023.3
|
||||
pytz~=2023.3
|
||||
google_play_scraper~=1.2.6
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
name: "Volvo2Mqtt"
|
||||
description: "Volvo AAOS MQTT bridge"
|
||||
version: "1.8.27"
|
||||
version: "1.9.0"
|
||||
slug: "volvo2mqtt"
|
||||
init: false
|
||||
url: "https://github.com/Dielee/volvo2mqtt"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
from config import settings
|
||||
|
||||
VERSION = "v1.9.0b1"
|
||||
VERSION = "v1.9.0"
|
||||
|
||||
OAUTH_TOKEN_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
|
||||
OAUTH_AUTH_URL = "https://volvoid.eu.volvocars.com/as/authorization.oauth2"
|
||||
|
||||
+12
@@ -5,6 +5,7 @@ import re
|
||||
import sys
|
||||
import config
|
||||
import json
|
||||
from google_play_scraper import app
|
||||
from logging import handlers
|
||||
from datetime import datetime
|
||||
from const import units
|
||||
@@ -29,6 +30,17 @@ class SensitiveDataFilter(logging.Filter):
|
||||
record.msg = re.sub(pattern, "<REDACTED>", record.msg)
|
||||
return True
|
||||
|
||||
def get_volvo_app_version():
|
||||
result = app(
|
||||
'se.volvo.vcc',
|
||||
lang='en',
|
||||
country='us'
|
||||
)
|
||||
|
||||
if "version" in result:
|
||||
return result["version"]
|
||||
else:
|
||||
return "5.37.0"
|
||||
|
||||
def save_to_json(data):
|
||||
with open('.token', 'w', encoding='utf-8') as f:
|
||||
|
||||
+8
-7
@@ -46,7 +46,7 @@ def authorize(renew_tokenfile=False):
|
||||
auth_session = requests.session()
|
||||
auth_session.headers = {
|
||||
"authorization": "Basic aDRZZjBiOlU4WWtTYlZsNnh3c2c1WVFxWmZyZ1ZtSWFEcGhPc3kxUENhVXNpY1F0bzNUUjVrd2FKc2U0QVpkZ2ZJZmNMeXc=",
|
||||
"User-Agent": "vca-android/5.37.0",
|
||||
"User-Agent": "vca-android/" + util.get_volvo_app_version(),
|
||||
"Accept-Encoding": "gzip",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
}
|
||||
@@ -55,7 +55,7 @@ def authorize(renew_tokenfile=False):
|
||||
"&response_type=code"
|
||||
"&acr_values=urn:volvoid:aal:bronze:2sv"
|
||||
"&response_mode=pi.flow"
|
||||
"&scope=openid email profile care_by_volvo:financial_information:invoice:read care_by_volvo:financial_information:payment_method care_by_volvo:subscription:read customer:attributes customer:attributes:write order:attributes vehicle:attributes tsp_customer_api:all conve:brake_status conve:climatization_start_stop conve:command_accessibility conve:commands conve:diagnostics_engine_status conve:diagnostics_workshop conve:doors_status conve:engine_status conve:environment conve:fuel_status conve:honk_flash conve:lock conve:lock_status conve:navigation conve:odometer_status conve:trip_statistics conve:tyre_status conve:unlock conve:vehicle_relation conve:warnings conve:windows_status energy:battery_charge_level energy:charging_connection_status energy:charging_system_status energy:electric_range energy:estimated_charging_time energy:recharge_status vehicle:attributes conve:engine_status")
|
||||
"&scope=openid email profile care_by_volvo:financial_information:invoice:read care_by_volvo:financial_information:payment_method care_by_volvo:subscription:read customer:attributes customer:attributes:write order:attributes vehicle:attributes tsp_customer_api:all conve:brake_status conve:climatization_start_stop conve:command_accessibility conve:commands conve:diagnostics_engine_status conve:diagnostics_workshop conve:doors_status conve:engine_status conve:environment conve:fuel_status conve:honk_flash conve:lock conve:lock_status conve:navigation conve:odometer_status conve:trip_statistics conve:tyre_status conve:unlock conve:vehicle_relation conve:warnings conve:windows_status energy:battery_charge_level energy:charging_connection_status energy:charging_system_status energy:electric_range energy:estimated_charging_time energy:recharge_status vehicle:attributes")
|
||||
|
||||
auth = auth_session.get(OAUTH_AUTH_URL + url_params)
|
||||
if auth.status_code == 200:
|
||||
@@ -92,13 +92,14 @@ def authorize(renew_tokenfile=False):
|
||||
refresh_token = token_data["refresh_token"]
|
||||
|
||||
util.save_to_json(token_data)
|
||||
get_vcc_api_keys()
|
||||
get_vehicles()
|
||||
check_supported_endpoints()
|
||||
Thread(target=backend_status_loop).start()
|
||||
else:
|
||||
message = auth.json()
|
||||
raise Exception(message["error_description"])
|
||||
raise Exception(message["details"][0]["userMessage"])
|
||||
|
||||
get_vcc_api_keys()
|
||||
get_vehicles()
|
||||
check_supported_endpoints()
|
||||
Thread(target=backend_status_loop).start()
|
||||
|
||||
def continue_auth(auth_session, data):
|
||||
next_url = data["_links"]["continueAuthentication"]["href"] + "?action=continueAuthentication"
|
||||
|
||||
Reference in New Issue
Block a user