硬件准备
- 树莓派4B
- SHT30温湿度传感器一个
- 杜邦线4根(母对母
测试
- 树莓派开启i2c
sudo raspi-config
重启后检查/boot/config.txt文件是否开启i2c
-
连接SHT30
SHT30共有四个针脚,如下图所示
使用杜邦线(母对母)连接树莓派相应针脚
-
测试
安装i2c-tools
sudo apt-get install i2c-tools
查询i2c设备
sudo i2cdetect -y 1
输出显示0x44表示SHT30的地址
i2c-tools还有其他命令我们使用不到,这里不展开
- 编写测试脚本
在/usr/local/zabbix/目录下新建一个temhum.py,如果目录不存在,请新建目录,并且chmod +x 赋予脚本可执行权限
import smbus
import time
# Get I2C bus
bus = smbus.SMBus(1)
# SHT30 address, 0x44(68)
bus.write_i2c_block_data(0x44, 0x2C, [0x06])
time.sleep(0.5)
# SHT30 address, 0x44(68)
# Read data back from 0x00(00), 6 bytes
# Temp MSB, Temp LSB, Temp CRC, Humididty MSB, Humidity LSB, Humidity CRC
data = bus.read_i2c_block_data(0x44, 0x00, 6)
# Convert the data
temp = data[0] * 256 + data[1]
Temp = -45 + (175 * temp / 65535.0)
Humi = 100 * (data[3] * 256 + data[4]) / 65535.0
newTemp = round(Temp,2)
newHumi = round(Humi,2)
# Write data to log
file_handle=open('/usr/local/zabbix/temhum.log',mode='w')
file_handle.write(str(newTemp)+'\n'+str(newHumi)+'\n')
file_handle.close()
使用python运行一下脚本,cat查看log文件,如下所示表示正常获取到数据
至此,脚本编写完成
zabbix设置
默认树莓派已安装好zabbix-agent(教程更新中)
首先将zabbix用户加入sudo免密码执行,因为bus.write_i2c_block_data()必须使用root权限,否则会提示错误
visudo
在最下面添加zabbix ALL=NOPASSWD: ALL后保存退出,表示zabbix用户执行sudo命令不需要输入密码
在agent配置文件内添加自定义监控项,如下图所示
vim /etc/zabbix/zabbix_agentd.conf
三条配置从上到下分别是:
itroom.humidity 读取log文件内第二行湿度数据
itroom.temperature 读取log文件内第一行温度数据
itroom.temhum 运行脚本并且输出,最后cat是为了在zabbix的web页面上能查看数据,方便排错
UserParameter=itroom.humidity,sudo sed -n '2,1p' /usr/local/zabbix/temhum.log
UserParameter=itroom.temperature,sudo sed -n '1,1p' /usr/local/zabbix/temhum.log
UserParameter=itroom.temhum,sudo python /usr/local/zabbix/temhum.py && cat /usr/local/zabbix/temhum.log
保存配置文件并退出后重启agent
systemctl restart zabbix-agent
在Server上测试自定义监控项是否正常工作,其中127.0.0.1为树莓派的地址,由于我这里树莓派同时兼顾了Server端和Agent,所以使用本地地址检查
zabbix_get -s 127.0.0.1 -k itroom.temhum
zabbix_get -s 127.0.0.1 -k itroom.humidity
zabbix_get -s 127.0.0.1 -k itroom.temperature
获取到如上图所示数据表示正常工作
进入zabbix server的前端界面,配置-主机,选择树莓派对应主机,新建监控项,一个新建三个
配置完成后进入监测-最新数据,选择树莓派及ITRoom应用集,查看是否正常工作
如上图所示表示正常工作
相关触发器及图形自行设置
相关文章
附录:一些踩过的坑
- 为什么选择SHT30
一开始使用的DHT11和DHT22,使用的总线,无论怎么测试都获取不到数据(包括通过树莓派直接读数据,C读内存等方式),看其他成功案例也是尝试了多个厂家的DHT11才成功,无奈之下才换成SHT30
- 为什么不直接建两个监控项分别去调用脚本获取温度和湿度?
同时调用两个脚本同一个函数,会导致SHT30寄存器几乎同时写入两个值,造成假死,本来是想通过zabbix相关项目的监控项实现的,结果发现正则无论如何都匹配不到第二个数值(可能是我太菜了不会写),所以才有把温湿度数据写进文本,再用两个监控项去读文本。当然如果可以的话还有很多种方法,包括用sender来个server传数据,这个就自己研究了。
- 为什么要在将zabbix用户加入sudo免密码执行
agent在调用脚本的时候是使用zabbix用户去调用,但是bus.write_i2c_block_data()必须使用root权限,导致你在本地测试如果用的root权限会发现正常运行,但是一用zabbix-get检查会发现permission denied
- 如何知道温湿度监控失败(通过server的前端页面)
可以新建一个Intenal action,条件添加“应用集 等于 ITRoom”和“事件类型 等于 监控项在“不支持”的状态”,再配上动作,这样由于两个监控项的值都是浮点数,获取到不是浮点数的数据后会直接变为不支持,这样就能通过告警的方式通知