Cubieboard LEDs als FHEM Status Anzeige nutzen

Begonnen von dogexan, 05 Februar 2017, 20:17:21

Vorheriges Thema - Nächstes Thema

dogexan

Hallo zusammen,

ich versuche aktuell den Status von FHEM auf die LEDs des Cubieboard zu übertragen.

Ich verwende das Cubieboard 4 (CC-A80). Es verfügt über eine rote und eine grüne LED, die ich unter Root ansteuern kann, mit folgenden Befehlen:

Zitatecho 0 > /sys/class/leds/red\:ph06\:led1/brightness # rote LED aus
echo 255 > /sys/class/leds/red\:ph06\:led1/brightness # rote LED an

echo 0 > /sys/class/leds/green\:ph17\:led2/brightness # grüne LED aus
echo 255 > /sys/class/leds/green\:ph17\:led2/brightness #grüne LED an

Ob FHEM aktuell läuft lässt sich ja ganz einfach mit /etc/init.d/fhem status abfragen.
Also jenachdem ob die Ausgabe fhem is running oder fhem is not running ist, möchte ich die grüne oder rote LED einschalten.

Aktuell habe ich beide LEDs auch nach einem Neustart des Cubieboards deaktiviert. Dafür habe ich die Befehle in /etc/rc.local eingetragen.

Habe leider überhaubt keine Ahnung wie ich ein Script schreiben kann, von daher hoffe ich, dass mir da jemand helfen kann.

Ich bin unteranderem auf diesen Link gestoßen https://forum.fhem.de/index.php?topic=19461.0 in dem etwas ähnliches probiert wurde.
Aus der Sache wurde ich aber nicht wirklich schlau.

Danke im Voraus

Gruß Alex




betateilchen

wenn Du FHEM über systemd startest und dort den automatischen restart aktivierst, kommt der Zustand "not running" gar nicht mehr vor  8)

Du brauchst kein Skript, es reicht, wenn Du aus fhem einfach { qx(echo 0 > /sys/class/leds/red\:ph06\:led1/brightness) } ausführst. Vorausgesetzt, dein fhem User hat die entsprechenden Rechte um auf die LED zu schreiben.

Linux Grundlagen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

dogexan

Hi betateilchen,

erstmal Danke für Deine Antwort.

Also aktuell starte ich FHEM nicht aus systemd heraus. Wenn ich das soweit richtig verstanden habe, ist dies auch nicht zwingend notwendig.

Zitat
Du brauchst kein Skript, es reicht, wenn Du aus fhem einfach { qx(echo 0 > /sys/class/leds/red\:ph06\:led1/brightness) } ausführst.

Ich soll also die die rote LED mit { qx(echo 0 > /sys/class/leds/red\:ph06\:led1/brightness) } aus FHEM heraus ausschalten?
Aktuell sind ja noch beide LEDs nach System Start ausgeschaltet.
Schalte ich jetzt beide LEDs nach System Start standartmässig ein, könnte ich mit { qx(echo 0 > /sys/class/leds/red\:ph06\:led1/brightness) } die rote LED ausschalten und nur noch die grün wäre an.
Wäre soweit i.O. Aber:

Was passiert denn wenn FHEM aufeinmal nicht mehr läuft? Wie schalte ich dann die rote LED wieder ein? Auf FHEM Ebene komme ich disem Fall ja nicht mehr weiter.

Gruß Alex

Wernieman

#3
Eigentlich relativ einfach:
Baue Dir einen cron-script (bash), der alle 5 Minuten nach fhem fragt, als Rahmen:
#!/bin/bash
if ps aux | grep -q "[f]hem"
then
  echo "läuft"
else
  echo "läuftnicht"
fi


Weiter must Du es jetzt selber "mit Fleisch füllen"

Allerdings wird nur gefragt, ob fhem prozess da ist. Ob es läuft, müsstest Du noch tiefer "Testen"
- 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

dogexan

Hallo Wernieman,

also prinzipiell würde mir es erstmal reichen nur nach dem fhem prozess zu fragen.

Wie kann ich denn in dem Script nach fhem is running und fhem is not running fragen?

Mit if ps aux | grep -q "[f]hem" mache ich das doch nicht oder?

Wird mit then/else echo der Status sprich "fhem is running" oder "fhem is not running" ausgegeben oder kann ich hier schon den Befehl zur LED-Steuerung ansetzten?

Folgendes habe ich im Ubuntu-Wiki gefunden:

ZitatProzessliste filtern

Oftmals werden Befehle der Form

ps aux | grep einprogramm

empfohlen, um herauszufinden ob einprogramm läuft. Diese Syntax sollte man jedoch vermeiden, da sich hierbei grep einprogramm selbst findet. Die korrekte Alternative lautet

ps -fC einprogramm

Man kann auch mittels

ps -fC einprogramm,nocheinprogramm,undnocheins

gleichzeitig nach mehreren Prozessen suchen.

Sorry für meine Unwissenheit, ich versuche mich das erste mal an einem bash-script. :-\

Wernieman

Deshalb schrieb ich "[f]hem" und nicht "fhem".
Durch den [] findet grep sich nicht selber.

In der /etc/init/fhem wird übrigens gesucht mit:
cnt=`ps -ef | grep "fhem.pl" | grep -v grep | wc -l`"

es wird also alles gesucht und grep wieder rausgenommen (-v). Meine Lösung findest Du übrigens in vielen Unix-Admin-Büchern und ist eigentlich ... hornalt.

