Skip to the content
2 layers160 × 95 mmPlaced, the printed circuit board in 3D

An open-source OpenTherm heating controller PCB

Size
160 × 95 mm
Copper layers
2
Thickness
1.6 mm
Parts
99
Nets
72
Pads
325
Tracks, vias
0, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
20 Oct 2026
Updated
29 Oct 2026

Overview

Placed is an open-source printed circuit board by Zepheus, from the Zepheus/opentherm_heating_controller repository on GitHub. It is a 2-layer board of 160 × 95 mm with 99 parts on 72 nets.

It is built around the ESP32-C6-WROOM-1-N8, LDL1117S33R and USBLC6-2SC6, with the 1N4148WS, AO3400A and RT314005 among its other parts. Its parts include 32 resistors, 20 diodes, 11 connectors, 10 capacitors and 8 switches. It belongs with the home automation and IoT boards and the ESP32 and RISC-V boards of this library.

Main components

9

README

README.md

Andiron

ESP32-C6 heating controller for a UK wiring centre, built for Home Assistant and ESPHome. Board revision v1.0

Andiron v1.0, 3D render

Andiron is an isolated I/O board for a domestic heating system. It sits in the wiring centre, switches the zone valves and boiler demand through four volt-free changeover relays, and talks to the boiler over OpenTherm. All the logic (schedules, thermostats, weather compensation) lives in Home Assistant. The board was designed around an ESPHome firmware, which will be written and published once the first boards are in hand.

MCUESP32-C6-WROOM-1 (WiFi 6, BLE), USB-C power and programming
BoilerOpenTherm master (opto-isolated, fused against a 230 V miswire)
Outputs4 × volt-free changeover relays (CH1–CH4), NC / COM / NO terminals, 250 VAC 3 A, each channel isolated from the others
Sensors2 × 1-Wire probe terminals (flow, outdoor), 2 × Qwiic I²C (one for the OLED, on a cable), 8-pin spare GPIO header
Board160 × 95 mm, 2 layers, wall-hanging with all cables from below or the left, 6.4 mm isolation around every relay channel, JLCPCB assembly

Mains voltage. The relay contacts can switch 230 V. Do not build or install it unless you are competent to work on mains wiring, and read the safety notes in docs/design.md first. Status: v1.0 passes ERC, DRC and the spacing checks, but no board has been built or tested yet.

Renders

TopBottom
topbottom
front copper and silkscreenback copper and silkscreen, mirrored

The 3D views use stand-in models for the ESP32-C6 module (ESP32-S3-WROOM-1, same body) and the USB-C receptacle (GCT USB4105, same footprint).

Bill of materials

The full BOM with LCSC part numbers and cost estimates is in docs/BOM.md; the JLCPCB upload file is docs/bom/andiron-bom-jlc.csv. At LCSC prices from October 2026, components came to roughly $16 per board, or about $24 per board for a run of five once Extended-part loading fees are included. The four relays are $7.60 of that. PCB, assembly and shipping come on top, from the JLCPCB quote.

Getting started

Tools

ToolUsed for
KiCad 10schematic, layout, DRC, renders (kicad-cli)
Konnect MCP server (0.13, KiCad 10 plugin)lets Claude Code read and edit the KiCad project, search the JLCPCB parts database
Freerouting 2.x + Javaautorouting
easyeda2kicadimporting JLC/LCSC symbols, footprints and 3D models into lib/
Python 3the scripts in tools/

Working on the board with Claude Code and Konnect

  1. Install KiCad 10 and Konnect, and put konnect on your PATH (or point .mcp.json at it).
  2. Open the repository in Claude Code and approve the Konnect server when asked. Claude can then read and edit the schematic and board, run ERC and DRC, and search JLCPCB parts.
  3. Ask Konnect to download the JLCPCB parts database once (download_jlcpcb_database); tools/bom.py reads the same file for prices.
  4. Start with docs/requirements.md and docs/design.md for what the board does and why.

The layout is generated, not drawn by hand: part positions live in tools/layout/place.py, shared dimensions (relay row, terminals, isolation zones, slots, antenna keep-out) in tools/layout/geometry.py, and hand-laid copper in tools/route/prep_board.py. Edit those and rerun the pipeline rather than moving tracks in the PCB editor.

Regenerating outputs

