Русский
Русский
English
Статистика
Реклама

Node-red

HMI на основе Node-red и Scadavis.io

22.06.2020 20:08:04 | Автор: admin
В настоящее время в связи с ростом популярности концепции IoT и развитем сопутствующих технологий многие производители программного обеспечения для промышленной автоматизации используют это в своих продуктах. Доступ к SCADA-системам через web-интерефейс идея и реализация не новая. Еще лет 10 назад Citect scada позволяла это делать с помощью веб-браузера IE. Но идея IoT это не только доступ к ресурсам через web, а также возможность агрегировать различные сетевые проводные и беспроводные интерфейсы, совмещать различные уровни архитектуры: field, edge, cloud. В поисках возможных решений использования совместного open-source IoT edge платформы и SCADA системы я наткнулся на интересную связку платформы Node-red и SCADA-фреймворк scadavis.io

Scadavis.io


Начну описание scadavis с той информации, которая представлена в официальных источниках. На странице сайта scadavis.io указано: Powerful SCADA-like visualization tools, free-form synoptic graphics for real-time data display. A pure HTML5 solution, mobile friendly, framework agnostic, with no special server requirements needed. All your data and graphics stay on your servers and clients. (Мощные SCADA-подобные инструменты визуализации, сводные графики произвольной формы для отображения данных в реальном времени. Чистое решение HTML5, мобильное, независимое от фреймворка, без особых требований к серверу. Все ваши данные остаются на ваших серверах и клиентах.)

Далее представлены примеры страниц, которые можно спроектировать.

Затем идет информация о графическом редакторе построения экранных страниц SCADAvis.io Synoptic Editor, который можно преобрести в Microsoft Store.



Также на сайте показана таблица, в которой представлены планы использования Scadavis.io. Система имеет три плана: Basic, Pro, Enterprice. Основные отличия Basic плана: стоимость бесплатный, нет технической поддержки, исходный код расположен на SCADAvis.io.

Дисклеймер в данном абзаце я хочу показать файловую структуру проекта, которую мне было любопытно увидеть. Это никоим образом не презывает нарушать лицензионные права данной системы. Тем более список файлов лекго просматривается с помощью инструментов разработчика в консоли браузере.

На момент исследования набор файлов был следующий:
  • Основной скрипт synopticapi.js, в котором орпеделена функция основного объекта для работы с svg страницами находится на ресурсе scdavis.io.
  • На этом же ресурсе расположены скрипты symbol_webreflection.js, содержащий функции для работы с символами и их свойствами.
  • А также, насколько я понимаю, две проприетарные обфусцированные библиотеки o1.js и o2.js. Детально разбираться в них я не стал, так как особо времени и желания не было.
  • Фреймом для подключения библиотек и отображения визуализации служит synoptic.html файл, расположенный там же.

Подключение скрипта проекта, документация API и Synoptic Editor представлены на ресурсе scadavis.io/learn.html

Далее проект содержит ряд open source библиотек для работы с svg, с различной визуализацией и графиками:
  • Vega-min.js, vega-lite.js vega.github.io/vega С помощью Vega вы можете описать внешний вид и интерактивное поведение визуализации в формате JSON, а также создавать веб-представления с использованием Canvas или SVG.
  • snap.svg-min.js snapsvg.io SVG позволяет создавать интерактивную, независимую от разрешения векторную графику, которая будет отлично смотреться на экране любого размера.
  • jquery.min.js jquery.com jQuery это быстрая, небольшая и многофункциональная библиотека JavaScript.
  • d3.js d3js.org Сочетает мощные компоненты визуализации и управляемый данными подход к манипулированию DOM.
  • chroma.min.js gka.github.io/chroma.js Это небольшая библиотека JavaScript без внешних зависимостей для всех видов преобразования цветов и цветовых шкал.


Node-red


Node-red чрезвычайно популярная платформа. В просторах сети находится огромное количество статей и видеороликов по ней. На wikihandbk.com следующее определение Node-RED это инструмент визуального программирования для интернета вещей, позволяющий подключать друг к другу устройства, API и онлайн-сервисы. Сами авторы позиционируют Node-red как IoT edge платформу:

image

Установка данной платформы также не составляет труда на различный операционных системах и состоит из двух шагов:
  • Установка Node.js: nodejs.org
  • Установка Node-red: npm install -g --unsafe-perm node-red


В блоге Ricardo Olsen показаны шаги по интеграции системы Scadavis.io и платформы Node-red, а также представлены исходные файлы экранных страниц формата svg. Автор рекомендует использовать плагин для Node-red node-red-contrib-uibuilder, который позволяет создвать динамический веб-интерфейс, используя различные js-библиотеки, а также использовать веб-фреймворк VueJS.

image

Однако это не единственный способ, позволяющий построить пользовательский интерфейс на базе Node-red. Имеется достаточно популярный модуль, содержащий ряд нод для создания дашбордов в реальном времени от создателей самой платформы node-red-dashboard.

image

Виджет Template может содержать любые допустимые директивы html и Angular / Angular-Material.Этот узел можно использовать для создания динамического элемента пользовательского интерфейса, который изменяет свой внешний вид на основе входного сообщения и может отправлять сообщения обратно в Node-RED. С помощью ноды Template можно создать объект экранной страницы Scadavis, задать необходимые свойства, эмулировать поведение объекта и связать теги (переменные) экранной страницы с внешней средой

Создание SCADA-страницы с помощью Template виджета
<div id="office"></div> <script src="http://personeltest.ru/aways/scadavis.io/synoptic/synopticapi.js">var office = new scadavis({  container: "office", //Указание созданного ранее контейнера  iframeparams: 'frameborder="0" height="610" width="687"',  svgurl: "drawing.svg" //SVG страница});office.zoomTo(0.82); //Масштабирование изображения        //Эмуляция поведения тегов        setInterval(function () {office.storeValue("TAG2", 100 + Math.random() * 80);office.storeValue("TAG3", 120 + Math.random() * 60);office.storeValue("TAG4", 150 + Math.random() * 60);office.storeValue("TAG5", 110 + Math.random() * 30);office.storeValue("TAG6", 200 + Math.random() * 100);office.storeValue("TAG7", 130 + Math.random() * 40);office.updateValues();value = 130 + Math.random() * 40;}, 5000);</script>


В статье Node-RED Dashboard Template Examples (AngularJS) хорошо показаны примеры взаимодействия ноды Template с другими нодами, которые обмениваются сообщениями msg в контексте Angular Scope.
Допустим, мы ходим в качестве свойства объекта msg.topic передавать имя тега, а в качестве значения msg.payload. И при каждом событии изменения объекта msg обновляем объект SCADA с помощью методов storeValue и updateValues

 (function(scope) {        scope.$watch('msg', function(msg) {            if (msg)                 office.storeValue(msg.topic, msg.payload);                office.updateValues();            }        });        })(scope);    

Также используя пример с ресурса https://scadavis.io/learn.html и функционал ноды Template можно обрабатывать различные события SCADA-объекта и передавать их другим нодам, например так:
(function(scope) {substationsynoptic.on("click", function (event, tag) {    var v = substationsynoptic.getValue(tag);    if (event.currentTarget.id === "TAPUP")        substationsynoptic.setValue(tag, v + 1, false, false);    else        if (event.currentTarget.id === "TAPDOWN")            substationsynoptic.setValue(tag, v - 1, false, false);    if (event.currentTarget.id === "XCBROPEN")        substationsynoptic.setValue(tag, false, false, false);    else        if (event.currentTarget.id === "XCBRCLOSE")            substationsynoptic.setValue(tag, true, false, false);    if (v === true)        substationsynoptic.setValue(tag, false, false, false);    else        if (v === false)            substationsynoptic.setValue(tag, true, false, false);    scope.send( {'payload':{ 'tag': tag, 'value': v }} );});})(scope);


Графический редактор


Пару слов о графическом редакторе построения визуальных страниц для СКАДА-системы. Как уже упоминалось выше на офсайте предлагается приобрести SCADAvis.io Synoptic Editor. Одняко, опять же это не единственный возможный вариант. Как известно из самого описания редактор построен на базе Inkscape SVG Editor. Практически это Inkscape с плагином позволяющий назначать теги (переменные) и другие свойства различным графическим компонентам svg файла. Т.е. для простого отображения странице в контексте scadavis достаточно иметь svg файл, который можно редактировать в любом удобном редакторе. Но на этом не все. Находится большое сходство между редактором компании ECAVA INTEGRAXOR www.integraxor.com Inkscape 0.91 SAGE 4.16 распостраняющимся бесплатно (необходимо только зарегистрироваться на сайте) и Synoptic Editor. Как в итоге оказалось, действительно возможно создавать и редактировать svg файлы для Scadavis, используя Inkscape 0.91 SAGE 4.16. Разница наблюдается при проектировании скриптовой анимации и некоторых других специфических вещах, которые отсутствуют в Object properties редактора SAGE.

image

Согласно описанию SCADAvis.io Synoptic Editor, для того чтобы назначить цвет объектов по условию включения, необходимо в колонке Limit указать цифру 2:

  • 0 not initialized state
  • 1 false (off) state
  • 2 true (on) state
  • 129 false (off) state plus failed value
  • 130 true (on) state plus failed value

image

Плагин для работы с PLC Siemens


В арсенале Node-red имеется плагин для работы с PLC Siemens node-red-contrib-s7, основанный на фреймворке nodeS7. Плагин достаточно прост и интуитивно понятен в использовании. Он содержит три ноды: S7 in, S7 out, S7 control. В основном используются первые две ноды для чтения и записи тегов в PLC. Один ньюанс, который нужно учитывать при работе с S7-1200, описан в доке к плагину. Я с этим сталкнулся ранее, когда использовал библиотеку Snap7

image

Необходимы некоторые дополнительные шаги настройки в ПЛК:

Optimized block access должен быть отключен для тех DB блоков, к которым мы хотим получить доступ
image

В разделе Защита свойств ЦП установите флажок Разрешить доступ с помощью PUT / GET
image

Краткое заключение


Преимущества подхода использования Node-red в качестве Web-SCADA подобной системы очевидны. Node-red популярная open-source IoT платформа, имеющая огромное сообщество, множество различных плагинов и решений, возможность интегрировать различные протоколы. На ресурсе support.industry.siemens также есть мануал по использованию Node-red и обсуждение использования платформы. SCADA-фреймворк такой, как scadavis.io является хорошим примером интеграции хорошо известного среди специалистов подхода визуализации SCADA-систем и IoT edge платформы.
Подробнее..

Встраиваемый компьютер AntexGate. От прототипа к серийному производству

08.07.2020 14:22:16 | Автор: admin
image

Не так давно мы с командой разработали небольшой встраиваемый компьютер для решения задач IIoT и промышленной автоматизации. Первую статью о нашем устройстве можно посмотреть здесь.

Разрабатывать устройство решили на распространенном и оттестированном модуле Raspberry CM3+, что позволило нам создать компьютер с большими вычислительными способностями, огромным сообществом и простотой его использования. Под катом расскажу по этапам, от чего отталкивались и к чему пришли в итоге.

Муки выбора корпуса


Для устройств даже в промышленной сфере очень важен внешний вид устройства и законченность, таким образом начались долгие поиски корпуса, подходившие под наши требования по размеру. Хотелось максимально много уместить в одну коробку и самые минимальные параметры платы получались 10*10 см.

После того, как мы заказали несколько вариантов корпусов, пришлось большее количество из них выбросить, так как они подходили только для домашних поделок и продавать их людям в таком виде не представлялось возможным. Основным претендентом на тот момент стал алюминиевый корпус с пластиковыми крышками 10*10*5 см (рисунок 1).

image
Рисунок 1 Первый вариант корпуса

Получив этот корпус в руки, было принято решение остановиться на нем. В этот же момент разработка платы подходила к концу и уже можно было по чертежам предварительно оценить, каким образом обрабатывать торцы для выводных разъемов. Однако пластиковые крышки корпуса после механической обработки сделали вид не товарным и мы опять пришли к поделке, а не к законченному коммерческому продукту.

Глянец весь быстро поцарапался и в этой блестящей рамке отверстия выглядели очень асимметрично (рисунок 2). Ожидание и реальность, как говорится.

image
Рисунок 2 Пластиковые крышки корпуса

Однако отказываться от корпуса не пришлось, потому что у производителя был такой же, но с алюминиевыми торцами, мы быстро его заказали и удивились, насколько он идеально выглядел (рисунок 3). Торцы очень красивые, матовые и бонусом была дополнительная помехозащищенность. Стоил такой корпус уже немного дороже, но красота требует жертв.

image
Рисунок 3 Металлический корпус

Вторая попытка обработать торцы была гораздо удачнее. Технологию надписей мы выбрали путём гравировки (рисунок 4), однако были недостатки которые пришлось решать. Самое главное это то, что гравер (сверло) очень маленький и нежный, скорость нанесения гравировки достаточно низкая. Плюс само сверло часто ломается. Из-за всего этого сильно растёт цена из-за потребляемой электроэнергии и трудозатрат. Также внутрь гравировки набивается грязь и постепенно окисляется алюминий, делая надписи менее заметными.

image
Рисунок 4 Гравировка металлического корпус

Эту технологию пробовали менять на лазерную гравировку, но получилось некрасиво. Лазер выжигал краску некорректно, а надписи получались темными.

В итоге мы пришли к шелкографии с запеканием в печи (рисунок 5). Эта технология оказалась самой быстрой и очень крепкой. Всё свелось к тому, чтобы заказать единожды шаблон (фотовывод) и по нему делать партию до 50 штук в день.

image
Рисунок 5 Шелкография корпуса

Исправление недоработок


С корпусом закончили, а вот с платой оставались недоработки. Задумка нашего компьютера в том, чтобы любой пользователь мог спокойно установить дополнительное оборудование в устройство, открутив четыре болта на корпусе, как в свой ноутбук. Я думаю прошли те времена, когда на корпуса клеили наклеечки Не вскрывать, потеря гарантии.

Внутри корпуса есть периферия для прошивки вычислительного модуля, SIM-карта и многое другое. Однако была одна проблема с монтажом платы в корпус, а именно выводные светодиоды на ножках, которые постоянно гнулись у наших клиентов, взявших прототипы на тест (рисунок 6).

image
Рисунок 6 Выводные светодиоды на ножках

В этой связи пришлось поменять диоды на ножках на SMD-светодиоды, которые светят в бок и проблема с установкой платы в корпус решилась, больше ничего не гнулось (рисунок 7).

image
Рисунок 7 SMD-светодиоды

Индикация была глубоко внутри корпуса и чтобы увидеть свет приходилось смотреть под прямым углом на торец. В голову пришла идея световодов из полимерных прозрачных материалов (рисунок 8). Оставалось найти бюджетный, но эстетически красивый вариант. В голову пришел молочный плексиглас с прозрачностью 20% с толщиной листа 3 мм, в первой же фирме лазерной резки подобрали диаметр миниатюрного цилиндра, он был равен диаметру отверстия в корпусе. Особенность в том, что станок при лазерной резке дает небольшой скос нижнего диаметра на 0.1 мм и таким образом мы получили мешок миниатюрных усеченных конусов с нижним диаметром 2,9 мм и верхним 3 мм, а высота была 3 мм как и толщина торцов нашего корпуса. Вставляем конус в отверстие и запрессовка крепко загоняет эти световоды в отверстие, а небольшая капелька клея с обратной стороны фиксирует их намертво.

image
Рисунок 8 Световоды из плексигласа

Итак, устройство получило эстетичный вид при небольших вложениях в корпус, однако этот путь хорош на старте производства и уменьшение издержек планируется путем изготовления подобного корпуса при наращивании производства. Литье из пластика не рассматривается в виду дорогого запуска производства и низких экранирующих способностей по сравнению с металлом.

Итог


image

Спасибо за внимание! Надеемся, что мы вдохновим читателей на переработку Ваших личных проектов в более масштабное производство с коммерческими перспективами. В нашей великой стране на полочках у инициаторов пылятся действительно нужные вещи, которые могут заменять зарубежные производства.

В следующей статье мы расскажем Вам историю тестирования и тонкости настройки mPCIe 3G-модема Huawei и mPCIe LoraWan-модуля MikroTik.
Подробнее..

Встраиваемый компьютер AntexGate 3G-модем. Полезные настройки для более стабильного интернет-соединения

03.08.2020 14:12:05 | Автор: admin
image

В сфере промышленной автоматизации существует негласная парадигма, в которой многие производители промышленного оборудования делают контроллеры отдельно, а модемы отдельно. Как правило, каждое устройство помещается в свой корпус, имеет своё питание, большие габариты и высокую стоимость. Такой вариант разделения функционала имеет свои преимущества и недостатки, но, по нашему мнению, он ведет, скорее, к бльшей коммерциализации, чем обусловлен какими-то объективными причинами. Поэтому мы решили пойти немного по другому пути и сделали универсальное устройство, которое представляет из себя свободно программируемый контроллер на базе Linux с модемом в едином корпусе. Это нам позволило в своих проектах практически совсем отказаться от привычных всем щитов автоматизации и прийти к более мобильным решениям.

Под катом этой статьи мы поделимся с Вами тонкостями настройки модема и несколькими полезными скриптами для более стабильного 3G-соединения.

Предпосылки и решения


При разработке своего устройства мы руководствовались тем, что оно должно выходить в мобильный интернет, чтобы подключаться к облачным платформам. Было два пути: напаивать модем на плату, либо использовать mPCIe-разъемы. Мы остановились на втором варианте и предусмотрели сразу два mPCIe-разъема (рисунок 1), поскольку такой вариант нам показался более интересным и гибким. Ведь установка и замена модема занимает считанные секунды, плюс для пользователя появляется необходимая вариативность и он может использовать такие комбинации mPCIe-модулей, которые ему необходимы под конкретный проект. Кроме 3G-модема это может быть LoraWan или Wi-Fi модули. Плюс ко всему mPCIe-решения зарекомендовали себя как достаточно надежные и качественные.

image
Рисунок 1 mPCIe-разъемы

В качестве основного 3G-модуля для нашего устройства мы рассматривали следующие варианты:

  • MikroTik R11e-LTE6
  • Quectel EC25-E
  • YUGA CLM920 TE5
  • HUAWEI MU709s-2p

Однако после проведения тестов наиболее предпочтительным для нас в плане надежности и соотношения цена-качество оказался модем фирмы HUAWEI (рисунок 2). Мы взяли его за основу и устанавливаем опционально в наши устройства. Поэтому в дальнейшем мы будем рассматривать настройку и скрипты относительного модема этой модели. Возможно, этот скрипт будет универсальным и будет полезен для других модемов, однако стабильность работы с другими моделями не гарантируется. Для Rasbian Buster и HUAWEI MU709s-2p всё работает отлично.

image
Рисунок 2 Модем HUAWEI MU709s-2p, установленный на плату устройства

Использование скрипта для перезагрузки 3G-модема


Для более устойчивой и безотказной работы мы написали скрипт, который будет пинговать заданный IP-адрес, а если же определенное в настройках количество пингов не прошло, то GSM-модем перезагрузится, тем самым восстанавливая зависшее сетевое соединение. Стоит отметить, что модем определяется в системе как сетевая карта lan1.

Архив со всеми необходимыми файлами можно скачать по этой ссылке. Также текст самих скриптов представим ниже.

Файл check_inet.sh необходим для проверки наличия интернет соединения. Если заданный IP-адрес не пингуется, то мы дергаем 19 ногу и перезапускаем модем по питанию. Код из себя представляет следующий вид:
#!/bin/bash#count=0;#echo "Start script"#echo 19 > '/sys/class/gpio/export'while [ true ]; do# sleep 30. /home/pi/igate.conf#echo $usb_port#echo 'AT^NDISDUP=1,1,''"'$apn'"''\r\n' #echo 'AT^NDISDUP=1,1,"internet.mts.ru"\r\n' flag=0for ((i = 1; i <= $ping_count; i++)); do#for i in {1..$ping_count}; do #делаем 5 пингов до сервера#ping -I eth1 -c 1 8.8.8.8 > /dev/null || flag=$(($flag+1))ping -I $interface -c 1 $ping_ip || flag=$(($flag+1))sleep 1doneif [ "$flag" -ge "$ping_error" ]; then #если потерь пакетов больше 3х#echo "рестарт модема - начало"#count=$((count+1))#echo $count#рестарт модемаsudo ifconfig eth1 downecho 19 > '/sys/class/gpio/export'echo out > '/sys/class/gpio/gpio19/direction'echo 0 > '/sys/class/gpio/gpio19/value'sleep 1echo 1 > '/sys/class/gpio/gpio19/value'sleep 15sudo ifconfig eth1 upsleep 1#echo -en 'AT^NDISDUP=1,1,"internet.mts.ru"\r\n' > /dev/ttyUSB3#АТ команда для записи настроек точки доступа APNecho -en 'AT^NDISDUP=1,1,''"'$apn'"''\r\n' > $usb_port#echo "рестарт модема - конец"fisleep $timeoutdone 

Файл start_inet.sh запускает check_inet.sh после перезагрузки устройства:
#!/bin/bash### BEGIN INIT INFO# Provides:          start_inet# Required-Start:    $remote_fs $syslog# Required-Stop:     $remote_fs $syslog# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: Example initscript# Description:       This service is used to manage a servo### END INIT INFOcase "$1" in     start)        echo "Starting check_inet"        sudo /home/pi/check_inet.sh > /dev/null 2>&1 &        #/home/pi/check_inet.sh        ;;    stop)        echo "Stopping check_inet"        #killall servod        sudo kill -USR1 $(ps ax | grep 'check_inet' | awk '{print $1}')        ;;    *)        echo "Usage: /etc/init.d/check_inet start|stop"        exit 1        ;;esacexit 0

Также в архиве находится файл конфигурации igate.conf

Последовательность настройки:
1. Добавьте правило соответствия физического подключения COM-порта модема к концентратору USB. Для этого поправьте файл по следующему пути:
sudo nano /etc/udev/rules.d/99-com.rules

2. Добавьте в файл следующую строку:
KERNEL==ttyUSB*, KERNELS==1-1.5:2.4, SYMLINK+=GSM

3. Сохраните правила и перезагрузите устройство. Теперь порт Вашего модема будут определять по удобному псевдониму /dev/GSM;
4. Скачайте архив по предложенной выше ссылки, либо самостоятельно создайте файлы check_inet.sh, start_inet.sh и igate.conf;
5. Скопируйте файл check_inet.sh в папку:
/home/pi/

6. Сделайте файл check_inet.sh исполняемым:
sudo chmod +x /home/pi/check_inet.sh

7. Скопируйте файл start_inet.sh в папку:
/etc/init.d/

8. Сделайте файл start_inet.sh исполняемым:
sudo chmod +x /etc/init.d/start_inet.sh

9. Обновите конфигурацию автозагрузки выполнив команду:
sudo update-rc.d start_inet.sh defaults

10. Скопируйте файл igate.conf в папку:
/home/pi/

11. Настройте файл конфигурации. Ниже представлен файл конфигурации с комментариями:
#ip-адрес пинга. Скрипт будет пытаться пинговать этот ip-адрес, если определенное в параметре [ping_error] количество пингов не прошло, скрипт будет перезагружать GSM-модем, тем самым восстанавливая зависшее сетевое соединение.ping_ip=8.8.8.8#точка доступа APN. Это адрес точки доступа Вашего интернет-провайдера, он выдается вместе с сим-картой.apn=internet.mts.ru#период проверки соединения 3G (период пинга). Период выполнения скрипта. Каждые 30 секунд будет осуществляться проверка пингов.timeout=30#количество пингов. Общее количество пингов.ping_count=5#количество неуспешных пингов для рестарта модема. Количество неуспешных пингов, после которых необходимо выполнять перезагрузку модема. Не может быть больше чем [ping_count]. Процент потерянных пакетов нужно подбирать индивидуально в зависимости от качества покрытия сети.ping_error=3#LAN интерфейс модема. Сетевой интерфейс модема, обычно на устройстве AntexGate определяется как [eth1], посмотреть название можно выполнив команду ifconfiginterface=eth1#USB порт модема. Физический USB порт к которому подключена сетевая карта, обычно на устройстве AntexGate определяется как [ttyUSB4]usb_port=/dev/GSM


Управление скриптом


Запуск в фоновом режиме файла скрипта check_inet.sh:
/etc/init.d/start_inet.sh start

Остановить check_inet.sh:
/etc/init.d/start_inet.sh stop

Скрипт также автоматически запускается после перезагрузки устройства.

Варианты применения устройства


Рассмотрим основные задачи, под которые можно использовать устройство:
  1. Контроллер с выходом в интернет для передачи данных в облако;
  2. 3G-роутер для задач в поле;
  3. Контроллер для умного дома с резервирующим каналом 3G. То есть можно использовать LAN-порт как основной канал связи, а 3G в качестве резервного, чтобы всегда был доступ к устройству;
  4. Базовая станция LoRaWAN, то есть опрос устройств по LoRaWAN и передача данных в облако через сеть 3G или LTE;
  5. Устройство для мониторинга транспорта (подключение по CAN и стыковка с различными сервисами)

На самом деле, вариантов применения такого устройства может быть очень много и несомненным его плюсом является законченность, универсальность и мобильность. Одно устройство может заменить привычный шкаф автоматизации и стать незаменимым решением в Ваших проектах.
Подробнее..

Схема моего умного дома на основе ESP8266

21.02.2021 18:04:28 | Автор: admin

Захотелось мне сделать свой дом умным. И чтобы он был дешевым, простым и надежным. Как оказалось, это сделать возможно. Но... готовых умных домов я не смог найти. Те, что имелись на рынке, либо дорогие, либо нефункциональные, либо невнятные и т.д. и т.п. Вспомнил я про Arduino. И оказалось на нем можно это сделать (точнее не на нем, а на очень похожем на него контроллере ESP8266). Правда это уже будет целым хобби. Просто взять купить и поставить не получится. Нужно искать, собирать, паять, соединять и конечно же программировать. Ок, поехали!

Это первая моя статья на тему моего умного дома. В дальнейшем я буду выкладывать следующие статьи о том, что я конкретно сделал и как.

Требования

Итак, требования к умному дому, как хобби, такие:

  1. Обойтись по возможности без пайки.

  2. Не вдаваться глубоко в радиоэлектронику.

  3. Все задачи решать в основном программированием.

  4. Языки программирования C++ и JavaScript.

  5. В качестве связи устройств использовать Wi-Fi, 1-Wire, I2C.

  6. Устройства должны быть дешевле чем Xiaomi.

В общем, если заметили, требования как у программиста. Если можно, то все решать программированием. Автор все-таки программист, а не писатель и тем более не радиоэлектронщик.

Устройства

После поисков был найден микроконтроллер ESP8266. Он программируется легко как Arduino. У него есть Wi-Fi на борту. Цена начинается от 80 рублей за штуку. В общем соответствует требованиям полностью. Я бы взял Arduino, но у него, к сожалению, нет на борту Wi-Fi. Единственное что смущает это энергопотребление. Но такого требования как батарейки у меня нет. Пока нет.

Контроллер ESP8266 оказался таким дешевым, что можно на каждый датчик или исполнительное устройство ставить по такому контроллеру. Можно ли так делать или нет я пока не знаю. Это я буду проверять уже на практике. Физических препятствий этому нету.

Самый дешевый вариант ESP8266, называется ESP01Самый дешевый вариант ESP8266, называется ESP01

Так как ESP8266 является весьма мощным контроллером, то к нему можно подсоединять несколько датчиков и исполнительных устройств. Поэтому можно сделать гибридную сеть (Wi-Fi + провода). Несколько ESP8266 соединяются с сервером по Wi-Fi. А на каждой ESP8266 могут быть несколько устройств, подсоединенными по 1-Wire или I2C. Например, сеть температурных датчиков.

ESP8266 можно программировать самостоятельно. Как Arduino. Я так и хотел сначала сделать, но нашел такое явление как готовые и универсальные прошивки для ESP8266. Их довольно много. Я выбрал под свои требования ESP Easy. Ее возможностей хватает для всего что мне нужно.

Сервер

Кроме ESP8266 в схеме умного дома будет сервер. Ну куда ж без него. Его можно написать полностью самому. Но ознакомившись с темой умного дома я нашел такие универсальные средства как: MQTT-брокер, средство визуального программирования Low Code Node Red и мост Homebridge. Последнее я припас для соединения своего умного дома с Apple HomeKit + Siri. Эти средства оказались настолько популярными, универсальными, простыми, надежными, что я решил на их основе и строить сервер.

Куда же размещать эти программные сервера? Можно просто на ноут кинуть или на что-то более специализированное. Можно также в облако. Особых требований у меня пока нет для выбора физического сервера, потому остановился на том, что больше все понравилось, а именно Малина. Итак, для сервера выбрал Raspberry Pi Zero W, который отвечает всем требованиям: цена 1500 рублей, wi-fi на борту, простота в программировании. И еще можно его запихнуть в DIN-корпус для установки в электрощиток.

Резюме

В итоге получилась такая схема. В электрощитке будет находиться Raspberry Pi Zero W для хранения логики работы моего дома. Без него умный дом работать не будет. Поэтому запитываться он будет от сети и от резервной аккумуляторной батареи.

Каждое устройство создается на основе ESP8266. Запитываться будет либо от сети либо от батарейки. Если батарейки не будет хватать хотя бы на полгода, то придется подумать как это решить (тут мне подсказывают, что ZigBee позволяет создавать более экономные устройства, чем Wi-Fi, но ZigBee более сложный, чем Wi-Fi).

В качестве голового помощника выбраны Siri и Алиса. Siri очень легко подключается. Алиса чуть сложнее. Остальные голосовые помощники отпали, т.к. информации по ним практически нет. Да и на айфоне кроме Siri и Алисы никого нету.

Что дальше?

Дальше я расскажу как собрал первое тестовое устройство. Имитация лампы освещения и кнопки. В качестве лампы будет обычный светодиод. Кнопка просто кнопка. И еще в устройстве будут два датчика DHT11 (влажность) и BMP085 (давление и температура). Все это будет подключено к Homekit и Алисе.

Подробнее..

Мой умный дом на ESP8266, часть 3

07.03.2021 16:16:59 | Автор: admin

Предыдущая статья:Мой умный дом на ESP8266, часть 2

Прошивка ESP8266

Прошивать мы будем прошивкойESP Easy. Эта прошивка простая. Там интуитивно понятно что и как настраивать. Сразу видно где прописать связь с MQTT-брокером. И видно где размещать подключаемые к микроконтроллеру устройства. В настройках устройств легко найти галочку для связи с MQTT-брокером посылать сигналы.

Как именно прошивать я рассказывать не буду. Этого материала полно в интернете. Тем более что разные модификации ESP8266 можно прошивать по-разному. Найдите гайд по прошивке именно вашего устройства и прошейте ESP Easy.

На страницепоследнего релиза ESP Easyскачайте файл espeasy_esp82xx_mega-20210223.zip:

Релиз ESP EasyРелиз ESP Easy

В файле есть программа прошивальщик. При ее запуске можно выбрать конкретную прошивку, например normal и COM-порт, на котором находится в вашем устройстве. И после этого нажмите кнопку Прошить. В общем подробности этого процесса вы найдете в интернете. Если не получится, то обращайтесь ко мне.

После прошивки и настройки Wi-Fi на устройстве вы сможете заходить через браузер в интерфейс прошивки прямо набрав адрес устройства в браузере. Начнем с I2C.

Настройка I2C

Для начала настроим протокол I2C. По умолчанию для подключения устройств к контроллеру по этой шине используются пины 4 и 5. Нам же нужны другие пины. Заходим в раздел Hardware и меняем эти настройки:

Указание пинов для I2C-протоколаУказание пинов для I2C-протокола

Настройка связи с MQTT-брокером

В разделе Controllers прошивки ESP Easy можно прописать связь микроконтроллера ESP8266 с тремя серверами. Мы пока добавим связь с одним сервером, а именно с нашим MQTT-брокером. По большому счету одного этого брокера достаточно практически для всех нужд умного дома.

Связь с MQTT-брокеромСвязь с MQTT-брокером

Выбираем протоколHome Assistent. Почему именно его? Об этом написано в статьеТермометр на ESP8266 с прошивкой ESP Easyна сайте веб-сервиса WQTT.ru. А так протокол выбирается в соответствии с выбранным сервером.

Далее прописываем адрес и порт нашего брокера, логин и пароль доступа. И указываем такие флажки как Will Retain и Enabled. Флажок Will Retain позволит брокеру запоминать последние опубликованные сообщения и таким образом состояние вашего умного дома будет хранится именно на брокере.

Настройка важных флажковНастройка важных флажков

Настройка кнопки

Переходим в раздел Devices прошивки ESP Easy. И размещаем информацию о кнопке:

Кнопка будет подключена к пину GPIO4Кнопка будет подключена к пину GPIO4

Состояние кнопки мы не будем использовать. Нам важен лишь факт ее нажатия. А вот включить или выключить лампу будем решать на основании ее текущего состояния, которое хранится в MQTT-брокере. Эта логика будет позже прописана в Node RED.

Датчик атмосферного давления BMP085

В том же разделе добавляем датчик давления:

Напомню, этот датчик связан с микроконтроллером по шине I2C, поэтому пины не нужно указывать. Они выше были указаны. В настройках мы укажем интервал отправки значений датчика 200 сек. И поставим галочку напротив Send to Controller, что заставит микроконтроллер отправлять значения датчиков на контроллер номер 1 (см. черный кружочек с числом).

Для значения Pressure добавим формулу пересчета из гигапаскалей в мм.рт.ст.

Датчик влажности DHT11

Датчик влажности будет размещен на пине GPIO14. Настройки для датчика тривиальные:

Настройки датчика влажности DHT11Настройки датчика влажности DHT11

Проверка

Итого страница Controllers должна выглядеть так:

КонтроллерыКонтроллеры

А страница Devices так:

В колонке Values будут видны считываемые показания датчиков.

Если все сделано правильно, то на сервере WQTT.ru мы увидим, что значения уже передаются:

В следующей статье настроим последний компонент Node RED.

Ответы на вопросы

Проблема в вашей схеме в том, что без интернета весь ваш умный дом превратится в тыкву

Вижу метеостанцию на Node-Red. Умный дом не вижу

Не совсем вопрос, но стоит сделать замечание. Пока нет цели сделать правильно, надежно, профессионально. Пока цель простая - стартовать. Есть простые требования (в первой статье). И данная простая схема (действительно похожа на простую метеостанцию с кнопкой) как раз удовлетворяет всем требованиям и дает возможность стартовать.

Подскажите, а не рассматривали другие прошивки?

Рассматривал. Под требования не подходят. Я не отрицаю их использование, но они более сложные для понимания. ESP Easy в этом плане просто как пенек. Даже достаточно взглянуть на его веб-интерфейс и мне, далекому от МК-темы, сразу понятно что к чему и как настраивать.

датчики DHT11 просто отвратительны

Датчик DHT11 взят для примера. Тут главное что требования выполнены. А уж какие датчики подключать - дело вкуса.

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

В комментариях отписался человек, который посадил на свой роутер 11 контроллеров ESP. И все работает.

Подробнее..

Recovery mode Мой умный дом на ESP8266, часть 2

26.02.2021 12:14:08 | Автор: admin

Начало этого цикла статей находится по адресу:http://personeltest.ru/aways/habr.com/ru/post/543536/

Продолжаю свои изыскания в плане создания базы, на основе которой без пайки можно быстро создавать умный дом. Как я уже говорил, эта база рассчитана на обычного прикладного программиста, например фронт-разработчика, который не хочет углубляться в дебри радиоэлектроники и не хочет паять (ну может по минимуму), потому что нет на это времени. Но хочет создавать свои устройства, которые легко можно будет подключать к своему серверу и все вопросы решать способом, который ему хорошо знаком по роду своей деятельности, то есть программированием, причем на PC.

Итак, для первой версии этой базы выбран чип ESP8266, на основе которого будет строиться весь умный дом.

ESP8266

Микроконтроллер ESP8266 самодостаточен, легко программируется как Arduino (то есть это С++ и среда Arduino IDE), имеет на борту Wi-Fi, компактный и есть множество модификаций под разные нужды. Также есть его развитие, это ESP32, который более мощный. В общем идеальный контроллер. Недостаток лишь в напряжении питания (не пять вольт, а 3.3 вольта).

К контроллеру ESP8266 можно по проводам (причем довольно длинным, несколько метров) можно подключать разные датчики и исполнительные устройства по таким протоколам как 1-Wire, I2C. Почему именно эти протоколы? Потому что они очень простые и популярные (спасибо Arduino).

То есть, датчик или устройство по проводу подключается к ESP8266, который в свою очередь подключается по Wi-Fi к вашему серверу. Сервер можно писать на любом языке, например на платформе NodeJS. Но желательно использовать готовые сервера, о которых я расскажу позже. Ваш сервер позволит настроить любую логику работы умного дома.

Например можно в электрощитке разместить ESP8266 и реле. На это реле повесить освещение. А на стене повесить ESP8266 и кнопку. При помощи кнопки включать/выключать освещение. Обработчик нажатия на кнопку находится на сервере. Еще можно несколько датчиков температуры (улица, комнаты)по проводам подключить к ESP8266. На входную водопроводную трубу можно разместить датчик расхода воды и подключить к еще одному ESP8266. Контроллер стоит от 80 рублей, так что вешать их можно до упора (где этот упор не ясно, наверное зависит от роутера и помех на частоте 2.4 ГГц).

Компоненты умного дома

Теперь я хотел бы подробнее остановится на компонентной схеме умного дома. Все компоненты уместились в следующей схеме:

Компоненты умного домаКомпоненты умного дома

Слева-направо: сначала идет ваше устройство на ESP8266, далее это прошивка ESP Easy (ее ставим на ESP8266), прошивку подключаем к MQTT-брокеру (например WQTT.ru или свой брокер на своем сервере), веб-сервис WQTT.ru уже имеет подключение к Алисе (на своем брокере это подключение придется сделать самостоятельно, что в общем несложно, потому что это наша привычная работа программиста), далее сервер логики Node RED, который подключен к MQTT-брокеру и управляет всем умным домом. И в конце можно поставить Homebridge для связи умного дома с Homekit.

Как вы наверное догадались, homebridge с голосовыми помощниками не обязательные компоненты. Главное это MQTT-брокер и Node RED. Эти два сервера вам обеспечат практический полный функционал и доступ к настройке любой логики.

Думаю общая картинка умного дома уже появилась и можно переходить к самим компонентам в отдельности. В этой статье рассмотрим MQTT-брокер и само устройство. В следующих статьях будем рассматривать настройку прошивки ESP Easy и Node RED. Этого будет достаточно, чтобы запустить простейший вариант умного дома.

В качестве устройства у нас будет светодиод, который встроен в ESP8266 и сидит на пине GPIO2. Этот светодиод будет имитировать освещение в гостиной например. Также подключим кнопку, которая будет включать этот светодиод. И еще в нашем устройстве будут два датчика: DHT11 и BMP085 (влажности и барометр с термометром).

В логику (которая будет хранится в Node RED) заложим управление кнопкой и светодиодом, оповещение по телеграму о резком похолодании в комнате и вывод значений датчиков в Homekit и Алису.

Тестовое устройство

Тестовое устройство я собрал из того что было под рукой. И выглядит оно следующим образом:

Тестовое устройствоТестовое устройство

У меня был модуль Troyka Wi-Fi (это ESP8266 в модификации ESP-12F)от магазина Амперка. Но можно использовать любой вариант ESP8266. Датчик DHT11 подключен к одному из пинов контроллера, а датчик BMP085 подключен к пинам, которые будут работать в режиме I2C-протокола (выбор пинов настраивается в прошивке ESP Easy).

То же устройство, но в виде принципиальной схемы:

Принципиальная схема (на детали U3 я показал встроенный светодиод)Принципиальная схема (на детали U3 я показал встроенный светодиод)

Принципиальная схема более удобная. Во первых, легко рисуется, а во вторых, все подписано. В схеме выше на картинках часто бывает что пины не подписаны. А подписать их весьма муторным делом оказалось.

Устройство это собирается легко как Arduino, только вместо Arduino вы будете использовать ESP8266. Оно мощнее, но питание 3.3 вольта, о чем нельзя забывать. Добавите 5 вольт сожжете его. Контроллер можно прошивать своими скриптами. Они тоже весьма простые и из них можно будет подключаться к HTTP-серверам и MQTT-брокерам. Но этот вариант мы рассмотрим позже, сейчас я предлагаю рассмотреть вариант готовой прошивки.

Итак устройство собрано. Как прошивать рассмотрим в следующей статье. Теперь перейдем в MQTT-брокеру.

MQTT-брокер

Свой MQTT-брокер пока затевать не будем, а воспользуемся готовым. Веб-сервис WQTT.ru предоставляет простой MQTT-брокер по цене 200 рублей за полгода (первый месяц бесплатно, что вполне нам достаточно для экспериментов). Заходим на сайт этого сервисаhttps://www.wqtt.ru/и регистрируемся. После регистрации мы молучим адрес брокера, номер порта, логин и пароль. Их мы позже пропишем в прошивке микроконтроллера и в Node RED. Все, брокером можно пользоваться сразу. Но, если вы хотите подключить Алису, то на WQTT нужно описать датчики и устройства. Это сделать легко, потому описывать не буду. У вас в итоге должна получится такая таблица:

Таблица устройств и датчиков на wqtt.ruТаблица устройств и датчиков на wqtt.ru

Единственно что нужно сделать это прописать так называемые топики. Сделайте их такими как на скриншоте, т.к. далее мы их будем использовать.

Думаю настало время рассказать, а что же это такое MQTT-брокер и какую роль он играет.

Во-первых, это программа для обмена сообщениями между устройствами вашего умного дома. Сообщение это просто маленькая текстовая строка. В ней можно передать например состояние кнопки или значение какого-либо датчика.

Можно сделать так, чтобы это сообщение (точнее последнее сообщение) сохранилось на брокере. И таким образом состояние вашего умного дома будет храниться в брокере. Если вы знаете что такое MVC, то брокер это M, Node RED это C, а ваш смартфон это V. Если не знаете, то пропустите это.

Во-вторых, кроме отправки сообщения можно на них подписываться. Все, кто подписался, будут гарантированно получать сообщения из того или иного топика. Например у нас есть топик ESP_Easy/BMP085/Temperature. Наше устройство (которое мы назвали ESP_Easy) регулярно (например каждые 5 минут) отправляет на этот топик значение температуры из датчика BMP085. А в Node RED мы создадим подписчика на этот топик и будем принимать эти сообщения. В самом подписчике мы опишем что мы хотим с этой температурой делать, например отобразить на экране смартфона в Homekit.

В итоге, MQTT-брокер это сердце нашего умного дома. Он связывает все устройства и хранит состояние умного дома. Если его сделать доступным из интернета, то вашим умным домом можно управлять откуда угодно.

Резюме

Устройство у нас собрано. Пока без прошивки. Брокер настроен. Далее мы подключим Node RED, прошьем контроллер и все это соединим воедино.

Подробнее..

Знакомство с Node-RED и потоковое программирование в Yandex IoT Core

28.09.2020 14:11:21 | Автор: admin


В этой статье я хочу разобрать один из самых популярных опенсорс-инструментов, Node-RED, с точки зрения создания простых прототипов приложений с минимумом программирования. Проверим гипотезу о простоте и удобстве таких средств, а также рассмотрим взаимодействие Node-RED с облачной платформой на примере Yandex.Cloud.


Написано уже немало статей на тему того, как средства визуального программирования помогают строить приложения интернета вещей, управлять устройствами и автоматизировать дом (управление освещением, автоматизация квартиры часть 1 и часть 2). Но мало кто упоминает о другом полезном свойстве подобных иструментов. Это быстрое прототипирование, то есть эмуляция самих устройств без использования микроконтроллеров и визуализация результатов их работы без глубоких познаний в программировании или веб-дизайне.


Есть ряд ограничений, связанных с хранением данных клиентов в облачных дата-центрах других государств. Поэтому у пользователей зарубежных ресурсов все чаще появляется устойчивое желание использовать гибридные подходы, применять локализованные облачные сервисы, расположенные на территории России. В таких случаях для реализации сценариев интернета вещей вполне оправдано объединение открытых технологий IBM с готовым облачным сервисом Яндекса.


Кратко о Node-RED, его истории, создателях и сообществе


Как гласит первоисточник, Node-RED это инструмент потокового программирования, первоначально разработанный командой IBM Emerging Technology Services и в настоящее время являющийся частью JS Foundation.


В качестве ключевой составляющей Node-RED выступает парадигма потокового программирования, которое было изобретено в 70-х Джеем Полом Моррисоном. Потоковое программирование это способ описания поведения приложения в виде сети черных ящиков или узлов, как они называются в Node-RED. Каждый узел имеет четкую цель к нему поступают некоторые данные, он что-то делает с этими данными, а затем передает их на следующий узел. Сеть отвечает за поток данных между узлами.


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


Node-RED работает в среде исполнения Node.js, а для создания или редактирования потока (Flow) используется браузер. В браузере вы можете создавать свое приложение путем перетаскивания необходимых узлов (Node) из палитры в рабочую область и соединять их вместе. Одним кликом по кнопке Deploy приложение разворачивается в среде исполнения и запускается.


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


Node-RED начал свою жизнь в начале 2013 года как совместный проект Ника О'Лири и Дэйва Конвея-Джонса из группы IBM Emerging Technology Services.


Проект стартовал как подтверждение концепции визуализации и манипулирования мэппингами между топиками сообщений в протоколе Message Queuing Telemetry Transport (MQTT). Node-RED быстро стал более универсальным инструментом, который можно было легко расширять в любом направлении.


Исходный код проекта был открыт в сентябре 2013 года. С тех пор он разрабатывался в открытом виде, кульминацией развития стало признание Node-RED одним из фундаментальных проектов JS Foundation в октябре 2016 года.


Почему проект называется Node-RED?


Со слов авторов:

Название было веселой игрой слов, звучащих как Code Red.
Это название приклеилось к проекту и стало существенным шагом вперед по сравнению с тем, как он назывался в первые несколько дней.
Часть Node отражает суть модели потокового программирования (поток/узел) и основную среду выполнения Node.JS.
Окончательного решения о том, что же означает часть RED, принято так и не было.
Одно из предложений Rapid Event Developer (быстрый разработчик событий), но мы никогда не чувствовали себя обязанными что-либо формализовать.
Мы придерживаемся названия Node-RED."

Node-RED предоставляется по лицензии Apache 2.0. Важно понимать и осознавать условия лицензии по этой ссылке есть краткая выдержка с основными свойствами.


Лицензия разрешает коммерческое использование, но при этом накладывает и ряд ограничений. Вот основные из них: при использовании торговой марки Node-RED (принадлежащей OpenJS Foundation) нельзя ее искажать; кроме того, есть ограничение ответственности (Liability/Warranty) участники проекта не могут быть привлечены к ответственности в случае причинения убытков в процессе некорректного использования их продукта.


Постановка задачи интеграция Node-RED c Yandex IoT Core


Сначала хочу отметить: вся эта затея сугубо самообразовательная и подкреплена только непреодолимой тягой энтузиастов к познанинию нового. Например, хотелось изучить возможности облачных сред и сервисов Яндекса, которые могут быть безвозмездно получены для тестирования своих гениальных идей. Ну а чтобы была польза для дела, было решено посмотреть, насколько совместимы реализованные в проекте Node-RED узлы (из коробки на уровне MQTT) с интерфейсами сервиса IoT Core.


Задача выглядит просто:


  • Развернуть и настроить виртуальную машину в облаке
  • Установить и запустить в нужной конфигурации Node-RED
  • Создать и должным образом настроить сервис IoT Core
  • Эмулировать IoT-устройство в Node-RED с набором параметров
  • Подключить созданное устройство к облачной IoT-платформе
  • Отправлять сообщения в облако и получать корректные ответы
  • Визуализировать результаты в виде прототипа приложения

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


Создание облачной среды и установка Node-RED


Создание ВМ


Для создания виртуальной машины, на которой мы далее запустим Node-RED, зайдем в Yandex.Cloud и перейдем в Консоль. В сервисе Compute Cloud нажимаем Создать ВМ.


Задаем машине любое разрешенное имя и в качестве операционной системы выбираем CentOS. Для запуска Node-RED подходит любая из приведенных ОС, но в статье мы рассмотрим порядок работы только с CentOS.


Выбор ОС


Выполнение тестового сценария не требует больших ресурсов, поэтому выставляем все на минимум. Этот ход также позволит сэкономить ресурсы пробного периода, если вы решили развернуть Node-RED только для ознакомления.


Выделяемые ресурсы


Работа с ВМ будет осуществляться через SSH, поэтому пусть у машины будет автоматически выделенный публичный адрес.


Для подключения к машине по SSH необходимо указать публичный ключ. Сгенерируем SSH-ключи командой ssh-keygen -t rsa -b 2048 в терминале, потребуется придумать ключевую фразу.


Теперь требуемый ключ хранится в ~/.ssh/is_rsa.pub, копируем его в поле SSH-ключ и нажимаем Создать ВМ.


Сеть и SSH


Подключение к ВМ


После завершения подготовки ВМ в сервисе Compute Cloud появится наша машина с заполненным полем Публичный IPv4.


Также нам необходим логин, который мы указывали на предыдущем шаге в разделе Доступ. Выполним подключение к машине по SSH командой $ ssh <login>@<IPv4>. При подключении потребуется ввести ключевую фразу, которую мы указали на этапе генерации ключей.


$ ssh <login>@<IPv4>Enter passphrase for key '/Users/<user>/.ssh/id_rsa': Last login: Wed Jul 15 08:42:53 2020 from <your host ip>[<login>@node-red ~]$ 

Установка Node-RED


Теперь мы можем установить Node-RED. Самый удобный способ для новой, пустой системы Linux installers for Node-RED из репозитория проекта. Так как мы используем CentOS 8, нам необходима вторая команда для ОС, основанных на RPM:


$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/rpm/update-nodejs-and-nodered)...  Stop Node-RED                         Install Node.js LTS                    Node v10.19.0   Npm 6.13.4  Install Node-RED core                  1.1.2   Add shortcut commands                 Update systemd script                 Update public zone firewall rule    Any errors will be logged to   /var/log/nodered-install.logAll done.  You can now start Node-RED with the command  node-red-start  Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880...

Скрипт установит LTS-версию Node.js, базовую версию Node-RED, создаст скрипт автозапуска для systemd и по желанию создаст правила для порта 1880 в файрволе. Для проверки успешности установки можно запустить команду:


$ node-red-start

Примечание: для выхода из Node-RED нажмите Ctrl+C.


Как активировать автозапуск и старт службы с помощью systemctl:


$ sudo systemctl enable --now nodered.service

После этого по адресу http://{ip вашей машины}:1880 в браузере будет доступен Node-RED.


Запуск Node-RED


Подготовка и настройка сервиса Yandex IoT Core


Возвращаемся в Консоль, выбираем IoT Core и нажимаем Создать реестр. Указываем любое подходящее имя. Далее определимся со способом авторизации.


IoT Core поддерживает два способа: с помощью сертификатов и по логину-паролю. Для нашего тестового сценария намного быстрее использовать последний, поэтому заполним поле Пароль. Длина пароля минимум 14 символов.


Создание реестра


После создания переходим в реестр во вкладку Устройства слева и нажимаем Добавить устройство.


Аналогично реестру задаем имя и пароль.


Теперь в пункте Обзор реестра появился его ID и пароль (в скрытом виде), которые мы указали при создании реестра. То же самое с устройством: на странице устройства есть его ID.


Пример создания простого приложения в Node-RED


Перейдем в http://{ip вашей машины}:1880. Импортируем готовый пример, где нам потребуется лишь указать данные реестра и устройства.


В меню в правом верхнем углу Node-RED нажмем Import. Flow в формате .json берем отсюда и либо копируем содержимое в поле, либо скачиваем файл и нажимаем select a file to import.


В новой вкладке появится flow testing connection.


Рассмотрим добавленные узлы. Send data узел типа Inject, предназначен для ручного или автоматического запуска flow.


Device payload узел-функция, позволяет выполнять JavaScript для обработки данных, проходящих через этот узел.


device mqtt-out-узел с настраиваемым MQTT-подключением, предназначен для публикации данных в топик.


Device flow


Два раза кликаем по узлу device.


Нам необходимо заменить <id_реестра> на ID нашего реестра в IoT Core. Далее редактируем данные в Server. Во вкладке Security указываем username это ID созданного нами устройства, а password пароль, придуманный на этапе создания устройства. Затем нажимаем Update, далее Done.


Протестируем соединение: в правом верхнем углу нажмем Deploy. Под узлом device появится подпись connected.


Импортируем flow с dashboard таким же образом. После импорта будет показано сообщение о недостающих компонентах, загрузим их. В меню в правом верхнем углу перейдем в Manage palette. В появившемся окне во вкладке Install в поисковом поле напишем node-red-dashboard и установим самый первый из найденных пакетов. Таким же образом установим node-red-contrib-web-worldmap.


Flow получился намного интереснее предыдущего, видны новые узлы.


Так, registry mqtt-in-узел, принимает сообщения из указанного в настройках топика и передает их следующим узлам.


Измеряемые данные приходят в строке, поэтому применяется узел разбора сообщений json. Он может конвертировать JSON-объект в его JS-представление и обратно.


Parsing JSON и JSON возвращают полученные измерения уже в виде отдельных объектов, которые далее передаются узлам, отвечающим за элементы Dashboard.


App Flow


Теперь необходимо настроить узел registry. Аналогично первому flow записываем наш ID реестра и переходим в настройки сервера iot-core-subscription.


Во вкладке Security добавляем данные реестра, сохраняем изменения и нажимаем Deploy.


Если все поля заполнены верно, то после развертывания под узлом registry тоже появится подпись connected.


Последння вкладка в окне справа (с иконкой столбчатой диаграммы) отвечает за Dashboard. Перейти в Dashboard можно по кнопке:


Ссылка на Dashboard


Каждые три секунды устройство из flow testing connection генерирует данные, отправляет их в топик нашего реестра, а flow Smart Utilities, в свою очередь, подписывается на этот топик и обновляет Dashboard в соответствии с данными, приходящими из IoT Core.


Dashboard


В качестве результатов и краткого заключения


Node-RED действительно может скачать любой желающий, безвозмездно. При первом знакомстве он вызывает вопросы в плане логики работы и прививает свою непередаваемую любовь к узлу "debug" и вкладке "debug messages". Но когда осмотришься и разберешься, то все встает на свои места и становится очень просто выполнять любые действия. Совсем без познаний в программировании обойтись не получится требуется хоть какое-то представление о том, что такое переменные, условия, циклы, массивы, JSON сообщения и как осуществлять их разбор. Однако узлы из раздела "Network", такие как "mqtt in/out", заработали с сервисом Yandex IoT Core вообще без проблем при условии правильной конфигурации.


Я умышленно не стал слишком детально описывать, как создается само приложение, поскольку есть исходник потока в JSON. Да и сама идея проекта Node-RED предполагает, что любой желающий может взглянуть на поток и понять, что он делает, без необходимости разбираться в отдельных строках кода на каждом узле. Но в код лучше заглянуть.


Ссылки на полезные материалы



Отдельное спасибо за помощь при создании статьи:


Подробнее..

Реализация кастомной Edge I-IoT платформы

15.07.2020 18:16:18 | Автор: admin
В предыдущей статье был краткий обзор промышленного интернета вещей I-IoT и описание платформы граничных вычислений. В этой статье я хочу показать простой пример релизации Edge I-IoT платформы, используя популярные открытые технологии.

С архитектурной точки зрения платформа IoT требует решить следующие задачи:

  • Объем данных, получаемых, принимаемых и обрабатываемых, требует высокой пропускной способности, хранения и вычислительных возможностей.
  • Устройства могут быть распределены по обширной географической области
  • Компании требуют, чтобы их архитектура постоянно развивалась, чтобы можно было предлагать новые услуги клиентам.

Одной из особенностей IoT платформы является независимость между объектами и сигналами, что позволяет выполнять параллельные вычисления, повышая производительность.

Данные, поступающие с датчиков, собираются из источников, таких как ПЛК, DCS, микроконтроллеров и т.п и могут храниться во временной области для избежание потери данных из-за проблем с подключением. Данные могут быть временным рядом, такими как событие, полуструктурированные данные, такие как логи и двоичные файлы, или неструктурированные, как изображение. Данные и события временного ряда собираются часто (от каждой секунды до нескольких минут). Затем они отправляются по сети и сохраняются в централизованном озере данных (data lake) и базе данных временных рядов (time-series database TSDB). Data lake может быть облачным, локальным центром обработки данных или сторонней системой хранения.

Данные могут быть немедленно обработаны с использованием анализа потока данных, который называется hot path, с механизмом проверки правил, основанном на простой или интеллектуальной уставке. Продвинутая аналитика может включать: цифровые близнецы, машинное обучение, глубокое обучение или аналитика на основе физических характеристик. Такая система может обрабатывать большой объем данных (от десяти минут до месяца) с разных датчиков. Эти данные хранятся в промежуточном хранилище. Эта аналитика называется cold path, и как правило, запускается планировщиком или доступностью данных и требует большого количества вычислительных ресурсов. Продвинутая аналитика часто нуждается в дополнительной информации, такой как модель контролируемой машины и эксплуатационные атрибуты; эта информация содержится в asset registry. Asset registry содержит информацию о типе актива, включая его имя, серийный номер, символическое имя, местоположение, рабочие возможности, историю комплектующих, из которых он состоит, и роль, которую он играет в производственном процессе. В asset registry мы можем хранить список измерений каждого актива, логическое имя, единицу измерения и диапазон границ. В промышленном секторе эта статическая информация важна для правильной аналитической модели.

Причины разработки кастомной платформы:

  • Возврат инвестиций: небольшой бюджет;
  • Технология: использование технологии независимо от поставщика;
  • Конфиденциальность данных;
  • Интеграция: необходимость разработки уровня интеграции с новой или устаревшей платформой;
  • Другие ограничения;

image

Cквозной поток данных в I-IoT

Пример кастомной реализации Edge-платформы


На данном рисунке показана реализация следующих звеньев платформы:

  • Источник данных: как пример выбран симулятор контроллера Simatic PLCSIM Advanced с активированным OPC сервером, как описано в предыдущей статье.
  • В качестве граничного шлюза выбрана популярная платформа Node-Red c установленным плагином node-red-contrib-opcua flows.nodered.org/node/node-red-contrib-opcua
  • MQTT брокер Mosquitto используется как диспетчер передачи данных между другими звеньями потока.
  • Apache Kafka используется как как распределенная потоковая платформа, выполняющая роль аналитики hot path с помощью kafka-streams.

image

Node-red Edge gateway


В качестве шлюза граничных вычислений будем использовать Node-red, как простую настраиваемую платформу, имеющую множество различных плагинов. Роль промышленного адаптера (Industrial adapter) играет плагин node-red-contrib-opcua. Для множественного сбора данных с контроллера способом подписки используются ноды: OpcUa-Browser и OpcUa-client. В OPC браузер ноде настраивается url OPC-сервера (endpoint) и топик, в котором указано пространство имен и имя читаемого блока данных, например ns=3;s=HMI_Alarms_Area. В OPC-клиент ноде также указывается url OPC-сервера, в качестве действия (Action) устанавливается SUBSCRIBE и интервал обновления данных.

Node-red main flow
image

Настройка ноды OPC-browser
image

Настройка ноды OPC-client
image

Для того, чтобы выполнилась подписка на чтения множественных данных, необходимо подготовить и загрузить топики тегов чтения с контроллера, согласно OPC протокола. Для этого вначале используется inject нода с чекбоксом only once, которая тригерит единократное чтения блоков данных, указанных в нодах OPC-браузера. Затем данные обрабатываются функцией Decode&filter. После чего нода OPC-клиента подписывается и читает изменяющиеся данные с контроллера. Дальнейшая обработка потока зависит от конкретной реализации и требований. В своем примере я обрабатываю данные для дальнейшей отсылки их в MQTT брокер на разные топики.

Вкладки HMI control и Office представляют собой простую реализуцию HMI на базе Scadavis.io и node-red dashboard, как описано ранее в статье.

image

Пример парсинга данных OPC-browser ноды

var items = msg.payload;for (var i=0; i<items.length; i++) {    var item = items[i];var ref = item.item;var nodeClass = ref.$nodeClass;var typeDef = ref.typeDefinition;var bname = ref.browseName;var ns=bname.namespaceIndex;var name=bname.name;var value = ref.value;var datatype = ref.dataType;// Select only want namespace variablesif (ns==3) {    var newmsg={};newmsg.topic =     ref.nodeId+    ";datatype="+datatype;newmsg.payload=value;node.send(newmsg);}}

MQTT брокер


В качестве брокера можно использовать любую реализацию. В моем случае уже установлен и настроен Mosquitto брокер mosquitto.org. Брокер выполняет функцию транспорта данных между Edge gateway и другими участниками платформы. Есть примеры с балансировкой нагрузки и распределенной архитектурой, например habr.com/ru/company/yandex/blog/491740. В данном случае ограничимся одним mqtt брокером с передачей данных без шифрования.

Локальное хранилище данных временных рядов


Данные временного ряда удобно записывать и хранить в NoSql time-series базе данных. Для наших целей удачно подходит стек InfluxData. Нам необходимо четыре сервиса из этого стека:

InfluxDB это база данных временных рядов с открытым исходным кодом, которая является частью стека TICK (Telegraf, InfluxDB, Chronograf, Kapacitor). Предназначена для обработки данных с высокой нагрузкой и предоставляет SQL-подобный язык запросов InfluxQL для взаимодействия с данными.

Telegraf это агент для сбора и отправки метрик и событий в InfluxDB из внешних IoT систем, датчиков и т.п. Настраивается на сбор данных из mqtt топиков.

Kapacitor это встроенный механизм обработки данных для InfluxDB 1.x и интегрированный компонент в платформу InfluxDB 2.0. Этот сервис можно настроить на мониторинг различных уставок и тревог, а также установить обработчик отправки событий во внешние системы, как Kafkf, email и т.п.

Chronograf это пользовательский интерфейс и административный компонент платформы InfluxDB 1.x. Используйтся для быстрого создания панелей мониторинга с визуализацией в реальном времени.

Все компоненты стека можно запустить локально или настроить Docker контейнер.

image
Выборка данных и настройка дашбордов с помощью Chronograf

Для запска InfluxDB достаточно выпонить команду influxd, в настройках influxdb.confможно указать место хранения данных и другие свойства, по умолчанию данных храняться в пользовательском каталоге в .influxdb директории.

Для запуска telegraf необходимо выполнить команду telegraf -config telegraf.conf, где в настройках можно указать источники метрик и событий, в нашем примере для mqtt это выглядит так:

# # Read metrics from MQTT topic(s) [[inputs.mqtt_consumer]]   servers = ["tcp://192.168.1.107:1883"]   qos = 0   topics = ["HMI_Status_Area/#", "HMI_Alarms_Area/#"]   data_format = "value"   data_type = "float"  

В свойстве servers указываем url к mqtt брокеру, qos можем оставить 0, если достаточно записывать данные без подтверждения. В свойстве topics указываем маски mqtt топиков, из которых будем читать данные, например HMI_Status_Area/# означает, что мы читаем все топики, имеющие префикс HMI_Status_Area. Таким образом telegraf для каждого топика создаст свою метрику в базе, куда будет писать данные.

Для запуска kapacitor необходимо выполнить команду kapacitord -config kapacitor.conf. Свойства можно оставить по умолчанию и дальнейшие настройки выполнить с помощью Chronograf.
Чтобы запустить chronograf достаточно выполнить одноименную команду chronograf. Веб интервейст будет доступен localhost:8888/

Для настройки уставок и тревог с помощью Kapacitor можно воспользоваться мануалом docs.influxdata.com/kapacitor/v1.5/working/kapa-and-chrono. В кратце нужно перейти во вкладку Alerting в Chronograf и создать новое правило с помощью кнопки Build Alert Rule, интерфейс интуитивно понятен, все выполняется визуально. Для настройки отсылки результатов обработки в kafka (и др.) необходимо добавить обработчик в разделе Conditions

Настройки обработчика Kapacitor
image

Распределенная потоковая обработка с Apache Kafka


Для предлагаемой архитектуры необходимо отделить сбор данных от обработки, улучшив масштабируемость и независимость уровней. Для достижения этой цели мы можем использовать очередь. В качестве реализации может быть Java Message Service (JMS) или Advanced Message Queuing Protocol (AMQP), но в данном случае будем использовать Apache Kafka. Kafka поддерживается большинством аналитических платформ, имеет очень высокую производительность и масштабируемость, а также имеет хорошую библиотеку потоковой обработки Kafka-streams.

Для взаимодействия к Kafka можно использовать плагин Node-red node-red-contrib-kafka-manager flows.nodered.org/node/node-red-contrib-kafka-manager. Но учитываю разделения сбора от обработки данных, установим плагин MQTT, который подписывается на топики Mosquitto. Плагин MQTT доступен по ссылке github.com/evokly/kafka-connect-mqtt.

Для настройки коннектора необходимо в каталок kafka/libs/ скопировать библиотеки kafka-connect-mqtt-1.1-SNAPSHOT.jar и org.eclipse.paho.client.mqttv3-1.0.2.jar (или другую версию). Затем в каталоге /config необходимо создать файл свойств mqtt.properties со следующим содержимым:

name=mqttconnector.class=com.evokly.kafka.connect.mqtt.MqttSourceConnectortasks.max=1 kafka.topic=streams-measuresmqtt.client_id=mqtt-kafka-123456789 mqtt.clean_session=truemqtt.connection_timeout=30mqtt.keep_alive_interval=60 mqtt.server_uris=tcp://192.168.1.107:1883mqtt.topic=mqtt

После чего мы можем запустить коннектор с помощью команды предварительно запустив zookeeper-server и kafka-server

connect-standalone.bat \config\connect-standalone.properties \config\mqtt.properties

Из топика mqtt (mqtt.topic=mqtt) данные будут записываться в Kafka-топик streams-measures (kafka.topic=streams-measures).

В качестве простого примера можно создать maven-проект, используя библиотеку kafka-streams.
С помощью kafka-streams можно создавать различные сервисы и сценарии hot аналитики и потоковой обработки данных.

Например, сравнение текущей температуры с уставкой.
StreamsBuilder builder = new StreamsBuilder();        KStream<String, String> source = builder.stream("streams-measures");        KStream<Windowed<String>, String> max = source                .selectKey((String key, String value) -> {                        return getKey(key, value);                    }                )                .groupByKey()                .windowedBy(TimeWindows.of(Duration.ofSeconds(WINDOW_SIZE)))                .reduce((String value1, String value2) -> {                        double v1=getValue(value1);                        double v2=getValue(value2);                        if ( v1 > v2)                            return value1;                        else                            return value2;                    }                )                .toStream()                .filter((Windowed<String> key, String value) -> {                        String measure = tagMapping.get(key.key());                        double parsedValue = getValue(value);                        if (measure!=null) {                            Double threshold = excursion.get(measure);                            if (threshold!=null) {                                if(parsedValue > threshold) {                                    log.info(String.format("%s : %s; Threshold: %s", key.key(), parsedValue, threshold));                                    return true;                                }                                return false;                            }                        } else {                            log.severe("UNKNOWN MEASURE! Did you mapped? : " + key.key());                        }                        return false;                    }                );        final Serde<String> STRING_SERDE = Serdes.String();        final Serde<Windowed<String>> windowedSerde = Serdes.serdeFrom(                new TimeWindowedSerializer<>(STRING_SERDE.serializer()),                new TimeWindowedDeserializer<>(STRING_SERDE.deserializer(), TimeWindows.of(Duration.ofSeconds(WINDOW_SIZE)).size()));        // the output        max.to("excursion", Produced.with(windowedSerde, Serdes.String()));


Asset registry


Реестр активов вообще говоря не является структурной составляющей Edge платформы и представляет часть облачной IoT среды. Но в данном примере показано взаимодействие Edge и Cloud.

В качестве asset registry будем использовать популярную IoT платформу ThingsBoard. Интерфейс которой также достаточно интуитивно понятен. Установка возможно с демо-данными. Платформу можно установить локально, в докере или использовать готовую облачную среду.

В набор демо-данных входят тестовые устройства (можно легко создать новое), в которые мы можем отправлять значения. По умолчанию ThingsBoard запускается со своим mqtt брокером, к которому необходимо подключаться и отсылать данные в json формате thingsboard.io/docs/reference/mqtt-api. Допустим, мы хотим отсылать данные в ThingsBoard от устройства TEST DEVICE A1. Для этого нам необходимо подключиться к ThingBoard брокеру по адресу localhost:1883, используя A1_TEST_TOKEN в качестве логина, который можно скопировать из настроек устройства. После чего можем публиковать данные в топик v1/devices/me/telemetry: {temperature:26}

image

В документации платформы имеется манул по настройке передачи данных и обработке аналитики в Kafka IoT data analytics using Kafka, Kafka Streams and ThingsBoard

Пример использования Kafka ноды в Thingsboard
image
Подробнее..

Быстрый прототип IIoT-решения на Raspberry PI и Yandex IoT

17.12.2020 10:10:32 | Автор: admin

В этой серии статей я расскажу как самостоятельно собрать полнофункциональный прототип промышленного IIoT-шлюза на базе Raspberry PI.

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

Однако в качестве быстрого и дешевого решения на этапе проверки гипотез (в момент когда вам только предстоит определиться какие данные каким способом снимать и как их потом хранить и использовать) такое решение вполне имеет право на существование.

В конце концов, с программной точки зрения, большинство современных промышленных IoT-шлюзов - не что иное, как обычные одноплатные ПК со специфической ОС (чаще всего на базе Linux) и набором предустановленного ПО.

В общем те, кто готов к подобным экспериментам на производстве, либо просто интересуется IIoT и хочет поэкспериментировать с технологиями для собственного развития - вэлкам под кат!


Постановка задачи

Для начала давайте определим, какие функции мы хотим получить на выходе.

Основная суть подобного проекта - анализ данных о производственном процессе.

То есть в первую очередь - сбор телеметрии с различных датчиков, отправка её на сервер (например в облако) для централизованной обработки и накопление истории. Дальнейшая судьба собранной статистики зависит от конкретной решаемой задачи и вашей фантазии.

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

В первой части статьи мы реализуем основные функции:

  • сбор телеметрии с промышленных датчиков по протоколу Modbus;

  • передачу данных в облако;

  • локальный мониторинг в реальном времени;

Во второй - разберемся с тем, как можно накапливать и обрабатывать телеметрию в облаке;

А в третьей - доработаем проект дополнительными фичами:

  • локальным хранилищем телеметрии;

  • устройством для прямого считывания аналогового или цифрового сигнала;

Общая архитектура

Наш небольшой прототип будет иметь все обязательные компоненты IIoT-решения:

  1. Устройство считывания показаний датчиков (можно использовать промышленный контроллер, умные датчики, или собрать свой вариант на базе любого arduino-совместимого контроллера);

  2. IIoT-шлюз, в качестве которого будет выступать Raspberry PI;

  3. Облачный сервис, который принимает данные по протоколу MQTT, сохраняет их в Managed DB и производит дальнейшую обработку - эту часть развернем на платформе Yandex.Cloud

Основные компоненты решенияОсновные компоненты решения

Настраиваем шлюз

Начнем с центрального узла нашего небольшого проекта, то есть малинки.

В качестве ядра системы на стороне шлюза удобно использовать Node-RED. Это простой и удобный инструмент Low-code разработки, который позволяет сократить время создания IoT (и не только) решений. Если по какой-то неведомой причине вы им ещё не пользуетесь - обязательно почитайте про него тут и тут!

Одно из главных преимуществ Node-RED - наличие огромного количества расширений. В том числе, специальных кубиков для работы с modbus, serial и всевозможными базами данных. Там же есть и конструктор легких дашбордов для real-time мониторинга (всё это нам понадобится).

1) Устанавливаем и настраиваем Node-RED:

Вообще Node-RED есть в официальном репозитории Raspberry и его можно поставить просто через apt-get. Но разработчики рекомендуют использовать специально подготовленный ими скрипт, который сразу ставит ещё и npm и настраивает node-RED для запуска в качестве сервиса.

Заходим на малинку и запускаем скрипт:

$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Дожидаемся завершения установки (она может занять несколько минут). Когда установка завершена, можно сразу настроить автозапуск при старте ОС:

$ sudo systemctl enable nodered.service

Если хотите сразу озаботиться некоторой безопасностью, можно настроить вход в web-интерфейс по паролю вот по этой инструкции.

Spoiler

Файл settings.js скорее всего будет находиться в папке: /home/pi/.node-red

Теперь всё готово к запуску Nede-RED:

$ node-red-start

Если всё установилось и запустилось успешно, web-интерфейс Node-RED будет доступен в локальной сети по адресу: [IP малинки]:1880

Но настройка на этом ещё не закончена - по умолчанию у нас есть только базовые предустановленные компоненты, а для задуманного понадобится несколько дополнительных, которые надо еще поставить.

Заходим в web-интерфейс, идем в настройки палитры: [Меню в правом верхнем углу] ->[Pallet manager]:

Меню настроек палитрыМеню настроек палитры

Переходим во вкладку Install, находим и устанавливаем следующие пакеты:

node-red-contrib-modbus - пакет для работы по протоколу Modbus

node-red-dashboard - дашборды для мониторинга в реальном времени

postgrestor - простой компонент для выполнения запросов к PostgreSQL

node-red-node-serialport - компонент для работы с serial (этот компонент может быть уже установлен вместе с базовыми)

Вот теперь Node-RED настроен, можно приступать к разработке!

2) Реализуем считывание данных по Modbus:

Modbus - открытый протокол, разработанный ещё в 1979 году для использования в контроллерах MODICON (бренд, между прочим, жив до сих пор и ныне принадлежит Schneider Electric).

Сейчас modbus является де-факто стандартом для промышленных сетей и поддерживается подавляющим большинством контроллеров и умных датчиков. Для интересующихся, вот тут есть хорошая обзорная статья по теме.

Я же не буду подробно останавливаться на его описании. Упомяну только что протокол имеет 3 основные модификации:

  • две для использования с сетевыми интерфейсами RS-232/422/485 (Modbus ASCII и Modbus RTU)

  • и одну для обмена по TCP/IP (Modbus TCP)

Это важно, так как с одной стороны влияет на то, как Raspberry будет физически подключаться к устройствам (в первом случае понадобится переходник COM/RS-USB), а с другой - от этого зависят настройки считывания данных.

И так, подключаем девайс в соответствующее гнездо малины, создаем поток, добавляем в него кубик modbus-read и заходим в его настройки:

Для начала надо создать подключение к Modbus-серверу. Нажимаем Создать подключение и вводим параметры устройства, с которого хотим получать телеметрию:

Для варианта с RS (Serial) необходимо указать адрес порта, к которому подключено устройство, тип протокола (RTU или ASCII) и поддерживаемую скорость обмена (baud rate):

Для TCP указываем IP-адрес устройства (стоит убедиться, что для eth0 на малинке настроена статика в той же подсети и устройство успешно пингуется) и номер порта (обычно используется порт 502):

Теперь настраиваем сам кубик. Тут важны 4 параметра:

FC (код функции) - Для считывания цифровых данных - 02, для аналоговых - 04.

Address - адрес первого регистра для считывания. Адреса регистров можно посмотреть в спецификации устройства, обычно смысловые регистры идут в начале, т.е. Начинаются непосредственно с 0.

Quantity - количество регистров для считывания. Этот параметр зависит от количества передаваемых устройством параметров - сколько передается сигналов столько и будет регистров. Эту информацию также можно найти в спецификации или даташите.

Poll Rate - частота опроса. Задает частоту, с которой поток будет получать данные от устройства.

В данном примере настроено получение сигналов восьми аналоговых датчиков, начиная с регистра 0000, раз в 5 секунд:

Кубик возвращает в payload массив значений регистров (если регистры указаны правильно - они же показания датчиков). Осталось их немного отформатировать и добавить метку времени. Для этого воспользуемся функцией:

var out_msg = []var values = []var values_formated = []values = msg.payload;var time = (new Date()).toISOString()var n = 0;for(var v in values){    values_formated.push({out:"A"+n.toString(), val:values[v]});    n = n+1;}out_msg.push({payload:{datetime:time, val:values_formated}});return out_msg;

В данной функции каждому значению просто проставляются метки входа, но вы можете настроить преобразования на свое усмотрение - например задать масштабирование или пересчет из целочисленных значений регистров в измеряемые физические величины (температуру, напряжение, скорость и т.п). Для тестирования добавляем отладочные сообщения (чтобы посмотреть какой payload будет поститься в облако).

Нажимаем кнопку Deploy в правом верхнем углу. Если подключение настроено правильно, под нодой подключения к modbus появится статус active, а во вкладке debug начнут выводиться отформатированные сообщения:

3) Настраиваем мониторинг:

Теперь настроим дашбордик для мониторинга сигналов из web-интерфейса Node-RED. Для этого используем кубик chart.

Функционал chart позволяет отображать несколько сигналов на одном графике, но подаваться они должны по отдельности - каждый в своем сообщении со своим топиком. Поэтому массив, приходящий от устройства по modbus надо разделить на отдельные сигналы. Для этого воспользуемся ещё одной функцией:

var values = [];var values_formated = [];var topic_nm = "";values = msg.payload;var n = 0;for(var v in values) // для каждого сигнала формируем свое сообщение{    topic_nm = "A"+n.toString(); // формируем название сигнала    values_formated.push( // подготовленные сообщения складываем в общий массив:        {topic:topic_nm, // название сигнала - в топик         payload:values[v]}); // значение сигнала - в payload    n = n+1;}return {payload:values_formated};

Функция в Nod-RED может иметь больше одного выхода (количество выходов настраивается в нижней части окна свойств):

Но в данном случае мы можем не знать заранее сколько сигналов (и соответственно выходов) будет. Поэтому положим всё в один массив и вернем его целиком:

...return {payload:values_formated};

А дальше воспользуемся нодой split для разделения сообщений и нодой "change" для их форматирования.

split - разделит массив на отдельные payload-ы, а в change мы положим топик и payload каждого сообщения на его законное место:

На выходе получаем поток отдельных сообщений в правильном формате, готовый для подачи в чарт. В результате получается вот такой flow:

Деплоим его и переходим по адресу: http://[IP малинки]:183/ui

И видим график сигналов в реальном времени:

Вот и всё, сбор и локальное отображение телеметрии настроено!

Настройка брокера MQTT в облаке

Теперь можно приступить к настройке серверной части решения. Для этого воспользуемся облачным сервисом Yandex, называемым Yandex IoT Core.

MQTT - ещё один де факто стандартный протокол для IoT-проектов. Вот тут есть хороший обзор самого протокола, поэтому подробно на нем останавливаться не буду, но немного расскажу как устроен MQTT-брокер от Yandex:

В Yandex IoT Core есть два основных типа объектов - реестры и устройства.

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

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

Организация топиков Yandex IoT CoreОрганизация топиков Yandex IoT Core

При этом сами топики реестров и устройств никак между собой не связаны - сообщение приходит именно в тот топик, в который отправлено и в других недоступно.

Для дальнейших действий потребуется учетная запись Yandex.Cloud. Если у вас такой еще нет, ее можно достаточно быстро завести. В процессе необходимо ввести данные карты но (в отличии от некоторых других облачных сервисов) деньги с неё списываться не будут пока вы явно не переключитесь на платный аккаунт. После регистрации Yandex предоставляет небольшой грант в 4К рублей, которого на приведенные тут эксперименты хватит с лихвой.

Подключаем и настраиваем сервис:

Для начала генерируем сертификат, который будет использоваться для чтения данных из реестра. Вообще говоря, сервис позволяет идентификацию по логину и паролю как для устройств, так и для реестров, но поскольку предполагается использовать реальные данные с оборудования, лучше озаботиться идентификацией по SSL.

Сгенерировать пару сертификатов можно при помощи утилиты OpenSSL вот такой командой:

$ openssl req -x509 \--newkey rsa:4096 \--keyout key_reg.pem \ # имя сертификата закрытого ключа--out crt_reg.pem \   # имя сертификата открытого ключа--nodes \--days 365 \--subj '/CN=localhost'

Теперь заходим в консоль Yandex.Cloud, выбираем IoT Core и создаем новый реестр:

