Heroku
Line
SORACOM
SigFox

安価に見守り装置を作る

なんで

Arduinoで3G回線使った見守り装置を作ったのだが、数週間使うとデータが来ない現象が発生して実現できていなかったのだが、
いいものを見つけた!「Sens'it」Sens'it

Sens'it

温湿度、照度、ドア開閉検知、振動検知、磁気、ボタンの6種類の機能と通信モジュールを組み込んだSigfoxセンサデバイス。

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

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

Sens'it届きました

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

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

モードの推移(ボタン長押し長押し2秒)

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

仕様検討

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

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

手順概要

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

Sens'itの動作確認

このページを見て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を作ります

.gitignore
node_modules/

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

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"
  }
}

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

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のボタンを2度押しすると、ログが出ます。

LINEにBoTを作成

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

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

index.jsを変更します

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の電波が入るかです。

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