HTTP API страницы настроек

Здесь описан программный интерфейс (HTTP API) контроллера UVATRON: как получить доступ и какие маршруты для чего нужны. Раздел нужен интеграторам, которые управляют контроллером из внешней системы или из программы U-Logic (редактор программы управления), и службам ИТ и информационной безопасности заказчика, которые проверяют, как с контроллером можно работать по сети.

Это тот же интерфейс, через который работает страница настроек («Панель управления» контроллера): всё, что можно сделать кнопками на странице (перезагрузить контроллер, задать сеть и 802.1X, загрузить сертификат, обновить прошивку), можно сделать и запросом из своей программы. Описание относится к прошивке версии 2.2.1 и к обоим устройствам: контроллеру «UVATRON» и сенсорной панели с контроллером «UV4PRO-T10». Различия между устройствами отмечены в тексте.

Примечание

Здесь описан только API страницы настроек. Интерфейсы UI-Designer (порт 8000) и UI-Panel (порт 5001) служат их собственным страницам. Они не предназначены для внешних программ, не документируются и могут меняться без предупреждения.

Порты и условия их открытия подробно описаны в разделе Сетевые порты, режим шифрования — в разделе Режим HTTPS, пароль и вход — в разделе Начало работы.

Адреса и сертификат

Адрес

Когда доступен

Для API

https://<IP>:8443

Всегда

Да, основной адрес

http://<IP>:8001

Всегда

Нет: этот адрес только перенаправляет (код 308) на https://<IP>:8443, и многие HTTP-клиенты при этом теряют тело запроса

Здесь и далее <IP> — адрес контроллера. Во всех примерах ниже используется https://<IP>:8443.

У устройства есть встроенный сертификат на имя uvatron.local. Сертификат свой у каждого устройства: создаётся на устройстве один раз, обновления прошивки его не меняют. Он самоподписанный: пока вы не загрузили сертификат своей организации, клиент должен либо иметь этот сертификат в списке доверенных, либо отключить проверку сертификата сервера (в curl это ключ -k). Если вы загрузили свой сертификат, проверку можно оставить включённой при условии, что адрес запроса совпадает с именем в сертификате.

Авторизация

Все маршруты, кроме /authorize, требуют токен. Порядок такой:

  1. Отправьте POST /authorize с логином и паролем страницы настроек (по умолчанию admin / admin).

  2. В ответе возьмите token.

  3. Передавайте его в каждом следующем запросе в заголовке Authorization: Bearer <token>.

Запрос на вход:

curl -k -X POST https://<IP>:8443/authorize \
     -H "Content-Type: application/json" \
     -d '{"login":"admin","password":"admin"}'

Ответ при верных данных:

{"is_authorized": true, "token": "eyJhbGciOi..."}

При неверном логине или пароле контроллер отвечает кодом 200, а не 401, поэтому проверяйте поле is_authorized:

{"is_authorized": false, "token": null}

Пример запроса с токеном:

TOKEN=$(curl -sk -X POST https://<IP>:8443/authorize \
        -H "Content-Type: application/json" \
        -d '{"login":"admin","password":"admin"}' | jq -r .token)

curl -k https://<IP>:8443/system_info -H "Authorization: Bearer $TOKEN"

Примечание

Запросы с JSON-телом всегда отправляйте с заголовком Content-Type: application/json: без него контроллер отклоняет запрос (/authorize, например, ответит кодом 415) или не видит тело.

Срок действия токена

  • Токен действует 8 часов с момента выдачи. После этого любой запрос вернёт 401: по истечении срока получите новый токен вызовом /authorize.

  • Токен подписан секретом конкретного контроллера: токен, выданный одним контроллером, другим не принимается.

  • Смена пароля и заводской сброс отзывают все выданные токены. Сразу после смены пароля (или сброса, после которого пароль снова admin) любой токен, полученный раньше, получает ответ 401: и у программ, и у открытой страницы настроек, и у UI-Designer. Войдите заново с действующим паролем.

  • Перезагрузка контроллера и обновление прошивки токены не сбрасывают.

