【myThingsハンズオン】○○が☓☓だったら、LEDを光らせよう

この記事は[myThingsハンズオンの参考資料](http://qiita.com/yamamotomanabu/items/4812d5a5574219eb03af)の一部です。

## myThingsアプリ上で組み合わせを作成する
下図のように組み合わせを作成します。
![アクション.png](https://qiita-image-store.s3.amazonaws.com/0/51093/fa0764e1-9caa-c4ee-7d28-19b0ce764dd4.png)

## LEDを配線する
ブレッドボード、LED、抵抗、ジャンパーワイヤーを使って、下図のように配線してください。
![myThings_LED.png](https://qiita-image-store.s3.amazonaws.com/0/51093/1bb1d69d-9d4f-695f-5224-50687476c1f1.png)

LEDを配線する際は、向きに気をつけてください。付け根が折れ曲がっていたり長かったりするほうの足を**アノード**、もう一方の足を**カソード**といいます。下図の場合は両方とも左足がアノードです。
![ecb947f66870049baefc.png](https://qiita-image-store.s3.amazonaws.com/0/51093/96cd0bbe-e778-06f8-fac1-a6eb4fc36c9b.png)

## RaspberryPi単体でLEDを光らせる
作業用ディレクトリを作成します。

```bash
mkdir ~/mythings_node_apps
cd ~/mythings_node_apps
```

プログラムを作成します

```bash
sudo vi led.js
```

```js:led.js
var fs = require('fs');

fs.writeFileSync('/sys/class/gpio/export', 25);
fs.writeFileSync('/sys/class/gpio/gpio25/direction', 'out');
fs.writeFileSync('/sys/class/gpio/gpio25/value', 1);

setTimeout(function(){
    fs.writeFileSync('/sys/class/gpio/gpio25/value', 0);
    fs.writeFileSync('/sys/class/gpio/unexport', 25);
}, 2000);
```

プログラムを実行します。

```bash
sudo node led.js
```

2秒間LEDが点灯したら成功です。

## アクションからデータを取得する
必要なライブラリをインストールします。

```bash
cd ~/mythings_node_apps
sudo npm install meshblu@1.18
sudo npm install request
```

プログラムを作成します。{action-1のuuid}、{action-1のtoken}、{IDCFのIPアドレス}の3箇所を自身の環境に合わせて置換してください。

```bash
sudo vi websocket.js
```

```js:websocket.js
var meshblu = require('meshblu');
var request = require('request');

var conn = meshblu.createConnection({
    "uuid": "{action-1のuuid}",
    "token": "{action-1のtoken}",
    "server": "{IDCFのIPアドレス}",
    "port": 80
});

conn.on('ready', function(data){
    console.log('Ready');

    conn.on('message', function(data){
        console.log(data);
    });
});
```

プログラムを実行します。

```bash
sudo node websocket.js
```

コンソール上に**Ready**と表示されたのを確認したら、myThingsアプリ上で組み合わせの手動実行を行ってください。
![手動実行.png](https://qiita-image-store.s3.amazonaws.com/0/51093/d62515d1-2b21-f6cd-a67a-cce75060aa49.png)


以下のような実行結果になれば成功です。取得したデータがJSON形式になっており、payloadにmyThingsアプリで設定したIDCFチャンネルのアクションの**メッセージ**が格納されていることが分かります。

```bash:実行結果の例
$ sudo node websocket.js
Ready
{ devices: [ '670ff362-189f-4c39-bc11-835ff5c359fc' ],
  payload: '晴れ',
  fromUuid: 'e59281d1-1052-4cab-9357-4cd2556f5c5c' }
```

![アクションのメッセージ.png](https://qiita-image-store.s3.amazonaws.com/0/51093/707b795e-f803-9e06-078c-a99f7b8aac94.png)

プログラムを停止する場合はCtrl+cで停止します。

## アクションからデータが取得できたらLEDを光らせる

プログラムを作成します。{action-1のuuid}、{action-1のtoken}、{IDCFのIPアドレス}の3箇所を自身の環境に合わせて置換してください。

```bash
cd ~/mythings_node_apps
sudo vi websocket-led.js
```

```js:websocket-led.js
var meshblu = require('meshblu');
var request = require('request');

var conn = meshblu.createConnection({
    "uuid": "{action-1のuuid}",
    "token": "{action-1のtoken}",
    "server": "{IDCFのIPアドレス}",
    "port": 80
});

conn.on('ready', function(data){
    console.log('Ready');

    conn.on('message', function(data){
        var fs = require('fs');

        fs.writeFileSync('/sys/class/gpio/export', 25);
        fs.writeFileSync('/sys/class/gpio/gpio25/direction', 'out');
        fs.writeFileSync('/sys/class/gpio/gpio25/value', 1);

        setTimeout(function(){
            fs.writeFileSync('/sys/class/gpio/gpio25/value', 0);
            fs.writeFileSync('/sys/class/gpio/unexport', 25);
        }, 2000);
    });
});
```

プログラムを実行します。

```bash
sudo node websocket-led.js
```
コンソール上に**Ready**と表示されたのを確認したら、myThingsアプリ上で組み合わせの手動実行を行ってください。2秒間LEDが点灯したら成功です。

プログラムを停止する場合はCtrl+cで停止します。

## 課題
myThingsアプリで作成した組み合わせのトリガーを他のチャンネルのものに変更してみましょう。
（例えばTwitterチャンネルの検索条件にあうツイートがあったらトリガーなど）
組み合わせの設定変更だけで、RaspberryPi側はなにも変更せずに自作デバイスの機能を変えることができます。