Permanent setpoint sending disabled and time limited retries added to valve class

This commit is contained in:
Dirk Alders 2024-02-25 08:56:38 +01:00
parent b728a472e7
commit 6638f2de69
2 changed files with 33 additions and 5 deletions

View File

@ -3,6 +3,8 @@
# #
from devices.base import base from devices.base import base
import json import json
import task
import time
class brennenstuhl_heatingvalve(base): class brennenstuhl_heatingvalve(base):
@ -42,6 +44,10 @@ class brennenstuhl_heatingvalve(base):
KEY_VALVE_DETECTION = "valve_detection" KEY_VALVE_DETECTION = "valve_detection"
KEY_WINDOW_DETECTION = "window_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 TX_TYPE = base.TX_DICT
# #
RX_KEYS = [KEY_LINKQUALITY, KEY_BATTERY, KEY_HEATING_SETPOINT, KEY_TEMPERATURE] RX_KEYS = [KEY_LINKQUALITY, KEY_BATTERY, KEY_HEATING_SETPOINT, KEY_TEMPERATURE]
@ -51,11 +57,38 @@ class brennenstuhl_heatingvalve(base):
super().__init__(mqtt_client, topic) super().__init__(mqtt_client, topic)
self.mqtt_client.send(self.topic + '/' + self.TX_TOPIC, json.dumps({self.KEY_WINDOW_DETECTION: "ON", 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.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): 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]: 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)) 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 # RX
# #

View File

@ -208,17 +208,12 @@ class heating_function(common_base):
# cyclic task initialisation # cyclic task initialisation
self.ct = task.periodic(1, self.cyclic_task) self.ct = task.periodic(1, self.cyclic_task)
self.ct.run() self.ct.run()
self.ct2 = task.periodic(15 * 60, self.cyclic_task_tx_setpoint)
self.ct2.run()
def timer_expired(self, device, data, key): def timer_expired(self, device, data, key):
self.set(self.KEY_TEMPERATURE_SETPOINT, self[self.KEY_USER_TEMPERATURE_SETPOINT]) 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.heating_valve.logger.info('Timer expired. returning to regular temperature setpoint %.1f°C.',
self[self.KEY_TEMPERATURE_SETPOINT]) 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): def cyclic_task(self, rt):
timer_value = self[self.KEY_BOOST_TIMER] - self.ct.cycle_time timer_value = self[self.KEY_BOOST_TIMER] - self.ct.cycle_time
if self[self.KEY_BOOST_TIMER] <= 0: if self[self.KEY_BOOST_TIMER] <= 0: