search
LoginSignup
121

posted at

updated at

Raspberry PiにおけるNode-REDの活用について

Raspberry PiにおけるNode-REDの活用について

IoT関連のプロトタイピングにRaspberry Piを活用する場合、開発環境としてNode-REDを使うことが多いと思います。しかし、Raspberry PiやNode-REDの活発な開発ペースに追い付かず、昨今の更新で書籍やWebページに書かれた内容が古くなっており、初心者の方が初めてRaspberry PiでNode-REDを使う場合に困ってしまうこともあると思います。

本稿では、Node-RED Advent Calendar 2018向けとして、2018年末以降、最新のRaspbian/Raspberry Pi OSにおけるNode-RED導入・活用方法をできるだけていねいに紹介します。将来の更新でここに記載した内容が最適でないことになるかもしれません。内容については最新情報に合わせて、できる限り修正していきたいと思いますので、編集履歴もご参照いただければと思います。

2022年7月26日現在、Node-REDのバージョンは3.0.2 / 2.2.2 / 1.3.7です。

Raspberry Piって何?

英国のRaspberry財団が提供する、小型で安価なLinux PCです。
rpi4b.png
(写真はRaspberry Pi 4B)

  • 産業用にも活用
    • 2012年2月の発売当初は教育用として開発されましたが、 低コストで大量に流通し入手性が高く、価格の割に高品質であることから 産業用途にも活用されています。(2021年ごろから半導体不足の影響で入手が困難になっています...)
  • IoTに最適
    • HDMI/Camera/USB/Ethernet/WiFi/Bluetooth/Audioなど一般的なPC同様のインターフェイスを持ち、さらにGPIO/UART/I2C/SPIなどの組み込み用途向けインターフェイスも備えるため、センサーやアクチュエータを備えたIoTゲートウェイとしての活用に向いています。
  • アプリが充実
    • Linux OSのDebianを最適化したRaspberry Pi OS(旧名Raspbian)というOSが提供されており、OSイメージをmicroSDカードへ導入して利用します。多数のアプリパッケージがRaspberry Piに最適化され配布されています。

Node-REDって何?

IBMのエンジニアが開発、のちに(2016年10月)JS Foundation(現OpenJS Foundation)に譲渡されたOSSのローコード開発環境です。
image.png

  • Webベースの開発環境
    • WebブラウザからFlow Editorとよばれる開発環境にアクセスし、Nodeとよばれる部品をつなげてFlowと呼ばれる処理を作成することで、アプリやサービスを簡単に開発することができます。
  • 再利用性と機能拡張
    • FlowをJSONフォーマットで書き出し、他のFlow Editorに読み込むことで簡単に再利用できます。
    • クラウドサービスとの連携やデバイスの活用などさまざまな機能を持つNodeが配布されており、簡単に追加インストールして機能拡張できます。
  • 高い移植性
    • Linux/Windows/MacOS/Android/iOSなどさまざまなOSの上で動作し、開発したFlowは互換性があるため、例えばクラウドサーバとRaspberry Piが連携するシステムをすべてNode-REDだけで開発できます。

Raspberry Pi OS(旧名Raspbian)の導入

Raspberry Pi OSの導入については、Qiita内にもたくさん紹介されているので詳細は割愛します。季刊で発売されているラズパイマガジンの巻末に、その時点での最新の導入方法が詳細に解説されていますので、まったくの初心者の方はRaspberry Piと一緒に購入するとよいでしょう。

Raspberry Pi OS(32bit)の、2022年10月現在の最新版は2022-09-22です。

image.png

「Raspberry Pi OS (32-bit) with desktop and recommended software」はNode-RED以外にも大きなサイズのアプリケーションが標準インストールされているのですが、その分配布イメージのサイズが大きいデメリットもあります。

  • 「Raspberry Pi OS (32-bit) with desktop and recommended software」 : 2700MB
  • 「Raspberry Pi OS (32-bit) with desktop」:890MB
  • 「Raspberry Pi OS (32-bit) Lite」338MB

頻繁に更新されるNode-REDに比べて、Raspberry Pi OSの更新頻度は緩やかですから、導入後はNode-REDのアップデートを行う必要があります。Node-REDを使うだけなら「Raspberry Pi OS (32-bit) with desktop」を導入後、少しの手間でNode-REDを導入できます。なお、LAN経由でPCのブラウザが使える場合は、「Raspberry Pi OS (32-bit) Lite」(CUIで、RaspberryPi本体のWebブラウザが使えません) でも大丈夫です。

