#はじめに
本記事は、Omron環境センサ(BAG型)の記事と同内容を、
低価格で画面表示付きのSwitchBot温湿度センサで実施した記事です。
#SwitchBotとは?
中国・深圳のメーカーWonderlabs Inc.が開発した、家庭用IoT機器シリーズです。
今回は、上記シリーズの温湿度センサ
を使用します。
低価格(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の公式アプリでMACアドレスを確認したあと、
RaspberryPiで下記コマンドを実行
sudo hcitool lescan
LE Scan ...
AA:EE:BB:DD:55:77 (unknown)
上記で、アプリで確認したMACアドレスが出てくれば成功です。
##②センサの測定値をPythonで取得
###bluepyでの認識確認
bluepyは、PythonでBluetooth Low Energy(BLE)にアクセスするためのライブラリです(クラス定義)
・必要なパッケージのインストール
下記をインストールします
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
###センサ値取得スクリプトの作成
センサ値取得のため、下記のスクリプトを作成します
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版と同じ、ブロードキャストモードでセンサ値取得します。
取得したデータ内容が複雑だったので、上記の参考
###メインスクリプトの作成
センサ値取得スクリプトを呼び出すため、メインスクリプトを作成します
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を叩いてスプレッドシートにデータ書き込み
オムロン環境センサの記事ご参照ください
##④スクリプトの定期実行
オムロン環境センサの記事ご参照ください