HomeMatic Gadget: Anzeige der Betriebszeit auf dem Startbildschirm
Hinter dem englischen Begriff Gadget verbirgt sich die sinngemäße deutsche Übersetzung „technische Spielerei“. Eine solche möchte ich hier vorstellen, nicht unbedingt notwendig, aber schön dass es geht. Uptime ist ein englischer Ausdruck für die Zeit, in der ein Computersystem läuft und funktionstüchtig ist, auf Deutsch also Betriebszeit, oder auch verfügbare Betriebszeit.
Da ich auch beruflich in der IT-Branche aktiv bin, kenne ich die Bedeutung einer solchen Zeit für die Zuverlässigkeit eines Systems. Daher war die Idee nicht so abwegig die Betriebszeit meiner HomeMatic Zentrale zu ermitteln und wenn möglich auf dem Startbildschirm anzuzeigen. Da sowohl die CCU wie auch RaspberryMatic auf einem Linux System basieren, begann meine Suche genau dort.
Der Befehl „uptime“ gibt auf Unix-Derivaten die aktuelle Uhrzeit, die Uptime des Systems, sowie den Load-Average über die letzten 1, 5 und 15 Minuten aus.
Mit dem nachfolgenden Befehl habe ich dann versucht die für mich relevanten Informationen heraus zu filtern.
Ich habe den Befehl in der Folge noch weiter angepasst und im HomeMatic Script weiter unten findet ihr den endgültigen Befehl, der die Betriebszeit in einem angenehmen, „human“ Format ausgibt.
Systemvariable erstellen
Im nächsten Schritt ist die Systemvariable anzulegen, in die wir die ermittelte Betriebszeit schreiben wollen. Dazu ist über die WebUI eine Variable vom Typ „Zeichenkette“ zu definieren. Wenn ihr eure HomeMatic Zentrale auf einer CCU betreibt, könnt ihr die Variable entsprechend definieren.
Startseite > Einstellungen > Systemvariable
Systemvariable zur Startseite hinzufügen
Über das folgende WebUI Menü: Startseite > Einstellungen > Benutzerverwaltung Könnt ihr die neue Systemvariable der Startseite des entsprechenden Benutzers hinzufügen.
SCRIPT
! Uptime (Betriebszeit) der CCU2 oder Raspberry auslesen string command = "cat /proc/uptime | awk '// { printf \"%d Tage %02d Std %02d Min\", $1/86400, $1/3600%24, $1/60%60 }'"; dom.GetObject ("CUxD.CUX2801001:5.CMD_SETS").State (command); dom.GetObject ("CUxD.CUX2801001:5.CMD_QUERY_RET").State (1); dom.GetObject ("Betriebszeit Raspberry").State (dom.GetObject ("CUxD.CUX2801001:5.CMD_RETS").State());
WebUI Programm
Um den ermittelten Wert in die oben angelegte Systemvariable zu schreiben, lasse ich ein Programm zyklisch laufen. Wichtig dabei ist, den Zyklus nicht zu kurz zu wählen, weil das zu Problemen führen kann. Außerdem macht es aus meiner Sicht keinen Sinn, im Minutentakt die Betriebszeit zu berechnen. Aus diesem Grund habe ich mich für einen Zyklus von 5 Minuten entschieden.
Hier der Ausdruck des Programms:
Wie bereits im Artikel „AddOn CUx-Daemon (CUx-D)“ beschrieben, empfehle ich bei häufigen Aufrufen von Systemfunktionen das über dieses AddOn umzusetzen. Dadurch läuft es sehr viel stabiler wie mit der Funktion „system.exec“. Warum genau habe ich dort detailliert beschrieben.
Eines möchte ich hier aber zusätzlich noch aufzeigen. Über das in CUx-D definierte Gerät kann man bis zu 19 Kanäle bestimmten Funktions-Aufrufen zuweisen. Im obigen Programm könnt ihr sehen, dass ich für die Ermittlung der Betriebszeit den Kanal 5 zugewiesen habe.
Damit ich immer einen Überblick habe, wie ich die einzelnen Kanäle des CUxD-Gerätes zugewiesen habe, nutze ich die Möglichkeit das in der Gerätekonfiguration in der WebUI zu definieren.
Startseite > Einstellungen > Geräte
Anzeige auf der WebUI Startseite
Zum Schluss noch ein Screenshot von der aktualisierten Startseite:
Und so gehts beim Tinkerboard:
Beschreibung wie ober, aber als Skript geben wir folgendes ein:
string temp;
system.Exec(„cat /sys/class/thermal/thermal_zone0/temp | sed ’s/.\{3\}$/.&/'“, &temp);
if(temp != „“) {
dom.GetObject(ID_SYSTEM_VARIABLES).Get(„CPU_Temp“).State(temp);
}
system.Exec(„cat /proc/loadavg | cut -d‘ ‚ -f-3 | tr -d ‚\n'“, &temp);
if(temp != „“) {
dom.GetObject(ID_SYSTEM_VARIABLES).Get(„CPU_Load“).State(temp);
}
system.Exec(„free -m | grep Mem: | awk ‚{ printf(\“%.1f\“, $3/$2*100) }'“, &temp);
if(temp != „“) {
dom.GetObject(ID_SYSTEM_VARIABLES).Get(„RAM_Usage“).State(temp);
}
system.Exec(„awk ‚{s=int($1);d=int(s/86400);h=int(s % 86400/3600);m=int(s % 3600 / 60); printf \“%d days, %02d:%02d\“, d, h, m}‘ /proc/uptime“, &temp);
if(temp != „“) {
dom.GetObject(ID_SYSTEM_VARIABLES).Get(„SYS_Uptime“).State(temp);
}
system.Exec(„/usr/bin/ntpq -pn | grep ‚*‘ | awk ‚{print $9}'“, &temp);
if(temp != „“) {
dom.GetObject(ID_SYSTEM_VARIABLES).Get(„SYS_NTPOffset“).State(temp);
}
Wir brauchen noch die Systemvariablen:
CPU_Temp – Zahl mit Einheit °C (min: -100, max: 100)
CPU_Load – Zeichenkette
RAM_Usage – Zahl mit Einheit % (min: 0, max: 100)
SYS_Uptime – Zeichenkeitte
SYS_NTPOffset – Zahl mit Einheit ms (min: -999999, max: 999999)
Hallo,
wie müsste das Script aussehen, um mit „vcgencmd measure_clock arm“ die Taktfrequenz der CPU (in MHz) anzeigen zu lassen?
Hatte es mit dem Script zur Temperatur-Auslesung probiert, aber das klappt nicht so recht.
Dank der Überschrift bin ich etwas irritiert. Ich dachte, ich könnte die tatsächliche Betriebszeit des Raspberry in der Raspberrymatic auslesen. Vielmehr ist der Zeitabschnitt von einem Bootvorgang zum nächsten Bootvorgang gemeint. Und wenn das Scipt ordentlich zeitverzögert läuft, ist sogar der vorherige Wert nach einem Reboot zu sehen, bis er wieder auf Null gesetzt wird und neu zählt. Monatliche Updates und Hardwareschraubereien sorgen dafür, dass immer nur Tage zusammen kommen.
Lässt sich das Script auf die gesamte Betriebszeit anpassen?
Perfekt, das werden ich auf alle Fälle ausprobieren!
Und wie das mit system.exec“ klappt wollte ich schon lange wissen,
habe schon befürchtet ich muss jedesmal eine neue „Fernbedienung“ installieren und habe mir schon irgendwie gedacht dass nicht alles auf den gleichen Kanal laufen kann.
sehr gut erklärt soweit ich das zu so später Stunde überflogen habe.