added uptime

This commit is contained in:
Your Name
2020-12-15 22:58:30 +02:00
parent a76d1d5e53
commit 8b704de74b
3 changed files with 54 additions and 37 deletions

View File

@@ -3,7 +3,7 @@ Python script to check the cpu load, cpu temperature, free space, used memory, s
on a Raspberry Pi computer and publish the data to a MQTT broker. on a Raspberry Pi computer and publish the data to a MQTT broker.
I wrote this so I can monitor my raspberries at home with [home assistant](https://www.home-assistant.io/). The script was written and tested on Python 2 but it should work fine on Python 3. I wrote this so I can monitor my raspberries at home with [home assistant](https://www.home-assistant.io/). The script was written and tested on Python 2 but it should work fine on Python 3.
The script if very light, it takes 3 seconds as there are 5 half second sleeps in the code - due to mqtt haveing problems if I shoot the messages with no delay, this is only if you choose to send the messages separetely, now the script support a group CSV message that don't have this delay. The script if very light, it takes 3 seconds as there are 5 half second sleeps in the code - due to mqtt having problems if I shoot the messages with no delay, this is only if you choose to send the messages separately, now the script support a group CSV message that don't have this delay.
Each value measured by the script is send via a separate message for easier craetion of home assistant sensors. Each value measured by the script is send via a separate message for easier craetion of home assistant sensors.
@@ -39,7 +39,7 @@ Then install this module needed for the script:
$ pip install paho-mqtt $ pip install paho-mqtt
``` ```
Copy ```/src/rpi-cpu2mqtt.py``` and ```/src/config.py.example``` to a folder of your choise (I am using ```/home/pi/scripts/``` ) and rename ```config.py.example``` to ```config.py``` Copy ```/src/rpi-cpu2mqtt.py``` and ```/src/config.py.example``` to a folder of your choise (I am using ```/home/pi/scripts/``` ) and rename ```config.py.example``` to ```config.py```
# Configuration # Configuration
@@ -51,7 +51,7 @@ This is the default configuration:
``` ```
random_delay = randrange(30) random_delay = randrange(30)
group_messages = True group_messages = True
sleep_time = 0.5 sleep_time = 0.5
cpu_load = True cpu_load = True
cpu_temp = True cpu_temp = True
@@ -60,23 +60,24 @@ voltage = True
sys_clock_speed = True sys_clock_speed = True
swap = False swap = False
memory = False memory = False
uptime = True
``` ```
If the ```group_messages``` is set to true the script will send just one message containing all values in CSV format. If the ```group_messages``` is set to true the script will send just one message containing all values in CSV format.
The group message looks like this: The group message looks like this:
``` ```
{'used_space': '25', 'sys_clock_speed': '1500', 'cpu_temp': '43.0', 'voltage': '0.8500', 'cpu_load': '1.25', 'memory': 'False', 'swap': 'False'} 1.3, 47.1, 12, 1.2, 600, nan, 14.1, 12
``` ```
Test the script. Test the script.
```bash ```bash
$ /usr/bin/python /home/pi/scripts/rpi-cpu2mqtt.py $ /usr/bin/python /home/pi/rpi-mqtt-monitor/rpi-cpu2mqtt.py
``` ```
Once you test the script there will be no output if it run OK but you should get 5 messages via the configured MQTT server (the messages count depends on your configuration). Once you test the script there will be no output if it run OK but you should get 5 messages via the configured MQTT server (the messages count depends on your configuration).
Create a cron entry like this (you might need to update the path in the cron entry below, depending on where you put the script files): Create a cron entry like this (you might need to update the path in the cron entry below, depending on where you put the script files):
``` ```
*/2 * * * * /usr/bin/python /home/pi/scripts/rpi-cpu2mqtt.py */2 * * * * /usr/bin/python /home/pi/rpi-mqtt-monitor/rpi-cpu2mqtt.py
``` ```
# Home Assistant Integration # Home Assistant Integration
@@ -122,13 +123,19 @@ This is the sensors configuration if ```group_messages = True``` assuming your s
state_topic: 'masoko/rpi4' state_topic: 'masoko/rpi4'
value_template: '{{ value.split(",")[5] }}' value_template: '{{ value.split(",")[5] }}'
name: rpi4 swap name: rpi4 swap
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt - platform: mqtt
state_topic: 'masoko/rpi4' state_topic: 'masoko/rpi4'
value_template: '{{ value.split(",")[6] }}' value_template: '{{ value.split(",")[6] }}'
name: rpi4 memory name: rpi4 memory
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt
state_topic: 'masoko/rpi4'
value_template: '{{ value.split(",")[7] }}'
name: rpi4 uptime
unit_of_measurement: "days"
``` ```
This is the sensors configuration if ```group_messages = False``` assuming your sensors are separated in ```sensors.yaml``` file. This is the sensors configuration if ```group_messages = False``` assuming your sensors are separated in ```sensors.yaml``` file.
@@ -161,12 +168,16 @@ This is the sensors configuration if ```group_messages = False``` assuming your
- platform: mqtt - platform: mqtt
state_topic: "masoko/rpi4/swap" state_topic: "masoko/rpi4/swap"
name: rpi4 swap name: rpi4 swap
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt - platform: mqtt
state_topic: "masoko/rpi4/memory" state_topic: "masoko/rpi4/memory"
name: rpi4 memory name: rpi4 memory
unit_of_measurement: "%" unit_of_measurement: "%"
- platform: mqtt
state_topic: "masoko/rpi4/uptime_days"
name: rpi4 uptime
unit_of_measurement: "days"
``` ```
Add this to your ```customize.yaml``` file to change the icons of the sensors. Add this to your ```customize.yaml``` file to change the icons of the sensors.
@@ -205,7 +216,7 @@ entities:
- entity: sensor.rpi4_sys_clock_speed - entity: sensor.rpi4_sys_clock_speed
- entity: sensor.rpi4_swap - entity: sensor.rpi4_swap
- entity: sensor.rpi4_memory - entity: sensor.rpi4_memory
- entity: sensor.rpi4_uptime
``` ```
# To Do # To Do
- add uptime monitoring - maybe add network traffic monitoring via some third party software (for now I can't find a way to do it without additional software)
- maybe add network trafic monitoring via some third party software (for now I can't find a way to do it without additinal software)

View File

@@ -9,15 +9,15 @@ mqtt_topic_prefix = "rpi-MQTT-monitor"
# Messages configuration # Messages configuration
# If this is set to True the script will send just one message containing all values # If this is set to True the script will send just one message containing all values
group_messages = True group_messages = True
# Random delay in seconds before measuring the values # Random delay in seconds before measuring the values
# - this is used for de-synchronizing message if you run this script on many hosts, set this to 0 for no delay. # - this is used for de-synchronizing message if you run this script on many hosts, set this to 0 for no delay.
# - if you want a fix delay you can remove the randarnge function and just set the needed delay. # - if you want a fix delay you can remove the randarnge function and just set the needed delay.
random_delay = randrange(30) random_delay = randrange(30)
# This is the time between sending the indivudual messages # This is the time between sending the individual messages
sleep_time = 0.5 sleep_time = 0.5
cpu_load = True cpu_load = True
cpu_temp = True cpu_temp = True
@@ -25,4 +25,5 @@ used_space = True
voltage = True voltage = True
sys_clock_speed = True sys_clock_speed = True
swap = True swap = True
memory = True memory = True
uptime = True

View File

@@ -23,12 +23,12 @@ def check_used_space(path):
def check_cpu_load(): def check_cpu_load():
# bash command to get cpu load from uptime command # bash command to get cpu load from uptime command
p = subprocess.Popen("uptime", shell=True, stdout=subprocess.PIPE).communicate()[0] p = subprocess.Popen("uptime", shell=True, stdout=subprocess.PIPE).communicate()[0]
cores = subprocess.Popen("nproc", shell=True, stdout=subprocess.PIPE).communicate()[0] cores = subprocess.Popen("nproc", shell=True, stdout=subprocess.PIPE).communicate()[0]
cpu_load = p.split("average:")[1].split(",")[0].replace(' ', '') cpu_load = p.split("average:")[1].split(",")[0].replace(' ', '')
cpu_load = float(cpu_load)/int(cores)*100 cpu_load = float(cpu_load)/int(cores)*100
cpu_load = round(float(cpu_load), 1) cpu_load = round(float(cpu_load), 1)
return cpu_load return cpu_load
def check_voltage(): def check_voltage():
full_cmd = "vcgencmd measure_volts | cut -f2 -d= | sed 's/000//'" full_cmd = "vcgencmd measure_volts | cut -f2 -d= | sed 's/000//'"
voltage = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0] voltage = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
@@ -45,20 +45,23 @@ def check_memory():
full_cmd = "free -t | awk 'NR == 2 {print $3/$2*100}'" full_cmd = "free -t | awk 'NR == 2 {print $3/$2*100}'"
memory = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0] memory = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
memory = round(float(memory), 1) memory = round(float(memory), 1)
return memory return memory
def check_cpu_temp(): def check_cpu_temp():
full_cmd = "vcgencmd measure_temp" full_cmd = "vcgencmd measure_temp"
p = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0] p = subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
cpu_temp = p.replace('\n', ' ').replace('\r', '').split("=")[1].split("'")[0] cpu_temp = p.replace('\n', ' ').replace('\r', '').split("=")[1].split("'")[0]
return cpu_temp return cpu_temp
def check_sys_clock_speed(): def check_sys_clock_speed():
full_cmd = "awk '{printf (\"%0.0f\",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq" full_cmd = "awk '{printf (\"%0.0f\",$1/1000); }' </sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"
return subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0] return subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
def check_uptime():
def publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sys_clock_speed = 0, swap = 0, memory = 0): full_cmd = "awk '{print int($1/3600/24)}' /proc/uptime"
return int(subprocess.Popen(full_cmd, shell=True, stdout=subprocess.PIPE).communicate()[0])
def publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sys_clock_speed = 0, swap = 0, memory = 0, uptime_days = 0):
# connect to mqtt server # connect to mqtt server
client = paho.Client() client = paho.Client()
client.username_pw_set(config.mqtt_user, config.mqtt_password) client.username_pw_set(config.mqtt_user, config.mqtt_password)
@@ -86,36 +89,37 @@ def publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sy
if config.sys_clock_speed: if config.sys_clock_speed:
client.publish(config.mqtt_topic_prefix+"/"+hostname+"/sys_clock_speed", sys_clock_speed, qos=1) client.publish(config.mqtt_topic_prefix+"/"+hostname+"/sys_clock_speed", sys_clock_speed, qos=1)
time.sleep(config.sleep_time) time.sleep(config.sleep_time)
if config.uptime_days:
client.publish(config.mqtt_topic_prefix+"/"+hostname+"/uptime_days", uptime_days, qos=1)
time.sleep(config.sleep_time)
# disconect from mqtt server # disconect from mqtt server
client.disconnect() client.disconnect()
def bulk_publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sys_clock_speed = 0, swap = 0, memory = 0): def bulk_publish_to_mqtt (cpu_load = 0, cpu_temp = 0, used_space = 0, voltage = 0, sys_clock_speed = 0, swap = 0, memory = 0, uptime_days = 0):
# compose the CSV message containing the measured values # compose the CSV message containing the measured values
values = cpu_load, float(cpu_temp), used_space, float(voltage), int(sys_clock_speed), swap, memory values = cpu_load, float(cpu_temp), used_space, float(voltage), int(sys_clock_speed), swap, memory, uptime_days
values = str(values)[1:-1] values = str(values)[1:-1]
# connect to mqtt server # connect to mqtt server
client = paho.Client() client = paho.Client()
client.username_pw_set(config.mqtt_user, config.mqtt_password) client.username_pw_set(config.mqtt_user, config.mqtt_password)
client.connect(config.mqtt_host, config.mqtt_port) client.connect(config.mqtt_host, config.mqtt_port)
# publish monitored values to MQTT # publish monitored values to MQTT
client.publish(config.mqtt_topic_prefix+"/"+hostname, values, qos=1) client.publish(config.mqtt_topic_prefix+"/"+hostname, values, qos=1)
# disconect from mqtt server # disconect from mqtt server
client.disconnect() client.disconnect()
if __name__ == '__main__': if __name__ == '__main__':
# set all monitored values to False in case they are turned off in the config # set all monitored values to False in case they are turned off in the config
cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = False cpu_load = cpu_temp = used_space = voltage = sys_clock_speed = swap = memory = uptime_days = False
# delay the execution of the script # delay the execution of the script
time.sleep(config.random_delay) time.sleep(config.random_delay)
# collect the monitored values # collect the monitored values
if config.cpu_load: if config.cpu_load:
cpu_load = check_cpu_load() cpu_load = check_cpu_load()
if config.cpu_temp: if config.cpu_temp:
@@ -123,16 +127,17 @@ if __name__ == '__main__':
if config.used_space: if config.used_space:
used_space = check_used_space('/') used_space = check_used_space('/')
if config.voltage: if config.voltage:
voltage = check_voltage() voltage = check_voltage()
if config.sys_clock_speed: if config.sys_clock_speed:
sys_clock_speed = check_sys_clock_speed() sys_clock_speed = check_sys_clock_speed()
if config.swap: if config.swap:
swap = check_swap() swap = check_swap()
if config.memory: if config.memory:
memory = check_memory() memory = check_memory()
if config.uptime:
uptime_days = check_uptime()
# Publish messages to MQTT # Publish messages to MQTT
if config.group_messages: if config.group_messages:
bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory) bulk_publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days)
else: else:
publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory) publish_to_mqtt(cpu_load, cpu_temp, used_space, voltage, sys_clock_speed, swap, memory, uptime_days)