From 886d03deffd502fb307616fe26f365227e40f173 Mon Sep 17 00:00:00 2001 From: jens Date: Sun, 29 Nov 2020 10:56:43 +0100 Subject: [PATCH] - added AttributeChange --- brewpi.py | 2 +- components/atemperatureSensor.py | 10 +++++----- components/sensor/tempSensorSim.py | 9 ++++----- utils/value.py | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/brewpi.py b/brewpi.py index 3592a69..37f86a9 100644 --- a/brewpi.py +++ b/brewpi.py @@ -46,7 +46,7 @@ class TempSensorTask(ATask): self.kalman.initial((self.sensor.temperature(), 0)) temp = ValueChanged(self.on_temp_changed, prec=1) temp_kalman = ValueChanged(self.on_temp_changed_kalman, prec=1) - self.sensor.set_on_changed(temp) + self.sensor.set_on_changed("temp", temp) while True: self.sensor.process() Z = self.kalman.process_measurement((self.sensor.temperature(), 0), 0) diff --git a/components/atemperatureSensor.py b/components/atemperatureSensor.py index 2b434a0..be75946 100644 --- a/components/atemperatureSensor.py +++ b/components/atemperatureSensor.py @@ -1,8 +1,12 @@ import abc import logging +from utils.value import AttributeChange, ValueChanged -class ATemperatureSensor: +class ATemperatureSensor(AttributeChange): + def __init__(self): + AttributeChange.__init__(self) + def log(self, s): d = {'user': "TemperatureSensor" + "::" + self.name()} logging.info ("{}".format(s), extra=d) @@ -18,7 +22,3 @@ class ATemperatureSensor: @abc.abstractmethod def process(self): pass - - @abc.abstractmethod - def set_on_changed(self, on_changed): - pass diff --git a/components/sensor/tempSensorSim.py b/components/sensor/tempSensorSim.py index 1da31c5..a9ec580 100644 --- a/components/sensor/tempSensorSim.py +++ b/components/sensor/tempSensorSim.py @@ -8,11 +8,12 @@ class TempSensorSim(ATemperatureSensor): return "FakeTemp" def __init__(self): + ATemperatureSensor.__init__(self) self.count = 0 self.freq = 0.2 self.log("Created") - self.temp = Value(22.37) - self.temp_set = self.temp.get() + self.temp = 22.37 + self.temp_set = self.temp def set_fake_temp(self, temp): self.temp_set = temp @@ -23,7 +24,5 @@ class TempSensorSim(ATemperatureSensor): def process(self): temp = self.temperature() - self.temp.set(temp) + self.temp = temp - def set_on_changed(self, on_changed: ValueChanged): - self.temp = on_changed diff --git a/utils/value.py b/utils/value.py index 8eb334f..6b8c027 100644 --- a/utils/value.py +++ b/utils/value.py @@ -30,3 +30,23 @@ class ValueChanged(object): self.value = value_rounded if has_changed: self.on_changed(value_rounded) + + +class AttributeChange(object): + def __init__(self): + self.callbacks: ValueChanged = {} + + def set_on_changed(self, key, on_changed: ValueChanged): + if key not in self.callbacks: + self.callbacks[key] = on_changed + + def __setattr__(self, key, value): + try: + old = super().__getattribute__(key) + print("Change: {} from {} to {}".format(key, old, value)) + except: + print("Create: {} and initialize with {}".format(key, value)) + super().__setattr__(key, value) + + if key in self.callbacks: + self.callbacks[key].set(value) \ No newline at end of file