This is an old revision of the document!


WT450H protocol

Thanks to contribution of Johan Adler and Øyvind Kaurstad. Decode signal from Esic brand wireless thermometer/hygrometer. My sensor/transmitter units are bought at Clas Ohlson,   product number 36-1794 (for main unit with one sensor)   (http://www.clasohlson.se/link/m3/Product,Product.aspx?artnr=36-1794).   Extra sensors are available as 36-1797.   These products are manufactured by W.H. Mandolyn International Ltd.   The sensor unit has their product ID WT450H, receiver unit WS2015H.   All units marked as Esic brand.         The signal is FM encoded with clock cycle around 2000 µs     No level shift within the clock cycle translates to a logic 0     One level shift within the clock cycle translates to a logic 1     Each clock cycle begins with a level shift     My timing constants defined below are those observed by my program         +—+   +—+   +——-+       +  high     |   |   |   |   |       |       |     |   |   |   |   |       |       |     +   +—+   +—+       +——-+  low         ^       ^       ^       ^       ^  clock cycle     |   1   |   1   |   0   |   0   |  translates as         Each transmission is 36 bits long (i.e. 72 ms)         Data is transmitted in pure binary values, NOT BCD-coded.         Example transmission (House 1, Channel 1, RH 59 %, Temperature 23.5 °C)     110000010011001110110100100110011000         b00 - b03  (4 bits): Constant, 1100, probably preamble     b04 - b07  (4 bits): House code (here: 0001 = HC 1)     b08 - b09  (2 bits): Channel code - 1 (here 00 = CC 1)     b10 - b12  (3 bits): Constant, 110     b13 - b19  (7 bits): Relative humidity (here 0111011 = 59 %)     b20 - b34 (15 bits): Temperature (see below)     b35 - b35  (1 bit) : Parity (xor of all bits should give 0)         The temperature is transmitted as (temp + 50.0) * 128,     which equals (temp * 128) + 6400. Adding 50.0 °C makes     all values positive, an unsigned 15 bit integer where the     first 8 bits correspond to the whole part of the temperature     (here 01001001, decimal 73, substract 50 = 23).     Remaining 7 bits correspond to the fractional part.         To avoid floating point calculations I store the raw temperature value     as a signed integer in the variable esicTemp, then transform it to     actual temperature * 10 using “esicTemp = (esicTemp - 6400) * 10 / 128”,     where 6400 is the added 50 times 128.     When reporting the temperature I simply print “esicTemp / 10” (integer division,     no fraction), followed by a decimal point and “esicTemp % 10” (remainder, which     equals first fractional decimal digit).         Summary of bit fields:     1100 0001 00 110 0111011 010010011001100 0      c1   hc  cc  c2    rh          t        p           c1, c2 = constant field 1 and 2     hc, cc = house code and channel code     rh, t  = relative humidity, temperature     p      = parity bit         Main decoding was done by Øyvind Kaurstad (http://personal.dynator.no/),     who reported about his work back in 2006 at     http://www.varmepumpsforum.com/vpforum/index.php?topic=3145.msg101023#msg101023     (Swedish forum, Øyvind writes in Norwegian).     On my request he let me share his findings (a spreadsheet analyzing signals     as captured by a digital oscilloscope), which made it quite easy for me to     write the actual code that decodes the wireless signal I receive.

wt450h.1298229408.txt.gz · Last modified: 2011/02/20 21:16 by jap
Recent changes RSS feed CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki