2019 年度 OSS リテラシ 3 : Raspberry Pi でのセンサー利用

はじめに: 利用するセンサー

センサーの規格として最近よく利用されるのは I2C(アイ・スクエア・シー, アイ・アイ・シー, アイ・ツー・シー)である. I2C は低速な周辺機器をマイコンに接続するためのものであり, 組み込みシステムや携帯電話などで利用される.

  • 通信速度 : 0 ~ 100 kbps (標準モード)
  • 信号線 : SDA (データ), SCL (クロック)
  • 備考 : スレーブの識別にはアドレスを使う. 信号線にはプルアップ抵抗が必要.

演習では以下の I2C 規格のセンサーを利用する. これらのセンサー が全てラズパイの GPIO 2, 3 (ピン番号 3, 5) に接続されている. 各センサーにはアドレスが割り当てられており, 同じアドレスの機器を同時に接続することはできないことに注意せよ.

  • 気温・湿度センサー: Adafruit Si7021
    • 精度: -0.4 ~ +0.4 度 (温度), -3.0 ~ +3.0 % (湿度)
    • I2C アドレス: 0x40
    • 在庫 : 3 箱 (42) + 8
  • 気圧・温度センサー: Adafruit BMP180
    • 精度: -4 ~ 2 hPa (圧力 (絶対値)), -2 ~ +2 度 (温度)
    • I2C アドレス: 0x77
    • 在庫 : 2 箱 (28) + 4
  • 照度センサー: Adafruit TSL2561
    • ダイナミックレンジ: 0.1 ~ 40,000 Lux
    • I2C アドレス: 0x39 (0x29, 0x49)
    • 在庫 : 3 箱 (42) + 13
  • 非接触型温度計 (放射温度計): Adafruit TMP007
    • I2C アドレス: 0x40 (0x47)
    • 在庫 : 1 箱 (10)
  • 簡易 CO2 センサー: Adafruit SGP30
    • CO2 濃度 (eCO2), 総揮発性有機化合物量 (TVOC)
    • I2C アドレス: 0x58
    • 在庫 : 1 箱 (14) + 4 箱

なお, I2C 規格ではないが, 本演習では温度・湿度センサー SENSIRION SHT75 も用いる. このセンサーは精度が良く, I2C 規格のそれに比べてノイズに強い (ケーブル長を長くとれる) という利点がある. この SHT75 は京都大学の酒井教授 が観測に利用しており, 松江高専の環境モニタリングシステムでも主力として利用している.

  • 温度・湿度センサー: SENSIRION SHT75
    • 精度: -0.3 ~ +0.3 度 (温度), -1.8 ~ +1.8 % (湿度)
    • 在庫 : 39 + 50

センサーの接続方法

本演習ではセンサーを簡単に接続するために, ラズパイに専用基板を利用する. I2C 規格のセンサーは演習用基板の CON 1, CON 2, CON 3 のどれかに接続するすれば良い. これらのポートはラズパイの GPIO 2, GPIO 3 (ピン番号 3, 5) に並列に接続されている.

温度・湿度センサー SENSIRION SHT75 は練習用基盤の CON6 ポートに接続する. このポートは GPIO 23 ピンと GPIO 24 ピンに接続されている. 今回は使わな いが, CON 4 ポートは GPIO17 ピンと GPIO18 ピンに, CON5 ポートは GPIO27 ピンと GPIO22 ピンに接続されている.

必要なライブラリのインストール

各センサーの python ライブラリが配布されているので, それをインストールする. pip コマンドは Python のパッケージ管理システムである. 近年は言語ごとにパッケージ管理システムを持ち, OS が用意している以外のライブラリをインストールことが容易になっている (例えば ruby なら gem).

$ sudo apt-get update

$ sudo apt-get python3-pip

BMP180 用のライブラリのインストール

$ sudo pip3 install adafruit-bmp

TMP007 用のライブラリのインストール

$ sudo pip3 install adafruit-tmp

TSL2561 用のライブラリのインストール

$ sudo pip3 install tsl2561

Si7021 用のライブラリのイストール

$ sudo pip3 install pi-si7021

SGP30 用のライブラリのイストール

$ sudo pip3 install sgp30

SHT75 用のライブラリのインストール

$ sudo pip3 install sht-sensor

$ sudo pip3 install future

実習用サンプルスクリプト

実習用サンプルスクリプトを GitHub から入手する.

