Skip to content

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 - управление реле через RS485
  • set_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&param=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 может представлять риск при внешнем доступе

Рекомендации по безопасности

  1. Использовать систему только во внутренней сети
  2. Настроить аутентификацию для MQTT брокера
  3. Ограничить доступ к веб-интерфейсу
  4. Регулярно обновлять системные компоненты
  5. Создать резервные копии конфигураций

Поддержка оборудования

Поддерживаемые дисплеи

  • 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/            # Файлы сборки и установки

Добавление нового сенсора

  1. Создать модуль в modules/rs_sensors.py
  2. Добавить функцию чтения в modules/__func.py
  3. Обновить service/broker.py для публикации данных
  4. Добавить отображение в веб-интерфейс

Добавление нового исполнительного устройства

  1. Обновить конфигурацию в conf/system.json
  2. Создать сервисный модуль в service/
  3. Добавить systemd сервис в __build/
  4. Обновить веб-интерфейс для управления

Расширение API

Добавить новые endpoints в web/api.py:

@api.route('/new_endpoint')
def new_function():
    # Логика обработки
    return make_response(jsonify(result), 200)


Документация создана для PRIMO core v1.3 Последнее обновление: 2025