はじめに
一連の記事で、一般的な環境情報と産業オートメーション機器の稼動情報を取得するために作成したJavaライブラリについて簡単に紹介してきました。整理すると以下の通りです。
- BLEアドバタイズ信号スキャン (bluez-dbus使用)
- CC2650 - 温度(物体、周囲)、湿度、照度、気圧、運動(角速度、加速度、磁気) (bluez-dbus使用)
- MH-Z19B - CO2濃度 (jSerialComm使用)
- PPD42ND - PM2.5濃度 (Pi4J使用)
- OPC-UA - 産業オートメーション機器の稼動情報 (Eclipse Milo使用)
これらのデータを取得してモニタリングするとともに、取得したデータを他の用途に利用するための仕組みを入れて、簡単なツール(rainy)にまとめました。Raspberry Pi 3BにJavaを入れて、Apache Felix (OSGiフレームワーク)上で動作させています。rainyをビルドしてツールにまとめたものはrainy-felix.zipとして**こちら**で公開しています。
rainyの概要のイメージは以下の通りです。
また、次のイメージは、同じRaspberry Pi 3Bにモニタリング機能を同居させた構成です。
使用している機器は以下の通りです。
MH-Z19BにUSBシリアル通信アダプターで接続する場合の機器は以下の通りです。
なお、本記事は、こちらのGithubとほぼ同じ内容です。
目次
- 目的
- OSのセットアップ
- データ送信のセットアップ
- 可視化ツールのセットアップ
- rainyの設定 - rainy/conf
- rainy起動
- 可視化ツールでダッシュボードを作成する
- MQTTブローカに送られたデータを確認する
- 制限事項
- バンドル一覧
目的
このツール**rainy**の目的を簡潔に言うと、以下の通りです。- 屋内(プライベート/オフィス/工場)において、一般的な環境情報と産業オートメーション機器の稼動情報を取得する。
- これらのデータを概ねリアルタイムにモニタリングし、また、その他の用途で利用できるようにする。
- Raspberry Pi 3B (arm)とUbuntuマシン(amd64)の上で、Java / OSGiアプリケーションとして稼動させる。
rainyは、正式な運用には機能も性能も不十分と思いますが、コンパクトで手軽に試せるツールと思います。
OSのセットアップ
Raspberry Pi 3B上で**rainy**を稼動させるためのセットアップについては、[こちら](https://qiita.com/s5uishida/items/1759498f8f706c4c3314)と[こちら](https://qiita.com/s5uishida/items/4ae7784aeaf50df1e3d3)を参考にして下さい。Raspberry Pi 3B内蔵のBluetoothとシリアル通信(UART)を同時に使用することができます。データ送信のセットアップ
**rainy**は、データの送信先にInfluxDBとMQTTブローカに対応しています。InfluxDBのインストールと起動
Ubuntu 18.04の仮想マシンで[InfluxDB](https://www.influxdata.com/)を使用しています。インストール手順は、[こちら](https://portal.influxdata.com/downloads/)が参考になります。# wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.8_amd64.deb
# dpkg -i influxdb_1.7.8_amd64.deb
# systemctl enable influxdb.service
# systemctl start influxdb.service
なお、Rasbperry Pi 3BにInfluxDBをインストールする手順は、以下の通りです。
# wget https://dl.influxdata.com/influxdb/releases/influxdb_1.7.8_armhf.deb
# dpkg -i influxdb_1.7.8_armhf.deb
# systemctl enable influxdb.service
# systemctl start influxdb.service
Mosquitto (MQTTブローカ)のインストールと起動
Ubuntu 18.04の仮想マシンで[Mosquitto](https://mosquitto.org/)(MQTTブローカ)を使用しています。インストール手順は、以下の通りです。# apt-get update
# apt-get install mosquitto
# apt-get install mosquitto-clients
# systemctl enable mosquitto.service
# systemctl start mosquitto.service
なお、Rasbperry Pi 3BにMosquittoをインストールする手順も同じです。
可視化ツールのセットアップ
Grafanaのインストールと起動
Ubuntu 18.04の仮想マシンで[Grafana](https://grafana.com/)を使用しています。インストール手順は、[こちら](https://grafana.com/grafana/download?platform=linux)が参考になります。# wget https://dl.grafana.com/oss/release/grafana_6.3.4_amd64.deb
# dpkg -i grafana_6.3.4_amd64.deb
# systemctl enable grafana-server.service
# systemctl start grafana-server.service
なお、Rasbperry Pi 3BにGrafanaをインストールする手順は、以下の通りです。
# wget https://dl.grafana.com/oss/release/grafana_6.3.4_armhf.deb
# dpkg -i grafana_6.3.4_armhf.deb
# systemctl enable grafana-server.service
# systemctl start grafana-server.service
Chronografのインストールと起動
Ubuntu 18.04の仮想マシンで[Chronograf](https://www.influxdata.com/time-series-platform/chronograf/)を使用しています。インストール手順は、[こちら](https://portal.influxdata.com/downloads/)が参考になります。# wget https://dl.influxdata.com/chronograf/releases/chronograf_1.7.14_amd64.deb
# dpkg -i chronograf_1.7.14_amd64.deb
# systemctl enable chronograf.service
# systemctl start chronograf.service
なお、Rasbperry Pi 3BにChronografをインストールする手順は、以下の通りです。
# wget https://dl.influxdata.com/chronograf/releases/chronograf_1.7.14_armhf.deb
# dpkg -i chronograf_1.7.14_armhf.deb
# systemctl enable chronograf.service
# systemctl start chronograf.service
自己署名証明書によるHTTPS接続確認
一般に、自己署名証明書を本番運用に用いるのは推奨されませんが、テスト目的なら構わないと思います。自己署名による公開鍵(cert.pem)と秘密鍵(cert.key)を作成する
# openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout cert.key -out cert.pem -subj "/CN=localhost" -days 365
/etc/rainyディレクトリを作成して、公開鍵と秘密鍵を配置する
# mkdir /etc/rainy
# cp cert.pem cert.key /etc/rainy/
# cd /etc/rainy
# chmod 0644 cert.pem cert.key
GrafanaのHTTPS設定
詳細は[こちら](https://grafana.com/docs/installation/configuration/)を参照して下さい。-
/etc/grafana/grafana.ini
を編集します。
@@ -29,7 +29,7 @@
#################################### Server ####################################
[server]
# Protocol (http, https, socket)
-;protocol = http
+protocol = https
# The ip address to bind to, empty will bind to all interfaces
;http_addr =
@@ -58,8 +58,8 @@
;enable_gzip = false
# https certs & key file
-;cert_file =
-;cert_key =
+cert_file = /etc/rainy/cert.pem
+cert_key = /etc/rainy/cert.key
# Unix socket path
;socket =
- Grafanaを再起動し、ブラウザで
https://hostAddress:3000/
に接続します。
# systemctl restart grafana-server.service
ChronografのHTTPS設定
詳細は[こちら](https://docs.influxdata.com/chronograf/v1.7/administration/managing-security/)を参照して下さい。-
/etc/default/chronograf
を編集します。
TLS_CERTIFICATE=/etc/rainy/cert.pem
TLS_PRIVATE_KEY=/etc/rainy/cert.key
- Chronografを再起動し、ブラウザで
https://hostAddress:8888/
に接続します。
# systemctl restart chronograf.service
rainyの設定 - rainy/conf
rainy.properties
- **`clientID`** **rainy**稼動時の、ツールとしてのユニークなIDを設定します。 - **`cc2650`** CC2650を使用する場合は`true`に設定します。デフォルトは`false`。 - **`mhz19b`** MH-Z19Bを使用する場合は`true`に設定します。デフォルトは`false`。 - **`ppd42ns`** PPD42NSを使用する場合は`true`に設定します。デフォルトは`false`。 **注意点。PPD42NSはPi4Jから使用するため、rainyはRaspberry Pi (arm)シリーズでのみ、PPD42NSを使用できます。amd64のLinuxマシンではPi4Jを使えないため、その場合は`false`に設定して下さい。** - **`opcua`** OPC-UAを使用する場合は`true`に設定します。デフォルトは`false`。データ送信の接続設定
InfluxDB - influxdb.properties
- **`influxDBUrl`** - **`userName`** - **`password`** - `actions` バッチ処理数の単位を設定します。デフォルトは`1000`。 - `flushDuration` flushする時間間隔(msec)を設定します。デフォルトは`1000`。 - `dataOnly` データのみ取得する場合は`true`に設定します。デフォルトは`true`。MQTT - mqtt.properties
- **`brokerUri`** - `userName` - `password` - **`clientID`** MQTTブローカに接続する際のクライアントIDの前半の文字列を設定します。後半の文字列はシステムが任意の文字列を割り当てて、クライアントIDを完成させます。 - `qos` デフォルトは`0`。 - `topic` MQTTブローカにpublishする際のトピック文字列を設定します。デフォルトは`rainy`。
センサーとプロトコルの設定
CC2650 - cc2650.properties
[こちら](https://qiita.com/s5uishida/items/79a2de6a7026ef230e9b)も参考になります。
-
bluetoothAdapter
Bluetoothアダプタ名を設定します。デフォルトはhci0
。使用可能なアダプタ名を確認するには以下のようにhciconfig
コマンドを使用します。
# hciconfig -a
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:7D:0F:7D ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:28342 acl:441 sco:0 events:2265 errors:0
TX bytes:34605 acl:441 sco:0 commands:1955 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'raspberrypi'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x168
LMP Version: 4.1 (0x7) Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)
-
influxDB
InfluxDBを使用する場合はtrue
に設定します。デフォルトはfalse
。
-
mqtt
MQTTブローカを使用する場合はtrue
に設定します。デフォルトはfalse
。
-
prettyPrinting
MQTTブローカに送信する際のJSON形式のデータをログに出力する場合はtrue
に設定します。デフォルトはfalse
。なお、conf/logging.properties
の以下のログレベルの変更も必要です。
#io.github.s5uishida.level=INFO
-->
io.github.s5uishida.level=FINE
-
readCrontab
データを取得する際のスケジュールをcrontab形式で設定します。デフォルトは毎分。
-
batteryLevel
バッテリーレベルを取得する場合はtrue
に設定します。デフォルトはfalse
。
-
温度センサーの設定例
-
temperature
温度を取得する場合はtrue
に設定します。デフォルトはfalse
。
-
temperatureNotify
通知機能を使用する場合はtrue
に設定します。デフォルトはfalse
。通知機能を有効にすると、readCrontab
で指定したスケジュールは無効になります。
-
temperatureNotificationPeriod
通知の時間間隔を指定します(msec)。デフォルトは1000
。
-
運動(角速度 / 加速度 / 磁気)
-
gyroscope
角速度を取得する場合はtrue
に設定します。デフォルトはfalse
。
-
accelerometer
加速度を取得する場合はtrue
に設定します。デフォルトはfalse
。
-
magnetometer
磁気を取得する場合はtrue
に設定します。デフォルトはfalse
。
-
movementNotify
運動に関するセンサーの通知機能を使用する場合はtrue
に設定します。通知機能を有効にすると、readCrontab
で指定したスケジュールは無効になります。
-
movementNotificationPeriod
通知の時間間隔を指定します(msec)。デフォルトは1000
。
-
wakeOnMotion
揺れを検知した時に、運動に関するセンサーデータを送信する場合はtrue
に設定します。有効にした場合、10秒間に渡って、指定した通知の時間間隔で運動に関するセンサーデータを送信します。デフォルトはfalse
。
-
accelerometerRange
Accelerometer範囲(G)を設定します。デフォルトは2
。
-
devices
CC2650デバイスのアドレスをスペースを空けて書きます。なお、CC2650デバイスのアドレスを確認するには、hcitool
コマンドを以下のように実行します。
# hcitool lescan
LE Scan ...
B0:B4:48:B9:92:86 (unknown)
B0:B4:48:B9:92:86 CC2650 SensorTag
CC2650 - cc2650.properties
[こちら](https://qiita.com/s5uishida/items/79a2de6a7026ef230e9b)も参考になります。-
bluetoothAdapter
Bluetoothアダプタ名を設定します。デフォルトはhci0
。使用可能なアダプタ名を確認するには以下のようにhciconfig
コマンドを使用します。
# hciconfig -a
hci0: Type: Primary Bus: UART
BD Address: B8:27:EB:7D:0F:7D ACL MTU: 1021:8 SCO MTU: 64:1
UP RUNNING
RX bytes:28342 acl:441 sco:0 events:2265 errors:0
TX bytes:34605 acl:441 sco:0 commands:1955 errors:0
Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH SNIFF
Link mode: SLAVE ACCEPT
Name: 'raspberrypi'
Class: 0x000000
Service Classes: Unspecified
Device Class: Miscellaneous,
HCI Version: 4.1 (0x7) Revision: 0x168
LMP Version: 4.1 (0x7) Subversion: 0x2209
Manufacturer: Broadcom Corporation (15)
-
influxDB
InfluxDBを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
mqtt
MQTTブローカを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
prettyPrinting
MQTTブローカに送信する際のJSON形式のデータをログに出力する場合はtrue
に設定します。デフォルトはfalse
。なお、conf/logging.properties
の以下のログレベルの変更も必要です。#io.github.s5uishida.level=INFO --> io.github.s5uishida.level=FINE
-
readCrontab
データを取得する際のスケジュールをcrontab形式で設定します。デフォルトは毎分。 -
batteryLevel
バッテリーレベルを取得する場合はtrue
に設定します。デフォルトはfalse
。 -
温度センサーの設定例
-
temperature
温度を取得する場合はtrue
に設定します。デフォルトはfalse
。 -
temperatureNotify
通知機能を使用する場合はtrue
に設定します。デフォルトはfalse
。通知機能を有効にすると、readCrontab
で指定したスケジュールは無効になります。 -
temperatureNotificationPeriod
通知の時間間隔を指定します(msec)。デフォルトは1000
。
-
-
運動(角速度 / 加速度 / 磁気)
-
gyroscope
角速度を取得する場合はtrue
に設定します。デフォルトはfalse
。 -
accelerometer
加速度を取得する場合はtrue
に設定します。デフォルトはfalse
。 -
magnetometer
磁気を取得する場合はtrue
に設定します。デフォルトはfalse
。 -
movementNotify
運動に関するセンサーの通知機能を使用する場合はtrue
に設定します。通知機能を有効にすると、readCrontab
で指定したスケジュールは無効になります。 -
movementNotificationPeriod
通知の時間間隔を指定します(msec)。デフォルトは1000
。 -
wakeOnMotion
揺れを検知した時に、運動に関するセンサーデータを送信する場合はtrue
に設定します。有効にした場合、10秒間に渡って、指定した通知の時間間隔で運動に関するセンサーデータを送信します。デフォルトはfalse
。 -
accelerometerRange
Accelerometer範囲(G)を設定します。デフォルトは2
。
-
-
devices
CC2650デバイスのアドレスをスペースを空けて書きます。なお、CC2650デバイスのアドレスを確認するには、hcitool
コマンドを以下のように実行します。
# hcitool lescan
LE Scan ...
B0:B4:48:B9:92:86 (unknown)
B0:B4:48:B9:92:86 CC2650 SensorTag
hcitool
コマンドを実行して、CC2650の電源ボタンを押すと、上記のようにスキャンされたアドレスが表示されます。
MH-Z19B - mhz19b.properties
[こちら](https://github.com/s5uishida/mh-z19b-driver)も参考になります。注意点。PPD42NSと一緒に使用する場合、PPD42NSの4番ピン(黄色)をRaspberry Pi 3Bの19番ピン(GPIO10)または38番ピン(GPIO20)に接続します。あるいは、PPD42NSの4番ピン(黄色)をRaspberry Pi 3Bの8番ピン(GPIO14)に接続する場合、MH-Z19BにはUSBシリアル通信アダプタ経由でRaspberry Pi 3Bに接続して下さい(DSD TECH SH-U09C USB to TTL Serial Adapter with FTDI FT232RL Chipなど)。MH-Z19BをUSBシリアル通信アダプタに接続すると、シリアル通信のポート名は、/dev/ttyUSB0
になると思います。
-
portName
シリアル通信のポート名を設定します。デフォルトは/dev/ttyAMA0
。 -
influxDB
InfluxDBを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
mqtt
MQTTブローカを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
prettyPrinting
MQTTブローカに送信する際のJSON形式のデータをログに出力する場合はtrue
に設定します。デフォルトはfalse
。なお、conf/logging.properties
の以下のログレベルの変更も必要です。#io.github.s5uishida.level=INFO --> io.github.s5uishida.level=FINE
-
readCrontab
データを取得する際のスケジュールをcrontab形式で設定します。デフォルトは毎分。
PPD42NS - ppd42ns.properties
[こちら](https://github.com/s5uishida/ppd42ns-driver)も参考になります.-
gpioPin
GPIO_10
、GPIO_20
またはGPIO_14
のいずれかを設定します。デフォルトはGPIO_10
。 -
influxDB
InfluxDBを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
mqtt
MQTTブローカを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
prettyPrinting
MQTTブローカに送信する際のJSON形式のデータをログに出力する場合はtrue
に設定します。デフォルトはfalse
。なお、conf/logging.properties
の以下のログレベルの変更も必要です。#io.github.s5uishida.level=INFO --> io.github.s5uishida.level=FINE
-
readCrontab
データを取得する際のスケジュールをcrontab形式で設定します。デフォルトは毎分。
OPC-UA - opcua.properties
-
influxDB
InfluxDBを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
mqtt
MQTTブローカを使用する場合はtrue
に設定します。デフォルトはfalse
。 -
prettyPrinting
MQTTブローカに送信する際のJSON形式のデータをログに出力する場合はtrue
に設定します。デフォルトはfalse
。なお、conf/logging.properties
の以下のログレベルの変更も必要です。#io.github.s5uishida.level=INFO --> io.github.s5uishida.level=FINE
-
keyStoreType
-
keyStoreAlias
-
keyStorePassword
-
certificate
OPC-UAサーバ - conf/opcua/milo-public-demo.properties
以下は、[Eclipse Miloの公開デモサーバ](https://github.com/eclipse/milo)の設定例です。-
use
このOPC-UAサーバに接続する場合はtrue
に設定します。デフォルトはfalse
。 -
serverName
OPC-UAサーバ名を設定します。 -
endpointIP
OPC-UAサーバのアドレスを設定します。 -
endpointPort
OPC-UAサーバのポート番号を設定します。 -
securityPolicy
securityPolicyについて、Basic128Rsa15
、Basic256
、Basic256Sha256
、None
のいずれかを設定します。デフォルトはNone
。 -
securityMode
securityModeについて、Sign
、SignAndEncrypt
、None
のいずれかを設定します。デフォルトはNone
。 -
userName
-
password
-
requestTimeout
デフォルトは10000
(msec)。 -
sessionTimeout
デフォルトは10000
(msec)。 -
publishingInterval
MonitoredItemにおけるpublishingIntervalを設定します(msec)。デフォルトは1000
。 -
samplingInterval
MonitoredItemにおけるsamplingIntervalを設定します(msec)。デフォルトは500
。 -
queueSize
MonitoredItemにおけるqueueSizeを設定します。デフォルトは10
。 -
dataChangeTrigger
MonitoredItemにおけるDataChangeTriggerについて、以下のいずれかを設定します。-
0
for DataChangeTrigger.Status -
1
for DataChangeTrigger.StatusValue -
2
for DataChangeTrigger.StatusValueTimestamp
デフォルトは1
。
-
-
nodeIDs
観測するノードIDをスペースを空けて書きます。書式は以下の通りです。<namespaceIndex>,<identifier>,<depth>
以下はサンプルです。depthに-1
を設定すると、ノードIDを起点に末端までノードIDを探索します。
nodeIDs=2,Dynamic/RandomInt32,0 \
2,Dynamic/RandomInt64,0 \
2,Dynamic,-1 \
0,2295,-1
上記の例では、ノードIDに2,Dynamic/RandomInt32
と2,Dynamic/RandomInt64
を明示的に指定し、併せて、2,Dynamic
と0,2295
(VendorServerInfo)から下の階層のノードIDを末端まで探索します。
なお、conf/opcua
ディレクトリには、milo-example.properties
もあります。これは、Eclipse Miloに含まれているサンプルサーバをビルドしたmilo-example-serverへの接続設定の例です。
参考までに、OPC-UAサーバのAddressSpaceを確認するための簡易ツールとして、toem impulse OPC/UA Extension (Eclipse pulug-in)があります。
rainy起動
- 起動
以下のように起動します。
# cd /path/to/rainy-felix/bin
# sh rainy-start.sh
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.ext.ClassPathExtenderFactory$DefaultClassLoaderExtender (file:/path/to/rainy-felix/bin/felix.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.ext.ClassPathExtenderFactory$DefaultClassLoaderExtender
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
-> ps
START LEVEL 1
ID State Level Name
[ 0] [Active ] [ 0] System Bundle (6.0.3)
[ 1] [Active ] [ 1] bcpkix (1.62)
[ 2] [Active ] [ 1] bcprov (1.62)
[ 3] [Active ] [ 1] bluetooth scanner (0.1.1)
[ 4] [Active ] [ 1] bluez-dbus-osgi (0.1.2.201908052042)
[ 5] [Active ] [ 1] bsd-parser-core (0.3.3)
[ 6] [Active ] [ 1] bsd-parser-gson (0.3.3)
[ 7] [Active ] [ 1] java driver for ti sensortag cc2650 (0.1.0)
[ 8] [Active ] [ 1] Apache Commons Lang (3.9.0)
[ 9] [Active ] [ 1] cron4j-osgi (2.2.5)
[ 10] [Active ] [ 1] dbus-java-with-java-utils-osgi (3.0.2)
[ 11] [Active ] [ 1] Gson (2.8.5)
[ 12] [Active ] [ 1] Guava: Google Core Libraries for Java (26.0.0.jre)
[ 13] [Active ] [ 1] Java client for InfluxDB (2.15)
[ 14] [Active ] [ 1] jSerialComm (2.5.1)
[ 15] [Active ] [ 1] Jackson-annotations (2.9.9)
[ 16] [Active ] [ 1] Jackson-core (2.9.9)
[ 17] [Active ] [ 1] jackson-databind (2.9.9.1)
[ 18] [Active ] [ 1] JavaBeans Activation Framework (1.2.0)
[ 19] [Active ] [ 1] jaxb-api (2.4.0.b1808300359)
[ 20] [Active ] [ 1] file:/home/pi/rainy-felix/bundle/jaxb-runtime-2.4.0-b180830.0438.jar
[ 21] [Active ] [ 1] java driver for mh-z19b - intelligent infrared co2 module (0.1.2)
[ 22] [Active ] [ 1] A modern JSON library for Kotlin and Java (1.7.0)
[ 23] [Active ] [ 1] MessagePack serializer implementation for Java (0.8.17)
[ 24] [Active ] [ 1] Netty/Buffer (4.1.38.Final)
[ 25] [Active ] [ 1] netty-channel-fsm-osgi (0.3.0)
[ 26] [Active ] [ 1] Netty/Codec (4.1.38.Final)
[ 27] [Active ] [ 1] Netty/Codec/HTTP (4.1.38.Final)
[ 28] [Active ] [ 1] Netty/Common (4.1.38.Final)
[ 29] [Active ] [ 1] Netty/Handler (4.1.38.Final)
[ 30] [Active ] [ 1] Netty/Resolver (4.1.38.Final)
[ 31] [Active ] [ 1] Netty/Transport (4.1.38.Final)
[ 32] [Active ] [ 1] Apache Felix Shell Service (1.4.3)
[ 33] [Active ] [ 1] Apache Felix Shell TUI (1.4.1)
[ 34] [Active ] [ 1] Apache ServiceMix :: Bundles :: jsr305 (3.0.2.1)
[ 35] [Active ] [ 1] Apache ServiceMix :: Bundles :: okhttp (3.14.1.1)
[ 36] [Active ] [ 1] Apache ServiceMix :: Bundles :: okio (1.15.0.1)
[ 37] [Active ] [ 1] Apache ServiceMix :: Bundles :: retrofit (2.5.0.2)
[ 38] [Active ] [ 1] Paho MQTT Client (1.2.1)
[ 39] [Active ] [ 1] OSGi LogService implemented over SLF4J (1.7.26)
[ 40] [Active ] [ 1] Pi4J :: Java Library (Core) (1.2)
[ 41] [Active ] [ 1] java driver for ppd42ns - dust sensor module (0.1.6)
[ 42] [Active ] [ 1] osgi activator of rainy - a tiny tool for iot data collection and monitoring (0.1.6)
[ 43] [Active ] [ 1] OPC-UA bundle of rainy - a tiny tool for iot data collection and monitoring (0.1.4)
[ 44] [Active ] [ 1] rainy - a tiny tool for iot data collection and monitoring (0.1.14)
[ 45] [Active ] [ 1] sdk-client (0.3.3)
[ 46] [Active ] [ 1] sdk-core (0.3.3)
[ 47] [Active ] [ 1] slf4j-api (1.7.26)
[ 48] [Resolved ] [ 1] slf4j-jdk14 (1.7.26)
[ 49] [Active ] [ 1] stack-client (0.3.3)
[ 50] [Active ] [ 1] stack-core (0.3.3)
[ 51] [Active ] [ 1] strict-machine-osgi (0.1.0)
->
- 停止
以下のように停止します。
-> stop 0
センサーデータをログファイルに出力する
conf/logging.properties
の以下のログレベルをINFO --> FINE
に変更して、rainyを再起動すると、取得したセンサーデータがログファイルlogs/rainy.log.0
に出力されます。
#io.github.s5uishida.level=INFO
-->
io.github.s5uishida.level=FINE
ログファイルの出力例は以下の通りです。なお、行の先頭を省略しています。
[/dev/ttyAMA0] co2:850
[hci0] B0:B4:48:B9:92:86 obj:28.28125 amb:32.28125
[hci0] B0:B4:48:B9:92:86 humidity:59.362793
[hci0] B0:B4:48:B9:92:86 pressure:1012.27
[hci0] B0:B4:48:B9:92:86 optical:227.28
[hci0] B0:B4:48:B9:92:86 gyr[x]:-1.3198851
[hci0] B0:B4:48:B9:92:86 gyr[y]:-0.2593994
[hci0] B0:B4:48:B9:92:86 gyr[z]:0.7476806
[hci0] B0:B4:48:B9:92:86 acc[x]:0.0056152344
[hci0] B0:B4:48:B9:92:86 acc[y]:-0.007080078
[hci0] B0:B4:48:B9:92:86 acc[z]:0.9707031
[hci0] B0:B4:48:B9:92:86 mag[x]:127.0
[hci0] B0:B4:48:B9:92:86 mag[y]:420.0
[hci0] B0:B4:48:B9:92:86 mag[z]:302.0
[GPIO_10] pcs:1373.6702 ugm3:2.1420693
なお、Raspberry Pi 3BのSDカードへの書き込み回数を減らすため、通常はログレベルをINFO
に設定することを推奨します。
InfluxDBに作成されたデータベース名を確認する
ログファイルlogs/rainy.log.0
から、InfluxDBに作成されたデータベース名を確認します。以下はそれぞれのセンサー用に作成されたデータベース名の例です。
- MH-Z19B ⇒
RP3B_01__dev_ttyAMA0
- CC2650 ⇒
B0_B4_48_B9_92_86
とB0_B4_48_ED_B6_04
- Eclipse Milo公開デモサーバ ⇒
milo_digitalpetri_com_62541_milo
- PPD42NS ⇒
RP3B_01_GPIO_10
execute - CREATE DATABASE RP3B_01__dev_ttyAMA0
...
execute - CREATE DATABASE B0_B4_48_B9_92_86
...
execute - CREATE DATABASE B0_B4_48_ED_B6_04
...
execute - CREATE DATABASE milo_digitalpetri_com_62541_milo
...
execute - CREATE DATABASE RP3B_01_GPIO_10
これらのデータベース名は、GrafanaやChronografでダッシュボードを作成する際、InfluxDBに接続する情報として必要になります。
可視化ツールでダッシュボードを作成する
時系列なセンサーデータをモニタリングするために、可視化ツールのGrafanaやChronografからInfluxDBに接続します。
Grafanaの場合
Grafanaの使い方は、こちらのGetting startedを参照して下さい。以下のグラフは、Grafanaで作成したダッシュボードのイメージ例です。
以下のグラフは、Plotlyパネルを使用した磁気(3軸)の3Dイメージ例です。
以下のグラフは、ImageItパネルを使用してセンサーデータをフロアにマッピングしたイメージ例です。3つの部屋にCC2650を配置して、メインの部屋にMH-Z19B(CO2濃度)とPPD42NS(PM2.5濃度)を配置しています。
Chronografの場合
Chronografの使い方は、こちらのGetting startedを参照して下さい。以下のグラフは、Chronografで作成したダッシュボードのイメージ例です。
以下のグラフは、Eclipse Miloの公開デモサーバの次のノードIDを対象とするダッシュボードのイメージ例です。
1,VendorServerInfo/ProcessCpuLoad
1,VendorServerInfo/SystemCpuLoad
1,VendorServerInfo/UsedMemory
2,Dynamic/RandomDouble
2,Dynamic/RandomFloat
2,Dynamic/RandomInt32
2,Dynamic/RandomInt64
可視化ツールのGrafanaやChronografを使用すると、InfluxDBに送られた各センサーの時系列データのダッシュボードを簡単に作成することができます。
MQTTブローカに送られたデータを確認する
MQTTクライアントコマンドを以下のように実行して、MQTTブローカに送信されたデータを確認することができます。
# mosquitto_sub -d -t rainy/B0_B4_48_ED_B6_04
Client mosqsub|2095-u1804 sending CONNECT
Client mosqsub|2095-u1804 received CONNACK
Client mosqsub|2095-u1804 sending SUBSCRIBE (Mid: 1, Topic: rainy/B0_B4_48_ED_B6_04, QoS: 0)
Client mosqsub|2095-u1804 received SUBACK
Subscribed (mid: 1): 0
Client mosqsub|2095-u1804 received PUBLISH (d0, q0, r0, m0, 'rainy/B0_B4_48_ED_B6_04', ... (670 bytes))
{"deviceID":"B0:B4:48:ED:B6:04","clientID":"RP3B-01","samplingDate":"2019-08-09 12:56:00.009","samplingTimeMillis":1565351760009,"samplingTimeNanos":0,"firmwareVersion":"1.30 (May 23 2016)","batteryLevel":{"value":72,"unit":"%"},"objectTemperature":{"value":27.46875,"unit":"deg C"},"ambientTemperature":{"value":32.03125,"unit":"deg C"},"humidity":{"value":34.61914,"unit":"%"},"pressure":{"value":1009.16,"unit":"hPa"},"optical":{"value":203.84,"unit":"lux"},"gyroscope":{"x":-10.589599,"y":-7.8887935,"z":-2.281189,"unit":"deg/s"},"accelerometer":{"x":-0.029785156,"y":-0.06347656,"z":1.1887207,"unit":"G"},"magnetometer":{"x":138.0,"y":125.0,"z":-199.0,"unit":"uT"}}
制限事項
- Bluetoothアダプタは同時に一つしか使えません。 - Bluetoothチップの制限で、同時に使用できるCC2650の個数は数個程度と思います。 - CC2650との接続が切れた時、自動再接続に失敗することがあります。 - PPD42NSはPi4Jから使用するため、**rainy**はRaspberry Pi (arm)シリーズでのみ、PPD42NSを使用できます。amd64のLinuxマシンではPi4Jを使えないため、PPD42NSを使用できません。 - OPC-UAサーバについて、観測対象のノードIDの個数とpublishing intervalの兼ね合いで、InfluxDBの負荷が極端に上がる可能性があります。バンドル一覧
わたしが作成した以下のバンドルのライセンスはMITライセンスです。
- bluetooth-scanner 0.1.1
- cc2650-driver 0.1.0
- mh-z19b-driver 0.1.2
- ppd42ns-driver 0.1.6
- rainy-activator 0.1.6
- rainy-opcua 0.1.4
- rainy 0.1.14
その他に利用している3rdパーティの以下のバンドルについては、各ライセンスをご確認下さい。
- SLF4J 1.7.26
- Apache Commons Lang 3.9
- dbus-java-with-java-utils-osgi 3.0.2
- bluez-dbus-osgi 0.1.2
- cron4j-osgi 2.2.5
- influxdb-java-osgi 2.15.0
- msgpack-core-osgi 0.8.17
- moshi-osgi 1.7.0
- Jackson 2.9.9 annotations, core, databind
- Apache Felix 6.0.3
- Apache Felix Shell 1.4.3
- Apache Felix Shell TUI 1.4.1
- JSR 305 3.0.2
- Okio 1.15.0
- OkHttp 3.14.1
- Retrofit 2.5.0
- Eclipse Paho Client Mqttv3 1.2.1
- jSerialComm 2.5.1
- Netty 4.1.38 netty-buffer-4.1.38.Final.jar, netty-codec-4.1.38.Final.jar, netty-codec-http-4.1.38.Final.jar, netty-common-4.1.38.Final.jar, netty-handler-4.1.38.Final.jar, netty-resolver-4.1.38.Final.jar, netty-transport-4.1.38.Final.jar
- JAXB API 2.4.0
- JAXB Runtime 2.4.0
- JavaBeans Activation Framework (JAF) 1.2.0
- strict-machine-osgi 0.1
- netty-channel-fsm-osgi 0.3
- bsd-parser-core 0.3.3
- bsd-parser-gson 0.3.3
- stack-core 0.3.3
- stack-client 0.3.3
- sdk-core 0.3.3
- sdk-client 0.3.3
- Gson 2.8.5
- Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs 1.62
- Bouncy Castle Provider 1.62
- Guava: Google Core Libraries for Java 26.0
- Pi4J 1.2 (pi4j-core.jar)
これらのバンドルの開発者ならびに貢献された方々に感謝致します。
一連の記事
このシリーズは、以下の記事から構成されます。
- 動機とコンセプト
-
Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)
関連するGithubはこちら。 -
TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)
関連するGithubはこちら。 -
MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)
関連するGithubはこちら。 -
PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)
関連するGithubはこちら。 -
産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)
関連するGithubはこちら。 -
簡易ツールにまとめる(今回)
関連するGithubはこちら。 - 後記
追記
[2019.11.16]
簡易ツールの最新情報は、こちらをご参照下さい。