I am in a building with a two-pipe system with building-controlled heat/cool service with a fan coil unit (convector) with the fan speed controlled on the FCU, so all I can really control is the thermostat going on and off. Since I'm in the process of making my small condo (500 sq ft) smarter, so as long as I am putting an ESP32-S3 on the wall, I wanted to made it more than just a thermostat.

The hardware stack is an ESP32-S3-Zero driving a 2.42" SSD1309 OLED display over SPI, an SHTC3 temperature/humidity sensor over I2C, a KY-040 rotary encoder for input, a KY-018 photoresistor for ambient light sensing to auto-dim the display, a V1222 IR receiver, and an SRD-05VDC relay switching the FCU. There is an underpowered HX-53 IR blasterso it will be updated with a proper TSAL6100 LED soon. Power comes from a compact 120V to 5V module mounted behind the wall, keeping all line voltage hidden.

At its heart, this is a thermostat with a screen, and the mode (heat, cool, off) is controlled by pressing the encoder and choosing an option - this is really only changed when the building changes the system from heat to cool and this strictly inverts the relay logic to control the FCU.  It adds an IR blaster to allow HA control over IR devices, notably quick launch RokuTV buttons.  The IR receiver will allow for future remote control of adjusting temperatures locally, but also over HA with the ability to expose it to control any other HA device (lights, outlets) via IR remote control.

The firmware is built entirely in ESPHome with a significant amount of custom C++ lambda code for the display rendering, relay logic, encoder handling, and mode selection UI. The display shows indoor temperature (large center), outside temperature and dew point (left column), set temperature and humidity (right column), and a hand-drawn 20×16 pixel weather sprite in the upper left — with 18 unique sprites covering every met.no weather condition including a day/night variant for cloudy conditions using the sun elevation entity from Home Assistant.  Future IR firmware updates are planned.

The enclosure evolved significantly during the build. The original plan was a vintage Honeywell T651A housing for a retro look, but the final build landed on a Wiremold NMW3 surface-mount raceway box in canyon black with a screwless nickel thermoplastic faceplate.  The OLED hole was drilled/dremeled and black foil tape was added to create a clean bezel.  The knob is a 40mm brushed aluminum potentiometer knob with no position indicator, since the encoder is infinite rotation. The result has an industrial-retro aesthetic that looks intentional rather than DIY.

The relay and 120V wiring are inside the gang box, with the transformer mounted on the back side of the wall in a closet. The ESP32 module, OLED, and all low-voltage components are inside the Wiremold enclosure, which mounts directly over the gang box opening using the existing screw holes.  The entire thermostat unit itself is connected via a 3-pin JST micro harness so it can easily be removed and serviced without exposing the gang box.  All internal connections are dupont headers to allow for individual sensor serviceability in the future without resoldering.

While designed to work fully standalone without any network dependency, the device integrates with Home Assistant over ESPHome's native API, exposing temperature, humidity, set point, and mode as entities. Outside weather data including conditions, temperature, and dew point are pulled from Met.no via Home Assistant and displayed on the device. A HomeKit integration layer is being updated as needs evolve for additional functions and to ensure that HK/HA cannot take control of the mode control given in a closed loop system this is a mode recognition rather than control.