From df33398c2d0bf596ee415b091f7f3549243eff1a Mon Sep 17 00:00:00 2001 From: jens Date: Mon, 7 Dec 2020 09:52:31 +0100 Subject: [PATCH] - used on-changed callbacks for heater and pot --- brewpi.py | 57 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/brewpi.py b/brewpi.py index 579c29a..3f6431a 100644 --- a/brewpi.py +++ b/brewpi.py @@ -9,8 +9,9 @@ from components.pid import kalman, temp_controller from ws.message import MsgIo, MessageDispatcher from utils.value import Value, ChangedFloat, ChangedInteger -TC_DT = 0.1 -PARAMS_DT = 0.1 +DT_CTRL = 0.1 +DT_PARAMS = 1.0 + class ATask: def __init__(self, interval): @@ -58,6 +59,12 @@ class HeaterTask(ATask): def actor(self, y): self.heater.setPower(max(0, 0 + self.heater.get_power_max() * y)) + def on_changed_activated(self, is_activated): + asyncio.create_task(self.send({'Activate': int(is_activated)})) + + def on_changed_power(self, power): + asyncio.create_task(self.send({'Power': power})) + async def recv(self, data): print(data) for pair in data.items(): @@ -73,12 +80,10 @@ class HeaterTask(ATask): print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval)) await self.send({'Capabilities': {'Power': {'Min': self.heater.get_power_min(), 'Max': self.heater.get_power_max()}}}) - power = Value() + self.heater.set_on_changed('is_activated', ChangedInteger(self.on_changed_activated).set) + self.heater.set_on_changed('power_eff', ChangedInteger(self.on_changed_power).set) while True: self.heater.process() - power.set(round(self.heater.getPower())) - if power.is_changed(): - await self.send({'Power': power.get(), 'Activate': int(self.heater.is_activated() != 0)}) await asyncio.sleep(self.interval) @@ -90,6 +95,12 @@ class PotTask(ATask): msg_handler.set_recv_handler(self.recv) self.plant = pot + def on_changed_power(self, value): + asyncio.create_task(self.send({'Power': value})) + + def on_changed_temp(self, value): + asyncio.create_task(self.send({'Temp': value})) + async def recv(self, data): print(data) for key in data: @@ -100,19 +111,11 @@ class PotTask(ATask): async def on_process(self): print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval)) - plant_temp = Value(-1) - plant_power = Value() + self.plant.set_on_changed('power_actual', ChangedInteger(self.on_changed_power).set) + self.plant.set_on_changed('temp', ChangedFloat(self.on_changed_temp, prec=1).set) + while True: self.plant.process() - plant_power.set(round(self.plant.getPower())) - plant_temp.set(round(self.plant.getTemperature(), 1)) - - if plant_power.is_changed(): - await self.send({'Power': plant_power.get()}) - - if plant_temp.is_changed(): - await self.send({'Temp': plant_temp.get()}) - await asyncio.sleep(self.interval) @@ -164,8 +167,8 @@ class TcTask(ATask): self.tc.set_on_changed('state', self.on_state_changed) self.tc.set_on_changed('theta_ist', ChangedFloat(self.on_temp_ist_changed, prec=1).set) self.tc.set_on_changed('heatrate_ist', ChangedFloat(self.on_rate_ist_changed, prec=1).set) - self.tc.set_on_changed('theta_soll_set', self.on_temp_soll_changed) - self.tc.set_on_changed('heatrate_soll_set', self.on_rate_soll_changed) + self.tc.set_on_changed('theta_soll_set', ChangedFloat(self.on_temp_soll_changed, prec=1).set) + self.tc.set_on_changed('heatrate_soll_set', ChangedFloat(self.on_rate_soll_changed, prec=1).set) self.tc.set_theta_soll(30.0) self.tc.set_heatrate_soll(1.0) @@ -207,11 +210,11 @@ if __name__ == '__main__': # Sensor sensor = TempSensorSim() - taskmgr.add(TempSensorTask(sensor, TC_DT, dispatcher.msgio_get("Sensor"))) + taskmgr.add(TempSensorTask(sensor, DT_CTRL, dispatcher.msgio_get("Sensor"))) # Plant pot_params = { - "dt" : PARAMS_DT, + "dt" : DT_PARAMS, "theta" : 20, "C" : 4190, "M" : 20, @@ -221,25 +224,25 @@ if __name__ == '__main__': } pot = Pot(pot_params, 20) pot.set_on_changed("temp", ChangedFloat(sensor.set_fake_temp, prec=3).set) - taskmgr.add(PotTask(pot, TC_DT, dispatcher.msgio_get("Pot"))) + taskmgr.add(PotTask(pot, DT_CTRL, dispatcher.msgio_get("Pot"))) # Heater heater = Heater() heater.set_on_changed("power_eff", ChangedFloat(pot.setPower, prec=0).set) - heater_task = HeaterTask(heater, TC_DT, dispatcher.msgio_get("Heater")) + heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater")) taskmgr.add(heater_task) # Temperature Controller tc_params = { "Hold": { - "dt": PARAMS_DT, + "dt": DT_PARAMS, "kp": 0.5, "ki": 0.005, "kd": 0.0, "rho": 1.0 }, "Heat": { - "dt": PARAMS_DT, + "dt": DT_PARAMS, "kp": 0.1, "ki": 0.01, "kd": 0.0, @@ -249,7 +252,7 @@ if __name__ == '__main__': # Kalman Filter kalman_params = { - "dt" : PARAMS_DT, + "dt" : DT_PARAMS, "var_P" : 1, "var_Q" : 0.0001, "var_R" : 1 @@ -257,7 +260,7 @@ if __name__ == '__main__': tc = temp_controller.TempController(tc_params, kalman_params) tc.set_on_changed("y", heater_task.actor) - tc_task = TcTask(tc, TC_DT, dispatcher.msgio_get("TempCtrl")) + tc_task = TcTask(tc, DT_CTRL, dispatcher.msgio_get("TempCtrl")) taskmgr.add(tc_task) sensor.set_on_changed("temp", ChangedFloat(tc.set_theta_ist, prec=2).set)