Damit ich am Morgen von passender Musik geweckt werde, habe ich mir ein Skript geschrieben, welches mein Notebook in einen Wecker verwandelt. So stelle ich normalerweise den Notebook vor dem Schlafen gehen in den Sleep-Modus, welcher 30 Minuten Musik abspielt und danach in den Stanbdy fährt. Am Morgen schaltet mein Notebook automatisch zur eingestellten Weckzeit ein und spielt die Musik weiter. So starte ich meist gut in den Tag. Hier beschreibe ich, wie ich das gemacht habe.
Konzept
Ich habe mir überlegt, welche Anforderungen ein Skript haben muss, damit ich einen Wecker implementieren kann. Folgendes ist dabei rausgekommen:
- Computer automatisch zu einer einstellbaren Zeit starten
- Nach dem Starten ein Programm ausführen
- Eine Sleep-Funktion, welche den Computer nach einer gewissen Zeit in den Standby stellt
- Den Wecker deaktivieren
- Die Wecker-Einstellungen abfragen
- Eingaben auf Gültigkeit überprüfen (Nur mögliche Parameter und Uhrzeiten)
Daraus ist das Script wecker entstanden. Das Skript ist auf GitHub in meinem Scripts Repository zu finden: https://github.com/emanuelduss/Scripts/blob/master/wecker. Die wichtigsten Befehle daraus werde ich in diesem Blogpost erklären.
Computer in den Standby schicken
Um den Computer in den Standby zu schicken, kann man pm-suspend verwenden, welches man unter Arch Linux im Paket pm-utils findet:
Will man den Computer nach 23 Minuten in den Standby fahren, kann man das so realisieren:
Jetzt wartet sleep genau 23 Minuten. Nach erfolgreichem Warten (ohne dass man z. B. mit ^C abbricht), wird sudo pm-suspend ausgeführt, welches den Computer in den Standby fährt.
Will man nach dem Aufwecken ein weiteren Befehl ausführen, kann man den auch wieder mit && starten:
Nach dem Aufwecken wird die Lautstärke auf 90% gestellt und die Musik mittels mpc abgespielt.
Hat man ein systemd System, kann man den Computer ohne Rootrechte in den Standby schicken:
Diese Variante ist natürlich zu bevorzugen.
Computer aufwecken mit rtcwake
Mit rtcwake kann man den Computer automatisch aufstarten. Dies geschieht, wenn er sich im ausgeschalteten Zustand oder im Standby befindet.
Eventuell muss man zuerst noch rtcwake installieren. Unter Arch Linux ist rtcwake im Paket util-linux enthalten.
Die Option -m no macht, dass nach dem Absetzen des Befehls der Computer nicht in den Standby fährt. Mit -t kann man die Zeit angeben. Diese Option erwartet einen Unix-Timestamp. Mit date -d +%s kann man so die Anzahl Sekunden seit dem 1. Januar 1997 berechnen.
Hier gibt es jedoch ein Problem: Wenn ich nur 06:00 eingebe, dann wird die Uhrzeit vom aktuellen Tag verwendet. Möchte ich jedoch am nächsten Tag um 06:00 Uhr geweckt werden, muss ich tomorrow 06:00 eingeben. Da es nicht immer klar ist, ob man den Wecker vor oder nach Mitternacht stellt, kann man mit date berechnen, ob die Uhrzeit in der Vergangenheit liegt oder nicht. Liegt das Datum in der Vergangenheit, muss man 24 h addieren. Die Uhrzeit darf sich auch nicht in der Vergangenheit befinden (falls man sie absolut mit einem Datum eingibt) oder eine ungültige Eingabe für date sein. Diese Fälle kann man so abfangen:
if ! date -d $2 >/dev/null 2>&1
then
echo "Alarm time is invalid."
exit 1
fi
if [ "`date -d $2 +%s`" -gt "$NOW" ]
then
echo "Set alarm for today"
ALARMTIME="`date -d $2 +%s`"
elif [ "$((`date -d $2 +%s` - $NOW))" -ge 86400 ]
then
echo "Alarm time not possible."
exit 1
else
echo "Set alarm for tomorrow"
ALARMTIME="$((`date -d $2 +%s` + 86400))"
fi
Der Alarm kann anschliessend so mit der korrekten Uhrzeit gesetzt werden:
Status des Weckers abfragen
Der aktuelle Status von rtcwake kann man auf verschiedene Weisen abfragen. In für Menschen lesbarer Form findet man den Alarm im File /proc/driver/rtc:
alrm_time : 21:00:00
alrm_date : 2013-03-28
alarm_IRQ : yes
alrm_pending : no
Die Variablen alrm_time und alrm_date geben den Weckzeitpunkt an. Ist alarm_IRQ auf YES gesetzt, ist der Alarm eingeschaltet.
Will man die Weckzeit mit date auswerten, kann man auf die Datei /sys/class/rtc/rtc0/wakealarm zugreifen. Dort ist der Unix-Timestamp der Weckzeit hinterlegt. Eine schöne Ausgabe erhält man mit:
date -d @"$ALARM" "+Alarm is set: %A %Y-%m-%d %H:%M:%S"
DIFF=`expr $ALARM - $NOW`
HRS=`expr $DIFF / 60 / 60`
MINS=`expr \( $DIFF - $HRS \* 60 \* 60 \) / 60`
echo "Alarm will start in $HRS h $MINS m"
Mit diesem Code wird zudem die restliche Zeit in Stunden und Minuten berechnet.
Das wecker Script
Das wecker Script ist auf GitHub (https://github.com/emanuelduss/Scripts/blob/master/wecker) und lässt sich wie folgt bedienen:
Usage:
wecker option
set <time>
Set the alarm at <time>
sleep
Suspend the computer after
disable
Disable the alarm
status
Shows the current alarm time</time></time>
wecker set 23:00
The computer will start at 23:00h
wecker sleep 42m
The computer will suspend in 42 minutes
wecker disable
The computer will not start automatically
Weckzeit setzen:
Set alarm for tomorrow
Current status: Alarm is set: Sonntag 2013-03-31 07:55:00
Alarm will start in 14 h 47 m
Wecker abfragen:
Current status: Alarm is set: Sonntag 2013-03-31 07:55:00
Alarm will start in 14 h 46 m
Nach 23 Minuten in den Standby fahren und Lautstärke erhöhen:
Zudem ist der Wecker auch deaktivierebar:
Disable alarm.
Current status: Alarm is not set.
Links und weitere Informationen
- Script wecker auf GitHub: https://github.com/emanuelduss/Scripts/blob/master/wecker
- Manpage zu rtcwake(8): http://linux.die.net/man/8/rtcwake
Sehr schöner Artikel, schönes Script.
Meinen Linux-basierter Wecker damals habe ich als Crobjob implementiert (der Rechner lief nämlich 24h) – inkl. Snooze-Funktion: Ein Script was von Cron während eine Stunde nach der Weckzeit alle fünf Minuten gestartet wurde, hat geschaut, ob ich auch wirklich den Wecker via Script deaktiviert habe, oder ob nur MPD gestoppt wurde (was ich auf dem MPD-Client am Telefon fernsteuern konnte). Falls MPD gestoppt wurde, hat der Cronjob ihn wieder gestartet.
Ein kleiner Tipp noch: Für Installationen mit systemd empfiehlt sich
anstatt der
. Funktioniert auch ohne root.
Hey Gandro
Danke viel mals.
Auch eine nette Idee. Man könnte auch noch ein kleines Rechenrätsel einbauen, das man lösen muss, bevor der Wecker abstellt 😉
Danke für den Tipp, habe es im Blogpost ergänzt und im Skript implementiert: https://github.com/mindfuckup/Scripts/commit/78ac41986b9a26930e8f3e73f3c913354f8dbc86
GRZ
Mänu
Hi Manu,
Toller Artikel!
Noch ein kleiner Tipp am Rande:
Hast du dir schonmal die Gists von Github angeschaut (https://gist.github.com/). Wäre vielleicht eine Alternative um die einzelnen Skripte abzulegen.
Gruss Marc
Hey Marc
Danke.
Hat es einen Vorteil, wenn ich die Scripts in einem Gist ablege, statt in einem normalen Repo? Ich habe einige Scripts hier abgelegt: https://github.com/mindfuckup/Scripts/.
Gruess
Mänu
Ich finde es handlicher wenn ich die Skripte separieren kann. Und nicht in einem Repo habe. Auf für die kleinen Snippets würde es sich eignen, welche ich sie oft auf deinem Blog finde.
Aber das ist geschmack-sache, wollte nur mal einen hint geben 🙂
Gruss Marc
Hallo,
schönes Teil. Musste ich erst benutzen als ich Handy und Tablet auswärts verlegt hatte /:)
Schön wäre es wenn das Skript nach dem aufwachen aus dem Standby direkt einen Musikplayer starten könnte.
Bin mir aber selbst nicht so sicher wie man das erkennen könnte.
Grüße,
Martin
Merci, ich brauch den 7 mal pro Woche 🙂
Das sieht dann in etwa so aus:
Das stellt den Wecker auf 05:30h und fährt den Computer nach 23 Minuten in den Standby. Wenn er dann um 05:30 aufstartet, wird der Lockscreen killed (damit ich nicht extra entsperren muss am Morgen früh) und der Media Player gestartet. So starte ich in den Tag 🙂
Ich weiss jedoch nicht, ob man so etwas direkt in das Wecker Script einbinden soll, denn das prozedere kann sehr individuell.
Beste Grüsse,
Emanuel
Ok, Danke,
das funktioniert auch ganz gut. Nur meint mein Laptop, wenn der Deckel zu ist nach ~5 Sekunden Wecken wieder einschlafen zu müssen. Hast du dazu noch eine Idee?
Zur weitern Info: Arch – also systemctl vorhanden.
Grüsse, Martin
…und danke für die bisherige Hilfe.
Hmm. Bei mir ist das so, dass ich den Notebook gar nie in den Standby schalten will, wenn ich den Deckel schliesse. Oft laufe ich mit dem Notebook herum oder klappe ihn zu mit der Absicht, dass er weiterläuft.
Dies wird in der Datei /etc/systemd/login.conf konfiguriert:
.
Mommentan kommt mir auch nichts in den Sinn, wie man das ohne diese Einstellung machen könnte. Eine Alternative wäre, dass du den Deckel offen lässt.
Gruss,
Emanuel