$ cd

$ git clone https://github.com/sugiymki/iotex-sensor.git

clone した iotex-sensor の bin 以下にサンプルスクリプトが存在する. 以下の手順に従って, 接続したセンサーが実際に動作するか確認せよ.

温度湿度センサー SHT75 の利用

今回は本センサは使わない. この項目はパスする.

SHT75 は, pip install sht-sensor を行うことで, 実行ファイルが /usr/local/bin/sht としてインストールされる. 従って, /usr/local/bin 以下にインストールされた sht コマンドを用ることで温度, 湿度, 露点温度, を測定することができる.

$ /usr/local/bin/sht -v -trd 24 23

  temperature: 24.48
  rh: 55.7499717405
  dew_point: 15.0566070705

なお引数は以下の通りである.

-t: 温度 (temperature)
-r: 相対湿度 (relative humidity)
-d: 露点温度 (dew point)

なお, 今回は関係ないが, CON4 と CON5 に SHT75 を接続した場合は以下のように実行する.

$ /usr/local/bin/sht -v -trd 18 17
$ /usr/local/bin/sht -v -trd 27 22

I2C 規格のセンサーの利用

今回は全員 Si7021 と TSL2561 を使うこと. 希望者はもう 1 つ適当なセンサーを使って構いません (ケーブルの数に限りがあるので. 134 本). 以下では自分で使うセンサーについてのみ行えば良い.

"メニュー" => "設定" => "Raspberry Pi の設定" を選択し, "インターフェイス" タブより I2C を有効にする

I2C で接続された周辺機器には固有のアドレスが付与される. 接続した I2C 機器に振られたアドレスを確認するためには, i2cdetect コマンドを使う. 機器ごとにアドレスが決まっているので, アドレスが表示されるか確認をする. 以下の例では, 0x39 が TSL2561, 0x40 が TMP007, 0x77 が BMP180 である. 自分の接続したセンサーのアドレスが表示されていることを確認すること.

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f	
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- 77                         

bmp180

bmp180 を用いると温度 (Temp), 圧力 (Pressure) が得られる.

$ ./iotex-sensor/bin/bmp180
Temp = 17.00 *C
Pressure = 101521.00 Pa

オプション -t, -p をつけるとそれぞれ温度と圧力の値のみが出力される.

$ ./iotex-sensor/bin/bmp180 -t
17.00

$ ./iotex-sensor/bin/bmp180 -p
101521.00

TMP007

tmp007 を用いると基板の温度 (Die temperature) と TMP007 を向けている方向の壁か何かの放射温度 (Object temperature) が表示される.

$ ./iotex-sensor/bin/tmp007
Object temperature: 18.714 *C
Die temperature: 17.219 *C

オプション -t, -r をつけるとそれぞれ基板の温度と放射温度の値のみが出力される.

$ ./iotex-sensor/bin/tmp007 -t
17.219

$ ./iotex-sensor/bin/tmp007 -r
18.714
練習) センサーの前に手をかざすと放射温度 (Object temperature) が変化することを確認せよ.

TSL2561

tsl2561 を用いると照度を Lux 単位で測ることができる.

$ ./iotex-sensor/bin/tsl2561
LUX: 262

オプション -l をつけると照度の値のみが出力される.

$ ./iotex-sensor/bin/tsl2561
262
練習) センサーの前に手をかざしたり, センサーを蛍光灯に向けると照度が変化することを確認せよ.

Si7021

Si7021 を使うためには, まず pigpiod を起動する必要がある (1 回行えば良い).

$ sudo pigpiod

その後, 実行する.

$ ./iotex-sensor/bin/si7021
Temperature: 23.54 °C
Relative humidity: 63.0 %

オプション -t, -r をつけると温度と相対湿度の値だけを出力する.

$ ./iotex-sensor/bin/si7021 -t
23.54

$ ./iotex-sensor/bin/si7021 -r
63.0

SGP30

SGP30 を利用する. 最初の 10-20 回目の読み込みでは値が常に CO2 濃度 (eCO2) が 400 ppm, 総揮発性有機化合物 (TVOC) が 0 ppb を示す. data = 以下の 1 番目の数字が eCO2 [ppm], 2 番目の数字が TVOC [ppb] である.

初期化のために, オプション -v をつけて実行する. 最初の 20 回程度の読み込みが表示され, 最初のうちは値が 400, 0 に固定されていることがわかる.

