LED電球(Philips HUE)をコントロールする その(2) node-RED

Windowsでも実行できる

 前回、PhilipsのLED電球HUEのON/OFFをnode-REDを使ってプログラミングしました。色温度などを変更したり、RGBの3色を独自に変更できるパラメータが用意されています。

色温度を変更する

 蛍光灯の時代、ずっと青白い光が続いていましたが、近年電球色が作られました。LED電球も最初は白色LEDだけを使っていたので青白かったのですが、黄色や赤色のLEDを混ぜることで電球色を実現した製品が増えています。

 HUEでは、kelvin(ケルビン)というパラメータの変更で色温度が変えられます。

  • 電球色 3000Kぐらい。JSONの記述 { "kelvin": 3000 }
  • 昼光色 6500Kぐらい。JSONの記述 { "kelvin": 6500 }

 上記の二つのinjectを作成します。実際に色が変わるのが確認できます。

RGBの変更

 今回実験に用いているWhite and color ambiance Extension bulbというHUEは、光の三原色を個別に設定できます。上記の図のdebug出力にあるように、

rgb : array[3]

と配列になっています。並びは、0番目がRed、1番目がGreen、2番目がBlueです。

 injectに、

  {"rgb": [255,0,0]} 

と記述して実行すると、赤色を発光する電球になりました。

 初期値が赤色で、黄緑色に変更するプログラムをfunctionノードで記述します。

msg.payload.rgb= [0,126,0];

 実行すると、赤色がちょっと暗い黄緑色に変わりました。

 上記のプログラムでは、3色を同時に扱わないといけませんが、単独で変更したいときは次のように記述します。

msg.payload.rgb[1]= 255;

 初期値の赤色に黄緑色を足したので、オレンジ色になりました。

 ここまでのプログラム・リストです。利用方法はコラムを参照してください。

[
{
"id": "5bc9e399.8ef2ec",
"type": "node-hue-in",
"z": "7789e2bd.cd9cbc",
"server": "6d963cdc.804d34",
"lightID": "light1",
"name": "",
"x": 626,
"y": 257,
"wires": []
},
{
"id": "b97527a4.7c8848",
"type": "inject",
"z": "7789e2bd.cd9cbc",
"name": "OFF",
"topic": "",
"payload": "{\"on\":false}",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"x": 196,
"y": 248,
"wires": [
[
"5bc9e399.8ef2ec"
]
]
},
{
"id": "f3bc9ab4.e32568",
"type": "inject",
"z": "7789e2bd.cd9cbc",
"name": "ON",
"topic": "",
"payload": "{\"on\":true}",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"x": 195,
"y": 292,
"wires": [
[
"5bc9e399.8ef2ec"
]
]
},
{
"id": "e530f093.477c1",
"type": "inject",
"z": "7789e2bd.cd9cbc",
"name": "昼光色",
"topic": "",
"payload": "{ \"kelvin\": 6500 }",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"x": 196,
"y": 350,
"wires": [
[
"5bc9e399.8ef2ec"
]
]
},
{
"id": "1cd12ddc.ff7642",
"type": "inject",
"z": "7789e2bd.cd9cbc",
"name": "電球色",
"topic": "",
"payload": "{ \"kelvin\": 3000 }",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"x": 196,
"y": 385,
"wires": [
[
"5bc9e399.8ef2ec"
]
]
},
{
"id": "23a0933f.efdb0c",
"type": "inject",
"z": "7789e2bd.cd9cbc",
"name": "赤色",
"topic": "",
"payload": " {\"rgb\": [255,0,0]}",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"x": 196,
"y": 448,
"wires": [
[
"66dfaf0c.f8a6a"
]
]
},
{
"id": "66dfaf0c.f8a6a",
"type": "function",
"z": "7789e2bd.cd9cbc",
"name": "青色を変更",
"func": "msg.payload.rgb[1]= 255;\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 401,
"y": 392,
"wires": [
[
"5bc9e399.8ef2ec"
]
]
},
{
"id": "6d963cdc.804d34",
"type": "node-hue-bridge",
"z": "",
"name": "Hue Bridge",
"address": "192.168.XXX.XXX",
"key": "XXXXXXXXXX",
"interval": "10000"
}
]

RGBを連続的に変化させる

 node-REDには、普通のプログラム言語にある for や while文はありません。したがって、ノードを組み合わせてループ終了条件を作ります。

 初期値を与えるinjectを用意します。switchノードを追加し、つなぎます。

 switchノードでは、RGBのうち青色のメッセージを扱います。まず、255以下だったら、デフォルトの出力1へメッセージを送るように記述します。

 switchは「値」によって複数に分岐ができるノードです。出力を一つ追加します。

 完了すると、switchのノードに出力が二つあるのが確認できます。

 出力2の条件を「それ以外だったら otherwise」を選びます。

 青色の値が255以下の場合に実行するfunctionノードを追加します。ループを作るためのカウンタとして i を使います。初期値として0を入れ、Blueの値に代入します。

if (msg.i === undefined ) msg.i = 0 ;
msg.payload.rgb[2] =msg.i ;

※2017/3/25 未定義ならば初期値0を代入する文は、if ( typeof msg.i === undefined ) msg.i = 0 ; のほうが一般的だと思われますが、どちらも正常に動作します。

 カウンタ i を増加させるfunctionノードを追加します。

msg.i++;

 これらのノードを結びます。

 このまま実行するとエラーが出たので、ループの実行中に100msの遅延を行うdelayを入れました。

 デプロイして(1)のボタンをクリックして実行すると、lightノード・アイコン下に、Blueの値が255以下の間、パラメータのパーセントが増加していきます(2)。switch分の条件であるBlueが255を超えたらotherwiseに分岐しプログラムは終了し、debug欄にパラメータが表示されました(3)。

 プログラムです。利用方法はコラムを参照してください。

[{"id":"5bc9e399.8ef2ec","type":"node-hue-in","z":"7789e2bd.cd9cbc","server":"6d963cdc.804d34","lightID":"light1","name":"","x":626,"y":257,"wires":[]},{"id":"b97527a4.7c8848","type":"inject","z":"7789e2bd.cd9cbc","name":"OFF","topic":"","payload":"{\"on\":false}","payloadType":"json","repeat":"","crontab":"","once":false,"x":196,"y":248,"wires":[["5bc9e399.8ef2ec"]]},{"id":"f3bc9ab4.e32568","type":"inject","z":"7789e2bd.cd9cbc","name":"ON","topic":"","payload":"{\"on\":true}","payloadType":"json","repeat":"","crontab":"","once":false,"x":195,"y":292,"wires":[["5bc9e399.8ef2ec"]]},{"id":"e530f093.477c1","type":"inject","z":"7789e2bd.cd9cbc","name":"昼光色","topic":"","payload":"{ \"kelvin\": 6500 }","payloadType":"json","repeat":"","crontab":"","once":false,"x":196,"y":350,"wires":[["5bc9e399.8ef2ec"]]},{"id":"1cd12ddc.ff7642","type":"inject","z":"7789e2bd.cd9cbc","name":"電球色","topic":"","payload":"{ \"kelvin\": 3000 }","payloadType":"json","repeat":"","crontab":"","once":false,"x":196,"y":385,"wires":[["5bc9e399.8ef2ec"]]},{"id":"23a0933f.efdb0c","type":"inject","z":"7789e2bd.cd9cbc","name":"初期化","topic":"","payload":" {\"rgb\": [0,0,0]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":196,"y":448,"wires":[["5aaf2027.79fa"]]},{"id":"66dfaf0c.f8a6a","type":"function","z":"7789e2bd.cd9cbc","name":"青色を変更","func":"if (msg.i === undefined ) msg.i = 0 ;\nmsg.payload.rgb[2] =msg.i ;\nreturn msg;","outputs":1,"noerr":0,"x":573,"y":387,"wires":[["5bc9e399.8ef2ec","fa88f1c.8f0341"]]},{"id":"5aaf2027.79fa","type":"switch","z":"7789e2bd.cd9cbc","name":"","property":"payload.rgb[2]","propertyType":"msg","rules":[{"t":"lt","v":"255","vt":"num"},{"t":"else"}],"checkall":"true","outputs":2,"x":405,"y":450,"wires":[["66dfaf0c.f8a6a"],["7b915edc.75272"]]},{"id":"fa88f1c.8f0341","type":"function","z":"7789e2bd.cd9cbc","name":"i++","func":"msg.i++;\nreturn msg;","outputs":1,"noerr":0,"x":561,"y":608,"wires":[["a5cc8d72.8b34b"]]},{"id":"7b915edc.75272","type":"debug","z":"7789e2bd.cd9cbc","name":"","active":true,"console":"false","complete":"true","x":722,"y":504,"wires":[]},{"id":"a5cc8d72.8b34b","type":"delay","z":"7789e2bd.cd9cbc","name":"","pauseType":"delay","timeout":"100","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":434,"y":508,"wires":[["5aaf2027.79fa"]]},{"id":"6d963cdc.804d34","type":"node-hue-bridge","z":"","name":"Hue Bridge","address":"192.168.111.105","key":"xh-EF0v-sbhLrqxZTCuQkboKFHSEuwrJMVG9giyE","interval":"10000"}]

コラム プログラムを実行させる手順

 いつもはラズパイでnode-REDを動かし、PCのWebブラウザで作業をしています。ここで紹介しているプログラムはGPIOを触っておらず、ネットワークだけあれば動きます。Windows10で実行環境を用意して動かす手順を説明します。

 Windows10にnode-REDをインストールする手順は、こちらで説明しました。

 Windows Poweshellを管理者として実行します。次のプログラムを実行すると、node-REDが立ち上がります。

node C:\Users\yoshidawin\AppData\Roaming\npm\node_modules\node-red\red.js

 Webブラウザを立ち上げます。URLに

http://localhost:1880/

 第1回の記事のようにHUE用のノードnode-red-contrib-node-hueを追加します。

コラムのすぐ上にあるプログラムリスト内でダブルクリックすると全選択されるので、CTRL+Cでプログラムがコピーできます。

 Webブラウザのキャンパスの真ん中でCTRL+Iをします。読み込みのパネルが開くので、CTRL+Vでプログラムを貼り込みます。読み込みのボタンをクリックします。

 プログラムが読み込まれたら、右上のデプロイをクリックします。

 HUE電球をAC100Vのソケットに入れます。スイッチがあればONにします。injectのボタンを押して実行します。

 HUEのブリッジとライトのlight1は、筆者の環境の値が入っているので、前回の設定方法を参考に修正して利用ください。