forked from peter/volvo2mqtt
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c404356ee0 | ||
|
|
0516c29563 | ||
|
|
9b3f9b4c0b | ||
|
|
65d0214664 | ||
|
|
39f457d01a | ||
|
|
21cb2999f7 | ||
|
|
298e8b503a | ||
|
|
2d50129ec4 | ||
|
|
5ef1aa528b | ||
|
|
3440dadeab | ||
|
|
1dc38e6925 | ||
|
|
81b0bb9b85 | ||
|
|
97fb95799a | ||
|
|
ab73f9afb2 | ||
|
|
285f9dc79b | ||
|
|
6dad197ed6 | ||
|
|
1ed6035a54 | ||
|
|
666eda99d0 | ||
|
|
02e64e5555 | ||
|
|
c298b8972a | ||
|
|
2c0169466c | ||
|
|
8565742752 | ||
|
|
e690f60433 | ||
|
|
9eba31804d | ||
|
|
5139d84602 | ||
|
|
2f3ca63b60 |
@@ -11,40 +11,51 @@ name: Create and publish a Docker image
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
release:
|
release:
|
||||||
types: [created]
|
types: [created, edited]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: ghcr.io
|
REGISTRY: ghcr.io
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
IMAGE_NAME: ${{ github.repository }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-and-push-image:
|
build-and-push-image:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
packages: write
|
packages: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
- name: Log in to the Container registry
|
- name: Log in to the Container registry
|
||||||
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
|
tags: |
|
||||||
- name: Build and push Docker image
|
type=schedule
|
||||||
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
|
type=ref,event=branch
|
||||||
|
type=ref,event=pr
|
||||||
|
type=semver,pattern={{version}}
|
||||||
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
|
type=semver,pattern={{major}}
|
||||||
|
type=sha
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
platforms: linux/amd64,linux/arm/v7,linux/arm/v6,linux/arm/v8
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
|||||||
@@ -1,2 +1,25 @@
|
|||||||
# volvo2mqtt
|
# Volvo2Mqtt
|
||||||
Home Assistant addon for connecting AAOS Volvos
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Just install this addon with the following command.
|
||||||
|
Please note to fill in your settings inside the environment variables.
|
||||||
|
|
||||||
|
`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:
|
||||||
|
|
||||||
|
| Name | Type | Default | Description |
|
||||||
|
| -------------------- | :-------: | :----------: | --------------------------------------------------------------- |
|
||||||
|
| `updateInterval` | `int` | **required** | Update intervall in seconds. |
|
||||||
|
| `babelLocale` | `string` | **required** | Locale for date Format |
|
||||||
|
| `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/). |
|
||||||
|
| `TZ` | `string` | | Container timezone eg "Europe/Berlin" |
|
||||||
|
|
||||||
|
If you like my work:
|
||||||
|
|
||||||
|
<a href="https://www.buymeacoffee.com/dielee" target="_blank"><img src="https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png" alt="Buy Me A Coffee" style="height: 41px !important;width: 174px !important;box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;-webkit-box-shadow: 0px 3px 2px 0px rgba(190, 190, 190, 0.5) !important;" ></a>
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
VERSION = "v1.0.2.1"
|
||||||
|
|
||||||
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()
|
||||||
|
|||||||
@@ -80,132 +80,134 @@ def update_loop():
|
|||||||
def update_car_data():
|
def update_car_data():
|
||||||
global last_data_update
|
global last_data_update
|
||||||
last_data_update = format_datetime(datetime.now(), format="medium", locale=settings["babelLocale"])
|
last_data_update = format_datetime(datetime.now(), format="medium", locale=settings["babelLocale"])
|
||||||
for lock in supported_locks:
|
for vin in volvo.vins:
|
||||||
state = volvo.api_call(lock["url"], "GET", lock["id"])
|
for lock in supported_locks:
|
||||||
mqtt_client.publish(
|
state = volvo.api_call(lock["url"], "GET", vin, lock["id"])
|
||||||
f"homeassistant/lock/{volvo.vin}_{lock['id']}/state",
|
mqtt_client.publish(
|
||||||
state
|
f"homeassistant/lock/{vin}_{lock['id']}/state",
|
||||||
)
|
state
|
||||||
|
)
|
||||||
|
|
||||||
for switch in supported_switches:
|
for switch in supported_switches:
|
||||||
if switch["id"] == "climate_status":
|
if switch["id"] == "climate_status":
|
||||||
state = assumed_climate_state
|
state = assumed_climate_state
|
||||||
else:
|
else:
|
||||||
state = "OFF"
|
state = "OFF"
|
||||||
|
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/switch/{volvo.vin}_{switch['id']}/state",
|
f"homeassistant/switch/{vin}_{switch['id']}/state",
|
||||||
state
|
state
|
||||||
)
|
)
|
||||||
|
|
||||||
for sensor in supported_sensors:
|
for sensor in supported_sensors:
|
||||||
if sensor["id"] == "last_data_update":
|
if sensor["id"] == "last_data_update":
|
||||||
state = last_data_update
|
state = last_data_update
|
||||||
else:
|
else:
|
||||||
state = volvo.api_call(sensor["url"], "GET", sensor["id"])
|
state = volvo.api_call(sensor["url"], "GET", vin, sensor["id"])
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/sensor/{volvo.vin}_{sensor['id']}/state",
|
f"homeassistant/sensor/{vin}_{sensor['id']}/state",
|
||||||
state
|
state
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_ha_devices():
|
def create_ha_devices():
|
||||||
car_details = volvo.api_call(VEHICLE_DETAILS_URL, "GET")
|
for vin in volvo.vins:
|
||||||
|
car_details = volvo.api_call(VEHICLE_DETAILS_URL, "GET", vin)
|
||||||
|
|
||||||
for button in supported_buttons:
|
for button in supported_buttons:
|
||||||
command_topic = f"homeassistant/button/{volvo.vin}_{button['id']}/command"
|
command_topic = f"homeassistant/button/{vin}_{button['id']}/command"
|
||||||
config = {
|
config = {
|
||||||
"name": button['name'],
|
"name": button['name'],
|
||||||
"object_id": button['id'],
|
"object_id": button['id'],
|
||||||
"schema": "state",
|
"schema": "state",
|
||||||
"icon": f"mdi:{button['icon']}",
|
"icon": f"mdi:{button['icon']}",
|
||||||
"state_topic": f"homeassistant/button/{volvo.vin}_{button['id']}/state",
|
"state_topic": f"homeassistant/button/{vin}_{button['id']}/state",
|
||||||
"command_topic": command_topic,
|
"command_topic": command_topic,
|
||||||
"device": {
|
"device": {
|
||||||
"identifiers": ["volvoAAOS2mqtt"],
|
"identifiers": [f"volvoAAOS2mqtt_{vin}"],
|
||||||
"manufacturer": "Volvo",
|
"manufacturer": "Volvo",
|
||||||
"model": car_details['descriptions']['model'],
|
"model": car_details['descriptions']['model'],
|
||||||
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {volvo.vin}",
|
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {vin}",
|
||||||
},
|
},
|
||||||
"unique_id": f"volvoAAOS2mqtt_{volvo.vin}_{button['id']}",
|
"unique_id": f"volvoAAOS2mqtt_{vin}_{button['id']}",
|
||||||
}
|
}
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/button/volvoAAOS2mqtt/{volvo.vin}_{button['id']}/config",
|
f"homeassistant/button/volvoAAOS2mqtt/{vin}_{button['id']}/config",
|
||||||
json.dumps(config),
|
json.dumps(config),
|
||||||
)
|
)
|
||||||
subscribed_topics.append(command_topic)
|
subscribed_topics.append(command_topic)
|
||||||
mqtt_client.subscribe(command_topic)
|
mqtt_client.subscribe(command_topic)
|
||||||
|
|
||||||
for lock in supported_locks:
|
for lock in supported_locks:
|
||||||
command_topic = f"homeassistant/lock/{volvo.vin}_{lock['id']}/command"
|
command_topic = f"homeassistant/lock/{vin}_{lock['id']}/command"
|
||||||
config = {
|
config = {
|
||||||
"name": lock['name'],
|
"name": lock['name'],
|
||||||
"object_id": lock['id'],
|
"object_id": lock['id'],
|
||||||
"schema": "state",
|
"schema": "state",
|
||||||
"icon": f"mdi:{lock['icon']}",
|
"icon": f"mdi:{lock['icon']}",
|
||||||
"state_topic": f"homeassistant/lock/{volvo.vin}_{lock['id']}/state",
|
"state_topic": f"homeassistant/lock/{vin}_{lock['id']}/state",
|
||||||
"command_topic": command_topic,
|
"command_topic": command_topic,
|
||||||
"optimistic": False,
|
"optimistic": False,
|
||||||
"device": {
|
"device": {
|
||||||
"identifiers": ["volvoAAOS2mqtt"],
|
"identifiers": [f"volvoAAOS2mqtt_{vin}"],
|
||||||
"manufacturer": "Volvo",
|
"manufacturer": "Volvo",
|
||||||
"model": car_details['descriptions']['model'],
|
"model": car_details['descriptions']['model'],
|
||||||
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {volvo.vin}",
|
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {vin}",
|
||||||
},
|
},
|
||||||
"unique_id": f"volvoAAOS2mqtt_{volvo.vin}_{lock['id']}",
|
"unique_id": f"volvoAAOS2mqtt_{vin}_{lock['id']}",
|
||||||
}
|
}
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/lock/volvoAAOS2mqtt/{volvo.vin}_{lock['id']}/config",
|
f"homeassistant/lock/volvoAAOS2mqtt/{vin}_{lock['id']}/config",
|
||||||
json.dumps(config),
|
json.dumps(config),
|
||||||
)
|
)
|
||||||
subscribed_topics.append(command_topic)
|
subscribed_topics.append(command_topic)
|
||||||
mqtt_client.subscribe(command_topic)
|
mqtt_client.subscribe(command_topic)
|
||||||
|
|
||||||
for switch in supported_switches:
|
for switch in supported_switches:
|
||||||
command_topic = f"homeassistant/switch/{volvo.vin}_{switch['id']}/command"
|
command_topic = f"homeassistant/switch/{vin}_{switch['id']}/command"
|
||||||
config = {
|
config = {
|
||||||
"name": switch['name'],
|
"name": switch['name'],
|
||||||
"object_id": switch['id'],
|
"object_id": switch['id'],
|
||||||
"schema": "state",
|
"schema": "state",
|
||||||
"icon": f"mdi:{switch['icon']}",
|
"icon": f"mdi:{switch['icon']}",
|
||||||
"state_topic": f"homeassistant/switch/{volvo.vin}_{switch['id']}/state",
|
"state_topic": f"homeassistant/switch/{vin}_{switch['id']}/state",
|
||||||
"command_topic": command_topic,
|
"command_topic": command_topic,
|
||||||
"optimistic": False,
|
"optimistic": False,
|
||||||
"device": {
|
"device": {
|
||||||
"identifiers": ["volvoAAOS2mqtt"],
|
"identifiers": [f"volvoAAOS2mqtt_{vin}"],
|
||||||
"manufacturer": "Volvo",
|
"manufacturer": "Volvo",
|
||||||
"model": car_details['descriptions']['model'],
|
"model": car_details['descriptions']['model'],
|
||||||
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {volvo.vin}",
|
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {vin}",
|
||||||
},
|
},
|
||||||
"unique_id": f"volvoAAOS2mqtt_{volvo.vin}_{switch['id']}",
|
"unique_id": f"volvoAAOS2mqtt_{vin}_{switch['id']}",
|
||||||
}
|
}
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/switch/volvoAAOS2mqtt/{volvo.vin}_{switch['id']}/config",
|
f"homeassistant/switch/volvoAAOS2mqtt/{vin}_{switch['id']}/config",
|
||||||
json.dumps(config),
|
json.dumps(config),
|
||||||
)
|
)
|
||||||
subscribed_topics.append(command_topic)
|
subscribed_topics.append(command_topic)
|
||||||
mqtt_client.subscribe(command_topic)
|
mqtt_client.subscribe(command_topic)
|
||||||
|
|
||||||
for sensor in supported_sensors:
|
for sensor in supported_sensors:
|
||||||
config = {
|
config = {
|
||||||
"name": sensor['name'],
|
"name": sensor['name'],
|
||||||
"object_id": sensor['id'],
|
"object_id": sensor['id'],
|
||||||
"schema": "state",
|
"schema": "state",
|
||||||
"icon": f"mdi:{sensor['icon']}",
|
"icon": f"mdi:{sensor['icon']}",
|
||||||
"state_topic": f"homeassistant/sensor/{volvo.vin}_{sensor['id']}/state",
|
"state_topic": f"homeassistant/sensor/{vin}_{sensor['id']}/state",
|
||||||
"device": {
|
"device": {
|
||||||
"identifiers": ["volvoAAOS2mqtt"],
|
"identifiers": [f"volvoAAOS2mqtt_{vin}"],
|
||||||
"manufacturer": "Volvo",
|
"manufacturer": "Volvo",
|
||||||
"model": car_details['descriptions']['model'],
|
"model": car_details['descriptions']['model'],
|
||||||
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {volvo.vin}",
|
"name": f"{car_details['descriptions']['model']} ({car_details['modelYear']}) - {vin}",
|
||||||
},
|
},
|
||||||
"unique_id": f"volvoAAOS2mqtt_{volvo.vin}_{sensor['id']}",
|
"unique_id": f"volvoAAOS2mqtt_{vin}_{sensor['id']}",
|
||||||
}
|
}
|
||||||
if "unit" in sensor:
|
if "unit" in sensor:
|
||||||
config["unit_of_measurement"] = sensor["unit"]
|
config["unit_of_measurement"] = sensor["unit"]
|
||||||
|
|
||||||
mqtt_client.publish(
|
mqtt_client.publish(
|
||||||
f"homeassistant/sensor/volvoAAOS2mqtt/{volvo.vin}_{sensor['id']}/config",
|
f"homeassistant/sensor/volvoAAOS2mqtt/{vin}_{sensor['id']}/config",
|
||||||
json.dumps(config),
|
json.dumps(config),
|
||||||
)
|
)
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
|||||||
+2
-1
@@ -9,6 +9,7 @@
|
|||||||
"volvoData": {
|
"volvoData": {
|
||||||
"username": "",
|
"username": "",
|
||||||
"password": "",
|
"password": "",
|
||||||
"vin": ""
|
"vin": "",
|
||||||
|
"vccapikey": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,14 +8,14 @@ from const import charging_system_states, CLIMATE_START_URL, \
|
|||||||
|
|
||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
session.headers = {
|
session.headers = {
|
||||||
"vcc-api-key": "f0d0419bf51d420c8efb21cf9a127227",
|
"vcc-api-key": "",
|
||||||
"content-type": "application/json",
|
"content-type": "application/json",
|
||||||
"accept": "*/*"
|
"accept": "*/*"
|
||||||
}
|
}
|
||||||
|
|
||||||
token_expires_at = None
|
token_expires_at: datetime
|
||||||
refresh_token = None
|
refresh_token = None
|
||||||
vin = ""
|
vins = []
|
||||||
recharge_response = {}
|
recharge_response = {}
|
||||||
recharge_last_update = None
|
recharge_last_update = None
|
||||||
|
|
||||||
@@ -42,7 +42,8 @@ def authorize():
|
|||||||
token_expires_at = datetime.now() + timedelta(seconds=(data["expires_in"] - 30))
|
token_expires_at = datetime.now() + timedelta(seconds=(data["expires_in"] - 30))
|
||||||
refresh_token = data["refresh_token"]
|
refresh_token = data["refresh_token"]
|
||||||
|
|
||||||
get_vehicle()
|
session.headers.update({"vcc-api-key": settings["volvoData"]["vccapikey"]})
|
||||||
|
get_vehicles()
|
||||||
else:
|
else:
|
||||||
message = auth.json()
|
message = auth.json()
|
||||||
raise Exception(message["error_description"])
|
raise Exception(message["error_description"])
|
||||||
@@ -71,25 +72,31 @@ def refresh_auth():
|
|||||||
refresh_token = data["refresh_token"]
|
refresh_token = data["refresh_token"]
|
||||||
|
|
||||||
|
|
||||||
def get_vehicle():
|
def get_vehicles():
|
||||||
global vin
|
global vins
|
||||||
if not settings.volvoData["vin"]:
|
if not settings.volvoData["vin"]:
|
||||||
vehicles = session.get(VEHICLES_URL)
|
vehicles = session.get(VEHICLES_URL)
|
||||||
if vehicles.status_code == 200:
|
if vehicles.status_code == 200:
|
||||||
data = vehicles.json()
|
data = vehicles.json()
|
||||||
if len(data["data"]) > 0:
|
if len(data["data"]) > 0:
|
||||||
vin = data["data"][0]["vin"]
|
for vehicle in data["data"]:
|
||||||
|
vins.append(vehicle["vin"])
|
||||||
else:
|
else:
|
||||||
print("No vehicle in account " + settings.volvoData["username"] + " found.")
|
raise Exception("No vehicle in account " + settings.volvoData["username"] + " found.")
|
||||||
else:
|
else:
|
||||||
print("Error getting Vehicles " + str(vehicles.status_code))
|
raise Exception("Error getting vehicles: " + str(vehicles.status_code))
|
||||||
else:
|
else:
|
||||||
vin = settings.volvoData["vin"]
|
if isinstance(settings.volvoData["vin"], list):
|
||||||
|
# If setting is a list, copy
|
||||||
|
vins = settings.volvoData["vin"]
|
||||||
|
else:
|
||||||
|
# If setting is a string, append to list
|
||||||
|
vins.append(settings.volvoData["vin"])
|
||||||
|
|
||||||
if not vin:
|
if len(vins) == 0:
|
||||||
raise Exception("No vehicle found, exiting application!")
|
raise Exception("No vehicle found, exiting application!")
|
||||||
else:
|
else:
|
||||||
print("Vin: " + vin + " found!")
|
print("Vin: " + str(vins) + " found!")
|
||||||
|
|
||||||
|
|
||||||
def disable_climate():
|
def disable_climate():
|
||||||
@@ -97,12 +104,12 @@ def disable_climate():
|
|||||||
mqtt.update_car_data()
|
mqtt.update_car_data()
|
||||||
|
|
||||||
|
|
||||||
def api_call(url, method, sensor_id=None):
|
def api_call(url, method, vin, sensor_id=None):
|
||||||
global token_expires_at
|
global token_expires_at
|
||||||
if datetime.now() >= token_expires_at:
|
if datetime.now() >= token_expires_at:
|
||||||
refresh_auth()
|
refresh_auth()
|
||||||
|
|
||||||
global vin, recharge_response, recharge_last_update
|
global recharge_response, recharge_last_update
|
||||||
if url == RECHARGE_STATUS_URL:
|
if url == RECHARGE_STATUS_URL:
|
||||||
# Minimize API calls for recharge API
|
# Minimize API calls for recharge API
|
||||||
if not bool(recharge_response):
|
if not bool(recharge_response):
|
||||||
@@ -145,23 +152,38 @@ def api_call(url, method, 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":
|
||||||
return data["data"]["batteryChargeLevel"]["value"]
|
if "batteryChargeLevel" in data["data"]:
|
||||||
elif sensor_id == "electric_range":
|
return data["data"]["batteryChargeLevel"]["value"]
|
||||||
return data["data"]["electricRange"]["value"]
|
|
||||||
elif sensor_id == "charging_system_status":
|
|
||||||
return charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
|
||||||
elif sensor_id == "estimated_charging_time":
|
|
||||||
charging_system_state = charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
|
||||||
if charging_system_state == "Charging":
|
|
||||||
return data["data"]["estimatedChargingTime"]["value"]
|
|
||||||
else:
|
else:
|
||||||
return 0
|
return ""
|
||||||
|
elif sensor_id == "electric_range":
|
||||||
|
if "electricRange" in data["data"]:
|
||||||
|
return data["data"]["electricRange"]["value"]
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
elif sensor_id == "charging_system_status":
|
||||||
|
if "charging_system_status" in data["data"]:
|
||||||
|
return charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
|
elif sensor_id == "estimated_charging_time":
|
||||||
|
if "chargingSystemStatus" in data["data"]:
|
||||||
|
charging_system_state = charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
||||||
|
if charging_system_state == "Charging":
|
||||||
|
return data["data"]["estimatedChargingTime"]["value"]
|
||||||
|
else:
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
return ""
|
||||||
elif sensor_id == "estimated_charging_finish_time":
|
elif sensor_id == "estimated_charging_finish_time":
|
||||||
charging_system_state = charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
if "chargingSystemStatus" in data["data"]:
|
||||||
if charging_system_state == "Charging":
|
charging_system_state = charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
||||||
charging_time = int(data["data"]["estimatedChargingTime"]["value"])
|
if charging_system_state == "Charging":
|
||||||
charging_finished = datetime.now() + timedelta(minutes=charging_time)
|
charging_time = int(data["data"]["estimatedChargingTime"]["value"])
|
||||||
return format_datetime(charging_finished, format="medium", locale=settings["babelLocale"])
|
charging_finished = datetime.now() + timedelta(minutes=charging_time)
|
||||||
|
return format_datetime(charging_finished, format="medium", locale=settings["babelLocale"])
|
||||||
|
else:
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
elif sensor_id == "lock_status":
|
elif sensor_id == "lock_status":
|
||||||
|
|||||||
Reference in New Issue
Block a user