$ ./iotex-sensor/bin/sgp30 -v

  the SGP30 takes at least 15 seconds to warm up, 12 hours before the readigs become really stable
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[400, 0], raw=[1, 144, 76, 0, 0, 129], crc_ok=True)
  Sgp30Answer(data=[406, 11], raw=[1, 150, 234, 0, 11, 107], crc_ok=True)
  Sgp30Answer(data=[405, 3], raw=[1, 149, 185, 0, 3, 210], crc_ok=True)
  Sgp30Answer(data=[404, 4], raw=[1, 148, 136, 0, 4, 69], crc_ok=True)
  Sgp30Answer(data=[406, 13], raw=[1, 150, 234, 0, 13, 205], crc_ok=True)
  Sgp30Answer(data=[413, 6], raw=[1, 157, 0, 0, 6, 39], crc_ok=True)
  Sgp30Answer(data=[419, 9], raw=[1, 163, 218, 0, 9, 9], crc_ok=True)
  Sgp30Answer(data=[415, 8], raw=[1, 159, 98, 0, 8, 56], crc_ok=True)

-v オプションで実行したのち, CO2 濃度 (eCO2) と総揮発性有機化合物 (TVOC) の測定を開始する. CO2 濃度 (eCO2) のみ表示する場合は -e を付ける.

$ ./iotex-sensor/bin/sgp30 -e
  413

TVOC のみ表示する場合は -t を付ける.

$ ./iotex-sensor/bin/sgp30 -t
  5
練習) センサーに息を吹きかけると?

センサーで取得したデータの送信と可視化

取得したデータをセンサーに送るためのプログラムを作成する. ここではセンサーからデータを取得して送信するだけの簡単なシェルスクリプトを作成してみよう.

curl コマンド

シェルスクリプトは実行すべき一連の Unix コマンドをまとめたものである. ループなどの制御構文も使える. 今回作成するシェルスクリプトの中核を成すのが curl コマンドである. curl コマンドは手軽に HTTP リクエストを投げることができるので大変重宝するコマンドである. HTTPS で Basic 認証がかかっているときは -u オプションで Basic 認証用のユーザ名とパスワードを指定する. なお, URL は IP 直打ちではなく, iot-XX.epi.it.matsue-ct.jp (XX は数字) という SSL 証明書を取る時に用いたホスト名にすること.

今回は curl コマンドを用いてサーバ側で動いている monitoring.php (受け取っ たデータをデータベースに格納するための PHP スクリプト) に対してHTTP GET メソッドでデータを送る. PHP のセットアップ: データ ベースへの入力でブラウザに入力した URL を, curl コマンドの引数に与える形になる. hostname= や time= の後に ホスト名や時刻を適当に入れてみよ. なお, https 以下の文字列はダブルクォーテーションで囲むこと.

$ curl -u user:password "https://iot-XX.epi.it.matsue-ct.jp/~hogehoge/php/monitoring.php?hostname=test&time=20191202000000"

 ...

サーバからの戻り値としてサーバ側で実行された SQL 文がターミナル上に表示される. SQL 文から判断できるように, ラズパイから送られたデータはサーバ上のデータベースに格納される. メッセージをよく見て, エラーが出ていないことを確認すること.

シェルスクリプトの実行

以下はシェルスクリプト (sensor.sh) の例であるが, データの取得と送信を無限ループしている. サーバに送るデータ群にホスト名とデータ取得時刻を含めることは必須である (これらがテーブルの主キーなので). シェルスクリプト内で, hostname コマンドでホスト名を取得し, date コマンドで現在時刻を取得している. また, センサー Si7021 で得た温度 ($temp に保管) と湿度 ($humi に保管) を curl コマンドの引数で使っている.

$ vi sensor.sh

  例えば以下のように書く

  #/bin/bash
  url=iot-XX.epi.it.matsue-ct.jp/~hogehoge/php/monitoring.php
  bin=$HOME/iotex-sensor/bin/si7021
  hostname=`hostname`
  sudo pigpiod
  while :
  do 
    time=`date +%Y%m%d%H%M%S` 
    temp=`$bin -t`
    humi=`$bin -r`
    echo $time $temp $humi
    curl -u user:passwd "https://$url?hostname=$hostname&time=$time&temp=$temp&humi=$humi" 
    sleep 10
  done

