Node-RED:Введение/Запуск на Raspberry Pi

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запуск на Raspberry Pi[1]

Мы рекомендуем устанавливать Node-RED на Pi при помощи скрипта ниже, но Node-RED также можно установить из приложения Recommended Software, установленного на SD-образ Raspbian, который можно загрузить с RaspberryPi.org. Если вы воспользуетесь вторым способом, то рекомендуем также обновить Node-RED при помощи скрипта из первого способа.

Node-RED больше не поддерживает Node.js версии 4.x и старее. Последней версией Node-RED, поддерживающей 4.x, была 0.19.6.

Установка и обновление

Если у вас установлена Raspbian или другая ОС на базе Debian (вроде Ubuntu или Diet-Pi), на которую Node-RED еще не установлен, то его можно установить или обновить при помощи команды-скрипта ниже:

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Если у вас установлена мини-версия Debian, то вам перед этим скриптом, возможно, понадобится запустить команду «sudo apt-get install build-essential», чтобы собрать и установить «serialport». Но это опционально.

Описание скрипта

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

  • обновить текущего пользователя до Node.js LTS 8.x/10.x и последней версии Node-RED;
  • переместить все глобально установленные ноды в пользовательскую папку «~/.node-red», чтобы ими можно было управлять через меню Palette;
  • опционально (пере)установить дополнительные ноды, которые были предустановлены на полном образе Raspbian;
Примечание

Этот скрипт не обновляет уже имеющиеся ноды, установленные пользователем. Пользователь должен сделать это вручную (см. ниже).

Этот скрипт предназначен для Pi, но его можно запустить на любой ОС, основанной на Debian (вроде Ubuntu), а также на других аппаратных платформах (но тестировался он не очень широко).

Кроме того, этот скрипт запускает много команд через «sudo», а также удаляет текущий Node.js и основные директории Node-RED. Все команды скрипта можно посмотреть по этой ссылке.

Скрипт выполняет следующие действия:

  • Спрашивает, хотите ли вы (пере)установить дополнительные ноды Pi;
  • Сохраняет список всех глобально установленных нодов «node-red-», найденных в «/usr/lib/node_modules»;
  • Запускает «apt-get remove nodered»;
  • Удаляет все бинарные файлы Node-RED из «/usr/bin» и «/usr/local/bin»;
  • Удаляет все модули Node-RED из «/usr/lib/node_modules» и «/usr/local/lib/node_modules»;
  • Определяет, откуда был установлен Node.js – из пакета Node.js или Debian;
  • Удаляет (если необходимо) Node.js, если его версия – это не 8.x или старее, а затем устанавливает последнюю версию LTS v8 или v10 (не с помощью «apt»);
  • Очищает кэш «npm» и кэш «.node-gyp», чтобы удалить все прежние версии кода;
  • Устанавливает последнюю версию Node-RED;
  • Переустанавливает под аккаунтом пользователя все ноды, которые ранее были установлены глобально;
  • Переустанавливает дополнительные Pi-ноды (если необходимо);
  • Пересобирает все ноды (с целью перекомпиляции всех бинарных файлов, чтобы они соответствовали последней версии Node.js);
  • Добавляет в «/usr/bin» команды «node-red-start», «node-red-stop» и «node-red-log»;
  • Добавляет иконку и ярлык для меню;
  • Добавляет systemd-скрипт и задает пользователя;
  • Если это Pi, добавляет IoT-пример для измерения температуры CPU;

Дисклеймер

Этот скрипт тестировался только на версиях с небольшим количеством дополнительных нод. Он пытается пересобрать все ноды с нативными плагинами, которые вы установили в папку «~/.node-red». Этот процесс может пойти неудачно, поэтому вам, возможно, нужно будет вручную пересобрать или переустановить некоторые ноды, установленные вами ранее.

Чтобы пересобрать ноды, воспользуйтесь следующими командами:

cd ~/.node-red
npm rebuild

Чтобы увидеть список уже установленных нод, воспользуйтесь следующими командами:

cd ~/.node-red
npm ls --depth=0
Примечание

