raspberryPiを使ってswitchBotの温湿度計から温度を取得する方法

自宅で過ごす時間が多くなると、自宅をより快適な空間にしたいと思うこともあると思います。
本記事ではRaspberryPiを使って、格安bluetooth温度計であるSwitchBotの温湿度計から
温度や湿度を取得する方法を記したいと思います。


#前提
- raspberryPiにsshでログインできるところまで設定が終わっている
- pythonが扱える
- gitでコードをpullできる
- viが使用できる
- SwitchBot温湿度計を持っている

#ゴール
- switchBot温湿度計から温度と湿度を取得しテキストファイルに出力する

#使用する温度計
switchBot温湿度計はアマゾンから購入できます。
2020年9月現在、２０００円を切る価格で入手可能です。
<a href="https://www.amazon.co.jp/SwitchBot-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%9C%E3%83%83%E3%83%88-%E3%82%B9%E3%82%A4%E3%82%B9%E8%A3%BD%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E7%AE%A1%E7%90%86-GoogleHome-IFTTT%E5%AF%BE%E5%BF%9C/dp/B07L4QNZVF/ref=as_li_ss_il?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=switchbot+%E6%B8%A9%E5%BA%A6%E8%A8%88&qid=1600732947&sr=8-5&linkCode=li1&tag=nonbiriya21-22&linkId=69356da96cae989a050034e5fe039b11&language=ja_JP" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B07L4QNZVF&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=nonbiriya21-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=nonbiriya21-22&language=ja_JP&l=li1&o=9&a=B07L4QNZVF" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

#1. はじめに
raspberryPiがswitchBot温湿度計をbluetoothで認識しているか確かめます。
本手順は飛ばしてもらっても大丈夫です。

###1.1. switchBot温湿度計のbluetoothのMACアドレスを調べる

switchBotのアプリからbluetoothのMACアドレスを確認します。
####1.1.1. アプリを開き、bluetoothのMACアドレスを取得したい機器名をタップする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389388/840cc35c-a84a-9483-1efb-0f7d2ad5cfbf.jpeg" width = 35%>

####1.1.2. 画面右上の「・・・」をタップする
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389388/0e3b2a76-251a-299a-fbe7-816dbb50b7ed.jpeg" width = 35%>

####1.1.3. BLE MACで表示されているのがbluetoothのMACアドレス
画像中の例だと<b>F2:4C:0A:14:24:13</b>がbluetoothのMacアドレス
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389388/be90ccfd-d101-1d88-3a82-d5ea6cda9361.png" width = 35%> 

###1.2. rasberryPiがswitchBot温湿度計を認識しているか調べる

```
sudo hcitool lescan
```

以下のようにbluetoothのmacアドレスが出力されます。
以下に温度を取得させたいswitchbot温湿度計のbluetoothMACアドレスが記載されていればオッケー。

```
LE Scan ...
1C:C2:8E:27:DE:CF (unknown)
40:58:BF:7E:B1:22 (unknown)
40:58:BF:7E:B1:22 (unknown)
5E:3D:12:6C:E7:E6 (unknown)
5E:3D:12:6C:E7:E6 (unknown)
73:69:9F:B9:C6:8C (unknown)
73:69:9F:B9:C6:8C (unknown)
18:81:0E:EA:B6:7B (unknown)
18:81:0E:EA:B6:7B (unknown)
21:BF:DD:3B:CD:A5 (unknown)
53:15:4D:6C:AE:5C (unknown)
53:15:4D:6C:AE:5C (unknown)
5E:FC:F6:B4:7D:02 (unknown)
```
※表示されていなくてもしばらく待てば表示されることもあります。

スキャンが終わったら<b> ctl + c </b>でスキャンをストップします。

#2.ソースをダウンロードする

githubにswitchbot温湿度計から温度を取得できるスクリプトが配布されています。
git cloneでソースコードを取得しましょう。

```
#iotというフォルダを作る
mkdir iot
cd iot
#githubからソースをダウンロードする
git clone https://github.com/OpenWonderLabs/python-host.git
```

python-hostというフォルダができていればok


#3. 実行に必要なモジュールをインストールする

ダウンロードしたソースを実行するために必要なモジュールをインストールします。

```
sudo apt-get -y install libglib2.0-dev
sudo pip install pexpect
sudo pip install bluepy
```

#4. 動作確認を行う
以下のコマンドを実行して動作確認をします。

```
cd python-host
sudo python switchbot_meter.py
```

以下のようにスキャン結果が表示されればオッケー

```
Usage: "sudo python switchbot.py [mac_addr  cmd]" or "sudo python switchbot.py"
Start scanning...
22 16b Service Data 000d540064089a37 16
22 16b Service Data 000d540064039a39 16
scan timeout
(0, [u'f2:4c:0a:14:24:13', "Humiture:26.8'C 55%"])
(1, [u'f8:26:b7:72:bf:51', "Humiture:26.3'C 57%"])
```

<b>ctl + c</b> でコマンド実行を終了します。

#5. テキストファイルに結果を出力するように変更する
ダウンロードしたswitchbot_meter.pyの一部を変更し、温度の取得結果をテキストファイルへ出力するようにします。
まずタッチコマンドで出力先のファイルを作成します。

```
touch ondo.txt
```


viでswitchbot_meter.pyを開きます。

```
sudo vi switchbot_meter.py
```

210行目〜222行目を以下のように変更します。
※vi のコマンドモードで<b>:210</b>と入力すると210行目に移動します。

変更前

```python
if not dev_list:
    print("No SwitchBot nearby, exit")
    sys.exit()
for idx, val in enumerate(dev_list):
    print(idx, val)

    dev_number = int(input("Input the device number to control:"))

    if dev_number >= len(dev_list) :
        print("Input error, exit")
    bluetooth_adr = dev_list[dev_number]

#Trigger the device to work
#If the SwitchBot address is known you can run this command directly without scanning

    trigger_device(bluetooth_adr)

```

変更後(210行目以降をコメントアウトしてファイルの読み書きをするように書き換える)

```python
if not dev_list:
    print("No SwitchBot nearby, exit")
    sys.exit()
    with open("/home/pi/iot/python-host/ondo.txt","w") as f:
        f.write("")
    with open("/home/pi/iot/python-host/ondo.txt","a") as f:
        for idx, val in enumerate(dev_list):
              f.write(str(val[0])+","+str(val[1])+","+str(val[2])+"\n")

#for idx, val in enumerate(dev_list):
#    print(idx, val)

#    dev_number = int(input("Input the device number to control:"))

#    if dev_number >= len(dev_list) :
#        print("Input error, exit")
#    bluetooth_adr = dev_list[dev_number]

#Trigger the device to work
#If the SwitchBot address is known you can run this command directly without scanning

#    trigger_device(bluetooth_adr)

```

114行目も書き換える
変更前

```
elif dev_type == 'T':
    meter_list.append([mac,"Humiture:%.1f'C %d%%"%(meterTemp, meterHumi)])
if ord(dev_type) == ord('L') + 128:
```

変更後

```
elif dev_type == 'T':
    meter_list.append([mac,meterTemp, meterHumi])
if ord(dev_type) == ord('L') + 128:
```


#6. 動作確認を行う
コードの変更が終わったら動作確認を行います。


```
sudo python switchbot_meter.py 
```

エラーなく実行されることを確認します。

結果がondo.txtに出力されていることを確認します。

```
cat ondo.txt 
```

以下のようにMACアドレス、温度、湿度の順で表示されていればオッケー

```
f2:4c:0a:14:24:13,27.5,47
```
上記はf2:4c:0a:14:24:13の温度計が27.5度、湿度47%を記録したという意味です。

#7. 今後
例えばcronで定時実行することで、温度と湿度を取得できます。
今回はテキストファイルに出力しましたが、sqlite3などに出力して温度データを蓄積するのも良いかもしれません。

#8. 検索用キーワード
お家Iot
温湿度
switchbot温度計
switchbot湿度計
Iot初心者
ラズパイ
家庭Iot
お家ハック