上記スクリプト sensor.sh を実行してみよ. サーバからの戻り値としてサーバ側で実行された SQL 文がターミナル上に表示されるので, エラーが出ていないか確認すること. SQL 文から判断できるように, ラズパイから送られたデータはサーバ上のデータベースに格納される.

$ bash sensor.sh

 .....

環境情報データの受け取りの確認 (サーバ (VM) での作業)

まず Web サーバのログを確認し, ラズパイからのアクセスがあることを確認する. tail -f コマンドを使うことで, ファイルに新たなログが追加されるたびに標準出力が更新される. 数分間見ていれば 1 分間隔でログが増えていくことがわかる. tail -f コマンドを終了させるときは Ctrl-C (コントールキーを押しながら c キーを押す) とする.

vm$ sudo -s

vm# tail -f /var/log/apache2/access.log

  ...(略)...
  10.52.2.36 - - [18/Dec/2018:20:15:01 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:15:00&experiment_id=mon&essid=&temp=22.353333333333335&humi=35.318565163500004&dp=6.267685202446666 HTTP/1.1" 200 579 "-" "curl/7.52.1"
  10.52.2.36 - - [18/Dec/2018:20:16:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:16:00&experiment_id=mon&essid=&temp=22.17&humi=35.73597459725&dp=6.276913743041666 HTTP/1.1" 200 579 "-" "curl/7.52.1"
  10.52.2.36 - - [18/Dec/2018:20:17:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:17:00&experiment_id=mon&essid=&temp=22.2&humi=35.727903358750005&dp=6.300135280706667 HTTP/1.1" 200 579 "-" "curl/7.52.1"
  10.52.2.36 - - [18/Dec/2018:20:18:00 +0900] "GET /~hogehoge/php/monitoring.php?hostname=j52&time=2018/12/18T20:18:00&experiment_id=mon&essid=&temp=22.25166666666667&humi=35.738378330833335&dp=6.350015274005 HTTP/1.1" 200 579 "-" "curl/7.52.1"

次に, mysql コンソールを立ち上げ, テーブル monitoring と monitoring_hosts にデータが登録されていることを確認すること.

仮想サーバ上で MySQL に接続して, ラズパイから送られてきたデータがデータベースに登録されているか確認する.

vm$ mysql -u hogehoge -p

  Enter password:    (適宜入力)

  ...(略)...

  MariaDB [(none)]> use iotex

    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed

monitoring_hosts を確認!

MariaDB [iotex]> select * from monitoring where time > '2019-12-01';

  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
  | hostname | time                | temp  | temp2 | temp3 | humi  | humi2 | humi3 | dp   | dp2  | dp3  | bmptemp | dietemp | lux  | objtemp | pres | winddir | windvel |
  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
  | j52      | 2018-12-18 19:57:00 | 21.74 |  NULL |  NULL | 36.16 |  NULL |  NULL | 6.07 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 19:58:00 | 21.96 |  NULL |  NULL | 35.86 |  NULL |  NULL | 6.14 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 19:59:00 | 21.87 |  NULL |  NULL | 35.68 |  NULL |  NULL | 5.99 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 20:00:00 | 21.85 |  NULL |  NULL | 35.75 |  NULL |  NULL |    6 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+

しばらく時間を空けてから再び同じ SQL を実行すると, データ数が増えていること, データ間隔が 10 秒おきであることが確認できる.

MariaDB [iotex]> select * from monitoring where time > '2018-12-01';

  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
  | hostname | time                | temp  | temp2 | temp3 | humi  | humi2 | humi3 | dp   | dp2  | dp3  | bmptemp | dietemp | lux  | objtemp | pres | winddir | windvel |
  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+
  | j52      | 2018-12-18 19:57:00 | 21.74 |  NULL |  NULL | 36.16 |  NULL |  NULL | 6.07 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 19:58:00 | 21.96 |  NULL |  NULL | 35.86 |  NULL |  NULL | 6.14 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 19:59:00 | 21.87 |  NULL |  NULL | 35.68 |  NULL |  NULL | 5.99 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 20:00:00 | 21.85 |  NULL |  NULL | 35.75 |  NULL |  NULL |    6 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 20:01:00 | 22.16 |  NULL |  NULL | 35.32 |  NULL |  NULL | 6.09 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 20:02:00 |    22 |  NULL |  NULL | 35.69 |  NULL |  NULL | 6.11 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  | j52      | 2018-12-18 20:03:00 | 21.96 |  NULL |  NULL |  35.9 |  NULL |  NULL | 6.16 | NULL | NULL |    NULL |    NULL | NULL |    NULL | NULL |    NULL |    NULL |
  +----------+---------------------+-------+-------+-------+-------+-------+-------+------+------+------+---------+---------+------+---------+------+---------+---------+

また, 送信元となるラズパイのホスト名と IP が monitoring_hosts に保管されていることが確認できる.

MariaDB [iotex]> select * from monitoring_hosts where time > '2019-12-03';

  +-------------+------------+---------------------+
  | hostname    | ip         | time                |
  +-------------+------------+---------------------+
  | raspberrypi | 10.52.2.65 | 2019-12-03 23:01:17 |
  | test        | 10.52.2.65 | 2019-12-03 22:50:18 |
  +-------------+------------+---------------------+
  2 rows in set (0.001 sec)

可視化

MySQL に保管されたデータからグラフを作るのには grafana を用いる. 環境データの可視化のためのサーバ設定(grafana) の課題を終えていれば, 送られたデータを表示するためのダッシュボードができているはずである. ダッシュボードに送信したデータが全て表示されているか確認すること. (-> 本日の課題)

/etc/hosts の設定 (サーバ (VM) での作業)

ラズパイは DHCP で接続しているために, IP アドレスが変わることがある. このことはサーバ (VM) 上の zabbix でラズパイを監視する際に問題となる (監視対象の IP を決め打ちできないので). そこで, サーバ上のデータベースに登録されたホスト名と IP アドレスを /etc/hosts に記載し, 定期的にそれらを更新することにする. そうすることで zabbix はホスト名 (すなわち, 現在の IP アドレス) でラズパイの監視が可能となる.

データベース iotex のテーブル monitoring_hosts からカラム hostname, ip の値を取り出し, それを /etc/hosts に追加する ruby スクリプトを作成せよ. 前期の資料 <URL:lecture-note_J4DB-02.htm.ja>, <URL:lecture-note_J4DB-03.htm.ja> を参考にせよ.

VM$ sudo cp /etc/hosts /etc/hosts.org 

VM$ vi mkhosts.rb

  例えば以下のような感じ.

  #!/usr/bin/env ruby
  # coding: utf-8
  require 'mysql2'

  # データベースへの接続
  client = Mysql2::Client.new(
      ......
   )

  # バックアップファイル /etc/hosts.org を表示. 
  f = open("/etc/hosts.org")
  puts f.read
  f.close

  # SQL 文の作成・実行
  sql = ....
  client.query( sql ).each do |item|
      # /etc/hosts の書式に従うように書く. ホスト名は item['hostname'], IP は item['ip'] に保管されている.
      puts "#{item["ip"]} \t #{item["hostname"]}.epi.it.matsue-ct.jp \t #{item["hostname"]}"
  end

試しに実行してみる.

VM$ ruby mkhosts.rb 

   127.0.0.1	localhost
   127.0.1.1	dennou-k.gfd-dennou.org	dennou-k

   # The following lines are desirable for IPv6 capable hosts
   ::1     localhost ip6-localhost ip6-loopback
   ff02::1 ip6-allnodes
   ff02::2 ip6-allrouters

   raspberrypi     raspberrypi.epi.it.matsue-ct.jp      10.52.2.65 
   .... 

この mkhosts.rb の出力を /etc/hosts に書き出せば良いが, パーミッションの関係で 以下のように実行するとエラーがでる.

VM$ ruby mkhosts.rb  > /etc/hosts

  -bash: /etc/hosts: 許可がありません

VM$ sudo ruby mkhosts.rb  > /etc/hosts

  -bash: /etc/hosts: 許可がありません

このような場合, root 権限で mkhosts.rb を実行しても良いが, ここでは簡単のために /etc/hosts のパーミッションを変えてしまう. /etc/hosts のパーミッションを 666 にすれば一般ユーザでも書き込みできる.

VM$ sudo chmod 666 /etc/hosts

VM$ ruby mkhosts.rb  > /etc/hosts   

確認のために, 登録されたホスト名に ping を打ってみよ. ちゃんと ping が通るはずである.

VM$ ping  raspberrypi  (登録されたラズパイのホスト名)

  PING raspberrypi.epi.it.matsue-ct.jp (10.52.2.65) 56(84) bytes of data.
  64 bytes from jxxxx.epi.it.matsue-ct.jp (10.52.2.65): icmp_seq=1 ttl=62 time=0.447 ms
  64 bytes from jxxxx.epi.it.matsue-ct.jp (10.52.2.65): icmp_seq=2 ttl=62 time=0.588 ms
  ^C
  --- raspberrypi.epi.it.matsue-ct.jp ping statistics ---

ruby スクリプトが完成したら, それを crontab で 10 分おきに実行するように設定せよ.

VM$ crontab -e

  .... (各自設定してみよ) ....

zabbix の設定

zabbix でラズパイを監視してみる. 今までの設定がうまくいっていれば, zabbix の Web インターフェイス (https://iot-XX.epi.it.matsue-ct.jp/zabbix/) の画面で ラズパイが見つかるはずである. 「設定」-> 「ホスト」から自分のラズパイを選択し, 「エージェントのインターフェイス」を IP アドレスではなく DNS 名に変更する. 接続方法も DNS をクリックすること. サーバ監視 (zabbix) の課題で友人のサーバ (VM) を監視したときのように, スクリーン上でラズパイの状態が表示できているか確認すること.

右上のプルダウンメニューにおいて, ホストの項目をラズパイのホスト名に変更してみよ. ラズパイの監視データが表示されるはずである.

課題

  • zabbix で自分のラズパイの状況を表示し, そのスナップショットを wbt より提出せよ (本資料の最後の図に相当するもの).
  • ラズパイのデータ送信スクリプト (sensor.sh) を改良し, 自分の使っている全てのセンサーのデータをサーバに送れるようにすること. その上で, grafana で新たなダッシュボードを作成し, ラズパイから送信するデータを全て表示すること. grafana のダッシュボードののスナップショットを wbt より提出せよ.

    • データを入力するカラム名は以下を参考にせよ. 今回は Si7021 の温度と湿度を temp, humi に入れている.
    テーブル monitoring
    +---------------+-------------+------+-----+---------+-------+
    | Field         | Type        | Null | Key | Default | Extra |
    +---------------+-------------+------+-----+---------+-------+
    | hostname      | varchar(20) | YES  |     | NULL    |       |ホスト名
    | time          | datetime    | YES  |     | NULL    |       |時刻
    | temp          | double      | YES  |     | NULL    |       |温度 (SHT75, 1 or Si7021)
    | temp2         | double      | YES  |     | NULL    |       |温度 (SHT75, 2)
    | temp3         | double      | YES  |     | NULL    |       |温度 (SHT75, 3)
    | humi          | double      | YES  |     | NULL    |       |湿度 (SHT75, 1 or Si7021)
    | humi2         | double      | YES  |     | NULL    |       |湿度 (SHT75, 2)
    | humi3         | double      | YES  |     | NULL    |       |湿度 (SHT75, 3)
    | dp            | double      | YES  |     | NULL    |       |露点温度 (SHT75, 1)
    | dp2           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 2)
    | dp3           | double      | YES  |     | NULL    |       |露点温度 (SHT75, 3)
    | bmptemp       | double      | YES  |     | NULL    |       |温度 (BMP180)
    | dietemp       | double      | YES  |     | NULL    |       |基板温度 (TMP007)
    | lux           | double      | YES  |     | NULL    |       |照度 (TSL2561)
    | objtemp       | double      | YES  |     | NULL    |       |放射温度 (TM007)
    | pres          | double      | YES  |     | NULL    |       |圧力 (BMP180)
    | sitemp        | double      | YES  |     | NULL    |       |温度 (Si7021)
    | sihumi        | double      | YES  |     | NULL    |       |湿度 (Si7021)
    | eco2          | double      | YES  |     | NULL    |       |CO2 濃度 (SGP30)
    | tvoc          | double      | YES  |     | NULL    |       |総揮発性有機化合物量 (SGP30)
    +---------------+-------------+------+-----+---------+-------+
    
    テーブル monitoring_hosts
    +----------+-------------+------+-----+---------+-------+
    | Field    | Type        | Null | Key | Default | Extra |
    +----------+-------------+------+-----+---------+-------+
    | hostname | varchar(20) | NO   | PRI | NULL    |       | ホスト名
    | ip       | varchar(15) | YES  |     | NULL    |       | IP アドレス
    | time     | datetime    | YES  |     | NULL    |       | 時刻
    +----------+-------------+------+-----+---------+-------+