- 1- Chronos should separate the FrontEnd from the BackEnd
- 1.1 An example of a base architecture, compatible with Raspberry Pi 3/4/5, for the new Chronos is defined at: https://github.com/nickjj/docker-flask-example/tree/main
- 2- All utilities developed with uWSGI in the legacy Chronos project should be replaced with Gunicorn: https://gunicorn.org/
- TODO: Define uWSGI utilities in legacy Chronos
- 3- Possible updates for the rest of the hardware
- TODO
- 4- Modernized version of Chronos for legacy hardware (Raspberry Pi < 3)
- TODO
Chronos is a boiling/cooling water system working on Raspberry Pi. Chronos has a web interface to control the system and tracking for the state.
This repository consists of a docker container that has all the dependencies and simulators built-in. Just run using these two commands:
sudo docker-compose up --build -d chronos
sudo docker restart chronos
Chronos talks to the following components on the RPI.
These devices are specified in data_files/chronos_config.json
- Boiler via modbus connected to /dev/ttyUSB0
- Chillers via relays talking to serial port /dev/ttyACM0
- Relays to the Chillers via /tmp/pty0 and /tmp/pty1
- Water temperature in and out via /tmp/water_in and /tmp/water_out
The relays to the chillers are emulated using socat. socat creates virtual pty devices that can respond as serial ports. The following command in entrypoint.sh brings up a virtual ptyp1 device to respond to relays
socat -d -d PTY,link=/tmp/ptyp1,raw,echo=0 PTY,link=/tmp/ttyp1,raw,echo=0 &
The following commands in entrypoint.sh bring up a virtual ptyp0 device and then runs working-sync-server to emulate the boiler.
socat -d -d PTY,link=/tmp/ptyp0,raw,echo=0 PTY,link=/tmp/ttyp0,raw,echo=0 &
python2 working-sync-server.py /tmp/ttyp0 &
Actual device to simulator mappings are as follows, the chronos_config.json needs to be changed on the automation QA server to run as follows: Boiler --> /dev/ttyUSB0 --> /tmp/ptyp0 Chillers --> /dev/ttyACM0 --> /tmp/ptyp1
The water temperature is provided in Centigrade. In order to provide a test incoming water temperature of 100C, use:
echo -e "YES\nt=100" > /tmp/water_in
In order to provide a test out water temperature of 140C, use:
echo -e "YES\nt=140" > /tmp/water_out
- Flask
- pyserial
- apscheduler
- pymodbus
- sqlalchemy
- python-socketio
- socketIO_client
- uwsgi
- nginx
- uwsgi-plug-python --> ### This is in progress to be replaced with Gunicorn 22.0.0 (https://docs.gunicorn.org/en/stable/)
- Raspberry Pi
- USB to RS4485 adapter such as the GearMo Mini USB to RS485 / RS422 Converter FTDI CHIP
- Relay array such as the Numato 16 Channel USB Relay Module https://numato.com/product/16-channel-usb-relay-module
- Two DS18B20 temperature sensors connected to GPIO
TODO
To work with shared log and access to the db file www-data and pi users have to be added in one group. Installation script does all required actions.
chronos log directory: /var/log/chronos
chronos database directory: /home/pi/chronos_db
chronos config path: /etc/chronos_config.json
Chronos has a daemon which controlled by the following command:
# service chronos start|stop|restart
Web UI managed by uwsgi app server:
# service uwsgi start|stop|restart|reload
SocketIO server managing:
# service uwsgi-socketio start|stop|restart|reload
This repo uses a self-hosted git-runner on AWS. The .github/workflows/main.yaml file automatically kicks off a new deployment whenever any code changes have been committed to the master branch.
Follow these steps to add a new runner as shown in git https://docs.github.com/en/actions/hosting-your-own-runners/adding-self-hosted-runners
- Install docker.io and docker-compose on the Runner
- sudo apt update
- sudo apt install docker.io docker-compose -y