SORACOM Harvest Dataを使ってHACCP向けPoCシステムを作る

#概要
2020年6月から、飲食店においてHACCPの導入が義務化されました（猶予期間１年）。

HACCPの詳細については、ここでは割愛しますが、
重要管理点（CCP）を検討した際、冷蔵庫や冷凍庫の温度管理が必要になる場合が多いです。
原材料や調理過程のものが適切な温度で保存されることを担保するために、
冷蔵庫や冷凍庫の庫内温度を毎日記録することになります。

これを自動化するIoTシステムを作成するにあたり、
SORACOM Harvest Dataを活用してPoCシステムを作りました。
⇒SORACOM Harvest Data、これまで使ったことなかったので・・・（汗）。

#システム構成
システム構成はこんな感じです。
手元にあったラズパイと4GPiを使って、BLE通信で取得した温度データをSORACOM Harvest Dataに送信します。
アプリ開発にはNode-REDを使用しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/803d30bc-9d8a-f60b-4a3f-09ec5abc743b.png)

温度センサーには、温湿度がBLE通信で取得できるInkbird IBS-TH1を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/cc4c75c8-f328-f6ed-ecfa-d8d37e3397cc.png)


#SORACOM Harvest Dataの設定
まずは、SORACOMのユーザーコンソールにログインしてください。

（１）SIMグループの作成と設定
SORACOM Harvest Dataは、SIMグループ単位に設定するので、まずはグループを作成します。

① 左側メニューの「SIM グループ」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/bf479525-f276-2674-8938-ecaa3d7ece69.png)

② 以下のような画面が表示されるので、「＋追加」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d673b852-9717-693e-382e-81c7ad26e305.png)

③ グループ名を適宜入力して、「グループ作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/bf75ba70-ef86-7ee2-b282-e1380b1ca496.png)

④SORACOM Harvest Data設定項目を開き、トグルスイッチをONにして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/4d399091-bd9f-17ac-1646-53a8c18221d5.png)


（２）SIMをSIMグループに登録
① 左側メニューの「SIM 管理」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/3e9ff38d-fb58-0c79-5fbb-45210f28709f.png)

②SORACOM Harvest Dataを使いたいSIMを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/6a9a500d-5642-ae95-1bbc-7f9430fca21b.png)

③先ほど作成したグループを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d667296e-fa9f-74e9-c6fb-69b4be10eeec.png)

#ラズパイの設定
OSにはRaspbianを使用します。

（１）4GPiのための設定
4GPiを使用するための手順は、メカトラックスさんが作成しているGitHubにまとめられています。
・[セットアップ手順](https://github.com/mechatrax/4gpi/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2#1-%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)
・[SORACOM SIM用の接続設定](https://github.com/mechatrax/4gpi/wiki/%E3%81%9D%E3%81%AE%E4%BB%96#%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A)

具体的には、以下のコマンドをコンソールで実行するだけです。

```
>curl https://mechatrax.github.io/setup.sh | sudo bash
>sudo apt install 4gpi-utils 4gpi-net-mods 4gpi-networkmanager
>sudo nmcli con add type gsm ifname "*" con-name gsm-4gpi-soracom apn soracom.io user sora password sora
```

（２）BLEを使うための設定
今回使用する温度センサーは、BLEのアドバタイズメッセージで温湿度データを送信してきます。
Node-REDでのデータを受信するために、node-red-contrib-blebeacon-scannerノードを使用します。
⇒ [yossihard/node-red-contrib-blebeacon-scanner](https://github.com/yossihard/node-red-contrib-blebeacon-scanner)

このノードが必要なライブラリ等をインストールするために、
ラズパイのコンソールで以下のコマンドを実行してください。

```
> sudo apt-get install libbluetooth-dev libudev-dev pi-bluetooth
> npm install @abandonware/noble
```


#Node-REDのフロー作成
作成したフローをこのような感じです。
BLE Beacon Scannerと書かれたノードが、node-red-contrib-blebeacon-scannerです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/dfe8e6d1-1c16-9c29-e15b-9d8e7ade7441.png)


上側のフローでは、受信したデータのlocal nameがspsかどうかを確認し、
spsであれば温度センサーのデータなので、グローバル変数に一旦保存します。
保存する処理は、「データ変換・保存」と書かれたノードで行っています。

```js

var globalVal = global.get('SensorData');
if (!globalVal) {
  globalVal = {};
} 

var date = new Date();
var now = date.getFullYear()+"-"+(("0"+(date.getMonth()+1)).slice(-2))+"-"+(("0"+date.getDate()).slice(-2)) 
         + "T"+(("0"+date.getHours()).slice(-2))+":"+(("0"+date.getMinutes()).slice(-2))+":"+(("0"+date.getSeconds()).slice(-2))+"+09:00";

var buf = msg.payload.other
var temp = buf.readInt16LE(0) / 100;
var humidity = buf.readInt16LE(2) / 100;
var power = buf[7];
var rssi = msg.payload.rssi;
var payload =  { MeasDate:now, SensorID:msg.payload.id, Temp:temp, Humidity:humidity,Power:power,RSSI:rssi };
var newmsg = { payload:payload };

globalVal[msg.payload.id] = payload;
global.set('SensorData',globalVal);

return newmsg;
```

アドバタイズメッセージのデータフォーマットは、こちらのページを参考にさせて頂きました。
https://qiita.com/bon_dentetsu/items/87ed6c65640b5ba11e5c


下側のフローでは、10分に1回グローバル変数からデータを取得し、
SORACOM Harvest DataにデータをJSON形式で送信しています。

「SORACOM Harvest Data送信」と書かれたノードは、http requestノードです。
プロパティは以下のようにSORACOM Harvest DataのエントリポイントをURLに指定しているだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/e7958207-8b4e-0696-d91d-77d12e02acb0.png)


#送信結果
SORACOMのユーザーコンソールにログインして、左側メニューのSORACOM Harvest Dataを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/ba9e0951-0d1f-5be6-b520-2b226c7f9373.png)

この記事を本日中にUPするために（Advent Calendar記事！）、1分間隔でデータを送信した結果を表示させています（汗）。
⇒後日ちゃんと長期間計測したグラフに更新しますね・・・。
センサーから取得した温度、湿度、電池残量、RSSI（電波強度）を送信していますが、
ここでは温度のみ表示させています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/d484359b-54c0-6014-ee65-16863c43e0be.png)

SORACOM Harvest Dataに届いているデータはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/c92629d7-cf74-c39d-4ee3-cf77ab4e9436.png)


#余談
SORACOM Harvest DataをPoCではなくて本番運用で使用できるかを考えてみました。

複数のセンサーデータを配列で送信してみたのですが、
SORACOM Harvest Dataにデータは保持されますが、
グラフが描画されませんでした。
⇒この後しっかりドキュメント読んでおきます（汗）。

SORACOM Harvest Dataは、現在Public Beta提供とのこと。
⇒SORACOMでのPublic Betaの定義は[こちら](https://soracom.zendesk.com/hc/ja/articles/219019457-Public-Beta-%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%99%E3%81%8B-)
仕様が変わるかもしれないので、注意が必要ですね。

また、データ保存期間が標準で40日間となっていますが、
データ保持期間延長オプションで 731 日間に延長できるとのこと（有料）。
HACCPでは帳票の保存期間は各々適切に決定するようなので、
保存期間が1年であれば大丈夫そうですね。