Weather station memory map

Cautionary note: this is not official information from any manufacturer. It has been obtained by careful "reverse engineering" of data from a small number of users' weather stations. Use at your own risk.

An essential precursor to writing software for the Fine offset weather stations (WH1080, WH1081, W-8681, WH3080, WH3081 etc.) was to decode the data read from them. This was discussed in Michael Pendec's weather station forum a few years ago. Michael had decoded the current and stored data, and Dave Wells contributed an almost complete map of the remaining data. That forum message has since been deleted (Michael had a spam problem, and wiping everything was his only option) so I've reproduced the info here, with a few additions of my own. Credit is also due to Steve from Sandaysoft for decoding the strange wind speed layout and to Chris Naunton for decoding the extra data stored by the '3080' family of stations.

Note that there are gaps in the memory layout. Some memory locations are probably unused, but others may contain useful information that has not yet been decoded. If you have any further information, or find any errors, please let me know.

Data is read from the weather station, via USB, in 32-byte chunks. Each chunk has an address, in the range 0 to 65504, so it is convenient to describe the data as a memory map with an address range of 0 to 65535.

The first 256 bytes of the memory map is a "fixed" block, containing data such as maximum and minimum temperature records and alarm settings. The remaining data is an array of 4080 16-byte records (or 3264 20-byte records), which store the weather history.

Note that there are some pecularities about the data formats. Signed numbers use the most significant bit to indicate sign, so -1 would be represented in binary as 1000 0001 (signed byte) or 1000 0000 0000 0001 (signed short). Date-time values are stored as year (last two digits), month, day, hour and minute in binary coded decimal, two digits per byte.

Weather record layout

The weather station's history is stored in 4080 16-byte records (3264 20-byte records in the 3080), each of which has the following layout.

AddressBytesItemFormatComments
01delayunsigned byteMinutes since last stored reading.
11indoor humidityunsigned byte
22indoor temperaturesigned shortMultiply by 0.1 to get °C.
41outdoor humidityunsigned byte
52outdoor temperaturesigned shortMultiply by 0.1 to get °C.
72absolute pressureunsigned shortMultiply by 0.1 to get hPa.
91average wind speed, low bitsunsigned byteMultiply by 0.1 to get m/s.
101gust wind speed, low bitsunsigned byteMultiply by 0.1 to get m/s.
111wind speed, high bitsunsigned byteLower 4 bits are the average wind speed high bits, upper 4 bits are the gust wind speed high bits.
121wind directionunsigned byteMultiply by 22.5 to get ° from north.
132total rainunsigned shortMultiply by 0.3 to get mm.
151statusbitsbit 6: 1 = loss of contact with sensors
bit 7: 1 = rain counter overflow
163illuminanceunsigned 3-byte integer(3080 only) Multiply by 0.1 to get lux.
191uvunsigned byte(3080 only)

Fixed block layout

Other weather station data is stored in a 256 byte "fixed block", which has the following layout.