Если токена нет или он неверный

Любой маршрут, кроме /authorize, при отсутствующем, просроченном или неверном токене отвечает кодом 401:

{"error": "Unauthorized", "message": "Invalid or missing token"}

(у /change_credentials тело короче: {"error": "Unauthorized"}).

Примечание

Перед подключением контроллера к сети смените заводской пароль (маршрут /change_credentials, см. ниже).

Ответы и ошибки

Единой схемы ответа нет, но правила такие:

Ситуация

Ответ

Успех

Код 200, 201 (создано, загружено) или 202 (принято в работу), тело описано у каждого маршрута

Нет токена или он неверный

401

Неверный запрос (нет обязательного поля, неверное значение)

Чаще 400, тело {"error": "..."}

Сбой при выполнении

500, тело {"error": "..."}

Сетевые настройки и сертификаты 802.1X

Контролируемые ошибки (неверное значение, не удалось применить) приходят с кодом 200 и признаком success: false в теле. Проверяйте success, а не только код ответа

Настройки времени

Неверное значение (например, часовой пояс вне диапазона от -12 до 12 или недопустимое имя сервера) приходит с кодом 500 и текстом ошибки

Тело ответа сетевого маршрута (/settings/<интерфейс>, /settings/<интерфейс>/certs):

{
  "success": true,
  "applied": ["..."],
  "warnings": [{"code": "...", "message": "...", "stage": "..."}],
  "errors":   [{"code": "...", "message": "...", "stage": "..."}],
  "details": {}
}

Даже при success: true просмотрите warnings: например, настройки могли быть сохранены, но связь на интерфейсе не поднялась.

Маршруты

Во всех примерах ниже заголовок Authorization: Bearer $TOKEN опущен для краткости, если не сказано иное. Для JSON-запросов нужен также Content-Type: application/json.

Сведения о контроллере и журналы

Маршрут

Что делает

GET /system_info

Возвращает сведения о контроллере и текущее время

GET /get_logs

Скачивает журналы контроллера одним зашифрованным файлом logs.enc

GET /get_config

Возвращает параметры контроллера и MAC-адреса сетевых портов

GET /system_info: в ответе серийный номер, дата и время контроллера, часовой пояс и другие сведения об устройстве; состав сведений зависит от модели.

{
  "SerialNumber": "...",
  "current_date": "2026-10-14",
  "current_time": "12:34:56",
  "current_utc": "+03:00",
  "current_iso": "2026-10-14T12:34:56+03:00",
  "timezone": "..."
}

Если на устройстве есть часы реального времени, добавляется поле rtc_time.

GET /get_logs: журналы шифруются для передачи в службу поддержки производителя; расшифровать файл logs.enc самостоятельно нельзя. При ошибке возвращается код 400.

GET /get_config: в ответе описание конфигурации контроллера и MAC-адреса. У контроллера с одним сетевым портом MAC в поле eth0, у контроллера с двумя портами в полях eth0_mac и eth1_mac. Если файла конфигурации нет, ответ 404.

Перезагрузка и перезапуск

Маршрут

Что делает

POST /restart_plc

Перезагружает контроллер целиком

POST /restart_node-red

Перезапускает U-Logic, программа запускается снова как есть

POST /block_program

Блокирует программу: выключает все вкладки U-Logic и перезапускает его

GET /gui_config, POST /gui_config

Показывает и переключает UI-Designer (включён или выключен)

POST /restart_plc (кнопка «Перезагрузить контроллер»). Тело не нужно. Ответ приходит сразу, а перезагрузка начинается примерно через 5 секунд:

curl -k -X POST https://<IP>:8443/restart_plc -H "Authorization: Bearer $TOKEN"
{"success": true}

На время перезагрузки контроллер недоступен по сети, проект U-Logic останавливается и запускается снова вместе с контроллером в том состоянии, в котором был. Чтобы узнать, что контроллер снова готов, повторяйте /authorize или GET /system_info, пока он не ответит.

