From 9a6d128cdf9950385b97b8644f71dd7f5c67d495 Mon Sep 17 00:00:00 2001 From: Linus Dietz <45101649+Dielee@users.noreply.github.com> Date: Mon, 3 Jul 2023 07:48:39 +0200 Subject: [PATCH] Rework pre-climate state based on engine state --- src/mqtt.py | 18 +++++++++--------- src/volvo.py | 23 ++++++++++++++++------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/mqtt.py b/src/mqtt.py index bc299d5..ebf95bb 100644 --- a/src/mqtt.py +++ b/src/mqtt.py @@ -17,7 +17,7 @@ subscribed_topics = [] assumed_climate_state = {} last_data_update = None climate_timer = {} -door_status = {} +engine_status = {} devices = {} @@ -62,21 +62,21 @@ def on_message(client, userdata, msg): payload = msg.payload.decode("UTF-8") if "climate_status" in msg.topic: - global assumed_climate_state, climate_timer, door_status + global assumed_climate_state, climate_timer, engine_status if payload == "ON": # Start the api call in another thread for HA performance Thread(target=volvo.api_call, args=(CLIMATE_START_URL, "POST", vin)).start() # Start door check thread to turn off climate if driver door is opened - door_thread = Thread(target=volvo.check_door_status, args=(vin, )) - door_thread.start() - door_status[vin] = door_thread - # Starting timer to disable climate after 30 mins + check_engine_thread = Thread(target=volvo.check_engine_status, args=(vin, )) + check_engine_thread.start() + engine_status[vin] = check_engine_thread + # Starting timer to disable climate after 30 mins climate_timer[vin] = Timer(30 * 60, volvo.disable_climate, (vin, )) climate_timer[vin].start() - # Set and update switch status + # Set and update switch status assumed_climate_state[vin] = "ON" update_car_data() elif payload == "OFF": @@ -84,8 +84,8 @@ def on_message(client, userdata, msg): Thread(target=volvo.api_call, args=(CLIMATE_STOP_URL, "POST", vin)).start() # Stop door check thread if running - if door_status[vin].is_alive(): - door_status[vin].do_run = False + if engine_status[vin].is_alive(): + engine_status[vin].do_run = False # Stop climate timer if active if climate_timer[vin].is_alive(): diff --git a/src/volvo.py b/src/volvo.py index d739a39..91059e7 100644 --- a/src/volvo.py +++ b/src/volvo.py @@ -174,18 +174,27 @@ def initialize_climate(vins): def disable_climate(vin): logging.info("Turning climate off by timer!") - mqtt.door_status[vin].do_run = False + mqtt.engine_status[vin].do_run = False mqtt.assumed_climate_state[vin] = "OFF" mqtt.update_car_data() -def check_door_status(vin): +def check_engine_status(vin): + endpoint_url = "" + engine_state_supported = False + for endpoint in supported_endpoints[vin]: + if "engine_state" == endpoint["id"]: + engine_state_supported = True + endpoint_url = endpoint["url"] + + if not engine_state_supported: + # Exit thread as engine state is unsupported by car + return None + t = currentThread() while getattr(t, "do_run", True): - lock_door_left = api_call(LOCK_STATE_URL, "GET", vin, "door_front_left", True) - lock_door_right = api_call(LOCK_STATE_URL, "GET", vin, "door_front_right", True) - if lock_door_left == "ON" or lock_door_right == "ON": - Thread(target=api_call, args=(CLIMATE_STOP_URL, "POST", vin)).start() + engine_state = api_call(endpoint_url, "GET", vin, "engine_state", True) + if engine_state == "RUNNING": mqtt.assumed_climate_state[vin] = "OFF" mqtt.update_car_data() break @@ -258,7 +267,7 @@ def cached_request(url, method, vin, force_update=False): if (datetime.now(util.TZ) - cached_requests[vin + "_" + url]["last_update"]).total_seconds() \ >= settings["updateInterval"] or (force_update and (datetime.now(util.TZ) - cached_requests[vin + "_" + url] - ["last_update"]).total_seconds() >= 2): + ["last_update"]).total_seconds() >= 2): # Old Data in Cache, or force mode active, updating logging.debug("Starting " + method + " call against " + url) try: