Den Computer als Wecker benutzen

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/mindfuckup/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:

$ sudo pacman -S pm-utils

Will man den Computer nach 23 Minuten in den Standby fahren, kann man das so realisieren:

$ sleep 23m && sudo pm-suspend

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:

$ sleep 23m && sudo pm-suspend && amixer set Master 90% && mpc play

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:

$ systemctl suspend

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.

$ sudo rtcwake -m no -t `date -d "tomorrow 6:55" +%s`

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:

NOW="`date +%s`"
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:

$ sudo rtcwake -m no -t "$ALARMTIME"

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:

$ grep al /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:

ALARM=`cat /sys/class/rtc/rtc0/wakealarm`
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/mindfuckup/Scripts/blob/master/wecker) und lässt sich wie folgt bedienen:

$ wecker  -h
Usage:
  wecker option <params>

  Options:
    set <time>
      Set the alarm at <time>
    sleep <minutes>
      Suspend the computer after <minutes>
    disable
      Disable the alarm
    status
      Shows the current alarm time

  Examples:
    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:

$ sudo wecker set 06:55
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:

$ wecker status
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:

$ sudo wecker sleep 23 && amixer set Master 90%

Zudem ist der Wecker auch deaktivierebar:

$ sudo wecker disable
Disable alarm.
Current status: Alarm is not set.

Links und weitere Informationen

9 thoughts on “Den Computer als Wecker benutzen

  1. 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

    systemctl suspend

    anstatt der

    pm-utils

    . Funktioniert auch ohne root.

  2. 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

  3. 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:

      sudo wecker set 05:30; sudo wecker sleep 23; sleep 5; pkill i3lock; mpc play

      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:

          HandleLidSwitch=ignore

          .

          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

Leave a Comment