WxBeacon2のBLEビーコンをラズベリーパイでキャッチして屋外環境をモニタリング

OMRONの環境センサ2JCIE-BL01」が入ったWxBeacon2を屋外に設置して、外部環境をモニタリングします!

以前の記事でラズパイを部屋の中に設置して温湿度・気圧等を24時間計測できるようになりましたが、外気温の温湿度等はお天気サイトのAPIで取得した大まかなもの(こちらの記事)でした。

WxBeacon2を利用する事で、

  • 屋外の環境を5分ごとに計測(設定変更可能)
  • 面倒な配線不要

というメリットが得られます。

準備したモノ

  1. OMRONの環境センサ2JCIE-BL01が入ったWxBeacon2
    ※Omron印の物も入手可能ですが、12000円〜18000円と高額。
    ウェザーニュースが提供するWxBeacon2だと、公式サイトから送料税込み4,798円で入手可能です。
  2. ウェザーニュースタッチ
    動作チェックに使いました。(App Store で確認
  3. BLE Scanner 4.0
    BLEデバイスにアクセスするためのアプリ。4.0と名前にありますが、使用したバージョンは2.0.1です。(App Store で確認

WxBeacon2開封の儀

素敵な小箱で届きました。凄くシンプルでGood。

表にはweathernewsのロゴ、裏面には型式とFCC/CEマーク、OMRONの社名、そしてMADE IN JAPANの文字が並びます。

裏蓋をあけるとボタン電池を収める部分が見えます。
フタの周りにはパッキンが付いていて防水仕様になっています。

さらに横の穴の内側を見ると、メッシュ状のシートが貼ってあり、ここも防水対策が施されています。

電池を入れた所。

フタをきっちり閉めて完了です。
電源スイッチは無く、電池を入れた瞬間から動き始めます。

なお、電池を入れてすぐにLEDが点灯するのですが、電池を入れてから裏返していたのでは間に合いませんw
電池を半分引っかけた状態でLEDを見ながらセットすると確認できます。

ウェザーニュースのアプリでデータを見る

まずは標準的な動作を確認します。
ウェザーニュースタッチを起動してメニューを開き、「みんなで作る天気」の「WxBeacon2データ」を見つけます。設定を押して「WxBeacon2 受信設定」で「受信する」をONにします。ビーコンを受信してデータが表示されていればOKです。

半日〜1日ぐらい放置して、メニューから「観測機データ」を開くと、グラフで各種センサ情報を取得できます。

 

動作モードを General Broadcaster 1 に変更する

デフォルトはデバイス内にデータを保存するモードになっており、コネクトしてから情報を取得しないといけないので少々手間です。そこで、ラズパイから常時データを取得できるように「デバイスモードを変更」してアドバタイズパケットで一方的にデータを発信するようにします。

マニュアル(https://omronmicrodevices.github.io/products/2jcie-bl01/communication_if_manual.html)を参照し、試しに Limited Broadcaster 1 にしたところ、50秒スリープ・10秒通信可能の状態で、接続タイミングがとてもシビアでした。そのため消費電力的には不利ですが常時接続できるよう General Broadcaster 1 に設定しました。

Table 33. Beacon Mode」に「Beacon Mode」の一覧があります。
モードによって Adv. Format が違うので、 「3. Advertise Format」を眺めて、必要なデータを発信するモードとして0x02を選んでいます。

BLE Scanner 4.0 で設定値を書き換える

BLEでアクセスできるアプリ(今回はBLE Scanner 4.0)を使用して、モードを切り替えます。

アプリを起動してスキャンすると、「EnvSensor-BL01」というものが見つかると思います。ビーコンの近くであれば信号強度は-40〜-50dBmぐらいあると思いますのでそれを選びます。

SERVICES」を見て行くと「0C4C3040-〜」というものがあるので開きます。

さらにその中で「〜3042-」と書かれている部分を見つけてきて「Write,Read」を選択、「WriteValue」で値を「0808a0000a0032000200」に書き換えます。

その後、一度電池を外して再起動します。

書き換えが上手くいっていれば「IM-BL01」という表示に変わったビーコンを発見できると思います。

これでビーコンの準備は完了です。

データを取得する

次に、ラズパイでビーコンのデータを取得していきます。

Github(OmronMicroDevices/envsensor-observer-py)に Omron Micro Devices が作成したpythonのサンプルプログラムが公開されているのでこれを使います。

前準備

Githubに記載されている手順で環境を整えます。
まずは pythonでbluezが使えるようにします。

sudo apt install python-bluez

その後、適当なディレクトリ(/home/pi/src/など)にプログラムを持ってきます。

git clone https://github.com/OmronMicroDevices/envsensor-observer-py.git

cloneされたディレクトリに入って、実行権を付けます。

cd envsensor-observer-py/envsensor-observer-py/
chmod +x *.py

conf.py の確認(ログファイルの保存場所)

ログファイルの保存場所を確認します。
デフォルトでは実行実行場所の直下にあるlogディレクトリに保存されます。

# the directory path for csv output
CSV_DIR_PATH = os.path.dirname(os.path.abspath(__file__)) + "/log"

プログラムの実行とデータの確認

ここまでできたら、試しにデータを取得してみます。
以下のコマンドを実行します。

sudo envsensor_observer.py

色々と表示されますが、何かエラーで止まらなければそのまま10分程放置しましょう。
しばらくしたら「Ctrl+C」を押して終了します。

その後、実行したディレクトリにある「log」ディレクトリの中に「env_sensor_log.csv」ができていると思います。
中身を覗くとこのようなCSV形式でデータが保存されています。

Time,Gateway,Address,Type,RSSI (dBm),Distance (m),Sequence No.,Battery (mV),Temperature (degC),Humidity (%%RH),Light (lx),UV Index,Pressure (hPa),Noise (dB),Discomfort Index,Heat Stroke Risk,Accel.X (mg),Accel.Y (mg),Accel.X (mg)
2018-09-17 17:38:37.643700,rpi3-03p,************,IM,-71,3.02736427268,75,2980.0,29.14,61.1,0,0.01,1009.3,34.97,78.7925946,26.5570208656,0.0,0.0,0.0
2018-09-17 17:42:31.105240,rpi3-03p,************,IM,-68,2.2017061284,76,2980.0,29.59,60.77,9,0.01,1009.2,31.58,79.37981457,26.9503903624,0.0,0.0,0.0
2018-09-17 17:47:31.560608,rpi3-03p,************,IM,-67,1.97604459723,77,2980.0,29.57,60.12,0,0.01,1009.0,33.94,79.25424916,26.8366599658,0.0,0.0,0.0
2018-09-17 17:52:32.108580,rpi3-03p,************,IM,-64,1.42111687069,78,2980.0,29.5,59.79,12,0.01,1009.3,31.58,79.1066995,26.7203584756,0.0,0.0,0.0

無事にセンサ情報を取得する事ができました!

conf.py の修正(influxdbの設定)

次に、Grafanaでデータを見たいので、Influxdb にデータを保存するようconf.pyの設定を修正します。
※Influxdbのセットアップができていない人は、こちらの記事をご覧ください。

自分の環境に合わせてパラメータは適宜修正して下さい。
Influxdbを使う場合はlogファイルの設定はそのままでも大丈夫です(そのままにしました)。

以下に例を示します。

# uploading data to the cloud (required influxDB 0.9 or higher)
INFLUXDB_OUTPUT = True
# InfluxDB
#INFLUXDB_ADDRESS = "xxx.xxx.xxx.xxx" # enter IP address of influxDB
INFLUXDB_ADDRESS = "localhost" # enter IP address of influxDB
INFLUXDB_PORT = 8086 # enter port number of influxDB
INFLUXDB_DATABASE = "environment" # enter influxDB database name
INFLUXDB_MEASUREMENT = "WxBeacon2" # enter measurement name
INFLUXDB_USER = "root" # enter influxDB username
INFLUXDB_PASSWORD = "root" # enter influxDB user password

書き換えが完了したら、再度以下のコマンドを実行してしばらく(数十分〜数時間)データを集めます。

sudo envsensor_observer.py

適当なところで Ctrl+C で終了しておきます。

パネルに追加

Grafanaを開いて、パネルを追加します。
グラフの「Metrics」タブの「Data Source」からデータベースを選び、fromで「WxBeacon2」(設定でMEASUREMENTに設定した名前)を選択します。
selectfieldの()内をクリックすると「temperature」や「humidity」という項目が出てくるので適当に登録していきます。
保存してグラフが表示されていたら完了です。

自動的に起動するようにスクリプトを作成

当初システムデーモンに登録して実行していたのですが、気付かないうちにエラーを吐いて停止していることがちょくちょくあったので、cronで定期的に監視して自動的に起動するようにスクリプトを組みました。

スクリプトを作成します。

vim /home/pi/scripts/envsensor-observer.sh

中身はこんな感じで。

#!/bin/bash
PC=`ps aux | grep envsensor_observer.py | grep -v grep | wc -l`

if [ ${PC} -eq 0 ]; then
sudo /home/pi/src/envsensor-observer-py/envsensor-observer-py/envsensor_observer.py &
	echo "Started Envsensor ovserver."
else
	echo "Still running."
fi

やっていることは凄く単純で、起動しているプロセスの中に envsensor_observer.py が含まれるか確認し、無ければバックグラウンドプロセスとして起動するというだけのものです。

ファイルに実行権を与えておきます。

chmod +x envsensor-observer.sh

5分ごとにcronで確認するように設定します。
以下の1行をcronに追加します(crontab -e もしくは crontabに設定ファイルを与える方法で)

*/5 * * * * /home/pi/scripts/envsensor-observer.sh

これで24時間、365日屋外環境をモニタリングし続ける環境ができました!

最終的にこのような感じでデータを記録し続ける事ができるようになります。

まとめ: WxBeacon2を使ってワイヤレス屋外温湿度等モニタリングの環境を構築できた!

OMRONの環境センサ2JCIE-BL01が入ったWxBeacon2を屋外に設置して、ワイヤレスで外部環境をモニタリングできる方法を紹介しました。

方法をまとめると、

  • ビーコンの動作モードを General Broadcaster 1 に変更
  • pythonのサンプルプログラムで5分ごとのデータを取得してInfluxdbに記録
  • Grafanaでデータを可視化

となります。

電池を入れて外に設置するだけ(配線など不要!)でデータを取得できる環境が整いますので、とてもお手軽です。

なお、一応防水仕様(日常生活レベルでの防水)にはなっていますが、雨ざらし・日ざらしだとおそらく壊れるので、軒下など雨や直射日光に曝されない場所に設置すると良いと思います。

それではみなさん、良いラズパイ生活を!