2020 年度 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).

以下は各種センサーについて記述するが, 基本的に自分の使うセンサーに関係する部分のみを行えば良い (2020 年度は Si7021 と TSL2561).

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
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 
    sec=`date +"%S"`
    if [ $sec = "00" ] ; then
      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" 
    fi
    sleep 1
  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) の課題を終えていれば, 送られたデータを表示するためのダッシュボードができているはずである. ダッシュボードに送信したデータが全て表示されているか確認すること. (-> 本日の課題)

課題

  • ラズパイのデータ送信スクリプト (sensor.sh) を改良し, 自分の使っている全てのセンサーのデータをサーバに送れるようにすること. すなわち, 温湿度計 Si7021 と照度計 TSL2561 のデータをサーバに送信せよ.
    • 照度計 TSL2561 のデータをテーブル monitoring のカラム lux に入力すること.
    • 改良したスクリプトを wbt に提出しなさい.
  • 上記を行った後に, grafana で新たなダッシュボードを作成し, ラズパイから送信されたデータを全て表示すること. grafana のダッシュボードののスナップショットを wbt より提出せよ.

    • データを入力するカラム名は以下を参考にせよ. 今回は Si7021 の温度と湿度を temp, humi に入れている. 照度計 TSL2561 のデータをカラム lux に入力すること.
    テーブル 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    |       | 時刻
    +----------+-------------+------+-----+---------+-------+