Skip to content

Алгоритм создания Unit ​

INFO

Данное руководство составлено на основе готового к работе Fan Regulator ds18b20

Проработка идеи Unit ​

Перед началом разработки Unit ответьте себе на следующие вопросы:

  1. Какую основную задачу будет решать Unit ?
  2. Какие физические элементы будут у Unit ?
  3. Какие данные Unit будет публиковать ?
  4. Какое управляющее воздействие будет допускать Unit ?
  5. На каком языке будет написан Unit ?

Например

  1. Unit будет регулировать температуру при помощи вентилятора
  2. Понадобятся: esp32, 4pin вентилятор, температурный датчик ds18b20
  3. Будет публиковаться: скважность PWM сигнала управления вентилятором и температура на датчике
  4. Будет команда: включение на N секунд с заданной скоростью вращения
  5. Micropython

Создание репозитория Git ​

Выберите инстанс GitLab или GitHub:

  1. Создайте пустой репозиторий
  2. Склонируйте его на свою ЭВМ

Создание базовой файловой структуры ​

TIP

Создайте в корне Git репозитория следующие пустые файлы:

.gitignore ​

text
env.json
schema.json
tmp
.idea
.nvim

WARNING

Не забудьте указать папку с вашей IDE, это может быть: .idea, .nvim или любая другая

.pepeignore ​

text
.git
.gitignore
.pepeignore
LICENSE
env_example.json
schema_example.json
pepeunit.toml
readme.md

schema_example.json ​

json
{   
    "input_base_topic": [
        "update/pepeunit",
        "env_update/pepeunit",
        "schema_update/pepeunit",
        "log_sync/pepeunit",
        "reset/pepeunit"
    ],
    "output_base_topic": [
        "state/pepeunit",
        "log/pepeunit"
    ],
    "input_topic": [
        "set_fan_state/pepeunit"
    ],
    "output_topic": [
        "current_fan_speed_percentage/pepeunit",
        "current_temp/pepeunit"
    ]
}

Для соответствия проработанной идее Unit, к стандартным топикам input_base_topic и output_base_topic потребуются добавить ещё два типа топиков: input_topic и output_topic

Тип топикаТопик разработчикаНазначение
input_topicset_fan_state/pepeunitUnit подпишется на него и будет получать управляющие команды
output_topiccurrent_fan_speed_percentage/pepeunitБудет использоваться для публикации скважности PWM
output_topiccurrent_temp/pepeunitБудет использоваться для публикации данных с датчика температуры ds18b20

env_example.json ​

json
{   
    "WIFI_SSID": "ssid",
    "WIFI_PASS": "password",
    "PWM_FAN_PIN": 0,
    "DS18B20_PIN_NUM": 4,
    "REGULATOR_OPERATING_RANGE": 1000,
    "PUBLISH_SEND_INTERVAL": 1,
    "TEMP_MIN": 30,
    "TEMP_MAX": 60,
    "DUTY_MIN": 8192,
    "DUTY_MAX": 65535,
    "PU_DOMAIN": "unit.example.com",
    "PU_HTTP_TYPE": "https",
    "PU_APP_PREFIX": "/pepeunit",
    "PU_API_ACTUAL_PREFIX": "/api/v1",
    "PU_MQTT_HOST": "emqx.example.com",
    "PU_MQTT_PORT": 1883,
    "PU_MQTT_PING_INTERVAL": 20,
    "PU_MQTT_KEEPALIVE": 60,
    "PU_AUTH_TOKEN": "jwt_token",
    "PU_SECRET_KEY": "32_bit_secret_key",
    "PU_ENCRYPT_KEY": "32_bit_encrypt_key",
    "PU_STATE_SEND_INTERVAL": 300,
    "PU_MIN_LOG_LEVEL": "Debug",
    "PU_MAX_LOG_LENGTH": 64
}

DANGER

Все переменные в env_example.json должны быть обезличены

Нужно продумать, за что будут отвечать переменные Разработчика Unit:

Название переменнойНазначение
WIFI_SSIDНазвание WiFi сети для подключения
WIFI_PASSПароль от WiFi сети для подключения
PWM_FAN_PINПозволит менять номер контакта подключения вентилятора
DS18B20_PIN_NUMПозволит менять номер контакта, отвечающего за получение данных от датчика ds18b20
REGULATOR_OPERATING_RANGEПозволит изменять частоту работы регулятора
PUBLISH_SEND_INTERVALПозволит настраивать скорость публикации в топик current_fan_speed_percentage/pepeunit и current_temp/pepeunit
DUTY_MINПозволит устанавливать минимальную скорость вентилятора
DUTY_MAXПозволит устанавливать максимальную скорость вентилятора
TEMP_MINПозволит настраивать температуру, начиная с которой скорость будет DUTY_MIN
TEMP_MAXПозволит настраивать температуру, начиная с которой скорость будет DUTY_MAX

