Modular automation system for indoor plant environments, built with Arduino and Python.
- Climate and Soil Moisture Control — Maintains target temperature, humidity, and soil moisture through closed-loop feedback between sensors and actuators.
- Data Logging & Visualization — Persists all sensor readings to InfluxDB, with interactive time-series dashboards available through its built-in UI.
- Plug-and-Play Architecture — Sensors, actuators, controllers, and devices attach through well-defined integration points. Adding or removing a component requires no changes to the core logic on either side.
- Python Control App — Receives sensor data from Arduino, applies control rules, and sends commands back to actuators. Supports CLI-based manual override.
- Dockerized Deployment — Python app and InfluxDB run in isolated containers.
app/— Python application that communicates with the Arduino, drives actuator logic, and logs data to InfluxDB.arduino/— PlatformIO-based firmware for Arduino-compatible boards; reads sensors and executes control commands.docs/— Project documentation.Makefile— Unified dev commands across both environments.
- Arduino UNO
- Any sensor and any actuator, for example DHT22 and LED
- Docker
- PlatformIO
# Install dependencies
pip3 install platformio
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# Clone the repository
git clone https://github.com/<your-repo>/katomato.git
cd katomato
# Build and run
make build-arduino
make upload-arduino
make upSee Setup guide for detailed instructions.
Arduino sensors sample the physical environment and stream structured JSON to the Python server over serial. The server validates each reading, routes it to the appropriate controller, and the controller decides what action the connected devices should take. Devices translate those actions into hardware commands and place them on an internal queue; the server core drains the queue and sends the commands back to Arduino, which forwards them to the corresponding actuator. Every sensor reading is also published to InfluxDB for historical analysis and dashboarding.
Both sides — firmware and server — follow the same principle: a generic core handles data flow, while domain-specific modules (sensors, controls, controllers, devices) plug in through a registration mechanism. Nothing in the core needs to change when a module is added or removed.
See the Architecture overview for a detailed breakdown.
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2025 Alexander Suvorov
