From 6638f2de6972c23118a172b109bf4627150604a6 Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Sun, 25 Feb 2024 08:56:38 +0100 Subject: [PATCH] Permanent setpoint sending disabled and time limited retries added to valve class --- devices/brennenstuhl.py | 33 +++++++++++++++++++++++++++++++++ function/modules.py | 5 ----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/devices/brennenstuhl.py b/devices/brennenstuhl.py index e6fa64d..79e0111 100644 --- a/devices/brennenstuhl.py +++ b/devices/brennenstuhl.py @@ -3,6 +3,8 @@ # from devices.base import base import json +import task +import time class brennenstuhl_heatingvalve(base): @@ -42,6 +44,10 @@ class brennenstuhl_heatingvalve(base): KEY_VALVE_DETECTION = "valve_detection" KEY_WINDOW_DETECTION = "window_detection" # + RETRY_CYCLE_TIME = 2.5 + MAX_TX_RETRIES = 20 + RETRY_TIMEOUT = RETRY_CYCLE_TIME * MAX_TX_RETRIES + # TX_TYPE = base.TX_DICT # RX_KEYS = [KEY_LINKQUALITY, KEY_BATTERY, KEY_HEATING_SETPOINT, KEY_TEMPERATURE] @@ -51,11 +57,38 @@ class brennenstuhl_heatingvalve(base): super().__init__(mqtt_client, topic) self.mqtt_client.send(self.topic + '/' + self.TX_TOPIC, json.dumps({self.KEY_WINDOW_DETECTION: "ON", self.KEY_CHILD_LOCK: "UNLOCK", self.KEY_VALVE_DETECTION: "ON", self.KEY_SYSTEM_MODE: "heat", self.KEY_PRESET: "manual"})) + self.add_callback(self.KEY_HEATING_SETPOINT, None, self.__valave_temp_rx__) + self.__tx_temperature__ = None + self.__rx_temperature__ = None + self.__tx_timestamp__ = 0 + # + self.task = task.periodic(self.RETRY_CYCLE_TIME, self.__task__) + self.task.run() def __state_logging__(self, inst, key, data): if key in [self.KEY_HEATING_SETPOINT, self.KEY_CHILD_LOCK, self.KEY_WINDOW_DETECTION, self.KEY_VALVE_DETECTION]: self.logger.info("State change of '%s' to '%s'", key, repr(data)) + def send_command(self, key, data): + if key == self.KEY_HEATING_SETPOINT: + self.__tx_temperature__ = data + self.__tx_timestamp__ = time.time() + base.send_command(self, key, data) + + def __valave_temp_rx__(self, inst, key, data): + if key == self.KEY_HEATING_SETPOINT: + self.__rx_temperature__ = data + + def __task__(self, rt): + if self.__tx_temperature__ is not None and self.__tx_timestamp__ is not None: # Already send a setpoint + if self.__tx_temperature__ != self.__rx_temperature__: # Setpoint and valve feedback are unequal + if time.time() - self.__tx_timestamp__ < self.RETRY_TIMEOUT: # Timeout condition allows resend of setpoint + self.logger.warning("Setpoint not yet acknoledged by device. Sending setpoint again") + self.set_heating_setpoint(self.__tx_temperature__) + return + else: + self.__tx_timestamp__ = None # Disable resend logic, if setpoint and valve setpoint are equal + # # RX # diff --git a/function/modules.py b/function/modules.py index 41c9777..b7750d1 100644 --- a/function/modules.py +++ b/function/modules.py @@ -208,17 +208,12 @@ class heating_function(common_base): # cyclic task initialisation self.ct = task.periodic(1, self.cyclic_task) self.ct.run() - self.ct2 = task.periodic(15 * 60, self.cyclic_task_tx_setpoint) - self.ct2.run() def timer_expired(self, device, data, key): self.set(self.KEY_TEMPERATURE_SETPOINT, self[self.KEY_USER_TEMPERATURE_SETPOINT]) self.heating_valve.logger.info('Timer expired. returning to regular temperature setpoint %.1f°C.', self[self.KEY_TEMPERATURE_SETPOINT]) - def cyclic_task_tx_setpoint(self, rt): - self.heating_valve.set_heating_setpoint(self.get(self.KEY_TEMPERATURE_SETPOINT)) - def cyclic_task(self, rt): timer_value = self[self.KEY_BOOST_TIMER] - self.ct.cycle_time if self[self.KEY_BOOST_TIMER] <= 0: