WxBeacon2で温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシングしてグラフ表示

前回まででラズパイを母艦にしてセンシングしたデータをデータベース(InfluxDB)に保存してGrafanaでグラフ表示することができたので、今後は少しずつセンシングデータを増やしていく作業です。

今のところセンサーで取得できているデータは温度・湿度・気圧といった基本的なことと、PM2.5や植物栽培の水温・PH、それとソーラーパネルの発電量などと九州電力のスマートメーターを使った電気使用量のデータを取得できましたので順次記事にしていきますね。今後はセンシングしたデータを元に植物にLEDライト照射や水やり・水循環などの操作を自動で実行していきたい。(自動でできるようにならないとすぐ枯らすので・・・)

今回は手始めにサンプルソースがあって取得が簡単なWxBeacon2を使って自宅の温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシングしてデータをInfluxDBに追加、Grafanaでグラフ表示していきます。

WxBeacon2

こちら↓からの続きです。

自宅のIot化でLED照明オンオフ(Xiaomi LED)や玄関鍵の開閉(セサミ スマートロック)、壁スイッチのオンオフ、部屋の空気の状態を表示させたりしていますが、不満点は専用のアプリでないと操作できないこと。それと同じメーカーでないと他のメーカーのIot製品は表示・操作できないことが歯がゆい。 Iotの...
自宅環境センシングの2回目の記事として今回はラズパイ(Raspberry Pi)にデータベースのInfluxDBを入れて将来的にセンシングしたデータをInfluxDB保存していきます。 そして次回は、GrafanaというデータをWebで美しく表示してくれるデータ可視化ツールとラズパイのCPUやRAM使用率な...
センシングしたデータを保存するInfluxDBは前回ラズパイに構築したので今回はGrafana+telegrafを入れて設定していきます。おまけとしてChromografとvcgencmdを使ってCPU温度やCPU使用率・ARMのデータを取得してInfluxDBにインサートするところまでやっていきます。 I...

ウェザーニュース WxBeacon2とは?

まずはWxBeacon2とはどういったものか、以下のように↓手の中に収まるくらい小さなガジェットです。この小さなガジェットが温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシングしてくれます。

WxBeacon2

ウェザーニュースアプリ

WxBeacon2は2年ほど前に発売されたOmronが作ったセンサーで天気予報のウェザーニュースが販売、ウェザーニュースアプリでWxBeacon2から収集したデータを表示できるようになっています。

‎ウェザーニュース
‎ウェザーニュース

アプリを起動して左下のメニュー > WxBeacon2を選択、本体設定後にWxBeacon2から取得したデータが表示されます。↓

アプリとWxBeacon2はBLE(Bluetooth Low Energy)接続で通信します。

この表示だけで十分かもしれませんが、せっかくなので自分で取得してグラフ表示してみます。

ウェザーニュースのWxBeacon2サイト

現在は4798円で販売されています。(ポイントためて優待割引あり)

アマゾンでもOMRON 2JCIE-BL01で販売されていますが、価格が倍以上しています・・・

WxBeacon2のビーコン モードをIMに変更

WxBeacon2のビーコンモードを変更

こちら↓の方はかなり詳しく書いてあって参考になりました。ありがとうございます。SHで取得する場合は以下のやり方で、自分はPythonスクリプトでInfluxDBに投げるようにしてみました。といってもサンプルスクリプトがあるので設定をちょこっと変更したのみ。

OMRONの環境センサ「2JCIE-BL01」が入ったWxBeacon2を屋外に設置して、外部環境をモニタリングします! 以前の記事でラズパイを部屋の中に設置して温湿度・気圧等を2...

WxBeacon2のモードをGeneral Broadcaster 1に変更すると常時接続できるようになるらしいのでIMに変更します。

WxBeacon2(OMRON 2JCIE-BL01)のマニュアルは以下、

OMRON Micro Devices - Main page

デフォルトのEnvモード↓だとバッテリー節約のために定期的にしか接続できないので、取得するタイミングがズレるとデータを取得できない。なのでIMにすると常時接続できてエラーにならない代わりにバッテリーが早く消耗しそう。

WxBeacon2

スマホアプリで取得するだけだったらEnvで大丈夫です。自前のスクリプトで取得する場合はモードを変更しないとエラーになてしまったのでIMに変更していきます。

BLE Scanner インストール

近くにあるBLE機器を探したり設定もできるスマホアプリBLE ScannerをインストールしてWxBeacon2のビーコンモードを変更していきます。

