Compare commits

..

No commits in common. "e21e272ceb916e70f0f053244a6476707634ce63" and "da402db1efab0400b97650a35290fedf68621872" have entirely different histories.

6 changed files with 85 additions and 3 deletions

View File

@ -6,6 +6,8 @@ from base import videv_base
import json
import time
BATTERY_WARN_LEVEL = 10
def is_json(data):
try:
@ -27,9 +29,11 @@ class base(mqtt_base):
RX_IGNORE_TOPICS = []
RX_IGNORE_KEYS = []
RX_FILTER_DATA_KEYS = []
#
KEY_WARNING = '__WARNING__'
def __init__(self, mqtt_client, topic):
super().__init__(mqtt_client, topic, default_values=dict.fromkeys(self.RX_KEYS))
super().__init__(mqtt_client, topic, default_values=dict.fromkeys(self.RX_KEYS + [self.KEY_WARNING]))
# data storage
# initialisations
mqtt_client.add_callback(topic=self.topic, callback=self.receive_callback)
@ -40,7 +44,7 @@ class base(mqtt_base):
def set(self, key, data, block_callback=[]):
if key in self.RX_IGNORE_KEYS:
pass # ignore these keys
elif key in self.RX_KEYS:
elif key in self.RX_KEYS or key == self.KEY_WARNING:
return super().set(key, data, block_callback)
else:
self.logger.warning("Unexpected key %s", key)
@ -101,3 +105,24 @@ class base(mqtt_base):
self.mqtt_client.send('/'.join([self.topic, key, self.TX_TOPIC] if len(self.TX_TOPIC) > 0 else [self.topic, key]), data)
else:
self.logger.error("Unknown tx toptic. Set TX_TOPIC of class to a known value")
class warning(dict):
TYPE_BATTERY_LOW = 1
TYPE_OVERTEMPERATURE = 2
#
KEY_ID = 'id'
KEY_TYPE = 'type'
KEY_TEXT = 'text'
KEY_TM = 'tm'
def __init__(self, identification, type, text, args):
super().__init__({
self.KEY_ID: identification,
self.KEY_TYPE: type,
self.KEY_TEXT: text % args,
self.KEY_TM: time.localtime(),
})
def __str__(self):
return time.asctime(self.get(self.KEY_TM)) + ": " + self[self.KEY_TEXT] + " - " + self[self.KEY_ID]

View File

@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
#
from devices.base import base
from devices.base import BATTERY_WARN_LEVEL
from devices.base import warning
import json
@ -51,11 +53,27 @@ 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_BATTERY, None, self.__warning__, True)
self.__battery_warning__ = False
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))
#
# WARNING CALL
#
def __warning__(self, client, key, data):
if data <= BATTERY_WARN_LEVEL:
if not self.__battery_warning__:
self.__battery_warning__ = True
w = warning(self.topic, warning.TYPE_BATTERY_LOW, "Battery low (%.1f%%)", data)
self.logger.warning(w)
self.set(self.KEY_WARNING, w)
else:
self.__battery_warning__ = False
#
# RX
#

View File

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
#
from devices.base import base
from devices.base import warning
import logging
import task
@ -68,6 +69,8 @@ class shelly(base):
self.delayed_flash_task = task.delayed(0.3, self.flash_task)
self.delayed_off_task = task.delayed(0.3, self.off_task)
#
self.add_callback(self.KEY_OVERTEMPERATURE, True, self.__warning__, True)
#
self.all_off_requested = False
def __state_logging__(self, inst, key, data):
@ -90,6 +93,14 @@ class shelly(base):
def flash_active(self):
return self.output_key_delayed is not None
#
# WARNING CALL
#
def __warning__(self, client, key, data):
w = warning(self.topic, warning.TYPE_OVERTEMPERATURE, "Temperature to high (%.1f°C)", self.get(self.KEY_TEMPERATURE) or math.nan)
self.logger.warning(w)
self.set(self.KEY_WARNING, w)
#
# RX
#

View File

@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
#
from devices.base import base
from devices.base import warning
import logging
@ -88,11 +89,21 @@ class silvercrest_motion_sensor(base):
def __init__(self, mqtt_client, topic):
super().__init__(mqtt_client, topic)
#
self.add_callback(self.KEY_BATTERY_LOW, True, self.__warning__, True)
def __state_logging__(self, inst, key, data):
if key in [self.KEY_OCCUPANCY, self.KEY_UNMOUNTED]:
self.logger.info("State change of '%s' to '%s'", key, repr(data))
#
# WARNING CALL
#
def __warning__(self, client, key, data):
w = warning(self.topic, warning.TYPE_BATTERY_LOW, "Battery low (%.1f%%)", self.get(self.KEY_BATTERY) or math.nan)
self.logger.warning(w)
self.set(self.KEY_WARNING, w)
#
# RX
#

View File

@ -2,6 +2,8 @@
# -*- coding: utf-8 -*-
#
from devices.base import base
from devices.base import BATTERY_WARN_LEVEL
from devices.base import warning
import logging
@ -178,11 +180,26 @@ class tradfri_button(base):
def __init__(self, mqtt_client, topic):
super().__init__(mqtt_client, topic)
#
self.add_callback(self.KEY_BATTERY, None, self.__warning__, True)
self.__battery_warning__ = False
def __state_logging__(self, inst, key, data):
if key in [self.KEY_ACTION]:
self.logger.info("Input '%s' with '%s'", key, repr(data))
#
# WARNING CALL
#
def __warning__(self, client, key, data):
if data <= BATTERY_WARN_LEVEL:
if not self.__battery_warning__:
w = warning(self.topic, warning.TYPE_BATTERY_LOW, "Battery low (%.1f%%)", data)
self.logger.warning(w)
self.set(self.KEY_WARNING, w)
else:
self.__battery_warning__ = False
#
# RX
#

View File

@ -208,7 +208,7 @@ 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 = task.periodic(5 * 60, self.cyclic_task_tx_setpoint)
self.ct2.run()
def timer_expired(self, device, data, key):