NodeRedでAlexa連携
by K.I
Date 181205〜181219
Index
- AmazonのEcho、というか Alexa で、いろいろと操作してみたい
- ちょっと調べてみると、NodeRedというのがあるらしい
- RaspberryPiにNodeRedをインストールすれば、それを経由して
[top]
- NodeRedってなんだろう?というか、まずNode.jsって何かってことなんだけど。
- 自分は、Node.jsってPHPのようにApache等のhttpサーバ上で起動されるスクリプトのようなものと思っていたんだけど、
- これはサーバ側で動くJavaScriptの環境で、独立したサーバを作ったりするものらしい。
- RaspberryPiのRaspbian Jessieには、最初からNode.js、そしてNodeRedがインストールされているらしい。
- 自分の RaspberryPi3には、Raspbian Jessieをインストール済なので、NodeRedもインストールされているはずだ。
- こちらを参考に
- 結構、時間が掛かるので、しばらく放っておく
$ cd ~/.node-red
$ npm rebuild
$ cd ~/.node-red
$ npm ls --depth=0
- それで、NodeRedはフローベースのGUIで動くNode.jsプログラム環境という感じなのかな。
- RaspberryPi上の、NodeRedのサーバを起動する
$ node-red-start
- RaspberryPi起動時に、NodeRedを自動的に起動するためには
$ sudo systemctl enable nodered.service
$ sudo systemctl disable nodered.service
- inputから、injectをドラッグして配置
- injectの表示は、最初timestampになっている
- ダブルクリックすると、injectノードの編集が出来る
- PayloadのドロップダウンメニューからStringを選択
- Hello World!と入力して、Doneボタンを押す
- injectの表示が、Hello World!になる
- outputから、debugをドラッグして配置
- debugの表示は、msg.payloadになっている
- injectの右側からdebugの左側を線でつなぐ
- NodeRedでは、いろいろなノードを部品として追加インストールできるらしい
- ここでは、DashBoardをインストールしてみる
- 右上の三本線メニューから、Manage Paletteを選択
- installタブを選択、search moduleで、node-red-dashboardと入力
- これでパレットにDashBoardがインストールされる2ので、Closeで閉じる
- こうやって、後からいろいろなノードを追加できるのは便利だ。
$ cd ~/.node-red
$ npm install node-red-dashboard
- DashBoardは、GUIで入出力を操作・表示するノードのセットのようだ
- 右上の を押して
- Layoutタブを選択、+tabボタンを押すと、Tab1が追加される
- さらにTab1の+groupボタンを押すと、Group1が追加
- HelloWorldのフローに以下のノードを追加する
- dashboardから、入力用ノードsliderを配置する
- さらにgauge, chart の3つの出力用ノードも配置
- Slider, Gauge,Chart の各ノードを、ダブルクリックして、
- 設定してもしなくても、一応Doneボタンを押してやる必要がある
- 右上にあるDeployボタンを押す
- それから、 を押すと、ブラウザのタブが開いてダッシュボードが表示される
- Sliderを操作すると、ちゃんと、Gauge、Chartの表示が連動して、変化する
- フロー表示をクリックして、ctrl-Eで、Export Clipboardボタンを押す
[{"id":"f8eef13c.d0d9a","type":"tab","label":"Flow 1","disabled":false,"info":""},
{"id":"da6d27cc.816308","type":"ui_slider","z":"f8eef13c.d0d9a","name":"","label":"slider","tooltip":"","group":"7f89b930.684488","order":1,"width":0,"height":0,"passthru":true,"outs":"all","topic":"","min":0,"max":10,"step":1,"x":343,"y":1570,"wires":[["8e8b80be.e524b","3d5bdbc5.7a3f04"]]},
{"id":"8e8b80be.e524b","type":"ui_gauge","z":"f8eef13c.d0d9a","name":"","group":"7f89b930.684488","order":2,"width":0,"height":0,"gtype":"gage","title":"gauge","label":"units","format":"{{value}}","min":0,"max":10,"colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","x":512,"y":1541,"wires":[]},
{"id":"3d5bdbc5.7a3f04","type":"ui_chart","z":"f8eef13c.d0d9a","name":"","group":"7f89b930.684488","order":2,"width":0,"height":0,"label":"chart","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":1,"removeOlderPoints":"","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":512,"y":1611,"wires":[[],[]]},
{"id":"7f89b930.684488","type":"ui_group","name":"Group 1","tab":"83cc1169.5074b","order":1,"disp":true,"width":6},
{"id":"83cc1169.5074b","type":"ui_tab","name":"Tab 1","icon":"dashboard","order":1}]
- こんな感じに、各ノードがTextで保存される3様だ
- なるほど。ちょっとNodeRedの雰囲気が分かった気がする。
- デフォルトでは、ワークディレクトリの ~/.node-red に情報が保存され、ポート番号は1880になる
- 同時に別プログラムを起動4するには、ワークディレクトリ(例えばwork1)を別に作成して、
- これで、同時にNodeRedのサーバが起動する。
- ダッシュボード等の追加インストールは、それぞれに行わなければならないみたいだ
1これはちゃんと固定IPにしてIPアドレスを指定した方が良い。
2NodeRedは、ノードを部品としていろいろ追加することができるらしい。
3見やすいように、ノード毎に改行を入れた。
4NodeRedのインスタンスを複数生成するということになるらしい。
[top]
- Raspbianでは、RaspberryPi用のノードも用意されているので、使ってみる
- まずは、定番のLED点滅をいろいろな方法でやってみよう
- RaspberryPiのPIN7(GPIO004)に、約1kΩの抵抗を介してLEDを接続しておく
- rpi mouse は、ButtonをLeftに設定、
- rpi gpio は、GPIO04のPIN7をチェックして配線で繋ぐ
- Deployすると、RaspberryPiに接続したマウスを左クリックした時に、LEDが点灯する
- injectを、1秒のintervalでRepeatさせる
- その信号を元に Triggerで 250ms のパルスを作って、LEDを点灯させる
- これで、1秒毎にLEDが250ms点灯する。ということで、LEDが点滅する。
- Triggerの代わりに、Functionで毎回信号を反転出力する様にプログラムする
(context.led == 0) ? context.led = 1 : context.led = 0;
msg.payload = context.led;
return msg;
- Contextは、ノードの変数スコープみたいなもので、msg.payloadは、ノードのデフォルトの出力先5
- これで、このFunctionは、T-FFみたいにクロック毎に反転出力するようになる
- 1秒毎にLEDの状態が反転することで、LEDは点滅する
5ということだと思うが、ここら辺はあまり自信がない。
[top]
- Amazon Echoを持っているので、Alexaと連携させてみたい。
- というか、これがNodeRedを弄ってみようと思ったそもそもの動機なんだけど。
- Loginしたら、Deviceタブを選択、Add Deviceでデバイス名とActionを設定する
- Name: LED
- Description: RaspberryPi3 LED
- Action: On,Offにチェック
- LEDは、"エルイーディー"って登録しなきゃダメかなと思ったんだけど、
- アルファベットのままで、ちゃんとカタカナ読みしてくれるっぽい。
- PCなら、 Alexaのサイトを開いて、或いはスマホなら、インストールしたAlexaアプリの、
- スキルの項目で Node-REDを検索して、スキルを有効にする
- そして、設定 の スマートホームデバイスの管理 で、デバイス を見ると、
- 現状、設定されている デバイス名の一覧を見ることができる6ので、確認しておく
- ここで、ちゃんと設定したデバイス名が検出されていることを確認しておく
- RaspberryPiのNodeRedに、Alexa Home Skill Bridgeをインストールする
$ cd ~/.node-red
$ npm install node-red-contrib-alexa-home-skill
- これでNodeRedに、Alexaのノードが追加される
- NodeRedで、Alexa homeノードを配置して、ダブルクリック
- 実際にどんなメッセージが送られるのか、debugノードを繋いで調べてみよう
- Outputは、complete msg object にして、全部見れるようにする
{"topic":"LED",
"name":"LED",
"_messageId":"3cab994b-bfb5-421d-abc6-b52eb38efe2d",
"_applianceId":"42157",
"_confId":"dc9180d2.679c3",
"command":"TurnOnRequest",
"extraInfo":{},
"payload":true,
"_msgid":"8a8e3d05.5efdc"}
{"topic":"LED",
"name":"LED",
"_messageId":"46ef7a4e-738c-4f3d-a3d8-948544cf57f5",
"_applianceId":"42157",
"_confId":"dc9180d2.679c3",
"command":"TurnOffRequest",
"extraInfo":{},
"payload":false,
"_msgid":"d5f722e9.01ae7"}
- msg.payloadに、LEDがONの時はTrueが、OFFの時はFalseが渡されている
- msg.commandにも、それぞれ、TurnOnRequest、TurnOffRequestが送られるので、これで判断しても良いかもしれない
- ここでは、ON/OFFのみのデバイスを定義したが、例えば明るさを変えるデバイス等も定義できるので、
- メッセージの内容は、いろいろなバリエーションがありそうだ
- Alexa homeノードにLEDを接続して、実際にLEDを点灯させてみる
- 直接、GPIO出力ノードに接続したいところだけど、論理値を直接渡せないみたいなので、数値に変換する必要があるようだ。
- Changeノードで、Trueを1に、Falseを0に変換してやるBool2Intを作る
- もちろん、msg.commandで、判定しても良いと思う。
- これで、ちゃんと「Alexa、LEDをONにして」でLED点灯、
- 「Alexa、LEDをOFFにして」でLEDが消灯するようになった!8
- 今度は、Windows PC のON/OFFをしたい!ということで、
- まず、 こちらで PC というデバイスを定義しておこう
- RaspberryPiからの、 PCの起動とシャットダウンについては、別途いろいろ調べてみた。
- 予め、etherwakeとnetコマンドをインストールして、使えることを確認しておく
- Alexa homeノードの出力が、Trueの場合、Falseの場合で別処理をする必要があるが
- どうやら Switchノード で、別々に処理できそうだ
- Swithノードで、処理を分岐できたので、それぞれPCの起動とシャットダウン処理を割り当てる
- NodeRedのadvancedの execノード は、Shellコマンドを直接実行することができる
- これで、「Alexa、PCをつけて」とか「PCの電源を入れて」とか言うと、PCが起動して、
- 「Alexa、PCをOFFにして」とかで、PCをシャットダウン出来るようになった!
6下にある、検出ボタンを押すと更新されるようだ。
7たぶん、Alexaに適当な応答をしてくれるものなんじゃないかと思う。
8これはやってみると思ったよりも面白い!意味もなく何回も点灯したり、消したりしてしまう。
[top]
- 自分は、AmazonのEchoを入手してから、照明を PhilipsのHueライト にしたりして、けっこう便利に使っている
-
- でも、一番使っている用途は、夜中に時間を確認することだったりする。。
- でも今買うなら、EchoDotの時計付きが一番だと思う。(240403追記)
- EchoSpotは時間を見たいのに、別の表示だったりしてイライラする。いつも時計が表示されている方が良い。
- タイマーを設定した場合は、残り時間が表示してくれる。
- そんなこんなで、AlexaでPCのON/OFFをしたいと思い始めて、いろいろ調べてみた結果、
- RaspberryPi上にNodeRedをインストールして、それで制御するのが一番簡単そうだった。
- ということで、NodeRedは手段でしかなかったんだけど、
- 自分は初めて使ったけど、直感的に分かり易くて、自由度もあるし、
- shell実行も簡単にできるので、とても使いやすい環境だと思った
- PCを、AlexaでON/OFFするという目的は無事達成できたので、ここで一旦終わるけど、
- AlexaとNodeRedの連携によるデバイスの制御は、いろいろ可能性がありそうだ
- まぁ、やっぱりRaspberryPiは、こういうサーバ的な用途に使うには凄く良いと思う。
-
- 自分はこれを使っているが、やっぱりケース付きを手に入れた方が使い勝手が良い
- RaspberryPiは、バージョン5になり高機能になったが、ちょっと高くなりすぎた。
- RaspberryPiは、今まであまり実用的に使っていなかったんだけど、
- これからは常時起動にして、NodeRed連携も使って、いろいろ活用していこうと思う。
[top]
[top]
[電子工作関連に戻る]