Raspberry Piで水温、気温、湿度を記録してZabbixでグラフ化 (DS18B20, AHT10)
水槽の水温計ってデジタルだと意外と高いので自作しました。ついでに室温と湿度も計って、Zabbixでグラフにします。
水温センサー: DS18B20
室温湿度センサー: AHT10
環境
Raspberry Pi Zero
Raspberry Pi OS 5.10.17+
zabbix_server 5.0.16
zabbix_agentd 5.0.14
AHT10の配線
まずI2Cを有効にします。
sudo raspi-config
で設定画面が開くので、Interface Options→I2Cをenableにします。
配線はVINにラズパイの3.3Vを、そしてGND、SCL、SDAをそれぞれに繋げます。
i2cdetect -y 1
を実行し、アドレス38が出てきたらOKです。
DS18B20の配線
1-Wireを有効にします。
先ほどと同じようにraspi-configからInterface Options→1-Wireをenableにします。
配線はVDDをラズパイの3.3V、DQ、GNDをそれぞれ繋ぐのですが、VDDとDQの間に4.7kΩの抵抗を挟む必要があります。
/sys/bus/w1/devices/
このディレクトリのなかに28で始まるディレクトリがあれば認識できてます。
Pythonでデータの読み取り
とりあえず、Pythonを利用してデータを読み取ってみます。
AHT10はこちらを参考に、温度の数値のみが出力されるよう少し変更を加えました。
https://github.com/gejanssen/aht10-python
AHT10の温度(temp.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import smbus import time #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 config = [0x08, 0x00] bus.write_i2c_block_data(0x38, 0xE1, config) time.sleep(0.5) byt = bus.read_byte(0x38) MeasureCmd = [0x33, 0x00] bus.write_i2c_block_data(0x38, 0xAC, MeasureCmd) time.sleep(0.5) data = bus.read_i2c_block_data(0x38,0x00) temp = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5] ctemp = ((temp*200) / 1048576) - 50 print(u'{0:.1f}'.format(ctemp)) |
AHT10の湿度(hum.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import smbus import time #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 config = [0x08, 0x00] bus.write_i2c_block_data(0x38, 0xE1, config) time.sleep(0.5) byt = bus.read_byte(0x38) MeasureCmd = [0x33, 0x00] bus.write_i2c_block_data(0x38, 0xAC, MeasureCmd) time.sleep(0.5) data = bus.read_i2c_block_data(0x38,0x00) tmp = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4 ctmp = int(tmp * 100 / 1048576) print(u'{0}'.format(ctmp)) |
DS18B20の水温(water_temp.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import os import glob from time import sleep os.system('modprobe w1-gpio') os.system('modprobe w1-therm') base_dir = '/sys/bus/w1/devices/' device_folder = glob.glob(base_dir + '28*')[0] device_file = device_folder + '/w1_slave' def read_temp_raw(): f = open(device_file, 'r') lines = f.readlines() f.close() return lines def read_temp(): lines = read_temp_raw() while lines[0].strip()[-3:] != 'YES': sleep(0.2) lines = read_temp_raw() equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos + 2:] temp_c = float(temp_string) / 1000.0 return temp_c print(read_temp()) |
実行すると、数値のみが出力されます。
これらのファイルを作成し、任意のディレクトリに入れておきます。
こちらでは、~/py/ディレクトリの中に入れておきました。
Zabbixエージェント側の設定
まずはRaspberry Pi側にzabbix-agentをインストールします。
1 | sudo apt install zabbix-agent |
zabbix-agentd.confを編集します。
1 | sudo nano /etc/zabbix/zabbix_agentd.conf |
Server=,ServerActive=をそれぞれサーバーのIP
Hostname=raspberrypi
そして末尾に
UserParameter=PI.ROOMTEMP,python3 /home/pi/py/temp.py
UserParameter=PI.ROOMHUM,python3 /home/pi/py/hum.py
UserParameter=PI.WATERTEMP,python3 /home/pi/py/water_temp.py
を追加します。
今回こちらでは、Zabbixサーバーは別のLinuxで立てているのでそちらを指定しましたが、Raspberry Piでサーバーを立てても構いません。Zeroでは重そうですが…
Zabbixサーバー側の設定
次に、ZabbixのWEBにアクセスし、このraspberrypiを追加します。
Configuration→Hosts→Create host
Host name raspberrypi
Groups Linux servers
Interfaces ラズパイのIP
TemplatesはTemplate OS Linux by Zabbix agentを選択しました。
ホストが認識されたらItemを作っていきます。
Configration→Hosts→raspberrypi→Items→Create item
温度
Name Room Temperature
Key PI.ROOMTEMP
Type of information Numeric (float)
Units ℃
湿度
Name Room Humidity
Key PI.ROOMHUM
Type of information Numeric (float)
Units %
水温
Name Water Temperature
Key PI.WATERTEMP
Type of information Numeric (float)
Units ℃
作成してしばらくすれば値が取得できると思います。
また、グラフはHosts→raspberrypi→Graphsから作ったItemを指定すると作れます。
終わり
ラズパイ、センサー代含めて1500円以下で作れました。
エアコンと連動させたりしてもよさそうです。
最近のコメント