# How to decode radio thermometer / hygrometer bytes to floats?

I'm playing around with a radio receiver on 433MHz and I am receiving signals from a temperature / humidity sensor.

I already figured out what bytes represent humidity, but I'm stuck with the temperature as I don't know how it is represented in the signal. Here are some example messages I receive:

C1 | 75.2F | 70%
0001010001010011010000000100100000000100011011010111000011
C1 | 24.1C | 68%
0001010001010100100000000100100000010100010000000001000011
C1 | 24.1C | 56%
0001010001010100100000000100100000010011100001010110000011


The temperature sensor has the following readouts:

• Temperature
• Humidity
• Unit (Celsius / Fahrenheit)
• Channel (1-8)

I already figured out what the humidity is as well as what represents the channel. I also figured out a temperature range(?) [1 = ..-11 | 2= -1..-10 | 3= 0..15 | 4= 15..30 | 5=31..40]. But I have a hard time figuring out where I can find the exact temperature or the unit (F/C).

I prepared this public Google Sheet with my findings and raw data so far (sorry I don't know a better way to share on Stackexchange):

https://docs.google.com/spreadsheets/d/1q2sk5bK6Bv3gi8ahTLIUM4DaMR7AvnTVPY-NvmGMHoQ/edit?usp=sharing (the channel with a zero based index I already figured out is violet, the humidity is in blue, some bits always stay the same hence I made them grey)

What is my best course of action now? I have been trying around with all the bits and bytes, adding them together, adding the one to the other, multiplying the temperature times 10 to get a decimal... nothing.

Yeah... Plotting is an idea, but it doesn't really help me:

Column I seems to follow the temperature in a way (negative temperature/high temperatures and the values just don't relate, look to the end of the graph), but looking at the decimal representation of I can see values such as 7,8,9 and wildly changing temperatures. I am assuming there is some kind of correlation between the temperature range and this byte but I haven't figured out yet how to achieve the calculation.

Alright I found something:

The temperature ranges in correlation with I & J seem to be the key. I & J corresponds to a value between 0-255 (I guess) for each range and represents a particular temperature value. The I & J scale seems to be logarithmic looking at the difference between 17,8C (17) and 20,8C (71) and the difference between 20,8C (71) and 22,8C (106). But that's just a guess.

So I somehow need to correlate the range (15 degrees C wide) with the 0-255 index to get a temperature. Crazy.

Converted H & I & J 12 bit number to decimal and get the following:

It does look very related, but I can't figure out a formula.

• Got a hairdryer? – user_1818839 Feb 7 '17 at 16:50
• Yeah I can manipulate temperature at will. There are some readings where everything is the same but the temperature shifts by 0,1 degrees. Still. No clue where in the readout it is. – Dennis G Feb 7 '17 at 16:51
• The most common digital temperature sensor (in my experience) is the Maxim DS18B20. They use a very non-intuitive data format. Does your data match their format? datasheets.maximintegrated.com/en/ds/DS18B20.pdf – ericksonla Feb 8 '17 at 4:26
• Unfortunately doesn't look like it, thanks! The maxim sensor provides a lot more data than I can see. The S0 bit gor negative values gave me an idea of trying negative values for a change (freezer) – Dennis G Feb 8 '17 at 6:37
• The sensor might be transmitting only raw sensor data and relying on the receiver to do the correct interpretation (maybe by looking up a table, maybe by calculation). I would not expect the sensor to differentiate between Farenheit and Celsius. Try to plot the decimal representation of parts that might represent the temperature against the temperature and see what you get. If you find a correlation, that might help you. – Robin Feb 8 '17 at 7:54

This is not a full answer but I can't comment yet due to too less reputation, sorry.

I+J seems to have a strong correlation with the temperature. I did a scatter plot of I+J vs. Temp and I can see at least one strong linear relationship (did not do the fit yet, though).

You can also see some outliers but they seem to be parallel. You could think of a sawtooth waveform. This implies different measurement ranges or that more bits are needed to see the complete result.

• You're correct. I did find the correlation as well, particularly I seems correlated. I think the temperature range (measurement range?)combined with I can somehow yield an interesting result, but I have yet to find the combining factor. I'm not familiar with sawtooth waveform, besides knowing what it looks like. – Dennis G Feb 8 '17 at 14:01

Figured it out!

The temperature is always being send in Fahrenheit not in Celsius, see the following table:

An increase of one in the 12bit (columns H&I&J together) column leads to 0,1 degree Fahrenheit increase.

Converting the 12bit to decimal, subtracting 400 and dividing by 10 actually leads to the exact value in Fahrenheit.

The formula is as follows:

(H&I&J-400)/10 = Temperature in Fahrenheit
((H&I&J-400/10)-32)/1,8 = Temperature in Celsius


The formulas hold for all values!