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 (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
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.
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
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"
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. :-\
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 .....
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
Ü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 ....
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
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
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.