WARNING

Переменные могут поменяться в процессе разработки - это абсолютно нормально. Добавьте или удалите переменные в env_example.json и актуализируйте pepeunit.toml и readme.md.

Pepeunit отобразит новые переменные Пользователям для ввода, когда они изменят таргет версию.

Первый коммит ​

После заполнения минимально нужных файлов, пора их закоммитить:

  1. Переходим в консоль директории вашего проекта
  2. git add . - добавляем все файлы в кандидаты на коммит
  3. git commit -m "feat(init): initial files" - коммитим изменения
  4. git push - отправляем изменения в ваш удалённый хостинг GitLab или GitHub

Создание тестового Unit в Pepeunit ​

Чтобы продолжить разработку Unit, нужно взаимодействовать с Pepeunit через MQTT, а также получить env.json и schema.json. Выбирите подходящий инстанс Pepeunit, которому вы доверяете. Выполните следующие шаги:

  1. Создайте RepositoryRegistry
  2. Создайте Repo
  3. Создайте Unit
  4. Настройте Unit для обновлений в ручную, чтобы чётко контролировать таргет версию
  5. Заполните env у Unit
  6. Скачайте Архив с env.json и schema.json

Полученные файлы env.json и schema.json нужно будет поместить в каталог вашего локального Git репозитория. Данные файлы будут содержать данные для подключения к Pepeunit, а также топики для публикации.

INFO

В процессе разработки можно заходить в тестовый Unit и видеть:

  • какие данные Unit отправляет в Output UnitNode через систему DataPipe
  • создавать для Unit управляющее воздействие через Input UnitNode

Наполнение Unit программным функционалом ​

WARNING

Не существует универсального алгоритма разработки Программного обеспечения. Разрабатывайте так, как удобно именно вам. Однако рекомендуем стараться следовать стандартным правилам частоты кода.

Когда у Unit в локальном репозитории есть обратная связь с Pepeunit, попробуйте следовать следующему алгоритму:

  1. Протестировать, что клиентские библиотеки (Micropython, ESP-IDF, Golang и Python) корректно отправляют данные и получают стандартные команды
  2. Получите данные от ваших физических датчиков, попробуйте вывести значения напрямую в консоль, без сетевых усложнений, чтобы понять что данные действительно поступают
  3. Попробуйте отправить свои данные в output_topic, указанные в schema_example.json
  4. Получите команды из input_topic и обработайте их так, как задумано в концепции вашего Unit
  5. Внедрите переменные окружения из env_example.json для удалённой настройки вашего Unit

После этих шагов вы получите рабочий Unit, которой нужно протестировать в различных режимах работы.

WARNING

В процессе разработки можно делать множество коммитов с рабочим и не рабочим функционалом, создавать ветки и делать всё, что позволяет Git. Однако настенет момент, когда вы поймёте, что всё работает корректно, и доработки больше не требуются. В этот случае можно двигаться дальше.

Создание pepeunit.toml и readme.md ​

INFO

Pepeunit расчитывает на машиночитаемое описание Unit в файле pepeunit.toml.

Чтобы добавить описание для Unit, нужно:

  1. Создать в корне репозитория Unit файл pepeunit.toml
  2. Сгенерировать readme.md на основе pepeunit.toml
  3. Поместить сгенерированный readme.md в корень репозитория. Писать readme.md в ручную не требуется

DANGER

У всех Unit должна быть документация, чтобы Пользователи могли ими пользоваться.

Присвоение Тега ​

readme.md и pepeunit.toml заполнены, функционал готов, всё работает корректно. Время присвоить Тег для последнего коммита в репозитории:

  1. Перейдите в консоль в директории вашего проекта
  2. Выполните команду git tag 1.0.0
  3. Выполните команду отправки во внешний репозиторий git push --tags

Есть ли ограничение на формат Тега ?

Нет, Тег может иметь любую структуру.

INFO

Pepeunit например использует везде: major.minor.fix:

DANGER

Тег будет сигнализировать Пользователям, что всё готово к эксплуатации и протестировано Разработчиком Unit.

Пользователи будут ожидать, что выбрав последний Тег, получат самую рабочую, самую актуальную версию Unit.