Monitoring d’un RaspberryPi sur un écran LCD

Dans l’article précédent, j’ai expliqué comment j’avais mit en oeuvre un écran LCD basé sur le contrôlleur PCF2119, en utilisant Python.

J’ai utilisé la classe Python que j’avais écrite pour écrire un petit programme de monitoring de mon serveur. Ce script affiche des informations sur l’état du système :

  • Hostname
  • Date et heure
  • Charge CPU
  • Utilisation de la mémoire RAM et SWAP
  • Utilisation des partitions
  • Données envoyées et reçues sur l’interface réseau
  • Uptime
  • Fréquence CPU
  • Température du CPU

Vu que l’écran ne dispose que de deux lignes, une ou deux de ces informations sont affichées à la fois, l’affichage étant mit à jours régulièrement (toutes les 2 secondes).

Voici le script:

import os
from pcf2119x import pcf2119x
import datetime
from datetime import timedelta
import psutil
import time

class StatisticsProvider():
    def __init__(self):
            pass

    def GetHostname(self):
            return str(os.uname()[1])

    def GetCurrentDateTime(self):
            return datetime.datetime.now().strftime("%Y-%m-%d %H:%M")

    def GetCpuPercent(self):
            return str(psutil.cpu_percent(interval=1))

    def GetMemoryUsage(self):
            return str(psutil.virtual_memory()[2])

    def GetSwapUsage(self):
            return str(psutil.swap_memory()[3])

    def GetDiskUsage(self, path):
            return str(psutil.disk_usage(path)[3])

    def GetNetworkMBytesSent(self):
            return str(psutil.network_io_counters()[0]/1000000)

    def GetNetworkMBytesReceived(self):
            return str(psutil.network_io_counters()[1]/1000000)

    def GetUpTime(self):
            with open('/proc/uptime', 'r') as f:
                    uptime_seconds = float(f.readline().split()[0])
                    ptime_string = str(timedelta(seconds = uptime_seconds)).split('.')[0]
                    return ptime_string

    def GetCpuFrequency(self):
            with open('/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq', 'r') as f:
                    freq = float(f.readline().split()[0])
                    return str(freq/1000)
    def GetCpuTemperature(self):
            with open('/sys/class/thermal/thermal_zone0/temp','r') as f:
                    temperature = float(f.readline().split()[0])
                    return str(temperature/1000)

if __name__ == '__main__':
    lcd = pcf2119x()
lcd.setup()
    stats = StatisticsProvider()

    while True:
            lcd.clear()
            lcd.write('Host:' + stats.GetHostname(), 0, 0)
            lcd.write('Up  :'+ stats.GetUpTime() , 1, 0)

            time.sleep(2)

            lcd.clear()
            lcd.write('CPU: ' +  stats.GetCpuPercent() + "% ", 0, 0)

            time.sleep(2)

            lcd.clear()
            lcd.write('Freq: '+stats.GetCpuFrequency() + "Mhz", 0, 0)
            lcd.write('Temp: ' + stats.GetCpuTemperature() + ' C', 1, 0)

            time.sleep(2)

            lcd.clear()
            lcd.write('RAM : ' +  stats.GetMemoryUsage()  +"%", 0, 0)
            lcd.write('Swap: ' + stats.GetSwapUsage() + '%', 1, 0)

            time.sleep(2)

            lcd.clear()
            lcd.write('/   : ' +  stats.GetDiskUsage('/')  +"%", 0, 0)
    lcd.write('Data: ' + stats.GetDiskUsage('/') + '%', 1, 0)

            time.sleep(2)

            lcd.clear()
            lcd.write('Net Rx: ' +  stats.GetNetworkMBytesReceived()  +"MB", 0, 0)
            lcd.write('Net Tx: ' + stats.GetNetworkMBytesSent() + 'MB', 1, 0)

            time.sleep(2)

J’ai donc créé une classe StatisticsProvider qui n’est là que pour encapsuler la récupération des information, elle ne dispose pas d’état ou de variable locale. On appelerait cette classe une classe statique, dans d’autre langage…

Ensuite, le __main__ en lui-même, qui est une simple boucle, qui affiche les différents écrans à tour de rôle.

Pour fonctionner, ce code a besoin de

  • psutil, une librairie permettant d’accéder à des utilitaires système (ps, top, df,…)
  • la classe pcf2119x écrite pour l’article précédent

Ensuite, il suffit de charger les modules I²C et de lancer, en root, le script.

Les différentes informations devraient être affichées les unes après les autres. Voilà de quoi avoir un rapide aperçu de l’état du système sans devoir se logguer et taper plein de commandes.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *