| home page > weather station > memory map | site info / site 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.
The weather station's history is stored in 4080 16-byte records, each of which has the following layout.
| Address | Bytes | Item | Format | Comments |
|---|---|---|---|---|
| 0 | 1 | delay | unsigned byte | Minutes since last stored reading. |
| 1 | 1 | indoor humidity | unsigned byte | |
| 2 | 2 | indoor temperature | signed short | Multiply by 0.1 to get °C. |
| 4 | 1 | outdoor humidity | unsigned byte | |
| 5 | 2 | outdoor temperature | signed short | Multiply by 0.1 to get °C. |
| 7 | 2 | absolute pressure | unsigned short | Multiply by 0.1 to get hPa. |
| 9 | 1 | average wind speed, low bits | unsigned byte | Multiply by 0.1 to get m/s. |
| 10 | 1 | gust wind speed, low bits | unsigned byte | Multiply by 0.1 to get m/s. |
| 11 | 1 | wind speed, high bits | unsigned byte | Lower 4 bits are the average wind speed high bits, upper 4 bits are the gust wind speed high bits. |
| 12 | 1 | wind direction | unsigned byte | Multiply by 22.5 to get ° from north. |
| 13 | 2 | total rain | unsigned short | Multiply by 0.3 to get mm. |
| 15 | 1 | status | raw | 7th bit indicates loss of contact with sensors. |
Other weather station data is stored in a 256 byte "fixed block", which has the following layout.
| Address | Bytes | Item | Format | Comments |
|---|---|---|---|---|
| 0 | 2 | magic number | raw | Should be 0x55AA. Can also be 0xFFFF? |
| 16 | 1 | read period | unsigned byte | Minutes between each stored reading |
| 17 | 4 | unknown 1 | raw | Values seen so far include 0x20015109, 0x20012081, 0x20012041, 0x20022109 and 0x20023181. If you have something different, let me know! |
| 24 | 1 | time zone | signed byte | Hours 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. |
| 27 | 2 | data count | unsigned short | Number of stored readings. Starts at zero, rises to 4080. |
| 30 | 2 | current position | unsigned short | Address 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. |
| 32 | 2 | relative pressure | unsigned short | Current relative (sea level) atmospheric pressure, multiply by 0.1 to get hPa. |
| 34 | 2 | absolute pressure | unsigned short | Current absolute atmospheric pressure, multiply by 0.1 to get hPa. |
| 36 | 7 | unknown 2 | raw | Usually all zero, but have also seen 0x4A7600F724030E. If you have something different, let me know! |
| 43 | 5 | current date & time | date-time | |
| 48 | 1 | alarm, indoor humidity, high | unsigned byte | |
| 49 | 1 | alarm, indoor humidity, low | unsigned byte | |
| 50 | 2 | alarm, indoor temperature, high | signed short | Multiply by 0.1 to get °C. |
| 52 | 2 | alarm, indoor temperature, low | signed short | Multiply by 0.1 to get °C. |
| 54 | 1 | alarm, outdoor humidity, high | unsigned byte | |
| 55 | 1 | alarm, outdoor humidity, low | unsigned byte | |
| 56 | 2 | alarm, outdoor temperature, high | signed short | Multiply by 0.1 to get °C. |
| 58 | 2 | alarm, outdoor temperature, low | signed short | Multiply by 0.1 to get °C. |
| 60 | 2 | alarm, wind chill, high | signed short | Multiply by 0.1 to get °C. |
| 62 | 2 | alarm, wind chill, low | signed short | Multiply by 0.1 to get °C. |
| 64 | 2 | alarm, dew point, high | signed short | Multiply by 0.1 to get °C. |
| 66 | 2 | alarm, dew point, low | signed short | Multiply by 0.1 to get °C. |
| 68 | 2 | alarm, absolute pressure, high | unsigned short | Multiply by 0.1 to get hPa. |
| 70 | 2 | alarm, absolute pressure, low | unsigned short | Multiply by 0.1 to get hPa. |
| 72 | 2 | alarm, relative pressure, high | unsigned short | Multiply by 0.1 to get hPa. |
| 74 | 2 | alarm, relative pressure, low | unsigned short | Multiply by 0.1 to get hPa. |
| 76 | 1 | alarm, average wind speed, Beaufort | unsigned byte | |
| 77 | 1 | alarm, average wind speed, m/s | unsigned byte | Multiply by 0.1 to get m/s. |
| 79 | 1 | alarm, gust wind speed, Beaufort | unsigned byte | |
| 80 | 1 | alarm, gust wind speed, m/s | unsigned byte | Multiply by 0.1 to get m/s. |
| 82 | 1 | alarm, wind direction | unsigned byte | Multiply by 22.5 to get ° from north. |
| 83 | 2 | alarm, rain, hourly | unsigned short | Multiply by 0.3 to get mm. |
| 85 | 2 | alarm, rain, daily | unsigned short | Multiply by 0.3 to get mm. |
| 87 | 2 | alarm, time | BCD | Hour & minute. |
| 98 | 1 | maximum, indoor humidity, value | unsigned byte | |
| 99 | 1 | minimum, indoor humidity, value | unsigned byte | |
| 100 | 1 | maximum, outdoor humidity, value | unsigned byte | |
| 101 | 1 | minimum, outdoor humidity, value | unsigned byte | |
| 102 | 2 | maximum, indoor temperature, value | signed short | Multiply by 0.1 to get °C. |
| 104 | 2 | minimum, indoor temperature, value | signed short | Multiply by 0.1 to get °C. |
| 106 | 2 | maximum, outdoor temperature, value | signed short | Multiply by 0.1 to get °C. |
| 108 | 2 | minimum, outdoor temperature, value | signed short | Multiply by 0.1 to get °C. |
| 110 | 2 | maximum, wind chill, value | signed short | Multiply by 0.1 to get °C. |
| 112 | 2 | minimum, wind chill, value | signed short | Multiply by 0.1 to get °C. |
| 114 | 2 | maximum, dew point, value | signed short | Multiply by 0.1 to get °C. |
| 116 | 2 | minimum, dew point, value | signed short | Multiply by 0.1 to get °C. |
| 118 | 2 | maximum, absolute pressure, value | unsigned short | Multiply by 0.1 to get hPa. |
| 120 | 2 | minimum, absolute pressure, value | unsigned short | Multiply by 0.1 to get hPa. |
| 122 | 2 | maximum, relative pressure, value | unsigned short | Multiply by 0.1 to get hPa. |
| 124 | 2 | minimum, relative pressure, value | unsigned short | Multiply by 0.1 to get hPa. |
| 126 | 2 | maximum, average wind speed, value | unsigned short | Multiply by 0.1 to get m/s. |
| 128 | 2 | maximum, gust wind speed, value | unsigned short | Multiply by 0.1 to get m/s. |
| 130 | 2 | maximum, rain hourly, value | unsigned short | Multiply by 0.3 to get mm. |
| 132 | 2 | maximum, rain daily, value | unsigned short | Multiply by 0.3 to get mm. |
| 134 | 2 | maximum, rain weekly, value | unsigned short | Multiply by 0.3 to get mm. |
| 136 | 2 | maximum, rain monthly, value | unsigned short | Multiply by 0.3 to get mm. |
| 138 | 2 | maximum, rain total, value | unsigned short | Multiply by 0.3 to get mm. |
| 141 | 5 | maximum, indoor humidity, when | date-time | |
| 146 | 5 | minimum, indoor humidity, when | date-time | |
| 151 | 5 | maximum, outdoor humidity, when | date-time | |
| 156 | 5 | minimum, outdoor humidity, when | date-time | |
| 161 | 5 | maximum, indoor temperature, when | date-time | |
| 166 | 5 | minimum, indoor temperature, when | date-time | |
| 171 | 5 | maximum, outdoor temperature, when | date-time | |
| 176 | 5 | minimum, outdoor temperature, when | date-time | |
| 181 | 5 | maximum, wind chill, when | date-time | |
| 186 | 5 | minimum, wind chill, when | date-time | |
| 191 | 5 | maximum, dew point, when | date-time | |
| 196 | 5 | minimum, dew point, when | date-time | |
| 201 | 5 | maximum, absolute pressure, when | date-time | |
| 206 | 5 | minimum, absolute pressure, when | date-time | |
| 211 | 5 | maximum, relative pressure, when | date-time | |
| 216 | 5 | minimum, relative pressure, when | date-time | |
| 221 | 5 | maximum, average wind speed, when | date-time | |
| 226 | 5 | maximum, gust wind speed, when | date-time | |
| 231 | 5 | maximum, rain hourly, when | date-time | |
| 236 | 5 | maximum, rain daily, when | date-time | |
| 241 | 5 | maximum, rain weekly, when | date-time | |
| 246 | 5 | maximum, rain monthly, when | date-time | |
| 251 | 5 | maximum, rain total, when | date-time |