‎BLE Scanner 4.0
‎BLE Scanner 4.0
BLE Scanner
BLE Scanner
Price: Free+

IM(General Broadcaster 1)に変更

まずは「Env」と表示されているガジェットを探します。見つかったら「CONNECT」をタップ。

Envに接続できたらCUSTOM SERVICEの「0C4C3040-・・・」を選択、その中の「UUID:0C4C3042・・・」を探して右上の「W」を押して、Text→ByteArryに変更して「0808a0000a0032000200」を入力します。

IMに変わらない場合はWxBeacon2の電池を取って付けて再起動してみましょう。

以上でWxBeacon2のビーコンモードをIMに変更できました。

Omronサンプルスクリプト

では、ラズパイでWxBeacon2からデータを取得してInfluxDBにインサートするPythonスクリプトを設定していきましょう。

PythonスクリプトはすでにOmronがサンプルスクリプトを作ってくれているので、それをちょちょっと改造して利用しますので特に難しいところは無いと思います。

Omronサンプルスクリプト ダウンロード

Python Bluetooth low energy observer example for OMRON Environment Sensor (2JCIE-BL01) - OmronMicroDevices/envsensor-observer-py

以下のようにラズパイやLinux機でダウンロードしましょう。

$ sudo apt-get install git-core #gitコマンドが入っていない場合のみ
$ cd /home/pi/script
$ git clone  https://github.com/OmronMicroDevices/envsensor-observer-py.git

ダウンロード完了するとenvsensor-observer-pyというディレクトリができて、さらに中にenvsensor-observer-pyディレクトリ、その中にサンプルスクリプトが入っています。紛らわしいのでomronに変えて「/home/pi/script/omron」に置くことにしました。

$ mv envsensor-observer-py/envsensor-observer-py omron
$ cd omron

pythonでBluetoothを使えるようにライブラリも導入します。

$ sudo apt-get install python-bluez

Pythonサンプルスクリプト 修正箇所

基本的にconf.pyをご自分の環境に変更するだけで動くと思います、その他にもちょっとした変更をしました。

conf.py

まずは設定ファイルでInfluxDBを使いますので下の方にあるINFLUXDB_OUTPUTを「True」にして、その他5項目を変更します。

$ vim conf.py
・・・省略
# uploading data to the cloud (required influxDB 0.9 or higher)
INFLUXDB_OUTPUT = True
# InfluxDB
INFLUXDB_ADDRESS = "192.168.31.53"  # enter IP address of influxDB
INFLUXDB_PORT = 8086  # enter port number of influxDB
INFLUXDB_DATABASE = "sensor"  # enter influxDB database name
INFLUXDB_MEASUREMENT = "air5"  # enter measurement name
INFLUXDB_USER = "root"  # enter influxDB username
INFLUXDB_PASSWORD = "xxxxx"  # enter influxDB user password

以下の項目を変更します。

  • INFLUXDB_ADDRESS:ラズパイのIPアドレス(分からない場合はifconfigコマンドで表示されます。)
  • INFLUXDB_PORT:8086のまま
  • INFLUXDB_DATABASE:保存するデータベース名
  • INFLUXDB_MEASUREMENT:保存するMEASUREMENT名(テーブル名)
  • INFLUXDB_USER:InfluxDBに接続するユーザー名
  • INFLUXDB_PASSWORD:InfluxDBに接続する時に使うパスワード

sensor_beacon.py

その他、sensor_beacon.pyをちょっとだけ変更する。

str_util.c2B(pkt[13]), str_util.c2B(pkt[12]))の部分

59行目、照度が整数だったので「* 1.0」をつけて小数点以下も表示できるようにした。

・・・省略
            self.val_light = str_util.bytes2ushort(
                str_util.c2B(pkt[13]), str_util.c2B(pkt[12]))* 1.0
・・・省略
json_body

252行目あたり、tagsを以下のように変更した。このあたりはお好みで変更してみてください。

        json_body = [
            {
                "measurement": conf.INFLUXDB_MEASUREMENT,
                "tags": {
                    "place": 'leaf',
                    "host": 'WxBeacon2',
                },
                "fields": {
                    "temp": self.val_temp,   #温度
                    "humi": self.val_humi,   #湿度
                    "lux": self.val_light,   #照度
                    "uv": self.val_uv,       #紫外線
                    "hpa": self.val_pressure,#大気圧
                    "noise": self.val_noise, #騒音
                    "di": self.val_di,       #不快指数
                    "heat": self.val_heat,   #熱中症危険度
                    "accel_x": self.val_ax,
                    "accel_y": self.val_ay,
                    "accel_z": self.val_az,
                    "etvoc": self.val_etvoc,
                    "eco2": self.val_eco2,
                    "si": self.val_si,
                    "pga": self.val_pga,
                    "seismic": self.val_seismic,
                    "vibinfo": self.vibinfo,
                    "battery": self.val_battery,#バッテリー
                    "rssi": self.rssi,
                    "distance": self.distance
                }
            }
        ]

動作確認

これで以下のように

$ sudo python envsensor_observer.py
envsensor_observer : complete initialization

----------------------------------------------------
sensor status : 2019-06-09 07:48:15.562838 (Intvl. 180sec)
 F8A882C63397 : IM : ACTIVE (2019-06-09 07:48:14.473948)

もしくは、うまく取得できない場合もあって以下のようになります。

$ sudo python envsensor_observer.py
envsensor_observer : complete initialization

^CExit
Traceback (most recent call last):
  File "envsensor_observer.py", line 381, in <module>
    parse_events(sock)
  File "envsensor_observer.py", line 53, in parse_events
    pkt = sock.recv(255)
KeyboardInterrupt

CronでKill&動作

最後にCronで自動的にスクリプトを動作させます。Pythonサンプルスクリプトは終了しないでずっとデータを取得して、いつの間にかゾンビ状態になるので一定期間でKillすることにしました。(終了するように改造すればいい話なのですが・・・面倒なので・・・)

失敗した方法(メモ)

少し時間を置いてから起動させないと動かなかったのでSleepしてみた。

$ sudo crontab -e
@reboot sleep 50; /usr/bin/python /home/pi/script/omron/envsensor_observer.py

これでも1時間ほどたつと起動しているが取得しなくなるので?いったんKillしてから起動させてみる。↓

12 */1 * * * pkill -f envsensor_observe[r].py &&  /usr/bin/python /home/pi/script/omron/envsensor_observer.py

&&の先の自分自身もKillしちゃって起動しないので分けてみた。

12 */1 * * * pkill -f envsensor_observer.py
13 */1 * * *  /usr/bin/python /home/pi/script/omron/envsensor_observer.py

成功!

以下のように5分でKillして3分起きに起動させてみたらうまくいった。

$sudo crontab -e
*/5 * * * * pkill -f envsensor_observer.py
*/3 * * * *  /usr/bin/python /home/pi/script/omron/envsensor_observer.py

この状態で3ヶ月弱の期間正常動作しているので問題ないと思います。

これでWxBeacon2でセンシングしたデータを定期的にInfluxDBにインサートすることができるようになりました。

WxBeacon2で3ヶ月弱データ取得

WxBeacon2で順調にデータを取得しています。3ヶ月弱で1回電池交換しました。Env(Standard Beacon)からIM(General Broadcaster 1)に変更したので消費電力多めで電池は2ヶ月程度しか持たないのかもしれません。

WxBeacon2.jsonファイル ダウンロード

WxBeacon2でセンシングしてInfluxDBにあるデータをGrafanaでグラフ表示すると以下のようになりました。Grafanaのjsonファイルをダウンロードできるようにしておきましたので、よかったら使ってください。

WxBeacon2

jsonファイルのインポート方法は以下のページで説明してありますので参考にしてください。

センシングしたデータを保存するInfluxDBは前回ラズパイに構築したので今回はGrafana+telegrafを入れて設定していきます。おまけとしてChromografとvcgencmdを使ってCPU温度やCPU使用率・ARMのデータを取得してInfluxDBにインサートするところまでやっていきます。 I...

直近3ヶ月弱のデータ

最終的に以下のように温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンサーでグラフが一気に増えました♪

温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシング

7日間グラフ

温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシング

90日間グラフ

自宅センシングのグラフ化がこれで一歩進みました♪ 次回もどんどんデータを取得してグラフ化していきます。

以下、おまけで失敗した方法をメモしておいたので必要なければ読み飛ばしてください。

おまけ WxBeacon2 うまくいかなかった方法

メモ的にうまく行かなかった方法も書いておきます。必要のない場合は読み飛ばしてくださいね。

こちらはこちらのページからコピーさせていただいたPythonファイルをInfluxDBにインサートできるように改造したものです。

1日程度は動いていましたが、原因不明でいつの間にか動かなくなったので上記のオムロンのサンプルスクリプトで解決しました。

ラズパイでBLEをスキャン

以下のようにhcitoolコマンドを使うと近くにあるBLEををリストアップしてくれます。Envと表示されているWxBeacon2のMacアドレスはF8:A8:82:C6:33:97なので接続していきます。

$ sudo hcitool lescan
LE Scan ...
06:43:B0:53:64:F7 (unknown)
25:F6:F2:62:B2:57 (unknown)
62:DE:C0:1D:20:09 (unknown)
E8:FD:8F:CF:37:EB (unknown)
E8:FD:8F:CF:37:EB Amazfit HB
F8:A8:82:C6:33:97 Env
38:56:10:00:00:8A (unknown)
38:56:10:00:00:8A (unknown)
B0:E5:ED:96:8E:DF honor Band 3-edf
88:0F:10:A4:EE:BF (unknown)
DB:48:63:24:EA:1B Amazfit Cor
4C:65:A8:D0:8E:1C (unknown)
84:68:3E:03:3A:94 90 urevo
88:0F:10:A4:EE:BF MI_SCALE

WxBeacon2に接続

WxBeacon2にgatttoolで接続してみます。何回か接続してもエラーになりましたが3回目で接続できた。

$ gatttool -b F8:A8:82:C6:33:97 -t random -I
[F8:A8:82:C6:33:97][LE]> connect
Attempting to connect to F8:A8:82:C6:33:97
Error: connect error: Function not implemented (38)
[F8:A8:82:C6:33:97][LE]> connect
Attempting to connect to F8:A8:82:C6:33:97
Error: connect error: Function not implemented (38)
[F8:A8:82:C6:33:97][LE]> connect
Attempting to connect to F8:A8:82:C6:33:97
Connection successful
[F8:A8:82:C6:33:97][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x0016 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0017, end grp handle: 0x0025 uuid: 0c4c3000-7700-46f4-aa96-d5e974e32a54
attr handle: 0x0026, end grp handle: 0x003a uuid: 0c4c3010-7700-46f4-aa96-d5e974e32a54
attr handle: 0x003b, end grp handle: 0x0043 uuid: 0c4c3030-7700-46f4-aa96-d5e974e32a54
attr handle: 0x0044, end grp handle: 0xffff uuid: 0c4c3040-7700-46f4-aa96-d5e974e32a54

WxBeacon2からセンシングデータを取得してInfluxDBにアップするPythonファイル

こちらのソースを改造させてもらったと思います。

$ git clone https://github.com/AmbientDataInc/EnvSensorBleGw.git

https://github.com/AmbientDataInc/EnvSensorBleGw/tree/master/src/gw_RPiのenv2ambientCS.pyを改造したのかな?忘れた。

テスト実行

$ sudo python env2ambientCS.py

そのままのデータだと出力できない。

BTLE Exception while connect on  f8:a8:82:c6:33:97
type:<class 'bluepy.btle.BTLEDisconnectError'>
args:()
BTLE Exception while connect on  f8:a8:82:c6:33:97
type:<class 'bluepy.btle.BTLEDisconnectError'>
args:()
BTLE Exception while connect on  f8:a8:82:c6:33:97
type:<class 'bluepy.btle.BTLEDisconnectError'>
args:()
BTLE Exception while connect on  f8:a8:82:c6:33:97
type:<class 'bluepy.btle.BTLEDisconnectError'>
args:()
connected to  f8:a8:82:c6:33:97
▒▒▒
   ▒'▒▒▒

PuTTYPuTTY

取得成功!

BTLE Exception while connect on  f8:a8:82:c6:33:97
type:<class 'bluepy.btle.BTLEDisconnectError'>
args:()
connected to  f8:a8:82:c6:33:97
6 14 48 971 0 1011 37 58 12 3

このデータをPythonスクリプトで取得・InfluxDBにインサートするように改造していきます。

Pythonスクリプトで使うライブラリをインストール

以下のようにbluepyなどをインストールしておく必要があります。

$ sudo apt-get install libglib2.0-dev
$ sudo pip install bluepy
$ sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

WxBeacon2からセンシングデータを取得してInfluxDBにアップするPythonファイル

うまくいかなかったPythonファイルですが、以下にありますので気になる方はチェックしてみてください。(WxBeacon2に常時接続できるGeneral Broadcaster 1に変更したらちゃんと動くのかもしれません。)

Cronで定期的にセンシングデータを取得

$ sudo crontab -e
@reboot /usr/bin/python /home/pi/script/env.py < /dev/null &

このようにして1日程度経ったらなぜか?取得できなくなった・・・使えないかな?

ということで、こちらは現在使っていません。

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。