Этот скрипт не обновляет ноды, установленные локально. Чтобы сделать это, перейдите в пользовательскую папку и запустите команды ниже. Если вам нужны строго определенные версии некоторых нодов, то это можно сделать с помощью ручного редактирования файла «package.json» (т.е. вам нужно будет указать нужные вам версии), который находится в этой директории. Это нужно делать до запуска команды «npm update».

cd ~/.node-red
npm outdated
npm update

Смена SD-карт

Разные версии Raspberry Pi используют разные процессоры ARM, а бинарные файлы Node.js для ARM6 отличаются от бинарных файлов для ARM7. Впрочем, если вы переставите SD-карту с ARM6 на ARM7 (например, с Pi Zero на Pi 3), то ничего страшного. Но если вы переставите карту обратно, то ничего не выйдет. Вам нужно будет переустановить Node.js и перезапустить обновляющий скрипт, чтобы установить соответствующую версию Node.js.

Запуск Node-RED

Запустить Node-RED можно двумя способами:

  • В интерфейсе ОС кликните на «Menu» > «Programming» > «Node-RED»
  • В новом окне терминала запустите команду «node-red-start»
Примечание

Если закрыть окно (или нажать  Ctrl + C ), то Node-RED все равно продолжит работать, но в фоновом режиме.

Чтобы остановить Node-RED, запустите команду «node-red-stop».

Чтобы посмотреть логи, запустите команду «node-red-log».

Автозапуск при загрузке

Если вам нужно, чтобы Node-RED запускался при загрузке Pi, запустите следующую команду:

sudo systemctl enable nodered.service

Чтобы отключить автозапуск при загрузке, воспользуйтесь следующей командой:

sudo systemctl disable nodered.service

Добавление нод в предустановленную версию Raspbian

Если вы не обновили предустановленную версию Raspbian до последней версии при помощи скрипта выше, то для установки дополнительных нод вам сначала нужно будет установить менеджер пакетов «npm», т.к. его нет в версии Raspbian, устанавливаемой по умолчанию. Но это необязательно, если вы обновились при помощи скрипта выше.

Команды ниже устанавливают «npm» и обновляют его до последней версии:

sudo apt-get install npm
sudo npm install -g npm
hash -r
cd ~/.node-red
npm install node-red-{название-ноды}

Что дальше

Вам нужно будет перезапустить Node-RED. Затем вы можете начать пользоваться редактором.

Примечание

В данный момент разработка Debian/Raspbian Wheezy почти не ведется, поэтому Node-RED их тоже не поддерживает. Эта документация ориентирована как минимум на Jessie.

Доступ к GPIO-контактам

Если вы планируете с помощью Node-RED использовать GPIO-контакты Raspberry Pi, вам нужно проверить, какая у вас установлена версия Python-библиотеки RPi.GPIO.

В комплекте с Node-RED идет RPi-скрипт «nrgpio», предназначенный для взаимодействия с аппаратными GPIO-контактами Raspberry Pi. Если вы установили глобальный npm-модуль, то этот скрипт должен быть расположен либо здесь...

/usr/lib/node_modules/node-red/nodes/core/hardware/nrgpio ver

...либо здесь...

/usr/local/lib/node_modules/node-red/nodes/core/hardware/nrgpio ver

Если у вас Pi2, то версия библиотеки RPi.GPIO должна быть как минимум 0.5.11, а если оригинальная Pi – как минимум 0.5.8. Если это не так, то воспользуйтесь командой ниже, чтобы установить самую последнюю версию библиотеки:

sudo apt-get update && sudo apt-get install python-rpi.gpio

Кроме того, текущий пользователь должен быть членом группы «gpio». Чтобы добавить текущего пользователя в эту группу, воспользуйтесь следующей командой:

sudo adduser $USER gpio

Если вы хотите запускать команды не только как пользователь «pi» или «root», то вам нужно будет либо добавить этого пользователя в список «sudoers», либо просто открыть Python. К примеру, при помощи команды ниже и «visudo» можно добавить в группу «sudoers» пользователя «NodeREDusername»:

NodeREDusername ALL=(ALL) NOPASSWD: /usr/bin/python

Запуск Node-RED

Память Raspberry Pi относительно мала, поэтому Node-RED на этой платформе нужно запускать при помощи команды «node-red-pi». Она позволяет запустить Node-RED вместе с дополнительным аргументом, задающим, с какого момента Node.js начнет освобождать неиспользованную память.

То есть вместе с командой «node-red-pi» нужно указать флаг «--max-old-space-size»:

node-red-pi --max-old-space-size=256

Если вы хотите запустить Node-RED напрямую – при помощи команды «node» – этот флаг нужно поместить между «node» и «red.js»:

node --max-old-space-size=256 red.js

Этот флаг задает размер памяти, который сможет использовать Node-RED до того, как Pi начнет ее очищать. Если на вашей Pi больше ничего не запущено, вы можете задать здесь 256 Мб или даже выше. О количестве доступной памяти можно узнать при помощи команды «free -h».

Примечание

Предустановленная версия Node-RED на Raspbian, использующая команду «node-red-start», тоже по умолчанию выставляет этот показатель на 256 Мб. Если вы хотите поменять его, то вам (через «sudo») нужно отредактировать файл «/lib/systemd/system/nodered.service». О том, как задать эту настройку в установленной вручную версии Node-RED, читайте ниже.

Автозапуск Node-RED при помощи SystemD

Автозапуск Node-RED предпочтительней делать через при помощи встроенного демона systemd. Предустановленная версия делает это при помощи файла «nodered.service», а также при помощи скриптов запуска и остановки. Их можно установить с помощью следующих команд:

sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
sudo chmod +x /usr/bin/node-red-st*
sudo systemctl daemon-reload
Примечание

Эти команды запускаются пользователем «root» («sudo»). Они загружают три файла в корректные места, делают два скрипта исполняемыми, а затем перезагружают демона systemd. После этого Node-RED можно будет запускать и останавливать с помощью команд «node-red-start» и «node-red-stop».

Далее, чтобы настроить автозапуск Node-RED при каждой загрузке или краше, воспользуйтесь:

sudo systemctl enable nodered.service

Отключить автозапуск можно при помощи следующей команды:

sudo systemctl disable nodered.service

Демон systemd использует для логов файл «/var/log/system.log». Для фильтрации данных в этих логах воспользуйтесь следующей командой:

sudo journalctl -f -u nodered -o cat

Установка переменной окружения (systemd) – при помощи не «pi», а другого пользователя

Чтобы выполнить что-то не пользователем «pi», который используется по умолчанию, а другим пользователем, вам нужно при помощи «sudo» отредактировать файл «/lib/systemd/system/nodered.service», указав нужного пользователя вместо {ваш_пользователь}.

...
[Service]
Type=simple
# Запустите, как обычно, от пользователя «pi»,
# но в строчках ниже укажите пользователя,
# с помощью которого вам нужно запустить Node-RED:
User={ваш_пользователь}
Group={ваш_пользователь}
WorkingDirectory=/home/{ваш_пользователь}
Nice=5
Environment="PI_NODE_OPTIONS=--max_old_space_size=256"
...

Сохраните файл, а потом запустите:

sudo systemctl daemon-reload

Установка переменной окружения (systemd) – использование прокси

Если вам для HTTP-запросов необходимо использовать прокси, то вам нужно задать переменную окружения «HTTP_PROXY». При использовании systemd это нужно делать с помощью редактирования (через «sudo») файла «/lib/systemd/system/nodered.service» – добавления еще одной строчки с «Environment=». Например, вот так:

...
Nice=5
Environment="NODE_OPTIONS=--max-old-space-size=128"
Environment="HTTP_PROXY=my-proxy-server-address"
...

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

sudo systemctl daemon-reload

Затем остановите и перезапустите Node-RED.

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

После запуска Node-RED вам нужно будет ввести в браузер IP-адрес устройства, на котором был запущен Node-RED, а затем нажать на  ↵ Enter . IP-адрес выглядит примерно так:

http://{the-ip-address-returned}:1880/

