Inkbird IBS-TH1 miniの値をRaspberryPiでロギング

#はじめに
本記事は、**[Omron環境センサ（BAG型）の記事](https://qiita.com/drafts/ed2ffde4c87001111c12/edit)**と同内容を、
低価格な**Inkbird IBS-TH1 mini**で実施した記事です。

#Inkbirdとは？
様々な家庭用IoTセンサを作っている中国・深圳のメーカーです。
低価格（3000円くらい）でスマホアプリやAPIでのデータ取得等、一通りの機能がそろっている事が魅力です。

今回は、温度＋湿度センサ搭載の
Inkbird IBS-TH1 mini
![Inkbird_mini.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/8e3af87b-bd69-28cc-f885-5c63666159e7.jpeg)
で、ロギングを実施します。

#必要なもの
**・RaspberryPi**（今回はPi3Model Bを使用）
**・Python実行環境**（今回はpyenvでPython3.7.6使用）
**・Inkbird IBS-TH1 mini**

#手順
**①RaspberryPiとセンサのBluetooth接続確認**
**②センサの測定値をPythonで取得**
**③PythonからGASのAPIを叩いてスプレッドシートにデータ書き込み**
**④スクリプトの定期実行**

こちらを参考にさせて頂きました。
https://qiita.com/bon_dentetsu/items/87ed6c65640b5ba11e5c
https://qiita.com/junara/items/f396c1c4c15c78cde89f

##①RaspberrypiとセンサのBluetooth接続確認
###センサの認識確認
**・センサのセットアップ**
センサに付属のボタン電池をセットします。

**・Bluetooth機器のスキャン**
RaspberryPiで下記コマンドを実行

```
sudo hcitool lescan
```

```
LE Scan ...
BB:DD:CC:AA:55:77 sps
```
というように、「sps」という名前がでてきたら、これが環境センサのMACアドレスです。
出てこなければUSBの接触やRaspberryPiのBluetooth有効を確認してください。
機種や設定によっては名前が「sps」ではないのかもしれないので、
その場合[Inkbirdの公式アプリ](https://play.google.com/store/apps/details?id=com.inkbird.engbird&hl=ja)でMACアドレスを確認できます。


##**②環境センサの測定値をPythonで取得**
###bluepyでの認識確認
bluepyは、PythonでBluetooth Low Energy(BLE)にアクセスするためのライブラリです（[クラス定義](http://ianharvey.github.io/bluepy-doc/index.html)）

**・必要なパッケージのインストール**
下記をインストールします

```
sudo install libglib2.0-dev
```

**・bluepyのインストール**

下記コマンドでpipでインストールします

```
pip install bluepy
```

**・bluepyに権限を付与**
スキャンにはbluepyにSudo権限を与える必要があります。

bluepyのインストールされているフォルダに移動し、

```
cd ~.pyenv/versions/3.7.6/lib/python3.7/site-packages/bluepy
```
※上記は、pyenvでPython3.7.6をインストールした場合。
環境により場所は異なるので注意

下記コマンドでbluepy-helperにSudo権限を付与する

```
sudo setcap 'cap_net_raw,cap_net_admin+eip' bluepy-helper
```

###センサ値取得スクリプトの作成
センサ値取得のため、下記のスクリプトを作成します

```python:inkbird_ibsth1_connect.py
from bluepy import btle
import struct

def get_ibsth1_mini_data(macaddr):
    peripheral = btle.Peripheral(macaddr)
    characteristic = peripheral.readCharacteristic(0x002d)
    (temp, humid, unknown1, unknown2, unknown3) = struct.unpack('<hhBBB', characteristic)
    sensorValue = {
            'Temperature': temp / 100,
            'Humidity': humid / 100,
            'unknown1': unknown1,
            'unknown2': unknown2,
            'unknown3': unknown3,
        }
    return sensorValue
```
本センサは、オムロン環境センサUSB版と同様コネクトモードで接続します。
bluepyのPeripheralクラスによる通信でデータを取得します。

なお、取得したcharacteristicデータは
**・1～2バイト目：温度（0.01℃単位）**
**・3～4バイト目：湿度（0.01％単位）**
ですが、5～7バイト目の内容が調べてもわからなかったので、
unknown1～3としてロギングして、正体を探ろうと思います。
（電池残量が取得できる事を目論んでいます）

###メインスクリプトの作成
センサ値取得スクリプトを呼び出すため、メインスクリプトを作成します

```python:inkbird_toSpreadSheet.py
from bluepy import btle
import inkbird_ibsth1_connect

######オムロン環境センサ（BAG型）の値取得######
PERIPHERAL_MAC_ADDRESS = '①で取得したMACアドレス'
sensorValue = inkbird_ibsth1_connect.get_ibsth1_mini_data(PERIPHERAL_MAC_ADDRESS)

#試しに温度を表示
print(sensorValue['Temperature'])

```

コンソールから実行してみます

```
python inkbird_toSpreadSheet.py
25.49
```
これで、Pythonでセンサ測定値を取得することができました。



##③PythonからGASのAPIを叩いてスプレッドシートにデータ書き込み
[オムロン環境センサの記事](https://qiita.com/c60evaporator/items/ed2ffde4c87001111c12#python%E3%81%8B%E3%82%89gas%E3%81%AEapi%E3%82%92%E5%8F%A9%E3%81%84%E3%81%A6%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF)ご参照ください

##④スクリプトの定期実行
[オムロン環境センサの記事](https://qiita.com/c60evaporator/items/ed2ffde4c87001111c12#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E5%AE%9A%E6%9C%9F%E5%AE%9F%E8%A1%8C)ご参照ください


#追記
なお、本製品は**[電池の減りが早く](https://billiesmarket.net/2019/11/25/%EF%BC%91%E3%83%B6%E6%9C%88%E3%81%A7%E9%9B%BB%E6%B1%A0%E3%81%8C%E5%88%87%E3%82%8C%E3%81%9Finkbird-%E3%83%9F%E3%83%8Bibs-th1-mini%E3%80%82%E8%B2%B7%E3%81%86%E3%81%AA%E3%82%89%E3%82%AA%E3%82%B9/)**、一ヵ月程度で切れてしまうそうなので、
少しサイズアップするけれども電池の持ちの良い[IBS-TH1](https://www.amazon.co.jp/Inkbird-Bluetooth-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC-%E6%B8%A9%E6%B9%BF%E5%BA%A6%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC-IBS-TH1/dp/B07T1W9WGN?th=1)を、次に試してみようと思います。

（Bluetoothセンサマンと化してますが、飽きずに続けていきます！笑）