Интеграция iRidi с сервером BOOCO 2.x по протоколу MQTT

Разработчикам / Обеспечение взаимодействия BOOCO с другими ИТ-системами

Введение

Сервер BOOCO позволяет управлять мультимедийным, AV и инженерным оборудованием. В версии 1.x сервера BOOCO для интеграции с другими системами использовался REST API. В версии 2.x используется протокол MQTT. Теперь для интеграции с панельными и серверными проектами iRidi не требуется загружать дополнительные скриптовые драйверы, а достаточно просто настроить связь про протоколу MQTT.

Количество клиентов, которые могут подключаться к серверу BOOCO по протоколу MQTT, ограничено только характеристиками виртуального или физического сервера, на котором установлен BOOCO.

Протокол MQTT обеспечивает обмен сообщениями по шаблону издатель — подписчик. Сервер BOOCO публикует топики, содержащие обратные связи подключенного к BOOCO оборудования, и подписывается на каналы — команды, которые можно отправлять на оборудование. Клиент подключается к серверу BOOCO под MQTT и подписывается на интересующие его топики. При подписке сервер-брокер сразу отправляет клиенту текущее значение обратной связи. Также клиент будет оповещен при изменении топиков. Для отправки команды клиент должен опубликовать топик с нужным значением.

iRidi берет на себя все внутренние механизмы, и интеграция iRidi с сервером BOOCO становится очень простой, не требует дополнительных внешних скриптов-драйверов и может быть выполнена с минимальным объемом программирования.

Требования

  • Сервер BOOCO 2.5 или выше
  • Настроенный брокер MQTT (по умолчанию используется RabbitMQ с MQTT-плагином, но можно использовать и внешний брокер)

Описание структуры топиков

Структура топиков обратных связей: devices/<device 1>/feedbacks/<feedback 1>

  • <device 1> — имя устройства на сервере BOOCO в разделе Оборудование
  • <feedback 1> — имя обратной связи

Структура топиков команд: devices/<device 1>/channels/<channel 1>/<value> или devices/<device 1>/channels/<channel 1>

  • <device 1> — имя устройства на сервере BOOCO в разделе Оборудование
  • <channel 1> — имя команды
  • value — значение, которое отправляется на устройство командой

Пример с BOOCO-SENSOR

Для устройства BOOCO-SENSOR с именем sensor1 можно использовать следующие топики для обратных связей:

devices/sensor1/feedbacks/input0
devices/sensor1/feedbacks/input1
devices/sensor1/feedbacks/input2
devices/sensor1/feedbacks/input3
devices/sensor1/feedbacks/input4
devices/sensor1/feedbacks/status

Значения, которые принимают топики input0 — input4on и off. Значения топика statusconnected и disconnected.

💡
input0 — специальная обратная связь, у которой будет значение on, если хотя бы одна из четырех обратных связей inputX будет в состоянии on.

Добавление BOOCO в iRidium Studio

  1. Добавьте устройство с драйвером MQTT (https://dev.iridi.com/MQTT):
    • Host — укажите адрес сервера
    • Port1883 (по умолчанию)
    • Login — обязательно укажите клиентский логин
    • Password — обязательно укажите клиентский пароль
    • MQTT version — 4 (соответствует версии MQTT 3.1.1)
    • Client ID — произвольно
    • Keep Alive — оставить значение по умолчанию
    • Clean — оставить значение по умолчанию
    • SSL — выключить
  1. Создайте обратные связи для драйвера MQTT. В настройках обратной связи укажите:
    • Name название канала обратной связи (задается произвольно)
    • Topic — топик
    • Value Type — значение String.
    • image

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

  1. Если нужно, обработайте данные в скрипте.
  2. Данные в каналы обратной связи приходят в формате string. Чтобы преобразовать данные в нужный формат, можно воспользоваться дополнительными скриптами.

    Пример:

    // Пример скрипта для работы c BOOCO SENSOR
    var device = IR.GetDevice("MQTT"); 
    IR.AddListener(IR.EVENT_TAG_CHANGE, device, function(name, value) {
      if (name === "Sensor_1_input1") { // имя фидбека, как указано в драйвере
        if (value === 'on'){
    		  IR.Log('1')
    		} else {
    		  IR.Log('0')
    	  }
      }
    });