mirror of
https://github.com/Dielee/volvo2mqtt.git
synced 2026-08-12 18:59:53 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17eaa8dde2 | ||
|
|
8f3bf5f3b1 | ||
|
|
9d4f8fab0c | ||
|
|
414ac503b1 | ||
|
|
18926b67e4 | ||
|
|
f650ea9247 | ||
|
|
a7a2e1182c | ||
|
|
3d3227de0d | ||
|
|
44509529ff | ||
|
|
0dd5852d81 | ||
|
|
c6ddd71021 | ||
|
|
1f0612ca4a |
@@ -87,8 +87,36 @@ The following steps are required for authentication in exactly this order:
|
|||||||
```etc ...```
|
```etc ...```
|
||||||
4. Now, open your mailbox and copy your OTP Code
|
4. Now, open your mailbox and copy your OTP Code
|
||||||
5. Open HomeAssistant and search for the entity ID ```text.volvo_otp```
|
5. Open HomeAssistant and search for the entity ID ```text.volvo_otp```
|
||||||
6. Paste your OTP into the text entity and **<ins>press Enter</ins>**
|
6. Paste your OTP into the text entity and **<ins>press Enter</ins>**<br>
|
||||||
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.
|
6a. (optional) If your OTP cannot be safed, try to paste your OTP code via MQTT to the following topic: `volvoAAOS2mqtt/otp_code` <p>
|
||||||
|
<details>
|
||||||
|
<summary>OTP Post Script</summary>
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
1. Safe the following script in your script section <br>
|
||||||
|
2. Go to https://yourHAUrl/developer-tools/service<br>
|
||||||
|
3. Search for "Post Volvo OTP"<br>
|
||||||
|
4. Tick "OTP" and fill in your OTP<br>
|
||||||
|
5. Run this service<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
alias: Post Volvo OTP
|
||||||
|
sequence:
|
||||||
|
- service: mqtt.publish
|
||||||
|
metadata: {}
|
||||||
|
data:
|
||||||
|
topic: volvoAAOS2mqtt/otp_code
|
||||||
|
payload: "{{ otp }}"
|
||||||
|
mode: single
|
||||||
|
fields:
|
||||||
|
otp:
|
||||||
|
selector:
|
||||||
|
text: null
|
||||||
|
name: OTP
|
||||||
|
description: Volvo OTP
|
||||||
|
|
||||||
|
</details>
|
||||||
|
8. 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
|
## Setup
|
||||||
<b>Docker:</b>
|
<b>Docker:</b>
|
||||||
|
|||||||
@@ -1,3 +1,54 @@
|
|||||||
|
## 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:
|
||||||
|
|
||||||
|
- Ignore retained OTP messages #193
|
||||||
|
|
||||||
|
## v1.9.2
|
||||||
|
### 🐛 Bug Fixes:
|
||||||
|
|
||||||
|
- Try to fix OTP Input
|
||||||
|
- Fix `SyntaxWarning: invalid escape sequence '\d'` #196
|
||||||
|
|
||||||
|
## v1.9.1
|
||||||
|
### 🚀 Features:
|
||||||
|
|
||||||
|
- The token file now survives an HA addon update/restart
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes:
|
||||||
|
|
||||||
|
- Extend OTP retry time to 120 seconds
|
||||||
|
|
||||||
|
## v1.9.0
|
||||||
|
### ⚠️ Breaking change
|
||||||
|
### 🚀 Features:
|
||||||
|
|
||||||
|
- Add "Battery Capacity" sensor. Thanks to @gurtjun!
|
||||||
|
- OTP Auth
|
||||||
|
This addon uses the same OTP authentication as the Volvo app, now.
|
||||||
|
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)
|
||||||
|
2. Fill in your settings and start volvo2Mqtt
|
||||||
|
3. Your log will show the following lines
|
||||||
|
Waiting for otp code... Please check your mailbox and post your otp code to the following mqtt topic "volvoAAOS2mqtt/otp_code". Retry 0/15
|
||||||
|
Waiting for otp code... Please check your mailbox and post your otp code to the following mqtt topic "volvoAAOS2mqtt/otp_code". Retry 1/15
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
## v1.8.27
|
## v1.8.27
|
||||||
### 🚀 Features:
|
### 🚀 Features:
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
name: "Volvo2Mqtt"
|
name: "Volvo2Mqtt"
|
||||||
description: "Volvo AAOS MQTT bridge"
|
description: "Volvo AAOS MQTT bridge"
|
||||||
version: "1.9.1"
|
version: "1.9.5"
|
||||||
slug: "volvo2mqtt"
|
slug: "volvo2mqtt"
|
||||||
init: false
|
init: false
|
||||||
url: "https://github.com/Dielee/volvo2mqtt"
|
url: "https://github.com/Dielee/volvo2mqtt"
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
from config import settings
|
from config import settings
|
||||||
|
|
||||||
VERSION = "v1.9.1"
|
VERSION = "v1.9.5"
|
||||||
|
|
||||||
OAUTH_TOKEN_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
|
OAUTH_TOKEN_URL = "https://volvoid.eu.volvocars.com/as/token.oauth2"
|
||||||
OAUTH_AUTH_URL = "https://volvoid.eu.volvocars.com/as/authorization.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"
|
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"
|
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"
|
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"
|
LENGTH_KILOMETERS = "km"
|
||||||
SPEED_KILOMETERS_PER_HOUR = "km/h"
|
SPEED_KILOMETERS_PER_HOUR = "km/h"
|
||||||
|
|||||||
+31
-13
@@ -47,25 +47,37 @@ def connect():
|
|||||||
|
|
||||||
|
|
||||||
def create_otp_input():
|
def create_otp_input():
|
||||||
|
state_topic = otp_mqtt_topic + "/state"
|
||||||
config = {
|
config = {
|
||||||
"name": "Volvo OTP",
|
"name": "Volvo OTP",
|
||||||
"object_id": f"volvo_otp",
|
"object_id": f"volvo_otp",
|
||||||
"schema": "state",
|
"schema": "state",
|
||||||
"command_topic": otp_mqtt_topic,
|
"command_topic": otp_mqtt_topic,
|
||||||
"unique_id": f"volvoAAOS2mqtt_otp",
|
"state_topic": state_topic,
|
||||||
"pattern": "\d{6}",
|
"unique_id": "volvoAAOS2mqtt_otp",
|
||||||
"icon": "mdi:two-factor-authentication"
|
"pattern": r"\d{6}",
|
||||||
|
"icon": "mdi:two-factor-authentication",
|
||||||
|
"mode": "text"
|
||||||
}
|
}
|
||||||
|
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/text/volvoAAOS2mqtt/volvo_otp/config",
|
"homeassistant/text/volvoAAOS2mqtt/volvo_otp/config",
|
||||||
json.dumps(config),
|
json.dumps(config),
|
||||||
retain=True
|
retain=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def delete_otp_input():
|
mqtt_client.publish(
|
||||||
topic = "homeassistant/text/volvoAAOS2mqtt/volvo_otp/config"
|
state_topic,
|
||||||
mqtt_client.publish(topic, payload="", retain=True)
|
"000000",
|
||||||
|
retain=True
|
||||||
|
)
|
||||||
|
|
||||||
|
def set_otp_state():
|
||||||
|
mqtt_client.publish(
|
||||||
|
otp_mqtt_topic + "/state",
|
||||||
|
otp_code,
|
||||||
|
retain=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def send_car_images(vin, data, device):
|
def send_car_images(vin, data, device):
|
||||||
@@ -119,8 +131,12 @@ def on_disconnect(client, userdata, rc):
|
|||||||
def on_message(client, userdata, msg):
|
def on_message(client, userdata, msg):
|
||||||
payload = msg.payload.decode("UTF-8")
|
payload = msg.payload.decode("UTF-8")
|
||||||
if msg.topic == otp_mqtt_topic:
|
if msg.topic == otp_mqtt_topic:
|
||||||
global otp_code
|
if msg.retain == 0:
|
||||||
otp_code = payload
|
global otp_code
|
||||||
|
otp_code = payload
|
||||||
|
set_otp_state()
|
||||||
|
else:
|
||||||
|
logging.warning("Found retained OTP, this can't work! Please clean retained messages!")
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
@@ -300,7 +316,8 @@ def update_car_data(force_update=False, overwrite={}):
|
|||||||
elif entity["id"] == "warnings":
|
elif entity["id"] == "warnings":
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/attributes",
|
f"homeassistant/{entity['domain']}/{vin}_{entity['id']}/attributes",
|
||||||
json.dumps(state)
|
json.dumps(state),
|
||||||
|
retain=True
|
||||||
)
|
)
|
||||||
if state:
|
if state:
|
||||||
state = sum(value == "FAILURE" for value in state.values())
|
state = sum(value == "FAILURE" for value in state.values())
|
||||||
@@ -314,7 +331,8 @@ def update_car_data(force_update=False, overwrite={}):
|
|||||||
if state or state == 0:
|
if state or state == 0:
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
topic,
|
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)
|
update_ha_device(entity, vin, state)
|
||||||
|
|
||||||
@@ -425,11 +443,11 @@ def create_ha_devices():
|
|||||||
|
|
||||||
|
|
||||||
def send_heartbeat():
|
def send_heartbeat():
|
||||||
mqtt_client.publish(availability_topic, "online")
|
mqtt_client.publish(availability_topic, "online", retain=True)
|
||||||
|
|
||||||
|
|
||||||
def send_offline():
|
def send_offline():
|
||||||
mqtt_client.publish(availability_topic, "offline")
|
mqtt_client.publish(availability_topic, "offline", retain=True)
|
||||||
|
|
||||||
|
|
||||||
def delete_old_entities():
|
def delete_old_entities():
|
||||||
|
|||||||
@@ -156,7 +156,6 @@ def send_otp(auth_session, data):
|
|||||||
if not mqtt.otp_code:
|
if not mqtt.otp_code:
|
||||||
raise Exception ("No OTP found, exting...")
|
raise Exception ("No OTP found, exting...")
|
||||||
|
|
||||||
mqtt.delete_otp_input()
|
|
||||||
auth = auth_session.post(next_url, data=json.dumps(body))
|
auth = auth_session.post(next_url, data=json.dumps(body))
|
||||||
if auth.status_code == 200:
|
if auth.status_code == 200:
|
||||||
return auth.json()
|
return auth.json()
|
||||||
|
|||||||
Reference in New Issue
Block a user