Открытую часть ключа, сгенерированного на предыдущем шаге (crt_reg.pem), загружаем в настройки реестра. Этот сертификаты будут использоваться для считывания телеметрии из брокера внешними сервисами и отправки команд устройствам:

Нажимаем "Создать" и попадаем в настройки свежесозданного реестра. Теперь надо зарегистрировать в нем малинку в качестве устройства.

Аналогичным образом генерируем пару сертификатов на малинке. Оба сертификата сразу кладем в отдельную папочку, туда же скачиваем корневой сертификат удостоверяющего центра. Они понадобятся для настройки отправки сообщений.

Заходим в Устройства и создаем новое:

Аналогично с созданием реестра загружаем сертификат из пары, созданной на малинке и нажимаем "Добавить".

На этом настройка брокера завершена, всё готово для приема сообщений.

ID устройств и реестров можно посмотреть на вкладке "Обзор". Они нужны для задания адресов топиков:

Топик устройства: $devices/<ID устройства>/events

Топик реестра: $registries/<ID реестра>/events

Также у каждого устройства и реестра есть перманентный топик. Основное отличие перманентных топиков состоит в том, что в них всегда сохраняется последнее сообщение. То есть при подключении консьюмер получит последнее отправленное в него сообщение, даже если не был в сети в момент его отправки. Адреса перманентных топиков похожи на обычные, но заканчиваются на state а не events:

Перманентный топик устройства: $devices/<ID устройства>/state

Перманентный топик реестра: $registries/<ID реестра>/state

Подробнее о топиках Yandex IoT Core можно почитать вот тут.

Настройка отправки сообщений по MQTT

Возвращаемся к проекту Node-RED.

Кубик для отправки сообщений по MQTT в Node-RED уже предустановлен. Добавляем его в поток после функции "add_time_stamp"и настраиваем:

Указываем адрес топика, в который собираемся писать, например топик реестра. Уровень сервиса (QoS) ставим 0 - для наших задач отслеживание доставки не требуется:

Заходим в настройки сервера. Тут настраиваем подключение к брокеру:

Сервер: mqtt.cloud.yandex.net

Порт: 8883

Ставим галочку Enable secure (SSL/TLS) connection и заходим в настройки TLS:

Указываем пути до файлов ключей, сгенерированных на этапе настройки IoT Core:

Сохраняем настройки и деплоим проект. В итоге flow выглядит вот так:

А телеметрия успешно отправляется в облако!

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

$ yc iot mqtt subscribe \--cert registry-cert.pem \ # файл сертификата реестра--key registry-key.pem \  # файл ключа реестра--topic '$devices/<ID устройства>/events' \--qos 1

Либо собрав отдельный поток Nod-RED с чтением из MQTT с помощью нода "mqtt in" (интереснее, если он будет работать на другом устройстве, но и та же самая малинка тоже подойдет):

Он настраивается аналогично "mqtt out", но обратите внимание, что для чтения надо создать отдельное подключение со своей конфигурацией TLS, в которую надо загрузить уже сертификаты реестра. Подключение от имени устройства свои же сообщения читать не будет. А вот топик должен быть именно тот, в который происходит запись.

Результат

И так, минимальный функционал шлюза реализован - телеметрия собирается, передается в облако и доступна в реальном времени из любой точки планеты. Можно, например, развернуть Node-RED на вашем локальном ПК и сделать на нем небольшой дашбордик, отражающий собираемые показатели.

А в качестве бонуса уже есть небольшой локальный монитор сигналов, доступный в локальной сети малинки.

В следующей части начнем сохранять получаемую телеметрию и посмотрим что ещё с ней можно делать в облаке.

Пример потоков Node-RED, описываемых в статье, можно скачать тут.

Подробнее..

Из песочницы Мониторинг доступности сайта с информированием в Twitter на Node-RED

16.08.2020 20:19:14 | Автор: admin
Допустим у вас есть сайт-форум и он падает на пару минут, но 24/7. Надо как-то предупреждать посетителей сайта что проблема началась и проблема кончилась, чтобы не переживали и не думал что это у них что-то сломалось! В качестве резервного канала общения буду использовать Twitter аккаунт. Node-Red визуальная система программирования, в которой легко начать программировать расставляя и соединяя различные ноды. Её часто используют для IOT.

hh-nodered-001

Перед началом


У вас уже должен быть установлен Node-Red c нодой moment. Различные способы установки описаны на сайте разработчиков /nodered.org/docs/getting-started/

Импортите код flow в свой Node-RED и у вас будут все ноды как на картинке

