Windows10でBLE SwitchBot温湿度計

 SwitchBot温湿度計は、アマゾンで安価に入手できます。この記事では、matlabでアクセスしました。

  CO2センサを使う⑥Windows10でBLEセントラル

の記事では、Windows10用BLEライブラリbleakを利用しました。この二つの記事から、ここでは、Windows10のPython3を用いてSwitchBot温湿度計の温度と湿度を読み出し、グラフを描きます。

データの形式

 この資料から、

  • 0x57 Magic Number
  • 0x0f 拡張コマンドを送るよ
  • 0x31 ペイロード;Read the Display Mode and Value of the Meter

の3バイトを送りnotifyにすると、温度と湿度を送り返してくれます。送られてくるのは、次の4バイトです。

  • ステータス 1 – OK
  • 温度の小数点部分 0~9の数値
  • 温度 MSBは符号、残りが0~127℃の数値
  • 湿度 整数0~99

ライブラリのインストール

 コマンドプロンプトを立ち上げます。

pip3 install bleak

 すでに古いバージョンが入ってたら、次のように最新の状態にします。

pip3 install --upgrade bleak

プログラム

 温度は零下を無視しています。ここライブラリでNotifyにする方法はわかりません。

 アドレスは、「CO2センサを使う⑥Windows10でBLEセントラル」のscan.pyで取得しました。

 アドレスの一致でつながると、サービスUUIDは使われないようです。command_CharacteristicUUID は書き込みのとき、data_CharacteristicUUID は読み出しのときに使われるキャラクトリスティックです。



import asyncio
from bleak import BleakClient
import time
import matplotlib.pyplot as plt

address = "D6:D3:6E:EF:4B:A2"
Bot_ServiceUUID            = "CBA20D00-224D-11E6-9FB8-0002A5D5C51B";
data_CharacteristicUUID    = "CBA20003-224D-11E6-9FB8-0002A5D5C51B";
command_CharacteristicUUID = "CBA20002-224D-11E6-9FB8-0002A5D5C51B";

async def run(address):
    async with BleakClient(address) as client:
        count = 20
        Temperature_g=[]
        Humidity_g=[]
        x_g=[]
        
        for x in range(1,count):
            write_byte = bytearray(b'\x57\x0f\x31')
            await client.write_gatt_char(command_CharacteristicUUID, write_byte)
            data = await client.read_gatt_char(data_CharacteristicUUID)
            # print(data)
            Temperature_I = data[1]
            Temperature_D = data[2]  & 0b01111111
            Humidity = data[3]
        
            print("{:d}.{:d}`C  {:d}%".format(int(Temperature_D), int(Temperature_I), int(Humidity)))
        
            Temperature_g.append(Temperature_D)
            Humidity_g.append(Humidity)
            x_g.append(x)
            
            time.sleep(2)

        fig,ax1 =plt.subplots()
        ax2 = ax1.twinx()
        ax1.plot(x_g, Temperature_g, marker = "v", color = "red", label="Temperature")
        plt.xlabel("time")
        ax1.set_ylabel("temp [`C]")
        plt.grid()

        ax2.plot(x_g, Humidity_g, marker = "o", color = "green", label="Humidity")
        ax2.set_ylabel("Humidity [%]")
        plt.show()
        
loop = asyncio.get_event_loop()
loop.run_until_complete(run(address))

実行

 SwitchBot温湿度計は、本体の裏面にある小さな押しボタンを数秒押すと、アドバタイジング状態になります。