無線通信機能付き磁力センサ「OPEN-CLOSE SENSE PAL」を使ってみた

# はじめに
以前、[オフィスの会議室やトイレに無線ドア開閉センサを設置する](https://qiita.com/RyoOkaya/items/00febd7ca93287c0b1c7)という記事で、磁力センサで空き部屋情報を可視化するシステムの構成例を紹介しました。しかし、その記事のシステム構成では下記問題が残ったままとなっていました。

- 磁力センサ作製のはんだ付け作業が大変
TWELITE DIPをコイン電池とリードスイッチ(磁力センサ)に接続するためにはんだ付けが必要。

- 省電力性があまり良くない
省電力の工夫をしないと、センサ側の電池が約3か月しか持たなかった。

そんな風に思ってた中、2018年12月25日にモノワイヤレス社から[TWELITE PAL](https://mono-wireless.com/jp/products/twelite-pal/BnR/index.html)と[開閉センサーPAL(OPEN-CLOSE SENSE PAL)](https://mono-wireless.com/jp/products/twelite-pal/sense/openclose-pal.html)が発売されました。この製品を利用すれば、面倒なはんだ付けが不要になり、しかも公式ページによるとコイン電池は約4年持つということなので、同じシステム構成で早速検証してみました。


# 全体構成

全体的にはほぼ変わりませんが、「TWETITE DIP + リードスイッチ + コイン電池ホルダー」の部分が、「TWELITE PAL + TWELITE SENSE」に置き換わります。

- 設置イメージ図

![会議室イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/315655/bef3109a-12c3-1747-0ce2-a5008d796627.png)

- 利用画面イメージ図 (Grafana画面)

![dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315655/6f32847f-d082-ba03-027a-8fa6c7f223b2.png)

Grafanaの画面の作り方については、[前回記事](https://qiita.com/RyoOkaya/items/00febd7ca93287c0b1c7)をご参照ください。

# 準備する部品

今回、準備する部品は下記です。以降は、センサ(子機)、親機のそれぞれの設定を記載していきます。

|分類|部品名|説明|
|:-----------------|:-----------------|:------------------|
|センサ|[TWELITE PAL BLUE](https://mono-wireless.com/jp/products/twelite-pal/BnR/index.html)|無線通信モジュール。開閉センサーPALに接続して子機として利用|
|センサ|[OPEN-CLOSE SENSE PAL](https://mono-wireless.com/jp/products/twelite-pal/sense/openclose-pal.html)|磁力センサモジュール。TWELITE PALに接続して利用|
|センサ|ドア取付用の磁石|磁石なら何でもいいが、今回は[φ10×3mmのネオジム磁石](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4LZ6#)を利用|
|親器|[Raspberry Pi](https://www.raspberrypi.org/)|安価・小型・軽量でスマートなPC。[スターターキット](https://www.google.com/search?q=raspberry+pi+starter+kit)で購入すると楽。|
|親器|[MONOSTICK](https://mono-wireless.com/jp/products/MoNoStick/index.html)|USB型無線通信モジュール。Raspberry Piに接続して親機として利用|
|設定用機器|[TWELITE R](http://akizukidenshi.com/catalog/g/gM-08264/)|TWELITE PAL 設定用の部品。2018年6月以降のもの(後述)|
|設定用機器|[ジャンパワイヤ(オス-メス)](http://akizukidenshi.com/catalog/g/gC-08933/)|TWELITE PALとTWELITE Rを接続するための部品。|
|設定用機器|マイクロUSBケーブル(Bタイプ)|TWELITE RとPC接続用|



# センサ(子機)の設定

ドアに取り付ける開閉センサ(子機)を設定します。センサは下記で構成します。

- TWELITE PAL
- OPEN-CLOSE SENSE PAL
- コイン電池(CR2032)

## パラメータ設定

設定パラメータは、下表の通りです。パラメータの詳細については、[公式ドキュメント](https://mono-wireless.com/jp/products/TWE-APPS/App_pal/interactive.html)をご参照ください。検証用途などの理由からデフォルトのパラメータのまま利用したい場合は、この設定作業をスキップします。

|設定名|説明|
|:-----------------|:------------------|
|アプリケーションID|通信グループID。0x00010001 - 0x7FFFFFFE から任意の値を選ぶ。このIDが同一の親機/子機同士で通信可能。|
|暗号化鍵|通信データの暗号化鍵。32bitの16進数で設定する。親機/子機で同一値を設定しておく。|
|オプションビット|暗号化通信のオプション設定を有効化する|

### TWE-Lite Rの準備

まずは、OPEN-CLOSE SENSE PALを設定用のPCに接続します。下記を準備し、写真のように取り付けます。

- TWELITE PAL
- OPEN-CLOSE SENSE PAL
- TWE-Lite R
- ジャンパワイヤ(オス-メス)
- マイクロUSBケーブル(Bタイプ)

![twelitepal接続.jpg](https://qiita-image-store.s3.amazonaws.com/0/315655/a6358591-c121-0bf1-b23d-3dbae45480ab.jpeg)

なお下記に注意してください。

- TWELITE Rの製品バージョン違い

古い(2018年5月以前に発売)TWE-Lite Rには、ピンヘッダ5Pが実装されていません。そのため、新しく発売されたもの(2018年6月以降)を利用するか、自力ではんだ付けする必要があります。

- 設定画面(インタラクティブモード)の入り方の違い

TWELITE PALではTWELITE DIPと異なり、TWE-Lite Rの24ピンソケットの部分に装着することはできません。[TWELITE R用アタッチメント](https://www.amazon.co.jp/dp/B07MD6Z73G/)を利用すれば接続可能ですが、OPEN-CLOSE SENSE PALと同時に接続できず設定画面(インタラクティブモード)に入れません。設定画面(インタラクティブモード)に入るには、上図のようにピンヘッダ5Pで接続する必要があります。


### Teratermの設定

PCのTeratermから、OPEN-CLOSE SENSE PALにシリアル通信で接続します。シリアル通信では、下図のようにTeratermの設定をスピード(ボーレート)の値を「115200」にしておきます。 

![シリアルポート設定題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315655/46847535-8e5b-0b61-f928-cd4c326a7ed6.png)


### 設定画面(インタクティブモード)に入る

TWELITE PALで設定画面に入るためには、**OPEN-CLOSE SENSE PALの押しボタンスイッチ(画像右下のボタン)**を押しながら、Twe-Lite RのマイクロUSBケーブルをPCに接続します。インタラクティブモードに成功すると、OPEN-CLOSE SENSE PALのLEDがゆっくり点滅し続ける状態になります(MONOSTICKとは異なり、「＋」キーを3回押す方法ではないためご注意ください。)。接続すると、コンソールに設定画面が表示されます。

```
--- CONFIG/App_PAL V1-00-0/SID=0x810aaaa/LID=0x00/RC=9252/ST=0 ---
 a: set Application ID (0x1fff0000)*
 i: set Device ID (--)
 c: set Channels (15)
 x: set Tx Power (13)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0x74E89D74)*
 o: set Option Bits (0x00001000)*
 t: set Transmission Interval (1)
 p: set Senser Parameter (0x00000000)
---
 S: save Configuration
 R: reset to Defaults
```

この画面から、OPEN-CLOSE SENSE PALのアプリケーションID(a:任意の値)、暗号化鍵(k:任意の値)、暗号化有効のオプションビット(o:0x00001000)を設定します。値を変更したら、「S」キーを押下して設定を保存します。

## ドアに設置

センサ(子機)をドアに設置します。TWELITE PALとOPEN-CLOSE SENSE PALを接続してコイン電池をはめ込み、ドアに取り付けます。

左側の写真は[過去記事](https://qiita.com/RyoOkaya/items/00febd7ca93287c0b1c7)のTWELITE DIPで作製したセンサ、右側が今回紹介しているOPEN-CLOSE SENSE PALを利用したセンサです。どちらの方法も、磁石の近接によりドアの開閉を検知している点は同じですが、OPEN-CLOSE SENSE PAL(写真右側)を利用した方が、はんだ付けが不要な上に設置性が安定し、しかもドア開閉の両方を検知できて省電力性にも優れているので、この用途では写真右側の方法を断然おすすめします。

![新旧センサ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315655/e0b62212-f9b0-1c39-699d-4beff4cb34b7.jpeg)



# 親機の設定

中継器となる親機を設定します。親機は下記で構成します。

- Raspberry Pi
- MONOSTICK

## パルアプリ(App_PAL)の書き込み

親機となるMONOSTICKには、デフォルトでは[TWELITE標準アプリ](https://mono-wireless.com/jp/products/TWE-APPS/App_Twelite/index.html)がインストールされています。今回はTWELITE PALを利用するので、標準アプリではなく[TWELITE PAL用のアプリ(App_PAL)](https://mono-wireless.com/jp/products/TWE-APPS/App_pal/index.html)をMONOSTICKにインストールして利用します。![uploading-0]()


1. Windows PCにMONOSTICKを接続する。
1. Windows PC上で[TWELITEプログラマ](https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html)を実行し、App_PALのバイナリをMONOSTICKに書き込む。


### ダウンロード

モノワイヤレス社の公式サイトから必要なファイルをダウンロードします。必要なファイルは下表の通りです。

|ダウンロード対象|説明|
|:-----------------|:------------------|
|[パルアプリ(App_PAL)](https://mono-wireless.com/jp/products/TWE-APPS/App_pal/download.html)|TWELITE PAL向けファームウェア|
|[TWELITEプログラマ](https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html)|ファームウェア(アプリ)書き込み用のWindowsソフトウェア|

### 書き込み実行

ダウンロードした[TWELITEプログラマ](https://mono-wireless.com/jp/products/TWE-APPS/LiteProg/index.html)をダブルクリックで起動すると、下記のような画面が表示されます。

![app_pal_monostick_install_3.png](https://qiita-image-store.s3.amazonaws.com/0/315655/ac5ced18-a0fc-711b-55f0-47e908d022c2.png)

プルダウンからMONOSTICKを接続したデバイス(画像ではCOM4)を選択し、App_PALのバイナリ(App_PAL-Parent-BLUE-MONOSTICK.bin)をドラッグ＆ドロップします。書き込み成功の画面が表示されれば完了です。

### 再読み込み

書き込み後は、下記どちらかの操作によりApp_PALを再読み込みしてください。

- TWELITEプログラマ画面上の「TWELITEのリセット」をクリックする
- MONOSTICKを再接続する

## パラメータ設定

MONOSTICKのApp_PALのアプリケーションIDと暗号化キーを、センサ(子機)の値に合わせて設定します。

|設定名|説明|
|:-----------------|:------------------|
|アプリケーションID|通信グループID。0x00010001 - 0x7FFFFFFE から任意の値を選ぶ。このIDが同一の親機/子機同士で通信可能。|
|暗号化鍵|通信データの暗号化鍵。32bitの16進数で設定する。親機/子機で同一値を設定しておく。|
|オプションビット|暗号化通信のオプション設定を有効化する|

### 設定画面(インタクティブモード)に入る

MONOSTICKでは、下記の方法で設定画面(インタラクティブモード)に入ることができます。

- MONOSTICKをWindows PCに接続する
- Teratermを起動する
- 「+」キーを3回押す。

```
--- CONFIG/App_PAL V1-00-0/SID=0x810eaaa/LID=0x00 ---
 a: set Application ID (0x1fff0000)*
 c: set Channels (15)
 x: set Tx Power (3)
 b: set UART baud (38400)
 B: set UART option (8N1)
 k: set Enc Key (0x74E89D74)*
 o: set Option Bits (0x00001000)*
```

子機と同様に、MONOSTICKのアプリケーションID(a:任意の値)、暗号化鍵(k:任意の値)、暗号化有効のオプションビット(o:0x00001000)を設定します。値を変更したら、「S」キーを押下して設定を保存します。


## Raspberry Piの準備

親機として利用するRaspberry Piを設定します。必要なタスクは下記の通りです。

- Raspberry Piに適当なOS(Raspbian, Ubuntuなど)をインストールする
- 必要なモジュール(python3など)をインストールする

設定の詳細は割愛します。


## 通信スクリプトの設置

親機のLinux OSから実行する、TWELITE PALの通信を解析してDBサーバ(InfluxDB)に送信するスクリプトを設置します。

### 依存ライブラリのインストール

通信スクリプトに必要な依存パッケージをインストールします。下記はコマンド例です。

```bash
> pip install influxdb
```

### 通信スクリプトの追記

今回は、TWELITE公式HPで公開されている[パルスクリプト](https://mono-wireless.com/jp/products/TWE-APPS/App_pal/palscript.html)を改変して通信スクリプトを作成します。下記はコーディング例です。InfluxDBのpython用APIである[InfluxDB-Python](https://influxdb-python.readthedocs.io/en/latest/include-readme.html)を利用しています。


```python:PAL_Script.py
# ライブラリを追加
import traceback
from influxdb import InfluxDBClient
# ~(省略)~
while True:
try:
	# データがあるかどうかの確認
	if PAL.ReadSensorData():
		# あったら辞書を取得する
		Data = PAL.GetDataDict()
		# なにか処理を記述する場合はこの下に書く
		print(Data)			# 受け取った辞書をそのまま標準出力する		
		# 0:磁石が離れた, 1:N極が近づいた, 2:S極が近づいた,128:磁石が離れたまま60秒経った, 129:N極が近づいたまま60秒経った, 130:S極が離れたまま60秒経った.
		is_closed = 1
		if Data.get("HALLIC") in [0,128]:
			is_closed = 0
		client = InfluxDBClient(
			host='127.0.0.1',
			port=8086,
			username='root',
			password='root',
			database='dbname',
			ssl=False,
			verify_ssl=False,
			timeout=3,
			retries=1)		
		json_body = [
			{
				"measurement":'meeting_rooms',
				"tags":{
					"LogicalID":Data.get("LogicalID"),
					"RouterSID":Data.get("RouterSID"),
					"EndDeviceSID":Data.get("EndDeviceSID")
				},
				"fields":{
					"is_closed":is_closed,
					"LQI":Data.get("LQI"),
					"mV":Data.get("Power")
				}
			}
		]
		client.write_points(json_body) # データをInfluxDBに送信する
		# ログを出力するオプションが有効だったらログを出力する。
		if bEnableLog == True:
			PAL.OutputCSV()	# CSVでログをとる
# Ctrl+C でこのスクリプトを抜ける
except KeyboardInterrupt:
	break
# エラー時はエラーメッセージを出力して処理を継続する
except:
	traceback.print_exc()
```

パルスクリプト「PAL_Script.py」Ver.1.0.0の70行目の
`# なにか処理を記述する場合はこの下に書く`
以降で、
`PAL.GetDataDict()`
の行で、MONOSTICKのApp_PAL受信データを解析したデータを取得し、
`client.write_points(json_body) # データをInfluxDBに送信する`
の行で、InfluxDBにHTTP通信でデータを送信しています。

### OPEN-CLOSE SENSE PALの状態検出

OPEN-CLOSE SENSE PALの磁石の状態について、パルスクリプトVer.1.0.0では下記の6種類を検出していました。

|HALLIC変数値|OPEN-CLOSE SENSE PALの状態|
|:-----------------|:------------------|
|0|磁石が離れた|
|1|N極が近づいた|
|2|S極が近づいた|
|128|磁石が離れたまま60秒経った|
|129|N極が近づいたまま60秒経った|
|130|S極が離れたまま60秒経った|

### コマンド実行

親機のOSから下記コマンドを実行して、通信スクリプトを実行します。コマンド例はWindows上で実行する場合の例で、MONOSTICKの接続ポート名に`COM4`を指定しています。

```
> python PAL_Script.py -t COM4 -l -e
```

通信スクリプトの実行時オプションは、下記となっています。

|オプション|説明|
|:-----------------|:------------------|
|-t|MONOSTICKの接続ポート名を指定する。デフォルトは`COM3`または`/dev/ttyUSB`|
|-l|受信ログをcsv形式で出力する|
|-e|エラー発生時にスタックトレースを標準出力する|

通信スクリプトの実行により、ドア開閉データを受信するとHTTP通信を行いログが出力されるようになりました。

### OS起動時実行の設定

親機の電源投入時にこのスクリプトが自動実行されるようにするために、親機の`/etc/rc.local`ファイルに下記2行を追記します。ディレクトリは適宜読み替えてください。

```sh:/etc/rc.local
 cd /home/pi/PAL_Script
 python3 PAL_Script.py -l -e > /dev/null &
```

# 可視化アプリの設定

InfluxDB + Grafanaの構成で、ドア開閉データの可視化アプリを設定します。下記の要領で準備します。

- InfluxDBの設定
  - インストール
  - データベース作成
  - データ疎通テスト
- Grafanaの設定
  - インストール
  - InfluxDBとの連携
  - ダッシュボード画面作成

下記は設定後のダッシュボード画面例です。詳細については、[前回記事](https://qiita.com/RyoOkaya/items/00febd7ca93287c0b1c7)をご参照ください。
![dashboard3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315655/fb996775-d867-a918-1e31-b25423db92c8.png)


# おわりに

TWELITE + RaspBerry Pi + Soracom(今回は使ってない) + InfluxDB + Grafana の組み合わせは、身近なIoTの第一歩としてはなかなかイケてると思うので、推していきたいと思っています。