Последовательности и анализаторы
Устройства присылают данные «одним куском»: список шагов сценария, таблицу значений, ответ в виде текста с разделителями. А программа работает с одним сообщением за раз. Узлы этой страницы переводят данные из одной формы в другую.
Последовательности —
split,join,sort,batch. Разбивают одно сообщение на несколько, собирают несколько в одно, упорядочивают и группируют.Анализаторы —
csv,html,json,xml,yaml. Превращают текст в объект, с которым умеют работатьchangeиswitch, и обратно.
В программе зала split раскладывает список шагов сценария по одному (блок «Шаги сценариев и подписки» на странице «Программа «Демо-зал»: обзор»), а анализаторы нужны, когда устройство отвечает текстом, а не готовыми значениями.
Как открыть окно узла и где найти справку — на странице «Узлы U-Logic». Здесь — только то, что нужно для выбора узла и первой настройки.
Последовательности
Когда split разбивает сообщение, он записывает в каждое сообщение msg.parts: номер части, сколько всего частей и вид исходных данных. По msg.parts узлы join и sort понимают, что сообщения — части одной последовательности.
split
Разбивает одно сообщение на несколько: строку — по разделителю, массив — по элементам или кускам заданной длины, объект — по парам «ключ — значение». Вход: 1, выход: 1.
Окно узла split «Разбить»: 1 — «Разделить», 2 — «С помощью» в блоке «Строка / Буфер», 3 — «Фикс. длина» в блоке «Массив», 4 — «Отправлять сообщение для каждой пары ключ/значение»
Поля окна:
«Разделить» — какое свойство сообщения разбирать; по умолчанию
payload.Блок «Строка / Буфер», «С помощью» — чем разделена строка; по умолчанию перевод строки.
Блок «Массив», «С помощью» → «Фикс. длина» — сколько элементов в одном сообщении; по умолчанию 1.
Блок «Объект», «Отправлять сообщение для каждой пары ключ/значение» — по сообщению на каждую пару; рядом флажок «Копировать ключ в» — в какое свойство положить ключ пары.
join
Собирает последовательность сообщений в одно. Вход: 1, выход: 1. Режим выбирается в поле «Режим».
Режим |
Что делает |
|---|---|
«автоматический» (по умолчанию) |
собирает обратно то, что разбил |
«ручной» |
вы сами выбираете, что и во что собирать, и когда отправить результат |
«агрегация последовательности» |
считает по последовательности одно значение — сумму, среднее и т. п. |
Окно узла join «Собрать вручную»: 1 — «Режим», 2 — «Объединить каждый», 3 — «чтобы создать», 4 — «соединяя с помощью», 5 — «после ряда частей сообщения», 6 — «по истечении времени с 1го сообщения»
Поля окна в режиме «ручной»:
«Режим» — «ручной».
«Объединить каждый» — какое свойство собирать или «полное сообщение».
«чтобы создать» — результат: «строку», «массив», «буфер», «объект ключей/значений», «объединенный объект».
«соединяя с помощью» — разделитель для строки.
«после ряда частей сообщения» — отправить, когда накопилось столько частей.
«по истечении времени с 1го сообщения» — отправить, если за столько секунд не набралось нужное число.
Ещё в режиме «ручной»: «используя значение … как ключ» — для объекта, чем подписать каждое значение (по умолчанию topic); флажок «Use existing msg.parts property» (подпись английская) — использовать уже имеющееся свойство msg.parts; «после сообщения с установленным свойством msg.complete» — отправить по сигналу.
Режим «агрегация последовательности» работает через выражения: «Агрегирующее выражение», «Начальное значение», «Исправляющее выражение», флажок «Выполнять в обратном порядке (от последнего к первому)». Среднее, например: агрегирующее $A+payload, начальное значение 0, исправляющее $A/$N.
Сообщение с msg.complete отправляет накопленное немедленно, с msg.reset — сбрасывает накопленное.
sort
Упорядочивает массив в одном сообщении или сами сообщения последовательности. Вход: 1, выход: 1.
Окно узла sort «Упорядочить»: 1 — «Сортировать», 2 — «Ключ», 3 — «Порядок», 4 — «как число»
Поля окна:
«Сортировать» — что упорядочивать: свойство сообщения (по умолчанию
payload) или «последовательность сообщений».«Ключ» — по чему сравнивать: «значение элемента» (по умолчанию) или выражение; для последовательности — свойство сообщения.
«Порядок» — «восходящий» (по умолчанию) или «нисходящий».
«как число» — сравнивать как числа, а не как текст.
Для последовательности сообщений нужна msg.parts: её даёт split.
batch
Из потока одиночных сообщений делает последовательности — «пачки». Вход: 1, выход: 1.
Окно узла batch «Пачки по 10» (режим «Группировать по количеству сообщений»): 1 — «Режим», 2 — «Количество сообщений», 3 — «Совпадения»
Поля окна (на примере режима по умолчанию):
«Режим» — «Группировать по количеству сообщений» (по умолчанию), «Группировать по интервалу времени» или «Объединять последовательности».
«Количество сообщений» — размер пачки, по умолчанию 10.
«Совпадения» — сколько сообщений с конца пачки повторить в следующей, по умолчанию 0.
Ещё в окне: флажок «Allow msg.parts to also complete batch operation.» (подпись английская) — разрешить свойству msg.parts тоже завершать пачку.
Другие режимы:
«Группировать по интервалу времени»: «Интервал» в секундах, по умолчанию 10; «отправить пустое сообщение, когда сообщение не приходит».
«Объединять последовательности»: список «Темы» — для каждой темы своя пачка; нужны
msg.topicиmsg.parts.
Сообщение с msg.reset очищает накопленное.
Пример: список шагов сценария
Сценарий «Выключить всё» в «Демо-зале» хранится одним сообщением: change «Шаги: выключить всё» кладёт в payload массив из шести шагов. Шаги приходят на эту цепочку через link in «шаги». Устройствам они уходят по одному: split «По одному шагу» раскладывает список, delay «Шаг в 0,4 с» делает паузу между шагами, а change «Шаг → команда» превращает шаг в команду устройству.
Цепочка примера «Демо-зала»: link in «шаги» → split «По одному шагу» → delay «Шаг в 0,4 с» → change «Шаг → команда»
Повторите это на отдельной вкладке и посмотрите, как split и join возвращают данные в исходный вид:
Добавьте
injectиchange. Вchangeзадайтеpayloadзначением типа JSON с тремя элементами, например["a", "b", "c"].Добавьте
splitи оставьте поля по умолчанию. Соедините:inject→change→split.Добавьте
joinс режимом «автоматический» и соедините его соsplit.К выходам
splitиjoinподключите поdebug, нажмите «Развернуть», затем кнопку уinject.
Цепочка примера: inject «Запуск» → change «Список из трёх» → split «Разбить» → debug «После split» и → join «Собрать обратно» → debug «После join»
Что вы увидите: в отладке три отдельных сообщения со значениями a, b, c (выход split) и одно с массивом из трёх значений (выход join). Между split и join можно вставить delay в режиме ограничения скорости (как в «Демо-зале»; режимы delay — на странице «Функции»). Тогда шаги пойдут с паузой, а join отправит результат, когда придут все части. В режиме по умолчанию delay задерживает каждое сообщение на одно и то же время, поэтому все части уйдут вместе, без пауз между ними.
Частые ошибки:
joinничего не выдаёт. В автоматическом режиме он ждёт все части последовательности поmsg.parts: если сообщения пришли без неё (их отправили не изsplit) или часть не дошла, он будет ждать. В режиме «ручной» задайте «после ряда частей сообщения» или время ожидания.sortпоследовательности не упорядочивает: сообщения пришли безmsg.parts.
Анализаторы
Общее у всех анализаторов: узел сам выбирает направление. Пришла строка — получится объект, пришёл объект — получится строка. По умолчанию они работают со свойством payload. Вход: 1, выход: 1.
csv
Преобразует текст с разделителями (CSV) в объекты или массивы и обратно.
Окно узла csv «Разобрать CSV»: 1 — «Столбцы», 2 — «Разделитель», 3 — «первый ряд содержит имена столбцов», 4 — «разбирать числовые значения», 5 — «Выход» (блок «Опции CSV -> Объект»), 6 — «Новая строка» (блок «Опции Объект -> CSV»)
Поля окна:
«Столбцы» — имена столбцов через запятую, даже если разделитель другой.
«Разделитель» — запятая (по умолчанию), табуляция, пробел, точка с запятой, двоеточие, хэштег, другой.
«первый ряд содержит имена столбцов» — взять имена столбцов из первой строки.
«разбирать числовые значения» — числа становятся числами, а не текстом; включено по умолчанию.
«Выход» — «сообщение для каждой строки» (по умолчанию) или «одно сообщение [массив]».
«Новая строка» — при записи текста: «Windows (\r\n)» (по умолчанию), «Linux (\n)», «Mac (\r)».
Ещё в окне: «Пропускать первые» — сколько строк в начале отбросить (по умолчанию 0); второе поле «Выход» (в блоке «Опции Объект -> CSV») — отправлять ли ряд с именами столбцов при записи текста: «никогда не отправлять заголовки…» (по умолчанию), всегда, один раз до msg.reset.
html
Достаёт элементы из HTML-текста по селектору — например, значение из страницы состояния устройства.
Окно узла html «Достать из HTML»: 1 — «Селектор», 2 — «Выход», 3 — «в»
Поля окна:
«Селектор» — какие элементы взять; пусто — берётся
msg.select.«Выход» — «html-контент элементов» (по умолчанию), «только текстовый контент элементов», «объект любых атрибутов элементов».
«в» — куда положить результат; по умолчанию
msg.payload.
Ещё в окне — список, от которого зависит число сообщений: «одним сообщением [массив]» (по умолчанию) или «по сообщению для каждого элемента».
json
Превращает JSON-строку в объект и обратно. Нужен, когда устройство отвечает текстом, а дальше нужно брать из ответа отдельные поля.
Окно узла json «Разобрать»: 1 — «Действие», 2 — «Свойство», 3 — «Форматировать строку JSON»
Поля окна:
«Действие» — «Преобразовывать в любую сторону» (по умолчанию), «Всегда преобразовывать в строку JSON», «Всегда преобразовывать в объект JavaScript».
«Свойство» — что преобразовывать; по умолчанию
payload.«Форматировать строку JSON» — при записи строки: с отступами, для чтения человеком.
Пример: разобрать ответ устройства
Устройство прислало строку {"temp": 21, "unit": "C"}, а нужны отдельные поля. Цепочка inject → json → debug:
Цепочка примера: inject «Ответ устройства» → json «Разобрать» → debug «Объект»
inject: вpayloadзадайте тип «строка» и значение{"temp": 21, "unit": "C"}.json: поля по умолчанию. Соедините:inject→json→debug.Нажмите «Развернуть», затем кнопку у
inject.
Что вы увидите: в отладке вместо строки — объект с полями temp и unit; теперь change и switch могут брать msg.payload.temp. Если снова пропустить объект через json, получится строка.
Частая ошибка: пришла не строка, а число или логическое значение — узел их не преобразует и сообщает «Данные неподдерживаемого типа проигнорированы».
xml
Превращает XML-строку в объект и обратно.
Окно узла xml «Разобрать XML»: 1 — «Свойство», 2 — «Имя свойства для атрибутов XML-тега», 3 — «Имя свойства для текстового содержимого тега»
Поля окна:
«Свойство» — что преобразовывать; по умолчанию
payload.«Имя свойства для атрибутов XML-тега» — куда положить атрибуты; по умолчанию
$.«Имя свойства для текстового содержимого тега» — куда положить текст внутри тега; по умолчанию
_.
Например, <p class="tag">Hello World</p> станет объектом {p: {$: {class: "tag"}, _: "Hello World"}}.
yaml
Превращает YAML-строку в объект и обратно.
Окно узла yaml «Разобрать YAML»: 1 — «Свойство», 2 — «Имя»
Поля окна:
«Свойство» — что преобразовывать; по умолчанию
payload.«Имя» — подпись узла на холсте.
Все поля узлов — во встроенной справке: откройте вкладку «справка» боковой панели (значок книги) и выберите узел.