POST /restart_node-red (кнопка «Перезапустить U-Logic»). Тело не нужно, ответ {"success": true}. U-Logic останавливается и через несколько секунд запускается снова с той же программой: вкладки, которые были включены, остаются включёнными. На время перезапуска связь программы с оборудованием прерывается.

POST /block_program (кнопка «Заблокировать программу»). Тело не нужно, ответ {"success": true}.

Предупреждение

Это аварийный маршрут: он выключает все вкладки программы в U-Logic и затем перезапускает U-Logic. U-Logic поднимается за секунды, но программа после этого не работает, пока вы вручную не включите нужные вкладки в редакторе U-Logic. Используйте его, когда программа зависает или роняет U-Logic и редактор не открывается.

GET /gui_config возвращает {"state": true}, если UI-Designer сейчас включён, и {"state": false}, если выключен.

POST /gui_config переключает UI-Designer. Значение state задаёт прежнее состояние, а действие обратное: {"state": true} выключает UI-Designer, {"state": false} включает его (так устроена кнопка на странице). Если поле state не передано, считается true, то есть UI-Designer выключается. Ответ: {"state": <переданное значение>}, при сбое код 400 и {"status": "error", "error": "..."}. По умолчанию UI-Designer выключен; выключайте его по окончании работы над интерфейсом (см. Доступ к интерфейсам).

Время

Маршрут

Что делает

GET /set_time_ntp

Показывает часовой пояс, сервер времени и состояние раздачи времени

POST /set_time_ntp

Включает синхронизацию с сервером времени и задаёт часовой пояс

GET /ntp_server, POST /ntp_server

Показывает и включает/выключает раздачу времени контроллером другим устройствам

POST /set_time_manual

Устанавливает дату и время вручную

GET /set_time_ntp:

{"gmtOffset": 3, "ntpIp": "pool.ntp.org", "serverEnabled": true}

POST /set_time_ntp: gmtOffset (целое число часов от -12 до 12 относительно UTC, например 3 для UTC+3) и ntpIp (имя или адрес сервера времени). Если поле не передано, подставляется значение по умолчанию (3 и pool.ntp.org), поэтому передавайте оба. Ответ: {"success": true, "gmtOffset": 3, "ntpIp": "..."}.

Если часовой пояс меняется, контроллер перезапускает U-Logic (так же, как POST /restart_node-red): программа запускается снова с новым поясом, иначе она продолжала бы считать местное время по старому. При сохранении того же пояса перезапуска нет. Это относится и к POST /set_time_manual.

curl -k -X POST https://<IP>:8443/set_time_ntp \
     -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
     -d '{"gmtOffset":3,"ntpIp":"ntp.example.local"}'

POST /ntp_server: {"enabled": true} включает раздачу времени, {"enabled": false} выключает. Ответ: {"serverEnabled": true}. Включайте раздачу только на одном контроллере в сети, иначе в сети будут два источника времени.

POST /set_time_manual: gmtOffset (как выше) и time — дата и время в формате ISO, например "2026-10-14T12:00:00". Если в time указан часовой пояс (например, Z или +03:00), время пересчитывается в пояс gmtOffset. Ответ: {"gmtOffset": 3, "time": "2026-10-14T12:00:00"}; если поля не переданы, код 400 и {"error": "Invalid data"}.

Примечание

Ручная установка времени отключает синхронизацию с сервером времени: контроллер продолжает идти по установленным часам и раздавать их, но сам время уже не уточняет. Чтобы вернуть синхронизацию, вызовите POST /set_time_ntp.

Сеть и 802.1X

Маршрут

Что делает

GET /settings/<интерфейс>

Показывает текущие настройки сети и 802.1X интерфейса

POST /settings/<интерфейс>

Задаёт IP-адрес и настройки 802.1X интерфейса

GET /settings/<интерфейс>/certs

Показывает загруженные файлы сертификатов и ключей

POST /settings/<интерфейс>/certs

Загружает сертификаты и ключи для 802.1X

Допустимые имена интерфейса: eth0 и eth1. На контроллере с одним сетевым портом работает только eth0. Другое имя вернёт ошибку (для /settings/<интерфейс> код 500, для /certs код 400).

Чтение. GET /settings/eth0 возвращает mac, mode (dhcp или manual), ip, mask, gateway, dns1, dns2, dhcp и текущие параметры 802.1X: eap_method, identity, ca_cert, domain_suffix_match, client_cert, private_key, phase2_auth, phase2_autheap, phase2_ca_cert, phase2_client_cert, phase2_private_key, optional, auth_timeout_sec, dhcp_timeout_sec, auth_retries. Пароли в ответ не попадают. Поле success в ответе всегда true.

Запись. POST /settings/<интерфейс> каждый раз задаёт настройки целиком: передавайте все нужные поля, не только изменяемые.

Поле

Значение

mode

dhcp или manual (допустимо и static)

ip, mask

Адрес и маска, обязательны при manual

gateway, dns1, dns2

Необязательны

eap_method

tls, peap или ttls; не передавайте, если 802.1X не нужен

enabled

false отключает 802.1X (остальные поля 802.1X игнорируются)

identity

Имя пользователя (обязательно при 802.1X)

ca_cert, client_cert, private_key

Имена файлов, ранее загруженных через /certs (ca.pem, client.pem, private.pem)

domain_suffix_match

Необязательно. Домен, на который должен быть выдан сертификат сервера RADIUS, например radius.example.org: подходит и он, и его поддомены. Одно имя. Проверка имеет смысл вместе с ca_cert

private_key_password

Пароль закрытого ключа, если он защищён

password

Пароль пользователя (для peap и ttls с внутренним методом, которому нужен пароль)

phase2_auth, phase2_autheap

Внутренний метод проверки для peap и ttls; допустимые значения зависят от внешнего метода

phase2_ca_cert, phase2_client_cert, phase2_private_key, phase2_private_key_password

Для внутреннего метода tls

optional

true: не блокировать порт, если проверка 802.1X не пройдена

auth_timeout_sec, dhcp_timeout_sec, auth_retries

auth_timeout_sec — сколько секунд ждать проверки 802.1X; 0 — значение системы, 25 секунд. dhcp_timeout_sec — сколько секунд ждать адрес по DHCP; 0 — значение системы, обычно 45 секунд. auth_retries — сколько раз пробовать войти; 0 — без ограничения, -1 — значение системы, три попытки. Если поля не переданы, страница настроек ставит 60, 90 и 0

Поля optional, auth_timeout_sec, dhcp_timeout_sec и auth_retries действуют только на контроллере «UVATRON». Панель «UV4PRO-T10» их принимает и всегда показывает значения по умолчанию (false, 60, 90, 0): адрес она получает независимо от проверки 802.1X, а проверку повторяет без ограничения, примерно раз в 30 секунд.

ca_cert необязателен для всех методов. Чтобы контроллер проверял сервер RADIUS, загрузите сертификат CA и по возможности указывайте domain_suffix_match.

Метод tls требует client_cert и private_key, метод peap требует phase2_auth, метод ttls требует phase2_auth или phase2_autheap.

Предупреждение

Если вы меняете адрес интерфейса, через который идёт запрос, соединение оборвётся: ответ придёт уже с нового адреса или не придёт вовсе. Дальше работайте с новым IP-адресом.

Установка сертификата 802.1X через API

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

Шаг 1. Загрузите файлы (форма multipart/form-data). Поля формы: ca_cert, client_cert, private_key, а для внутреннего метода tls ещё phase2_ca_cert, phase2_client_cert, phase2_private_key. Можно передать только нужные. Допустимые расширения: для сертификатов .pem, .crt, .cer, .der, для ключей .pem, .key, .p12, .pfx. Файлы сохраняются под фиксированными именами (ca.pem, client.pem, private.pem, phase2_ca.pem, phase2_client.pem, phase2_private.pem). Загруженный ранее файл заменяется, о чём приходит предупреждение cert_overwritten.

curl -k -X POST https://<IP>:8443/settings/eth0/certs \
     -H "Authorization: Bearer $TOKEN" \
     -F ca_cert=@ca.pem -F client_cert=@client.pem -F private_key=@client.key

