Permanent setpoint sending disabled and time limited retries added to valve class
This commit is contained in:
parent
b728a472e7
commit
6638f2de69
@ -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
|
||||||
#
|
#
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user