CrossLink — механизм внутренних связей: модули устройства взаимодействуют между собой без участия внешнего сервера. Связь слушает событие одного модуля и вызывает действие другого — тот же язык event/action, что описан в конституции. Поэтому одна и та же автоматизация записывается одинаково и локально, и через брокер.

Формат правила

crosslink = <событие>:<значение> -> <действие>:<значение>

Слева и справа — топики без имени устройства, с обязательным направлением:

[SLOT_2]
mode = button_led
;при нажатии кнопки 2 включить подсветку в слоте 3
crosslink = button_2/event/press:1->led_3/action/enable:1
  • Событие принадлежит тому слоту, в блоке которого объявлено правило. Кнопка в слоте 2 рапортует под button_2, значит правило пишется в блоке [SLOT_2].
  • Действие может адресовать любой слот устройства.
  • Несколько правил в одной строке разделяются запятой.
  • Имя устройства (deviceName) в правиле не пишется — оно подставляется автоматически. Исключение — Нестандартные топики.
;два правила в одном слоте
crosslink = button_0/event/press:1->led_0/action/enable:1, button_0/event/press:0->led_0/action/enable:0

Note

Запись имя:значение — это нотация конфигурационного файла. В MQTT имя и значение разнесены: топик moduleBox/button_2/event/press, payload 1. CrossLink просто пишет их в одну строку, потому что так компактнее.

Действия с параметрами

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

;при нажатии кнопки 3 установить указатель на трек с индексом 3
crosslink = button_3/event/press:1->player_0/action/shift:3
 
;при нажатии выставить яркость канала 0
crosslink = button_1/event/press:1->pwmLeds_2/action/ch_0/setBright:128

Полный перечень доступных действий модуля — в разделе «Команды» на странице модуля.

Специальные символы

# — любое значение / текущее значение

В событии # означает «сработать на любое значение», в действии — «вызвать команду с её текущим значением, не меняя его».

;по завершению любого трека проиграть следующий
crosslink = player_0/event/endOfTrack:#->player_0/action/play:+1

@ — передать значение события в действие

;состояние кнопки передаётся в подсветку: нажата — горит, отпущена — гаснет
crosslink = button_0/event/press:@->led_0/action/enable:@

Условные операторы

Совместно с @ работают операторы сравнения ==, >, <. Если в значении действия стоит @, в действие передаётся результат сравнения (0 или 1); иначе действие выполняется только при истинном условии.

;подсветка горит, только когда значение аналогового модуля равно 1000
crosslink = analog_0/event/rawVal:@==1000->led_1/action/enable:@
 
;плеер начинает проигрывание, если значение больше 1000
crosslink = analog_0/event/rawVal:@>1000->player_0/action/play:#
 
;подсветка горит, если значение меньше 1000
crosslink = analog_0/event/rawVal:@<1000->led_1/action/enable:@

Нестандартные топики

Если модулю задан пользовательский топик (опции buttonTopic, ledTopic, topic), в правиле используется он целиком — включая имя устройства, если оно входит в топик.

[SLOT_0]
mode = button_led
;настраиваем пользовательский топик события
options = buttonTopic:zone_7/keyOne
;реагируем на нажатие включением и выключением подсветки
crosslink = zone_7/keyOne/event/press:1->led_0/action/enable:1, zone_7/keyOne/event/press:0->led_0/action/enable:0

Связи для входящих UDP-сообщений

Секция [UDP] принимает собственный crosslink. Он позволяет обрабатывать сообщения от внешних устройств и транслировать их в команды модулей. Источник указывается вместе с именем устройства-отправителя:

[UDP]
serverAdress = 192.168.88.1
serverPort = 8000
myPort = 7000
;при получении UDP-сообщения от remoteDevice включить подсветку в слоте 0
crosslink = remoteDevice/button_0/event/press:1->led_0/action/enable:1

Отладка

Флаг crossLinkDebug в секции [SYSTEM] заставляет устройство публиковать каждую исполняемую линкером строку:

[SYSTEM]
deviceName = moduleBox
crossLinkDebug = 1

Строки уходят в топик <deviceName>/crossLink/execute — видно, какое правило сработало и что именно ушло в модуль-приёмник.

Типичные ошибки

ОшибкаКак правильно
crosslink = button_2:1->led_3:1button_2/event/press:1->led_3/action/enable:1
Правило с button_1 в блоке слота 2событие-источник принадлежит своему слоту
moduleBox/button_2/event/press:1->...имя устройства в стандартных топиках не пишется
Действие без направления (led_3:1)led_3/action/enable:1
Действие, которого нет у модулясверяйтесь с разделом «Команды» страницы модуля

Смотрите также