Ответ (код 201): {"success": true, "applied": ["certs.ca_cert", "certs.client_cert", "certs.private_key"], "ca_cert": "ca.pem", "client_cert": "client.pem", "private_key": "private.pem", ...}. При недопустимом расширении код 400 и success: false.

Шаг 2. Включите 802.1X, сославшись на имена из ответа. Пример для EAP-TLS со статическим адресом:

curl -k -X POST https://<IP>:8443/settings/eth0 \
     -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
     -d '{"mode":"manual","ip":"192.168.10.20","mask":"255.255.255.0","gateway":"192.168.10.1",
          "eap_method":"tls","identity":"controller-01",
          "ca_cert":"ca.pem","client_cert":"client.pem","private_key":"private.pem",
          "private_key_password":""}'

Пример для PEAP с паролем и адресом по DHCP:

{"mode": "dhcp", "eap_method": "peap", "identity": "controller-01",
 "phase2_auth": "mschapv2", "password": "...", "ca_cert": "ca.pem"}

Шаг 3. Проверьте ответ: должно быть "success": true и пустой список warnings. Если в warnings есть сообщение о том, что соединение не поднялось, настройки сохранены, но проверка 802.1X не пройдена (проверьте сертификаты, имя и настройки порта на коммутаторе).

Чтобы отключить 802.1X, отправьте те же настройки сети с "enabled": false и без eap_method, например {"mode":"dhcp","enabled":false}.

То же самое делается на странице настроек: раздел «Сетевой интерфейс Ethernet».

HTTPS и сертификат устройства

Маршрут

Что делает

GET /settings/https

Показывает, включён ли режим HTTPS, и данные используемого сертификата

POST /settings/https

Включает или выключает режим HTTPS

POST /settings/https/cert

Загружает сертификат организации вместо встроенного

GET /settings/https:

{"enabled": false,
 "cert": {"subject": "CN=uvatron.local", "issuer": "CN=uvatron.local",
          "not_after": "2036-01-01T00:00:00+00:00", "uploaded": false}}

uploaded: true означает, что используется загруженный вами сертификат.

POST /settings/https с телом {"enabled": true} или {"enabled": false} (должно быть именно true или false, иначе код 400). Ответ {"enabled": true} приходит сразу, а через 2 секунды перезапускаются UI-Panel, UI-Designer, U-Logic, видео, служебный обмен и сам сервер этого API; на панели UV4PRO-T10 перезапускается и собственный экран. Проект U-Logic при этом перезапускается (см. Режим HTTPS). Выданные токены остаются действительными. Через несколько секунд API снова отвечает.

POST /settings/https/cert: форма multipart/form-data с двумя файлами cert и key в формате PEM. Ключ должен быть без пароля и соответствовать сертификату, размер запроса не более 1 МБ. Контроллер сначала проверяет пару и только потом заменяет сертификат.

curl -k -X POST https://<IP>:8443/settings/https/cert \
     -H "Authorization: Bearer $TOKEN" \
     -F cert=@device.crt -F key=@device.key

Ответ (код 201): {"cert": {...}} с данными нового сертификата. Ошибки (код 400): cert_and_key_required (не передан один из файлов), too_large (больше 1 МБ), invalid_certificate (файлы не образуют пару или ключ защищён паролем; причина в поле message). После успешной загрузки те же службы перезапускаются, как при переключении режима. Встроенный сертификат сохраняется на устройстве и возвращается сбросом IP-адреса кнопкой и заводским сбросом. Подробнее о сертификате — Режим HTTPS.

Экран панели (только UV4PRO-T10)

Маршруты задают страницу, которую показывает собственный экран сенсорной панели UV4PRO-T10, и сертификаты, которым этот экран доверяет. Раздел страницы настроек: «Стартовая страница киоска».

Маршрут

Что делает

GET /settings/kiosk_url

Показывает адрес, признак «не проверять сертификаты» и доверенные сертификаты

POST /settings/kiosk_url

Сохраняет адрес и/или признак; действует после перезапуска экрана

POST /settings/kiosk_url/cert

Добавляет доверенные сертификаты к уже имеющимся (форма, поле cert, файл PEM, один или несколько сертификатов, до 1 МБ)

DELETE /settings/kiosk_url/cert

Удаляет все доверенные сертификаты, в том числе полученные от контроллеров

GET /settings/kiosk_url/offline

Отдаёт загруженную картинку «нет связи»; код 404, если её нет и экран показывает встроенный баннер

POST /settings/kiosk_url/offline

Заменяет картинку «нет связи» (форма, поле image, PNG или JPEG до 5 МБ, иначе код 400 invalid_image); действует с ближайшей пропажи адреса, перезапуск не нужен

DELETE /settings/kiosk_url/offline

Удаляет картинку, экран снова показывает встроенный баннер

POST /settings/kiosk_url/apply

Немедленно перезапускает экран панели с новыми настройками

GET /settings/kiosk_url:

{"url": "https://192.168.1.20:5001/", "ignore_cert_errors": false, "offline_image": false,
 "trusted": [{"subject": "CN=...", "not_after": "..."}]}

POST /settings/kiosk_url: тело {"url": "https://192.168.1.20:5001/interfaces/1", "ignore_cert_errors": false}; можно передать одно из двух полей. Адрес должен начинаться с http:// или https://, не длиннее 2048 символов. Ошибки: 400 (invalid_url), 500 (write_failed). Ответ содержит новое состояние и "applied_on_next_kiosk_start": true. Если адрес начинается с https:// и указывает на другой контроллер, панель при сохранении получает его сертификат и добавляет в доверенные: поле controller_cert равно true, или false, если контроллер не ответил за 5 секунд (адрес при этом сохраняется). Поле равно null для адреса http://, для страницы самой панели (127.0.0.1 или localhost) и для запроса, в котором передан только ignore_cert_errors. POST .../apply отвечает {"url": "...", "restarted": true}. На контроллере «UVATRON», у которого нет собственного экрана, apply возвращает код 404 (kiosk_unsupported).

Доступ к интерфейсу UI-Panel

Маршрут

Что делает

GET /settings/ui_access

Показывает, ограничен ли доступ к UI-Panel, и список пропусков

POST /settings/ui_access

Включает или выключает ограничение, задаёт пароль интерфейса и пропуска

Подробно о паролях и пропусках — в разделе Доступ к интерфейсам.

GET /settings/ui_access:

{"restricted": false, "password_set": false,
 "passes": [{"name": "Планшет склада", "key": "k3m9x2w7p4qa", "link": "/interfaces/3", "ip": "192.168.1.55"}]}

POST /settings/ui_access:

{"restricted": true, "password": "новый пароль интерфейса",
 "passes": [{"name": "Планшет склада", "key": "k3m9x2w7p4qa", "link": "/interfaces/3", "ip": "192.168.1.55"}]}
  • restricted обязателен (true или false), иначе код 400 (invalid_request).

  • password необязателен: если не передан или пуст, текущий пароль интерфейса сохраняется. В ответе пароля нет, только признак password_set.

  • Список passes заменяется целиком: чтобы сохранить существующий пропуск, передайте его снова вместе с его key. Пропуск без известного key получает новый ключ. Всего не более 200 пропусков.

  • Для пропуска обязательно name (1-64 символа). Необязательны link (вид /interfaces/<номер>, можно со значением ?immersive для полного экрана; допустим и полный адрес из браузера, лишнее отбрасывается) и ip (адрес устройства). Неверное значение даёт код 400 (invalid_pass) и пояснение в message.

  • Ответ (код 200) имеет тот же вид, что и ответ GET.

Примечание

Ответ GET /settings/ui_access содержит ключи пропусков. Токен API даёт права администратора: храните его так же, как пароль.

Проект

Маршруты работают с проектом UI-Designer (интерфейсы и изображения); проекты U-Logic скачиваются и загружаются в самом U-Logic.

Маршрут

Что делает

GET /get_project

