Raspberry Pi Überwachung mit MQTT

In meinem Haus verrichten einige Raspberry Pis ihren Dienst. Doch es ist mühselig, den Status bei jedem einzelnen zu überwachen. Was liegt also näher, MQTT dafür zu nutzen?

 

Dazu verwende ich ein Python Script, das von einem Cron Job alle 10min aufgerufen wird und dann wichtige Werte ausliest und die Ergebnisse via MQTT zur Verfügung stellt. Diese Werte sind:

  • Temperatur der CPU
  • Auslastung der Speicherkarte
  • Auslastung des Arbeitspeichers
  • Auslastung der CPU

Zur Installation wird das Python Script systemmonitor.py in das Verzeichnis /home/pi kopiert.
Damit es funktionieren kann, muss Python installiert sein, zusätzlich noch die MQTT Library:
sudo apt install python3-paho-mqtt

Der Aufruf erfolgt mit dem Namen des zu überwachenden Raspberrys als Kommandozeilenparameter:
/usr/bin/python3 /home/pi/systemmonitor.py satnogs

Um das Script regelmäßig ausführen zu lassen, muss es noch in Crontab eingetragen werden, z.B. für alle 10 Minuten:
*/10 * * * * /usr/bin/python3 /home/pi/systemmonitor.py MeinRaspberry

Das MQTT Topic lautet dann: /home/MeinRaspberry und kann dann zum Beispiel mit Node-Red direkt in einem Dashboard verwendet werden.

Auf diese Weise überwache ich aktuell 5 Raspberrys und kann so immer sehen, ob Eingriffe irgendwo nötig sind.

 

Hier das Script systemmonitor.py, in dem noch die IP Adresse des MQTT Brokers anstelle von "MOSQUITTO.LOCAL" eingetragen werden muss:

#!/usr/bin/env python
import paho.mqtt.publish as publish
from subprocess import check_output
from re import findall
import psutil
import sys
import time

def get_temp():
temp = check_output(["vcgencmd","measure_temp"]).decode("UTF-8")
return(findall("\d+\.\d+",temp)[0])

def get_disk_usage():
return str(psutil.disk_usage('/').percent)

def get_memory_usage():
return str(psutil.virtual_memory().percent)

def get_cpu_usage():
return str(psutil.cpu_percent(interval=None))

def publish_message(topic, message):
print("Publishing to MQTT topic: " + topic)
print("Message: " + message)

publish.single(topic, message, hostname="MOSQUITTO.LOCAL")

if __name__ == '__main__':
if len(sys.argv) != 2:
print("Specify a computer name as argument to " + __file__)
sys.exit(2)

computer_name = sys.argv[1]
print("Doing measurements for: " + computer_name)

time.sleep(5)
cu = get_cpu_usage()

publish_message("home/" + computer_name + "/temp", get_temp())
publish_message("home/" + computer_name + "/disk", get_disk_usage())
publish_message("home/" + computer_name + "/memory", get_memory_usage())
publish_message("home/" + computer_name + "/cpu", cu)