Files
brewpi/brewpi.py
T
2020-12-17 14:45:43 +01:00

54 lines
1.8 KiB
Python

import asyncio
import json
from ws.server.ws_server_multi_user import WsServerMultiUser
from components.sensor import TempSensorFactory
from components.pid import TempController
from components.plant import Pot
from components.actor import HeaterFactory
from tasks import TaskManager
from ws.message import MessageDispatcher
from utils.value import ChangedFloat
from tasks import TempSensorTask, HeaterTask, PotTask, TcTask
DT_CTRL = 0.1
if __name__ == '__main__':
config = json.load(open("config.json"))
dispatcher = MessageDispatcher()
server = WsServerMultiUser(listener=dispatcher)
taskmgr = TaskManager()
DT_CTRL = 1.0/config['Controller']['sim_warp_factor']
# Sensor
sensor = TempSensorFactory.create(config['Controller']['sensor_name'])
taskmgr.add(TempSensorTask(sensor, DT_CTRL, dispatcher.msgio_get("Sensor")))
# Plant
pot_params = config['Plant']
if "sim" in config['Controller']['plant_name']:
pot = Pot(pot_params, 20)
if "sim" in config['Controller']['sensor_name']:
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(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 = 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()