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

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

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

2025年3月16日現在、Node-REDのバージョンは[4.0.9](https://github.com/node-red/node-red/releases/tag/4.0.9) [3.1.15](https://github.com/node-red/node-red/releases/tag/3.1.15) です。

## Raspberry Piって何？
英国の[Raspberry財団](https://www.raspberrypi.org/)が提供する、小型で安価なLinux PCです。
![rpi4b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/0a832cde-b566-7523-53e1-2a2fc9977490.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](https://openjsf.org/))に譲渡されたOSSのローコード開発環境です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/e3c1e325-4bef-a949-00e4-90bcd16115bb.png)

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

## Raspberry Pi OS(旧名Raspbian)の導入
Raspberry Pi OSの導入については、Qiita内にもたくさん紹介されているので詳細は割愛します。季刊で発売されている[ラズパイマガジン](https://trendy.nikkeibp.co.jp/rasmag/)の巻末に、その時点での最新の導入方法が詳細に解説されていますので、まったくの初心者の方はRaspberry Piと一緒に購入するとよいでしょう。

Raspberry Pi OS(32bit)の、2025年6月現在の最新版は[2025-05-13](https://qiita.com/utaani/items/6f96b1f3da10475100e1)です。

https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/50baedbf-919f-49e7-8abf-235d25133d92.png)



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

 * 「Raspberry Pi OS (32-bit) with desktop and recommended software」 : 2767MB
 * 「Raspberry Pi OS (32-bit) with desktop」:1165MB
 * 「Raspberry Pi OS (32-bit) Lite」493MB

頻繁に更新される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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/520e3788-9c90-4156-87fc-1b9049e3eadc.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版が準備されています。

https://www.raspberrypi.com/software/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/09e52d7f-46c4-319c-8d7a-483058737028.png)


Raspberry Pi Imager v1.8.1以降は、デバイスごとに異なる最適イメージを選択しやすくするため、対象デバイスを選択してからOSを選択するようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/520edeb3-f572-cbaf-ef63-bcde77c0dfbd.png)

[次へ] をクリックして、OSの初期設定を実施するか選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/9a09e1d5-3816-0892-8189-34990c7614e9.png)

[設定を編集する]で、ホスト名やログインユーザ名/パスワード、Wi-Fiの初期設定を実施できます。最近のRaspberry Pi OSでは、デフォルトユーザ「pi」は推奨されておらず、ログインに使うユーザを「pi」以外で登録しておくことが必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/39a2067d-d989-a8f8-a1d1-30ac81627ffc.png)


Raspberry Pi OSの導入後は、導入パッケージの更新をしておきましょう。「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のインストール

以前の版では、Node-REDが事前導入されていたものもありましたが、Raspberry Pi OS 2022-09-22以降、Node-REDは標準導入されなくなっています。

おすすめのNode-RED導入方法としては、Node-REDのリポジトリでメンテナンスされているDebian用のインストールスクリプト[update-nodejs-and-nodered](
https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)スクリプトを最初から使いましょう。(まったく導入されていない状態から使えるスクリプトです)
公式ページ内の[Running on Raspberry Pi](https://nodered.org/docs/getting-started/raspberrypi)で紹介されている

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

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

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

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

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

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

```
This script checks the version of node.js installed is 16 or greater. It will try to
install node 20 if none is found. It can optionally install node 16, 18, or 20 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.

See the optional parameters by re-running this command with --help
```

(参考日本語訳）

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

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

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

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

このコマンドに --help をつけて実行しなおすことでオプションのパラメータを確認できます
```


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

```
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-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-contrib-buffer-parser
```
また、以下のスクリプトもインストールされます。

- コマンドスクリプト
  - 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/9ba7f9c3-00f3-bc68-07c2-b851cf75798e.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-REDの起動と、Flow Editorへのアクセス
初回起動は、ログインユーザでコンソールから`node-red-start`と入力しましょう。`/home/(ユーザー名)/.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の設定ファイル
初回起動後、ログインユーザのホームディレクトリ配下の`/home/(ユーザー名)/.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
 

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

### 設定ファイル生成コマンド(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/(ユーザー名)/.node-red/settings.js
```
デフォルトでは`/home/(ユーザー名)/.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にカーソルがあります。[後述します](#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9A)が、ここで設定することにより、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
```

[プロジェクト機能](https://nodered.jp/docs/user-guide/projects/)を設定する場合は、Yesでエンターを押します。設定しない場合はデフォルトのNOのままエンターを押します。

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

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

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


```
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ノードなどで使われる、Flow Editor内のテキストエディタを選択します。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モジュールを読み込む機能](https://nodered.jp/docs/user-guide/writing-functions#functionexternalmodules-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86) を有効にするかどうかを選択します。

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

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


<details><summary>flows.jsonとホスト名 (Node-RED 1.x.xの場合) </summary>
`flows.json`はFlow Editorで設定したFlowが永続化された初期Flowファイルです。`/home/(ユーザー名)/.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/(ユーザー名)/.node-red/flows_raspberrypi.json`というファイル名で保存されます。

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

なお、`/home/(ユーザー名)/.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」となっています](https://nodered.org/blog/2021/07/20/version-2-0-released#default-flows-file-name) ので変更の必要はありません。
</details>

## セキュリティ設定
標準インストールしただけでは、IPアドレスがわかるとだれでもFlow Editorにアクセスできます。前述したようにRaspberry Pi OSではpiユーザが管理者権限をもちますので、Flow Editorからexecノードを使われてしまうと管理者権限でRaspberry Piの全操作が可能になってしまいます。まったくインターネットからアクセスできないRaspberry Piでも、**最低でも[ログイン画面設定](#flow-editor%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E8%A8%AD%E5%AE%9A-%E9%87%8D%E8%A6%81)は実施する**ようにしましょう。

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

#### 設定ファイル生成コマンドを使う場合
[前述のように](#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%94%9F%E6%88%90%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89node-red-200%E4%BB%A5%E9%99%8D)、設定ファイル生成コマンドでは、 `User Security`を`Yes`にし、認証ユーザとパスワードを入力してください。

#### 設定スクリプトを使う場合
[Raspberry Pi上のNode-REDにパスワードを設定するスクリプト](https://qiita.com/utaani/items/7a2a40a4547e4ba7d85c) を参照ください。

#### 手動編集する場合
`/home/(ユーザー名)/.node-red`にある`settings.js`の76行目付近(Node-RED 4.0.9の場合)

```
    //adminAuth: {
    //    type: "credentials",
    //    users: [{
    //        username: "admin",
    //        password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
    //        permissions: "*"
    //    }]
    //},
```
の範囲の各行の先頭のコメントを外します。(//を消去)

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

Node-RED 1.1.0以降は、node-red本体に[node-red-admin機能が組み込まれました](https://nodered.org/blog/2020/06/30/version-1-1-released#node-red-admin-built-in)ので、Node-RED導入後に

```
$ node-red admin hash-pw
Password: (パスワード入力:非表示)
$2b$08$7mwwlnt666Up9Ez1kqwY2Owl6a6559f8GttnICdBE6GT8KBjbn0UW
```
とすることでハッシュ文字列を取得できます。

<details><summary>node-red admin が使えない場合</summary>
古いバージョンでnode-red adminが使えない場合は、bcryptライブラリを直に指定したnode.jsコマンドで実現できます。パスワードを`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文字になりますので、間違いないようコピーペーストします。
</details>

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

記載後、`node-red-restart` コマンドでNode-REDを再起動することで、Flow Editorへのアクセス時に以下のようなログイン画面が表示されるようになります。
![Node-RED-Login.png](https://qiita-image-store.s3.amazonaws.com/0/25932/d4377cc5-a5c6-60ad-d0c1-3a96f362e133.png)
ユーザ名は`admin`、パスワードは上記で設定した元のパスワード文字列（ハッシュ文字列ではありません）を入力してログインします。

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

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

```js
    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/(ユーザー名)/.node-red`にある`settings.js`の170行目付近(Node-RED 4.0.9の場合)

```
    //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サーバーにする](https://qiita.com/ibmamnt/items/d8b2ddd0f2dc2e1f0330)で紹介されているように、settings.jsの232行目付近(Node-RED 4.0.9の場合)

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

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

```
    //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."},
```
のコメントを外して、passの後の文字列にハッシュ文字列を指定することで、Digest認証を設定することができます。

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

```
$ node-red admin hash-pw
Password:
$2b$08$7mwwlnt666Up9Ez1kqwY2Owl6a6559f8GttnICdBE6GT8KBjbn0UW
```
で求めることができます。（Node-RED 1.1.0以降）


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

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

<img width="600" alt="flows.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/86acc62f-8087-1c06-575e-af4eed683c39.png">


[Node-RED Nodes](https://flows.nodered.org/)で紹介されているサードパーティノードはほとんどがFlow Editorの「パレットの管理」メニューから追加することができます。ノードを追加の検索欄にキーワードを入れることで、追加できるNodesが表示され、「ノードを追加」ボタンで追加できます。
![customNodes.png](https://qiita-image-store.s3.amazonaws.com/0/25932/e47fa197-71a7-f65d-0be3-0e5c352be9e0.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 コマンドラインから設定(ノンイタラクティブ)](https://qiita.com/mt08/items/d27085ac469a34526f72) )

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

### GPIO (General-purpose input/output)
Raspberry Piにはプログラムで制御できるGPIOピンが26本あります。これらのピンはそれぞれデジタル入力・デジタル出力・PWM出力に設定することで、ON/OFFの信号を入出力したり、疑似的なアナログ値を出力することができるようになり、スイッチやセンサー、サーボやブザー、LEDなどを接続することができるようになります。
![](https://projects-static.raspberrypi.org/projects/getting-started-with-node-red/116393c72ac172b99cd5538b7c42c77a3aef1f37/en/images/pinout.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/851d8c7c-50ab-a447-e9d3-d0de998aefcf.png)

rpi-gpio in Nodeを使うことで、GPIOピンに接続したスイッチからON/OFF値を取得できます。
![gpio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/05d5197e-8578-af32-2b7c-a8044f3c7a11.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25932/ef4ff6be-3a3f-952a-efd0-bd3d5674caa9.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 コマンドラインから設定(ノンイタラクティブ)](https://qiita.com/mt08/items/d27085ac469a34526f72) )

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

Node-REDからI2C周辺機器を使う場合、サードパーティノード[node-red-contrib-i2c](https://flows.nodered.org/node/node-red-contrib-i2c)が使えます。
![i2cbus.png](https://qiita-image-store.s3.amazonaws.com/0/25932/b53c8f9b-6170-3cce-274c-e39cbdb74527.png)
 
なお、ADRESS/Commandは、Flow Editorのパネル内で設定する場合は10進数で入力する必要がありますので注意が必要です。

また　[node-red-contrib-brads-i2c-nodes](https://flows.nodered.org/node/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のもの](https://qiita.com/utaani/items/2c45563696c6faeda584#%E5%AF%BE%E5%BF%9Ci2c%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A8%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9-wio-app-v152) はケーブルを自作することで、Raspberry PiのGPIOピンに直結して使うことができます。
![gpiogrove.png](https://qiita-image-store.s3.amazonaws.com/0/25932/047d7b3f-c92f-dbe9-204d-9bdafa37685e.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を使う際に気を付けた方がいいことや、本稿の間違い等ありましたらコメントでお寄せいただければ幸いです。