Den Hardware-WatchDog der CCU2 für die HomeMatic aktivieren

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Manfred7525
Beiträge: 137
Registriert: 09.10.2013, 11:59

Den Hardware-WatchDog der CCU2 für die HomeMatic aktivieren

Beitrag von Manfred7525 » 17.11.2013, 15:39

Hallo!

Es gibt hier schon ein Thema zum Watchdog, aber eher mit selbst entwickelter Hardware oder über Nutzung von Schaltaktoren. Ich habe für mich eine Lösung gefunden um den internen vorhandenen Hardware-Watchdog für die HomeMatic-Software (CCU2) zu nutzen.

Grundlage:
Die CCU2 ist eigentlich "nur" ein Mini-PC mit ARM-Prozessor auf dem Linux und die HomeMatic-Software läuft.
Der ARM-Prozessor hat bereits einen aktivierten Watchdog und ein kleines Programm unter Linux bedient diesen. Das Funktioniert so: Im Prozessor läuft eine kleine Uhr und zählt immer eine Sekunde aufwärts. Erreicht sie 60 Sekunden (vermutlich Standardeinstellung), dann startet der PC neu. Das soll aber i.d.R. natürlich nicht passieren und deswegen läuft zusätzlich/parallel ein kleines Software-Programm im Hintergrund (der watchdog-daemon), der alle 30 Sekunden (Standardeinstellung) den Hardware-Watchdog-Timer auf Null setzt. Im normalen Betrieb rennt die Uhr also immer nur bis max. 30 und dann wird zurückgesetzt. Die 60 Sekunden für die Reboot-Aktivierung wird also normalerweise nicht erreicht.
So, hängt sich der Computer aber auf, hängt auch der Watchdog-Daemon und es kann nicht mehr zurückgesetzt werden. Nach spätestens 60 Sekunden startet der Computer neu.

Das ist alles schon vorhanden und aktiv. Unser Problem ist aber, dass sich ggf. nur die HomeMatic-Software aufhängt, aber deswegen noch nicht der ganze PC. D.h. der Watchdog-Daemon kann in diesem Fall ganz ungestört weiterarbeiten und es kommt natürlich zu keinem Neustart.

Also, wir wollen keinen Wachhund der nur aufpasst ob alles zusammen abkratzt, sondern speziell wenn die HomeMatic-Software abkratzt. Das geht relativ einfach. Der Hardware-Watchdog-Zähler bleibt unberührt, aber statt dass er von einem kleinen Linux-Programm alle 30 Sekunden zurückgesetzt wird, soll die HomeMatic-Software diese Aufgabe übernehmen. D.h. kratzt nun die HomeMatic-Software ab, wird der Watchdog-Timer nicht mehr zurückgesetzt und die CCU startet neu. Kratzt der gesamte PC ab, wird auch neugestartet, weil in diesem Fall ja auch die HomeMatic-Software nicht mehr läuft.

Wie geht das?
Ganz einfach über 2 Scripte, eines auf dem Dateisystem der CCU2 und eines im WebUI.

Exkurs für Linux-Insider:
Im Grunde muss man nur den Linux-Daemon ausschalte, bzw. ihn beim Hochfahren nicht mehr automatisch starten. Das passiert in der Datei "/etc/init.d/S15watchdog". Leider auf einem Read-Only-Dateisystem, daher Sackgasse. Der Prozess "watchdog" muss 1x nach dem Booten mit dem kill-Befehl gestoppt werden. Und dann muss die HomeMatic-Software alle 1..59 Sekunden (Standard sind 30) den Watchdog-Timer zurücksetzen. Das passiert indem man irgend etwas in die Datei (Block-Device) /dev/watchdog schreibt.
Das Shell-Script prüft also ob der "normale" Watchdog-Daemon vorhanden ist (ob Prozess läuft) und wenn ja, wird er gekillt. Danach wird der Timer zurückgesetzt (mit "echo 1 > /dev/watchdog"). Um nicht alle 30 Sekunden nach dem Daemon suchen zu müssen, wird nach dem ersten Mal eine kleine Markierungsdatei in das flüchtige (tmpfs) Verzeichnis /tmp geschrieben (beim nächsten Neustart ist diese Datei weg und auch der Daemon wieder automatisch da).
Das Script selbs würde normalerweise unter /opt liegen, aber da dies auch Teil des ro Dateisystems ist, kommt nur /usr/local in Frage, der einzige rw Bereich.

Einrichten

1. Folgendes Shell-Script wird als Textdatei im Dateisystem der CCU2 gespeichert unter "/usr/local/bin/hm-watchdog.sh" (Ordner "bin" anlegen). Ihr könnt es über SSH (Benutzer = root, Standardpasswort = MuZhlo9n%8!G), FTP oder wie auch immer machen, aber nicht vergessen die Datei ausführbar zu machen (chmod 0755 ...)!

Code: Alles auswählen

#!/bin/sh

WATCHDOG_DEV=/dev/watchdog
TMP_MARK=/tmp/hm-watchdog

if [ ! -e "$TMP_MARK" ]; then
  WATCHDOG_PID=$(ps -o pid,comm | grep watchdog | head -n 1 | tr -cd '[0-9]')
  if [ -n "$WATCHDOG_PID" ] && kill -9 "$WATCHDOG_PID"; then
    sync
    echo "watchdog [$WATCHDOG_PID] killed."
    echo 1 > "$WATCHDOG_DEV"
    echo "$$WATCHDOG_PID" > "$TMP_MARK"
  fi
fi

echo 1 > "$WATCHDOG_DEV"
sync

exit 0
Das obige Shell-Script muss nun über folgendes WebUI-Script alle 30 Sekunden automatisch ausgeführt werden:

Code: Alles auswählen

string stdout;
string stderr;
system.Exec("/usr/local/bin/hm-watchdog.sh", &stdout, &stderr);
Fertig, viel Erfolg!

Benutzeravatar
Herbert_Testmann
Beiträge: 11062
Registriert: 17.01.2009, 11:30
Danksagung erhalten: 7 Mal

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von Herbert_Testmann » 17.11.2013, 17:29

Hallo

danke für die ausführliche Anleitung.
Den Ansatz an sich finde ich sehr gut.

Allerdings ... es wird immer wieder davon berichtet, dass system.Exec bei zu intensiver Benutzung die CCU zum Abstaurz bringt. Alle 30 sec ist sicher "sehr intensiv".
Gibt es dazu Langzeiterfahrungen ??
---
Dieses Schreiben wurde maschinell erstellt und ist ohne Unterschrift gültig

Manfred7525
Beiträge: 137
Registriert: 09.10.2013, 11:59

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von Manfred7525 » 17.11.2013, 17:41

Herbert_Testmann hat geschrieben:Allerdings ... es wird immer wieder davon berichtet, dass system.Exec bei zu intensiver Benutzung die CCU zum Abstaurz bringt. Alle 30 sec ist sicher "sehr intensiv".
Gibt es dazu Langzeiterfahrungen ??
Ich weiß. Alternativ könnte man CUxD für die Exec nutzen, aber ich wollte es nicht zu komplex machen.

Bei klappt es mit system.Exec seit einigen Stunden super, aber das ist nicht lang. Das Shell-Script welche gestartet wird hat i.d.R. keine Ausgabe und die Ausführungszeit ist auch sehr sehr kurz, also eher unproblematisch (vermute ich). Ich lass es mal ein paar Tage laufen. Ansonsten muss man halt CUxD nehmen.

Benutzeravatar
AndreO
Beiträge: 205
Registriert: 24.09.2013, 22:11
Wohnort: Die Rhön is schön :-)
Hat sich bedankt: 4 Mal

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von AndreO » 17.11.2013, 21:30

Hallo Manfred,

ich hatte die Dateien für den Hardware-Watchdog auch mal wie von Dir beschrieben per CUxD bzw System.Exec beschrieben und den Systemprozess gekillt. Ergebnis war, dass die CCU regelmäßig neugestartet hat. Ich vermute, dass es an Prozessen lag, die zu lange dauern und die CCU auslasten. Vielleicht liege ich mit meiner Vermutung auch daneben, aber wenn ichs mir aussuchen könnte würd ich die Zeit von 60 auf 600 oder so erhöhen. Doch hab ich hierzu keine Möglichkeit gefunden diese zu verändern.

Meine Stabilitätsprobleme, die ich hatte, hab ich unterdessen im Griff. Es lag nicht an der CCU, sondern aufm CUxD, der immer wieder abstürzte. Dafür kann der aber auch nix, sondern es lag an mir. Ich wusste nicht, dass ein gestarteter Befehl nicht erneut gestartet werden darf ohne 100%ig sicherzustellen, dass der vorige auch bereits abgeschlossen ist. Habe nun also über die Häufigkeit der Ausführung und Timeout gesteuert, dass sich nix überschneidet. Seither gabs keinen Absturz mehr. Sicherheitshalber hab ich aber nen Watchdog für den CUxD gebaut. Über den CUxD habe ich einen Timer laufen, der minütlich ein Skript startet, welches die aktuelle Systemzeit in eine Variable schreibt. Ein anderes Programm, welches nicht über den CUxD sondern über die Zeitsteuerung der CCU gestartet wird startet ein Skript, welches prüft, ob das Beschreiben der Variablen weniger als 10 Minuten her ist. Falls dem so ist wird ein System.Exec (der einzige, der bei mir existiert) gestartet, der den CUxD neustartet:

var Skriptzeit= dom.GetObject("Skriptzeit").ToTime(); ! Meine Variable, die minütlich über den CUxD beschrieben wird
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime(); ! wie spät ist es jetzt?
integer TimeDiff = now.ToInteger() - Skriptzeit.Value().ToInteger(); ! Vergleich beider Zeiten
if(TimeDiff > 600) {system.Exec("/etc/config/rc.d/cuxdaemon restart", &stdout, &stderr);} ! Wenn mehr als 10 Minuten, dann CUxD-Neustart

Der CUxD-Watchdog hat bisher nicht einspringen müssen. Die CCU2 läuft erstaunlich stabil. Und seit ich die Spielregeln des CUxD befolge ist auch dieser absolut stabil.

Dennoch vermisse ich nach wie vor einen Watchdog, den man auch justieren kann, wie den von owagner für die CCU1. Auf meine Frage, ob er ihn nicht auch für die CCU2 umbauen will, verwies er mich eben auf den Hardwarewatchdog, den ich daraufhin versucht habe zum Einsatz zu bringen, was eben leider nicht sonderlich erfolgreich verlief. Wenn irgendwer weiß, wie man die Zeit auf 10 Minuten erweitern kann, würd ichs vielleicht doch nochmal versuchen.

Viele Grüße,

André
piVCCU auf RaspberryPi3 (mit Funkmodul), CUL-Stick, 95 wireless Sensoren + Aktoren, 2 FS20-Sensoren + Aktoren

Manfred7525
Beiträge: 137
Registriert: 09.10.2013, 11:59

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von Manfred7525 » 18.11.2013, 09:37

Hallo AndreO!

Ich habe es nicht so ganz 100%-ig verstanden. D.h. den Hardware-Watchdog bedienst du erfolgreich mit dem Shell-Script, ausgeführt von der CCU mit system.Exec?
Und für den CUxD hast du einen eigenen Watchdog gebastelt den alleine die CCU realisiert?

Den Hardware-Watchdog würde ich auch lieber auf mehr als 60 Sekunden setzten. Auf die Schnell fand ich keine Möglichkeit. Ich tippe, dass es entweder im ARM fix verdrahtet ist (dann keine Chance), oder über einen Kernel-Parameter (dann möglich, aber ein Software-Gefummel).
Bei mir läuft es seit gestern 100%-ig stabil (ich lasse mir jeden Neustart mitloggen und kam noch nicht vor). Im WebUI habe ich 29 Sekunden eingestellt mit der Idee falls es 1x nicht klappen sollte, klappt es beim 2ten Mal vor den 60 Sekunden Timeout.

Man könnte den Hardware-Watchdog-Timer über einen kleinen Umweg praktisch erhöhen. Z.B.:
1. Die HomeMatic-Software/WebUI führt alle x Sekunden oder Minuten oder Stunden eine Aktion y aus.
2. Das Shell-Script wird nicht mehr von der HomeMatic-Software alle 30 Sekunden gestartet, sondern alle 30 Sekunden als Linux Cron-Job (kaum Resourcen) und prüft ob die HomeMatic-Software vor mind. x Sekunden oder Minuten oder Stunden die Aktion y ausgeführt hat. Wenn ja, wird der Hardware-Timer resetet, ansonsten nicht.
Aber momentan glaube ich, dass die HomeMatic-Software es selbst alle 30 Sekunden schafft.

Das Shell-Script sieht nur nach ob eine Datei (die Markierungsgatei) vorhanden ist und schreibt eine 1 in die Watchdog-Datei. Das ist echt fast nix an Ausführungszeit. Und das läuft auch noch auf Linux-Shell-Ebene und nicht in der HomeMatic-Software als Script.

Man könnte (statt wie ich alle 29 Sekunden) das Script im WebUI auch nur alle 50 Sekunden laufen lassen. Dann hat die CCU noch weniger zu tun und 10 Sekunden sollten als Reserve genügen.

Zu deinem CUxD-Watchdog: Ich habe ihn noch nie verwendet, aber vermutlich ist es ein ganz normaler Linux-Prozess. In diesem Fall würde ich ein Shell-Script als Cron-Job basteln das auf Linux läuft statt ein HomeMatic-Script im WebUI.

rewe0815
Beiträge: 176
Registriert: 30.09.2010, 09:40
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von rewe0815 » 20.11.2013, 09:55

Hallo Manfred7525,

cooles Projekt, bin auch schon in diese Richtung gegangen. Habe es dann nicht weiterverfolgt, weil ich Angst vor den EXECs in so kurzen Zeitabständen hatte. Vlt ja unbegründet.
Wie siehts denn bei dir aus? Wie sind die bisherigen Erfahrungen? Läuft ja wohl schon ein paar Tage bei dir.

Gib mal einen Statusbericht

Danke rewe0815

Manfred7525
Beiträge: 137
Registriert: 09.10.2013, 11:59

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von Manfred7525 » 20.11.2013, 10:37

Läuft bis jetzt ohne Pause bei mir im 29 Sek-Takt einwandfrei. Kein einziger Neustart seit dem.

rewe0815
Beiträge: 176
Registriert: 30.09.2010, 09:40
Hat sich bedankt: 1 Mal
Danksagung erhalten: 3 Mal

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von rewe0815 » 20.11.2013, 12:23

Cool, hast du mal diverse CCU Hänger provoziert um zu sehen, ob er zuverlässig zuschlägt?

Gruß rewe0815

Manfred7525
Beiträge: 137
Registriert: 09.10.2013, 11:59

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von Manfred7525 » 20.11.2013, 13:10

rewe0815 hat geschrieben:Cool, hast du mal diverse CCU Hänger provoziert um zu sehen, ob er zuverlässig zuschlägt?
An dieser Stelle meine Hochachtung an die CCU2! Mit WebUI-Script Scherzen wie:

Code: Alles auswählen

while(true) {
...
}
komme ich nur auf eine CPU-Auslastung (angesehen über ssh mit top-Befehl) von nur 13%. Das kleine Ding scheint relativ viel Pauer zu haben. Zudem erkennt die HomeMatic das Endlos-Script bzw. irgend eine Ausführungszeitüberschreitung und stoppt das Script.

Wenn ich manuell das HomeMatic-Programm beende (den Prozess "/bin/ReGaHss" kille), startet der Watchdog wie er soll die CCU2 neu. Scheint also super zu klappen.

Wenn du eine Idee hast, wie ich die HomeMatic-Software für Testzwecke zum Aufhängen bringen kann (statt zu stoppen), nur her damit. Mit intensiven WebUI-Scripten schafft man das anscheinend nicht, das steckt sie gekonnt weg.

anderl1969
Beiträge: 167
Registriert: 15.10.2013, 20:15
Hat sich bedankt: 6 Mal
Danksagung erhalten: 5 Mal

Re: Den Hardware-WatchDog der CCU2 für die HomeMatic aktivie

Beitrag von anderl1969 » 21.11.2013, 13:48

Manfred7525 hat geschrieben:
rewe0815 hat geschrieben:

Code: Alles auswählen

while(true) {
...
}
komme ich nur auf eine CPU-Auslastung (angesehen über ssh mit top-Befehl) von nur 13%. Das kleine Ding scheint relativ viel Pauer zu haben. Zudem erkennt die HomeMatic das Endlos-Script bzw. irgend eine Ausführungszeitüberschreitung und stoppt das Script.
Laut Doku terminiert der Script-Interpreter jede Schleife nach 5000 Durchläufen, explizit ist hier auch das while (true) Konstrukt genannt.
Du kannst ja mal versuchen, ein paar while (true) Schleifen ineinander zu schachteln...

gruß anderl
CCU - RaspberryMatic 3.73.9.20231130 (OVA) / Proxmox VM + HB-RF-ETH + RPI-RF-MOD
LAN GW 1 - CCU2GW (CCU2)
LAN GW 2 - CCU2GW (CCU2)

LAN GW 3 - HmIP-HAP
LAN GW 4 - HmIP-HAP


Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“