mitya-borodin / hyperion

Automation of engineering systems without legacy.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Hyperion

Автоматизация инженерных систем без легаси.

Преимущества

  • Нет разработки кода, сценариев if/else, сценариев на графическом языке програмирования (Node-Red).
  • Раз нет разработки, значит нет разработчиков, значит нет багов, значит нет долгой пусконаладки, значит все работает так же как и на десятках инсталяций до этой.
    • Не нужно ждать пока именно под вас все настроят, отладят, проведут пусконаладку.
    • Не нужно оплачивать дорогостоящий труд разработчиков.
    • Не нужно зависить от тех разработчиков, которые вам реализовали систему.
    • Не нужно заниматьмя поиском тех, кто внесет изменения, починит, отладит систему которую несколько лет назад сделали другие люди.
  • Нет блокировки на производители специализированной автоматики для:
    • освещения
    • отопления
    • вентиляции
    • увлажнения
    • кондиционирования
    • водоснабжения
    • открывания (ворот, штор, ставней, дверей)
    • реализации различных функций типа (мастер выключатель, автоматический ввод резерва, полив,)
    • учета расхода ресурсов (электричество, вода, тепло, газ).
    • Так как автоматизация строится на уверсальных устроствах Wirenboard, и Zigbee.
      • Да, в таком случае происходит блокировка на устройствах Wirenboard и/или устройствах Zigbee. Но эти устроства универсальны, и на их базе, можно собрать любую инженерную систему, если есть хорошо реализованный, протестированный код, который приведет в действие автоматику.
      • Да, НЕ реализованы все возможные случаи, но если ваш случай не реализован, то мы можете обратиться к нам, и мы соберем схему на железе, реализуем и отладим ПО с у четом всех частных случаев, и добавим такой макрос в нашу колекцию, и все посоледующие инсталяции такой инженерной системы будут происходить без отладки ПО.
  • Быстрый пуск инсталяции, так как макросы для инженерных систем уже готовы и их код не менялся с прошлых установок.
    • В процессе жизни, могут происходить изменения в железе, и мы можем выпускать обновления.
      • После каждого обновления, проводится проверка на собранном железе, во всех частных случаях. Только после этого, обновление автоматически попадет на конкретные установки, как предложение обновиться, и если что-то пойдет не так, то будет возвращена предидущая версия.
      • А данные отладки будут автоматически отправлены нам и мы узнаем в чем дело.
  • Возможность купить комплектующие для различных инженерных систем по отдельности, и собрать из них ту или иную систему, что позволит сократить расходы.
    • Чтобы понять из чего состоят те или иные системы, можно обратиться к нашей документации, где мы объясняем, из каких принципиальных частей должна состоять та или иная система, и какие параметры должны быть у узлов этой системы. Эта документация похожа на методичку, которая объясняет нюансы, и позволяет закупиться оборудованием, собрать его на объекте, подключить провода и получить работующее решение в одно косание.

Инженерные системы

Hyperion реализовывает "мозги" для следующих инженерных систем:

  • Освещение
  • Отопление
    • Поддержание температуры в каждой комнате
    • Поддержание температуры пола в каждой комнате
    • Управление уставкой котла ( источник тепла )
    • Управление каскадом котлов ( источник тепла )
    • Солнечный коллектор ( источник тепла )
      • Управление насосом ( загрузки теплоаккумулятора, разгрузки теплоаккумулятора )
      • Контроль температуры коллектора
      • Контроль температуры теплового аккумулятора
      • Оповещение ( перегрев, падение давления, высокая/средняя/низкая эффективность )
    • Управление насосами ( насосная группа )
    • Управление смесителями 0-10В ( насосно-смесительная группа )
    • Управление контурами теплого пола 0-100% ( термостатические приводы )
    • Управление радиаторами 0-100% ( термостатические приводы )
    • Автоматическая подпитка
      • Отслеживание давления в системе
      • Открытие клапана или крана подпитки
    • Аварийные уведомления ( ошибки котла, отклонения по температуре, тактование )
  • Вентиляция
    • Поддержание CO2 в каждой комнате
    • Поддержание VOC в каждой комнате
    • Подогрев воздуха
      • Автоматическая подстройка температуры калорифера по датчикам
        • До калорифера
        • После калорифера
        • После увлажнителя
      • Через отопление
        • Управление смесителем 0-10В
        • Управление насосом
        • Управление макросом отопление, запрос нужной температуры
    • Увлажнение воздуха
      • Управление циркуляционным насосом
      • Управление клапаном, для защиты от протечки
      • Контроль протечки
      • Наполнение водой, через механический поплавок
    • Управление вентиляторами 0-10В
      • Приток
      • Вытяжки ( может быть несколько )
    • Управление задвижками ( приток, вытяжки, комнаты )
      • Релейное + контроль положения ( открыто, закрыто ), через сигнальные линии
      • Управление 0-10В
    • Контроль параметров через датчики
      • Температура перед нагревателем
      • Загрязнение фильтра через реле перепада давления ( может быть несколько )
      • Температура после нагревателя
      • Температура после увлажнителя
      • Температура подачи нагревателя
      • Температура обратки нагревателя
      • Положение смесителя нагревателя 0-10В
      • Скорость работы вентиляторов 0-10В
      • Влажность после увлажнителя
      • Контроль протечки увлажнителя
      • CO2 в каждой комнате
      • VOC в каждой комнате
      • Влажность в каждой комнате
      • Температура в каждой комнате
      • Шум в каждой комнате
      • Давление воздуха в каждой комнате
    • Аварийные уведомления
  • Увлажнение
    • Поддержание влажности в каждой комнате
    • Управление комнатными увлажнителями, через реле
    • Контроль влажности в каждой комнате
    • Управление ( вкл/выкл ) однозонной форсуночной системой увлажнения
    • Управление клапанами для подачи воды на форсунки в нужную комнату, через реле
    • Контроль давления в системе, через электронный датчик
    • Управление частотным преобразователем 0-10В, для управление насосом высокого давления
    • Датчик протечки
    • Клапан от протечки, с управление через реле
    • Аварийные уведомления
  • Кондиционирование
    • Поддержание температуры в каждой комнате
    • Поддержание влажности в каждой комнате
    • Управление кондиционерами через ИК
    • Управление кондиционерами через Modbus
  • Водоснабжение
    • Защита от протечек
      • Контроль протечек
      • Перекрытие ввода по средством электромагнитного нормально закрытого клапана
        • Двух-ходовой кран с сигнальными линями
        • Двух-ходовой кран 0-10В
      • Отключение питания насоса
      • Аварийные уведомления
    • Управление насосом рециркуляции ГВС
      • Реализует быструю подачу ГВС
      • Обеспечивает работу полотенце сушителей
    • Контроль температуры ГВС
    • Параллельная загрузка бойлера
      • Управление насосом
      • Управление макросом отопление, запрос нужной температуры
  • Снега таяние
    • Запрос пользователя на включение таяния снега исходя из прогноза погоды
    • Запрос пользователя на продление работы системы
    • Таймер завершения работы
    • Управление насосом
    • Контроль подачи и обратки
    • Управление смесителем 0-10В
    • Управление макросом отопление, запрос нужной температуры
  • Бассейн
    • Поддержание температуры в бассейне
    • Запуск/остановка фильтрации
    • Наполнение/слив
    • Управление насосом
    • Управление смесителем 0-10В
    • Контроль подачи и обратки
    • Управление макросом отопление, запрос нужной температуры
  • Открывашка
    • Управление шторами
    • Управление воротами
    • Управление люками
    • Управление рольставнями
    • Управление замками
  • Греющий кабель
    • Управление скрытым в стене полотенце сушителем
    • Управление таянием льда в водостоках
    • Подогрев ХВС с улицы
  • Мастер выключатель
  • Безопасность
    • Контроль утечки метана
    • Контроль дыма
    • Контроль вибрации окно/дверей
    • Контроль открывания дверей
    • Сирена
    • Контроль движения
    • Уведомления
    • Управление макросом освещение, включение той или иной зоны освещения
  • Учет
    • Учет воды
    • Учет газа
    • Учет расхода тепла
    • Учет расхода электричества
      • Общий
      • По выбранным линиям
  • Источник бесперебойного питания
    • Контроль разряда батарей
    • Управление макросом Автоматический ввод резерва, запуск генератора
  • Автоматический ввод резерва
    • Включение генератора
    • Задержка переключения сети на генератор для прогрева и для остывания
    • Переключение с сети на генератор и обратно
    • Контроль наличия напряжения на фазах
    • Аварийные уведомления

