enebular-agentは、Gatewayとしての役割を持ちます。直接、Webに繋がらないデバイスを中継して、IoTシステムを構築することができます。
Bluetooth接続のセンサーをenebular-agentがインストールされているRaspberry Piに繋げて、センサーの値をWebにアップロードするデバイスを作ってみたいと思います。
Bluetooth接続のセンサーはさまざまな種類がありますが、今回はとても安価なSwitchBot 温湿度計を使います。Amazonで2000円ほどで購入できます。
使用するもの
- Raspberry Pi 3B+
- microSDカード(Raspbian Buster base + enebular-agent v2.15.2 )
- enebular-agentのインストール方法はenebular-agentのドキュメントを参照ください
- こちらも参考に
- 電源
- microSDカード(Raspbian Buster base + enebular-agent v2.15.2 )
- SwitchBot 温湿度計
SwitchBot 温湿度計
なぜ、このセンサーを選んだかと言いますと安価ということもありますが、Bluetooth(BLE)の通信仕様がオフィシャルで公開されています。
そのため、通信仕様を調べる必要はありません。
単体で調べる方法もありますが手間がかかるため、SwitchBotのスマホアプリに接続して、事前にBLEの固有アドレスを調べてます。
事前準備
センサーとBluetooth通信する部分はPythonのbluepyを使いました。それを事前にインストールします。
通信を簡単にするため、毎回Scanする様にします。bluepyでScanを使用するにはルート権限が必要なため、ルートでbluepyをインストールします。
> sudo pip3 install bluepy
pythonのプログラムは引数でBLEの固有アドレスを指定し、標準出力でJSON型の温度、湿度を出力するようにしました。このプログラムをexecノードで呼び出し、結果を取ります。
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):
bytedata = binascii.unhexlify( item[2] )
flag = bytedata[6] & 0x80
temperature = ( bytedata[6] & 0x7F ) + ( bytedata[5] & 0x0F ) / 10
if not flag:
temperature = -temperature
humidity = bytedata[7] & 0x7F
print( '{ "temperature": ' + str( temperature ) + ', "humidity": ' + str( humidity ) + ' }' )
exit()
macaddr = sys.argv[1]
scanner = Scanner().withDelegate( ScanDelegate() )
scanner.scan( 0 )
フローの準備
単純にinjectノードで、定期的に呼び出し、debugノードでセンサーの値を確認します。直接、確認するためenebular-agentはenebular editorからリモートモードで接続します。
execノードの設定は以下のようになってます。
動作確認
簡単に温度・湿度がjson型で取得できました。
次回
次はセンサーの値をWebにアップロードしてグラフ化・・というのはありきたりなので、アップロードして、何かと連動させてみたいと思います。