Скачивает опубликованный проект UI-Designer файлом project.uidp

POST /upload_project

Заменяет проект целиком проектом из файла

POST /merge_project

Добавляет содержимое файла к текущему проекту

curl -k https://<IP>:8443/get_project -H "Authorization: Bearer $TOKEN" -o project.uidp
curl -k -X POST https://<IP>:8443/upload_project -H "Authorization: Bearer $TOKEN" -F project=@project.uidp
  • GET /get_project отдаёт последний опубликованный проект, а не несохранённые правки в UI-Designer. Если проекта нет, код 404.

  • POST /upload_project: файл в поле формы project. Текущий проект удаляется и заменяется проектом из файла, затем перезапускается U-Logic. Ответ: код 201 и {"message": "File uploaded successfully"}; при ошибке код 400 и {"error": "...", "details": "..."}.

  • POST /merge_project: файл в поле формы project. Текущий проект сохраняется, из файла добавляется новое. Ответ: код 200 и {"status": "ok", "results": {...}}; при ошибке код 500 и {"error": "merge failed", "details": "..."}.

Если поле project не передано или файл пуст, оба маршрута отвечают кодом 400 (No file part или No selected file).

Обновление прошивки

Файл обновления вы получаете от производителя. Размер загружаемого файла ограничен 10 ГБ.

Маршрут

Что делает

POST /upload_firmware

Загружает пакет обновления и запускает установку

GET /ota_status, POST /ota_rollback, POST /ota_clear

Фоновая установка обновления; пакетами версии 2.2.1 не используется

POST /upload_firmware: файл в форме multipart/form-data (имя поля любое).

curl -k -X POST https://<IP>:8443/upload_firmware \
     -H "Authorization: Bearer $TOKEN" -F file=@update.zip

Запрос длится, пока идёт установка: обычно 2–4 минуты, поэтому не ограничивайте время ожидания ответа. Затем приходит код 201 и {"message": "File uploaded successfully"}, и примерно через 5 секунд устройство само перезагружается; через 1–2 минуты API снова отвечает. Не отключайте питание до конца установки.

Ошибки: 400 (файл не передан), 500 (пакет не принят, например он предназначен для другого устройства), тело {"error": "...", "message": "File uploaded error"}. При ошибке устройство продолжает работать на прежней версии.

Маршруты /ota_status, /ota_rollback и /ota_clear служат фоновой установке, которую пакеты обновления версии 2.2.1 не используют: на обоих устройствах GET /ota_status отвечает {"stage": "idle"}.

Заводской сброс

POST /factory_reset возвращает контроллер в заводское состояние (кнопка «Сбросить до заводских настроек»). Состав сброса описан в разделе Начало работы. Для подтверждения нужен текущий пароль в теле запроса:

curl -k -X POST https://<IP>:8443/factory_reset \
     -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
     -d '{"password":"текущий пароль"}'

Ответ: код 201 и {"message": "successful"}. Если пароль неверный, код 400 и {"error": "Invalid password", "message": "error credential"}; при сбое код 500.

Предупреждение

Сброс необратим: удаляются проект, потоки U-Logic, пользовательские файлы, журналы и сертификаты, а пароль становится admin. Адрес порта eth0 меняется на заводской 192.168.1.250, и через несколько секунд контроллер перезагружается. После этого обращайтесь к нему по новому адресу. Все токены, выданные раньше, перестают действовать.

Пароль

POST /change_credentials меняет пароль страницы настроек. Тот же пароль используется для входа в U-Logic и UI-Designer. Логин (admin) не меняется.

curl -k -X POST https://<IP>:8443/change_credentials \
     -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
     -d '{"old_password":"admin","new_password":"новый пароль"}'

Ответ: код 201 и {"message": "Password changed"}. Если не переданы оба поля, код 400 (Missing old_password or new_password); если старый пароль неверный, код 400 (Invalid old password).

После смены пароля U-Logic перезапускается (вкладки программы при этом остаются включёнными), а все выданные ранее токены сразу перестают действовать, в том числе токен, с которым вы меняли пароль: войдите заново с новым паролем. Программы, которые входят с прежним паролем, нужно обновить.