[{"id":"ff8e6c15.1db9e","type":"inject","z":"c20c2bf8.f5bba8","name":"1 min","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":false,"onceDelay":0.1,"x":230,"y":240,"wires":[["aa173003.800e9"]]},{"id":"fa2dd78f.64ef58","type":"http request","z":"c20c2bf8.f5bba8","name":"name.com","method":"GET","ret":"txt","url":"https://name.com","tls":"","x":210,"y":500,"wires":[["3c3eb473.fddb4c","6c05ab54.c151a4"]]},{"id":"3c3eb473.fddb4c","type":"switch","z":"c20c2bf8.f5bba8","name":"not 200 respons","property":"statusCode","propertyType":"msg","rules":[{"t":"neq","v":"200","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":440,"y":520,"wires":[["5a06f9e1.e303d8","cc3ecdf3.6ce24"]]},{"id":"6c05ab54.c151a4","type":"switch","z":"c20c2bf8.f5bba8","name":"found word on web","property":"payload","propertyType":"msg","rules":[{"t":"cont","v":"ca-pub-1234545647","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":450,"y":480,"wires":[["834b9f2b.cfb89","cc3ecdf3.6ce24"]]},{"id":"107dec81.7d3953","type":"function","z":"c20c2bf8.f5bba8","name":"web up","func":"\nreturn {\n    payload: ` ${msg.responseUrl} its OK`\n}","outputs":1,"noerr":0,"x":1140,"y":420,"wires":[["e3f88e59.88023"]]},{"id":"d5bf4f53.b8ae2","type":"function","z":"c20c2bf8.f5bba8","name":"web down","func":"\nreturn {\n    payload: ` name.com it is DOWN at`\n}","outputs":1,"noerr":0,"x":1140,"y":620,"wires":[["300022a2.3d497e"]]},{"id":"ddeb8430.749ed8","type":"inject","z":"c20c2bf8.f5bba8","name":"","topic":"","payload":"","payloadType":"date","repeat":"1","crontab":"","once":false,"onceDelay":0.1,"x":250,"y":100,"wires":[["e82f93c1.0e89e"]]},{"id":"e82f93c1.0e89e","type":"moment","z":"c20c2bf8.f5bba8","name":"","topic":"","input":"","inputType":"msg","inTz":"Europe/Moscow","adjAmount":"0","adjType":"hours","adjDir":"add","format":"date","locale":"en_US","output":"time","outputType":"flow","outTz":"Europe/Moscow","x":460,"y":100,"wires":[[]]},{"id":"4c032cf4.424084","type":"file","z":"c20c2bf8.f5bba8","name":"Write www.log","filename":"/root/iot_data/www.log","appendNewline":true,"createDir":false,"overwriteFile":"false","x":1820,"y":480,"wires":[[]]},{"id":"834e384f.425cb8","type":"function","z":"c20c2bf8.f5bba8","name":"Add time to data","func":"var timenow=flow.get('time');\nvar downtimenow=flow.get('downmin')-5;\nmsg.payload = msg.payload + ' ' + timenow + '. Downtime: ' + downtimenow + 'min #myhost' ;\nreturn msg;","outputs":1,"noerr":0,"x":1640,"y":500,"wires":[["4c032cf4.424084","4c25ef47.71b94"]]},{"id":"e3f88e59.88023","type":"trigger","z":"c20c2bf8.f5bba8","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1360,"y":420,"wires":[["e24a68a2.c83f58"]]},{"id":"300022a2.3d497e","type":"trigger","z":"c20c2bf8.f5bba8","op1":"","op2":"","op1type":"pay","op2type":"pay","duration":"0","extend":true,"units":"min","reset":"reset","bytopic":"all","name":"","x":1360,"y":620,"wires":[["419d4a24.ec1604","11c46064.1ffc7"]]},{"id":"aac1daf2.c77e18","type":"function","z":"c20c2bf8.f5bba8","name":"send reset","func":"\nreturn {\n    payload: `reset`\n}","outputs":1,"noerr":0,"x":1150,"y":540,"wires":[["e3f88e59.88023"]]},{"id":"59f336.30325ccc","type":"function","z":"c20c2bf8.f5bba8","name":"send reset","func":"\nreturn {\n    payload: `reset`\n}","outputs":1,"noerr":0,"x":1150,"y":480,"wires":[["300022a2.3d497e"]]},{"id":"5a06f9e1.e303d8","type":"counter","z":"c20c2bf8.f5bba8","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":690,"y":660,"wires":[["e93a8fe8.8bb23"]]},{"id":"323380d1.a71af","type":"switch","z":"c20c2bf8.f5bba8","name":"if its 3","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"3","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":990,"y":660,"wires":[["d5bf4f53.b8ae2","aac1daf2.c77e18"]]},{"id":"24d1969a.a4e5da","type":"function","z":"c20c2bf8.f5bba8","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":890,"y":440,"wires":[["5a06f9e1.e303d8"]]},{"id":"834b9f2b.cfb89","type":"counter","z":"c20c2bf8.f5bba8","name":"count to 10","init":"0","step":"1","lower":"0","upper":"10","mode":"increment","outputs":1,"x":670,"y":380,"wires":[["641f8b3.143cd74"]]},{"id":"440de7c7.eb6d48","type":"function","z":"c20c2bf8.f5bba8","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":850,"y":580,"wires":[["834b9f2b.cfb89"]]},{"id":"1b410fb8.f2e8b","type":"switch","z":"c20c2bf8.f5bba8","name":"if its 5","property":"count","propertyType":"msg","rules":[{"t":"eq","v":"5","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":990,"y":380,"wires":[["107dec81.7d3953","59f336.30325ccc"]]},{"id":"641f8b3.143cd74","type":"switch","z":"c20c2bf8.f5bba8","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":840,"y":380,"wires":[["24d1969a.a4e5da","1b410fb8.f2e8b"]]},{"id":"e93a8fe8.8bb23","type":"switch","z":"c20c2bf8.f5bba8","name":"it its > 0","property":"count","propertyType":"msg","rules":[{"t":"gt","v":"0","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":840,"y":660,"wires":[["323380d1.a71af","440de7c7.eb6d48"]]},{"id":"e24a68a2.c83f58","type":"switch","z":"c20c2bf8.f5bba8","name":"not a on start web up message","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"Started!","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":1650,"y":420,"wires":[["834e384f.425cb8"]]},{"id":"2ef6b867.dd9328","type":"inject","z":"c20c2bf8.f5bba8","name":"","topic":"","payload":"Started!","payloadType":"str","repeat":"","crontab":"","once":true,"onceDelay":"","x":240,"y":160,"wires":[["e3f88e59.88023","24d1969a.a4e5da","440de7c7.eb6d48"]]},{"id":"f3ac9999.c58e48","type":"switch","z":"c20c2bf8.f5bba8","name":"Check if my Internet is up","property":"statusCode","propertyType":"msg","rules":[{"t":"eq","v":"200","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":230,"y":420,"wires":[["fa2dd78f.64ef58"]]},{"id":"aa173003.800e9","type":"http request","z":"c20c2bf8.f5bba8","name":"google.com","method":"GET","ret":"txt","url":"https://www.google.com/","tls":"","x":210,"y":320,"wires":[["f3ac9999.c58e48"]]},{"id":"cc3ecdf3.6ce24","type":"counter","z":"c20c2bf8.f5bba8","name":"count to  3000","init":"3","step":"1","lower":"0","upper":"3000","mode":"increment","outputs":1,"x":1360,"y":160,"wires":[["aeda28f4.55d248"]]},{"id":"419d4a24.ec1604","type":"function","z":"c20c2bf8.f5bba8","name":"reset counter","func":"msg.reset = true; return msg","outputs":1,"noerr":0,"x":1370,"y":240,"wires":[["cc3ecdf3.6ce24"]]},{"id":"e540e4d1.e10a98","type":"file","z":"c20c2bf8.f5bba8","name":"Write www.log","filename":"/root/iot_data/www.log","appendNewline":true,"createDir":false,"overwriteFile":"false","x":1820,"y":600,"wires":[[]]},{"id":"11c46064.1ffc7","type":"function","z":"c20c2bf8.f5bba8","name":"Add time to data","func":"var timenow=flow.get('time');\nmsg.payload = msg.payload + ' ' + timenow + ' #myhost';\nreturn msg;","outputs":1,"noerr":0,"x":1600,"y":620,"wires":[["e540e4d1.e10a98","c51c74c3.bdf448"]]},{"id":"aeda28f4.55d248","type":"function","z":"c20c2bf8.f5bba8","name":"Set downmin","func":"flow.set(\"downmin\", msg.count);","outputs":1,"noerr":0,"x":1550,"y":160,"wires":[[]]},{"id":"c51c74c3.bdf448","type":"twitter out","z":"c20c2bf8.f5bba8","twitter":"","name":"Tweet","x":1790,"y":640,"wires":[]},{"id":"4c25ef47.71b94","type":"twitter out","z":"c20c2bf8.f5bba8","twitter":"","name":"Tweet","x":1790,"y":520,"wires":[]}]


Что делает этот flow


  • Проверяет есть ли доступ в Интернет
  • Проверяет есть ли доступ к сайту
  • Если доступа нет/восстановлен твитит об этом
  • Считает сколько времени сайт простаивал
  • Пишет в файл лог

Что нужно настроить


hh-nodered-002

  • нода 1: Надо написать адрес сайта для мониторинга
  • ноды 2: Надо задать первую часть текста для твита
  • ноды 3: Здесь к твиту добавляются временные данные, так же можно дописать свой текст
  • ноды 4: Здесь надо задать свой аккаунт Twitter и папку для файла логов после изменений не забывайте наживать Deploy

Как это работает


Начинаем слева с верху

  • нода [timestamp] пишет время в переменную time
  • нода [Started!] обнуляет счётчики событий на старте, и взводит тригеры
  • нода [1 min] запускает каждую минуту процесс мониторинга.

Первым делом проверем работает ли у нас интернет ноды [google.com] > [Check if my Internet is up] если получаем ответ 200 значит интернет у нас работает, если нет то или у нас интернет не работает или google.com прилег

Далее проверяем свой сайт [name.com] > ( [found word on web] [not 200 respons] ). Тут нам нельзя просто ждать ответа 200, его могут выдавать и страницы заглушки(например неоплата хостинга) поэтому сайт считается работающим если найдено слово в его контенте у меня это идентификатор Google. Если нет ответа 200(сайт вообще не работает или выдает ошибки 404 и пр) то считаем что сайт не работает.

Далее начинаем считать эти события, если подряд приходят 3 сообщения о неработающем сайте, то оно передаётся дальше на триггер который пропускает одно сообщение и блокируется чтобы не было много твитов об одном и том же. Чтобы сработал триггер отправки твита что все ОК нужно подряд 5 сообщения о работе сайта. Счетчики сообщений обнуляют друга друга при возникновении сообщения, это обеспечивает подсчёт 3-5 сообщения подряд.
Триггер срабатывает когда открывает противоположный на прием.
Подробнее..

Выбираем self-hosted замену IFTTT

08.01.2021 14:08:13 | Автор: admin


If This Then That сервис для автоматизации задач и создания пайплайнов из действий в разных сервисах. Это самый известный и функциональный продукт на рынке, но популярность ему навредила: полноценное создание апплетов теперь возможно только с платной подпиской, а на реддите периодически появляются жалобы на нестабильную работу сервиса. Как и в случае с любым полезным но платным продуктом, ищущий альтернативы обрящет их в опен-сорсном комьюнити. Мы сравним три self-hosted инструмента: Huginn, Beehive и Node-RED, попробуем их в действии и выберем лучший по функционалу и удобству использования.

Huginn




Huginn один из старейших сервисов автоматизации рутинных задач, первая версия была выпущена весной 2013 года. В скандинавской мифологии Хугин и Мунин вороны Одина, приносящие ему новости обо всё происходящем в мире, здесь же это менеджер агентов, выполняющих небольшие задания по заданным триггерам. Агентов можно объединять в цепочки и вообще организовывать в структуры произвольной сложности. Hugginn даже иногда используют целые компании для автоматизации процессов (пример>). Агенты могут:

  • Мониторить любой сайт и реагировать когда появляется определенная информация. Базовый пример агент утром проверяет прогноз погоды и присылает уведомление, если днём будет дождь
  • Следить за темами в твиттере и обращать внимание на пик упоминаний, например во время горячего обсуждения
  • Следить за понижением цен на товары/билеты/подписки/etc
  • Отслеживать упоминания как Google Alerts
  • Отслеживать изменения целых сайтов или их частей. Подойдёт для тех кейсов веб-скрапинга, которые не покрывается вариантами выше. Например повесить алёрт на изменение страницы с пользовательским соглашением или продукт, переходящий из беты в релиз
  • Распознавать цепочки заданий, сформулированных простым текстом, через Amazon Mechanical Turk
  • Отправлять и получать вебхуки
  • Отслеживать текущую геолокацию и сохранять историю перемещений
  • Использовать интеграции с открытыми API любых сервисов (довольно много уже готово, но для экзотики придётся написать своего агента, это несложно)
  • При срабатывании триггера запускать кастомный JS/CoffeeScript код без непосредственного редактирования агентов
  • Аггрегировать все действия в один процесс и выдавать в итоге дайджест сразу по нескольким темам
  • Отправлять алёрты и вообще любые выходные данные через RSS, вебхуки, EMail и SMS

Все работающие агенты автоматически визуализируются в виде графа, чтобы было проще создавать цепочки задач и более сложные структуры:



За семь лет разработки Huginn собрал сообщество, дописывающее новых агентов по мере необходимости. Также у него открыта программа на Bountysource.

Установка


Здесь и далее мы будем рассматривать только серверную установку, потому что на домашней машине таким сервисам, очевидно, делать нечего. Сервис должен крутиться на отельной машине с выделенным адресом и прогнозируемым аптаймом и быть доступен с разных устройств, поэтому домашняя установка подойдет только для разработки.

Huginn распространяется в виде докер-образа, поэтому устанавливаем докер, затем просто запускаем:

  docker run -it -p 3000:3000 huginn/huginn

Ждём установки и запуска, затем идём на 3000 порт, логинимся под дефолтной учёткой admin:password и видим полностью готовый к работе сервис. По умолчанию в Huginn уже есть несколько агентов (они были на графе выше), но мы создадим свою цепочку с нуля.

Сначала создадим агента, читающего RSS-версию хабра:



Все доступные опции и общая информация для каждого агента указывается справа от полей, удобно. Пока нам не нужны никакие поля кроме url. Вставляем адрес, сохраняем, снова идём на /agents/new и делаем агента, реагирующего на данные от агента-читателя:



Затем создаём сценарий из этих двух агентов и ставим на запуск.

Beehive




В Beehive агенты называются ульями (hives) сейчас список на вики насчитывает 43 готовых улья. Они могут:

  • Читать и постить в социальных сетях и мессенджерах, пересылать посты из одного сервиса в другой. Поддерживаются Twitter, Telegram, Facebook (ограниченно), Slack, Discord, Tumblr, Mastodon, Jabber, Rocket.Chat, Gitter, IRC, Mumble
  • Мониторить сайты, RSS и OpenWeatherMap. Для веба также можно представляться не только клиентом, но и сервером, реагируя на входящие запросы.
  • Слать по триггеру HTTP-запросы, пуши, EMail, SMS, сообщения в любом из вышеперечисленных сервисов, постить на Pastebin, загружать файлы в S3.
  • Аггрегировать данные мониторинга из GitHub, Prometheus, Nagios
  • Использовать в качестве триггера не только стандартные ивенты и таймер, но и полноценный cron.
  • Выполнять произвольные команды из хост-системы
  • Мониторить отдельные каталоги в хост-системе
  • Управлять умным освещением, совместимым с Philips Hue

Многие ульи не занимаются конкретным заданием, а просто предоставляют отдельные фичи, вроде отправки данных по UDP. В целом количество интеграций в Beehive меньше, чем в Hugginn, но сделаны они функциональнее, а количество вариантов отправки данных вообще зашкаливает.

Установка


Нам снова потребуется докер и одна команда:

docker run -it -p 8181:8181 fribbledom/beehive

Вот только админка уверенно откажется загружаться из-за запросов на localhost, поэтому придётся пробросить адрес:

docker run -it CANONICAL_URL="http://personeltest.ru/away/your.ip.address.here:8181" -p 8181:8181 fribbledom/beehive


Авторизация не предусмотрена видимо, подразумевается что без аутентификации в админку просто не попасть.

Процесс создания заданий и цепочек целиком показан на гифках из репозитория:

Создаем наблюдателя и действие


Создаем цепочку


Node-RED


Здесь мы уже имеем дело не просто с агент-менеджером, а с полноценной платформой для организации задач, ориентированной не только на программистов, но и на обычных пользователей. Как и аналоги, Node-RED помимо использования готовых сценариев и модулей (нод) позволяет определять кастомные задачи, их логику и триггеры. Но если в других менеджерах любая кастомизация означает написание интерфейса (или целого модуля) с нуля или переписывание существующего, то здесь создавать все задачи и сценарии можно не выходя из браузера с помощью визуального программирования потоков данных. Создание модулей всё ещё требует навыков программирования, как и работа с API или ядром системы, но в целом из всех трёх вариантов только этот действительно близок к IFTTT по простоте использования, и помимо самого широкого функционала, у него еще и самое обширное сообщество, выкладывающее тысячи самописных модулей и сценариев.


Пример организации сценария

Установка


Node-RED предлагает несколько вариантов установки, включая npm, деплой в облака и даже установку на Raspberry Pi. Подробные инструкции по всем вариантам здесь, а вот простейшая установка докер-образа:

docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red

-v node_red_data:/data примонтирует каталог node_red_data в /data контейнера чтобы любые изменения, внесенные в сценарии, сохранялись.

Инстанс Node-RED будет доступен (без авторизации) на 1880 порту. Так как hello-world пример вообще не поможет понять довольно сложное устройство сценария, лучше прочитать полный туториал здесь.

Заключение


Можно с уверенностью сказать что повторить успех IFTTT в self-hosted не сможет ни один опенсорсный продукт слишком много времени и ресурсов придётся инвестировать в разработку, которая скорее всего не выстрелит и не принесёт доходов. Поэтому у всех трёх инструментов есть более узкая ниша: они помогают автоматизировать задачи не всем-и-каждому-в-два-клика, а только настоящим нёрдам, которые готовы писать свои модули и копаться в чужом коде, потому что именно им действительно важны недостатки бизнес-модели IFTTT, связывающей им руки.
Подведём итоги:

  • Hugginn покрывается много базовых сценариев из коробки, быстрое создание задач и сценариев. Продвинутые варианты требуют много кода и отладки, мало реально работающих интеграций со сторонними сервисами. Позволяет реализовывать базовую логику в сценариях.
  • Beehive много готовых интеграций, которые явно пишутся разработчиками в первую очередь для себя. Если ваш сценарий не основывается на сложной логике, а просто тащит данные из API и отдает их на обработку или отправку, то это самый быстрый вариант для запуска.
  • Node-RED возможность детально прорабатывать сценарии, огромное количество доступных модулей, сложно разобраться и запустить первый сценарий. Но зато потом можно сворачивать этой штукой горы.



На правах рекламы


VDSina предлагает мощные и недорогие VDS с посуточной оплатой для установки практически любого программного обеспечения. Интернет-канал для каждого сервера 500 Мегабит, защита от DDoS-атак включена в тариф, возможность установить Windows, Linux или вообще ОС со своего образа, а ещё очень удобная панель управления серверами собственной разработки. Обязательно попробуйте!

Подробнее..

Из песочницы Развертывание и настройка аутентификации node-red на docker-compose

28.06.2020 10:17:00 | Автор: admin

Развертывание и настройка аутентификации node-red на docker-compose


Развертывания node-red на docker-compose с включением авторизации и использованием docker volume.

Создаем файл docker-compose.yml:

version: "3.7"services:  node-red:    image: nodered/node-red    environment:      - TZ=Europe/Moscow    ports:      - "11880:1880" # 11880 - порт для подключения к контейнеру, 1880 - порт на котором работает node-red внутри контейнера.    volumes:      - "node-red:/data" # node-red - каталог который выделит docker для хранения данных, /data - каталог внутри контейнера.    restart: alwaysvolumes:  node-red: # создание каталога node-red на хосте.

Запускаем контейнер в отладочном режиме (первый запуск должен быть без ключа `-d`, для просмотра ошибок, когда такие появятся):

$ docker-compose up node-redCreating node-red_node-red_1_3e3e59f5e044 ... doneAttaching to node-red_node-red_1_bca4cb987984node-red_1_bca4cb987984 |node-red_1_bca4cb987984 | > node-red-docker@1.0.3 start /usr/src/node-rednode-red_1_bca4cb987984 | > node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"...

Останавливаем контейнер и запускаем команду для просмотра volume:

$ docker volume lsDRIVER              VOLUME NAMElocal               node-red_node-red

Просматриваем детальную информацию по volume:

$ docker volume inspect node-red_node-red[    {        "CreatedAt": "2020-05-02T18:37:33Z",        "Driver": "local",        "Labels": {            "com.docker.compose.project": "node-red",            "com.docker.compose.version": "1.23.0",            "com.docker.compose.volume": "node-red"        },        "Mountpoint": "/var/lib/docker/volumes/node-red_node-red/_data", # расоложение нашего каталога        "Name": "node-red_node-red",        "Options": null,        "Scope": "local"    }]

Переходим в каталог volume. В этом каталоге уже находятся фйлы которые docker создал при развертывании контейнера.

$ sudo ls /var/lib/docker/volumes/node-red_node-red/_datalib  package.json  settings.js

Нас интересует файл settings.js. Открываем его и ищем кусок кода adminAuth. Раскомментируем его.

 // Securing Node-RED    // -----------------    // To password protect the Node-RED editor and admin API, the following    // property can be used. See http://nodered.org/docs/security.html for details.    adminAuth: {        type: "credentials",        users: [{            username: "admin",            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",            permissions: "*"        }]    },

В ключ password: надо вставить hash пароля node-red.

Получение hash пароля node-red
На любую машину с node.js установить пакет node-red-admin.

npm i node-red-admin -g

Запустить пакет и задать пароль:

node-red-admin hash-pw


Запускаем контейнер и подключаемся к порту 11880.

http://192.168.0.100:11880/

Должно появиться окно авторизации.

image

Вводим логин-пароль.

Если все работает, перезапускаем контейнер с ключом -d.

$ docker-compose up -d node-red

Как-то так.
Подробнее..
Категории: Devops , Docker , Docker-compose , Node-red , Auth

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru