2017年8月28日月曜日

Raspberry Pi + DHT11 + Zabbixによる温度・湿度監視

自宅ではESXiをインストールした検証用PCとQNAPのNASが24時間稼働をしているが、夏の日中帯はクーラーを止めることもあって、室温がかなり高くなっていることが気になっていた。

そこで、Raspberry Piで検証用PC付近の温度と湿度を取得し、Zabbixに連携してグラフ化し、温度監視をすることにした。

必要なもの

Raspberry Pi本体は当然必要となる。導入方法については別記事を参照。

温度・湿度センサーはDHT11を選択した。DHT11は精度はそこまでよくないらしいが、非常に安い。

・DHT11のセンサー
http://amzn.to/2iwkWkH

なお、私はDHT11単体で購入するのではなく、以下のOSOYOOの「電子工作キット」を購入した。この中にはDHT11の他に配線を楽にするブレッドボード等も含まれるので、Raspberry Piでいろいろやる場合は、1個買っておいても損はない。




センサーを接続

それではセンサーを接続していこう。DHT11のPin配置は以下の通りとなる。

 1 VDD
 2 DATA
 3 NC (Not Connected)
 4 GND

Raspberry Piとの接続は、以下の通りとなる。

 1 VDD -> 3V3
 2 DATA -> GPIO17
 3 NC (Not Connected) -> 接続しない
 4 GND -> GND

接続図は以下の通りとなる。


DATAとGPIO17の間にはプルアップ抵抗として、10kΩの抵抗を挟む図となっているが、プルアップ抵抗がはじめから回路に含まれている一体型のDHT11もあり、そちらを利用する場合は不要となる(一体型の場合はNCのPinも省略されて、3Pinで構成されているものが多い模様)。

以下写真は、自宅環境の接続の状況。わかりづらいが、DHT11にあらかじめプルアップ抵抗が付いており、通電するとLEDも点灯する仕様になっている。


Pythonにて温度・湿度取得スクリプトを作成

温度と湿度の取得スクリプトを一から作るのは大変なので、gitを使って元となるスクリプトを入手する。

$ git clone https://github.com/szazo/DHT11_Python.git
------------------------------
Cloning into 'DHT11_Python'...
remote: Counting objects: 48, done.
Unpacking objects: 100% (48/48), done.
Checking connectivity... done.
------------------------------

ファイルを確認すると、dht11.pyとdht11_example.pyの2のスクリプトがある。dht11.pyが本体で、dht11_example.pyから呼び出してセンサーから温度と湿度を取得する、という作りになっている。

$ cd DHT11_Python/
$ ls -l
------------------------------
-rw-r--r-- 1 pi pi 1071  8月 19 13:16 LICENSE.md
-rw-r--r-- 1 pi pi  899  8月 19 13:16 README.md
-rw-r--r-- 1 pi pi    1  8月 19 13:16 __init__.py
-rw-r--r-- 1 pi pi 5969  8月 19 13:16 dht11.py
-rw-r--r-- 1 pi pi  464  8月 19 13:16 dht11_example.py
------------------------------

今回はdht11_example.pyを参考にして、Zabbix連携用のスクリプトを作成する。以下のように、温度、湿度の順でカンマ区切りで表示させるスクリプトを作成した。

$ cat dht11_get_temperature_humidity.py
------------------------------
import RPi.GPIO as GPIO
import dht11

# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

# read data using pin 14
instance = dht11.DHT11(pin=17)

result = instance.read()
if result.is_valid():
    print("%d,%d" % (result.temperature, result.humidity))
------------------------------

試しに実行すると、以下の通り温度と湿度が出力された。

$ python dht11_get_temperature_humidity.py
------------------------------
35,31
------------------------------

Zabbix Senderにてデータを送信

Zabbixに対してはZabbix Senderを使い、データ送信を行うこととする。Zabbix Senderを使えるようにあらかじめZabbix Agentをインストールしておこう。インストール方法はこちらを参照。

Zabbix Senderのコマンドの書式は以下の通りとなる。キー名は、別途Zabbix Server側の「アイテム」で設定する際の値と同一にする必要がある。

zabbix_sender -z <Zabbix ServerのIPアドレス> -s <ホスト名> -k <キー名> -o <値>

上記zabbix_senderを使って、温度・湿度情報を送信するシェルスクリプトを以下のように作成した。内容としては、Pythonのスクリプトで得られた温度・湿度情報をZabbix Senderの値に入れて飛ばすだけの簡単なものになっている。

$ cat get_temperature.sh
------------------------------
#!/bin/bash

home_dir="/home/pi/DHT11_Python"

value=$(python $home_dir/dht11_get_temperature_humidity.py)
echo $value
zabbix_sender -z 192.168.33.22 -s t3015rasp -k rasp_temp -o $(echo $value | cut -d"," -f 1)
zabbix_sender -z 192.168.33.22 -s t3015rasp -k rasp_humi -o $(echo $value | cut -d"," -f 2)

exit 0
------------------------------

上記スクリプトを5分間隔で実行するよう、crontab -eコマンドにて以下行を登録する。

$ crontab -l
------------------------------
*/5 * * * * /home/pi/DHT11_Python/get_temperature.sh
------------------------------

cronの設定反映のため、サービスを再起動しておく。

$ sudo systemctl restart cron.service

Zabbix Serverにてグラフ化と監視トリガーを設定

最後にZabbix Server側で受信設定を行う。

1. アイテムの作成

温度用のアイテムと湿度用のアイテムの2つを作成する。

------------------------------
◆温度用
・名前:Sensor Temperature
・タイプ:Zabbixとラッパー
・キー:rasp_temp
・データ型:数値 (浮動小数)
・単位:℃
・アプリケーション:Sensor (「アプリケーションの作成」で作成する)
------------------------------


------------------------------
◆湿度用
・名前:Sensor Humidity
・タイプ:Zabbixとラッパー
・キー:rasp_humi
・データ型:数値 (浮動小数)
・単位:%
・アプリケーション:Sensor
------------------------------


2. グラフの作成

1つのグラフで温度と湿度を両方表示できるようにする。

------------------------------
・名前:Temperature & Humidity
・アイテム 1: Template OS Raspbian: Sensor Temperature / Y軸:左
・アイテム 2: Template OS Raspbian: Sensor Humidity / Y軸:右
------------------------------


3. トリガーの作成

温度に関しては高温度となった際に、Zabbixでアラートとして検知できるように、トリガーを作成する。

------------------------------
・名前:High Temperature
・条件式:{Template OS Raspbian:rasp_temp.last()}>37
     ※下線部は監視閾値としたい温度に適宜変更する
・深刻度:軽度の障害
------------------------------


4. グラフの確認

最後にグラフが正常に表示されることを確認する。赤線が温度で緑線が湿度となる。以下の図は一週間ほど値を取得した結果のグラフとなる。設置場所が検証用PCやNASの近くなので、温度が常に30℃以上と高めとなっている。


非常に当たり前の結果ではあるが、人が外出する日中は温度・湿度が上昇し、帰宅後クーラーをONにすると温度・湿度が急激に下がるということがわかった。

以上で、Raspberry Piを使って、温度・湿度センサーによる監視を実現することができた。今後は、取得した温度・湿度情報をもとに、クーラーや扇風機を制御できるようにしたいとも考えている。

参考

・DHT11 (Raspberry Pi) by piddlerintheroot in raspberry-pi

0 件のコメント:

コメントを投稿

人気の投稿