Управление из программы U-Logic

Программа U-Logic на самом контроллере может вызывать этот API сама, например перезагрузить контроллер по команде от системы управления. Для этого нужны два узла http request (Node-RED; узел — блок программы U-Logic): первый получает токен, второй вызывает нужный маршрут.

        flowchart LR
    A["Команда<br/>(inject, MQTT, HTTP)"] --> B["http request<br/>POST /authorize"]
    B --> C["function:<br/>заголовок Authorization"]
    C --> D["http request<br/>POST /restart_plc"]
    D --> E["debug / ответ"]
    

Адрес для вызова с самого контроллера: https://127.0.0.1:8443.

Настройка узлов

  1. Создайте узел конфигурации TLS (в узле http request включите Use TLS и выберите Add new tls-config). В нём снимите флажок «Verify server certificate». Встроенный сертификат самоподписанный и выпущен на имя uvatron.local, а не на адрес 127.0.0.1, поэтому проверка сертификата не пройдёт. Вызов идёт внутри самого контроллера, по сети он не выходит.

  2. Первый http request (вход): метод POST, URL https://127.0.0.1:8443/authorize, TLS-конфигурация из п. 1, возврат a parsed JSON object. Перед ним поставьте узел function, который подготавливает тело:

    msg.payload = { login: "admin", password: "ВАШ_ПАРОЛЬ" };
    return msg;
    
  3. Между двумя запросами поставьте узел function, который берёт токен и формирует заголовок:

    if (!msg.payload.is_authorized) {
        node.error("Контроллер не принял пароль");
        return null;
    }
    msg.headers = { "Authorization": "Bearer " + msg.payload.token };
    msg.payload = {};
    return msg;
    
  4. Второй http request: метод POST, URL с нужным маршрутом, та же TLS-конфигурация, возврат a parsed JSON object. Для перезагрузки контроллера URL: https://127.0.0.1:8443/restart_plc. Ответ {"success": true} придёт на выход узла, а перезагрузка начнётся примерно через 5 секунд.

Если маршрут требует тело (например, /set_time_ntp), задайте msg.payload в узле из п. 3 нужным объектом вместо {}.

Токен действует 8 часов. Для редких команд проще получать новый токен перед каждой командой, как показано выше.

Перезагрузка контроллера и перезапуск проекта

  • Перезагрузка контроллера: маршрут POST /restart_plc (как выше). Программа остановится вместе с контроллером и запустится снова после загрузки.

  • Перезапуск проекта: маршрут POST /restart_node-red, URL https://127.0.0.1:8443/restart_node-red. U-Logic перезапускается вместе с программой, которая его вызвала, и через несколько секунд программа запускается снова с теми же включёнными вкладками. Ответ на запрос может не успеть прийти: программа останавливается раньше.

Примечание

Пароль администратора задаётся в узле function программы. После смены пароля (в том числе через /change_credentials) обновите его там же, иначе узел /authorize будет отвечать "is_authorized": false, и команды перестанут выполняться.

Краткая сводка маршрутов

Маршрут

Назначение

POST /authorize

Вход, получение токена (без токена)

POST /change_credentials

Смена пароля

GET /system_info, GET /get_logs, GET /get_config

Сведения, журналы, параметры

POST /restart_plc, POST /restart_node-red, POST /block_program, /gui_config

Перезагрузка, перезапуск U-Logic, блокировка программы, UI-Designer

/set_time_ntp, /ntp_server, POST /set_time_manual

Время

/settings/<интерфейс>, /settings/<интерфейс>/certs

Сеть и 802.1X

/settings/https, POST /settings/https/cert

Режим HTTPS и сертификат

/settings/kiosk_url*

Экран панели UV4PRO-T10

/settings/ui_access

Доступ к UI-Panel

GET /get_project, POST /upload_project, POST /merge_project

Проект UI-Designer

POST /upload_firmware

Обновление прошивки

POST /factory_reset

Заводской сброс