Fine Offset WH1080/1081 (aka Maplin N96FY) weatherstation

As I wrote on my blog, I've fancied the idea of having my own weatherstation for some time, but was always put off by the cost of buying one, and the complexity involved in making and calibrating one from scratch. So I was delighted to discover that here in the UK Maplin sell a relatively inexpensive weatherstation with wireless sensors that report to a base station that can be connected to a home computer by a USB port, allowing the sensor data to be processed further or uploaded to other services.

This is the Maplin N96FY which turns out to be a rebadged version of an extremely common low-cost weather station made by a Chinese company called Fine Offset, that is sold all over the world. The Fine Offset weather stations have some minor differences in functions (primarily radio-controlled real-time clock and solar radiation sensors) and use one of several different protocols for the wireless link to the sensors, depending on territory. For example, my model doesn't have a radio controlled clock or solar radiation sensors, and operates on 433Mhz.

The weatherstation comes with some software to allow a computer to access the weather data via the USB port on the console, but unfortunately it's Windows-only, so not much use to me, as I'm Linux-only. Fortunately however, as Fine Offset have sold the same hardware all over the world, there are lots of people who have collaborated to create open source software that can access the weatherstations USB port. The USB protocol appears to have leaked out into the wild by way of some development C++ source code from Fine Offset themselves. This has been adapted into Python and Perl code which can be trivially run on Linux systems. One example of such code that I found was written by Steve Cliffe; this was designed to read the current weather data from the console and create a file that could be processed by another program that was designed to upload weather data to WeatherUnderground.

For a time I ran these two programs to upload my weather data to WeatherUnderground, and they worked pretty well. I came across a couple of minor problems, but once I started to add fixes for those, I realised that the way the rainfall data was being presented to WeatherUnderground was wrong, and that having the functionality of reading the weather readings in one program, and the upload function in another was overly complex.

So I started to create my own program to extract the weather sensor data from the weatherstations USB port, based on Steve Cliffe's program, but incorporating the upload function from the other program. I also added a lot of fixes for the rainfall data capture, and significant error handling to cope when (not if!) the program reads invalid data from the weatherstation. After quite a lot of testing I'm now comfortable to release the code for general use. I hope it will be useful, but guarantee nothing!

To install my program there are basically two steps:

  1. Firstly, copy it to your computer, configure it with your WeatherUnderground login information, and arrange to autostart the program when your computer starts. You will pass a sampling interval to the program on its command line, and it will run continuously, reading data from the weatherstation at that interval. If possible your data will be uploaded to WeatherUnderground at that same frequency. However, WeatherUnderground limits uploads to no more than once every 5 minutes and my program will respect that, enforcing a minimum upload interval of 300 seconds, even if you sample the weatherstation data more frequently.
  2. Secondly, you need to reconfigure your weatherstation console to record historical records every 5 minutes, rather than the default of every 30 minutes. The only ready way I found to do this was using some of the support functions shipped with pywws (see the documentation here) or with a Windows-only utility called SetLogger that can be downloaded here, and that I've mirrored here for convienience and in case the original should ever be taken down.

If you want to understand how my program works, then you will need to refer to this memory map of the weatherstation console, that describes what all the memory within the console holds, and how it can be interpreted. Without this information I would never have been able to create my program.

  • 22 Nov 2013: wsreader-release-1.0 : Initial release (withdrawn - lack of error handling!)
  • 06 Dec 2013: wsreader-release-1.1 : Improved error handling
  • 14 Mar 2014: wsreader-release-1.2 : Major improvements to wind direction tracking
  • 25 Apr 2014: wsreader-release-1.3 : Fix for boundry condition error in wind direction tracking