59
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-05-15

#はじめに
本記事は、Omron環境センサ(BAG型)の記事と同内容を、
低価格で画面表示付きのSwitchBot温湿度センサ
で実施した記事です。

#SwitchBotとは?
中国・深圳のメーカーWonderlabs Inc.が開発した、家庭用IoT機器シリーズです。
今回は、上記シリーズの温湿度センサ
switchbot.jpg
を使用します。
低価格(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

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

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版と同じ、ブロードキャストモードでセンサ値取得します。
取得したデータ内容が複雑だったので、上記の参考

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

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を叩いてスプレッドシートにデータ書き込み
オムロン環境センサの記事ご参照ください

##④スクリプトの定期実行
オムロン環境センサの記事ご参照ください

59
58
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?