また、2022-01-28版以降は64-bit版も提供されています。
https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit

image.png

Node-REDで使う上で基本的には32-bitでも64-bitでもあまり違いはありませんが、Raspberry Pi 4の8GB版を使う場合はブラウザでたくさんのタブを開いたときに効果があるかもしれません...
https://www.raspberrypi.com/news/raspberry-pi-os-64-bit/

イメージの書き込みは、https://www.raspberrypi.com/software/ からダウンロードできる「Raspberry Pi Imager」を使うのが簡単です。Windows版/MacOS版/Ubuntu版/Raspberry Pi OS版が準備されています。

image.png

Raspberry Pi Imager v1.7.1以降は、起動後に接続するWiFi設定や言語設定を導入前にできる設定ダイアログが有効になっています。Operation SystemでRaspberry Pi OSを選ぶと表示されるボタンで設定できます。
image.png

Raspberry Pi OSの導入後は、piユーザのパスワードを変更し(rootユーザのパスワードは設定してはいけません)、導入パッケージの更新をしておきましょう。「Raspberry Pi OS with desktop」で導入した場合は、初回起動時の設定ウィザード(piwiz)を最後まで実施していればすでにできています。「Raspberry Pi OS Lite」で導入された場合は、sudo raspi-config もしくは以下の手順です。

sudo passwd pi
sudo apt update
sudo apt upgrade

Raspberry Pi OSへのNode-REDのインストール

「Raspberry Pi OS (32-bit) with desktop and recommended software」を導入された場合、Node-REDは最初から導入されています。メニューの「プログラミング」にNode-REDがありますので、ここから実行できます。それ以外のイメージから導入された場合は、まずはインストールが必要です。

「Raspberry Pi OS (32-bit) with desktop」で導入した場合、Node-REDのインストールには、PIXEL Desktopのメニューにある「Recommended Software」を使っても導入できますが、時期によっては古いバージョンを導入することになり、導入後に別途更新作業が必要となり二度手間です。

Raspberry Pi OS 2022-09-22以降、Node-REDは標準導入されなくなっています。

おすすめのNode-RED導入方法としては、Node-REDのリポジトリでメンテナンスされているDebian用のインストールスクリプトupdate-nodejs-and-noderedスクリプトを最初から使いましょう。(まったく導入されていない状態から使えるスクリプトです)
公式ページ内のRunning on Raspberry Piで紹介されている

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

でインストールできますが、URLが長いので覚えにくいのが難点です。githubで提供されている短縮URLサービスを使って https://git.io/noderedlinux という短縮URLを作りましたので、コンソールから

wget https://git.io/noderedlinux
less noderedlinux
(スクリプトを確認※)
bash noderedlinux

で導入可能です。noderedlinux(update-nodejs-and-nodered)は内部でsudoしていますので、piユーザがsudoで管理者権限になれないように設定している場合以外は、piユーザで実行します。(rootユーザで実行するとスクリプトが確認してきます)

※なお、ダウンロードしてきたスクリプトを中身の確認をせず直接bashで実行するのはセキュリティのリスクがあるので、一応ダウンロードしたスクリプトの中身を確認してから実行しましょう。(2行目)

実行すると最初に、node.jsやNode-RED本体を再インストールするので、現在導入しているFlowが動かなくなる可能性がある旨の注意が表示されます。

This script checks the version of node.js installed is 12 or greater. It will try to
install node 14 if none is found. It can optionally install node 12 LTS or 14 LTS for you.
 
If necessary it will then remove the old core of Node-RED, before then installing the latest
version. You can also optionally specify the version required.
 
It also tries to run 'npm rebuild' to refresh any extra nodes you have installed
that may have a native binary component. While this normally works ok, you need
to check that it succeeds for your combination of installed nodes.
 
To do all this it runs commands as root - please satisfy yourself that this will
not damage your Pi, or otherwise compromise your configuration.
If in doubt please backup your SD card first.

(参考日本語訳)

このスクリプトはインストールされているnode.jsのバージョンが12以上であることをチェックします。
なにも見つからない場合はnode 14を導入します。オプション指定することで12 LTSか14 LTSを導入する
こともできます。

必要に応じて、古いNode-REDコアを削除したのち、最新のバージョンを導入します。
オプション指定で任意のバージョンを導入することもできます。

さらに、「npm rebuild」を実行してインストール済みの外部ノードのネイティブバイナリーコンポーネントを
更新します。普通は問題なく動作しますが、導入されたノードの相性によっては、きちんと完了したか確認する
必要があるかもしれません。

全てのコマンドはrootで実行されますので、自分自身であなたのラズパイに
ダメージを与えないようにするか、設定を変更してください。大丈夫かどうか
自信がない場合は、まずSDカードのバックアップを取ってください。

初回インストール時は関係ありませんので

Are you really sure you want to do this ? (y/N) 
本当にこれを実施しても大丈夫ですか? [y/N] ?

ではYを入力します。

次に、Raspberry Pi関係のノードをインストールするかどうか聞かれます。

Would you like to install the Pi-specific nodes ? (y/N)
ラズパイ固有のノードをインストールしてもいいですか? [y/N]

導入先はRaspberry PiですからYとすると、以下のNodeがインストールされます。
(すでにnode-red-node-serialportが導入されている場合は導入済みと判断され聞かれないようです)

node-red-node-pi-gpio
node-red-node-random
node-red-node-ping
node-red-contrib-play-audio
node-red-node-smooth
node-red-node-serialport

また、以下のスクリプトもインストールされます。

  • コマンドスクリプト
  • node-red-start (/usr/bin/node-red-start)
  • node-red-stop (/usr/bin/node-red-stop)
  • node-red-restart (/usr/bin/node-red-restart)
  • node-red-reload (/usr/bin/node-red-reload)
  • node-red-log (/usr/bin/node-red-log)
  • systemd スタートアップスクリプト(/lib/systemd/system/nodered.service)
  • ログローテート (/etc/logrotate.d/nodered)
Would you like to install the Pi-specific nodes ?

でNとすると、標準的なLinuxサーバへのNode-REDの導入となります。

導入自体はRaspberry Piの性能やインターネット回線にもよりますが、10分程度かかります。コンソールに進捗状況が表示されるので、ゆったり待ちましょう。途中でCtrl-Cで停止してしまうと面倒なことになりますのでガマンしましょう。

image.png

All done.
  You can now start Node-RED with the command  node-red-start
  or using the icon under   Menu / Programming / Node-RED
  Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880

Started: (開始日時)
Finished: (終了日時)

You may want to run node-red admin init
to configure your initial options and settings

と表示されると導入完了です。

※Node.jsのバージョンが10.22.xの際に、導入スクリプトが消去せず、Node v12.xが導入されないケースがありました。Node.jsの表記がv12より古い場合は、一度

sudo apt purge nodejs npm

してから、再度導入スクリプトを実行することで改善されました。

一度このスクリプトを使ってNode-REDを導入すると、以降はupdate-nodejs-and-noderedコマンドで最新版に更新できます。(実行時に更新スクリプト自体も更新されます) 新しいインストールスクリプトでは、スクリプト自身が導入されなくなりましたので、再度、最新版に更新する場合は、インストールスクリプトの取得から再実施してください。

Node-REDの起動と、FlowEditorへのアクセス

初回起動は、piユーザでコンソールからnode-red-startと入力しましょう。/home/pi/.node-red 配下に各種設定ファイルが導入されます。「Raspberry Pi OS (32-bit) with desktop」で導入した場合は、Raspberry PiのデスクトップにあるChromiumブラウザで http://127.0.0.1:1880 にアクセスするとFlow Editor画面が表示されます。

「Raspberry Pi OS (32-bit) Lite」の場合は、Raspberry Pi自身でブラウザを使えませんので、同じLANに接続されたPC等のブラウザから http://raspberrypi.local:1880/ にアクセスします。
mDNSが有効でない場合は、Raspberry PiのLAN内IPアドレスを調べた上、 http://IPアドレス:1880/ にアクセスします。

自動起動設定

初回起動後は起動してログ出力されているコンソールでCtrl-Cで停止してもログ出力のみ停止されNode-REDは停止しません。 node-red-stop コマンドでNode-REDを停止できます。停止した後はもう一度 node-red-start で起動することができます。node-red-log でコンソールに実行中のログがtail形式(最新のログを順次表示する)となり、Ctrl-Cで停止できます。

