Skip to the content
2 layers140 × 64 mmThermostat v3, the printed circuit board in 3D

Thermostat v3

Connicpu/thermostat

DIY Zigbee thermostat (ESP32-C6) with day/night schedule and a Home Assistant Lovelace card

Size
140 × 64 mm
Copper layers
2
Thickness
1.6 mm
Parts
101
Nets
79
Pads
331
Tracks, vias
916, 79
Pours
18
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
13 Oct 2026
Updated
30 Oct 2026

Overview

Thermostat v3 is an open-source printed circuit board by Connicpu, from the Connicpu/thermostat repository on GitHub, published under the MIT licence. It is a 2-layer board of 140 × 64 mm with 101 parts on 79 nets, routed with 916 tracks and 79 vias.

It is built around the ESP32-C6-WROOM-1-N8, T405-600B and LMR16006XDDCR, with the SHT40-AD1B-R2, MOC3063S and STWD100NYWY3F among its other parts. Its parts include 33 resistors, 27 capacitors, 8 ICs, 8 diodes and 5 switches. It belongs with the home automation and IoT and radio and wireless boards and the ESP32 and RISC-V boards of this library.

Main components

12

README

README.md

Thermostat V3

Shared as-is — not seeking contributions or pull requests.

ESP32-C6 Zigbee thermostat for single-stage HVAC (R/C/W/Y/G), with e-paper display, SHT40 temperature/humidity sensor, and triac outputs. Designed for JLCPCB assembly.

Gallery

Assembled V3 case — home screen at 70.6 °F, heating to 70°, Zigbee connected, 21:05 (Day)

On-device screens (296×128 e-paper, shown at 2×; °F):

HomeMenu
home screen, 21:05main menu
ScheduleBoost to
schedule menuboost to target

Home Assistant Lovelace card (install):

Heat, day (light)Cool, night (dark)Timed heat boost (dark)
card, heating by day, light themecard, cooling at night, dark themecard, timed heat boost running, dark theme

More: case renders in case/, every menu screen in firmware/README.md.

Case

The case (case/thermostat_case.scad) is a 147 × 71 × 26.25 mm PETG shell, backplate, and panel carrier for a Bambu P2S with a 0.4 mm nozzle. The carrier holds the display panel with its nominal back 4.45 mm above the board. The panel rests on stops 0.15 mm under that, located by the long-edge fences and the cable-end posts. Four bridges in the shell press the border. The flex plugs into J4 with the display panel seated on the stops. A thin corner can leave J4; the shell comes off, the tail is pressed back in, and the slider is closed. A fingernail shuts the slider on the ear's +x face, and a fingertip on the carrier push opens it toward +x. The shell clips to the backplate. It does not clamp the board. The three buttons snap into the face from the inside and stay in the shell. Each cap is a 65° cone and one 0.40 mm leaf. The leaf is a cantilever, free length 4.35 mm, and it only keeps the cap in the face. The print adds a 0.34 mm nub on the cone top under the free end so the leaf's bed-facing face is a bridge, and that nub is snapped off before the cap goes into the tube. case/ASSEMBLY.md is the build order, the fold dimensions, and the service steps.

Section through the sensor duct at the SHT40 (board y = 32). The two ribs divide the rear cavity; the front curtain and partition divide the face side.

Air inside the case is split into three zones:

  • Hot zone (left). The triacs, the opto drive side, the buck, and the bridge. Slots in the bottom edge and the lower left wall let room air in. Matching slots in the top edge and the upper left wall let it out. A front curtain just left of the display keeps that air from spilling under the panel.
  • Middle zone. The ESP32-C6, the display, and the wiring hole. This zone has no vents of its own. Close the hole in the wall around the cable with a printed PETG plug so that air stays in the middle zone.
  • Sensor duct (right). The SHT40 island. Bottom-edge slots and a band of slots on the right wall feed it. The top-edge slots and the front island slots exhaust it. Two ribs on the backplate and a partition in the shell separate it from the middle zone. The backplate under the island is solid, because slots there would face the drywall and open the duct onto the wall.

The ribs stop 0.4 mm short of the board, and above the lip they run out to the lip's outer face so they come within 0.3 mm of the shell. The zone walls keep at least 0.5 mm off the parts, including the USB-C shield legs and locating peg on the back of the board. Front clearances include the ±0.16 mm board-thickness tolerance.

Expected benefit. A zonal model puts the triac-induced sensor rise about 10–25% lower than the same case with one undivided cavity (no ribs, partition, or curtain). That is a model, not a measurement. Most of the remaining error is heat flowing along the PCB ground pour, which a case cannot stop, and the vents themselves carry only a small share of the hot zone's heat. The walls matter more than the hole count: they also help keep wall-cavity air from the wiring hole away from the sensor.

Check it. Log a heat call and a cool call against a reference thermometer, with a clamp meter on W, Y, and G. Taping the edge slots removes only the vents, about 6% of the modeled sensor rise; the ribs, partition, and curtain stay, so expect little difference. Measuring what the walls do needs a second print without the ribs, partition, and curtain. The two offsets add, so use only one. CONFIG_THERMO_SELF_HEAT_OFFSET_C100 is build-time (menuconfig, then a reflash) and defaults to 0. ZHA sets the thermostat's LocalTemperatureCalibration attribute, in 0.1 °C steps over ±2.5 °C, applied on top of that build-time offset. About −0.1 °C is an unmeasured guess until a reference-thermometer log exists.

board.stl is not in the repo. From the repo root, export the populated board with KiCad 9 (do not pass --drill-origin; scripts/case_fit.py places the model):

text
kicad-cli pcb export stl -o board.stl --force --cut-vias-in-body kicad/thermostat-v3.kicad_pcb

The script header also has the OpenSCAD lines for the assembly-frame back.stl, shell.stl, carrier.stl, and the seated and pressed button meshes it checks against. The flex fold, the tail insertion, the carrier clearances, and the button travel run even when board.stl is absent.

  • kicad/: KiCad 9 project
  • fab/: Gerbers plus JLC BOM/CPL
  • part-plan.md: part choices, sources, cost estimate
  • v2-original/: the previous V2 design

Warning: don't connect USB while 24VAC is wired unless you use a USB isolator. First-time flashing on Arch Linux: docs/flashing-arch.md.

This project is shared as-is. It is not seeking contributions or pull requests.

License

MIT — see LICENSE. Third-party notices (Lit, Material Design Icons, DejaVu/Bitstream, Espressif, Good Display sequences, LCSC STEP models, …) are in NOTICE.

Security

This is a DIY thermostat that switches 24 VAC HVAC loads. Treat the Zigbee network perimeter as the security boundary:

  • OTA is unsigned. The device accepts Zigbee OTA images and installs them with esp_ota_* (rollback via pending-verify exists). Anyone who can run an OTA server the device trusts can push firmware. There is no image signature check.
  • Join policy is open. install_code_policy is false, so pairing uses the Zigbee 3.0 well-known trust-center link-key path (normal for Home Assistant / ZHA). Don't leave the network open to joining when you aren't pairing.
  • USB Serial/JTAG console is enabled in sdkconfig.defaults. Physical USB access to the board gives a console.
  • Factory reset from the on-device menu is intentional.

See also MANUFACTURER_ID.md for the Zigbee manufacturer code (0x434E: this project's DIY code from the quiet 0x3000–0x5FFF band; not CSA-assigned, not certified).

Third-party / display provenance

E-paper driver sequences in firmware/components/display/ssd1680.c follow Good Display's GDEY029T94 sample/datasheet (not a verbatim copy of their sample tree). Full attribution is in NOTICE.

Parts

101
QtyValueFootprintReferences
1110kResistor_SMD:R_0402_1005MetricR2, R5, R6, R7, R8, R9, R11, R12, R20, R30, R40
61uF 50VCapacitor_SMD:C_0603_1608MetricC30, C31, C32, C33, C34, C35
4100nFCapacitor_SMD:C_0402_1005MetricC3, C8, C10, C11
410uFCapacitor_SMD:C_0603_1608MetricC4, C5, C7, C39
41uFCapacitor_SMD:C_0402_1005MetricC6, C9, C36, C38
44.7uF 100V X7RCapacitor_SMD:C_1210_3225MetricC1, C2, C41, C42
4M4MountingHole:MountingHole_4.3mm_M4H1, H2, H3, H4
3100RResistor_SMD:R_0805_2012MetricR22, R32, R42
3100R DNPResistor_SMD:R_0805_2012MetricR24, R34, R44
3100nF 50V DNPCapacitor_SMD:C_0805_2012MetricC20, C21, C22
31kResistor_SMD:R_0805_2012MetricR23, R33, R43
3220RResistor_SMD:R_0402_1005MetricR21, R31, R41
3B5819Wtstat:SOD-123_B5819WD6, D7, D8
3MOC3063Ststat:MOC3063SU6, U7, U8
3T405-600Btstat:TO-252-2_TRIAC_DPAKQ2, Q3, Q4
24.7kResistor_SMD:R_0402_1005MetricR13, R14
25.1kResistor_SMD:R_0402_1005MetricR3, R4
2SS210tstat:SMA_SS210D3, D4
1+3V3tstat:TestPoint_Pad_D1.5mmTP3
10.5A 60V PTCtstat:F1812_PTCF1
1100kResistor_SMD:R_0402_1005MetricR50
11MResistor_SMD:R_0402_1005MetricR15
11kResistor_SMD:R_0402_1005MetricR10
12.2RResistor_SMD:R_0603_1608MetricR16
12.9in EPD FPCtstat:FPC24_AFC07J4
122uHInductor_SMD:L_Sunlord_SWPA6045SL1
13.3R 0.75W pulseResistor_SMD:R_1206_3216MetricR51
133kResistor_SMD:R_0402_1005MetricR1
14.7uF 25VCapacitor_SMD:C_0805_2012MetricC40
147uF 63Vtstat:CP_Radial_D8.0mm_P3.50mmC43
147uHInductor_SMD:L_APV_ANR3015L2
1AO3400Atstat:SOT-23_AO3400AQ1
1BOOTtstat:SW_TS1187ASW2
1DOWNtstat:SW_TS1187ASW4
1ESP32-C6-WROOM-1-N8tstat:ESP32-C6-WROOM-1U3
1GNDtstat:TestPoint_Pad_D1.5mmTP2
1HVAC R C W Y Gtstat:HVAC_TERM_15EDGRCJ1
1LMR16006XDDCRtstat:SOT-23-6_LMR16006U1
1LOGOLOGO_CATLOGO1
1MB10Ststat:MBS_MB10SD1
1MODEtstat:SW_TS1187ASW5
1REDtstat:LED_0603_KTD5
1RESETtstat:SW_TS1187ASW1
1SHT40-AD1BSensor_Humidity:Sensirion_DFN-4_1.5x1.5mm_P0.8mm_SHT4x_NoCentralPadU5
1SMBJ40CAtstat:D_SMB_TVSD2
1STWD100NYWY3Ftstat:SOT-23-5_STWD100U4
1Stemma QTtstat:JST_SH4_STEMMAJ3
1UPtstat:SW_TS1187ASW3
1USB-Ctstat:USB_C_Receptacle_HRO_TYPE-C-31-M-12J2
1USBLC6-2SC6tstat:SOT-23-6_USBLC6U2
1VBUStstat:TestPoint_Pad_D1.5mmTP4
1VIN_HVtstat:TestPoint_Pad_D1.5mmTP1

More from Connicpu/thermostat

1
  • 2 layers139.7 × 63.5 mmThermostat V2, the printed circuit board in 3D

    Thermostat V2

    Connicpu/thermostat

    DIY Zigbee thermostat (ESP32-C6) with day/night schedule and a Home Assistant Lovelace card

    72 partsMIT

Similar boards

  • 2 layers120.4 × 85.7 mmESPrinkler Retic PCB, the printed circuit board in 3D

    ESPrinkler Retic PCB

    slippery-carrot/ESPrinkler-Retic-Controller

    8-Zone reticulation controller based on ESPHome for Home Assistant

    142 parts6GPL-3.0
  • 2 layers81.2 × 71.6 mmEveningStar, the printed circuit board in 3D

    EveningStar

    ciaassured/eveningstar-hardware

    Hardware design for the Eveningstar ESP32-based Morningstar MeterBus interface.

    153 parts4AGPL-3.0
  • 2 layers110 × 85 mmAvtech agv carrier, the printed circuit board in 3D

    Avtech agv carrier

    eerdemgundogdu/avtech-agv-main

    Software and carrier PCB design for a line-following forklift AGV built by CU AVTECH for the Sanayide Robotik Uygulamalar 2026 competition.

    84 partsMIT
  • 4 layers92 × 92 mmRtihu, the printed circuit board in 3D

    Rtihu

    AMSAT-NA/PacSatDocs

    395 parts4
  • 6 layers111.8 × 111.8 mmRt ihu, the printed circuit board in 3D

    Rt ihu

    zmetzing/rt-ihu

    Radiation Tolerant IHU (Flight Computer)

    524 partsBSD-2-Clause
  • 2 layers68.6 × 53.3 mmStm32f4 uno poe, the printed circuit board in 3D

    Stm32f4 uno poe

    easy-smart/stm32f4_uno_poe

    96 parts
  • 2 layers100 × 69.5 mmPanoboard2, the printed circuit board in 3D

    Panoboard2

    CapnKernel/panoboard2

    A new controller board for Panasonic bread makers

    76 parts

Questions

How big is the Thermostat v3 PCB?

It measures 140 × 64 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Thermostat v3 use?

101 parts, built around the ESP32-C6-WROOM-1-N8, T405-600B, LMR16006XDDCR and SHT40-AD1B-R2. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Thermostat v3 KiCad files?

From the Connicpu/thermostat repository on GitHub, at the commit this page was made from: the board is kicad/thermostat-v3.kicad_pcb and its schematic kicad/thermostat-v3.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Thermostat v3 design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).