fhem mit monit Überwachen - fhem Verfügbarkeit

Begonnen von Mitch, 19 Dezember 2014, 14:29:28

Vorheriges Thema - Nächstes Thema

Mitch

Hallo Zusammen,

nachdem ich in letzter Zeit viele Probleme (Performance, Abstürtze, etc.) hatte, wollte ich eine vernüftige Überwachung von fhem einrichten, um eine bessere Verfügbarkeit zu erreichen.

Durch Zufall bin ich auf eine Interessante Lösung von User gandy gestossen: http://forum.fhem.de/index.php/topic,25110.msg204529.html#msg204529
Hierbei wir das kostenlose Tool monit benutzt: http://mmonit.com/monit/

Ich habe den Ansatz von gandy genommen und noch etwas für meine Bedürfnisse erweitert. Ich möchte dies hier gerne zusammen schreiben, damit auch andere interessierte user es hier finden können.

monit installieren
sudo apt-get install monit

monit einrichten. Geht recht einfach, indem man das control file anpasst
sudo nano /etc/monit/monitrc

Hier habe ich erstmal den Webzugriff auf Port 2812 für User der Gruppe dialout eingeschalten:
  set httpd port 2812 and
     allow @dialout


Dann habe ich mir für die zu überwachenden Prozesse "Regeln" definiert. In meinem Fall perl, fhem, mysql, hcitool und sonos.
Hier kann man nach belieben Dinge hinzu packe.
check process perl
       matching "perl"
       start program = "/opt/fhem/fhemstart.sh"
       stop program = "/opt/fhem/fhemstop.sh"
       if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
       if cpu usage > 90% for 10 cycles then restart

check process fhem with pidfile /var/run/fhem/fhem.pid
        start program = "/opt/fhem/fhemstart.sh"
        stop = "/opt/fhem/fhemstop.sh"
        if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
        if failed host localhost port 7070 with send "knock\n" expect "hello." timeout 20 seconds then restart
        if cpu usage > 90% for 10 cycles then restart
        if 5 restarts with 5 cycles then timeout

check process mysql with pidfile /var/run/mysqld/mysqld.pid
       start program = "/usr/sbin/mysqld"
       stop program = "/bin/bash -c 'kill -s SIGTERM `cat /var/run/mysqld.pid`'"
       if cpu usage > 15% for 10 cycles then exec /opt/monit/monitpushover.sh
       if cpu usage > 95% for 10 cycles then restart

check process lescan
        matching "/usr/bin/hcitool lescan"
        if cpu usage > 10% for 10 cycles then exec /opt/monit/monitpushover.sh

check process sonos
        matching "00_SONOS.pm"
        if cpu usage > 10% for 10 cycles then exec /opt/monit/monitpushover.sh


Um das PID File von fhem zu nutzen, muss folgendes globale Attribut gesetzt werden:
attr global pidfilename /var/run/fhem/fhem.pid
Hierbei auf die Rechte achten! (danke an betateilchen)


Ich lasse mich bei bestimmten Dingen (z.B. CPU Last vom Perl Prozess über 15%) per Pushover benachrichtigen.
Hierzu benötigt man einen Account bei Pushover: https://pushover.net/

Ich rufe aus monit den Script monitpushover.sh auf:
#!/bin/sh
/usr/bin/curl -s \
  -F "token=token ID" \
  -F "user=user ID" \
  -F "message=[$MONIT_HOST] $MONIT_SERVICE - $MONIT_DESCRIPTION" \
  https://api.pushover.net/1/messages.json


Im Script muss die Token und User ID entsprechend angepasst werden.

Ansonsten habe ich wie von gandy beschrieben ein Device in fhem angelegt:
define cmd_knock cmdalias knock AS { "hello." }

