目的
掲題の通りです。以下の記事を存分に参考にしています。ありがとうございます。コードがほぼ同じなのでご指摘をいただいた場合は即削除します。
SwitchBot温湿度計の値をRaspberryPiでロギング
https://qiita.com/c60evaporator/items/7c3156a6bbb7c6c59052
私の環境で一部動かない箇所がありましたので、私的なログとして動作したコードを置いておきます。
環境
- Raspberry Pi 4 Model B Rev 1.2
- SwitchBot 温湿度計 (https://www.switchbot.jp/meter)
SwitchBot 温湿度計の Mac Address を確認
スマートフォンのアプリケーションから確認できます。
センサがデータを飛ばしているか確認
pi@raspberrypi:~ $ sudo hcitool lescan | grep EB:F6:31:8C:1F:E9
EB:F6:31:8C:1F:E9 (unknown)
EB:F6:31:8C:1F:E9 (unknown)
EB:F6:31:8C:1F:E9 (unknown)
このコマンドは何?
NAME
hcitool - configure Bluetooth connections
DESCRIPTION
hcitool is used to configure Bluetooth connections and send some spe-
cial command to Bluetooth devices. If no command is given, or if the
option -h is used, hcitool prints some usage information and exits.
Python で値を取得
bluepy を利用します。リンク先のURLを参考に。
pi@raspberrypi:~ $ sudo install libglib2.0-dev
pi@raspberrypi:~ $ pip3 install bluepy
pi@raspberrypi:~ $ cd .local/lib/python3.7/site-packages/bluepy
pi@raspberrypi:~ $ sudo setcap 'cap_net_raw,cap_net_admin+eip' bluepy-helper
Python スクリプト
switchbot.py
from bluepy import btle
import struct
class SwitchbotScanDelegate(btle.DefaultDelegate):
def __init__(self, macaddr):
btle.DefaultDelegate.__init__(self)
self.sensorValue = None
self.macaddr = macaddr
def handleDiscovery(self, dev, isNewDev, isNewData):
if dev.addr == self.macaddr:
for (adtype, desc, value) in dev.getScanData():
if desc == '16b Service Data':
self._decodeSensorData(value)
def _decodeSensorData(self, valueStr):
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
self.sensorValue = {
'SensorType': 'SwitchBot',
'Temperature': temp,
'Humidity': humid,
'BatteryVoltage': batt
}
main.py
from bluepy import btle
from switchbot import SwitchbotScanDelegate
scanner = btle.Scanner().withDelegate(SwitchbotScanDelegate('eb:f6:31:8c:1f:e9'))
scanner.scan(5.0)
print(scanner.delegate.sensorValue)
pi@raspberrypi:~ $ python3 ./main.py
{'SensorType': 'SwitchBot', 'Temperature': 25.2, 'Humidity': 68, 'BatteryVoltage': 100}