作業日記@HatenaBlog

各種の作業メモ

WxBeacon2とラズパイを連携させる

WxBeacon2 の入手

直販サイトから入手した。
WxBeacon2 は OMRON の環境センサ 2JCIE-BLOEM 品らしい。
ユーザーズマニュアル(PDF)

Ambient へ登録

Ambient へユーザ登録(無償)をする。
新規チャネルを 1 つ作成しておくこと。

Raspberry Pi 3 の設定

参考サイトを元に各種設定をする。
なお、Raspberry Pi 3 の初期設定は完了しているものとする。

$ sudo apt-get update
$ sudo apt-get upgrade

pyenv を導入

当方環境では python 2,3 が共存している。
2 系、3 系を同時設定が可能な pyenv を導入する。(参考サイト
必要なパッケージのインストール、git から pyenv をクローンする。
なお、sudo のパスが通らないときは ここ を参照し /etc/sudoers の記述を変更する。

$ sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

.bash_profile に設定を追加。

$ sudo vi ~/.bash_profile

# 以下の内容を追記
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

. "$HOME/.bashrc"

設定を反映。
.bash_profile があると .bashrc が読み込まれないので注意。(参考サイト)

$ source ~/.bash_profile

インストール可能な python パッケージを確認。

$ pyenv install --list
...
...
3.6.4
3.6.5
3.6.6
...
...

python 2系、3系を共存させる。
python 2 のバージョン確認。

$ python -V
Python 2.7.13

pyenv で 2系、3系をともにインストールする。
本件の参考サイトで使用していた 3.6.5 をインストールする。

$ pyenv install 2.7.13
$ pyenv install 3.6.5

同時使用できるようにする。

$ pyenv global 2.7.13 3.6.5
$ pyenv version
2.7.13 (set by /home/pi/.pyenv/version)
3.6.5 (set by /home/pi/.pyenv/version)
$ python -V
Python 2.7.13
$ python3 -V
Python 3.6.5

pip を最新版にする。

$ pip3 install --upgrade pip

Python BLE ライブラリを導入

$ sudo apt-get install libglib2.0-dev
$ pip3 install bluepy

BLE ライブラリが import できない場合は、次を実行する。
bluepy 公式サイトから最新のソースコードを DL する。

$ cd /tmp
$ wget https://files.pythonhosted.org/packages/27/91/6cfca10bee9862f93015413cf9e6a52c3081a71f1518963396a055128f8e/bluepy-1.3.0.tar.gz
$ tar xvzf bluepy-1.3.0.tar.gz
$ cd bluepy-1.3.0
$ sudo python3 setup.py build
$ sudo python3 setup.py install

Ambient のライブラリを導入

$ sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git

Raspberry Pi 3 の Bluetooth バージョン確認

$ bluetoothd -v
5.43

WxBeacon2 の設定

WxBeacon2 に電池を入れて hcitool で BLE をスキャンする。
末尾が Env のものが WxBeacon2 である。

$ sudo hcitool lescan
LE Scan ...
...
XX:XX:XX:XX:XX:XX (unknown)
AA:BB:CC:DD:EE:FF Env

スキャンした WxBeacon2 に接続してサービスを調べる。
connect コマンドがエラーになる場合は何回かリトライする。

$ gatttool -b AA:BB:CC:DD:EE:FF -t random -I
[AA:BB:CC:DD:EE:FF][LE]> connect
Attempting to connect to AA:BB:CC:DD:EE:FF
Connection successful
[AA:BB:CC:DD:EE:FF][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
[AA:BB:CC:DD:EE:FF][LE]> exit
$

WxBeacon2 をブロードキャストモードにする

設定はスマホアプリ BLE Scanner で行う。

詳細は 参考サイト のプログラム2(ブロードキャストモード) の項目を参照。

データ取得プログラム

計測データを取得する Python ソースコードを DL する。
Githubソースコードを使用する。

$ cd ~
$ mkdir WxBeacon2
$ cd WxBeacon2
wget https://raw.githubusercontent.com/AmbientDataInc/EnvSensorBleGw/master/src/gw_RPi/env2ambientBS.py

ソースコードの修正

Ambient で 新規チャネル を作成しておく。
チャネルID と ライトキー を使う。

$ vi env2ambientBS.py

(17行目)
channelID = 100
↓
channelID = xxxxx

(18行目)
writeKey = 'writeKey'
↓
writeKey = 'xxxxxxxxxxxxxxxx'

(52行目)
if companyID == 'ffff':
↓
if devs[target]['companyID'] == 'ffff':

プログラムの起動

ヘルプを表示する。

$ sudo python3 env2ambientBS.py -h
usage: env2ambientBS.py [-h] [-d] [-o] [-b] [-bb]

optional arguments:
  -h, --help  show this help message and exit
  -d          debug msg on
  -o          device is omron env sensor
  -b          device is BBC micro:bit
  -bb         device is BBC micro:bit + BME280

今回は WxBeacon2(オムロン環境センサ)を使用するので -o オプションを付ける。
ret = 200 は ambient からの書き込み成功を意味する。

$ sudo python3 env2ambientBS.py -o
omron
23.62 47.29 0 0.02 1011.0 33.18 2.97
sent to Ambient (ret = 200)
BTLE Exception while scannning.
23.59 47.29 0 0.01 1011.0 32.77 2.97
sent to Ambient (ret = 200)
23.54 47.33 0 0.02 1011.0 32.77 2.97
sent to Ambient (ret = 200)
23.5 47.36 0 0.02 1011.0 33.57 2.97
sent to Ambient (ret = 200)

バックグラウンドで動作させる。
ログは一切出力しない。 参考サイト

$ sudo nohup python3 env2ambientBS.py -o > /dev/null 2>&1 &

自動起動

起動スクリプトを書いて、ラズパイ起動時に自動起動させる。

$ cd /usr/local/bin/
$ sudo touch WxBeacon2_autostart.sh
$ sudo vi WxBeacon2_autostart.sh
#!/bin/sh
/usr/bin/sudo /usr/bin/nohup /home/pi/.pyenv/shims/python3 env2ambientBS.py -o > /dev/null 2>&1 &

$ chmod a+x WxBeacon2_autostart.sh

スクリプトを rc.local に登録する。

$ sudo vi /etc/rc.local

exit 0 の手前に以下の行を追加
WxBeacon2_autostart.sh

出力ログ

上記実行時のログについて。
env2ambientBS.py の 58 行目 MSG より。

MSG(temp / 100, humid / 100, light, uv / 100, press / 10, noise / 100, (batt + 100) / 100)

23.62 47.29 0 0.02 1011.0 33.18 2.97
温度 相対湿度 環境光 UV指数 気圧 騒音 バッテリ電圧
degC %RH lux hPa dB V
23.62 47.29 0 0.02 1011.0 33.18 2.97

ambient への書き出し

env2ambientBS.py の 59 行目 sendWithRetry より。
以下の順序で ambient へ送っている。

sendWithRetry({'d1': temp / 100, 'd2': humid / 100, 'd3': press / 10, 'd4': (batt + 100) / 100, 'd5': light, 'd6': noise / 100})
温度 相対湿度 気圧 バッテリ電圧 環境光 騒音
d1 d2 d3 d4 d5 d6

ambient のグラフ編集

上記 d1 ~ d6 のデータ項目を元に、見やすいようにグラフを編集する。
UI が優れているので慣れれば任意にデザイン可能。