=========================== Building a smart thermostat =========================== :CreationDate: 2018-03-25 12:47:54 :Id: HW/thermostat :tags: - hardware - software I'd like to have a computer-controller thermostat, that behaves the way I want to, doesn't need to talk to external servers, can measure temperature in multiple rooms. I'll need: * multiple cheap temperature sensors that can report their readings wirelessly * a way to start / stop the boiler * some clever software to decide when to turn the boiler on/off based on the temperature readings * a computer to run that software The sensors =========== The current candidate is a ESP32_ running off (probably alkaline) batteries, using a DHT11_ sensor. .. figure:: thermometer-diagram.png :alt: diagram showing a ESP32 microcontroller wired up to a DHT11 sensor :align: center Connections: =============== ====== microcontroller sensor =============== ====== +5V VCC GND GND pin 13 DATA =============== ====== `The code for the thermometer`_ uses the DHTesp_ library to read the sensor, and the `esp8266-oled-ssd1306`_ library to drive the display. The final sensor will most probably not have a display. .. _ESP32: https://en.wikipedia.org/wiki/ESP32 .. _DHT11: https://www.adafruit.com/product/386 .. _`The code for the thermometer: https://www.thenautilus.net/cgit/thermostat/tree/sensor/thermostat.ino .. _DHTesp: https://github.com/beegee-tokyo/DHTesp .. _`esp8266-oled-ssd1306`: https://github.com/ThingPulse/esp8266-oled-ssd1306/ Talking to the boiler ===================== Using the process described by `Steven Hale`_, `Dave Hope`_, `Ross Harper`_ and probably others, I connected a 433MHz receiver to my soundcard: .. figure:: rf-receiver-diagram.png :alt: diagram showing a 433MHz receiver wired up to a stereo audio cable via resistors :align: center Connections: ============= ======= From To ============= ======= Power + receiver VCC Power - receiver GND Power - microphone cable shielding via 22kΩ resistor receiver data microphone cable channel via 47kΩ resistor ============= ======= By turning the knob the thermostat that was installed with the boiler, I generated the on and off signals. I recorded them with Audacity_, and spent a few hours puzzling them out. This is what the recorded waveforms look like: .. figure:: waveforms-small.png :alt: two similar but not identical saw-toothed waveforms, one above the other :target: waveforms-large.png :align: center The two signal trains (one for "on" and one for "off") It took a while to realise that those saw-toothed waves were actually square waves, mangled by all the filters that my soundcard has, and that the heights were different only because of those same filters. Measuring the number of samples between rising edge and falling edge gave me the timing. Then I had to do the whole thing again when I noticed that the "low" widths where not always equal to the preceding "high" width: it's not a 50/50 duty cycle square wave. Then I built a transmitter: .. figure:: rf-trasmitter-diagram.png :alt: diagram showing an Arduino UNO wired up to a 433MHz transmitter :align: center Connections: =============== =========== microcontroller transmitter =============== =========== +3.3V VCC GND GND pin 7 DATA =============== =========== and wrote `code to send the correct pulse train`_. The receiver wired to the boiler recognises the signals and turns on and off. .. _`Steven Hale`: http://www.stevenhale.co.uk/main/2013/08/home-automation-reverse-engineering-a-worcester-bosch-dt10rf-wireless-thermostat/ .. _`Dave Hope`: https://damn.technology/controlling-british-gas-wr1-receiver-arduino .. _`Ross Harper`: http://rossharper.net/2015/11/decoding-a-siemens-rcr10433-thermostat-signal-to-control-a-boiler-from-a-raspberry-pi/ .. _Audacity: https://www.audacityteam.org/ .. _`code to send the correct pulse train`: https://www.thenautilus.net/cgit/thermostat/tree/trasmitter/sender.ino