前回まででラズパイを母艦にしてセンシングしたデータをデータベース(InfluxDB)に保存してGrafanaでグラフ表示することができたので、今後は少しずつセンシングデータを増やしていく作業です。
今のところセンサーで取得できているデータは温度・湿度・気圧といった基本的なことと、PM2.5や植物栽培の水温・PH、それとソーラーパネルの発電量などと九州電力のスマートメーターを使った電気使用量のデータを取得できましたので順次記事にしていきますね。今後はセンシングしたデータを元に植物にLEDライト照射や水やり・水循環などの操作を自動で実行していきたい。(自動でできるようにならないとすぐ枯らすので・・・)
今回は手始めにサンプルソースがあって取得が簡単なWxBeacon2を使って自宅の温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシングしてデータをInfluxDBに追加、Grafanaでグラフ表示していきます。
こちら↓からの続きです。
ウェザーニュース WxBeacon2とは?
まずはWxBeacon2とはどういったものか、以下のように↓手の中に収まるくらい小さなガジェットです。この小さなガジェットが温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンシングしてくれます。
ウェザーニュースアプリ
WxBeacon2は2年ほど前に発売されたOmronが作ったセンサーで天気予報のウェザーニュースが販売、ウェザーニュースアプリでWxBeacon2から収集したデータを表示できるようになっています。
アプリを起動して左下のメニュー > WxBeacon2を選択、本体設定後にWxBeacon2から取得したデータが表示されます。↓
アプリとWxBeacon2はBLE(Bluetooth Low Energy)接続で通信します。
この表示だけで十分かもしれませんが、せっかくなので自分で取得してグラフ表示してみます。
ウェザーニュースのWxBeacon2サイト
現在は4798円で販売されています。(ポイントためて優待割引あり)
アマゾンでもOMRON 2JCIE-BL01で販売されていますが、価格が倍以上しています・・・
WxBeacon2のビーコン モードをIMに変更
WxBeacon2のビーコンモードを変更
こちら↓の方はかなり詳しく書いてあって参考になりました。ありがとうございます。SHで取得する場合は以下のやり方で、自分はPythonスクリプトでInfluxDBに投げるようにしてみました。といってもサンプルスクリプトがあるので設定をちょこっと変更したのみ。
WxBeacon2のモードをGeneral Broadcaster 1に変更すると常時接続できるようになるらしいのでIMに変更します。
WxBeacon2(OMRON 2JCIE-BL01)のマニュアルは以下、
デフォルトのEnvモード↓だとバッテリー節約のために定期的にしか接続できないので、取得するタイミングがズレるとデータを取得できない。なのでIMにすると常時接続できてエラーにならない代わりにバッテリーが早く消耗しそう。
スマホアプリで取得するだけだったらEnvで大丈夫です。自前のスクリプトで取得する場合はモードを変更しないとエラーになてしまったのでIMに変更していきます。
BLE Scanner インストール
近くにあるBLE機器を探したり設定もできるスマホアプリBLE ScannerをインストールしてWxBeacon2のビーコンモードを変更していきます。
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サンプルスクリプト ダウンロード
以下のようにラズパイや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
2024 Python2をインストールして動かす
新しいOSでPython2が入らないので、以下を実行する。
sudo apt install python2
sudo apt install python-dev
sudo apt install libbluetooth-dev
pipインストール
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
sudo python2 get-pip.py
sudo /home/go/.local/bin/pip2 install requests
sudo /home/go/.local/bin/pip2 install pybluez
うまくいかなかったら。
sudo /home/go/.local/bin/pip2 uninstall bluetooth
sudo /home/go/.local/bin/pip2 install pybluez==0.22
sudo /usr/bin/python2 /home/go/script/omron/envsensor_observer.py
sudo /home/go/.local/bin/pip2 install influxdb
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ファイルをダウンロードできるようにしておきましたので、よかったら使ってください。
jsonファイルのインポート方法は以下のページで説明してありますので参考にしてください。
直近3ヶ月弱のデータ
最終的に以下のように温度・湿度・気圧・照度・騒音・紫外線・不快指数・熱中症危険度の8つをセンサーでグラフが一気に増えました♪
自宅センシングのグラフ化がこれで一歩進みました♪ 次回もどんどんデータを取得してグラフ化していきます。
以下、おまけで失敗した方法をメモしておいたので必要なければ読み飛ばしてください。
おまけ 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日程度経ったらなぜか?取得できなくなった・・・使えないかな?
ということで、こちらは現在使っていません。
コメント