From a80cc2bf01b1b6b5e3e864c66441ab67581cb302 Mon Sep 17 00:00:00 2001 From: jens Date: Sun, 6 Dec 2020 12:05:55 +0100 Subject: [PATCH] - TC: prepared for Rate set and get - improved TC state machine --- brewpi.py | 44 ++++++++++++++++++++++--------- brewpi_gui.py | 12 +++++---- components/pid/temp_controller.py | 3 +-- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/brewpi.py b/brewpi.py index aee6b2d..324d0ef 100644 --- a/brewpi.py +++ b/brewpi.py @@ -121,37 +121,55 @@ class TcTask(ATask): def __init__(self, tc: temp_controller.TempController, interval, msg_handler: MsgIo): ATask.__init__(self, interval) + self.tc = tc self.msg_handler = msg_handler msg_handler.set_recv_handler(self.recv) - self.tc = tc - self.temp_soll = 30 - def on_state_changed(self, state): - print ("State change to {}".format(state)) - asyncio.create_task(self.send({'State': state.value})) + def on_state_changed(self, value): + print ("State change to {}".format(value)) + asyncio.create_task(self.send({'State': value.value})) + + def on_temp_soll_changed(self, value): + print ("Temp soll change to {}".format(value)) + asyncio.create_task(self.send({'Soll': {'Temp': value}})) + + def on_rate_soll_changed(self, value): + print ("Rate soll change to {}".format(value)) + asyncio.create_task(self.send({'Soll': {'Rate': value}})) + + def on_temp_ist_changed(self, value): + print ("Temp ist change to {}".format(value)) + asyncio.create_task(self.send({'Ist': {'Temp': value}})) + + def on_rate_ist_changed(self, value): + print ("Rate ist change to {}".format(value)) + asyncio.create_task(self.send({'Ist': {'Rate': value}})) async def recv(self, data): print(data) for pair in data.items(): if 'Soll' in pair[0]: - self.temp_soll = pair[1] + self.tc.set_theta_soll(pair[1]) + elif 'Rate' in pair[0]: + self.tc.set_heatrate_soll(pair[1]) async def send(self, data): await self.msg_handler.send(data) async def on_process(self): print("{}: Started with interval {} s".format(self.msg_handler.get_key(), self.interval)) - temp_soll = Value() - self.tc.set_on_changed('state', ChangedInteger(self.on_state_changed).set) + 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_theta_soll(30.0) + self.tc.set_heatrate_soll(1.0) while True: - temp_soll.set(self.temp_soll) - if temp_soll.is_changed(): - self.tc.set_theta_soll(temp_soll.get()) - await self.send({'Soll': temp_soll.get()}) self.tc.process() - await asyncio.sleep(self.interval) diff --git a/brewpi_gui.py b/brewpi_gui.py index 6e63319..fd2b1b1 100644 --- a/brewpi_gui.py +++ b/brewpi_gui.py @@ -72,11 +72,13 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): def on_tempctrl_changed(self, msg): print("on_tempctrl_changed {}".format(msg)) - if "Soll" in msg: - self.lcdNumber.display(str(msg['Soll'])) - if self.slider_temp_soll_initial_update: - self.Slider_temp_soll.setValue(msg['Soll']) - self.slider_temp_soll_initial_update = False + for key in msg: + if "Soll" in key: + submsg = msg['Soll'] + self.lcdNumber.display(str(submsg['Temp'])) + if self.slider_temp_soll_initial_update: + self.Slider_temp_soll.setValue(submsg['Temp']) + self.slider_temp_soll_initial_update = False def on_heater_changed(self, msg): print("on_heater_changed {}".format(msg)) diff --git a/components/pid/temp_controller.py b/components/pid/temp_controller.py index a0958eb..960dd2e 100644 --- a/components/pid/temp_controller.py +++ b/components/pid/temp_controller.py @@ -99,10 +99,9 @@ class TempController(AttributeChange): self.y = 0 if state_next != self.state: + self.state = state_next print("New state = {}".format(state_next)) - self.state = state_next - def get_power(self): return self.y