Xiot-controller-local-api: различия между версиями
Admin (обсуждение | вклад) Уточнено описание локального API контроллера |
Admin (обсуждение | вклад) OLD-04E: безопасная инструкция локального API XIOT-PLC и маршрут из обзора драйверов |
||
| Строка 1: | Строка 1: | ||
Локальное API контроллера XIOT | '''Локальное API контроллера XIOT''' — входящий HTTP-интерфейс XIOT-PLC. Внешняя система в доверенной локальной сети может через него прочитать объекты и характеристики загруженного проекта или передать команду. API не создаёт новые адреса: оно использует дом, этажи, комнаты, виртуальные устройства и характеристики, которые уже есть в действующей конфигурации контроллера. | ||
< | Не путайте локальное API с исходящим модулем REST API: локальное API принимает обращения внешней системы на XIOT-PLC, а исходящий модуль сам обращается к другому серверу. Обзор интеграционных модулей: [[Настройка драйверов]]. | ||
</ | Описанный контракт проверен по опубликованному пакету XIOT-PLC <code>14.1-1-1</code>. В этой версии контроллер принимает запросы по схеме HTTP на своём IP-адресе и порту <code>5552</code>. | ||
== Перед началом == | |||
* Загрузите на XIOT-PLC актуальную конфигурацию проекта и убедитесь, что нужное виртуальное устройство связано с реальным оборудованием: [[Привязка реальных устройств к виртуальным]]. | |||
* Подключайте внешнюю систему только из доверенной локальной сети либо через защищённый VPN. | |||
* Не пробрасывайте порт <code>5552</code> на маршрутизаторе и не публикуйте его в Интернете. | |||
* Для первой команды выберите известное устройство с безопасной и видимой реакцией. Не начинайте проверку на замках, воротах, насосах, отоплении, защитной автоматике и другом оборудовании, неожиданное включение которого опасно. | |||
== Получение и обновление ключа == | |||
# Откройте привязанный контроллер в XIOT-EDITOR. | |||
# Откройте окно '''Настройки контроллера'''. | |||
# Скопируйте значение поля '''Ключ локального API (порт 5552)'''. | |||
Это единый секрет контроллера: с ним можно читать данные проекта и отправлять команды доступным через API объектам. Храните ключ как пароль. Не помещайте его в вики, исходный код, скриншоты, обращения в поддержку и общие журналы. | |||
Кнопка '''Обновить ключ локального API''' создаёт новый ключ. Старый ключ после этого перестаёт проходить авторизацию, поэтому обновите его во всех разрешённых интеграциях. Если ключ мог попасть к посторонним, обновите его сразу. | |||
== Подготовка запроса == | |||
В примерах ниже используются две переменные, значения которых задаются только в вашей локальной среде: | |||
* <code>XIOT_API</code> — базовый адрес из схемы <code>http</code>, IP-адреса контроллера и порта <code>5552</code>; | |||
* <code>XIOT_API_KEY</code> — текущий ключ локального API. | |||
Для разовой проверки в <code>bash</code> или <code>zsh</code> значения можно ввести интерактивно, не записывая их в историю команд: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
read -r -p "Базовый адрес XIOT API: " XIOT_API | |||
read -r -s -p "Ключ XIOT API: " XIOT_API_KEY | |||
printf '\n' | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Рекомендуемый вариант авторизации — заголовок <code>X-XIOT-API-Key</code>: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
curl -H " | curl --silent --show-error --max-time 10 \ | ||
" | -H "X-XIOT-API-Key: ${XIOT_API_KEY}" \ | ||
"${XIOT_API}/api/v1/remote/get/devices" | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Также поддерживается заголовок <code>Authorization: Bearer</code>. Не передавайте ключ в адресе запроса: адрес может сохраниться в истории, журналах и системах мониторинга. | |||
< | Текущая реализация использует метод HTTP <code>GET</code> и для чтения, и для команд изменения. Не открывайте командные адреса в браузере, не сохраняйте их в закладках и не пропускайте через кэширующие или автоматически повторяющие запросы посредники. | ||
</ | |||
== Получение данных == | == Получение данных == | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Путь | ||
! | ! Результат | ||
|- | |- | ||
| <code>/api/v1/remote/get/home</code> | | <code>/api/v1/remote/get/home</code> | ||
| Дом и его характеристики. | | Дом и его характеристики. Идентификатор дома в текущей реализации — <code>1</code>. | ||
|- | |- | ||
| <code>/api/v1/remote/get/floors</code> | | <code>/api/v1/remote/get/floors</code> | ||
| | | Все этажи. | ||
|- | |- | ||
| <code>/api/v1/remote/get/floor/< | | <code>/api/v1/remote/get/floor/<id></code> | ||
| Один этаж. | | Один этаж с указанным идентификатором. | ||
|- | |- | ||
| <code>/api/v1/remote/get/rooms</code> | | <code>/api/v1/remote/get/rooms</code> | ||
| | | Все комнаты с данными об этажах. | ||
|- | |- | ||
| <code>/api/v1/remote/get/room/< | | <code>/api/v1/remote/get/room/<id></code> | ||
| Одна комната. | | Одна комната с указанным идентификатором. | ||
|- | |- | ||
| <code>/api/v1/remote/get/devices</code> | | <code>/api/v1/remote/get/devices</code> | ||
| | | Все виртуальные устройства с комнатами, этажами и характеристиками. | ||
|- | |- | ||
| <code>/api/v1/remote/get/device/< | | <code>/api/v1/remote/get/device/<id></code> | ||
| Одно устройство. | | Одно виртуальное устройство с указанным идентификатором. | ||
|} | |} | ||
Ответ имеет формат JSON. Объекты индексируются их идентификаторами. Для устройств возвращаются имя, тип, сведения о комнате и этаже, а также объект <code>characteristic</code> с текущими значениями характеристик. Набор полей и характеристики зависят от загруженного проекта. | |||
< | |||
Сначала запросите списки и возьмите идентификаторы из фактического ответа. Не угадывайте идентификатор и не переносите его из чужого примера. После изменения структуры проекта выполните обнаружение заново. | |||
== | == Отправка команды == | ||
Форма пути команды: | |||
<syntaxhighlight lang="text"> | <syntaxhighlight lang="text"> | ||
| Строка 88: | Строка 89: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Поддержаны типы <code>home</code>, <code>floor</code>, <code>room</code> и <code>device</code>. Идентификатор и имя характеристики берите из текущего проекта и ответа API. До команды проверьте в XIOT-EDITOR или в документации виртуального устройства, что характеристика предназначена для управления. Если сегмент содержит специальные символы, его нужно корректно кодировать для URL. | |||
Пример с заранее проверенными локальными переменными: | |||
<syntaxhighlight lang="bash"> | |||
curl --silent --show-error --max-time 10 \ | |||
-H "X-XIOT-API-Key: ${XIOT_API_KEY}" \ | |||
"${XIOT_API}/api/v1/remote/set/device/${DEVICE_ID}/${CHARACTERISTIC}/${VALUE}" | |||
</syntaxhighlight> | |||
Ответ обработчика на принятую команду: | |||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
| Строка 94: | Строка 105: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Если | Этот ответ означает, что обработчик нашёл объект и характеристику и вызвал внутреннюю команду XIOT. Он не подтверждает физическое выполнение оборудованием. Если обработчик не нашёл объект или характеристику либо не смог вызвать команду, обычно возвращается: | ||
<syntaxhighlight lang="json"> | <syntaxhighlight lang="json"> | ||
| Строка 100: | Строка 111: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Оба ответа могут прийти с кодом HTTP <code>200</code>, поэтому проверяйте и код, и JSON, и фактический результат. | |||
== Безопасная проверка == | |||
# Выполните <code>/api/v1/remote/get/devices</code> и найдите нужное устройство по фактическому ответу. | |||
# Сверьте его идентификатор, характеристику управления и допустимое значение с текущим проектом. | |||
# Выберите безопасную нагрузку с видимой реакцией и запишите исходное состояние. | |||
# Отправьте одну команду. Не настраивайте автоматические повторы при неопределённом результате. | |||
# Проверьте физическую реакцию оборудования, затем повторно запросите <code>/api/v1/remote/get/device/<id></code> и сравните состояние. | |||
# Если значение было изменено только для теста, верните исходное состояние и ещё раз проверьте оборудование. | |||
Ответ API без физической реакции не считается успешной приёмкой всей цепочки. Если адрес состояния не отражает реальность, сначала исправьте привязку устройства. | |||
== Коды и ответы == | |||
{| class="wikitable" | {| class="wikitable" | ||
! | ! Наблюдение | ||
! Что | ! Что оно означает | ||
|- | |||
| HTTP <code>401</code> и <code>{"error":"unauthorized"}</code> | |||
| Ключ отсутствует или не совпадает с текущим ключом контроллера. | |||
|- | |- | ||
| <code> | | HTTP <code>200</code> и непустой JSON объекта | ||
| | | Запрос чтения обработан; содержимое всё равно нужно проверить. | ||
|- | |- | ||
| <code>/ | | HTTP <code>200</code> и <code>{}</code> | ||
| | | Объект не найден, путь не распознан либо в текущей конфигурации нет данных. Код <code>200</code> сам по себе не доказывает правильность пути. | ||
|- | |- | ||
| <code>/ | | HTTP <code>200</code> и <code>{"set":"ok"}</code> | ||
| | | Внутренняя команда вызвана; физический результат ещё нужно проверить. | ||
|- | |- | ||
| <code>/ | | HTTP <code>200</code> и <code>{"set":"error"}</code> | ||
| | | Команда не принята обработчиком; проверьте полный путь, тип, идентификатор и характеристику. | ||
|- | |||
| Нет HTTP-ответа | |||
| Проверьте питание и доступность контроллера, его текущий IP-адрес, маршрут, локальный межсетевой экран и порт <code>5552</code>. | |||
|} | |} | ||
Не рассчитывайте на отдельный код <code>404</code> для каждого неверного пути: текущий обработчик может вернуть пустой JSON с кодом <code>200</code>. | |||
== Безопасность сети == | |||
* API слушает порт <code>5552</code> на сетевых интерфейсах контроллера и рассчитан на доверенный контур. | |||
</ | * Встроенный интерфейс использует обычный HTTP без TLS. В недоверенной сети можно перехватить и ключ, и команды. | ||
* Разрешайте соединение только нужным узлам локальной сети. Для удалённого доступа используйте администрируемый VPN с ограничением маршрутов и источников. | |||
* Не открывайте порт <code>5552</code> в Интернет, даже если используется сложный ключ. | |||
* Не передавайте ключ в строке запроса. Не записывайте полные заголовки авторизации в журналы. | |||
* При увольнении подрядчика, компрометации компьютера или публикации конфигурации обновите ключ и удалите старое значение из всех хранилищ и журналов, где это возможно. | |||
== После изменения проекта == | |||
Локальное API работает с конфигурацией, фактически загруженной на XIOT-PLC. Команда '''Загрузить конфигурацию на контроллер''' автоматически сохраняет проект, создаёт одну новую версию и передаёт на привязанный контроллер точный снимок этой версии. Отдельное сохранение без загрузки не изменяет набор объектов API на контроллере. | |||
После добавления, удаления или повторного создания объектов заново запросите списки, проверьте идентификаторы и выполните безопасную приёмку интеграции. Не считайте старые идентификаторы бессрочным контрактом. | |||
== | == Если запрос не работает == | ||
# Убедитесь, что XIOT-PLC включён и доступен по его текущему IP-адресу из той же доверенной сети. | |||
# Проверьте, что используется порт <code>5552</code>, а ключ передан ровно в одном поддерживаемом заголовке. | |||
# При ошибке <code>401</code> заново скопируйте текущий ключ; после обновления ключа старое значение уже не подходит. | |||
# При пустом ответе сначала проверьте полный путь и получите актуальные идентификаторы списочным запросом. | |||
# При <code>{"set":"error"}</code> сверьте объект и направление характеристики в проекте. | |||
# Если получено <code>{"set":"ok"}</code>, но оборудование не отреагировало, проверьте адрес управления, адрес состояния, драйвер и физическое оборудование. Полезны [[Системные события в журнале XIOT-PLC]] и [[Механизм работы тегов в XIOT]]. | |||
Если причина не найдена, обратитесь на страницу [[Связь с поддержкой]]. Передавайте время проверки, версию XIOT-PLC и обезличенный путь запроса; не отправляйте ключ и полные заголовки авторизации. | |||
== Следующие шаги == | |||
* [[Настройка драйверов]] — исходящие интеграционные модули и протоколы. | |||
* [[Привязка реальных устройств к виртуальным]] — связь команды API с физическим оборудованием. | |||
* [[Механизм работы тегов в XIOT]] — адреса управления и состояния. | |||
[[Категория:XIOT-PLC]] | |||
[[Категория:Интеграции]] | |||
Версия от 22:43, 13 сентября 2026
Локальное API контроллера XIOT — входящий HTTP-интерфейс XIOT-PLC. Внешняя система в доверенной локальной сети может через него прочитать объекты и характеристики загруженного проекта или передать команду. API не создаёт новые адреса: оно использует дом, этажи, комнаты, виртуальные устройства и характеристики, которые уже есть в действующей конфигурации контроллера.
Не путайте локальное API с исходящим модулем REST API: локальное API принимает обращения внешней системы на XIOT-PLC, а исходящий модуль сам обращается к другому серверу. Обзор интеграционных модулей: Настройка драйверов.
Описанный контракт проверен по опубликованному пакету XIOT-PLC 14.1-1-1. В этой версии контроллер принимает запросы по схеме HTTP на своём IP-адресе и порту 5552.
Перед началом
- Загрузите на XIOT-PLC актуальную конфигурацию проекта и убедитесь, что нужное виртуальное устройство связано с реальным оборудованием: Привязка реальных устройств к виртуальным.
- Подключайте внешнюю систему только из доверенной локальной сети либо через защищённый VPN.
- Не пробрасывайте порт
5552на маршрутизаторе и не публикуйте его в Интернете. - Для первой команды выберите известное устройство с безопасной и видимой реакцией. Не начинайте проверку на замках, воротах, насосах, отоплении, защитной автоматике и другом оборудовании, неожиданное включение которого опасно.
Получение и обновление ключа
- Откройте привязанный контроллер в XIOT-EDITOR.
- Откройте окно Настройки контроллера.
- Скопируйте значение поля Ключ локального API (порт 5552).
Это единый секрет контроллера: с ним можно читать данные проекта и отправлять команды доступным через API объектам. Храните ключ как пароль. Не помещайте его в вики, исходный код, скриншоты, обращения в поддержку и общие журналы.
Кнопка Обновить ключ локального API создаёт новый ключ. Старый ключ после этого перестаёт проходить авторизацию, поэтому обновите его во всех разрешённых интеграциях. Если ключ мог попасть к посторонним, обновите его сразу.
Подготовка запроса
В примерах ниже используются две переменные, значения которых задаются только в вашей локальной среде:
XIOT_API— базовый адрес из схемыhttp, IP-адреса контроллера и порта5552;XIOT_API_KEY— текущий ключ локального API.
Для разовой проверки в bash или zsh значения можно ввести интерактивно, не записывая их в историю команд:
read -r -p "Базовый адрес XIOT API: " XIOT_API
read -r -s -p "Ключ XIOT API: " XIOT_API_KEY
printf '\n'
Рекомендуемый вариант авторизации — заголовок X-XIOT-API-Key:
curl --silent --show-error --max-time 10 \
-H "X-XIOT-API-Key: ${XIOT_API_KEY}" \
"${XIOT_API}/api/v1/remote/get/devices"
Также поддерживается заголовок Authorization: Bearer. Не передавайте ключ в адресе запроса: адрес может сохраниться в истории, журналах и системах мониторинга.
Текущая реализация использует метод HTTP GET и для чтения, и для команд изменения. Не открывайте командные адреса в браузере, не сохраняйте их в закладках и не пропускайте через кэширующие или автоматически повторяющие запросы посредники.
Получение данных
| Путь | Результат |
|---|---|
/api/v1/remote/get/home
|
Дом и его характеристики. Идентификатор дома в текущей реализации — 1.
|
/api/v1/remote/get/floors
|
Все этажи. |
/api/v1/remote/get/floor/<id>
|
Один этаж с указанным идентификатором. |
/api/v1/remote/get/rooms
|
Все комнаты с данными об этажах. |
/api/v1/remote/get/room/<id>
|
Одна комната с указанным идентификатором. |
/api/v1/remote/get/devices
|
Все виртуальные устройства с комнатами, этажами и характеристиками. |
/api/v1/remote/get/device/<id>
|
Одно виртуальное устройство с указанным идентификатором. |
Ответ имеет формат JSON. Объекты индексируются их идентификаторами. Для устройств возвращаются имя, тип, сведения о комнате и этаже, а также объект characteristic с текущими значениями характеристик. Набор полей и характеристики зависят от загруженного проекта.
Сначала запросите списки и возьмите идентификаторы из фактического ответа. Не угадывайте идентификатор и не переносите его из чужого примера. После изменения структуры проекта выполните обнаружение заново.
Отправка команды
Форма пути команды:
/api/v1/remote/set/<тип>/<id>/<характеристика>/<значение>
Поддержаны типы home, floor, room и device. Идентификатор и имя характеристики берите из текущего проекта и ответа API. До команды проверьте в XIOT-EDITOR или в документации виртуального устройства, что характеристика предназначена для управления. Если сегмент содержит специальные символы, его нужно корректно кодировать для URL.
Пример с заранее проверенными локальными переменными:
curl --silent --show-error --max-time 10 \
-H "X-XIOT-API-Key: ${XIOT_API_KEY}" \
"${XIOT_API}/api/v1/remote/set/device/${DEVICE_ID}/${CHARACTERISTIC}/${VALUE}"
Ответ обработчика на принятую команду:
{"set":"ok"}
Этот ответ означает, что обработчик нашёл объект и характеристику и вызвал внутреннюю команду XIOT. Он не подтверждает физическое выполнение оборудованием. Если обработчик не нашёл объект или характеристику либо не смог вызвать команду, обычно возвращается:
{"set":"error"}
Оба ответа могут прийти с кодом HTTP 200, поэтому проверяйте и код, и JSON, и фактический результат.
Безопасная проверка
- Выполните
/api/v1/remote/get/devicesи найдите нужное устройство по фактическому ответу. - Сверьте его идентификатор, характеристику управления и допустимое значение с текущим проектом.
- Выберите безопасную нагрузку с видимой реакцией и запишите исходное состояние.
- Отправьте одну команду. Не настраивайте автоматические повторы при неопределённом результате.
- Проверьте физическую реакцию оборудования, затем повторно запросите
/api/v1/remote/get/device/<id>и сравните состояние. - Если значение было изменено только для теста, верните исходное состояние и ещё раз проверьте оборудование.
Ответ API без физической реакции не считается успешной приёмкой всей цепочки. Если адрес состояния не отражает реальность, сначала исправьте привязку устройства.
Коды и ответы
| Наблюдение | Что оно означает |
|---|---|
HTTP 401 и {"error":"unauthorized"}
|
Ключ отсутствует или не совпадает с текущим ключом контроллера. |
HTTP 200 и непустой JSON объекта
|
Запрос чтения обработан; содержимое всё равно нужно проверить. |
HTTP 200 и {}
|
Объект не найден, путь не распознан либо в текущей конфигурации нет данных. Код 200 сам по себе не доказывает правильность пути.
|
HTTP 200 и {"set":"ok"}
|
Внутренняя команда вызвана; физический результат ещё нужно проверить. |
HTTP 200 и {"set":"error"}
|
Команда не принята обработчиком; проверьте полный путь, тип, идентификатор и характеристику. |
| Нет HTTP-ответа | Проверьте питание и доступность контроллера, его текущий IP-адрес, маршрут, локальный межсетевой экран и порт 5552.
|
Не рассчитывайте на отдельный код 404 для каждого неверного пути: текущий обработчик может вернуть пустой JSON с кодом 200.
Безопасность сети
- API слушает порт
5552на сетевых интерфейсах контроллера и рассчитан на доверенный контур. - Встроенный интерфейс использует обычный HTTP без TLS. В недоверенной сети можно перехватить и ключ, и команды.
- Разрешайте соединение только нужным узлам локальной сети. Для удалённого доступа используйте администрируемый VPN с ограничением маршрутов и источников.
- Не открывайте порт
5552в Интернет, даже если используется сложный ключ. - Не передавайте ключ в строке запроса. Не записывайте полные заголовки авторизации в журналы.
- При увольнении подрядчика, компрометации компьютера или публикации конфигурации обновите ключ и удалите старое значение из всех хранилищ и журналов, где это возможно.
После изменения проекта
Локальное API работает с конфигурацией, фактически загруженной на XIOT-PLC. Команда Загрузить конфигурацию на контроллер автоматически сохраняет проект, создаёт одну новую версию и передаёт на привязанный контроллер точный снимок этой версии. Отдельное сохранение без загрузки не изменяет набор объектов API на контроллере.
После добавления, удаления или повторного создания объектов заново запросите списки, проверьте идентификаторы и выполните безопасную приёмку интеграции. Не считайте старые идентификаторы бессрочным контрактом.
Если запрос не работает
- Убедитесь, что XIOT-PLC включён и доступен по его текущему IP-адресу из той же доверенной сети.
- Проверьте, что используется порт
5552, а ключ передан ровно в одном поддерживаемом заголовке. - При ошибке
401заново скопируйте текущий ключ; после обновления ключа старое значение уже не подходит. - При пустом ответе сначала проверьте полный путь и получите актуальные идентификаторы списочным запросом.
- При
{"set":"error"}сверьте объект и направление характеристики в проекте. - Если получено
{"set":"ok"}, но оборудование не отреагировало, проверьте адрес управления, адрес состояния, драйвер и физическое оборудование. Полезны Системные события в журнале XIOT-PLC и Механизм работы тегов в XIOT.
Если причина не найдена, обратитесь на страницу Связь с поддержкой. Передавайте время проверки, версию XIOT-PLC и обезличенный путь запроса; не отправляйте ключ и полные заголовки авторизации.
Следующие шаги
- Настройка драйверов — исходящие интеграционные модули и протоколы.
- Привязка реальных устройств к виртуальным — связь команды API с физическим оборудованием.
- Механизм работы тегов в XIOT — адреса управления и состояния.