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:0Note
Запись
имя:значение— это нотация конфигурационного файла. В MQTT имя и значение разнесены: топикmoduleBox/button_2/event/press, payload1. 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:1 | button_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 |
| Действие, которого нет у модуля | сверяйтесь с разделом «Команды» страницы модуля |
Смотрите также
- Конституция — правила топиков и payload
- Настройки — структура
config.ini - Системные команды