Legacy

С английского legacy переводится как «наследие». Легаси-код — это код, который перешёл «по наследству» от предыдущих разработчиков. Чаще всего это происходит так:

  • Команда делает продукт, внутри много разных возможностей.
  • Часть функций со временем оптимизируется, а часть остаётся неизменной в виде старого кода, потому что и так работает.
  • Некоторое время спустя в команде не остаётся тех, кто писал старый код.
  • Текущая команда не знает, почему старый код написан именно так.
  • В этих кусках сложно что-то поменять или разобраться, потому что всё остальное написано уже по-другому.
  • Этот старый код, который сложно поддерживать и сложно разбираться — это и есть легаси.

👉 Проще говоря, легаси — это код, про который говорят: «Это ещё Михалыч писал 8 лет назад для синхронизации с сервером, он работает, мы его не трогаем, потому что иначе всё сломается». При этом Михалыча в компании давно нет, документации тоже нет, и проще этот код не трогать совсем.

Так как легаси — это старый код, то обычно на нем завязаны многие важные вещи в программе. Получается замкнутый круг: отказаться от легаси нельзя, потому что без него всё сломается, но и поддерживать его в рабочем состоянии тоже сложно, потому что никто не хочет разбираться в старом коде.

Легаси появляется как только интеграторы покидают объект, так как инсталляция будет работать много лет, и потом не найти того разработчика который писал код или делал конфигурации сценариев, а даже если и найти, то он с трудом вспомнит, что к чему.

Но даже если вспомнил, то исправления или доработки будут выполнять как новая разработка, долго + дорого, и после могут появиться баги, которые потребуют возврат разработчика на объект.

Без легаси на каждой инсталляции

Без легаси на каждой инсталляции, это когда:

  • Не пишется код
  • Не создаются if/else сценарии
  • Не создаются Node-Red конфигурации
  • Не создаются какие либо уникальные сценарии для конкретной инсталляции, требующие детальной работы с параметрами устройств.

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

Таким образом, на каждой инсталляции запускаются нужные макросы, код которых не меняется от инсталляции к инсталляции, а так как код не меняется, то и не появляются баги.

В случае если нужно получить макрос который не реализован, можно воспользоваться двумя опциями:

  • Заказать разработку на нашем сайте, описав, то, что должен делать макрос (Рекомендуется).
  • Разобраться как разрабатываются макросы и сделать Pull request с новым протестированным макросом.

Hardware

Hyperion основан на универсальной автоматике от компании Wirenboard + устройствах работающих по протоколу Zigbee.

Zigbee может быть как в составе Wirenboard контроллера, так и в любом другом ПК.

Шаги реализации

  • Проектирование
  • Закупка железа
  • Сборка электрощита
  • Прокладка проводников
  • Монтаж железа
    • Отопление
    • Вентиляция
    • Увлажнение
    • Кондиционирование
    • Электрощит
    • Щит автоматики
  • Первичная настройка wirenboard
  • Разметка устройств в Hyperion
  • Присваивание размеченных устройств соответствующим проекту макросам
  • Проверка режимов работы
  • Конец

Environment

  • Required Node@20.11.0 npm@10.2.4
  • Required Yarn 1.22.21
  • Required Docker version 24.0.7, build afdd53b

IDE

Рекомендуется использовать VSCode, так как в проекте в директории .vscode, находятся все конфигурации и набор расширений которые сделают разработку максимально эффективной и удобной.

Желательно, но не обязательно установить все рекомендованные расширения.

