SwitchBot温湿度計の値をRaspberryPiでロギング

#はじめに
本記事は、**[Omron環境センサ（BAG型）の記事](https://qiita.com/c60evaporator/items/ed2ffde4c87001111c12)**と同内容を、
低価格で画面表示付きの**SwitchBot温湿度センサ**で実施した記事です。

#SwitchBotとは？
中国・深圳のメーカーWonderlabs Inc.が開発した、家庭用IoT機器シリーズです。
今回は、上記シリーズの温湿度センサ
![switchbot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/27c86c07-0302-67cd-8c70-1ad344d78a60.jpeg)
を使用します。
低価格（2000円くらい）でスマホアプリやAPIでのデータ取得、画面表示まで揃った多機能が魅力です。

#必要なもの
**・RaspberryPi**（今回はPi3Model Bを使用）
**・Python実行環境**（今回はpyenvでPython3.7.6使用）
**・SwitchBot温湿度センサ**

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

こちらを参考にさせて頂きました。
https://qiita.com/warpzone/items/11ec9bef21f5b965bce3

##①RaspberrypiとセンサのBluetooth接続確認
###センサの認識確認
**・センサのセットアップ**
センサに単4電池をセットします

**・Bluetooth機器のスキャン**
[SwitchBotの公式アプリ](https://play.google.com/store/apps/details?id=com.theswitchbot.switchbot&hl=ja)でMACアドレスを確認したあと、
RaspberryPiで下記コマンドを実行

```
sudo hcitool lescan
```

```
LE Scan ...
AA:EE:BB:DD:55:77 (unknown)
```
上記で、アプリで確認したMACアドレスが出てくれば成功です。

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

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

```
sudo apt 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:switchbot.py
from bluepy import btle
import struct

#Broadcastデータ取得用デリゲート
class SwitchbotScanDelegate(btle.DefaultDelegate):
    #コンストラクタ
    def __init__(self, macaddr):
        btle.DefaultDelegate.__init__(self)
        #センサデータ保持用変数
        self.sensorValue = None
        self.macaddr = macaddr

    # スキャンハンドラー
    def handleDiscovery(self, dev, isNewDev, isNewData):
        # 対象Macアドレスのデバイスが見つかったら
        if dev.addr == self.macaddr:
            # アドバタイズデータを取り出し
            for (adtype, desc, value) in dev.getScanData():  
                #環境センサのとき、データ取り出しを実行
                if desc == '16b Service Data':
                    #センサデータ取り出し
                    self._decodeSensorData(value)

    # センサデータを取り出してdict形式に変換
    def _decodeSensorData(self, valueStr):
        #文字列からセンサデータ(4文字目以降)のみ取り出し、バイナリに変換
        valueBinary = bytes.fromhex(valueStr[4:])
        #バイナリ形式のセンサデータを数値に変換
        batt = valueBinary[2] & 0b01111111
        isTemperatureAboveFreezing = valueBinary[4] & 0b10000000
        temp = ( valueBinary[3] & 0b00001111 ) / 10 + ( valueBinary[4] & 0b01111111 )
        if not isTemperatureAboveFreezing:
            temp = -temp
        humid = valueBinary[5] & 0b01111111
        #dict型に格納
        self.sensorValue = {
            'SensorType': 'SwitchBot',
            'Temperature': temp,
            'Humidity': humid,
            'BatteryVoltage': batt
        }
```
Omron環境センサBAG版と同じ、ブロードキャストモードでセンサ値取得します。
取得したデータ内容が複雑だったので、上記の参考

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

```python:switchbot_toSpreadSheet.py
from bluepy import btle
from switchbot import SwitchbotScanDelegate

######SwitchBotの値取得######
#switchbot.pyのセンサ値取得デリゲートを、スキャン時実行に設定
scanner = btle.Scanner().withDelegate(SwitchbotScanDelegate())
#スキャンしてセンサ値取得（タイムアウト5秒）
scanner.scan(5.0)
#試しに温度を表示
print(scanner.delegate.sensorValue['Temperature'])

#Googleスプレッドシートにアップロードする処理を④で記載
```

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

```
python switchbot_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)ご参照ください