Skip to content

Техническая документация 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 сенсора

  1. Подготовка буферных растворов (pH 4.0, 7.0, 10.0)
  2. Очистка электрода дистиллированной водой
  3. Погружение в буферный раствор pH 7.0
  4. Ожидание стабилизации показаний (2-3 минуты)
  5. Калибровка нуля в веб-интерфейсе
  6. Повторение для pH 4.0 и pH 10.0
  7. Сохранение калибровочных коэффициентов

Калибровка EC сенсора

  1. Подготовка калибровочного раствора (1413 µS/cm)
  2. Очистка датчика дистиллированной водой
  3. Погружение в калибровочный раствор
  4. Ожидание стабилизации показаний
  5. Установка калибровочного значения в веб-интерфейсе
  6. Сохранение коэффициента калибровки

Протоколы безопасности

Защитные функции системы

  1. Контроль уровня воды
  2. Проверка входной линии перед запуском насоса
  3. Контроль выходной линии на герметичность
  4. Аварийное отключение при отсутствии воды

  5. Защита от переполнения

  6. Максимальное время работы насоса
  7. Автоматический сброс давления через клапан
  8. Контроль циклов подачи

  9. Электрическая безопасность

  10. Контроль состояния реле перед включением
  11. Защита от одновременного включения конфликтующих устройств
  12. Автоматическое отключение при ошибках связи

  13. Мониторинг системы

  14. Логирование всех критических операций
  15. Уведомления о нештатных ситуациях
  16. Автоматический перезапуск сервисов при сбоях

Аварийные процедуры

При отсутствии связи с сенсорами: 1. Переход в безопасный режим 2. Отключение автоматических процессов 3. Сохранение текущего состояния 4. Уведомление пользователя

При критической ошибке pH/EC: 1. Остановка добавления реагентов 2. Включение перемешивания для гомогенизации 3. Повторное измерение через 5 минут 4. Переход в ручной режим при повторной ошибке

При аварии системы подачи воды: 1. Немедленное отключение насоса 2. Открытие аварийного сброса 3. Блокировка автоматического режима 4. Требование ручного сброса ошибки


Техническая документация PRIMO core v1.3 Дата создания: 2024