PRIMO CORE - Система управления для интеллектуальной среды выращивания растений¶
Центральный обзор архитектуры и подсистем. Для подробностей см. руководство пользователя, API и интеграции, техническую документацию и инструкцию по подготовке проверочного экземпляра.
Обзор системы¶
PRIMO CORE - это система управления для интеллектуальной среды выращивания растений (гидропоника, теплицы), работающая на платформе ARM SoC. Система интегрирует аппаратное управление, сенсорную связь и пользовательские интерфейсы для контроля параметров окружающей среды.
Целевая аудитория¶
- Разработчики систем автоматизации
- Системные интеграторы
- Исследователи в области умного сельского хозяйства
- Специалисты по контролируемой среде выращивания (CEA)
Основные проблемы, решаемые системой¶
- Централизованное управление несколькими подсистемами (освещение, питание, климат, вода)
- Мониторинг и управление в реальном времени через MQTT
- Веб и десктопные интерфейсы для пользователей
- Постоянное управление конфигурацией и состоянием
- Интеграция с оборудованием через SPI, GPIO, RS485 и АЦП/ЦАП модули
Архитектура системы¶
Технический стек¶
Frontend: - HTML/CSS/JavaScript с jQuery, Bootstrap - Node.js (v18.x) для десктопного приложения - Статические ресурсы через Nginx
Backend:
- Python 3 (Flask фреймворк)
- uWSGI + Nginx для WSGI сервера
- MQTT через библиотеку paho-mqtt
База данных: - SQLite/PostgreSQL (через Flask-Migrate) - Alembic для миграций базы данных
Аппаратные интерфейсы:
- RPi.GPIO и spidev для GPIO и SPI
- RS485 через модули rs485.py и устройства/сенсоры
Системные сервисы: - systemd для управления сервисами - Mosquitto MQTT брокер для обмена сообщениями - Nginx как обратный прокси
Паттерны проектирования¶
Архитектура событийно-ориентированных микросервисов с брокером сообщений (MQTT), обеспечивающим слабую связанность между компонентами.
Используемые паттерны: - Publisher-Subscriber (Pub/Sub): Реализован через MQTT для межсервисной связи - Singleton: Используется в модулях аппаратных интерфейсов (GPIO, SPI) - Configuration: JSON файлы для системных конфигураций и режимов - Layered Architecture: Разделение между веб-интерфейсом, бизнес-логикой и аппаратной абстракцией
Взаимодействие компонентов¶
- Модуль
web(Flask) обслуживает UI и API endpoints - Модули
service/*.pyподписываются на MQTT топики и управляют оборудованием broker.pyуправляет MQTT клиентскими соединениямиpub.pyиrecv.pyобрабатывают публикацию и получение MQTT сообщенийdesktop_appпредоставляет локальный GUI через Node.js- Все сервисы управляются systemd и взаимодействуют через MQTT
Компоненты системы¶
1. Веб-интерфейс (web/)¶
Основные модули:
- web/main.py - основные маршруты и представления
- web/auth.py - аутентификация пользователей
- web/api.py - REST API endpoints
Основные функции: - Панель управления системой - Настройка параметров подсистем - Мониторинг состояния в реальном времени - Калибровка сенсоров EC/pH - Управление системными режимами
2. Сервисные модули (service/)¶
broker.py - MQTT брокер интерфейс¶
- Подключение к брокеру
- Обработка команд управления реле и ЦАП
- Публикация данных сенсоров (температура, влажность, CO2)
- Управление RS485 устройствами
MQTT топики:
- /set/dac/ - управление ЦАП каналами
- /set/gpio/ - управление GPIO реле
- /relays/state - состояние реле
- /sensor/temp - данные температуры
- /sensor/humidity - данные влажности
- /sensor/co2/top - данные CO2
light.py - управление освещением¶
- Автоматическое управление освещением по времени
- Имитация рассвета/заката с плавным изменением яркости
- Поддержка географического расчета времени восхода/заката
- Два режима: базовый (по времени) и полный (по координатам)
Функции:
- imitation_dawn() - имитация рассвета/заката
- light_on()/light_off() - включение/выключение с имитацией
- light_on_sync()/light_off_sync() - мгновенное включение/выключение
nutrient.py - управление питательным раствором¶
- Автоматическая регулировка pH и EC
- Контроль уровня воды
- Циклическое перемешивание раствора
- Защита от работы при отсутствии воды
Алгоритм работы: 1. Проверка уровня воды в баке 2. Измерение и корректировка EC (электропроводность) 3. Измерение и корректировка pH (кислотность) 4. Перемешивание раствора 5. Пауза между циклами (120 сек)
aqua.py - система подачи воды¶
- Автоматическая подача питательного раствора
- Работа по расписанию (привязана к освещению)
- Контроль входной/выходной линии
- Защитные функции и аварийное отключение
Режимы работы: - Автоматический режим по времени - Ручной режим управления - Аварийное отключение при ошибках
3. Аппаратные модули (modules/)¶
rs_devices.py - RS485 устройства¶
RelayController- управление реле через RS485set_dimmer()- управление диммерами/ЦАП- Поддержка Modbus протокола
rs_sensors.py - RS485 сенсоры¶
- Чтение данных температуры и влажности
- Измерение концентрации CO2
- Калибровка pH и EC сенсоров
__func.py - вспомогательные функции¶
- MQTT публикация/подписка
- Работа с конфигурационными файлами
- API функции для GPIO и сенсоров
- Системные утилиты
4. Десктопное приложение (desktop_app/)¶
Технологии: - HTML/CSS/JavaScript интерфейс - Подключение к веб-серверу через localhost
Функции: - Локальное отображение на сенсорном экране - Дублирование веб-интерфейса - Автозапуск при загрузке системы
Конфигурация системы¶
Основные конфигурационные файлы (conf/)¶
system.json - основная конфигурация¶
{
"name_app": "PRIMO core",
"version_app": "1.3",
"mode": "base|full",
"verification": false,
"sensors": true,
"relays": true,
"dac": true,
"gpio_board": {...},
"gpio_bcm": {...},
"allias": {...}
}
Режимы работы:
- base - базовый режим (8 реле)
- full - полный режим (расширенная конфигурация)
Конфигурации подсистем:¶
config_light.json- настройки освещенияconfig_nutrient.json- настройки питания растенийconfig_climat.json- настройки климатаconfig_solution.json- настройки подачи раствораconfigEC.json/configPH.json- калибровка сенсоров
Режимы работы подсистем:¶
config_light_mode.json- режим освещения (вкл/выкл)config_nutrient_mode.json- режим питания (авто/выкл)config_climat_mode.json- режим климатаconfig_solution_mode.json- режим подачи раствора
Установка и настройка¶
Системные требования¶
- Debian-based OS
- Python 3.7+
- Nginx, MQTT
Установка зависимостей¶
# Системные зависимости
sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools python3-venv
sudo apt install python3-paho.mqtt python3-rpi.gpio
# MQTT брокер
wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list
sudo apt-get update
sudo apt-get install mosquitto
sudo pip3 install paho.mqtt
Настройка MQTT¶
sudo nano /etc/mosquitto/mosquitto.conf
Добавить:
listener 1883
protocol mqtt
listener 9001
allow_anonymous true
protocol websockets
Настройка проекта¶
# Клонирование и настройка окружения
cd ~
git clone <repository-url>
cd primocore
python3 -m venv env
source env/bin/activate
pip3 install -r __build/requirements.txt
# Инициализация базы данных
flask db upgrade
Настройка Nginx¶
sudo apt install nginx
sudo nano /etc/nginx/sites-available/web-meristem
Конфигурация:
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/meristem/primocore/web-meristem.sock;
}
}
sudo ln -s /etc/nginx/sites-available/web-meristem /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
Настройка системных сервисов¶
# Создание символических ссылок на сервисы
sudo ln -s /home/meristem/primocore/__build/*.service /etc/systemd/system/
sudo systemctl daemon-reload
# Запуск и автозагрузка сервисов
sudo systemctl enable --now pub-meristem.service
sudo systemctl enable --now recv-meristem.service
sudo systemctl enable --now nutrient-meristem.service
sudo systemctl enable --now light-meristem.service
sudo systemctl enable --now aqua-meristem.service
sudo systemctl enable --now web-meristem.service
sudo systemctl enable --now display-meristem.service
Использование системы¶
Веб-интерфейс¶
Доступ: http://local-ip/
Основные разделы:
- Главная - общий статус системы
- Освещение - настройка и управление освещением
- Питание - управление питательным раствором
- Климат - контроль температуры и влажности
- Вода - система подачи раствора
- Система - общие настройки и информация
- Калибровка - калибровка pH и EC сенсоров
API Endpoints¶
Получение конфигурации:
GET /get_config?conf=light
GET /get_config?conf=nutrient
GET /get_config?conf=system
Установка конфигурации:
GET /set_config?conf=light¶m=value
Управление реле:
GET /relay_on/<relay_number>
GET /relay_off/<relay_number>
GET /relay_all_off/
Системное управление:
GET /sys_reboot/
GET /sys_config/
MQTT топики¶
Команды:
- /set/gpio/ - управление GPIO реле
- /set/dac/ - управление ЦАП каналами
Данные сенсоров:
- /sensor/temp - температура
- /sensor/humidity - влажность
- /sensor/co2/top - концентрация CO2
- /nutrient/sensor/ph - pH раствора
- /nutrient/sensor/ec - EC раствора
Состояние системы:
- /relays/state - состояние всех реле
- /gpio/relays/status/<num> - состояние конкретного реле
Мониторинг и диагностика¶
Логи системы¶
Логи находятся в директории /logs/ (если настроена) или в системных логах:
# Просмотр логов сервисов
sudo journalctl -u web-meristem.service -f
sudo journalctl -u light-meristem.service -f
sudo journalctl -u nutrient-meristem.service -f
# Логи MQTT брокера
sudo journalctl -u mosquitto.service -f
Проверка состояния сервисов¶
# Статус всех сервисов
sudo systemctl status *meristem.service
# Перезапуск сервиса
sudo systemctl restart light-meristem.service
Диагностика оборудования¶
Проверка GPIO:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
GPIO.output(5, GPIO.HIGH)
Проверка RS485:
ls -la /dev/ttyAMA*
Проверка MQTT:
mosquitto_pub -h localhost -t "/test" -m "hello"
mosquitto_sub -h localhost -t "/test"
Безопасность и ограничения¶
Соображения безопасности¶
- MQTT брокер разрешает анонимный доступ через WebSocket (порт 9001)
- Система работает с повышенными привилегиями (GPIO, SPI, systemd)
- Нет упоминания аутентификации для MQTT (возможно, только внутренняя сеть)
Известные ограничения¶
- MQTT
allow_anonymous trueможет представлять риск при внешнем доступе
Рекомендации по безопасности¶
- Использовать систему только во внутренней сети
- Настроить аутентификацию для MQTT брокера
- Ограничить доступ к веб-интерфейсу
- Регулярно обновлять системные компоненты
- Создать резервные копии конфигураций
Поддержка оборудования¶
Поддерживаемые дисплеи¶
- 7" HDMI LCD (800x480 или 1024x600)
- Настройка через
config.txt
GPIO конфигурация¶
- Режим BOARD (физические пины) - режим 10
- Режим BCM (GPIO номера) - режим 11
- До 8 реле каналов
- Поддержка SPI устройств
RS485 устройства¶
- Контроллеры реле (до 20 каналов)
- Диммеры/ЦАП (4 канала)
- pH/EC сенсоры
- Датчики температуры/влажности
- Датчики CO2
Разработка и расширение¶
Структура проекта¶
primocore/
├── web/ # Flask веб-приложение
├── service/ # Системные сервисы
├── modules/ # Вспомогательные модули
├── conf/ # Конфигурационные файлы
├── static/ # Статические ресурсы веб-интерфейса
├── templates/ # HTML шаблоны
├── desktop_app/ # Десктопное приложение
└── __build/ # Файлы сборки и установки
Добавление нового сенсора¶
- Создать модуль в
modules/rs_sensors.py - Добавить функцию чтения в
modules/__func.py - Обновить
service/broker.pyдля публикации данных - Добавить отображение в веб-интерфейс
Добавление нового исполнительного устройства¶
- Обновить конфигурацию в
conf/system.json - Создать сервисный модуль в
service/ - Добавить systemd сервис в
__build/ - Обновить веб-интерфейс для управления
Расширение API¶
Добавить новые endpoints в web/api.py:
@api.route('/new_endpoint')
def new_function():
# Логика обработки
return make_response(jsonify(result), 200)
Документация создана для PRIMO core v1.3 Последнее обновление: 2025