環境センサー(WxBeacon2/Omron 2JCIE-BL01)編
1. まえがき
前回で環境センサーからデータを取得するサーバ用のRaspberry Piの準備ができました。 maky-ba.hatenablog.com
今回はそのRaspberry Pi上に環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータを収集する仕組みを構築します。
- 前編:収集サーバとなるRaspberry Pi Zero Wをセットアップ
- 中編:環境センサー(OMRON)からデータを収集(この記事)
- 後編:Home Assistantでのセンサーセットアップ
→改訂版あります。
- 環境センサー(WxBeacon2/Omron 2JCIE-BL01)編
- 1. まえがき
- 2. 環境センサーについて
- 3.環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータ取得準備
- 4. Omronサンプルコード利用の準備
- 5. Omronサンプルコードの設定と利用
- 6. つづく
2. 環境センサーについて
2.1. 「WxBeacon2」? それとも「2JCIE-BL01」?
ウェザーニューズ(weathernews)社が販売*1している簡易気象観測器 WxBeacon2(ウェザービーコン2)は、「温度」「湿度」「気圧」「明るさ」「騒音」「UV」の6要素*2を測定可能な優れモノです。4.6cm x 3.9 cm と非常にコンパクトな一体型環境センサーで、コイン電池で長期間稼働します。
中身はオムロン(Omron)製の2JCIE-BL01から3軸加速度センサーを除いたもの、と思っていましたが、オムロンのサイトを再度確認すると、「6種類のセンサー」と記載されているので同じものなのかな??以前は違っていた気が…。でもまあ2JCIE-BL01の値段は12,000~13,000円ぐらい。一方、ウェザーニューズ社が販売しているWxBeacon2は4,798円(税・送料込み)。
ウェザーニーズの為だけに加速度センサーを外したりしないと思うし、万が一加速度センサーが無くても室内設置用途なので、まあいらない*3ので、価格面を考慮して今回はWxBeacon2を使います。
2.1. ORMONの資料の在り処
GitHubに上がっているOMRONの資料・ソースを利用する。
資料:
omronmicrodevices.github.io
ソースコード:
github.com
基本的にOMRONの資料に沿ってすすめる。
追記:日本語版のユーザーズマニュアル
形2JCIE-BL01 環境センサ ユーザーズマニュアル
2.2. 参考サイト
いろいろと先人が苦労している様子です。omron(の正式かどうかは不明ですが)のコードもpython-blueを使うようになって楽になりましたが、以前は皆様が色々なBlueZ対応ライブラリにトライされておられました。
今は、下記サイトあたりを見れば大体の感触はつかめるかと。ありがたい、です。
- RaspberryPi 3B+とWxBeacon2(OMRON 2JCIE-BL01)で環境測定 CSV出力まで | 電子計算機の操縦桿
- WxBeacon2 を使った室内環境監視 - tasuwo's notes
- OMRONの環境センサ2JCIE-BL01をRaspberry Piから使えるように設定する - Shujima Blog
- WxBeacon2のBLEビーコンをラズベリーパイでキャッチして屋外環境をモニタリング | IoT PLUS
3.環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータ取得準備
3.1. Raspberry Pi側の確認(Bluetooth確認)
まずはBluetoothモジュールのバージョン確認して、Bluetoothモジュール(bluz)がインストールされていることを確認します。
$ apt-cache show bluetooth
(参考までに、Release Date:2019-7-10のRasbian Buster Liteにインストールされているバージョンは、Source=bluz, Version=5.50-1でした)
次に、Raspberry Pi Zero WのBluetoothがきちんと稼働しているか確認します。 下記のコマンドを打ち、"UP RUNNING"となっていたらOKです。
$ hciconfig hci0: Type: Primary Bus: UART DB Address: B8:27:EB:xx:xx:xx ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:766 acl:0 sco:0 events:49 errors:0 TX bytes:2980 acl:0 sco:0 commands:49 errors:0
もしUP RUNNINGでなければ、下記のコマンドでBluetoothインタフェースを稼働させておきます。
$ sudo hciconfig hci0 up
一応、Raspberry PiのBTのインターフェース番号とBluetoothデバイスアドレスを確認する。
$ hcitool dev Devices: hci0 B8:27:xx:xx:xx:xx
3.2. WxBeacon2の動作確認
まずWxBeacon2に電池を入れます。ほんの一瞬、表側のLEDが赤色→緑色と光る、が普通は裏側で電池を入れているので見えない…
スマホにウェザーニュースのアプリを入れて、[メニュー]→[みんなで作る天気:WxBeacon2のデータ]を開く。下の方の[WxBeacon2の設定]から設定画面に入る。
と言ってもやれることは「WxBeacon2を受信」のトグルをオンにするだけです(左の画面)。
「デバイスアドレス」と「シリアル番号」をメモっておく。
WxBeacon2からデータを受信すると、右の画面のように「気温」「湿度」「照度」「気圧」「騒音」「紫外線指数」が表示されます。 ちなみに下の二つ「不快指数」「熱中症危険度」は、センサーデータではなく、「気温」と「湿度」からの計算値です。 (危険度の単位って「℃」なんだ…)
3.3. WxBeacon2とRaspberry Piの接続確認
まずは、WxBeacon2のBluetoothデバイスアドレスのチェックします。
$ sudo hcitool lescan LE Scan ... 70:86:XX:XX:XX:XX (unknown) 0E:0F:XX:XX:XX:XX (unknown) ... D2:C6:78:E2:19:D5 Env ...
先ほどスマホアプリで確認したデバイスアドレスが、Envという名前でスキャンに引っかかっていることを確認する。Ctrl-cで止めます。
$ gatttool –i hci0 –b D2:C6:XX:XX:XX:XX –t random –I (←最後はアイ(大文字)) [D2:C6:78:E2:19:D5][LE]> connect Attempting to connect to D2:C6:XX:XX:XX:XX Connection successful [D2:C6:78:E2:19:D5][LE]> char-read-uuid 0x2a00 handle: 0x0003 value; 45 6e 76 53 65 6e 7e 6f 72 2d 42 4c 30 31 (← Device Name “EnvSensor-BL01”) [D2:C6:78:E2:19:D5][LE]> char-read-uuid 0x2a25 handle: 0x0012 value; 30 39 37 38 4d 59 30 31 36 35 (← Serial Number “0978MY0165”) [D2:C6:78:E2:19:D5X][LE]> char-read-hnd 0x0019 Characteristic value/descriptor: 04 ff 09 a0 19 45 00 01 00 61 27 8b 0e 02 1d 47 09 3f 0c (← 気象データ) [D2:C6:78:E2:19:D5][LE]> disconnect [D2:C6:78:E2:19:D5][LE]> quit
4. Omronサンプルコード利用の準備
4.1. InfluxDBのインストール
OMRONのサンプルスクリプトでは、データの書き出し先にファイルorデータベースが選べます。
データベースには、IoT系のデータ(時系列データ)の格納に特化したInfluxDBが利用できます。
まずはこれをインストールしておきましょう。
基本的なやり方は下記のとおりですが、このページではStrechベースですので、そこをBusterに置き換えて進めます。
www.influxdata.com
まずは InfluxDataパッケージのリポジトリを追加。
$ curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add - $ echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
influxDBを実際にインストールする。
$ sudo apt-get update $ sudo apt-get install telegraf influxdb chronograf
telegrafは、将来的にいろいろなデータソースから取り込む時用なので、今はインストールしなくて良い。 chronografはinfluxDBのUIなので、今回の用途ではあまり必要ないかもしれないが、UIはあった方が良いかと思いインストール。
influxDBの起動停止
[起動] $ sudo systemctl start influxdb.service [停止] $ sudo systemctl stop influxdb.service
InfluxDB起動状態の確認
$ systemctl status influxdb
4.2. PythonからBLE(Bluetooth Low Energy)を利用できるように設定
OMRONのサンプルスクリプトは、PythonからBLE(bluez)にアクセスするモジュールとして、python-bluezを利用するので、まずはそれを入れておきます。
$ sudo apt-get install -y python-bluez
Omronのサンプルコード実行のためには、GET REQEUST送信用のライブラリであるRequestsモジュールも必要なので入れておきます。
$ sudo pip install requests --upgrade
ついでにinfluxdb関連のモジュールもインストールしておきます。
$ sudo pip install influxdb $ sudo pip install --upgrade influxdb
4.3 環境センサー(WxBeacon2)をBroadcastモードに変更
WxBeacon2は購入した状態では、スマホとconnectしてからセンサーデータを取得するモードになっています。 このままではOMRONのサンプルスクリプトは使えません。 OMRONのサンプルスクリプトは、WxBeacon2から周りにまき散らしているアドバタイジングメッセージにセンサーデータも含めた状態を想定しているからです。 OMRON曰くの正式名称は、Without Data RecoedingモードのGeneral Broadcaster 2というBeacon Modeです。
さて、この切り替えはWxBeacon2にBLE(Bluetooth Low Energy)で接続して行います。 まず、スマホにBLE Scanner: Read,Write, Notify (Android, たぶんBLE Scanner 4.0と同じもの)を導入します。 ここではAndroidを使っていますが、iOSにも同様のものがあるはずです。 このアプリを立ち上げるとBLEデバイスを探しに行きます。
左の画面の一番下「Env」が今回設定を変更しようとしているWxBeacon2です。
Bluetoothのデバイスアドレスで確認した上で、「CONNECT」をタップします。
マニュアルによるとアドバタイズの設定(ADV Setting)のUUIDは、0x3042なので、「CUSTOM SERVICE - C4C3040-7700-......」をタップすると、右画面の様に「UUID: C4C3042-7700-....」展開されます。
横にある丸い「R」ボタンをタップするとADV Settingに現在書き込まれている値が表示されます(左画面)。初期値は、0x 0808 A000 0A00 3200 08 00 (スペースは読みやすさのために入れました)です。後ろから2ブロック目の「08」がBeacon Modeで、08 = Event Beaconとなっています。ここを04 = General Broadcaster 2に書き換えます。
丸い「W」ボタンを押すと書き込み画面がポップアップするので、「Byte Array」にした上で、 0808 A000 0A00 3200 04 00 (スペースは読みやすさのために入れましたので入力しないでください)を設定します(右画面)。
「Env」だったデバイスが「EP」に変わっていれば、設定変更は成功です。
4.4. OMRONサンプルスクリプト入手
本命のOMRON社(の公式かは不明ですが)のサンプルスクリプト(Python)の入手です。
$ cd ~pi $ git clone https://github.com/OmronMicroDevices/envsensor-observer-py omron
~piディレクトにomronというディレクトリが出来ていたらOK。
展開したサンプルスクリプトのディレクトに移って、中核となるPythonのコードに実行権限を付与する。
$ cd /home/pi/omron/envsensor-observer-py/ $ chmod +x envsensor_observer.py
5. Omronサンプルコードの設定と利用
5.1. conf.pyの設定(influxDBの設定)
サンプルスクリプトのディレクトリにあるconf.pyが設定ファイル。
(前略) # uploading data to the cloud (required influxDB 0.9 or higher) INFLUXDB_OUTPUT = True # InfluxDB INFLUXDB_ADDRESS = "localhost" # enter IP address of influxDB INFLUXDB_PORT = 8086 # enter port number of influxDB INFLUXDB_DATABASE = "weather" # enter influxDB database name INFLUXDB_MEASUREMENT = "wxbeacon2" # enter measurement name INFLUXDB_USER = "root" # enter influxDB username INFLUXDB_PASSWORD = "root" # enter influxDB user password
5.2 envsensor_observer.pyの自動起動設定
/etc/systemd/systemに、自動起動の為のサービス設定ファイルenvsensor_observer.serviceを作る。
$ sudo nano /etc/systemd/system/envsensor_observer.service
[Unit] Description = OMRON sensor observer After = influxdb.service [Service] ExecStart= /home/pi/omron/envsensor-observer-py/envsensor_observer.py Restart = always Type = simple [Install] WantedBy=multi-user.target
Raspberry Pi Zeroの起動時に自動起動するように設定。
$ sudo systemctl enable envsensor_observer.service
5.3. 環境センサーデータ取得スクリプトの稼働を確認
環境センサーデータ取得スクリプト(envsensor_observer.py)の稼働を確認する。
$ influx -precision rfc3339 # rfc3339は日付がUTCで読める御呪い Connected to http://localhost:8086 version 1.7.7 InfluxDB shell version: 1.7.7 > show databases # 環境センサー用のデータベースが出来ているか確認 name: databases name ---- telegraf _internal weather # これが環境センサー用のDB > use weather # weatherのデータを読めるようにする Using database weather > select time, bt_address, temperature, humidity from wxbeacon2 where time > ‘2019-09-09T12:00:00Z’ time bt_address temperature humidity ---- ---------- --------- -------- 2019-09-09T13:03:12.819828025Z C8F66C158490 27.63 59.06 .... > quit
設置した環境センサーのBluetoothアドレス(bt_address)と気温(heat temperature)・湿度(humidity)が記録されていれば、スクリプトは順調に動いていると言えるでしょう。
6. つづく
これで環境センサーデータ収集サーバ側は完了で、センサーデータはこのサーバに蓄積されてゆきます。つぎは、このサーバとHome Assistantを繋ぎます。
【Home Assistant(Hass.io)でホームオートメーション】
- RaspberryPiにHome Assistant導入
- Home Assistant初期設定
- 環境センサー(Omron)を接続
- 汎用赤外線リモコンを接続
- スマートプラグを接続
- UIを改善