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 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.

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, 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, 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.
151statusraw7th bit indicates loss of contact with sensors.

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. Can also be 0xFFFF?
161read periodunsigned byteMinutes between each stored reading
174unknown 1rawValues seen so far include 0x20015109, 0x20012081, 0x20012041, 0x20022109 and 0x20023181. If you have something different, let me know!
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.
272data countunsigned shortNumber of stored readings. Starts at zero, rises to 4080.
302current positionunsigned shortAddress of the stored reading currently being created. Starts at 256, rises to 65520 in steps of 16, 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.
367unknown 2rawUsually 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
771alarm, average wind speed, m/sunsigned byteMultiply by 0.1 to get m/s.
791alarm, gust wind speed, Beaufortunsigned byte
801alarm, gust wind speed, m/sunsigned byteMultiply by 0.1 to get m/s.
821alarm, wind directionunsigned byteMultiply by 22.5 to get ° from north.
832alarm, rain, hourlyunsigned shortMultiply by 0.3 to get mm.
852alarm, rain, dailyunsigned shortMultiply by 0.3 to get mm.
872alarm, timeBCDHour & minute.
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.3 to get mm.
1322maximum, rain daily, valueunsigned shortMultiply by 0.3 to get mm.
1342maximum, rain weekly, valueunsigned shortMultiply by 0.3 to get mm.
1362maximum, rain monthly, valueunsigned shortMultiply by 0.3 to get mm.
1382maximum, rain total, valueunsigned shortMultiply by 0.3 to get mm.
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