sh
KPY=/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3
$KPY -I tools/sync_netlist.py "$PWD" tools/route/placed.kicad_pcb   # after a schematic change
$KPY -I tools/layout/place.py tools/route/placed.kicad_pcb          # after a placement change
tools/route/run_pipeline.sh "$PWD" 40    # route, pour, silkscreen, DRC, sanity (close the PCB editor first)
python3 tools/bom.py                     # docs/BOM.md and docs/bom/andiron-bom-jlc.csv
tools/render.sh                          # docs/images/

Repository layout

PathWhat
heating-controller.kicad_pro / .kicad_sch / .kicad_pcbKiCad 10 project (root sheet plus power_mcu, opentherm, relays)
heating-controller.kicad_drucustom DRC rules: mains isolation, clearances, track widths
.konnect/project.jsondesign rules in prose, read by Konnect during layout
lib/project symbols, footprints and 3D models (from JLC/EasyEDA)
docs/requirements.mdnumbered requirements (what)
docs/design.mddecisions, safety framing, GPIO map, layout, open questions (why)
docs/layout-notes.mdwhat worked and what did not in placement and routing
docs/BOM.md, docs/bom/bill of materials and JLCPCB upload file
tools/routing pipeline, BOM, renders, 3D model sync, checks; see tools/README.md

Open questions that must be answered before ordering are at the end of docs/design.md; the boiler model code is the main one.

License

Open hardware. The board design and documentation are licensed under the CERN Open Hardware Licence v2, Permissive, the hardware counterpart of MIT; the scripts in tools/ are under the MIT License. See LICENSE.

Parts

99
QtyValueFootprintReferences
81N4148WSDiode_SMD:D_SOD-323D101, D102, D103, D104, D201, D202, D203, D204
610kResistor_SMD:R_0603_1608MetricR4, R5, R6, R7, R9, R11
61kResistor_SMD:R_0603_1608MetricR8, R10, R113, R123, R133, R143
5100Resistor_SMD:R_0603_1608MetricR111, R121, R131, R141, R203
4100kResistor_SMD:R_0603_1608MetricR112, R122, R132, R142
4100nFCapacitor_SMD:C_0603_1608MetricC5, C7, C9, C10
4AO3400APackage_TO_SOT_SMD:SOT-23Q101, Q102, Q103, Q104
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
4RT314005jlc:RELAY-TH_RT314005_HF115F-PINSK101, K102, K103, K104
34.7kResistor_SMD:R_0603_1608MetricR12, R13, R14
3Fiducial_1mm_Mask3mmFiducial:Fiducial_1mm_Mask3mmFID1, FID2, FID3
210uFCapacitor_SMD:C_0805_2012MetricC3, C4
2330Resistor_SMD:R_0603_1608MetricR15, R204
25.1kResistor_SMD:R_0603_1608MetricR1, R2
2SMF5.0ADiode_SMD:D_SOD-123FD1, D2
11.5kResistor_SMD:R_0603_1608MetricR205
115V BZT52C15Diode_SMD:D_SOD-123D206
11A 250V fastFuse:Fuse_Littelfuse-NANO2-451_453F201
11MResistor_SMD:R_0603_1608MetricR3
11nFCapacitor_SMD:C_0603_1608MetricC1
11uFCapacitor_SMD:C_0603_1608MetricC8
1220Resistor_SMD:R_0603_1608MetricR202
122uFCapacitor_SMD:C_0805_2012MetricC6
1330Resistor_SMD:R_1206_3216MetricR201
1470uF/16VCapacitor_SMD:CP_Elec_8x10C2
14V3 BZT52C4V3Diode_SMD:D_SOD-123D207
14V7 BZT52C4V7Diode_SMD:D_SOD-123D205
1BOOTjlc:SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5SW2
1BTN1jlc:SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5SW3
1BTN2jlc:SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5SW4
1CH1 NC/COM/NOjlc:CONN-TH_3P-P5.00_WJ128V-5.0-3PJ111
1CH2 NC/COM/NOjlc:CONN-TH_3P-P5.00_WJ128V-5.0-3PJ112
1CH3 NC/COM/NOjlc:CONN-TH_3P-P5.00_WJ128V-5.0-3PJ113
1CH4 NC/COM/NOjlc:CONN-TH_3P-P5.00_WJ128V-5.0-3PJ114
1ESP32-C6-WROOM-1-N8jlc:WIRELM-SMD_ESP32-C6-WROOM-1U1
1FLOWjlc:CONN-TH_3P-P3.50_KF350-3.5-3PJ3
1K1LED_SMD:LED_0603_1608MetricLED101
1K2LED_SMD:LED_0603_1608MetricLED102
1K3LED_SMD:LED_0603_1608MetricLED103
1K4LED_SMD:LED_0603_1608MetricLED104
1LDL1117S33RPackage_TO_SOT_SMD:SOT-223-3_TabPin2U2
1LTV-817S (RX)jlc:OPTO-SMD-4_L4.6-W6.5-P2.54-LS10.3-BLU202
1LTV-817S (TX)jlc:OPTO-SMD-4_L4.6-W6.5-P2.54-LS10.3-BLU201
1OLED (Qwiic) GND/3V3/SDA/SCLConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalJ5
1OT (24V max)jlc:CONN-TH_P3.50_KF350-3.5-2PJ201
1OT_ACTLED_SMD:LED_0603_1608MetricLED2
1OUTDOORjlc:CONN-TH_3P-P3.50_KF350-3.5-3PJ4
1QWIICConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalJ6
1RESETjlc:SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL_H1.5SW1
1S8550Package_TO_SOT_SMD:SOT-23Q201
1SMAJ24ADiode_SMD:D_SMAD208
1SPARE GPIOConnector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ7
1STATUSLED_SMD:LED_0603_1608MetricLED1
1USB-C 16PConnector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1USBLC6-2SC6Package_TO_SOT_SMD:SOT-23-6U3

Similar boards

  • 2 layers122 × 93 mmJBC Multitool, the printed circuit board in 3D

    JBC Multitool

    Tropaion/JBC_Multitool

    A slot extension device for JBC soldering stations with only one soldering iron terminal

    52 parts3GPL-3.0
  • 4 layers76 × 72 mmKeychain rev b panel, the printed circuit board in 3D

    Keychain rev b panel

    olerast67/emotion-keychain

    Брелок с OLED-экраном и анимированными эмоциями

    168 partsApache-2.0
  • 4 layers68 × 60 mmRoboCore V2, the printed circuit board in 3D

    RoboCore V2

    Plastal-Bot-Builders/RoboCoreDocumentation

    RoboCore is a classroom robot kit and coding platform, designed and built in Zambia by Plastal-Bot Builders (Lusaka).

    146 partsMIT
  • 4 layers60 × 60 mmUmmon, the printed circuit board in 3D

    Ummon

    JonaWe/ummon

    ummon (from German Umgebungsmonitor, "environment monitor") is an ESP32-C6 based environmental sensor board with USB-C power.

    95 parts
  • 2 layers85 × 56 mmOrange juice board, the printed circuit board in 3D

    Orange juice board

    jeji/orange_juice

    A orange pi zero shield board for 3D printer with klipper features

    56 parts13GPL-3.0
  • 2 layers99 × 56 mmOrange juice board, the printed circuit board in 3D

    Orange juice board

    jeji/orange_juice_2

    For Orange Pi zero 2 with klipper and more advance feature

    56 parts5
  • 2 layers100 × 85 mmESP32 MediaCarrier routed, the printed circuit board in 3D

    ESP32 MediaCarrier routed

    xmyoot/esp32-media-carrier

    ESP32 multimedia carrier board with 7–24 V DC buck regulator, 3.2 W Class-D I2S audio amp, WS2812 LED ring driver, and SPI TFT display header

    97 partsMIT
  • 4 layers63.6 × 86 mmBECom, the printed circuit board in 3D

    BECom

    rjsc/BECom

    BECom - Battery Emulator Companion - Open Source Hardware, designed to run dalathegreat/Battery-Emulator

    276 parts2GPL-3.0

Questions

How big is the Placed PCB?

It measures 160 × 95 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Placed use?

99 parts, built around the ESP32-C6-WROOM-1-N8, LDL1117S33R, USBLC6-2SC6 and 1N4148WS. 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 Placed KiCad files?

From the Zepheus/opentherm_heating_controller repository on GitHub, at the commit this page was made from: the board is tools/route/placed.kicad_pcb and its schematic heating-controller.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Placed design in my own project?

Its repository states no licence, so its author keeps all rights: ask Zepheus before reusing the design.