Raspberry Piの起動時に自動的にNode-REDを起動するには、インストールスクリプトで導入したsystemdスクリプトを用います。

sudo systemctl enable nodered.service

でNode-REDが自動起動するようになります。

sudo systemctl disable nodered.service

で自動起動が解除されます。

sudo systemctl status nodered.service

で自動起動状態を確認できます。

Node-REDの設定ファイル

初回起動後、Node-RED 2.2.xを導入した場合は、piユーザのホームディレクトリ配下の/home/pi/.node-redにNode-REDの設定ファイルが生成されます。

  • settings.js
  • flows.json
  • flows_cred.json
  • lib/
    • flows
  • node_modules/
  • .config.nodes.json
  • .config.projects.json
  • .config.runtime.json
  • .config.users.json

また、1.3.7を導入した場合は、以下の設定ファイルが生成されます。

  • settings.js
  • flows_ホスト名.json
  • flows_ホスト名_cred.json
  • lib/
    • flows
  • node_modules/
  • .config.json
  • .config.nodes.json
  • .config.projects.json
  • .config.runtime.json
  • .config.users.json

settings.js

Node-REDの挙動を設定するファイルです。javascript言語で記載されていますが、テキストエディタで編集することで、Node-REDの動作を変更することができます。
編集後に変更を反映するためには、Node-REDを再起動( node-red-restart コマンド )する必要があります。

設定ファイル生成コマンド(Node-RED 2.0.0以降)

Node-RED 2.0.0以降を導入した場合、設定ファイルsettings.jsはターミナルから管理コマンドnode-red admin initを使うことで対話的に生成することができます。初心者の方はこのツールを使って設定ファイルを作成するのが簡単です。
以下、()内は参考日本語訳です。

Node-RED Settings File initialisation 
(Node-RED 設定ファイル初期化)
=====================================
This tool will help you create a Node-RED settings file.
 (このツールはNode-REDの設定ファイルの生成を手助けします)

この設定ツールでは、入力が必要な個所は行頭に?が表示され、入力が確定するとが表示されます。

最初に、設定ファイルの位置を指定します。

? Settings file ‣ /home/pi/.node-red/settings.js

デフォルトでは/home/pi/.node-red/settings.jsですのでそのままエンターを押します。

? That file already exists. Are you sure you want to overwrite it? …
(そのファイルは既に存在しています。上書きしますか?) 
  Yes
▸ No

初回起動しているので、すでに設定ファイルがありますが、上書きするか確認されます。カーソルの上を押してYesの前に移動してエンターを押します。

次にセキュリティ設定です。

User Security (ユーザセキュリティ)
=============
? Do you want to setup user security? …
 (ユーザセキュリティを設定しますか?)
▸ Yes
  No

デフォルトでYesにカーソルがあります。後述しますが、ここで設定することにより、Flow Editorのログイン画面が表示されるようになります。そのままエンターを押します。

? Username ‣

ユーザ名を入力します。「admin」がよく使われるようです。

? Password ‣

設定するパスワードを入力します。他で使われていない、複雑な文字列を設定することをおすすめします。

? User permissions …
▸ full access
  read-only access

そのユーザで設定できる権限を選択します。「full access」を選択した場合は、フローを編集したりデプロイできます。「read-only access」はフローの参照のみ可能です。まず1つめのアカウントは「full access」を設定するとよいでしょう。

? Add another user? …
  Yes
▸ No

ここで「Yes」を選択することで複数のユーザを作成することができます。ユーザの指定が終わったら「NO」でエンターを押します。

Projects (プロジェクト機能)
========
The Projects feature allows you to version control your flow using a local git repository.
(プロジェクト機能は、ローカルgitリポジトリを使ってフローのバージョンコントロールを提供します)

? Do you want to enable the Projects feature? …
  Yes
▸ No

プロジェクト機能を設定する場合は、Yesでエンターを押します。設定しない場合はデフォルトのNOのままエンターを押します。

Yesを選択した場合は以下の設定になります。

? What project workflow do you want to use? …
(プロジェクトワークフローをどう使いますか?)
▸ manual - you must manually commit changes (手動: 変更のコミットを手動で行います)
  auto - changes are automatically committed (自動: 変更は自動的にコミットされます)

