Последовательности и анализаторы

Устройства присылают данные «одним куском»: список шагов сценария, таблицу значений, ответ в виде текста с разделителями. А программа работает с одним сообщением за раз. Узлы этой страницы переводят данные из одной формы в другую.

  • Последовательности — split, join, sort, batch. Разбивают одно сообщение на несколько, собирают несколько в одно, упорядочивают и группируют.

  • Анализаторы — csv, html, json, xml, yaml. Превращают текст в объект, с которым умеют работать change и switch, и обратно.

В программе зала split раскладывает список шагов сценария по одному (блок «Шаги сценариев и подписки» на странице «Программа «Демо-зал»: обзор»), а анализаторы нужны, когда устройство отвечает текстом, а не готовыми значениями.

Как открыть окно узла и где найти справку — на странице «Узлы U-Logic». Здесь — только то, что нужно для выбора узла и первой настройки.

Последовательности

Когда split разбивает сообщение, он записывает в каждое сообщение msg.parts: номер части, сколько всего частей и вид исходных данных. По msg.parts узлы join и sort понимают, что сообщения — части одной последовательности.

split

Разбивает одно сообщение на несколько: строку — по разделителю, массив — по элементам или кускам заданной длины, объект — по парам «ключ — значение». Вход: 1, выход: 1.

../../_images/node-split.png

Окно узла split «Разбить»: 1 — «Разделить», 2 — «С помощью» в блоке «Строка / Буфер», 3 — «Фикс. длина» в блоке «Массив», 4 — «Отправлять сообщение для каждой пары ключ/значение»

Поля окна:

  1. «Разделить» — какое свойство сообщения разбирать; по умолчанию payload.

  2. Блок «Строка / Буфер», «С помощью» — чем разделена строка; по умолчанию перевод строки.

  3. Блок «Массив», «С помощью» → «Фикс. длина» — сколько элементов в одном сообщении; по умолчанию 1.

  4. Блок «Объект», «Отправлять сообщение для каждой пары ключ/значение» — по сообщению на каждую пару; рядом флажок «Копировать ключ в» — в какое свойство положить ключ пары.

join

Собирает последовательность сообщений в одно. Вход: 1, выход: 1. Режим выбирается в поле «Режим».

Режим

Что делает

«автоматический» (по умолчанию)

собирает обратно то, что разбил split, по msg.parts

«ручной»

вы сами выбираете, что и во что собирать, и когда отправить результат

«агрегация последовательности»

считает по последовательности одно значение — сумму, среднее и т. п.

../../_images/node-join.png

Окно узла join «Собрать вручную»: 1 — «Режим», 2 — «Объединить каждый», 3 — «чтобы создать», 4 — «соединяя с помощью», 5 — «после ряда частей сообщения», 6 — «по истечении времени с 1го сообщения»

Поля окна в режиме «ручной»:

  1. «Режим» — «ручной».

  2. «Объединить каждый» — какое свойство собирать или «полное сообщение».

  3. «чтобы создать» — результат: «строку», «массив», «буфер», «объект ключей/значений», «объединенный объект».

  4. «соединяя с помощью» — разделитель для строки.

  5. «после ряда частей сообщения» — отправить, когда накопилось столько частей.

  6. «по истечении времени с 1го сообщения» — отправить, если за столько секунд не набралось нужное число.

Ещё в режиме «ручной»: «используя значение … как ключ» — для объекта, чем подписать каждое значение (по умолчанию topic); флажок «Use existing msg.parts property» (подпись английская) — использовать уже имеющееся свойство msg.parts; «после сообщения с установленным свойством msg.complete» — отправить по сигналу.

Режим «агрегация последовательности» работает через выражения: «Агрегирующее выражение», «Начальное значение», «Исправляющее выражение», флажок «Выполнять в обратном порядке (от последнего к первому)». Среднее, например: агрегирующее $A+payload, начальное значение 0, исправляющее $A/$N.

Сообщение с msg.complete отправляет накопленное немедленно, с msg.reset — сбрасывает накопленное.

sort

Упорядочивает массив в одном сообщении или сами сообщения последовательности. Вход: 1, выход: 1.

../../_images/node-sort.png

Окно узла sort «Упорядочить»: 1 — «Сортировать», 2 — «Ключ», 3 — «Порядок», 4 — «как число»

Поля окна:

  1. «Сортировать» — что упорядочивать: свойство сообщения (по умолчанию payload) или «последовательность сообщений».

  2. «Ключ» — по чему сравнивать: «значение элемента» (по умолчанию) или выражение; для последовательности — свойство сообщения.

  3. «Порядок» — «восходящий» (по умолчанию) или «нисходящий».

  4. «как число» — сравнивать как числа, а не как текст.

Для последовательности сообщений нужна msg.parts: её даёт split.

batch

Из потока одиночных сообщений делает последовательности — «пачки». Вход: 1, выход: 1.

../../_images/node-batch.png

Окно узла batch «Пачки по 10» (режим «Группировать по количеству сообщений»): 1 — «Режим», 2 — «Количество сообщений», 3 — «Совпадения»

Поля окна (на примере режима по умолчанию):

  1. «Режим» — «Группировать по количеству сообщений» (по умолчанию), «Группировать по интервалу времени» или «Объединять последовательности».

  2. «Количество сообщений» — размер пачки, по умолчанию 10.

  3. «Совпадения» — сколько сообщений с конца пачки повторить в следующей, по умолчанию 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 «Шаг → команда» превращает шаг в команду устройству.

../../_images/flow-sequence-parser-demo-steps.png

Цепочка примера «Демо-зала»: link in «шаги» → split «По одному шагу» → delay «Шаг в 0,4 с» → change «Шаг → команда»

Повторите это на отдельной вкладке и посмотрите, как split и join возвращают данные в исходный вид:

  1. Добавьте inject и change. В change задайте payload значением типа JSON с тремя элементами, например ["a", "b", "c"].

  2. Добавьте split и оставьте поля по умолчанию. Соедините: inject → change → split.

  3. Добавьте join с режимом «автоматический» и соедините его со split.

  4. К выходам split и join подключите по debug, нажмите «Развернуть», затем кнопку у inject.

../../_images/flow-sequence-parser-split-join.png

Цепочка примера: 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) в объекты или массивы и обратно.

../../_images/node-csv.png

Окно узла csv «Разобрать CSV»: 1 — «Столбцы», 2 — «Разделитель», 3 — «первый ряд содержит имена столбцов», 4 — «разбирать числовые значения», 5 — «Выход» (блок «Опции CSV -> Объект»), 6 — «Новая строка» (блок «Опции Объект -> CSV»)

Поля окна:

  1. «Столбцы» — имена столбцов через запятую, даже если разделитель другой.

  2. «Разделитель» — запятая (по умолчанию), табуляция, пробел, точка с запятой, двоеточие, хэштег, другой.

  3. «первый ряд содержит имена столбцов» — взять имена столбцов из первой строки.

  4. «разбирать числовые значения» — числа становятся числами, а не текстом; включено по умолчанию.

  5. «Выход» — «сообщение для каждой строки» (по умолчанию) или «одно сообщение [массив]».

  6. «Новая строка» — при записи текста: «Windows (\r\n)» (по умолчанию), «Linux (\n)», «Mac (\r)».

Ещё в окне: «Пропускать первые» — сколько строк в начале отбросить (по умолчанию 0); второе поле «Выход» (в блоке «Опции Объект -> CSV») — отправлять ли ряд с именами столбцов при записи текста: «никогда не отправлять заголовки…» (по умолчанию), всегда, один раз до msg.reset.

html

Достаёт элементы из HTML-текста по селектору — например, значение из страницы состояния устройства.

../../_images/node-html.png

Окно узла html «Достать из HTML»: 1 — «Селектор», 2 — «Выход», 3 — «в»

Поля окна:

  1. «Селектор» — какие элементы взять; пусто — берётся msg.select.

  2. «Выход» — «html-контент элементов» (по умолчанию), «только текстовый контент элементов», «объект любых атрибутов элементов».

  3. «в» — куда положить результат; по умолчанию msg.payload.

Ещё в окне — список, от которого зависит число сообщений: «одним сообщением [массив]» (по умолчанию) или «по сообщению для каждого элемента».

json

Превращает JSON-строку в объект и обратно. Нужен, когда устройство отвечает текстом, а дальше нужно брать из ответа отдельные поля.

../../_images/node-json.png

Окно узла json «Разобрать»: 1 — «Действие», 2 — «Свойство», 3 — «Форматировать строку JSON»

Поля окна:

  1. «Действие» — «Преобразовывать в любую сторону» (по умолчанию), «Всегда преобразовывать в строку JSON», «Всегда преобразовывать в объект JavaScript».

  2. «Свойство» — что преобразовывать; по умолчанию payload.

  3. «Форматировать строку JSON» — при записи строки: с отступами, для чтения человеком.

Пример: разобрать ответ устройства

Устройство прислало строку {"temp": 21, "unit": "C"}, а нужны отдельные поля. Цепочка inject → json → debug:

../../_images/flow-sequence-parser-json.png

Цепочка примера: inject «Ответ устройства» → json «Разобрать» → debug «Объект»

  1. inject: в payload задайте тип «строка» и значение {"temp": 21, "unit": "C"}.

  2. json: поля по умолчанию. Соедините: inject → json → debug.

  3. Нажмите «Развернуть», затем кнопку у inject.

Что вы увидите: в отладке вместо строки — объект с полями temp и unit; теперь change и switch могут брать msg.payload.temp. Если снова пропустить объект через json, получится строка.

Частая ошибка: пришла не строка, а число или логическое значение — узел их не преобразует и сообщает «Данные неподдерживаемого типа проигнорированы».

xml

Превращает XML-строку в объект и обратно.

../../_images/node-xml.png

Окно узла xml «Разобрать XML»: 1 — «Свойство», 2 — «Имя свойства для атрибутов XML-тега», 3 — «Имя свойства для текстового содержимого тега»

Поля окна:

  1. «Свойство» — что преобразовывать; по умолчанию payload.

  2. «Имя свойства для атрибутов XML-тега» — куда положить атрибуты; по умолчанию $.

  3. «Имя свойства для текстового содержимого тега» — куда положить текст внутри тега; по умолчанию _.

Например, <p class="tag">Hello World</p> станет объектом {p: {$: {class: "tag"}, _: "Hello World"}}.

yaml

Превращает YAML-строку в объект и обратно.

../../_images/node-yaml.png

Окно узла yaml «Разобрать YAML»: 1 — «Свойство», 2 — «Имя»

Поля окна:

  1. «Свойство» — что преобразовывать; по умолчанию payload.

  2. «Имя» — подпись узла на холсте.

Все поля узлов — во встроенной справке: откройте вкладку «справка» боковой панели (значок книги) и выберите узел.