RasberryPi2のNode-REDにWatson Cognitive関連のノードを追加してみました

# 1. はじめに
Raspberry Pi用OSの最新RaspbianにはNode-REDがバンドルされて、Node-REDでの開発が可能です。
本投稿では、一から構築する場合の手順として、Rasbian OSの導入からNode-REDのバージョンアップ、Watsonノードの追加について手順をまとめました。

Watsonには、<font color="blue"><strong>
(1)Watson Congnitive
(2)Watson Analytics
(3)Watson IoT</strong></font>
があり、最新RaspbianにはWatson IoTが提供されています。ただし、正常動作しない場合がありましたので、Node-Red,Watson IoTを最新した上で、Watson Cognitiveノードを追加しました。

# 2. 構成
(1)Raspberry Pi2 Model B
(2)Raspbian OS 2017年１月現在での最新版
(3)無線子機USB接続　Buffalo　WLI-UC-GNME

# 3. Raspbian関連のインストール
インストール方法は、<strong>
・「RAWイメージ」
・「NOOBS」</strong>
の２つの方法がありますが、今回は<font color="blue">「RAWイメージ」</font>でインストールしました。

# 3-1. 書込みツールのダウンロード
RAWディスクイメージをmicroSDに書き込むツールは、<font color="blue">「Win32 Disk Imager」</font>を使用。
ダウンロードサイト：
http://sourceforge.net/projects/win32diskimager/
![02.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/02.png)

# 3-2.Raspbianのダウンロード
ダウンロードサイト：
https://www.raspberrypi.org/downloads/raspbian/
![03.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/03.png)
Raspbian Jessie with PIXELダウンロード
ダウンロードファイル<font color="blue">「2017-01-11-raspbian-jessie.zip」</font>

# 3-3.RaspbianをmicroSDへ書込み
書込みに使用するWindowsPC側での操作です。
・microSDをWindowsPCで認識させる。
![04.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/04.png)

「Win32 Disk Imager」起動
![05.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/05.png)
<font color="green">①ダウンロードファイルを解凍したイメージファイル「2017-01-11-raspbian-jessie.img」
②PCで認識したmicroSDのドライブ
③書き込みます。</font>

書込み完了です。
![06.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/06.png)

microSDカードを抜いて、Raspberry Piに挿入してから起動します。

# 3-4.Raspbianの基本設定
電源、ディスプレイ、キーボード、マウス、無線子機を接続して、電源ON。
![01.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/01.png)

OSの選択。
![07.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/07.png)
<font color="blue">OS：Rasbian 、言語：日本語、キーボード：JPを選択。</font>

![08.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/08.png)
<font color="blue">「Y」入力。</font>

Rasbianインストール中。
![09.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/09.png)

OSのインストールが完了しました。
![10.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/10.png)

OS起動後、サービスとネットワーク、サウンドの設定を行います。

![11.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/11.png)
<font color="blue">「Preferances」⇒「Raspberry Pi Configuration」</font>

ここでは、SSH, VNC, Serial, 1-WareをEnableに設定しました。
![12.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/12.png)
<font color="blue">「OK」</font>

Location設定-TimeZone
![13.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/13.png)

Location設定-Keyboard
![14.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/14.png)

![15.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/15.png)
<font color="blue">「Yes」でリブート。</font>

無線ネットワークの設定。
![16.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/16.png)

サウンドの設定。
![17.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/17.png)

# 3-5.Raspbianを最新にする
Raspianの最新バージョン（Raspbian Jessie）ではすでにNode-REDとWatson IoTが提供されていますが、一度すべてを更新します。

```Command:Raspbianをupdate
sudo apt-get -y update ⏎ 
```
念のため、パッケージ構成の変更のあとに従ってアップグレードします。
これをしないとNode-RED実行時に正常動作しない場合がありました。

```Command:Raspbianをdist-update
sudo apt-get dist-upgrade
```

下記メッセージで停止したら、”ｑ”で画面を閉じます。
![18.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/18.png)

# 3-6.Raspbianに日本語環境をインストール
日本語を表示・入力できるようにします。

```Command:日本語表示用
sudo apt-get install jfbterm
```

```Command:日本語入力用
sudo apt-get install ibus-anthy
```
再起動します。

# 3-7.音声再生用ALSAライブラリをインストール
今回、音声をイヤホンジャック経由で鳴らしたいので、ALSAライブラリーを
インストールします。

```Command:ALSAライブラリーのインストール
sudo apt-get install libasound2-dev
```

# 3-7.Raspbianにnpmをインストール
Raspbianにnpmが当然入っていると思ってましたが、入っていないのでインストール。

```Command:npmインストール
sudo apt-get install npm
```

# 3-8.RaspbianのNode-REDを最新にする
下記コマンドで現在のバージョンを確認。

```Command:Node-REDバージョン確認
sudo node -v
```
現在、V0.10.29 がインストールされていました。
このバージョンではNode-RED起動時やWatson Cognitiveノードを追加する際、エラーになりますのでバージョンアップします。

http://nodered.org/docs/hardware/raspberrypi.html　
の”Upgrading”を参照してください。

```Command:nodejsとNode-REDのアップデート　途中"y"で答える
sudo update-nodejs-and-nodered
```
Node-REDを起動すると~/.node-redディレクトリーが自動的に作成されます。
ディレクトリーがない場合は、一度Node-REDを起動し自動作成するか、手作業で作成してください。

```Command:ディレクトリーの変更
cd ~/.node-red
```
Node-REDのノードを再構築します。

```Command:ノードの再構築
sudo npm rebuild
```

アップグレードマニュアルに記述がありましたので、とりあえず実行します。

```Command:インストールされたノードリストの確認
sudo npm ls --depth=0
```
バージョンの確認

```Command:Node-REDバージョン確認
sudo node -v
```
V4.7.2にバージョンアップされました。


# 3-9.初期状態のノード確認
初期状態でインストールされているノードを確認します。
Node-REDの開始。

```Command:Node-REDの開始
cd ~/.node-red
sudo node-red-start
```

Node-REDが開始されました。
![19.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/19.png)

Raspberry Pi のIPアドレスは”192.168.1.12”です。
クライアントPCよりポート番号”1880”を指定し、アクセスします。
http://192.168.1.12:1880/　

![20.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/20.png)

正常動作が確認できました。尚登録されているノード一覧は下記。
入力、出力に”Watson IoT”ノードがあります。
![21.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/21.png)

Node-REDを終了します。

```Command:Node-REDの終了
cd ~/.node-red
sudo node-red-stop
```

# 4. Watson Cognitiveノードの追加
ノードやフロー情報は下記サイトで確認できます。
http://flows.nodered.org/
![22.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/22.png)

Watson関連のノード情報は、
http://flows.nodered.org/node/node-red-node-watson
にあります。
![23.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/23.png)

RaspberryのWatsonノードを追加します。

```Command:Watsonノードの追加
cd ~/.node-red
sudo npm install node-red-node-watson
```

Node-REDを起動して追加されたノードを確認します。

![24.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/24.png)

Watson Cognitive関連のノードが追加されているのが確認できました。
これを使用して簡単なプログラムを作成したいと思います。

# 5. 簡単なサンプルプログラム
Rasberry PiのCPU温度を取得し、”Text to Speech"で音声ファイルに変換したものを、Rasberry Piのイヤホンで再生する非常に簡単なプログラムです。

## 5-1. 使用するBluemixサービス
Bluemixの下記2つのサービスを使用します。
<font color="blue"><strong>・Internet of Things Platform
・Watson Text to Speech</strong></font>

### 5-1-1. Internet of Things Platformの登録
Bluemixのカタログより、”Internet of Things Platform”を選択。

![25.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/25.png)
<font color="blue">「作成」</font>

![26.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/26.png)
<font color="blue">「ダッシュボードを起動」</font>

![27.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/27.png)
<font color="blue">「デバイス」</font>

![28.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/28.png)
<font color="blue">「デバイスの追加」</font>

![29.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/29.png)
<font color="blue">「デバイスタイプの作成」</font>

![30.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/30.png)
<font color="blue">「デバイスタイプの作成」</font>

![31.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/31.png)
<font color="blue">ここでは、名前："Raspberry-DevType"　、説明：”My Raspberry Device”としました。⇒「次へ」</font>

ここでは、モデルのみ登録しました。
![32.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/32.png)
<font color="blue">「モデル」⇒「次へ」</font>

![33.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/33.png)
<font color="blue">ここでは、モデル："Raspberry Pi 2Model B"としました。⇒「次へ」</font>

![34.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/34.png)
<font color="blue">「次へ」</font>

![35.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/35.png)
<font color="blue">「次へ」</font>

![36.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/36.png)
<font color="blue">ここでは、デバイスID:”RaspberryPi2-001”としました。⇒「次へ」</font>

![37.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/37.png)
<font color="blue">「次へ」</font>

![38.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/38.png)
<font color="blue">ここでは、自動生成認証トークンを選択。⇒「次へ」</font>

![39.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/39.png)
<font color="blue">「次へ」</font>

![40.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/40.png)
<font color="blue">×で閉じる。</font>

以上で作成完了。
構成をメモします。

```Command:構成
組織 ID ：e6vifg 
デバイス・タイプ：Raspberry-DevType 
デバイス ID ：Raspberrypi2-001 
認証方式 ：token 
認証トークン ：(7BrB3rp&93E5aW8gi
```

![41.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/41.png)


# 5-1-2. Watson Text to Speechの登録
Bluemixカタログより、Watson Text to Speechを選択。

![42.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/42.png)
<font color="blue">ここでは、サービス名：”Text to Speech-el”、資格情報名：”Credentials-1”はシステムでアサインされたのを使用しました。⇒「作成」</font>

![43.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/43.png)
<font color="blue">「サービス資格情報」⇒「資格情報の表示 」</font>
資格情報をメモします。 

```Command:資格情報
{
  "url": "https://stream.watsonplatform.net/text-to-speech/api",
  "password": "FrFi27YxDMr8",
  "username": "1e629837-2c6d-4b0c-8b73-91fa127521db"
}
```
以上で登録完了です。

# 5-2. サンプルプログラム
Raspberry PiのCPU温度を取得し、"Text to Speech"で音声ファイルにしたものを、Rasberry Piのイヤホンから音を再生します。
また同時に、Bluemixの"Internet of Things Platform"のダッシュボードにイベントを書き込みます。

![44.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/44.png)

### 5-2-1. timestamp(入力：inject)
10秒毎にプログラムを開始。
![45.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/45.png)

### 5-2-2. CPU温度の入手(その他：exec)
Raspberry Piのコマンド ”vcgencmd" とCPUの温度を取得するパラメータ" measure_temp" を使ってCPU温度を入手します。

![46.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/46.png)

>vcgencmd
>CPU温度以外の情報も色々取得できます。
>http://elinux.org/RPI_vcgencmd_usage
>

### 5-2-3. 入手したCPU温度の整形(機能：function)
"vcgencmd measure_temp"コマンド実行の結果は、”temp=47.6'C”といったフォーマットで出力されますので、これを数字だけの”47.6”に整形します。
![47.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/47.png)

```Command:function
msg.payload = {"d":{"temp":msg.payload.replace("temp=","").replace("'C\n","")}};
return msg;
```

### 5-2-4. msg.payload(出力：debug)
デバッグメッセージを出力します。
![48.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/48.png)

### 5-2-5. イベントを登録(出力：Watson IoT)
Bluemixの"Internet of Things Platform"のダッシュボードにイベントを書き込みます。
「5-1-1. Internet of Things Platformの登録」でメモした構成を登録します。
    ・組織 ID ：e6vifg 
    ・デバイス・タイプ：Raspberry-DevType 
    ・デバイス ID ：Raspberrypi2-001 
    ・認証方式 ：token 
    ・認証トークン ：(7BrB3rp&93E5aW8gi

![49.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/49.png)

![50.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/50.png)

### 5-2-6. テキストメッセージ作成(機能：function)
"vcgencmd measure_temp"コマンド実行の結果を数値だけ抜き出し、”現在のラズベリーパイのCPU温度は" 　 " 度です。"といったメッセージを付けて成形します。
![51.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/51.png)

```Command:function
msg.payload = "現在のラズベリーパイのCPU温度は" +  msg.payload.replace("temp=","").replace("'C\n","") + " 度です。";
return msg;
```

### 5-2-7. Text to Speech(IBM_Watson：Text to Speech)
「 5-1-2. Watson Text to Speechの登録」で入手した資格情報を登録します。
・"password": "FrFi27YxDMr8",
・"username": "1e629837-2c6d-4b0c-8b73-91fa127521db"
ここでは、日本語を選択しました。
![52.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/52.png)

### 5-2-8. Speechメッセージの引き渡し(機能：function)
speech変数の値をpayloadへ渡します。
![53.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/53.png)

```Command:function
msg.payload = msg.speech;
return msg;
```

### 5-2-9. WAVファイル書込み(ストレージ：file)
Rspberry Piの　”/home/pi/temp/speech.wav”に音声ファイルを保存します。
![54.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/54.png)

### 5-2-10.  WAVファイル読込み(ストレージ：file)
デバッグ目的で追加しましたが、このノードは必要ないです。（あっても特に問題ない。）

Rspberry Piの　”/home/pi/temp/speech.wav”の音声ファイルを読込ます。
![55.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/55.png)

### 5-2-11.  音声出力(その他：exec)
Raspberry Piのコマンド ”aplay" と音声ファイル” /home/pi/temp/speech.wav"で音声を出力します。

![56.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/56.png)

## 5-3.  プログラムの実行
timestampノードの左端(矢印のところ)をクリックすると、プログラムが動き出します。
![57.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/57.png)

## 5-4.  Blumixの "Internet of Things Platform" ダッシュボードでの情報確認
該当のデバイス行をクリックすると各種情報が表示されます。
![58.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/58.png)


![59.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/59.png)


#６.おわりに
音声が出ない場合、デフォルトではサウンド出力先は自動判別になっていますが、強制的にラインに変更する、下記コマンドを実行してみてください。
amixer cset numid=3 1
また、
https://www.raspberrypi.org/documentation/configuration/audio-config.md
が参考になります。

JSON形式のサンプルプログラムフローを下記に貼り付けます。
「読込み」⇒「クリップボード」からインポートできます。
![60.png](http://seahorse-inc.com/QIITA/RasPi-NodeRED-Watson/60.png)

```Command:JSON形式のサンプルプログラムフロー
[{"id":"3342d0f3.3ecb9","type":"inject","z":"9fe2dbf9.ca9c88","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","once":false,"x":105,"y":88,"wires":[["a8a36520.f85e98"]]},{"id":"a8a36520.f85e98","type":"exec","z":"9fe2dbf9.ca9c88","command":"vcgencmd","addpay":false,"append":"measure_temp","useSpawn":"","timer":"","name":"CPU温度の入手","x":297,"y":91.5,"wires":[["ca961fc1.0b5c1","dc56eab7.0559f8"],[],[]]},{"id":"982e136.59a0af","type":"debug","z":"9fe2dbf9.ca9c88","name":"","active":true,"console":"false","complete":"payload","x":858,"y":81.5,"wires":[]},{"id":"ca961fc1.0b5c1","type":"function","z":"9fe2dbf9.ca9c88","name":"入手したCPU温度の整形","func":"msg.payload = {\"d\":{\"temp\":msg.payload.replace(\"temp=\",\"\").replace(\"'C\\n\",\"\")}};\nreturn msg;","outputs":1,"noerr":0,"x":544,"y":81,"wires":[["982e136.59a0af","b008a017.de52a"]]},{"id":"b008a017.de52a","type":"wiotp out","z":"9fe2dbf9.ca9c88","authType":"d","qs":"false","qsDeviceId":"","deviceKey":"da074a04.5d72d8","deviceType":"","deviceId":"","event":"event","format":"json","name":"イベントを登録","x":868,"y":154.5,"wires":[]},{"id":"3601997e.99ad56","type":"watson-text-to-speech","z":"9fe2dbf9.ca9c88","name":"Text to Speech","lang":"ja-JP","langhidden":"ja-JP","voice":"ja-JP_EmiVoice","voicehidden":"en-US_LisaVoice","format":"audio/wav","password":"FrFi27YxDMr8","x":795.5,"y":258.3499755859375,"wires":[["3525b7e5.88ccb8"]]},{"id":"dc56eab7.0559f8","type":"function","z":"9fe2dbf9.ca9c88","name":"テキストメッセージ作成","func":"msg.payload = \"現在のラズベリーパイのCPU温度は\" +  msg.payload.replace(\"temp=\",\"\").replace(\"'C\\n\",\"\") + \" 度です。\";\nreturn msg;","outputs":1,"noerr":0,"x":541.5,"y":259.4499816894531,"wires":[["3601997e.99ad56"]]},{"id":"3525b7e5.88ccb8","type":"function","z":"9fe2dbf9.ca9c88","name":"Speechメッセージの引き渡し","func":"msg.payload = msg.speech;\nreturn msg;","outputs":1,"noerr":0,"x":622.5,"y":383.4499816894531,"wires":[["2224815b.a605be"]]},{"id":"d3ee5d85.8bc71","type":"file in","z":"9fe2dbf9.ca9c88","name":"WAVファイル読込み","filename":"/home/pi/temp/speech.wav","format":"","x":834.5,"y":493.75,"wires":[["65a90d38.7c16a4"]]},{"id":"65a90d38.7c16a4","type":"exec","z":"9fe2dbf9.ca9c88","command":"aplay /home/pi/temp/speech.wav","addpay":true,"append":"","useSpawn":"","timer":"","name":"音声出力","x":1085.5,"y":497.54998779296875,"wires":[[],[],[]]},{"id":"2224815b.a605be","type":"file in","z":"9fe2dbf9.ca9c88","name":"WAVファイル書込み","filename":"/home/pi/temp/speech.wav","format":"","x":567.5,"y":495.75,"wires":[["d3ee5d85.8bc71"]]},{"id":"da074a04.5d72d8","type":"wiotp-credentials","z":"","name":"","org":"e6vifg","devType":"Raspberry-DevType","devId":"Raspberrypi2-001"}]
```