From 71cd87085f3ae42763a346dfe455adc85bd96e08 Mon Sep 17 00:00:00 2001 From: jens Date: Wed, 16 Dec 2020 18:42:05 +0100 Subject: [PATCH] - load params from config.json --- .gitignore | 1 + brewpi.py | 127 ++++++++++++++---------------- components/pid/temp_controller.py | 42 +++++----- config.json.templ | 46 +++++++++++ 4 files changed, 127 insertions(+), 89 deletions(-) create mode 100644 config.json.templ diff --git a/.gitignore b/.gitignore index 43233e4..8cb61ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__ .idea/ +config.json diff --git a/brewpi.py b/brewpi.py index 9232452..9f6b7a6 100644 --- a/brewpi.py +++ b/brewpi.py @@ -1,6 +1,6 @@ import asyncio -from time import sleep import abc +import json from ws.server.ws_server_multi_user import WsServerMultiUser from components import ATemperatureSensor, AHeater, AStirrer from components.sensor import TempSensorFactory @@ -231,81 +231,72 @@ async def asleep(time): await asyncio.sleep(time) if __name__ == '__main__': - if 0: - taskmgr = PeriodicUpdaterThreaded() - taskmgr.start("localhost", 8765) - bg_thread = Thread(target=taskmgr.loop.run_forever) - bg_thread.setDaemon(True) - bg_thread.start() - else: - dispatcher = MessageDispatcher() - server = WsServerMultiUser(listener=dispatcher) - taskmgr = TaskManager() + config = json.load(open("config.json")) + dispatcher = MessageDispatcher() + server = WsServerMultiUser(listener=dispatcher) + taskmgr = TaskManager() - # Sensor - sensor = TempSensorFactory.create("sim") - taskmgr.add(TempSensorTask(sensor, DT_CTRL, dispatcher.msgio_get("Sensor"))) + DT_CTRL = 1.0/config['Controller']['sim_warp_factor'] - # Plant - pot_params = { - "dt" : DT_PARAMS, - "theta" : 20, - "C" : 4190, - "M" : 20, - "L" : 0.05, - "Td" : 12, - "kn" : 0.2 - } + # Sensor + sensor = TempSensorFactory.create(config['Controller']['sensor_name']) + taskmgr.add(TempSensorTask(sensor, DT_CTRL, dispatcher.msgio_get("Sensor"))) + + # Plant + pot_params = { + "theta" : 20, + "C" : 4190, + "M" : 20, + "L" : 0.05, + "Td" : 12, + "kn" : 0.2 + } + + pot_params = config['Plant'] + if "sim" in config['Controller']['plant_name']: pot = Pot(pot_params, 20) pot.set_on_changed("temp", ChangedFloat(sensor.set_fake_temp, prec=3).set) taskmgr.add(PotTask(pot, DT_CTRL, dispatcher.msgio_get("Pot"))) - # Heater - heater = HeaterFactory.create("sim") - heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set) - heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater")) - taskmgr.add(heater_task) + # Heater + heater = HeaterFactory.create(config['Controller']['heater_name']) + heater.set_on_changed("power_eff", ChangedFloat(pot.set_power, prec=0).set) + heater_task = HeaterTask(heater, DT_CTRL, dispatcher.msgio_get("Heater")) + taskmgr.add(heater_task) - # Temperature Controller - tc_params = { - "Hold": { - "dt": DT_PARAMS, - "kp": 1.0, - "ki": 0.0, - "kd": 0.0, - "kt": 0.0 - }, - "Heat": { - "dt": DT_PARAMS, - "kp": 0.1, - "ki": 0.01, - "kd": 0.0, - "kt": 1.0 - } + # Temperature Controller + tc_params = { + "dt": 1.0, + "Kalman": { + "dt" : 1.0, + "var_P" : 1.0, + "var_Q" : 0.0001, + "var_R" : 1.0 + }, + "Hold": { + "kp": 1.0, + "ki": 0.0, + "kd": 0.0, + "kt": 0.0 + }, + "Heat": { + "kp": 0.1, + "ki": 0.01, + "kd": 0.0, + "kt": 1.0 } + } - # Kalman Filter - kalman_params = { - "dt" : DT_PARAMS, - "var_P" : 1, - "var_Q" : 0.0001, - "var_R" : 1 - } - - tc = TempController(tc_params, kalman_params) - tc.set_on_changed("y", heater_task.actor) - 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) - - # Message dispatcher - h_dispatcher = taskmgr.start() - h_server = server.listen("0.0.0.0", 8765) - asyncio.gather(h_dispatcher, h_server) - server.run_forever() - - while True: - print("Hallo") - sleep(1) + tc_params = config['TempCtrl'] + tc = TempController(tc_params) + tc.set_on_changed("y", heater_task.actor) + 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) + # Message dispatcher + h_dispatcher = taskmgr.start() + h_server = server.listen("0.0.0.0", 8765) + asyncio.gather(h_dispatcher, h_server) + server.run_forever() diff --git a/components/pid/temp_controller.py b/components/pid/temp_controller.py index 507a6f5..60f9c09 100644 --- a/components/pid/temp_controller.py +++ b/components/pid/temp_controller.py @@ -13,11 +13,11 @@ class States(Enum): class TempController(AttributeChange): - def __init__(self, params_pid, params_kalman): + def __init__(self, params): AttributeChange.__init__(self) - - self.pid_hold = Pid(params_pid['Hold']) - self.pid_rate = Pid(params_pid['Heat']) + dt = params['dt'] + self.pid_hold = Pid(params['Hold']) + self.pid_rate = Pid(params['Heat']) self.theta_ist_set = 20 self.theta_soll_set = 0 self.heatrate_ist_set = 0 @@ -25,8 +25,8 @@ class TempController(AttributeChange): self.heatrate_soll = 1.0 self.theta_ist = 0 self.heatrate_ist = 0 - self.params = params_pid - self.kalman = Kalman(params_kalman) + self.params = params + self.kalman = Kalman(params['Kalman']) self.y = -1 self.state = States.IDLE self.use_kalman = True @@ -102,7 +102,14 @@ class TempController(AttributeChange): if __name__ == '__main__': - params = { + tc_params = { + "dt": 1.0, + "Kalman": { + "dt": 1.0, + "var_P" : 1.0, + "var_Q" : 0.0001, + "var_R" : 1.0 + }, "Hold": { "dt": 1.0, "kp": 1.0, @@ -121,24 +128,17 @@ if __name__ == '__main__': pot_params = { "dt" : 1.0, - "theta" : 20, - "C" : 4190, - "M" : 20, - "L" : 0.05, - "Td" : 12, - "kn" : 0.2 + "theta" : 20, + "C" : 4190, + "M" : 20, + "L" : 0.05, + "Td" : 12, + "kn" : 0.2 } - # Kalman Filter - kalman_params = { - "dt" : 1.0, - "var_P" : 1, - "var_Q" : 0.0001, - "var_R" : 1 - } temp_ist = 0 temp_soll = 20 - ctrl = TempController(params, kalman_params) + ctrl = TempController(tc_params) plant = Pot(pot_params) _temp_ist = np.empty(0) _temp_soll = np.empty(0) diff --git a/config.json.templ b/config.json.templ new file mode 100644 index 0000000..8f8c91d --- /dev/null +++ b/config.json.templ @@ -0,0 +1,46 @@ +{ + "Controller" : { + "sim_warp_factor": 10.0, + "stirrer_name": "sim", + "heater_name": "sim", + "sensor_name": "sim", + "plant_name": "sim" + }, + "TempCtrl": { + "dt": 1.0, + "Kalman": { + "dt": 1.0, + "var_P" : 1.0, + "var_Q" : 0.0001, + "var_R" : 1.0 + }, + "Hold": { + "dt": 1.0, + "kp": 1.0, + "ki": 0.0, + "kd": 0.0, + "kt": 0.0 + }, + "Heat": { + "dt": 1.0, + "kp": 0.1, + "ki": 0.01, + "kd": 0.0, + "kt": 1.0 + } + }, + "Plant": { + "dt": 1.0, + "theta": 15, + "C": 4190, + "M": 20, + "L": 0.1, + "Td": 60, + "kn": 0.2 + }, + "Stirrer": { + "dt": 1.0, + "port": "/dev/ttyACM0", + "speed": "115200" + } +}