LoginSignup
9
6

More than 3 years have passed since last update.

屋内環境を手軽にモニタリングする~⑦簡易ツールにまとめる~

Last updated at Posted at 2019-09-06

はじめに

一連の記事で、一般的な環境情報と産業オートメーション機器の稼動情報を取得するために作成したJavaライブラリについて簡単に紹介してきました。整理すると以下の通りです。

これらのデータを取得してモニタリングするとともに、取得したデータを他の用途に利用するための仕組みを入れて、簡単なツール(rainy)にまとめました。Raspberry Pi 3BにJavaを入れて、Apache Felix (OSGiフレームワーク)上で動作させています。rainyをビルドしてツールにまとめたものはrainy-felix.zipとしてこちらで公開しています。

rainyの概要のイメージは以下の通りです。
rainy_overview_0_jp.png
また、次のイメージは、同じRaspberry Pi 3Bにモニタリング機能を同居させた構成です。
rainy_overview_2_jp.png
使用している機器は以下の通りです。
rainy_hardware_1.png
MH-Z19BにUSBシリアル通信アダプターで接続する場合の機器は以下の通りです。
rainy_hardware_0.png
なお、本記事は、こちらのGithubとほぼ同じ内容です。

目次

目的

このツールrainyの目的を簡潔に言うと、以下の通りです。

  • 屋内(プライベート/オフィス/工場)において、一般的な環境情報と産業オートメーション機器の稼動情報を取得する。
  • これらのデータを概ねリアルタイムにモニタリングし、また、その他の用途で利用できるようにする。
  • Raspberry Pi 3B (arm)とUbuntuマシン(amd64)の上で、Java / OSGiアプリケーションとして稼動させる。

rainyは、正式な運用には機能も性能も不十分と思いますが、コンパクトで手軽に試せるツールと思います。

OSのセットアップ

Raspberry Pi 3B上でrainyを稼動させるためのセットアップについては、こちらこちらを参考にして下さい。Raspberry Pi 3B内蔵のBluetoothとシリアル通信(UART)を同時に使用することができます。

データ送信のセットアップ

rainyは、データの送信先にInfluxDBとMQTTブローカに対応しています。

InfluxDBのインストールと起動

Ubuntu 18.04の仮想マシンでInfluxDBを使用しています。インストール手順は、こちらが参考になります。

# 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(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を使用しています。インストール手順は、こちらが参考になります。

# 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を使用しています。インストール手順は、こちらが参考になります。

# 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設定

詳細はこちらを参照して下さい。

  • /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設定

詳細はこちらを参照して下さい。

  • /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

こちらも参考になります。

  • 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

こちらも参考になります。

注意点。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

こちらも参考になります.

  • gpioPin
    GPIO_10GPIO_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の公開デモサーバの設定例です。

  • use
    このOPC-UAサーバに接続する場合はtrueに設定します。デフォルトはfalse
  • serverName
    OPC-UAサーバ名を設定します。
  • endpointIP
    OPC-UAサーバのアドレスを設定します。
  • endpointPort
    OPC-UAサーバのポート番号を設定します。
  • securityPolicy
    securityPolicyについて、Basic128Rsa15Basic256Basic256Sha256Noneのいずれかを設定します。デフォルトはNone
  • securityMode
    securityModeについて、SignSignAndEncryptNoneのいずれかを設定します。デフォルトは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/RandomInt322,Dynamic/RandomInt64を明示的に指定し、併せて、2,Dynamic0,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_86B0_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で作成したダッシュボードのイメージ例です。
rainy_grafana_1.png
以下のグラフは、Plotlyパネルを使用した磁気(3軸)の3Dイメージ例です。
rainy_grafana_1_1.png
以下のグラフは、ImageItパネルを使用してセンサーデータをフロアにマッピングしたイメージ例です。3つの部屋にCC2650を配置して、メインの部屋にMH-Z19B(CO2濃度)とPPD42NS(PM2.5濃度)を配置しています。
rainy_floor_env_1.png

Chronografの場合

Chronografの使い方は、こちらのGetting startedを参照して下さい。以下のグラフは、Chronografで作成したダッシュボードのイメージ例です。
rainy_chronograf_1.png
以下のグラフは、Eclipse Miloの公開デモサーバの次のノードIDを対象とするダッシュボードのイメージ例です。
- 1,VendorServerInfo/ProcessCpuLoad
- 1,VendorServerInfo/SystemCpuLoad
- 1,VendorServerInfo/UsedMemory
- 2,Dynamic/RandomDouble
- 2,Dynamic/RandomFloat
- 2,Dynamic/RandomInt32
- 2,Dynamic/RandomInt64
rainy_opcua_1.png
上段は1,VendorServerInfo/ProcessCpuLoad1,VendorServerInfo/SystemCpuLoad1, VendorServerInfo/UsedMemoryの各ノードIDのデータを表示しています。中段は2,Dynamic/RandomDouble2,Dynamic/RandomFloatの各ノードIDのデータを重ねて表示しています。下段は2,Dynamic/RandomInt322,Dynamic/RandomInt64の各ノードIDのデータを表示しています。

可視化ツールの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)

これらのバンドルの開発者ならびに貢献された方々に感謝致します。

一連の記事

このシリーズは、以下の記事から構成されます。
1. 動機とコンセプト
2. Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)
 関連するGithubはこちら
3. TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)
 関連するGithubはこちら
4. MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)
 関連するGithubはこちら
5. PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)
 関連するGithubはこちら
6. 産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)
 関連するGithubはこちら
7. 簡易ツールにまとめる(今回)
 関連するGithubはこちら
8. 後記

追記

[2019.11.16]
簡易ツールの最新情報は、こちらをご参照下さい。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6