Roll your own Linux alarm clock

I bought a small alarm clock when I started college almost two years ago. I currently have no idea where that alarm clock is. Over the past two years I’ve come to realize that I don’t like to have a bunch of different gadgets doing different things, especially if I can do it on a general purpose computer. I’ev been using a software alarm clock for over a year now. Mostly I use the excellent Alarm Clock 2 for OS X, but over summer I needed to have an alarm clock on my Linux laptop. There are a number of Linux alarm clock programs out there including KAlarm and the imaginatively named Alarm Clock for GNOME. However, being the minimalist that I am, I was interested in seeing if I could get what I wanted without a completely separate program. Also since I run a minimal XMonad desktop, I didn’t want to install GNOME or KDE centric apps. What I found out was that it’s really easy to roll your own alarm clock using tools that you already have.

Gathering the tools

I used three separate programs and a small shell script to create my personal alarm clock. To actually produce the sound for the alarm I used the Music Player Daemon. As the name suggests it’s a daemon that runs in the background and can be used to play music files. Since it’s a daemon you need a separate front end to communicate with it. It’s a really useful application and there are a number of great front ends to get going. The second program I needed was a simple front end to get the daemon to play something. Normally I use the excellent ncmpc client to listen to music, but for the alarm clock I decided to install the simpler mpc client which offers some simple commands for manipulating a playlist and playing it. Finally I need a way to actually get it to play at certain times. For this I used another classic UNIX daemon called cron.

Putting it all together

Now since I’m probably going to be sleeping when I want the alarm to go off, I needed to have the mpc client automatically get some music from my collection and play it. Getting it to play music involved a simple three line shell script:

mpc clear
mpc search title Universe | mpc add
mpc play

The first line clears any playlist that I may have played last. The second line searches the MPD database for songs with the word 'Universe' in the title (I wanted the really loud Center of the Universe by Kamelot which is almost impossible to sleep through). The final line simply tells mpc to go ahead and get started. I saved this shell script in a file called alarm and made it executable by doing a chmod u+x alarm.

With the script ready to play music, I had to make sure that it was executed at the right times. Cron is a daemon which is made exactly for tasks like this. It uses a really simple rule format to specify timing and repetitions and commands to execute at those times. A typical cron rule has the following format:

Minute Hour Day_of_Month Month Day_of_the_Week Command

Rules for cron are saved in a file which can be edited using the crontab -e command. But I found it easier to just put the rules in a separate file and then give that file to the crontab command to use. Shown below is what my current crontab looks like. I have the alarm shell script being executed 4 times a day, everyday (that's because I'm trying to adjust to a dymaxion sleep pattern).

45 00 * * * ~/src/scripts/alarm
45 06 * * * ~/src/scripts/alarm
45 12 * * * ~/src/scripts/alarm
45 18 * * * ~/src/scripts/alarm

Looking ahead

I'll be the first to admit that it isn't the perfect alarm clock. There's no snooze or gradually increasing volume and if I want to stop I either have to type in the mpc stop command or else stop MPD via another front end. If I wanted a more sophisticated alarm clock, I'd probably write a more powerful wrapper around MPD or some other player in Python to get the extra features I wanted. But this little tool is just enough to be sufficient for my needs. Also it was a good chance for me to learn about UNIX tools like cron.

Cron can be used for a lot of things besides an alarm clock, anything that needs to run on a schedule could probably be turned into a combination of a shell script and a cron job. At the same time, you don't have to use MPD, there's a great tutorial that tells you how to use other media players like Amarok or MPlayer. The main thing I'd like to express by writing about little experiments like this is that building your own tools can be both useful and fun and you really should invest some time in learning the tools available to you. After all, a computer really is just a dumb machine and it should work the way you want it to, not the other way around.

About these ads

3 thoughts on “Roll your own Linux alarm clock

  1. I just use sleep. Some examples

    $ sleep 9.15h; mplayer Through_the_Fire_and_the_Flames
    $ sleep 19m; mplayer Revolution_Deathsquad

    When I set alarms by absolute instead of relative time, I always think of the relative time anyway; I make sure that I sleep for either 18 minutes or a multiple of one and a half hours. The technically simpler method I present here is also more effective for my purposes than the more typical absolute method.

  2. funny. I was just thinking about doing something like this, nearly exactly.

    I was thinking about doing something with conky and a specialized awesome-wm config to make it a good remote controller for the abode. Not that that’s needed, but I think having a thinclient or two around for when I get away from using my desktop as a desktop… It has merit as a model

  3. I just got a RaspberryPi which I think is suited to this sort of project due to its small form factor and low power consumption. A simple push switch could also be wired up to two of the pins on the GPIO connector to act as a snooze button.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s