Dieses wird von monit per if failed host localhost port 7072 with send "knock\n" expect "hello." timeout 20 seconds then restart "überwacht".
Der Vorteil hierbei ist, auch wenn der fhem Prozess noch in der Prozessliste ist, aber hängt, reagiert er nicht mehr auf die telnet Anfrage und sendet kein hello mehr zurück. Dies wird wiederum von monit registriert und ein Neustart von fhem wird initiiert.

Start und Stop von fhem habe ich auch in extra Scripte ausgelagert.

Anbei noch zwei Bilder der monit Weboberfläche.
FHEM im Proxmox Container

forum-merlin

coole sache!
Danke dass Du es aufgeschrieben hast.
Ich packe es mit auf meine To-Do Liste der Dinge die ich dann auf meiner neuen Kiste einpflegen will.
FHEM 5.8 auf RasPi3; CULv3-868; RFXtrx433; HM-Sec-SC-2; HM-CFG-LAN; HM-LC-Bl1-FM; HM-CC-RT-DN; HM-ES-PMSw1-Pl; HM-LC-Sw4-DR; Hunter Ventile; 8ch Relais; ENIGMA2; ONKYO_AVR; SONOS; Harmony; telegram; HM-PB-6-WM55; GPIO; HM-Sen-MDIR-O; HM-SEC-SD; HM-LC-Dim1L-Pl-3;

Alveole

Hallo,
Danke für den Script - funktioniert super!
Nur der Pushover Script geht bei mir nicht. Natürlich habe ich die Userdaten eingetragen
es kommt immer
Zitatcurl: option -F: is badly used here

Hast Du eine Idee und funktioniert das bei Dir?

Mitch

Muss ich mal bei mir testen.
Geht aber erst am WE, bin unterwegs.
FHEM im Proxmox Container

Alveole

Hallo,
Mein Problem mit den Pushover-Nachrichten hab ich gelöst - es war nur ein Schreibfehler meinerseits!!!

Nun stellt sich bei mir seit 1 Tag (warum auch immer erst jetzt) das Problem: keine Berechtigung für die pid-Datei.
Du schreibst nur "Hierbei auf die Rechte achten! "
Welche sind dies und wo?

Danke und Sorry für die dumme Frage die mein Fehler war!

Mitch

Hatte ich auch, hier die Lösung:

    Auf der Systemkonsole als root: "mkdir -p /var/run/fhem"
    Auf der Systemkonsole als root: "chown -R fhem:root /var/run/fhem"
    in fhem: attr global pidfilename /var/run/fhem/fhem.pid
    in fhem: save config
    in fhem: shutdown restart
FHEM im Proxmox Container

Amenophis86

Bei mir ist das Problem, sobald ich den Pi neustarte, ist der Ordner "var/run/fhem" wieder weg und damit lässt sich FHEM nicht starten. Betriebssystem ist OSMC. Eine Lösung, wie man das umgehen kann?
Aktuell dabei unser neues Haus mit KNX am einrichten. Im nächsten Schritt dann KNX mit FHEM verbinden. Allein zwei Dinge sind dabei selten: Zeit und Geld...

Wernieman

Wie ich in einem anderen Thread schon geschrieben habe:
http://forum.fhem.de/index.php/topic,30604.0.html

ZitatQuick and Dirty:
Im Init-Script von FHEM den Ordner anlegen lassen und richtige Berechtigung setzen. Dann erst FHEM starten ...

Es ist ein noramles Unix-Doing, das der /var/run Ordner nach einem Neustart gelöscht/wiederangelegt ist, aber eben ohne die Unterordner
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

HansDampfHH

Moin, habe auch nun monit laufen und Deine Idee umgesetzt.
Eigentlich schon ganz gut. Monit läuft, FHEM erstellt ein pid-File.

Wenn ich nun testweise FHEM herunterfahre springt monit an und startet FHEM neu weil das pid-File ja fehlt.

Das einzige was bisher nicht funktioniert ist das telnet Kommando:

if failed host localhost port 7072 with send "knock\n" expect "hello" timeout 20 seconds then restart


Wenn ich auf der Kommandozeile "echo "knock" | netcat localhost 7072" eingebe erhalte ich "hello".

Nun wollte ich das testen und habe in FHEM als Rückgabe "hallotest" definiert. Nun sollte monit ja eigentlich darüber stolpern und neu starten.
Aber da tut sich nichts. Hat jemand eine Idee wie ich hier weiter komme?
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

betateilchen

Warum muss man einfachste Dinge maximal kompliziert lösen?
Und was nützt mir eine Pushover-Nachricht, dass mein fhem hängt, wenn ich 2000km von zuhause weg bin?

Einen "hängenden" fhem Prozess hatte ich in all den Jahren noch nie, wohl aber ein abgestürztes fhem, bspw. wegen wide-chars in irgendwelchen Frontend Informationen. Ein abgestürztes dhem heilt systemd von ganz alleine durch einen fhem-Neustart, ohne dass es dazu monit bedarf.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HansDampfHH

Dank VPN spielt es keine Rolle, ob ich 100 oder 5.000 Km entfernt bin.
Praktisch nur wenn ich mich direkt zu Hause einwählen kann um zu schauen was los ist bevor die ganze Familie nicht mal mehr Licht anmachen kann.

Das freut mich, dass Dein FHEM noch nie hängen geblieben ist.
Bei mir ist das leider schon vorgekommen. Und ja, ich versuche die Ursache zu beseitigen.
Genau auf diesem Weg kann ich das nämlich genau dann wenn es passiert.

"Warum muss man einfachste Dinge maximal kompliziert lösen?"
Das fragt mich meine Frau auch. Warum ich nicht einfach den Lichtschalter benutze?
Weil es mir Spaß macht.

Edit: send/expect läuft nun. Ich habe den Rückgabewert angepasst.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

Benni

Zitat von: HansDampfHH am 16 Juli 2016, 13:24:59
bevor die ganze Familie nicht mal mehr Licht anmachen kann.

eventuell solltest du aber auch dein Gesamtkonzept nochmal überdenken. ;)
Grundsätzliche Funktionen, wie Licht und Heizung sollten idealerweise auch ohne FHEM noch funktionieren.

betateilchen

Zitat von: HansDampfHH am 16 Juli 2016, 13:24:59
Dank VPN spielt es keine Rolle, ob ich 100 oder 5.000 Km entfernt bin.

Egal ob mit VPN oder ohne - wer Wert auf ein "bisschen sicheres" fhem legt, verschafft seiner Installation keinen Zugang von aussen. Und wer glaubt, VPN sei sicher, glaubt auch an Landhausstil und Laminatfussboden - für mich sind das alles Irrwege.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

HansDampfHH

@Benni
Es ist eine wirtschaftliche Entscheidung gewesen diverse Steh-/Tischlampen durch EUR 5,- Steckdosen zu steuern.
Natürlich kann man diese auch entfernen und Licht schalten.

Die Grundsatzdiskussion über Sicherheit lass ich mal. Ich habe auch kein wired sondern nutze potentiell unsicher und manipulierbare Funk-/Wlan-Komponenten.
Muss ja jeder selber entscheiden, ob er es praktisch findet auch von unterwegs Komponenten zu schalten. Für mich macht aber gerade das einen großen Faktor bei SmartHome aus.
FHEM Docker, CUL868, Zigbee, CCU2, Jeelink

betateilchen

Zitat von: HansDampfHH am 16 Juli 2016, 14:28:45
Muss ja jeder selber entscheiden, ob er es praktisch findet auch von unterwegs Komponenten zu schalten. Für mich macht aber gerade das einen großen Faktor bei SmartHome aus.

Nur um das klarzustellen: das sind doch zwei völlig getrennte Themen.

Auch ich kann meine fhem Installation von jedem Punkt der Erde aus beeinflussen, an dem es eine Internetverbindung gibt. Aber ich kann das eben, ohne dazu eine direkte Verbindung von meinem Endgerät unterwegs zu meiner fhem Installation zuhause zu benötigen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!