mirror of
https://github.com/Dielee/volvo2mqtt.git
synced 2026-08-13 19:29:52 +02:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9359896a68 | ||
|
|
2ebd1a30e3 | ||
|
|
0a13fd3bba | ||
|
|
fcf8f968ab | ||
|
|
07b144cc38 | ||
|
|
1eb635592d | ||
|
|
c60ef48591 |
@@ -4,9 +4,10 @@ This component establishes a connection between the newer AAOS Volvo cars and Ho
|
|||||||
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
|
## Confirmed working with
|
||||||
- Volvo XC40 BEV (2023)
|
- XC40 BEV (2023)
|
||||||
- Volvo V60 T8 PHEV (2023)
|
- V60 T8 PHEV (2023)
|
||||||
- Volvo C40 (2023)
|
- C40 PHEV (2023)
|
||||||
|
- XC90 T8 PHEV (2023)
|
||||||
|
|
||||||
Please let me know if your car works with this addon so I can expand the list!
|
Please let me know if your car works with this addon so I can expand the list!
|
||||||
|
|
||||||
@@ -21,12 +22,12 @@ Here is what every option means:
|
|||||||
|
|
||||||
| Name | Type | Default | Description |
|
| Name | Type | Default | Description |
|
||||||
| -------------------- | :-------: | :----------: | --------------------------------------------------------------- |
|
| -------------------- | :-------: | :----------: | --------------------------------------------------------------- |
|
||||||
| `updateInterval` | `int` | **required** | Update intervall in seconds. |
|
| `CONF_updateInterval` | `int` | **required** | Update intervall in seconds. |
|
||||||
| `babelLocale` | `string` | **required** | Select your country from this [list](https://www.ibm.com/docs/en/radfws/9.7?topic=overview-locales-code-pages-supported). "Locale name" is the column you need! |
|
| `CONF_babelLocale` | `string` | **required** | Select your country from this [list](https://www.ibm.com/docs/en/radfws/9.7?topic=overview-locales-code-pages-supported). "Locale name" is the column you need! |
|
||||||
| `mqtt` | `json` | **required** | Broker = Mqtt Broker IP / Username and Passwort are optional! |
|
| `CONF_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 REQUIRED. Get your Vccapi key from [here](https://developer.volvocars.com/account/). |
|
| `CONF_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 REQUIRED. Get your Vccapi key from [here](https://developer.volvocars.com/account/). |
|
||||||
|
| `CONF_debug` | `string` | | Debug option (true/false) - optional! |
|
||||||
| `TZ` | `string` | | Container timezone eg "Europe/Berlin" |
|
| `TZ` | `string` | | Container timezone eg "Europe/Berlin" |
|
||||||
| `debug` | `string` | | Debug option (True/False) - optional! |
|
|
||||||
|
|
||||||
If you like my work:
|
If you like my work:
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
VERSION = "v1.0.9"
|
VERSION = "v1.0.11"
|
||||||
|
|
||||||
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"
|
||||||
@@ -12,7 +12,7 @@ CAR_UNLOCK_URL = "https://api.volvocars.com/connected-vehicle/v2/vehicles/{0}/co
|
|||||||
RECHARGE_STATUS_URL = "https://api.volvocars.com/energy/v1/vehicles/{0}/recharge-status"
|
RECHARGE_STATUS_URL = "https://api.volvocars.com/energy/v1/vehicles/{0}/recharge-status"
|
||||||
|
|
||||||
charging_system_states = {"CHARGING_SYSTEM_CHARGING": "Charging", "CHARGING_SYSTEM_IDLE": "Idle",
|
charging_system_states = {"CHARGING_SYSTEM_CHARGING": "Charging", "CHARGING_SYSTEM_IDLE": "Idle",
|
||||||
"CHARGING_SYSTEM_FAULT": "Fault", "CHARGING_SYSTEM_UNSPECIFIED": "UNSPECIFIED"}
|
"CHARGING_SYSTEM_FAULT": "Fault", "CHARGING_SYSTEM_UNSPECIFIED": "Unspecified"}
|
||||||
|
|
||||||
supported_sensors = [
|
supported_sensors = [
|
||||||
{"name": "Battery Charge Level", "id": "battery_charge_level", "unit": "%", "icon": "car-battery", "url": RECHARGE_STATUS_URL},
|
{"name": "Battery Charge Level", "id": "battery_charge_level", "unit": "%", "icon": "car-battery", "url": RECHARGE_STATUS_URL},
|
||||||
|
|||||||
+5
-5
@@ -12,7 +12,7 @@ from const import VEHICLE_DETAILS_URL, CLIMATE_START_URL, CLIMATE_STOP_URL, CAR_
|
|||||||
|
|
||||||
mqtt_client: mqtt.Client
|
mqtt_client: mqtt.Client
|
||||||
subscribed_topics = []
|
subscribed_topics = []
|
||||||
assumed_climate_state = "OFF"
|
assumed_climate_state = {}
|
||||||
last_data_update = None
|
last_data_update = None
|
||||||
|
|
||||||
|
|
||||||
@@ -49,14 +49,14 @@ def on_message(client, userdata, msg):
|
|||||||
if payload == "ON":
|
if payload == "ON":
|
||||||
api_thread = threading.Thread(target=volvo.api_call, args=(CLIMATE_START_URL, "POST", vin))
|
api_thread = threading.Thread(target=volvo.api_call, args=(CLIMATE_START_URL, "POST", vin))
|
||||||
api_thread.start()
|
api_thread.start()
|
||||||
assumed_climate_state = "ON"
|
assumed_climate_state[vin] = "ON"
|
||||||
# Starting timer to disable climate after 30 mins
|
# Starting timer to disable climate after 30 mins
|
||||||
threading.Timer(30 * 60, volvo.disable_climate).start()
|
threading.Timer(30 * 60, volvo.disable_climate, (vin, )).start()
|
||||||
update_car_data()
|
update_car_data()
|
||||||
elif payload == "OFF":
|
elif payload == "OFF":
|
||||||
api_thread = threading.Thread(target=volvo.api_call, args=(CLIMATE_STOP_URL, "POST", vin))
|
api_thread = threading.Thread(target=volvo.api_call, args=(CLIMATE_STOP_URL, "POST", vin))
|
||||||
api_thread.start()
|
api_thread.start()
|
||||||
assumed_climate_state = "OFF"
|
assumed_climate_state[vin] = "OFF"
|
||||||
update_car_data()
|
update_car_data()
|
||||||
elif "lock_status" in msg.topic:
|
elif "lock_status" in msg.topic:
|
||||||
if payload == "LOCK":
|
if payload == "LOCK":
|
||||||
@@ -92,7 +92,7 @@ def update_car_data():
|
|||||||
|
|
||||||
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[vin]
|
||||||
else:
|
else:
|
||||||
state = "OFF"
|
state = "OFF"
|
||||||
|
|
||||||
|
|||||||
+10
-3
@@ -95,11 +95,18 @@ def get_vehicles():
|
|||||||
if len(vins) == 0:
|
if len(vins) == 0:
|
||||||
raise Exception("No vehicle found, exiting application!")
|
raise Exception("No vehicle found, exiting application!")
|
||||||
else:
|
else:
|
||||||
|
initialize_climate(vins)
|
||||||
print("Vin: " + str(vins) + " found!")
|
print("Vin: " + str(vins) + " found!")
|
||||||
|
|
||||||
|
|
||||||
def disable_climate():
|
def initialize_climate(vins):
|
||||||
mqtt.assumed_climate_state = "OFF"
|
for vin in vins:
|
||||||
|
mqtt.assumed_climate_state[vin] = "OFF"
|
||||||
|
|
||||||
|
|
||||||
|
def disable_climate(vin):
|
||||||
|
print("Turning climate off by timer!")
|
||||||
|
mqtt.assumed_climate_state[vin] = "OFF"
|
||||||
mqtt.update_car_data()
|
mqtt.update_car_data()
|
||||||
|
|
||||||
|
|
||||||
@@ -167,7 +174,7 @@ def parse_api_data(url, data, sensor_id=None):
|
|||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
elif sensor_id == "charging_system_status":
|
elif sensor_id == "charging_system_status":
|
||||||
if "charging_system_status" in data["data"]:
|
if "chargingSystemStatus" in data["data"]:
|
||||||
return charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
return charging_system_states[data["data"]["chargingSystemStatus"]["value"]]
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
Reference in New Issue
Block a user