Hallo Leute,
ich habe gestern mal mit dem shutdownCmd der 98_WOL.pm rumgespielt. Wake-up funktioniert seit längerem aber der Shutdown ging nicht. Also habe ich mir mal den code in der 98_WOL.pm angeschaut.
Kann das mal jemand anschauen und ggf. Änderungen in der 98_WOL.pm machen und einchecken?
Original steht da:
} elsif ($v eq "off") {
my $cmd = AttrVal($name, "shutdownCmd", "");
if ($cmd eq "")
{
Log $logLevel, "No shutdown command given!";
return "no shutdown command given (see shutdownCmd attribute)!"
}
`$cmd`;
Meines Erachtens geht das so wie in der letzten Zeile geschrieben nicht. Das führte bei mir immer nur dazu, dass der shutdownCmd ins Logfile geschrieben wurde aber mehr nicht. Warum der ins Logfile geschrieben wird, kann ich euch nicht sagen. ggf. wird bei FHEM der STDOUT auf das logfile gesetzt.
Ich habe den Code nun wie folgt angepasst und siehe da jetzt geht es:
} elsif ($v eq "off") {
my $cmd = AttrVal($name, "shutdownCmd", "");
if ($cmd eq "")
{
Log $logLevel, "No shutdown command given!";
return "no shutdown command given (see shutdownCmd attribute)!"
}
qx( $cmd );
Sprich ich führe den Befehl nun via qx() aus. Damit muß der shutdownCmd natürlich ein Systembefehl sein. Perl Befehle kann man nicht ausführen. Systembefehle sind im Prinzip alles, was man auch auf der telnet Konsole ausfürhen kann (also alles was Linux so hergibt).
Aber nach meiner Einschätzung kann der Original Code so wie programmiert '$cmd'; nicht funktionieren, da dies ja eigentlich nur zu einem String führt und mehr nicht, oder?
Alternativ müsste es auch mit eval( $cmd );
gehen. Das habe ich aber nicht probiert. Auch habe ich mich nicht in die verschiedenen Varianten von String (single quote, double quote etc.) rein gefuchst.
Mein shutdownCmd ist wie folgt definiert:
attr myHTPC shutdownCmd wget -O - http://192.168.2.67:1234/hibernate
Mein FHEM läuft auf einer FritzBox 7390 und ist aktuell (gestern abend update gemacht). Auf dem PC läuft ein Service (Sleep-on-LAN), den man auf einem bestimmten Port Befehle wie hibernate, shutdown, reboot geben kann.
Wenn man den qx einsetzt scheint es wichtig zu sein, dass in der fhem.cfg der shutdownCmd NICHT in Anführungsstrichen steht.
Sollte ich irgendwas beim shutdownCmd massiv falsch verstanden haben, dann natürlich immer her mit Korrekturen und vorallem Beispielen.
also bei mir funktionieren Konstrukte wie:
`$cmd`;
nutze beispielsweise:
sub dayCare()
{
...
my $res = `uptime >>./log/uptime.log`;
}
Führt einmal pro Tag das Kommando uptime aus und schreibt den output ins log - klappt prima.
Ich habe deinen Text nochmals gelsen. Falls du Perlcode ausführen willst geht das natürlich nicht.
Es muss ein Systemkommando sein, das über `$cmd` ausgeführt wird.
ist in der commandref auch genau so beschrieben:
(siehe Anhang / see attachement)
Hi,
auf welcher Hardware läuft das bei Dir? Bei mir gehts genau so nicht.
FB 7270
ich bin übrigens der Meinung, dass der Code besser so geschrieben worden wäre:
} elsif ($v eq "off") {
my $cmd = AttrVal($name, "shutdownCmd", "");
if ($cmd eq "")
{
Log $logLevel, "No shutdown command given!";
#return "no shutdown command given (see shutdownCmd attribute)!"
} else {
`$cmd`;
}
Den Befehl off mit dem shutdownCmd gibt es noch nicht so lange.
Das return-Kommando beendet die Funktion, so dass der folgende Code nicht mehr ausgeführt wird:
$hash->{CHANGED}[0] = $v;
$hash->{STATE} = $v;
$hash->{READINGS}{state}{TIME} = TimeNow();
$hash->{READINGS}{state}{VAL} = $v;
ich habe eine Version im Einsatz, die ich erweitert habe. Mein WOL sendet alle n Sekunden ein Magicpaket. So wird mein Buffalo-NAS über einen längeren Zeitraum wach gehalten. Eigentlich gibt es dafür Programme wie NAS-Control. In der FB ausgeführt, über fhem gestartet ist die Lösung viel stabiler.
Hi,
bezgl. der Code-Änderung hast Du natürlich Recht. Wenn man via retun aus der Bedingung aussteigt, wird der Endcode nicht ausgeführt.
Warum geht es dann aber bei mir nicht? Was könnte ich tun, um mehr zu debuggen?
FHEM: V5.4 mit allen updates (wird alle zwei Tage gemacht)
7390: aktuellste Firmware, FHEM läuft als root
Generell finde ich das WOL Modul schon klasse. Läuft sehr zufriedenstellend. Wäre halt klasse, wenn der shutdownCmd in der Standardfunktion drin ist, so dass ich die 98_WOL.pm wieder in den Update Zyklus aufnehmen kann.
mal getrennt von der Diskussion um den Code:
Momentan habe ich den PC so eingstellt, dass er sich nicht von selbst runter fährt. Ich habe ihn erst seit ein paar Tagen in FHEM integriert und somit noch nicht alle Use-Cases abgedeckt.
Was mir noch fehlt:
1.) FHEM sollte erkennen, falls der Computer vom Anwender per Tastatur oder Ausschaltknopf heruntergefahren wurde. Dann kann FHEM auch die ganzen verstärker etc. ausschalten.
hier werde ich mal mit dem refresh des WOL oder dem PRESENCE Modul arbeiten
2.) FHEM sollte den PC irgendwann in der Nacht mal aus dem Hibernate hochfahren, ein paar Maintenance Sachen durchführen (z.B. Musiklibrary auf Änderungen scannen), den PC neu booten
und dann wieder in den Hibernate Modus versetzen.
3.) FHEM sollte erkennen, dass der PC vom User hochgefahren wurde und dann ggf. die verschiedenen Verstärker etc. einschalten
Auf dem PC läuft der Squeezebox Server und auf dem iPhone die iPENG App. Diese App kann den PC ebenfalls per Magic-Paket aus dem Schlaf holen. Sprich meine Frau startet einfach die
Musik-App auf dem iPhone und alles andere geht automatisch. Das erhöht den WAF doch dramatisch :-)
4.) auf dem PC laufen mehrere Squeezeslave Prozesse (einer pro Raum). Nun wäre es klasse, wenn ich es schaffe, dass FHEM erkennt, ob auf einem der virtuellen Player auch etwas abgespielt
wird (sprich Play Taste gedrückt) und damit dann den jeweiligen Verstärker pro Raum einzuschalten.
Sprich für diese Use-Cases wäre es eher kontra-produktiv, einfach in bestimmten Zyklen das Magic Paket zu senden, denn der PC könnte ja vom Anwender per hand runter gefahren worden sein und FHEM weckt ihn dann dauernd wieder auf.
Zielsetzung (was das Ding mit FHEM mal können soll). Dafür brauche ich aber mal eher schlechtes Wetter :-)
- mittels FHEM möchte ich gerne mit einem Tastendruck bestimmte Msuik in einem bestimmten Raum abspielen
z.B. morgens immer den Lieblingsradiosender mit definierter Lautstärke im Badezimmer abspielen oder eine bestimmte Playlist aktivieren. Sprich FHEM soll auf dem Squeezeboxserver
bestimmte, vordefinierte Szenen anfahren. Wenn man freie Musikauswahl möchte, dann ist die iPENG App die bessere Wahl
- Musik leiser machen, wenn das Telefon klingelt oder jemand an der Türe klingelt
- Bei bestimmten Events die Musik kurz stoppen und eine MP3 basierte Ansage abspielen (z.B. "Waschmaschine fertig"). Danach Musik wieder weiter laufen lassen
Zitat von: bugster_de schrieb am Do, 15 August 2013 09:16mal getrennt von der Diskussion um den Code:
Ein Squeezebox-Modul ist bestimmt sehr willkommen :)
Wäre aber in nem separaten fred besser aufgehoben, zB im Ordner Multimedia.
=8-)
Die qx Variante habe ich in zwei weiteren Modulen gefunden.
Deshalb sollte die Variante universell funktionieren.