AddressBytesItemFormatComments
02magic numberrawShould be 0x55AA or 0x5555. Can also be 0xFFFF?
161read periodunsigned byteMinutes between each stored reading
171unit settings 1bitsbit 0: indoor temperature: 0 = °C, 1 = °F
bit 1: outdoor temperature: 0 = °C, 1 = °F
bit 2: rain: 0 = mm, 1 = inch
bit 5: pressure: 1 = hPa
bit 6: pressure: 1 = inHg
bit 7: pressure: 1 = mmHg
181unit settings 2bitsbit 0: wind speed: 1 = m/s
bit 1: wind speed: 1 = km/h
bit 2: wind speed: 1 = knot
bit 3: wind speed: 1 = m/h
bit 4: wind speed: 1 = bft
191display options 1bitsbit 0: pressure: 0 = absolute, 1 = relative
bit 1: wind speed: 0 = average, 1 = gust
bit 2: time: 0 = 24 hour, 1 = 12 hour
bit 3: date: 0 = day-month-year, 1 = month-day-year
bit 4: time scale(?): 0 = 12 hour, 1 = 24 hour
bit 5: date: 1 = show year year
bit 6: date: 1 = show day name
bit 7: date: 1 = alarm time
201display options 2bitsbit 0: outdoor temperature: 1 = temperature
bit 1: outdoor temperature: 1 = wind chill
bit 2: outdoor temperature: 1 = dew point
bit 3: rain: 1 = hour
bit 4: rain: 1 = day
bit 5: rain: 1 = week
bit 6: rain: 1 = month
bit 7: rain: 1 = total
211alarm enable 1bitsbit 1: time
bit 2: wind direction
bit 4: indoor humidity low
bit 5: indoor humidity high
bit 6: outdoor humidity low
bit 7: outdoor humidity high
221alarm enable 2bitsbit 0: wind average
bit 1: wind gust
bit 2: rain hourly
bit 3: rain daily
bit 4: absolute pressure low
bit 5: absolute pressure high
bit 6: relative pressure low
bit 7: relative pressure high
231alarm enable 3bitsbit 0: indoor temperature low
bit 1: indoor temperature high
bit 2: outdoor temperature low
bit 3: outdoor temperature high
bit 4: wind chill low
bit 5: wind chill high
bit 6: dew point low
bit 7: dew point high
241time zonesigned byteHours offset from Central European Time, so in the UK this should be set to -1. In stations without a radio controlled clock this is always zero.
251unknown
261data refreshedrawComputer writes 0xAA to indicate a change of settings. Weather station clears value to acknowledge.
272data countunsigned shortNumber of stored readings. Starts at zero, rises to 4080 (3264 in the 3080).
291display options 3bits(3080 only)
bit 0: illuminance: 0 = lux, 1 = foot-candle
302current positionunsigned shortAddress of the stored reading currently being created. Starts at 256, rises to 65520 in steps of 16 (or 65516 in steps of 20 in the 3080), then loops back to 256. The data at this address is updated every 48 seconds or so, until the read period is reached. Then the address is incremented and the next record becomes current.
322relative pressureunsigned shortCurrent relative (sea level) atmospheric pressure, multiply by 0.1 to get hPa.
342absolute pressureunsigned shortCurrent absolute atmospheric pressure, multiply by 0.1 to get hPa.
367unknownUsually all zero, but have also seen 0x4A7600F724030E. If you have something different, let me know!
435current date & timedate-time
481alarm, indoor humidity, highunsigned byte
491alarm, indoor humidity, lowunsigned byte
502alarm, indoor temperature, highsigned shortMultiply by 0.1 to get °C.
522alarm, indoor temperature, lowsigned shortMultiply by 0.1 to get °C.
541alarm, outdoor humidity, highunsigned byte
551alarm, outdoor humidity, lowunsigned byte
562alarm, outdoor temperature, highsigned shortMultiply by 0.1 to get °C.
582alarm, outdoor temperature, lowsigned shortMultiply by 0.1 to get °C.
602alarm, wind chill, highsigned shortMultiply by 0.1 to get °C.
622alarm, wind chill, lowsigned shortMultiply by 0.1 to get °C.
642alarm, dew point, highsigned shortMultiply by 0.1 to get °C.
662alarm, dew point, lowsigned shortMultiply by 0.1 to get °C.
682alarm, absolute pressure, highunsigned shortMultiply by 0.1 to get hPa.
702alarm, absolute pressure, lowunsigned shortMultiply by 0.1 to get hPa.
722alarm, relative pressure, highunsigned shortMultiply by 0.1 to get hPa.
742alarm, relative pressure, lowunsigned shortMultiply by 0.1 to get hPa.
761alarm, average wind speed, Beaufortunsigned byte
772alarm, average wind speed, m/sunsigned shortMultiply by 0.1 to get m/s.
791alarm, gust wind speed, Beaufortunsigned byte
802alarm, gust wind speed, m/sunsigned shortMultiply by 0.1 to get m/s.
821alarm, wind directionunsigned byteMultiply by 22.5 to get ° from north.
832alarm, rain, hourlyunsigned shortMultiply by 0.1 to get mm.
852alarm, rain, dailyunsigned shortMultiply by 0.1 to get mm.
872alarm, timeBCDHour & minute.
893alarm, illuminanceunsigned 3-byte integer(3080 only) Multiply by 0.1 to get lux or fc, according to setting at address 29 bit 0.
921alarm, uvunsigned byte(3080 only)
931maximum, uv, valueunsigned byte(3080 only)
943maximum, illuminance, valueunsigned 3-byte integer(3080 only) Multiply by 0.1 to get lux.
971unknown
981maximum, indoor humidity, valueunsigned byte
991minimum, indoor humidity, valueunsigned byte
1001maximum, outdoor humidity, valueunsigned byte
1011minimum, outdoor humidity, valueunsigned byte
1022maximum, indoor temperature, valuesigned shortMultiply by 0.1 to get °C.
1042minimum, indoor temperature, valuesigned shortMultiply by 0.1 to get °C.
1062maximum, outdoor temperature, valuesigned shortMultiply by 0.1 to get °C.
1082minimum, outdoor temperature, valuesigned shortMultiply by 0.1 to get °C.
1102maximum, wind chill, valuesigned shortMultiply by 0.1 to get °C.
1122minimum, wind chill, valuesigned shortMultiply by 0.1 to get °C.
1142maximum, dew point, valuesigned shortMultiply by 0.1 to get °C.
1162minimum, dew point, valuesigned shortMultiply by 0.1 to get °C.
1182maximum, absolute pressure, valueunsigned shortMultiply by 0.1 to get hPa.
1202minimum, absolute pressure, valueunsigned shortMultiply by 0.1 to get hPa.
1222maximum, relative pressure, valueunsigned shortMultiply by 0.1 to get hPa.
1242minimum, relative pressure, valueunsigned shortMultiply by 0.1 to get hPa.
1262maximum, average wind speed, valueunsigned shortMultiply by 0.1 to get m/s.
1282maximum, gust wind speed, valueunsigned shortMultiply by 0.1 to get m/s.
1302maximum, rain hourly, valueunsigned shortMultiply by 0.1 to get mm.
1322maximum, rain daily, valueunsigned shortMultiply by 0.1 to get mm.
1342maximum, rain weekly, valueunsigned shortMultiply by 0.1 to get mm.
1362maximum, rain monthly, valueunsigned shortMultiply by 0.1 to get mm.
1382maximum, rain total, valueunsigned shortMultiply by 0.1 to get mm.
1401unknown
1415maximum, indoor humidity, whendate-time
1465minimum, indoor humidity, whendate-time
1515maximum, outdoor humidity, whendate-time
1565minimum, outdoor humidity, whendate-time
1615maximum, indoor temperature, whendate-time
1665minimum, indoor temperature, whendate-time
1715maximum, outdoor temperature, whendate-time
1765minimum, outdoor temperature, whendate-time
1815maximum, wind chill, whendate-time
1865minimum, wind chill, whendate-time
1915maximum, dew point, whendate-time
1965minimum, dew point, whendate-time
2015maximum, absolute pressure, whendate-time
2065minimum, absolute pressure, whendate-time
2115maximum, relative pressure, whendate-time
2165minimum, relative pressure, whendate-time
2215maximum, average wind speed, whendate-time
2265maximum, gust wind speed, whendate-time
2315maximum, rain hourly, whendate-time
2365maximum, rain daily, whendate-time
2415maximum, rain weekly, whendate-time
2465maximum, rain monthly, whendate-time
2515maximum, rain total, whendate-time