Один из способов найти IP-адрес Pi – это вот эта команда:

hostname -I
Примечание

Браузером по умолчанию в Raspbian, как правило, является Epiphany. Он немного чудит, поэтому некоторые горячие клавиши редактора Node-RED в нем почему-то не работают. Мы настоятельно рекомендуем установить вместо него Firefox-ESR или Chromium:

sudo apt-get install firefox-esr

В более новых версиях Raspbian по умолчанию стоит Chromium. Он исправно работает, но подтормаживает на Pi1 и Zero.

В принципе, после всех этих настроек вы можете приступить к созданию своего первого потока.

Дополнительные ноды

Как правило, дополнительные ноды можно установить при помощи графического редактора Node-RED, кликнув на кнопку с тремя полосками справа вверху, а затем на «Manage palette». Чтобы установить дополнительные ноды вручную, сначала нужно перейти в пользовательскую директорию. По умолчанию это «~/.node-red».

cd ~/.node-red

В библиотеке потоков Node-RED есть дополнительные ноды, предназначенные для работы с некоторыми устройствами (например, с Pi-модулями Pibrella, PiFace и LEDBorg, светодиодами Neopixel, температурными датчиками и т.д.). Например, ноду «node-red-node-pi-gpiod», позволяющую получить удаленный доступ к GPIO-контактам Pi и управлять сервоприводами, можно установить следующим образом:

cd ~/.node-red
npm install node-red-node-pi-gpiod

После этого вам нужно будет остановить и снова запустить Node-RED, чтобы загрузить новые ноды, а затем обновить страницу редактора Node-RED в браузере:

node-red-stop
node-red-start

Взаимодействие с GPIO-контактами Pi

Есть несколько способов взаимодействия с Raspberry Pi при помощи Node-RED.

  • Ноды «rpi-gpio» (по умолчанию)
    • Их можно найти в меню «Manage palette». Они предназначены для мониторинга и управления GPIO-контактами. Рекомендуем использовать именно этот метод, т.к. он самый простой.
  • Ноды «contrib-gpio» (опционально)
    • Дополнительные универсальные ноды от GitHub-пользователя @monteslu, предоставляющие доступ к GPIO-контактам Pi, BeagleBone, Arduino, Edison и т.д. Установить их можно отсюда.
  • Модуль «wiring-pi» (продвинутый метод)
    • Эта библиотека дает более полный доступ к GPIO-контактам Pi и другим устройствам при помощи нодов «function». Это дает больше контроля над возможностями Pi, которых нет в нодах, но программировать их нужно будет самостоятельно.

Ноды «rpi-gpio»

Для работы с этими нодами используется Python-команда «nrgpio», установленная в Node-RED по умолчанию. Она позволяет управлять GPIO-контактами Pi при помощи нод из «палитры» Node-RED. Но для этого пользователь должен находиться в группе «gpio».

sudo adduser $USER gpio

Управление GPIO-контактом – Поток для мигания светодиодом

В JSON-коде ниже представлен поток, включающий/выключающий светодиод, подключенный к 11-му GPIO-контакту Pi. О том, как собрать цепь для этого проекта, читайте тут.

Скопируйте JSON-код ниже, кликните в редакторе Node-RED на кнопку с тремя полосками (она находится справа вверху), а затем на «Import» > «Clipboard» (или просто нажмите на  Ctrl + I ). Откроется новое окно, вставьте JSON-код в поле посередине этого окна, а затем нажмите на «Import». Теперь разместите поток в рабочей области редактора и кликните левой кнопкой мыши.

[{"id":"ae05f870.3bfc2","type":"function","name":"Toggle 0/1 on input","func":"\ncontext.state = context.state || 0;\n\n(context.state == 0) ? context.state = 1 : context.state = 0;\nmsg.payload = context.state;\n\nreturn msg;","outputs":1,"x":348.1666488647461,"y":146.16667652130127,"wires":[["1b0b73e9.14712c","b90e5005.a7c3b8"]]},{"id":"1b0b73e9.14712c","type":"debug","name":"","active":true,"x":587.1666488647461,"y":206.1666774749756,"wires":[]},{"id":"7aa75c69.fd5894","type":"inject","name":"tick every 1 sec","topic":"","payload":"","repeat":"1","crontab":"","once":false,"x":147.1666488647461,"y":146.1666774749756,"wires":[["ae05f870.3bfc2"]]},{"id":"b90e5005.a7c3b8","type":"rpi-gpio out","name":"","pin":"7","x":585.0000114440918,"y":146.00001049041748,"wires":[]}]

