安価に見守り装置を作る

# なんで
Arduinoで3G回線使った見守り装置を作ったのだが、数週間使うとデータが来ない現象が発生して実現できていなかったのだが、
いいものを見つけた！「Sens'it」![Sens'it](https://soracom.jp/img/sigfox/device_sensit04.png)
## Sens'it
温湿度、照度、ドア開閉検知、振動検知、磁気、ボタンの6種類の機能と通信モジュールを組み込んだSigfoxセンサデバイス。

スイッチサイエンスとSORACOMで販売されている、値段は両社ともほぼ同じ。
- [スイッチサイエンス版](https://www.switch-science.com/catalog/3500/)は、Web上で各種データが見れるSensit.ioクラウドが使えるが、１年経過後の契約更新はできない。
- [SORACOM版](https://soracom.jp/products/sigfox/sensit/)は、Sensit.ioクラウドが使えないが、1440円払えば更新可能。他にSORACOMのアプリケーションサービス利用料（SORACOM Harvestの場合5円/日）がかかる。

Harvestは、プログラミングなしでデータが見れるのでいいのだが、年間1825円かかる、たいしたことないのだが、もっと安くできることはやっておきたい。
HarvestでなくSORACOM Beamだと0.0018円/1リクエストとのことなので、１日10リクエストだとすると年間6.75円！！
これはやるっきゃない！

## Sens'it届きました
ユーザI/Fが、７色LEDと白色LEDとボタンスイッチ１つづつしかありません、横にアイコンが並んでいるけどそこにはありません。
７色LEDはボタンのところに、白色LEDはUSBケーブルのところにあリます。
電源の入れ方が不明です、でもボタン押していたらLEDが光ったので電源操作はないのかも？
ボタン操作

|ボタン操作|意味|
|:----------|:------------|
|短く1回押す|現在のモードをLEDの光で知らせる|
|短く2回押す|現在のモーでデータ送信|
|長押し2秒  |現在のモードを次のモードに変更|
|長押し10秒 |LED点滅するのでなにかしているはずだが不明|

モードの推移（ボタン長押し長押し2秒）

|モード|LED|センサー|
|:----------|:-------|:-------|
|温湿度モード|グリーン|温室度|
|照度モード|イエロー|照度|
|ドア開閉検知モード|ブルー|ドア開閉検知|
|振動検知モード|ダークブルー|振動を検知|
|マグネットモード|パープル|磁気センサ|
|ボタンモード|白|ボタンを押すと通知|


## 仕様検討
見守りの検知だが、マグネットモードは、ドアをちゃんと閉めない場合があるので却下、ドア開閉検知モードと振動検知どちらかを使うことにする。
Sens'itは、複数センサがついているのに、１個しか有効にならないようだが、今回は問題ない。

安く簡単に済ませてたいので、
Web上でグラフなどいらない、ドアが開けられたら、LINEにメッセージを飛ばすようにする。
WASが必要だが、Herokuで実装しよう、下記の流れとなる
SORACOM Beam → Heroku → LINE

## 手順概要
1. とりあえずSens'itの動作確認、いきなりプログラム組むと問題があったとき切り分けが大変なのでHarvestで確認１日５円なのでまあいいでしょ
2. Beamのフォーマットがわからないので、データをログに出すようにHeroku上でWASを用意
3. LINEにBoTを作成
4. BeamからのリクエストをLINEに投げる処理を実装

## Sens'itの動作確認
[この](https://dev.soracom.io/jp/start/sigfox_hw_sensit/)ページを見てHarvestで見れるように設定したが...見れない...
家の中では電波が届かないようで、次の日外に持っていったらデータが届きました。

## Heroku上でWASを用意
herokuコマンドを使ってWASを用意します。

```
$ heroku login
Enter your Heroku credentials:
Email: xxx@xxx.com
Password: *******
Logged in as xxx@xxx.com

$ heroku create ooooo
Creating ooooo... done
https://ooooo.herokuapp.com/ | https://git.heroku.com/ooooo.git

$ heroku git:clone -a ooooo
Cloning into 'ooooo'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

$ cd ooooo

$ npm init -y
Wrote to \ooooo\package.json:

{
  "name": "ooooo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

$ npm install express body-parser --save
```

.gitignoreを作ります

```node:.gitignore
node_modules/
```

package.jsonに「"start": "node index.js"」を追加します

```node:package.json
{
  "name": "sensit2line",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.2"
  }
}
```


とりあえず、リクエストをログに出すだけ。

```node:index.js
var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.set('port', (process.env.PORT || 5000));

app.post('/', function(request, response) {
  console.log('post');
  console.log(request.body);
  response.sendStatus(200);
});

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'))
});
```

herokuにデプロイ

```
$ git add .
$ git commit -m "First Commit."
$ git push heroku master
```


### SORACOM Beamでherokuに送信するように設定
SORACOMのコンソールで、SigFoxグループの設定でSORACOM Beamを追加する
（バイナリパーサー設定はそのまま）
SORACOM Harvest 設定はOFFにする

ログを見るには

```
$ heroku logs --tail
```

Sens'itのボタンを２度押しすると、ログが出ます。


## LINEにBoTを作成
[LINEデベロッパーコンソール](https://developers.line.me/ja/)から、「Messaging API（ボット）をはじめる」ボタンでBOTの作成をします
プランは、PUSH通知するので「Developer Trial」にします。
アクセストークン(172文字)とYour user ID(33文字)をメモしてください

## BeamからのリクエストをLINEに投げる

index.jsを変更します

```node:index.js
var express = require('express');
var bodyParser = require('body-parser');
var request = require('request');
var app = express();

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.set('port', (process.env.PORT || 5000));

app.get('/', function(req, res) {
  res.send('Hello World!')
  console.log('get');
  console.log(req);
});

app.post('/', function(req, res) {
  console.log('post');
  console.log(req.body);
  console.log(req.body.station);
  console.log(req.body.rssi);
  console.log(req.body.modeText);
  console.log(req.body.battery);
  console.log(req.body.tempC);
  console.log(req.body.lux);
  res.sendStatus(200);

  var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + '<<アクセストークン>>'
  }
  var body = {
    'to': '<<Your user ID>>',
    'messages': [{
      'type': 'text',
      'text': 'Station ' + req.body.station + 
              '\nRSSI ' + req.body.rssi  +
              '\n' + req.body.modeText +
              '\nBatt ' + req.body.battery  + 
              '\nTrmp ' + req.body.tempC  + 
              '\nLux ' + req.body.lux
    }]
  }
  var url = 'https://api.line.me/v2/bot/message/push';
  request({
    url: url,
    method: 'POST',
    headers: headers,
    body: body,
    json: true
  });
});

app.listen(app.get('port'), function() {
  console.log("Node app is running at localhost:" + app.get('port'))
});
```

herokuにデプロイ

```
$ git add .
$ git commit -m "First Commit."
$ git push heroku master
```

以上です。

結構簡単にできました。
あとは、実家がSigFoxの電波が入るかです。

お正月に行くので、後で報告します。