Regularly Scheduled Geekery
with Adam Fast

Building a "filter" for CW Skimmer with Django/Python


I (KC0YLK) had the opportunity to operate in the California QSO Party for 2008 with my friend Jim Baremore, K5QQ (major thanks to Jim for being my mentor, showing me the ropes of contesting and running the CW portion of our operation. Without him this project wouldn't have existed, because I wouldn't have needed it.) This was my first contest, and a good choice for a first contest at that. It's not super-serious / over the top in any regard, just designed to be fun for everybody. I'll share stats further down the page, but wanted to talk about the project I did to aid in the contest first.

Using a very wide-band radio receiver (able to receive a many signals simultaneously) and some software called CW Skimmer (CW or continuous wave is the method used to communicate using Morse code over the air) you can essentially see every person that your antenna can hear, at the same time. This is amazingly valuable information when you're running a contest - but it has its problems - the major one being that the stations go by incredibly fast, and you may not be interested in all of them. In this particular contest, we were only interested in stations in California (whom we had not made previous contact on a particular band (range of frequencies)). I happened to have experience with the public data from the FCC thanks to my mini-project QTHmap, so I was set.

The project required implementing a custom Python telnet client that understood what it was being told and (using the Django ORM) logging it into the database for later analysis / display (done in real-time). If the above criteria was met, it was flagged specially to be sent by a custom Python telnet server (every five seconds) which the logging/radio control software connected to. Using this software, the operator only needs to click on a station in the list received from the app for the radio to go to the frequency, and begin a conversation (or QSO in amateur radio jargon).

So, with custom telnet server/client, and another importer to grab the local log of who's been contacted already (running every 30 seconds) plus some fairly specialized hardware, nearly all of the CW portion of the contest was conducted with no traditional "search and pounce" (or tuning up/down frequencies, cross-checking callsigns, etc).

What I learned:

  • I really enjoy contesting
  • I enjoy using the skills myself and my friends have in order to make other things I/we enjoy even easier/more fun (and as the ideas get more crazy, enjoyment goes up)
  • I need to learn / become proficient in CW so I can put my creation to work
  • Sometimes a spark of an idea can explode - and you'll amaze yourself in what can be accomplished in three evenings of free time (as this project was, start to finish)
  • Django, while intended and designed as a web framework, is incredibly versatile and able to accomplish nearly anything you desire
  • Working as a team with an experienced contester/friend makes the process much more enjoyable

Here's our QSO map (lots of unresolvable addresses, but still shows the trend of where we were getting the most stations from. http://dev.qthmap.com/cqp/

By the Numbers:
CW Stations Spotted (not unique) during contest:13,302
CW Stations who fit required criteria (not already worked for that band/mode, with an FCC address of record in California) - will continue collecting dupes until the station is worked:2464
CW Stations worked during the contest:174
Phone (voice) Stations worked during the contest:134
Number of counties worked:55 (58 possible)
Overall Score:43,450