昨年のアドベントカレンダーでSwitchbotの温湿度計をenebular-agentに繋ぐというのを試してみましたが、SwitchbotのセンサーやBotは様々な種類が販売されているので、他にも試してみました。
SwitchBotの人感センサーとドア開閉センサー、スイッチを押すためのボット、スマート加湿器です。Raspberry PiとBluetoothで接続することができます。
準備
まず、準備としてBluetoothをPythonで扱うためのモジュールをインストールします。
$ sudo apt install -y python3-pip
$ sudo apt install -y python-dev libbluetooth3-dev
$ sudo pip3 install pybluez
$ sudo apt install -y libglib2.0 libboost-python-dev libboost-thread-dev
$ sudo pip3 install gattlib
$ sudo pip3 install bluepy
人感センサーとドア開閉センサーは以下のPythonプログラムで値を取得します。引数でBLEの固有アドレスを指定します。Switchbotのセンサーは事前にスマホアプリから設定を行い、BLEの固有アドレスを取得しておきます。
import sys
import binascii
from bluepy.btle import Scanner, DefaultDelegate
macaddr = ''
class ScanDelegate( DefaultDelegate ):
def __init__( self ):
DefaultDelegate.__init__( self )
def handleDiscovery( self, dev, isNewDev, isNewData ):
if dev.addr == macaddr:
data = dev.getScanData()
for item in data:
if(item[0] == 22):
door = "false"
light = "false"
pir = "false"
bytedata = binascii.unhexlify( item[2] )
if( bytedata[3] & 0x40 ): pir = "true"
if( bytedata[5] & 0x02 ): door = "true"
if( bytedata[5] & 0x01 ): light = "true"
print( '{ "pir": ' + str( pir ) + ', "door": ' + str( door ) + ', "light": ' + str( light ) + ' }' )
exit()
macaddr = sys.argv[1]
scanner = Scanner().withDelegate( ScanDelegate() )
scanner.scan( 0 )
人感センサーもドア開閉センサーも光センサーが内蔵されていて、その値も取得できます。出力はJSONで出力するようにしています。
次にSwitchbotのボットを動かすプログラムを用意します。こちらは、Switchbotオフィシャルが用意しているプログラムを使用しました。
$ sudo apt install -y git
$ git clone https://github.com/OpenWonderLabs/python-host.git
上記を実施し、引数にBLEの固有アドレスと動作を指定すると動きました。
$ sudo python3 switchbot_py3.py --device XX:XX:XX:xx:xx:xx Press
enebular-agentで動作させる
簡単に値を取得するフローを作って確認してみました。
debugノードでセンサーから取得された値が確認できました。
(本記事は、書き途中です。動作確認しながら書き上げていきます。)