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

#はじめに
本記事は、**[Omron環境センサ（BAG型）の記事](https://qiita.com/drafts/ed2ffde4c87001111c12/edit)**と同内容を、
低価格な**Inkbird IBS-TH1**で実施した記事です。
前回使用したminiは電池の持ちが悪かったので、単4電池の本製品で持久性アップを狙いました。

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

今回は、温度＋湿度センサ搭載の
Inkbird IBS-TH1
![Inkbird_IBS-TH1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ad6bb611-253b-5f94-03f3-1f1190d3c5f8.jpeg)

で、ロギングを実施します。

#必要なもの
**・RaspberryPi**（今回はPi3Model Bを使用）
**・Python実行環境**（今回はpyenvでPython3.7.6使用）
**・Inkbird IBS-TH1**（プローブを外した状態で使用しています）

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

こちらを参考にさせて頂きました。
https://qiita.com/bon_dentetsu/items/87ed6c65640b5ba11e5c
https://github.com/viyh/inkbird
https://github.com/sputnikdev/eclipse-smarthome-bluetooth-binding/issues/60

##①RaspberrypiとセンサのBluetooth接続確認
###センサの認識確認
**・センサのセットアップ**
センサに単4電池をセットします（蓋が取りずらいので注意してください）

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

```
sudo hcitool lescan
```

```
LE Scan ...
AA:CC:EE:DD:55:77 sps
```
というように、「sps」という名前がでてきたら、これがセンサのMACアドレスです。
出てこなければ電池の接触や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_data(macaddr):
    peripheral = btle.Peripheral(macaddr)
    characteristic = peripheral.readCharacteristic(0x28)
    (temp, humid, unknown1, unknown2, unknown3) = struct.unpack('<hhBBB', characteristic)
    sensorValue = {
            'Temperature': temp / 100,
            'Humidity': humid / 100,
            'unknown1': unknown1,
            'unknown2': unknown2,
            'unknown3': unknown3,
        }
    return sensorValue
```
Inkbird IBS-TH1 miniではハンドルが「0x002d」でしたが、今回は「0x28」なので注意してください。
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_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)ご参照ください