浅草ギ研の BLE温湿度&照度センサーBLECAST_ENV

| コメント(0)

浅草ギ研のBLECAST_ENVがすごい。
お値段が7000円くらいでちょっと高いけれど、これはすごい。
いちいち接続しなくて済むし、Bluetooth Low Energy(BLE)のブロードキャストパケットの中に温度湿度を紛れ込ませ配信してくれる。「接続」がないから「切断」でエラーが出ない。
精度の記載がないけれどたくさん取得してもゆらぎがない。
しかも単四電池で1年間動いてくれるという。やっつけ仕事てきなパッケージ。本体と電池ボックスは秋葉原の千石電商で買って来た。

IMG_20180716_174339-600x800.jpg

BLEに対応しているラズパイからスキャンしてデータ取得できているか確認する。 ラズパイ側はzero wです。BLECAST_ENVはもちろん乾電池を接続して起動済み。

root@raspberrypiw:~/py# hcitool lescan             #スキャンコマンド実行
Set scan parameters failed: Input/output error     #もしエラーなら?
root@raspberrypiw:~/py# hciconfig hci0 down        #BLEをいったんダウン
root@raspberrypiw:~/py# hciconfig hci0 up          #そのあとアップ
root@raspberrypiw:~/py# hcitool lescan             #スキャン開始
LE Scan ...                                        #スキャン開始(10秒以上待機する)
3B:07:DE:9C:86:6C (unknown)                        #なにか違うものが認識
D4:BC:25:86:CB:7D ENV_0                            #BLECAST_ENVきた!

さらに上記コマンドを実行中にbtmonを実行すると状況をモニターできる。 btmon.pngこのデータ部は浅草ギ研のwebサイトに掲載されている温度と照度とカウンター部になっている。

asakusa.pngもちろんこのままでは利用しにくいのでpythonからデータ取得を試みる。


pythonでBLEを使えるようにするにはいろいろモジュールをインストールする必要がある、その点はどこかで調べてインストールすること。
肝心なのはpythonのソースコード、これがなかなかいいサンプルが見つからない。BLEでconnectしてデータを取得するセンサータグ方式のものはたくさん見つかるが、アドバタイジングパケットを受信して表示するものが見つからない。ほうぼう探して見つけたのはhttps://github.com/espruino/EspruinoDocs/blob/master/puck/Puck.js%20Advertising.mdにあるpythonサンプルが参考になった。

#以下部分は自分のBLECAST_ENVに書き換える。その際は小文字で記入すること。
# The devices we're searching for
devices = [
  "de:70:d9:0c:eb:86"        
];

for文の前に生データを出力する部位を挿入する
print dev.getScanData()

また以下の部分はデバイス固有の部分があるため書き換える
      # if adtype==255 and value[:4]=="9005": # Manufacturer Data
      if adtype==255 : # Manufacturer Data

アドバタイジングデータが書き換わっていない場合は出力を抑止している部位を
コメントアウトする。
        #if not dev.addr in lastAdvertising or lastAdvertising[dev.addr] != data:
        #  onDeviceChanged(dev.addr, data)
        #lastAdvertising[dev.addr] = data

そして浅草ギ研のデータ部説明を基に値の計算を含めるようにしたソース
洗練されていないと思うが、初心者なので各値をそのまま出力している。
----------------------------------------
from bluepy.btle import Scanner, DefaultDelegate

def onDeviceChanged(addr, data):
  print "Device %s, value %s" % (addr,data)

# The devices we're searching for
devices = [
  "d4:bc:25:86:cb:7d"
];
# Whatever the last data was
lastAdvertising = {}

# Gets the actual scanning data
class ScanDelegate(DefaultDelegate):
  def __init__(self):
    DefaultDelegate.__init__(self)
  def handleDiscovery(self, dev, isNewDev, isNewData):
    if not dev.addr in devices: return
    print dev.getScanData()
    for (adtype, desc, value) in dev.getScanData():
      #if adtype==255 and value[:4]=="9005": # Manufacturer Data
      if adtype==255 : # Manufacturer Data
        #data = value[4:]
        data = value
        #--temperature
        MSB = value[4:6]
        LSB = value[6:8]
        print MSB
        print LSB
        print int(MSB,16)
        print int(LSB,16)
        Gvalue=(int(MSB,16)*256) + int(LSB,16)
        print Gvalue
        temperature = (175.72*Gvalue/65536) - 46.85
        print "temperature" + str( temperature )
        #--COUNTER
        COUNTER = value[12:14]
        print "COUNTER" + str( COUNTER )
        #--humidity
        MSB = value[0:2]
        LSB = value[2:4]
        print MSB
        print LSB
        print int(MSB,16)
        print int(LSB,16)
        Gvalue=(int(MSB,16)*256) + int(LSB,16)
        humidity = (125*Gvalue/65536) - 6
        print "humidity" + str( humidity )
        #--Illumination
        MSB = value[8:10]
        LSB = value[10:12]
        print MSB
        print LSB
        print int(MSB,16)
        print int(LSB,16)
        Gvalue=(int(MSB,16)*256) + int(LSB,16)
        Illumination = int(Gvalue)
        print "Illumination" + str(Illumination)
        onDeviceChanged(dev.addr, data)
        #if not dev.addr in lastAdvertising or lastAdvertising[dev.addr] != data:
        #  onDeviceChanged(dev.addr, data)
        #lastAdvertising[dev.addr] = data



# Start scanning
scanner = Scanner().withDelegate(ScanDelegate())
scanner.clear()
scanner.start()
# Keep scanning in  10 second chunks
while True: scanner.process(1)
# in case were wanted to finish, we should call 'stop'
scanner.stop()
----------------------------------------

このソースをpythonで実行すると10秒ごとのブロードキャストをひろって表示してくれる。

コメントする

このブログ記事について

このページは、powerpcが2018年7月16日 17:12に書いたブログ記事です。

ひとつ前のブログ記事は「テルモロッシのエコサーモ1000をFFストーブにする(オリジナルはFE)」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。