こんにちは
先日、エアコンが突然停止していたことに気づかず、サーバをおいている部屋の温度が45度になり、ONUが停止。リモート操作を受け付けなくなるという事件がおきました。
この再発防止策として、Raspberry Pi(今回は3B) + DHT11で制作した温度センサとZabbixを活用して室温監視基盤を制作したので、ご紹介します。Raspberry Pi はZeroや4でも大丈夫です。
Raspberry Pi と DHT11センサ
作り方
センサーをRaspberry Piに接続する
DHT11センサーをRaspberry Piに接続します。このとき、
+は5Vか3.3V
-(GND)はGND
DATAはGPIOの使用するピン(今回は14を利用)
に接続しましょう。
※ここで接続をミスると発熱しパーツが溶けるというような悲劇が起こるので気をつけましょう。
プログラムを用意する
今回はPythonでDHT11センサの温湿度を読み取り、Webサーバでjson形式でWebAPI的なものを公開する手法を取ります。
ソースコード(GitHub)はこんな感じ。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Flask, jsonify | |
from dotenv import load_dotenv | |
import RPi.GPIO as GPIO | |
import dht11 | |
import os | |
import time | |
load_dotenv() | |
# initialize GPIO | |
GPIO.setwarnings(True) | |
GPIO.setmode(GPIO.BCM) | |
PIN = int(os.getenv('PIN')) | |
print("Using PIN is", PIN) | |
sensor = dht11.DHT11(pin=PIN) | |
app = Flask("dht11-server") | |
@app.route("/") | |
def responce_temp(): | |
#初期化 | |
temp = 0.0 | |
hum = 0.0 | |
s_data = sensor.read() | |
loop_count = 0 | |
# 値の取得 | |
while True: | |
if s_data.is_valid(): | |
temp = round(s_data.temperature, 2) | |
hum = round(s_data.humidity, 2) | |
return jsonify({'temp': str(temp), 'hum': str(hum)}), 200 | |
else: | |
loop_count += 1 | |
time.sleep(0.05) | |
s_data = sensor.read() | |
if loop_count > 100: | |
return jsonify({'error': 'Could not retrieve sensor data.'}), 500 | |
continue | |
def main(): | |
app.run(host='0.0.0.0', port=32121, threaded=False) | |
if __name__ == '__main__': | |
main() |
取得したセンサ情報をFlaskで公開するものになっています。
直接ブラウザでアクセスし、
GitHubに公開しているソースでは、Dockerでも動作するようになっているので気軽に動かしてみてください(手元でBuildする場合はCPUアーキテクチャにご注意を)。
また、余談ですが温湿度情報をPostするコードもあるので良ければ覗いてみてください(Post版GitHub)。
Zabbixで監視する
最後に、Raspberry Piで構築した温度返却サーバの情報をZabbixで取得します。
まずZabbixで情報を取得するために、ホストを作成し、Web取得画面に次のように取得先の登録を行います。
次にjsonのデータをパースし、温度情報のみを取り出します。(実はこの設定に少し手こずりました苦笑)
同様の処理を湿度の項目にも行います。
以上で監視に関する設定は終わりです。
また、お好みでトリガー(温度が27度以上になったらDiscordに通知するなど)を設定しましょう。
トリガーを設定しておけば、万が一の際にすぐに気づくことができます。
如何でしたでしょうか?
Zabbix自体の設定やプログラムの詳細な説明などは省いてしまいましたが、どういったことができるのかと言った手がかりをつかめていれば良いなぁとおもいます。
Zabbixはサーバの監視だけでなく、温湿度等の環境の監視にも利用でき、とても便利だと思いますので、みなさんも是非お試しください。改造が容易なのも魅力ですよ!
それでは、ばいち。
コメント