Lies Dir bitte nochmals mein Script durch und überlege Dir, was bei "echo" Du wohl zu tuen hättest .....
- 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

dogexan

Hallo nochmal,

also das ganze scheint soweit so zu funktionieren.
So hatte ich es zwar auch schon vor meinem letzten Post probiert, aber erst nach einem Sytem Neustart war das Script erst funktionsfähig. ::)
#!/bin/bash
if ps aux | grep -q "[f]hem"
then
  echo 0 > /sys/class/leds/red\:ph06\:led1/brightness
else
  echo 255 > /sys/class/leds/red\:ph06\:led1/brightness
fi


Ich denke das mit dem Interval wie oft das Script audgeführt wird werde ich "hoffentlich" selbst hinkriegen.

Was ich erst jetzt verstanden habe ist, dass ich mit if ps aux | grep -q "[f]hem" ausschließlich nach einem vorhanden Prozess suche. Ich dachte, ich müsste immer mit der Ausgabe von /etc/init.d/fhem status arbeiten ::)

Besten Dank schon mal und ich hoffe das ich mich hier nicht nochmal melden muss. ;D

Gruß Alex

Wernieman

Übrigens ....

Wenn Du es noch besser willst, könntest Du bei "fhem läuft" auch wirklich testen, ob fehm läuft:
echo -en "fheminfo\nquit\n" | nc -w 5 localhost 7072
Nur wenn Output kommt, läuft fhem. Bei einem TimeOut (hier 5 Sec) gibt es einen Fehler ....
- 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

dogexan

Danke noch für den Hinweis. Ich habs direkt auch mal eingebaut.

LED.sh:
#!/bin/bash
if ps aux | grep -q "[f]hem" && echo -en "fheminfo\nquit\n" | nc -w 5 localhost 7072
then
  echo 0 > /sys/class/leds/red\:ph06\:led1/brightness
else
  echo 255 > /sys/class/leds/red\:ph06\:led1/brightness
fi


hab die Datei direkt in bin/ gelegt und mit chmod +x ausführbar gemacht. Spare mir dann den Interpreter.

Von daher sieht der crontab recht schmal so aus:
*/5  * * * *  LED.sh


Wernieman

Der "Interpreter" ist in der ersten Zeile angegeben:
#!/bin/bash
Am besten solltest Du Programme in einem Cron mit kompletter Pfadangabe starten. Also z.B.:
*/5  * * * *  /usr/local/bin/LED.sh
Sonst ist es nicht klar, wie das Programm gestartet wird. Da Du es scheinbar als root startest, solltest Du auch achten das es nur root gehört und nur root schreiben darf.

BTW:
In einem Sript für cron sollte man auch die internen Befehle mit Pfadangaben starten. Beim Cron werden die Umgebungsvariablen nicht gestartet. also z.B. /bin/grep anstatt grep.

BTW2:
if ps aux | grep -q "[f]hem" && echo -en "fheminfo\nquit\n" | nc -w 5 localhost 7072
Ist nicht gerade guter Programmierstiel, da es nicht eindeutig shnell lesbar ist. Guter Stiel (Einfaches lesen) ist hier etwas "aufbröseln" ... also z.B. in 2 if zeilen ..

P.S. Ich habe meine Zeile mit nc wegen fehler nicht getestet. Damit keine Garantie auf Funktionsfähigkeit
- 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

dogexan

ZitatAm besten solltest Du Programme in einem Cron mit kompletter Pfadangabe starten. Also z.B.:
Code: [Auswählen]

*/5  * * * *  /usr/local/bin/LED.sh

Sonst ist es nicht klar, wie das Programm gestartet wird. Da Du es scheinbar als root startest, solltest Du auch achten das es nur root gehört und nur root schreiben darf.

Ja den Pfad hatte ich auch ursprüglich mit angegeben. Leider funktionierte das für mich auf unerklärlicherweise nicht so wie es sollte. Mit Pfadangabe konnte immer nur die LED ausgeschaltetet werden, aber nicht mehr ein. Das Verhalten konnte ich auch außerhalb des Crontabs feststellen. Zuverlässig hat es immer nur dann funktioniert wenn ich vorher den Pfad mit cd /opt/fhem aufgerufen habe und dann mit LED.sh das Script ausgeführt habe. Lag vielleicht an dem Pfad in den FHEM Ordner? Falsche Berechtigung? Kann aber doch eigentlich nicht sein, wenn sich so die LED ausschalten ließ. ???

Daher die etwas "unschönere" Variante

Zitat
BTW2:
Code: [Auswählen]

if ps aux | grep -q "[f]hem" && echo -en "fheminfo\nquit\n" | nc -w 5 localhost 7072

Ist nicht gerade guter Programmierstiel, da es nicht eindeutig shnell lesbar ist. Guter Stiel (Einfaches lesen) ist hier etwas "aufbröseln" ... also z.B. in 2 if zeilen ..

Da gebe ich Dir natürlich Recht. Ein guter Programmierstiel sieht anders aus, allerdings bin ich immer erstmal froh wenns läuft :D

ZitatP.S. Ich habe meine Zeile mit nc wegen fehler nicht getestet. Damit keine Garantie auf Funktionsfähigkeit
Ich habe das komplette Script getestet. Es scheint soweit sauber zu laufen. Da das ganze mit einem && verknüpft ist, gehe ich auch mal davon aus, dass der Teil echo -en "fheminfo\nquit\n" | nc -w 5 localhost 7072 ebenfalls funktioniert. Sonst dürfe die LED ja niemals ausgehen.