Nick's Weather Station

  1. I have a small weather station on my amateur radio antenna tower
  2. The weather station was previously a "Maplin USB Touchscreen Wireless Weather Forecaster" which seems to be a re-branded WH1081 by Fine Offset Electronics Co (no longer sold, but similar to the WH3080/3081).
  3. I used fowsr on a Netgear / OpenWrt Linux WiFi router to pull the data from it over USB. Before that I used to use an OpenSUSE Linux box for this bit. Any Linux / OpenWrt machine with USB should be fine. A "NoseyWX" wrapper around the fowsr software sends data in Weather Underground format to "wunder2aprs" on my NoseyNick server.
  4. The above broke after many years of service. I replaced it with an Acurite 5-in-1 and I pick up the radio transmissions with a super-cheap rtl-sdr stick on a Raspberry Pi with rtl_433, and convert to wunderground-compatible URLs using my own Again this could run on almost any Linux machine with USB - check if rtl_433 and perl are available.
  5. Wunder2aprs, on my NoseyNick server, has an API that is deliberately compatible superset of Weather Underground's. It can re-post the data to Weather Underground...
  6. ... but more importantly it also converts it to APRS format (see APRS101 or Philip Gladstone's APRS WX format page) and submits it to the APRS-IS/CWOP network.
  7. This is then picked up, directly or indirectly, by a whole bunch of other sites, including big government agencies - see my main weather page for the list.

If you wish to use NoseyWX wunder2aprs yourself...

... with a Maplin / Fine Offset station and fowsr...

Assuming you already have one of the compatible USB weather-stations... Install fowsr on any Linux box, or even any USB-equipped router capable of running OpenWrt. OpenWRT "Chaos Calmer" unfortunately has no fowsr package, but you can, surprisingly, wget Barrier Breaker's fowsr and opkg install that. Oh, make sure you have a working "cron" installed too.

Download /usr/bin/ which should look like...


. /etc/profile >/dev/null
mkdir -p /var/log/fowsr
/usr/bin/fowsr -w >> /var/noseywx.log 2>&1 \
|| fowsr -fw -n/var/wunderground.log >> /var/noseywx.log 2>&1

# Sleep a "random" time from 5-104 secs,       
# to avoid the nasty APRS spikes from 1000s of NTP-synced WX stations:       
sleep $(cut -c1-2 /proc/sys/kernel/random/boot_id | tr a-f- 0-9) 5

# Also available on http if your wget is not https-capable:
shift; shift; shift
if [ -n "$1" ]; then
  shift; shift
# if you want to add a note/shoutout/neighbourhood/village/town/city:
if [ -n "$*" ]; then
NWURL="$NWURL&$(tail -1 /var/wunderground.log)"

wget -q -O- $(echo "$NWURL" | tr ' ' +) \
| tee -a /var/noseywx.log | logger -t noseywx

# Keep 1 previous version. If you prefer to keep an entire history, comment
# out these, but then you probably want to rotate logs another way:
mv /var/wunderground.log /var/wunderground.last
mv /var/noseywx.log      /var/noseywx.last

Don't forget to:

chmod 755 /usr/bin/

Wunder2aprs takes the same parameters as Weather Underground (which fowsr writes to /var/wunderground.log by default), then the extra params MYCALL, MYPASS, LATLON, and an optional NOTE. Unlike Weather Underground, you're not supposed to send to APRS/CWOP more than once every 5 minutes though. APRS also gets hammered precisely every 5 mins by a whole load of NTP-synced weather stations, so includes a deliberate randomised delay before you upload. Don't be too surprised if it takes nearly 2 minutes to run!

You probably want a crontab entry something like...

#min hr day mth dow command
*/5  *  *   *   *   /usr/bin/ MYCALL MYPASS LATLON
# For example...
*/5  *  *   *   *   /usr/bin/ VA3NNW-13 12345 4327.07N/08033.98W

If you do want NoseyWX to forward to, your crontab might look like:

#min hr day mth dow command
*/5  *  *   *   *   /usr/bin/ MYCALL MYPASS LATLON ID PASSWORD
# For example...
*/5  *  *   *   *   /usr/bin/ VA3NNW-13 12345 4327.07N/08033.98W IONTARIO333 12345

Any further arguments in the cron command-line are swallowed into "NOTE=", so you can add a few short words about your software, hardware, neighbourhood/village/town/city etc:

#min hr day mth dow command
*/5  *  *   *   *   /usr/bin/ MYCALL MYPASS LATLON ID PASSWORD NOTES
# For example...
*/5  *  *   *   *   /usr/bin/ VA3NNW-13 12345 4327.07N/08033.98W IONTARIO333 12345 fowsr OpenWRT WH1081 Waterloo

Beware of word-wrapping in your crontab!

... or with an Acurite 5-in-1 and rtl_433...

You'll need any of the super-cheap ($20 or less) Realtek-based USB TV tuner dongles compatible with rtl-sdr. You'll need rtl_433. When it runs, it should output something like:

$ /usr/local/bin/rtl_433 -G -T 115
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

time      : 2019-06-09 23:59:22
model     : Acurite 5n1 sensor
sensor_id : 1234
channel   : C
sequence_num: 2
battery   : OK
message_type: 49
wind_speed: 15.1 km/h
wind_dir_deg: 67.5
Rainfall Accumulation: 63.68 in
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

time      : 2019-06-09 23:59:40
model     : Acurite 5n1 sensor
sensor_id : 1234
channel   : C
sequence_num: 0
battery   : OK
message_type: 56
wind_speed: 9.3 km/h
temperature: 73.6 F
humidity  : 56
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

You'll need You'll probably want to write a little wrapper which listens for 2 minutes of rtl_433, and feeds it into An example script might look like:

#!/bin/sh -f

# if you have APRS-IS creds, uncomment and edit into here:
# URL="$URL&LATLON=4327.07N/08033.98W&NOTE=AcuRite+Beechwood"
# replace with your wunderground creds:

# Remove both ISODATE lines if you DO NOT want to keep a copy of
# the raw rtl_433 capture (1 file per day):
ISODATE=$(date '+%F')
/usr/local/bin/rtl_433 -G -T 115 2>&1 \
| tee -a $ISODATE.wx \
| --url "$URL"  --ID "$ID"  --PASSWORD "$PASS" \
>> noseywx.log

See above for details of MYCALL, MYPASS, and expectially LATLON. Don't forget to:

chmod 755 path/to/the/above/wrapper

Arrange for the above to be called under cron, perhaps with a crontab entry something like...

#min hr day mth dow command
*/5  *  *   *   *   path/to/the/above/wrapper >> wx-log 2>>&1

Again, beware of word-wrapping in your crontab!