Теперь кликните на красную кнопку «Deploy» (она находится справа вверху) – это запустит поток, а светодиод начнет мигать с периодичностью в одну секунду.

Модуль «wiring-pi»

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

RPi-версия Node-RED имеет Node.js-обертку для ранее установленной библиотеки WiringPi, что дает всем функциям, написанным вами, постоянный доступ к функциям Raspberry Pi. Благодаря этому вы сможете делать более сложные вещи, но для этого вам нужно будет писать код внутри нод «function», а не только перемещать и подсоединять друг к другу ноды в редакторе Node-RED.

Установка

После установки Node-RED установите библиотеку Wiring-Pi. О том, как это сделать, читайте тут.

Настройка Node-RED

Во-первых, npm-модуль «wiring-pi» должен быть установлен в ту же директорию, где находится файл «settings.js».

cd ~/.node-red
npm install wiring-pi

Это не добавляет в Node-RED никаких нод, но благодаря этому модуль «wiring-pi» теперь можно использовать в нодах «function».

Для этого вам нужно отредактировать файл «settings.js», добавив в секцию «functionGlobalContext» модуль «wiring-pi»:

functionGlobalContext: {
    wpi: require('wiring-pi')
}

Теперь этот модуль доступен всем функциям, написанными в контексте «context.global.wpi».

Поток для мигания светодиодом с помощью Wiring-Pi

В JSON-коде ниже представлен поток, включающий/выключающий светодиод, который подключен к 11-ому (в терминологии Wiring-Pi – 0-ому) GPIO-контакту Raspberry Pi. О том, как собрать цепь для этого проекта, читайте тут.

Скопируйте JSON-код ниже, кликните в редакторе Node-RED на кнопку с тремя полосками (она находится справа вверху), а затем на «Import» > «Clipboard» (или просто нажмите  Ctrl + I ). Откроется новое окно – вставьте в него JSON-код и нажмите на «Import». После этого разместите поток в рабочей области редактора Node-RED и нажмите на левую кнопку мыши.

[{"id":"860e0da9.98757","type":"function","name":"Toggle LED on input","func":"\n// select wpi pin 0 = pin 11 on header (for v2)\nvar pin = 0;\n\n// initialise the wpi to use the global context\nvar wpi = context.global.wpi;\n\n// use the default WiringPi pin number scheme...\nwpi.setup();\n\n// initialise the state of the pin if not already set\n// anything in context.  persists from one call to the function to the next\ncontext.state = context.state || wpi.LOW;\n\n// set the mode to output (just in case)\nwpi.pinMode(pin, wpi.modes.OUTPUT);\n\n// toggle the stored state of the pin\n(context.state == wpi.LOW) ? context.state = wpi.HIGH : context.state = wpi.LOW;\n\n// output the state to the pin\nwpi.digitalWrite(pin, context.state);\n\n// we don't \"need\" to return anything here but may help for debug\nreturn msg;","outputs":1,"x":333.16666412353516,"y":79.16666793823242,"wires":[["574f5131.36d0f8"]]},{"id":"14446ead.5aa501","type":"inject","name":"tick","topic":"","payload":"","repeat":"1","once":false,"x":113.16666412353516,"y":59.16666793823242,"wires":[["860e0da9.98757"]]},{"id":"574f5131.36d0f8","type":"debug","name":"","active":true,"x":553.1666641235352,"y":99.16666793823242,"wires":[]}]

Далее кликните на красную кнопку «Deploy» справа вверху – это должно запустить поток, а светодиод должен начать включаться/выключаться раз в секунду.

См.также

Внешние ссылки