manualを選択すると、コミットは必要な時に手動で行います。autoを選択するとデプロイ時に自動で行われます。
なお、プロジェクト機能の詳細設定については、FlowEditorの次回起動時に表示される設定ウィザード、もしくは右上のハンバーガーメニューの「プロジェクト」から設定します。

Editor settings (エディタ設定)
===============
? Select a theme for the editor. To use any theme other than "default", you will need to install @node-red-contrib-themes/theme-collection in your Node-RED user directory. …
 (エディタのテーマを選択します。「Default」以外を選択した場合、@node-red-contrib-themes/theme-collection ノードの導入が必要となります)
▸ default
  dark
  midnight-red
  oled
  solarized-dark
  solarized-light

Flow Editorのテーマ設定をしたい場合は「default」以外を選択します。

? Select the text editor component to use in the Node-RED Editor …
▸ ace (default)
  monaco (new for 2.0)

FunctionノードやTemplateノードなどで使われる、FlowEditor内のテキストエディタを選択します。Node-RED 1.xで使われていたaceエディタがデフォルトですが、2.0.x以降で利用可能となったmonacoエディタを選択できます。

Node settings (Node設定)
=============
? Allow Function nodes to load external modules? (functionExternalModules) …
(Functionノードで、外部モジュールの読み込みを許可しますか?)
▸ Yes
  No

Node-RED 1.3.x以降で有効になった、Functionノード内で外部npmモジュールを読み込む機能 を有効にするかどうかを選択します。

設定項目は以上です。設定ファイルが書き出されます。

Settings file written to /home/pi/.node-red/settings.js
(設定ファイルは/home/pi/.node-red/settings.jsに書き出されました)

flows.jsonとホスト名 (Node-RED 1.x.xの場合)

flows.jsonはFlow Editorで設定したFlowが永続化された初期Flowファイルです。/home/pi/.node-redにあり、Flow Editorでデプロイした際、記述したFlowがJSON形式でファイルに保存され、ランタイムによって実行されます。Node-REDの起動時には、まずこのファイルよりFlowを読み込み実行します。

Node-RED 1.x.xの場合、settings.jsのデフォルト設定では、ファイル名はflows_ホスト名.jsonというように実行したホストのホスト名が付与されます。Raspberry Pi OS標準では、Raspberry Piのホスト名はraspberrypiとなっていますので、この状態でNode-REDの初回起動をすると、/home/pi/.node-red/flows_raspberrypi.jsonというファイル名で保存されます。

Raspberry Pi設定などでRaspberry Piのホスト名を変更すると、flows_ホスト名.jsonが見つからず、初期状態の空のFlow Editorが開くことになります。せっかく書いたFlowがなくなってしまったように見えますが、古いホスト名のflows_ホスト名.jsonに保存されています。ホスト名を変更した場合はflows_raspberrypi.jsonのファイル名も変更しておきましょう。

なお、/home/pi/.node-red にある settings.js の71行目付近(Node-RED 1.3.7の場合:Node-REDのバージョンによって変わります)

//flowFile: 'flows.json',

