Added Raspberry Pi temperature monitoring through zabbix configuration
This commit is contained in:
parent
4f574336b7
commit
9bd7af9c5a
@ -5,3 +5,4 @@
|
||||
- crypto
|
||||
- libvirthost
|
||||
- iscsitarget
|
||||
- zabbixagent
|
||||
|
@ -3,3 +3,7 @@
|
||||
|
||||
[libvirthost]
|
||||
10.91.1.3
|
||||
|
||||
[raspberry]
|
||||
10.91.1.4
|
||||
|
||||
|
8
raspberry.yml
Normal file
8
raspberry.yml
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
- hosts: raspberry
|
||||
roles:
|
||||
- common
|
||||
- raspberry
|
||||
- zabbixagent
|
||||
- nutserver
|
||||
- bme280sensor
|
1
roles/bme280sensor/files/etc/modules-load.d/i2c.conf
Normal file
1
roles/bme280sensor/files/etc/modules-load.d/i2c.conf
Normal file
@ -0,0 +1 @@
|
||||
i2c-dev
|
@ -0,0 +1,2 @@
|
||||
UserParameter=bme[*],/usr/bin/python /usr/local/bin/bme280.py | grep '$1:' | cut -d ' ' -f 2
|
||||
|
172
roles/bme280sensor/files/usr/local/bin/bme280.py
Executable file
172
roles/bme280sensor/files/usr/local/bin/bme280.py
Executable file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/python
|
||||
#--------------------------------------
|
||||
# ___ ___ _ ____
|
||||
# / _ \/ _ \(_) __/__ __ __
|
||||
# / , _/ ___/ /\ \/ _ \/ // /
|
||||
# /_/|_/_/ /_/___/ .__/\_, /
|
||||
# /_/ /___/
|
||||
#
|
||||
# bme280.py
|
||||
# Read data from a digital pressure sensor.
|
||||
#
|
||||
# Official datasheet available from :
|
||||
# https://www.bosch-sensortec.com/bst/products/all_products/bme280
|
||||
#
|
||||
# Author : Matt Hawkins
|
||||
# Date : 21/01/2018
|
||||
#
|
||||
# https://www.raspberrypi-spy.co.uk/
|
||||
#
|
||||
#--------------------------------------
|
||||
import smbus
|
||||
import time
|
||||
from ctypes import c_short
|
||||
from ctypes import c_byte
|
||||
from ctypes import c_ubyte
|
||||
|
||||
DEVICE = 0x76 # Default device I2C address
|
||||
|
||||
|
||||
bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
|
||||
# Rev 1 Pi uses bus 0
|
||||
|
||||
def getShort(data, index):
|
||||
# return two bytes from data as a signed 16-bit value
|
||||
return c_short((data[index+1] << 8) + data[index]).value
|
||||
|
||||
def getUShort(data, index):
|
||||
# return two bytes from data as an unsigned 16-bit value
|
||||
return (data[index+1] << 8) + data[index]
|
||||
|
||||
def getChar(data,index):
|
||||
# return one byte from data as a signed char
|
||||
result = data[index]
|
||||
if result > 127:
|
||||
result -= 256
|
||||
return result
|
||||
|
||||
def getUChar(data,index):
|
||||
# return one byte from data as an unsigned char
|
||||
result = data[index] & 0xFF
|
||||
return result
|
||||
|
||||
def readBME280ID(addr=DEVICE):
|
||||
# Chip ID Register Address
|
||||
REG_ID = 0xD0
|
||||
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
|
||||
return (chip_id, chip_version)
|
||||
|
||||
def readBME280All(addr=DEVICE):
|
||||
# Register Addresses
|
||||
REG_DATA = 0xF7
|
||||
REG_CONTROL = 0xF4
|
||||
REG_CONFIG = 0xF5
|
||||
|
||||
REG_CONTROL_HUM = 0xF2
|
||||
REG_HUM_MSB = 0xFD
|
||||
REG_HUM_LSB = 0xFE
|
||||
|
||||
# Oversample setting - page 27
|
||||
OVERSAMPLE_TEMP = 2
|
||||
OVERSAMPLE_PRES = 2
|
||||
MODE = 1
|
||||
|
||||
# Oversample setting for humidity register - page 26
|
||||
OVERSAMPLE_HUM = 2
|
||||
bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)
|
||||
|
||||
control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
|
||||
bus.write_byte_data(addr, REG_CONTROL, control)
|
||||
|
||||
# Read blocks of calibration data from EEPROM
|
||||
# See Page 22 data sheet
|
||||
cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
|
||||
cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
|
||||
cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
|
||||
|
||||
# Convert byte data to word values
|
||||
dig_T1 = getUShort(cal1, 0)
|
||||
dig_T2 = getShort(cal1, 2)
|
||||
dig_T3 = getShort(cal1, 4)
|
||||
|
||||
dig_P1 = getUShort(cal1, 6)
|
||||
dig_P2 = getShort(cal1, 8)
|
||||
dig_P3 = getShort(cal1, 10)
|
||||
dig_P4 = getShort(cal1, 12)
|
||||
dig_P5 = getShort(cal1, 14)
|
||||
dig_P6 = getShort(cal1, 16)
|
||||
dig_P7 = getShort(cal1, 18)
|
||||
dig_P8 = getShort(cal1, 20)
|
||||
dig_P9 = getShort(cal1, 22)
|
||||
|
||||
dig_H1 = getUChar(cal2, 0)
|
||||
dig_H2 = getShort(cal3, 0)
|
||||
dig_H3 = getUChar(cal3, 2)
|
||||
|
||||
dig_H4 = getChar(cal3, 3)
|
||||
dig_H4 = (dig_H4 << 24) >> 20
|
||||
dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
|
||||
|
||||
dig_H5 = getChar(cal3, 5)
|
||||
dig_H5 = (dig_H5 << 24) >> 20
|
||||
dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
|
||||
|
||||
dig_H6 = getChar(cal3, 6)
|
||||
|
||||
# Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
|
||||
wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575)
|
||||
time.sleep(wait_time/1000) # Wait the required time
|
||||
|
||||
# Read temperature/pressure/humidity
|
||||
data = bus.read_i2c_block_data(addr, REG_DATA, 8)
|
||||
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
|
||||
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
|
||||
hum_raw = (data[6] << 8) | data[7]
|
||||
|
||||
#Refine temperature
|
||||
var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11
|
||||
var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
|
||||
t_fine = var1+var2
|
||||
temperature = float(((t_fine * 5) + 128) >> 8);
|
||||
|
||||
# Refine pressure and adjust for temperature
|
||||
var1 = t_fine / 2.0 - 64000.0
|
||||
var2 = var1 * var1 * dig_P6 / 32768.0
|
||||
var2 = var2 + var1 * dig_P5 * 2.0
|
||||
var2 = var2 / 4.0 + dig_P4 * 65536.0
|
||||
var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
|
||||
var1 = (1.0 + var1 / 32768.0) * dig_P1
|
||||
if var1 == 0:
|
||||
pressure=0
|
||||
else:
|
||||
pressure = 1048576.0 - pres_raw
|
||||
pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
|
||||
var1 = dig_P9 * pressure * pressure / 2147483648.0
|
||||
var2 = pressure * dig_P8 / 32768.0
|
||||
pressure = pressure + (var1 + var2 + dig_P7) / 16.0
|
||||
|
||||
# Refine humidity
|
||||
humidity = t_fine - 76800.0
|
||||
humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)))
|
||||
humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
|
||||
if humidity > 100:
|
||||
humidity = 100
|
||||
elif humidity < 0:
|
||||
humidity = 0
|
||||
|
||||
return temperature/100.0,pressure/100.0,humidity
|
||||
|
||||
def main():
|
||||
|
||||
(chip_id, chip_version) = readBME280ID()
|
||||
print "Chip ID:", chip_id
|
||||
print "Version:", chip_version
|
||||
|
||||
temperature,pressure,humidity = readBME280All()
|
||||
|
||||
print "Temperature:", temperature
|
||||
print "Pressure:", pressure
|
||||
print "Humidity:", humidity
|
||||
|
||||
if __name__=="__main__":
|
||||
main()
|
30
roles/bme280sensor/tasks/main.yml
Normal file
30
roles/bme280sensor/tasks/main.yml
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
- name: install packages
|
||||
apt:
|
||||
state: latest
|
||||
pkg:
|
||||
- python-smbus
|
||||
- i2c-tools
|
||||
install_recommends: no
|
||||
force_apt_get: yes
|
||||
become: yes
|
||||
|
||||
- name: copy config files, scripts and services
|
||||
copy:
|
||||
src: "{{ item }}"
|
||||
dest: "/{{ item }}"
|
||||
force: yes
|
||||
mode: preserve
|
||||
become: yes
|
||||
with_items:
|
||||
- etc/modules-load.d/
|
||||
- usr/local/bin/
|
||||
- etc/zabbix/zabbix_agentd.conf.d/
|
||||
|
||||
- name: Add user zabbix to i2c group
|
||||
user:
|
||||
name: zabbix
|
||||
groups: i2c
|
||||
append: yes
|
||||
become: yes
|
||||
|
@ -0,0 +1,2 @@
|
||||
UserParameter=nut[*],/usr/bin/upsc $1 2>/dev/null | grep '$2:' | cut -d ' ' -f 2
|
||||
|
57
roles/nutserver/tasks/main.yml
Normal file
57
roles/nutserver/tasks/main.yml
Normal file
@ -0,0 +1,57 @@
|
||||
---
|
||||
- name: install packages
|
||||
apt:
|
||||
state: latest
|
||||
pkg:
|
||||
- nut
|
||||
install_recommends: no
|
||||
force_apt_get: yes
|
||||
become: yes
|
||||
|
||||
- name: copy config files, scripts and services
|
||||
copy:
|
||||
src: "{{ item }}"
|
||||
dest: "/{{ item }}"
|
||||
force: yes
|
||||
mode: preserve
|
||||
become: yes
|
||||
with_items:
|
||||
- etc/zabbix/zabbix_agentd.conf.d/nut.conf
|
||||
|
||||
- name: configure nut
|
||||
lineinfile:
|
||||
path: /etc/nut/nut.conf
|
||||
regexp: '^MODE='
|
||||
line: 'MODE=standalone'
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0640'
|
||||
become: yes
|
||||
|
||||
- name: configure ups in nut
|
||||
blockinfile:
|
||||
state: present
|
||||
path: /etc/nut/ups.conf
|
||||
backup: yes
|
||||
marker: "# {mark}"
|
||||
marker_begin: "BEGIN MANAGED BY PLANTROON"
|
||||
marker_end: "END MANAGED BY PLANTROON"
|
||||
insertafter: '^maxretry'
|
||||
block: |
|
||||
[cyberpower]
|
||||
driver = usbhid-ups
|
||||
port = auto
|
||||
desc = "CP Sineware"
|
||||
pollinterval = 5
|
||||
become: yes
|
||||
|
||||
- name: enable services
|
||||
systemd:
|
||||
name: "{{ item }}"
|
||||
state: restarted
|
||||
enabled: yes
|
||||
become: yes
|
||||
with_items:
|
||||
- zabbix-agent
|
||||
- nut-driver
|
||||
|
27
roles/raspberry/tasks/main.yml
Normal file
27
roles/raspberry/tasks/main.yml
Normal file
@ -0,0 +1,27 @@
|
||||
---
|
||||
- name: configure firmware
|
||||
lineinfile:
|
||||
path: /boot/firmware/config.txt
|
||||
regexp: '^upstream_kernel='
|
||||
line: 'upstream_kernel=1'
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0755'
|
||||
become: yes
|
||||
|
||||
- name: configure fstab to mount log in RAM
|
||||
lineinfile:
|
||||
path: /etc/fstab
|
||||
regexp: '^tmpfs /var/log'
|
||||
line: 'tmpfs /var/log tmpfs defaults,noatime,mode=0755 0 0'
|
||||
become: yes
|
||||
|
||||
- name: configure fstab to mount tmp in RAM
|
||||
lineinfile:
|
||||
path: /etc/fstab
|
||||
regexp: '^tmpfs /tmp'
|
||||
line: 'tmpfs /tmp tmpfs defaults,noatime,mode=0755 0 0'
|
||||
become: yes
|
||||
|
||||
#tune2fs -O "^has_journal" /dev/mmcblk*
|
||||
#noatime,barrier=0,commit=60
|
@ -0,0 +1,7 @@
|
||||
Server=91.236.69.232, 2001:470:6e:1c7::2, 10.91.1.0/24
|
||||
|
||||
TLSConnect=psk
|
||||
TLSAccept=psk
|
||||
TLSPSKFile=/srv/common/zabbix.psk
|
||||
TLSPSKIdentity=Zabbix PSK
|
||||
EnableRemoteCommands=1
|
1
roles/zabbixagent/files/srv/common/zabbix.psk
Normal file
1
roles/zabbixagent/files/srv/common/zabbix.psk
Normal file
@ -0,0 +1 @@
|
||||
f75cc714e869007469e792bda8bfea829f4fff998949434e18c7d825261fb7ac
|
37
roles/zabbixagent/tasks/main.yml
Normal file
37
roles/zabbixagent/tasks/main.yml
Normal file
@ -0,0 +1,37 @@
|
||||
---
|
||||
- name: install packages
|
||||
apt:
|
||||
state: latest
|
||||
pkg:
|
||||
- zabbix-agent
|
||||
install_recommends: no
|
||||
force_apt_get: yes
|
||||
become: yes
|
||||
|
||||
- name: copy config files, scripts and services
|
||||
copy:
|
||||
src: "{{ item }}"
|
||||
dest: "/{{ item }}"
|
||||
force: yes
|
||||
mode: preserve
|
||||
become: yes
|
||||
with_items:
|
||||
- srv/common/
|
||||
- etc/zabbix/zabbix_agentd.conf.d/
|
||||
|
||||
- name: Create zabbix log directory
|
||||
file:
|
||||
path: /var/log/zabbix-agent
|
||||
state: directory
|
||||
mode: '0755'
|
||||
owner: zabbix
|
||||
group: zabbix
|
||||
become: yes
|
||||
|
||||
- name: enable zabbix-agent
|
||||
systemd:
|
||||
name: zabbix-agent
|
||||
state: started
|
||||
enabled: yes
|
||||
become: yes
|
||||
|
Loading…
Reference in New Issue
Block a user