Техническая документация PRIMO core¶
Архитектурная диаграмма системы¶
graph TB
subgraph "Пользовательские интерфейсы"
WEB[Веб-интерфейс<br/>Flask + Nginx]
DESKTOP[Десктопное приложение<br/>Node.js + Electron]
end
subgraph "API Layer"
API[REST API<br/>web/api.py]
AUTH[Аутентификация<br/>web/auth.py]
end
subgraph "MQTT Брокер"
MOSQUITTO[Mosquitto MQTT<br/>Порты 1883, 9001]
end
subgraph "Сервисные модули"
BROKER[broker.py<br/>MQTT интерфейс]
LIGHT[light.py<br/>Управление освещением]
NUTRIENT[nutrient.py<br/>Управление питанием]
AQUA[aqua.py<br/>Система подачи воды]
CLIMAT[climat.py<br/>Управление климатом]
end
subgraph "Аппаратная абстракция"
GPIO_MOD[GPIO модули]
RS485_MOD[RS485 модули]
SENSORS[Модули сенсоров]
end
subgraph "Физическое оборудование"
RELAYS[Реле 1-8]
DAC[ЦАП/Диммеры]
PH_EC[pH/EC сенсоры]
TEMP_HUM[Температура/Влажность]
CO2[CO2 сенсор]
end
WEB --> API
DESKTOP --> WEB
API --> AUTH
API --> MOSQUITTO
MOSQUITTO --> BROKER
MOSQUITTO --> LIGHT
MOSQUITTO --> NUTRIENT
MOSQUITTO --> AQUA
MOSQUITTO --> CLIMAT
BROKER --> GPIO_MOD
BROKER --> RS485_MOD
LIGHT --> GPIO_MOD
NUTRIENT --> SENSORS
AQUA --> GPIO_MOD
GPIO_MOD --> RELAYS
RS485_MOD --> DAC
SENSORS --> PH_EC
SENSORS --> TEMP_HUM
SENSORS --> CO2
Схема потоков данных¶
sequenceDiagram
participant User as Пользователь
participant Web as Веб-интерфейс
participant API as REST API
participant MQTT as MQTT Брокер
participant Service as Сервис (light.py)
participant Hardware as Оборудование
User->>Web: Изменение настроек освещения
Web->>API: POST /set_config
API->>API: Сохранение в config_light.json
API->>Web: Подтверждение
Service->>Service: Чтение config_light.json (каждую секунду)
Service->>MQTT: Публикация команды /set/gpio/
MQTT->>Hardware: Управление реле освещения
Hardware->>MQTT: Статус реле /relays/state
MQTT->>Web: Обновление статуса в UI
Web->>User: Отображение текущего состояния
Конфигурационная схема¶
graph LR
subgraph "Системные конфигурации"
SYS[system.json<br/>Основная конфигурация]
end
subgraph "Конфигурации подсистем"
LIGHT_CONF[config_light.json<br/>Настройки освещения]
NUT_CONF[config_nutrient.json<br/>Настройки питания]
AQUA_CONF[config_solution.json<br/>Настройки подачи воды]
CLIMAT_CONF[config_climat.json<br/>Настройки климата]
end
subgraph "Режимы работы"
LIGHT_MODE[config_light_mode.json<br/>Вкл/выкл освещения]
NUT_MODE[config_nutrient_mode.json<br/>Режим питания]
AQUA_MODE[config_solution_mode.json<br/>Режим подачи воды]
CLIMAT_MODE[config_climat_mode.json<br/>Режим климата]
end
subgraph "Калибровка"
PH_CAL[configPH.json<br/>Калибровка pH]
EC_CAL[configEC.json<br/>Калибровка EC]
end
SYS --> LIGHT_CONF
SYS --> NUT_CONF
SYS --> AQUA_CONF
SYS --> CLIMAT_CONF
LIGHT_CONF --> LIGHT_MODE
NUT_CONF --> NUT_MODE
AQUA_CONF --> AQUA_MODE
CLIMAT_CONF --> CLIMAT_MODE
Схема GPIO и RS485 подключений¶
GPIO реле (Режим base)¶
Реле 1: Освещение (lamps)
Реле 2: Насос (pump)
Реле 3: Подача (supply)
Реле 4: Сброс (relief)
Реле 5: Регулировка (adjustment)
Реле 6: Перемешивание (mixing)
Реле 7: Вентиляция (ventilation)
Реле 8: Увлажнение (humidification)
GPIO реле (Режим full)¶
Реле 1: Освещение A (lamps_a)
Реле 2: Освещение B (lamps_b)
Реле 3: Насос (pump)
Реле 4: Подача (supply)
Реле 5: Сброс (relief)
Реле 6: Регулировка pH (adjustment_ph)
Реле 7: Регулировка EC (adjustment_ec)
Реле 8: Перемешивание (mixing)
RS485 устройства¶
Адрес 20: Контроллер реле (RelayController)
Адрес 139: ЦАП/Диммер (4 канала)
Адрес 3: CO2 сенсор
Адрес 8: Температура/влажность сенсор
Алгоритмы работы подсистем¶
Алгоритм управления освещением¶
flowchart TD
START([Запуск сервиса освещения])
CHECK_MODE{Режим освещения<br/>активен?}
GET_CONFIG[Чтение config_light.json]
CHECK_IMITATION{Имитация<br/>рассвета?}
GET_TIME[Получение текущего времени]
CHECK_TIME_RANGE{В диапазоне<br/>времени работы?}
LIGHT_ON_GRADUAL[Включение с имитацией<br/>рассвета/заката]
LIGHT_ON_INSTANT[Мгновенное включение]
LIGHT_OFF[Выключение освещения]
WAIT[Ожидание 1 секунда]
START --> CHECK_MODE
CHECK_MODE -->|Нет| WAIT
CHECK_MODE -->|Да| GET_CONFIG
GET_CONFIG --> CHECK_IMITATION
CHECK_IMITATION --> GET_TIME
GET_TIME --> CHECK_TIME_RANGE
CHECK_TIME_RANGE -->|Время включения| LIGHT_ON_GRADUAL
CHECK_TIME_RANGE -->|Время работы| LIGHT_ON_INSTANT
CHECK_TIME_RANGE -->|Вне времени| LIGHT_OFF
LIGHT_ON_GRADUAL --> WAIT
LIGHT_ON_INSTANT --> WAIT
LIGHT_OFF --> WAIT
WAIT --> CHECK_MODE
Алгоритм регулировки питательного раствора¶
flowchart TD
START([Запуск сервиса питания])
CHECK_MODE{Режим питания<br/>активен?}
CHECK_WATER{Есть вода<br/>в баке?}
MEASURE_EC[Измерение EC]
CHECK_EC{EC > лимита?}
ADD_NUTRIENTS[Добавление питательных веществ]
MIX_SOLUTION[Перемешивание раствора]
WAIT_EC[Ожидание 120 сек]
MEASURE_PH[Измерение pH]
CHECK_PH{pH > лимита?}
ADD_PH_DOWN[Добавление pH Down]
WAIT_PH[Ожидание 120 сек]
CYCLE_COMPLETE[Цикл завершен]
WAIT[Ожидание 1 секунда]
ERROR[Ошибка: нет воды]
START --> CHECK_MODE
CHECK_MODE -->|Нет| WAIT
CHECK_MODE -->|Да| CHECK_WATER
CHECK_WATER -->|Нет| ERROR
CHECK_WATER -->|Да| MEASURE_EC
MEASURE_EC --> CHECK_EC
CHECK_EC -->|Да| ADD_NUTRIENTS
CHECK_EC -->|Нет| MEASURE_PH
ADD_NUTRIENTS --> MIX_SOLUTION
MIX_SOLUTION --> WAIT_EC
WAIT_EC --> MEASURE_EC
MEASURE_PH --> CHECK_PH
CHECK_PH -->|Да| ADD_PH_DOWN
CHECK_PH -->|Нет| CYCLE_COMPLETE
ADD_PH_DOWN --> MIX_SOLUTION
CYCLE_COMPLETE --> WAIT
ERROR --> WAIT
WAIT --> CHECK_MODE
Алгоритм подачи воды¶
flowchart TD
START([Запуск сервиса подачи воды])
CHECK_MODE{Режим активен<br/>и авто?}
CHECK_SAFETY{Проверка безопасности<br/>входная/выходная линия}
CHECK_TIME_RANGE{В диапазоне<br/>времени освещения?}
START_PUMP[Включение насоса и подачи]
PUMP_TIME[Работа насоса<br/>заданное время]
STOP_PUMP[Выключение насоса]
OPEN_RELIEF[Включение сброса]
RELIEF_TIME[Сброс давления<br/>заданное время]
CLOSE_RELIEF[Выключение сброса]
WAIT_CYCLE[Ожидание до<br/>следующего цикла]
WAIT[Ожидание 1 секунда]
EMERGENCY_STOP[Аварийное отключение]
START --> CHECK_MODE
CHECK_MODE -->|Нет| WAIT
CHECK_MODE -->|Да| CHECK_SAFETY
CHECK_SAFETY -->|Ошибка| EMERGENCY_STOP
CHECK_SAFETY -->|ОК| CHECK_TIME_RANGE
CHECK_TIME_RANGE -->|Вне времени| WAIT
CHECK_TIME_RANGE -->|В диапазоне| START_PUMP
START_PUMP --> PUMP_TIME
PUMP_TIME --> STOP_PUMP
STOP_PUMP --> OPEN_RELIEF
OPEN_RELIEF --> RELIEF_TIME
RELIEF_TIME --> CLOSE_RELIEF
CLOSE_RELIEF --> WAIT_CYCLE
WAIT_CYCLE --> CHECK_MODE
EMERGENCY_STOP --> WAIT
WAIT --> CHECK_MODE
MQTT топики и сообщения¶
Структура MQTT топиков¶
/set/
├── gpio/ # Управление GPIO реле
├── dac/ # Управление ЦАП каналами
/sensor/
├── temp # Температура (°C)
├── humidity # Влажность (%)
├── co2/
│ └── top # Концентрация CO2 (ppm)
/nutrient/sensor/
├── ph # pH раствора
└── ec # EC раствора (µS/cm)
/relays/
└── state # Состояние всех реле (JSON массив)
/gpio/
├── relays/status/
│ └── <num> # Состояние конкретного реле
├── channels/status/ # Состояние каналов
└── all/status/ # Общий статус GPIO
Формат сообщений¶
Управление реле:
{
"pin": 1,
"state": "on"
}
Управление ЦАП:
{
"channel": 1,
"value": 5000
}
Состояние реле:
[0, 1, 0, 1, 0, 0, 1, 0]
Системные сервисы¶
Описание systemd сервисов¶
| Сервис | Описание | Исполняемый файл |
|---|---|---|
web-meristem.service |
Веб-сервер Flask через uWSGI | uwsgi --ini uwsgi.ini |
light-meristem.service |
Управление освещением | service/light.py |
nutrient-meristem.service |
Управление питанием | service/nutrient.py |
aqua-meristem.service |
Система подачи воды | service/aqua.py |
pub-meristem.service |
MQTT издатель | service/pub.py |
recv-meristem.service |
MQTT приемник | service/recv.py |
display-meristem.service |
Десктопное приложение | desktop_app/start.sh |
Зависимости сервисов¶
graph TD
NETWORK[network.target]
MOSQUITTO[mosquitto.service]
NETWORK --> WEB[web-meristem.service]
NETWORK --> LIGHT[light-meristem.service]
NETWORK --> NUTRIENT[nutrient-meristem.service]
NETWORK --> AQUA[aqua-meristem.service]
NETWORK --> PUB[pub-meristem.service]
NETWORK --> RECV[recv-meristem.service]
NETWORK --> DISPLAY[display-meristem.service]
MOSQUITTO --> LIGHT
MOSQUITTO --> NUTRIENT
MOSQUITTO --> AQUA
MOSQUITTO --> PUB
MOSQUITTO --> RECV
Процедуры калибровки¶
Калибровка pH сенсора¶
- Подготовка буферных растворов (pH 4.0, 7.0, 10.0)
- Очистка электрода дистиллированной водой
- Погружение в буферный раствор pH 7.0
- Ожидание стабилизации показаний (2-3 минуты)
- Калибровка нуля в веб-интерфейсе
- Повторение для pH 4.0 и pH 10.0
- Сохранение калибровочных коэффициентов
Калибровка EC сенсора¶
- Подготовка калибровочного раствора (1413 µS/cm)
- Очистка датчика дистиллированной водой
- Погружение в калибровочный раствор
- Ожидание стабилизации показаний
- Установка калибровочного значения в веб-интерфейсе
- Сохранение коэффициента калибровки
Протоколы безопасности¶
Защитные функции системы¶
- Контроль уровня воды
- Проверка входной линии перед запуском насоса
- Контроль выходной линии на герметичность
-
Аварийное отключение при отсутствии воды
-
Защита от переполнения
- Максимальное время работы насоса
- Автоматический сброс давления через клапан
-
Контроль циклов подачи
-
Электрическая безопасность
- Контроль состояния реле перед включением
- Защита от одновременного включения конфликтующих устройств
-
Автоматическое отключение при ошибках связи
-
Мониторинг системы
- Логирование всех критических операций
- Уведомления о нештатных ситуациях
- Автоматический перезапуск сервисов при сбоях
Аварийные процедуры¶
При отсутствии связи с сенсорами: 1. Переход в безопасный режим 2. Отключение автоматических процессов 3. Сохранение текущего состояния 4. Уведомление пользователя
При критической ошибке pH/EC: 1. Остановка добавления реагентов 2. Включение перемешивания для гомогенизации 3. Повторное измерение через 5 минут 4. Переход в ручной режим при повторной ошибке
При аварии системы подачи воды: 1. Немедленное отключение насоса 2. Открытие аварийного сброса 3. Блокировка автоматического режима 4. Требование ручного сброса ошибки
Техническая документация PRIMO core v1.3 Дата создания: 2024