コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home Assistant(Hass.io)でホームオートメーション】2. 環境センサー(Omron)を接続 ー 中編

環境センサー(WxBeacon2/Omron 2JCIE-BL01)編

1. まえがき

 前回で環境センサーからデータを取得するサーバ用のRaspberry Piの準備ができました。 maky-ba.hatenablog.com

今回はそのRaspberry Pi上に環境センサー(WxBeacon2/Omron 2JCIE-BL01)からデータを収集する仕組みを構築します。

  1. 前編:収集サーバとなるRaspberry Pi Zero Wをセットアップ
  2. 中編:環境センサー(OMRON)からデータを収集(この記事)
  3. 後編:Home Assistantでのセンサーセットアップ
    改訂版あります。

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円(税・送料込み)。

https://weathernews.jp/sorashop/item_photo/430/210/1.png https://components.omron.com/sites/default/files/2021-10/evs-lineup02.png

ウェザーニーズの為だけに加速度センサーを外したりしないと思うし、万が一加速度センサーが無くても室内設置用途なので、まあいらない*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の設定]から設定画面に入る。
f:id:maky_Ba:20190730225430p:plain:w250 f:id:maky_Ba:20190730230004p:plain:w250
と言ってもやれることは「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-....」展開されます。
f:id:maky_Ba:20190801200829p:plain:w250 f:id:maky_Ba:20190801200848p:plain:w250

横にある丸い「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  (スペースは読みやすさのために入れましたので入力しないでください)を設定します(右画面)。
f:id:maky_Ba:20190801202418p:plain:w250 f:id:maky_Ba:20190801202437p:plain:w250

「Env」だったデバイスが「EP」に変わっていれば、設定変更は成功です。
f:id:maky_Ba:20190801203245p:plain:w250

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)でホームオートメーション

  1. RaspberryPiにHome Assistant導入
  2. Home Assistant初期設定
  3. 環境センサー(Omron)を接続
    1. 環境センサー(Omron)を接続 - 前編
    2. 環境センサー(Omron)を接続 - 中編《今回》
    3. 環境センサー(Omron)を接続 - 後編《次回》
  4. 汎用赤外線リモコンを接続
  5. スマートプラグを接続
  6. UIを改善

maky-ba.hatenablog.com

*1:ウェザーニーズ社的には、WxBeacon2は観測ポイントでの交換が主だと思う。一方で観測点も増やしたい、という目論見から販売もしている(申し訳ないが、私は何個買っても観測点増加には貢献出来ていません。そのうち売ってくれなくなるかな…)。

*2:6つの要素以外に、「温度」と「湿度」から「熱中症警戒度」「不快指数」を計算してくれて、これらもデータとして取得可能です

*3:加速度センサーは地震の測定に使う、ってオムロンのサイトに書かれていました。ううむ、それはそれで惹かれる…でも常時監視してないとダメか。