A DIY ESPHome thermostat with PID control and ePaper display

Oct 28, 2026 Last reply: 12 hours ago 4 Replies
Jump to replies (4)

When the heating season arrived, the maker's CTRL ONE took over the job properly. It regulates room temperature with a PID controller and holds it to within roughly 0.2 degrees, while the 4.2 inch ePaper touchscreen with backlight shows temperature, humidity and CO2 data from across the home. An output drives the heating valve, and the SCD40 sensor supplies the climate readings.



The construction choices stand out. The device is Made for ESPHome approved, and the actual temperature control runs on-board, so heating keeps working during WiFi or Home Assistant outages. Home Assistant handles the smart parts like changing the setpoint, though that can also be done from the touchscreen. In white and wooden enclosures, it sits beside a generic wall thermostat.



The details show real thought. The heating output runs a slow PWM cycle of 30 minutes, sized around the rated lifetime actuations of the valves. The published YAML lists kp 1.2, ki 0.0001 and kd 0.0, and Home Assistant history graphs chart temperature overshoot next to valve PWM modulation and weather data. Tuning followed a simple method: max power until the setpoint, then measure the system's reaction time and overshoot, letting the loop settle so it does not oscillate around the target.



The maker is upfront about the limits. PID precision is capped by that long PWM cycle, and long-term data is still needed to show whether residual overshoot noticeably affects efficiency. There is no claim that PID saves energy over a fixed temperature, and a basic bang-bang controller is still recommended as the starting point, which strikes me as refreshingly honest advice.


How did the maker actually tune the loop? Was it the simple method of running max power up to the setpoint and then timing the response and overshoot, or did the kp, ki and kd values come out of manual fiddling over a few heating cycles?

Keeping the temperature control on-board looks like the smartest decision here. A thermostat that stops calling for heat whenever Home Assistant reboots or the WiFi drops would be a liability, not an upgrade. The 30 minute PWM cycle is a sensible trade-off as well, though it does cap how fine the PID regulation can get.

Since the SCD40 already tracks CO2 alongside temperature and humidity, one of these could run purely as an air quality station reporting to Home Assistant, with no heating duty at all. That seems like an easy second use for the same hardware, and the maker has said that is the plan for it.

The maker described the method: apply max power until the setpoint is reached, then measure the system reaction time and overshoot. After that, the loop must settle so it does not oscillate around the setpoint. The configuration shown also lists the resulting values: kp 1.2, ki 0.0001 and kd 0.0.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required