Установка

Установка node в ручном режиме

Самый простой вариант начать, это установить Node@18.16.0 npm@9.5.1 отсюда.

Настройка NVM и установка node в автоматизированном режиме

Это рекомендованный вариант контроля версии node.

  • Устанавливаем nvm, если его нет.
  • Далее через nvm устанавливаем нужную версию node, если у вас оболочка ZSH, то можно автоматизировать процесс.

Если у вас оболочка zsh, можно установить плагин zsh-nvm, выполнив шаги ниже:

  • Выполнить эту команду git clone https://github.com/lukechilds/zsh-nvm ~/.oh-my-zsh/custom/plugins/zsh-nvm, она клонирует код плагина для zsh в нужную директорию

  • Добавить zsh-nvm к списку плагинов plugins=(git bundler ... zsh-nvm)

  • Добавить вот такой кусок текста в .zshrc:

    # NVM
    autoload -U add-zsh-hook
    
    load-nvmrc() {
    
      if [[ -f .nvmrc && -r .nvmrc ]]; then
    
        nvm use
    
      elif [[ $(nvm version) != $(nvm version default)  ]]; then
    
        echo "Reverting to nvm default version"
    
        nvm use default
    
      fi
    
    }
    
    add-zsh-hook chpwd load-nvmrc
    load-nvmrc
    
  • Выполнить source .zshrc

  • Перейти в директорию с файлом .nvmrc

  • Увидеть что-то подобное, только будет указана версия взятая из вашего .nvmrc.

    Found '~/programming/collaborative-data/.nvmrc' with version <v18.16.0>
    Now using node v18.16.0 (npm v9.5.1)
    
  • В случае если нужная версия node не установлено вы увидите предложение установить её.

Режим разработки

Первоначальные действия

Установить yarn глобально

npm i -g yarn

Установить зависимости и определите переменные окружения

yarn

cp .env.example .env

Запуск БД

Для запуска БД в контейнере, и теперь она всегда будет включаться автоматически, даже после перезагрузки ПК:

docker compose up -d

Накатим миграции:

yarn prisma:migrate:dev

Накатим сидинг:

Перед тем как катить сидинг, стоит изменить часть переменных на свои значения:

## Master User
#
MASTER_USER_EMAIL=dmitriy@borodin.site
MASTER_USER_PASSWORD='1234'
MASTER_USER_NAME="Dmitriy Borodin"

yarn prisma:seed

Регулярные действия

yarn start

Технологии

Frontend

Backend

Wirenboard

План установки

Все инсталляции лучше всего проводить как отдельные `docker-compose.yaml`` файлы.

Облако

Хостинг

Покупаем виртуальную машину на одном из хостингов:

WireGuard Easy VPN

Устанавливаем WireGuard Easy VPN.

Установка будет осуществляться через docker-compose.yaml.

Создадим ~/wg-easy, перейдем туда и там создадим необходимые каталоги.

cd
mkdir wg-easy
cd wg-easy
touch docker-compose.yaml

Заполняем ключевые поля WG_HOST, PASSWORD в настройках, и заполняем файл ~/wg-easy/docker-compose.yaml, следующим содержимым:

version: '3.8'
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=CLOUD_HOST

      # Optional:
      - PASSWORD=foobar123
      # - WG_PORT=51820
      # - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_DEFAULT_DNS=1.1.1.1
      # - WG_MTU=1420
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt

    image: weejewel/wg-easy
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - '51820:51820/udp'
      - '51821:51821/tcp'
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

Запускаем:

docker compose up -d

Далее в Web GUI создадим туннели.

Переходим на тот хост который указали в поле WG_HOST, http://${CLOUD_HOST}:51820.

Создаем несколько туннелей:

  • Для роутера, чтобы через него получать доступ к WB, или непосредственно для WB, если роутер не поддерживает WireGuard.
  • Для компьютера
  • Для телефона

В случае если роутер поддерживает WireGuard, на роутере нужно будет пробросить порты:

  • 80 (внутренний) -> 80 (внешний)
  • 22 (внутренний) -> 22 (внешний)
  • 18883 (внутренний) -> 18883 (внешний)

В случае если мы установили WireGuard Client на контроллер то никакие порты пробрасывать не нужно.

Mosquitto

Установим MQTT брокер Mosquitto.

Установка будет осуществляться через docker-compose.yaml.

Создадим ~/mosquitto, перейдем туда и там создадим необходимые каталоги.

cd
mkdir mosquitto
cd mosquitto
mkdir ./config
touch ./config/mosquitto.conf
mkdir ./data
mkdir ./log
touch mosquitto.pwd # этот файл будет хранить логи и пароль
touch docker-compose.yaml

Заполняем ~/mosquitto/config/mosquitto.conf следующим содержимым:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log

#Turn on port listening
listener 1883
#Disable anonomous login:
allow_anonymous false
#Password file:
password_file /etc/mosquitto/mosquitto.pwd

Определяем логин и пароль для доступа к брокеру в формате USER_NAME:PASSWORD и записываем в файл ~/mosquitto/mosquitto.pwd, эти данные будут использованы для настройки контроллера.

Заполняем ~/mosquitto/docker-compose.yaml, следующим содержимым:

version: '3.8'
services:
  mosquitto:
    image: eclipse-mosquitto
    restart: always
    privileged: true
    ports:
      - '0.0.0.0:18883:1883/tcp'
      - '0.0.0.0:9001:9001/tcp'
    volumes:
      - './mosquitto/config:/mosquitto/config'
      - './mosquitto/data:/mosquitto/data'
      - './mosquitto/log:/mosquitto/log'
      - './mosquitto/mosquitto.pwd:/etc/mosquitto/mosquitto.pwd'

Запускаем

docker compose up -d

Проверить работоспособность можно при помощи программы: https://mqtt-explorer.com.

Gitea

Устанавливаем Gitea, она понадобится для организации резервного копирования.

Установка будет осуществляться через docker-compose.yaml.

Создадим ~/gitea, перейдем туда и там создадим необходимые каталоги:

cd
mkdir gitea
cd gitea
mkdir ./pg-data
mkdir ./data
touch docker-compose.yaml

Заполняем ~/gitea/docker-compose.yaml, следующим содержимым:

version: '3.8'

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.19.0
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=gitea_pg_db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gitea
    restart: always
    networks:
      - gitea
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - '3001:3000'
      - '222:22'
    depends_on:
      - db

  db:
    image: postgres:14
    restart: always
    container_name: gitea_pg_db
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gitea
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./pg-data:/var/lib/postgresql/data

Запускаем

docker compose up -d

Дальнейшая настройка выполняется через Gitea Web GUI.

Контроллер

SSH

Первым делом нужно обеспечить SSH.

См. https://wirenboard.com/wiki/SSH

Выполняем вход:

  • Либо через VPN сеть если у нас роутер который поддерживает WireGuard.
  • Либо через встроенный wifi, если вы рядом с контроллером.
  • Либо через локальную сеть, если контроллер и ваш ПК подключены к одной сети.

Первый вход будет выполнен по паролю, и пароль по умолчанию это wirenboard.

Рекомендуется отказаться от аутентификации по паролю, и перейти на аутентификацию по сертификату.

Для этого:

  • Создаем файл nano ~/.ssh/authorized_keys
  • Кладем в него свой публичный ключ
  • Проверяем доступ по сертификату ssh root@10.8.0.4, подставив подходящий IP адрес.
  • Отключаем вход по паролю добавив строчку PasswordAuthentication no в файл nano /mnt/data/etc/ssh/sshd_config.wb.
  • Перезапускаем сервис systemctl restart ssh
  • Готово, доступ по паролю отключен.

Установка WireGuard на WB

В случае если роутер не поддерживает WireGuard, мы установим его клиент на контроллер, и установим соединение с сервером непосредственно, нужно иметь в виду, что это будет тратить ресурсы контроллера.

MQTT Bridge

См. https://wirenboard.com/wiki/MQTT#Создание_своего_брокера_MQTT

Для того, чтобы контроллер публиковал и принимал сообщения от внешнего брокера, нужно выполнить следующие настройки.

Для настройки поста, нужно отредактировать всего 1 файл: /mnt/data/etc/mosquitto/conf.d/20bridges.conf и вставить в него следующее содержимое:

connection bridge20
address ${CLOUD_HOST}:18883
notifications true
notification_topic /clientnotification/bridge_status
remote_username ${USERNAME}
remote_password ${PASSWORD}
topic # both

ZigBee

См. https://wirenboard.com/wiki/Zigbee

В случае если установлен модуль ZigBee необходимо выполнить установку соответствующих пакетов.

Следуем инструкции WB, устанавливаем пакеты в соответствии с оборудованием и выполняем по очередное добавление устройств в систему.

Для улучшения качества сигнала стоит использовать внешнюю антенну на подобие:

Антенна Espada ESP-ANT3B всенаправленная поможет максимально улучшить качество сигнала Wi-Fi.
При этом разместить ее можно как внутри помещения, так и снаружи, на металлической поверхности.
Для надежной фиксации антенны предусмотрено магнитное основание.
Длинный, 3-метровый, кабель предусматривает стабильное подключение антенны к роутеру.
В качестве разъема подключения у антенны Espada ESP-ANT3B используется RP-SMA Male. Особенности конструкции антенны предполагают ее эффективную работу по передаче сигнала.
Коэффициент усиления при этом составляет 3 дб. А диапазон рабочих частот антенны - 2,4 - 2,5 ГГц.

Settings

См. https://wirenboard.com/wiki/index.php?title=RS-485:Configuration_via_Web_Interface&mobileaction=toggle_view_desktop

Настройку всех физически подключенных устройств, и беспроводных устройств, выполняют в WB Web GUI.

Для начала конфигурирования необходимо подключаемся к GUI контроллера внутри VPN, адрес будет похож на http://10.8.0.4:81.

После чего выполняем рекомендации описанные в документации начальное конфигурирование устройств, разбираемся, что и как делать, и по итогу у нас должны появиться все устройства, подключенные проводами или бкз проводов на странице Devices/Устройства.

Back up settings

См. https://wirenboard.com/wiki/Wiren_Board_Firmware_Update#user-files

Для того, чтобы сделать резервную копию настроек, необходимо скопировать содержимое /mnt/data/etc.

Это можно делать разными путями:

  • Непосредственно скопировать.
  • Инициализировать git репозиторий в /mnt/data/etc и при изменении конфигураций публиковать их в Gitea.
  • Воспользоваться VestaSync, на свой страх и риск.

В случае переустановки прошивки на контроллере, такие пакеты как ZigBee и другие приложения установленные в /mnt/data/root, нужно будет переустановить. Их не стоит копировать, так как переустановка это не сложный и быстрый процесс, главное знать список софта который нужно установить.

Система управления контроллером

Система управления контроллером не будет расположена на борту контроллера, чтобы не занимать его мощности. Система состоит из трех частей:

  1. База данных
  2. Сервис который выполнят все необходимые вычисления и отдает команды
  3. Фронтенд для пользовательского взаимодействия
  • Устанавливаем Hyperion на ту же виртуальную машину.
  • Прописываем у него в переменных окружения данные для подключения к нашему MQTT брокеру.
  • Входим в web интерфейс Hyperion (адрес будет похож на http://CLOUD_HOST), и смотрим вкладку Устройства, там должны появиться все устройства которые имеются в Wirenboard Web GUI.
  • Размечаем устройства в соответствии с проектом.
  • Инициализируем макросы в соответствии с проектом.
  • Проверяем работоспособность все случаев в соответствии с проектом.
  • Сдаем работу заказчику, демонстрируя все случаи в соответствии с проектом.
  • Вся дальнейшая работа происходит в полностью автоматическом режиме, если не предусмотрено ручное управление чем либо.

About

Automation of engineering systems without legacy.

License:MIT License


Languages

Language:TypeScript 98.7%Language:JavaScript 1.1%Language:Dockerfile 0.2%