のコメントを外す(先頭の//を消去する)ことで、Node-RED再起動後の初期Flowファイルをホスト名を含まないflows.jsonというファイル名に設定することができます。LANの設定等でファイル名を頻繁に変更する場合は、この方法で初期Flowファイル名を固定しておくとよいでしょう。

Node-RED 2.0.x以降は、デフォルトでホスト名を含まない「flows.json」となっています ので変更の必要はありません。

セキュリティ設定

標準インストールしただけでは、IPアドレスがわかるとだれでもFlow Editorにアクセスできます。前述したようにRaspberry Pi OSではpiユーザが管理者権限をもちますので、Flow Editorからexecノードを使われてしまうと管理者権限でRaspberry Piの全操作が可能になってしまいます。まったくインターネットからアクセスできないRaspberry Piでも、最低でもログイン画面設定は実施するようにしましょう。

Flow Editorのログイン画面設定 (重要)

デフォルトでは、Raspberry Piのアドレスにアクセスするだけで、FlowEditorを開くことができますが、settings.jsを編集することで、Flow Editorにログイン認証を設定することができます。

設定ファイル生成コマンドを使う場合

前述のように、設定ファイル生成コマンドでは、 User SecurityYesにし、認証ユーザとパスワードを入力してください。

設定スクリプトを使う場合

Raspberry Pi上のNode-REDにパスワードを設定するスクリプト を参照ください。

手動編集する場合

/home/pi/.node-redにあるsettings.jsの130行目付近(Node-RED 1.3.7の場合)

    //adminAuth: {
    //    type: "credentials",
    //    users: [{
    //        username: "admin",
    //        password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
    //        permissions: "*"
    //    }]
    //},

の範囲の各行の先頭のコメントを外します。(//を消去)

password行の"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."の部分には、ダブルクォーテーションの内側の文字列をパスワード文字列から導出するハッシュ文字列で置き換えます。パスワードをhogefugaにしたい場合

node -e "console.log(require('/usr/lib/node_modules/node-red/node_modules/bcryptjs/dist/bcrypt.min.js').hashSync(process.argv[1], 8));" hogefuga
$2a$08$hUPzsT.Ql742RSOIHXDHH.GZFdVqvQQ9qlQZxJ8u/fQPUsy6IqMpy

(コマンド行長いので注意)のようにハッシュ文字列を導出できますので、それをsettings.js に記載します。ハッシュ文字列は実行毎に異なる文字列で、$で始まりスラッシュやドットを含む60文字になりますので、間違いないようコピーペーストします。

Node-RED 1.1.0以降は、node-red本体にnode-red-admin機能が組み込まれましたので、Node-RED導入後に

$ node-red admin hash-pw
Password: (パスワード入力:非表示)
$2b$08$7mwwlnt666Up9Ez1kqwY2Owl6a6559f8GttnICdBE6GT8KBjbn0UW

とすることでハッシュ文字列を取得できます。

ご注意:ハッシュ文字列の導出には Bcrypt Password Generator
のようなオンラインツールも利用できますが、サイトやツールによっては生成したパスワードをクラウドへ保存するようなものありますので、できれば上記の方法で、ローカル実施で導出した文字列を使うことをお勧めします。

記載後、node-red-restart コマンドでNode-REDを再起動することで、Flow Editorへのアクセス時に以下のようなログイン画面が表示されるようになります。
Node-RED-Login.png
ユーザ名はadmin、パスワードは上記で設定した元のパスワード文字列(ハッシュ文字列ではありません)を入力してログインします。

Flow Editorの認証をつけることで、Node-REDのadmin APiの利用にも認証が必要になり、ローカルLANからの攻撃を防ぐことができます。特別な理由がない限り、ログイン画面は必ず設定するようにしましょう。

なお、デフォルトでは、ログイン後7日間は再ログインすることなくFlow Editorの画面を利用できます。この期間を短くしたい場合は、adminAuth内にsessionExpiryTimeを追加し、有効期間を秒で指定します。例えば有効期限を1日(86400秒)にするには

    adminAuth: {
        sessionExpiryTime: 86400,
       type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$hUPzsT.Ql742RSOIHXDHH.GZFdVqvQQ9qlQZxJ8u/fQPUsy6IqMpy",
            permissions: "*"
        }]
    },

と記述します。

Flow EditorのURL変更

標準のインストール手順では、Flow EditorへのURLは前述のように http://IPアドレス:1880/ となっています。この状態だと、Node-REDを導入したホストのIPアドレスさえわかればFlow Editorにアクセスされてしまいます。また、静的コンテンツ配信時(後述)の相対パスに工夫が必要になります。

Flow EditorへのアクセスURLを変更することでFlow Editorのパスを分離することができます。
/home/pi/.node-redにあるsettings.jsの97行目付近(Node-RED 1.3.7の場合)/167行目付近(2.2.0の場合)

    //httpAdminRoot: '/admin',

の先頭のコメントを外します。(//を消去)
記載後、node-red-restart コマンドで再起動することで、Flow EditorへのアクセスURLはhttp://IPアドレス:1880/adminに変更されます。設定後、http://IPアドレス:1880/にブラウザでアクセスすると Cannot GET / 表示になり404エラーとなります。

また'/admin'を変えることでFlow Editor画面へのアクセスを任意のURLにできます。

コンテンツのアクセス認証

Node-RED を簡易WEBサーバーにするで紹介されているように、settings.jsの112行目付近(Node-RED 1.3.7の場合)/222行目付近(2.2.0の場合)

    //httpStatic: '/home/nol/node-red-static/',

のコメントを外してディレクトリを設定することで、Node-REDが静的コンテンツを配信できるWebサーバになります。この機能を活用することで、Node-REDのFlowで定義した動的コンテンツを組み合わせてWebサーバを構築することができますが、その際にデフォルト設定だとLAN内からは認証なしでコンテンツにアクセスできることになります。

また、一部のサードパーティノード(後述)は、それ自身が専用のWebUIを持ち、Webブラウザでアクセスすることで機能を提供します。(node-red-dashboardnode-red-contrib-web-worldmapなど)それらのWebUIコンテンツに対してアクセス認証をかけたい場合、settings.jsの143行目付近((Node-RED 1.3.7の場合)/125行目付近(2.2.0の場合)

    //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},

のコメントを外して、passの後の文字列にハッシュ文字列を指定することで、Digest認証を設定することができます。

httpStaticやhttpNodeAuthの引数に指定するハッシュ文字列は、FlowEditorのログイン認証に設定する場合と同様、

$ node-red admin hash-pw
Password:
$2b$08$7mwwlnt666Up9Ez1kqwY2Owl6a6559f8GttnICdBE6GT8KBjbn0UW

で求めることができます。(Node-RED 1.1.0以降)

Raspberry Piでおすすめのサードパーティノード

サードパーティノードの導入

Node-REDに標準で準備されているNodeだけでも十分に実用的なサービスが開発できますが、Node-REDには、パッケージ管理ツールnpmで開発・公開されたパッケージを読み込むことで機能拡張できるしくみがあり、一般的に「サードパーティノード」と呼ばれています。サードパーティノードの開発者がnpmにパッケージを公開すると、
Node-RED Nodesで紹介されます。

flows.png

Node-RED Nodesで紹介されているサードパーティノードはほとんどがFlow Editorの「パレットの管理」メニューから追加することができます。ノードを追加の検索欄にキーワードを入れることで、追加できるNodesが表示され、「ノードを追加」ボタンで追加できます。
customNodes.png

Raspberry PiのNode-REDでも同様にサードパーティノードを追加できますが、Nodeによっては追加に時間がかかったり、エラーがでて追加できないことがあります。固有の導入方法(事前に他のソフトウェアの導入が必要など)がある場合もありますので、「パレットの管理」で導入できない場合は、Debug画面に表示されたエラーメッセージや、各Nodeのドキュメントを参照してください。

カメラ

Raspberry Piにカメラを接続する場合、Raspberry Piの基板上にあるCSI(Camera Serial Interface)コネクタに接続するか、UVC(USB Video Class)を持つカメラをUSB接続することになります。カメラをCSIに接続する場合は、デフォルトでは有効になっていませんから、「Raspberry Pi設定」の「デバイス」タブで有効にする必要があります。コンソールからはraspi-configを使って対話的に設定する(5 Interfacing Options →P1 Camera)か、

sudo raspi-config nonint do_camera 0

で有効にできます。(参照: RaspberryPi: raspi-config コマンドラインから設定(ノンイタラクティブ) )

CSIインターフェイスに接続したカメラは、
node-red-contrib-camerapiをつかってカメラの仕様設定や画像の読み込み、エフェクトなどを利用することができます。
またUSB端子に接続したUVC仕様のカメラはsudo apt install fswebcamで導入したfswebcamコマンドを使うnode-red-contrib-usbcameraをつかって画像取得ができます。

GPIO (General-purpose input/output)

Raspberry Piにはプログラムで制御できるGPIOピンが26本あります。これらのピンはそれぞれデジタル入力・デジタル出力・PWM出力に設定することで、ON/OFFの信号を入出力したり、疑似的なアナログ値を出力することができるようになり、スイッチやセンサー、サーボやブザー、LEDなどを接続することができるようになります。

Node-REDから標準でRaspberry PiのGPIOを設定・制御するサードパーティノードとして、node-red-node-pi-gpioが提供されています。(導入時に「Would you like to install the Pi-specific nodes ?」をyとした場合は初期導入されています)

image.png

rpi-gpio in Nodeを使うことで、GPIOピンに接続したスイッチからON/OFF値を取得できます。
gpio1.png
※2019/10現在、Node-RED1.0のCSS仕様変更のせいか、表の文字ずれや翻訳が反映されていない箇所があります。
接続するGPIOピンを選択して、回路に適した抵抗をRegister (抵抗)メニューで選択します。

  • スイッチを3.3V端子と接続する場合は「プルダウン」を設定することで初期値0/スイッチON時に1出力
  • GND端子と接続する場合は「プルアップ」を設定することで初期値1/スイッチON時に0出力
  • 他のマイコン回路に接続する場合は「なし」を選択

さらにDebounce (デバウンス時間:スイッチのチャタリングを防ぐための、入力値を確定するまでの時間)を設定します。

rpi-gpio out Nodeを使うことで、GPIOピンに接続したLEDやサーボなどを動作させることができます。
image.png

接続するGPIOピンを選択して、デジタル出力(ON/OFFを数値0/1かBoolen True/Falseで設定)かPWM出力(0-100の数値でパルス幅を指定)
できます。

なお、Raspberry PiのGPIO端子は3.3Vトレラントですから、他の電圧のデバイスは直接接続できません。レベル変換器が必要にあります。

基板のステータスLED(緑)を操作する

基板に搭載されたステータスLED(緑)を、GPIOノードで操作することができます。詳細は [Node-REDからRaspberry PiのステータスLEDを操作する]
(https://qiita.com/utaani/items/91cddca178148266fcdc) を参照してください。

I2C

I2C(Inter-Integrated Circuit)はフィリップ社が提唱した周辺デバイスとのシリアル通信の方式で、1台のマスターと最大112台のスレーブを2線の通信線と電源を接続するだけでで100kbit/sもしくは400kbit/sでクロック同期通信ができます。EEPROMやセンサーのインターフェイスにI2Cを採用したものが多数あります。Raspberry Piでは2つのI2Cバスを搭載していますが、そのうち一つがGPIOピン端子(SDA:3pin SCL:5pin)に配線されており、/dev/i2c-1として使うことができます。Raspbery Pi 3の場合は、i2c-gpioというソフトウェアエミュレーションしたI2Cドライバを用いて複数のI2Cバスを追加することができるようです。

Raspberry PiのGPIO端子は3.3Vトレラントですから、5Vのデバイスは直接接続できません。I2C対応のレベル変換器が必要にあります。

Raspberry Piの起動時初期設定では、I2Cバスは有効になっていません。有効にするには、DESKTOP版の場合は「Raspberry Pi設定」の「デバイス」タブでI2Cを有効にします。コンソールからはraspi-configを使って対話的に設定する(5 Interfacing Options →P5 I2C)か、

sudo raspi-config nonint do_i2c 0

で有効にできます。(参照: RaspberryPi: raspi-config コマンドラインから設定(ノンイタラクティブ) )

いずれの方法でも、設定後は再起動が必要となります。

Node-REDからI2C周辺機器を使う場合、サードパーティノードnode-red-contrib-i2cが使えます。
i2cbus.png

なお、ADRESS/Commandは、FlowEditorのパネル内で設定する場合は10進数で入力する必要がありますので注意が必要です。

また node-red-contrib-brads-i2c-nodesでセンサーmcp9808/bmp180/bmp280/bme180/htu21d/tsl2561が使えます。ほかにもI2Cデバイスに対応したサードパーティノードがありますので、デバイス名で検索してみてください。

Seeed Studioの Grove System http://www.seeedstudio.com/wiki/Grove_System のデバイスにも、I2Cを使うものがあり、3.3Vのもの はケーブルを自作することで、Raspberry PiのGPIOピンに直結して使うことができます。
gpiogrove.png

その他、Raspberry PiでNode-REDを使う場合の注意点

Raspberry PiのCPUアーキテクチャによる差異

インストールスクリプト update-nodejs-and-nodered はnode.jsをバイナリインストールします。実行するRaspberry Piのアーキテクチャに合わせてインストールします。同じ32-bit版でも古いRaspberry Pi (A, B, A+, B+, Zero, Zero W)のCPUアーキテクチャはarm6lので、例えばRaspberry Pi 3B上でインストールスクリプトによって導入したmicroSDを、Raspberry Pi ZeroWに挿入してもNode-REDは動作しません。インストールメディアは動作予定のRaspberry Piと同じ機種で作成するようにしましょう。

どんどん更新していきます。

Raspberry PiでNode-REDを使う際に気を付けた方がいいことや、本稿の間違い等ありましたらコメントでお寄せいただければ幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
121