BluemixでIoT　温湿度、気圧を収集・蓄積・可視化＋LED制御 その１０

##０．はじめに
[前回](http://qiita.com/hino9966/items/be8ecca36bd90aa8419a)の続きです。今回は、おまけ機能としてNode-RED側で温度を判定し、LEDの点灯色の制御を行います。

[今回のLED制御の仕様]しょぼい仕様ですみません。　
Node-RED側で、
３０度以上のときは、　　赤
２０度以上３０度未満は、黄
１０度以上２０度未満は、緑
０度以上１０度未満は、　青
それ以外は、　　　　　　白
となるような判定ロジックを作成する。

RaspberryPi側で、
１分(60秒)周期に温度を取得、その間(59秒間)、Node-REDで指定された色でLEDを1秒置きに点滅させる。

##１．必要なもの（今回準備したもの）
|項目|数量|メモ|
|---|:---:|---|

##２．参考にさせていただいたところ
[Nodejs & raspberry pi でLEDをチカチカさせる](http://qiita.com/glostuan/items/f8e96564473f8e35a084)

##３．温度判定ロジックを追加
**①Node-REDに温度判定ロジック用functionノードを追加する。**
　Name項目に、「温度判定」を入力する。
　Function項目に、下記を入力する。

```js:function
if (msg.payload.temp >= 30) {
    msg.payload='{"LED": "RED"}';
}else if(msg.payload.temp >= 20 && msg.payload.temp < 30) {
    msg.payload='{"LED": "YELLOW"}';
}else if(msg.payload.temp >= 10 && msg.payload.temp < 20) {
    msg.payload='{"LED": "GREEN"}';
}else if(msg.payload.temp >= 0 && msg.payload.temp < 10) {
    msg.payload='{"LED": "BLUE"}';
}else{
    msg.payload='{"LED": "WHITE"}';
}

return msg;
```
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/57026731-31f7-30d7-74fe-d634026ac8bd.png)

**②Node-REDにibmiot output用ノードを追加する。**
　Node-REDのoutputにあるibmiotノードを選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/c5522a34-3bbb-dab0-1bdb-626cc1f2643c.png)

**③ibmiot output用ノードを設定する。**
　Authentication項目に、「Bluemix Service」を選択する。
　Output Type項目に、「Device Command」を選択する。
　Device Type項目に、「raspi01」を入力する。
　Device Id項目に、「sensor001」を入力する。
　Command Type項目に、「led」を入力する。
　Format項目に、「json」を入力する。
　Data項目に、「msg」を入力する。
　Name項目に、「LED制御」を入力する。
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/42fcdb8f-8e79-2f20-3dc0-72e8bfa538f8.png)

**③作成したノードを下図のように接続する。**
![image](https://qiita-image-store.s3.amazonaws.com/0/113879/d9f8e419-0a47-d9e5-efa5-d734ea059fb4.png)

##４．LED点灯ロジック追加
**①mqtt.jsにLED点灯ロジックを追加する。**

```js:mqtt.js
var f = require('./bme280.js');
var moment = require('moment');
var Client = require("ibmiotf").IotfDevice;
var Gpio = require('onoff').Gpio;
var RED   = new Gpio(22, 'out'); 
var GREEN = new Gpio(23, 'out');
var BLUE  = new Gpio(18, 'out');


var config = {
 (省略)
};

function mkJson(callback) {
   f.bme(function(temp, humid, press){
      var nowtime = moment().format("YYYY-MM-DD HH:mm:ss.SSS");
      var temp_v =  temp.toFixed(1);
      var humid_v = humid.toFixed(1);
      var press_v = press.toFixed(1);
      payload = JSON.stringify({d : { timestamp : nowtime, temp : temp_v, humid : humid_v, press : press_v }});
      //console.log(payload);
      callback(payload);
   });
}

var client = new Client (config);

client.connect();

client.on("connect", function () {
   mkJson(function(payload) {
      console.log(payload);
      client.publish ("eid", "json", payload);
   });
   setInterval(function(){
        mkJson(function(payload) {
           console.log(payload);
        });
        client.publish ("eid", "json", payload);
   }, 60000);
});

client.on("command", function (commandName,format,payload,topic) {
   if(commandName === "led") {
      //console.log(JSON.parse(payload));
      var json = JSON.parse(payload);
      setColor(json.LED);
   } else {
      console.log("Command not supported.. " + commandName);
   }
});

function setColor (color) {
   var red = 0, blue = 0, green = 0;
   switch (color) {
     case 'RED':
        red = 1;
        break;
     case 'YELLOW':
        red = green = 1;
        break;
     case 'GREEN':
        green = 1;
        break;
     case 'BLUE':
        blue = 1;
        break;
     case 'WHITE':
        red = green = blue = 1;
        break;
    }
    var iv = setInterval(function(){
       if (red==1)   {RED.writeSync(RED.readSync() === 0 ? 1 : 0);}
       if (green==1) {GREEN.writeSync(GREEN.readSync() === 0 ? 1 : 0);}
       if (blue==1)  {BLUE.writeSync(BLUE.readSync() === 0 ? 1 : 0);}
     }, 1000);
     console.log (color + " red=" + red + " green=" + green + " blue=" + blue);

    setTimeout(function() {
       clearInterval(iv); // 点滅LEDをストップ
       // LED消灯
       RED.writeSync(0);
       GREEN.writeSync(0);
       BLUE.writeSync(0);

    }, 59000);
}
```

##５．LED点灯確認
**①改修したmqtt.jsを実行する。**

```text:コマンド
pi@raspberrypi ~ $ sudo node mqtt.js
```

**②現在の温度にあった色でLEDが点滅することを確認する。**


以上でLED制御手順は終了です。

これで、今回予定していた「BluemixでIoT 温湿度、気圧を収集・蓄積・可視化＋LED制御」は、全て完了です。