1
0
Fork 0
Browse Source

Added Raspberry Pi temperature monitoring through zabbix configuration

master
Jakub Filo 3 years ago
parent
commit
9bd7af9c5a
  1. 1
      libvirthost.yml
  2. 4
      production
  3. 8
      raspberry.yml
  4. 1
      roles/bme280sensor/files/etc/modules-load.d/i2c.conf
  5. 2
      roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf
  6. 172
      roles/bme280sensor/files/usr/local/bin/bme280.py
  7. 30
      roles/bme280sensor/tasks/main.yml
  8. 2
      roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf
  9. 57
      roles/nutserver/tasks/main.yml
  10. 27
      roles/raspberry/tasks/main.yml
  11. 7
      roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf
  12. 1
      roles/zabbixagent/files/srv/common/zabbix.psk
  13. 37
      roles/zabbixagent/tasks/main.yml
  14. 1
      site.yml

1
libvirthost.yml

@ -5,3 +5,4 @@
- crypto
- libvirthost
- iscsitarget
- zabbixagent

4
production

@ -3,3 +3,7 @@
[libvirthost]
10.91.1.3
[raspberry]
10.91.1.4

8
raspberry.yml

@ -0,0 +1,8 @@
---
- hosts: raspberry
roles:
- common
- raspberry
- zabbixagent
- nutserver
- bme280sensor

1
roles/bme280sensor/files/etc/modules-load.d/i2c.conf

@ -0,0 +1 @@
i2c-dev

2
roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf

@ -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

@ -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

@ -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

2
roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf

@ -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

@ -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

@ -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

7
roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf

@ -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

@ -0,0 +1 @@
f75cc714e869007469e792bda8bfea829f4fff998949434e18c7d825261fb7ac

37
roles/zabbixagent/tasks/main.yml

@ -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

1
site.yml

@ -3,4 +3,5 @@
- import_playbook: faiserver.yml
- import_playbook: libvirthost.yml
- import_playbook: raspberry.yml

Loading…
Cancel
Save