ESPHome config builder
Build ESPHome device YAML from a board and a catalogue of sensors, switches, lights, and buses — with live output, a secrets.yaml template, and a linter for pin conflicts, strapping and flash pins, ADC2 with Wi-Fi, I²C address clashes, and ESP8266/ESP32 differences.
Added · updated 28 October 2026
Works with
- Board pinouts IoT and embeddedOpen in ESPHome builder there turns its board and planned pins into components here
How to use it
Builder
Pick a board (ESP32, ESP32-S2, -S3, -C3, -C6, or an ESP8266 such as the D1 mini or NodeMCU),
give the device a hostname and a friendly name, and choose the framework. The Wi-Fi details
are written as !secret references by default. You can turn the native API (with an
encryption key), OTA updates, the web server, and the fallback hotspot with its captive
portal on or off.
Add components from the catalogue: DHT, DS18B20 (one_wire + dallas_temp), BME280, BMP280,
SHT3x, AHT10/20, HTU21D, SCD4x, BH1750, INA219, ADS1115, ADC inputs with filters, pulse
counters, HX711, HC-SR04, rotary encoders, PMS5003, GPIO binary sensors, relays, PWM and GPIO
outputs, dimmable, RGB, and on/off lights, addressable LED strips (esp32_rmt_led_strip or
neopixelbus), status LED, servo, SSD1306 OLED, SNTP time, IR receiver, Wi-Fi info, and deep
sleep. When a component needs a bus, hub, or output, the builder adds one too. New pins are
taken from free pins that are safe at boot: the tool skips strapping, flash, USB, console
UART, and PSRAM pins, and the board’s onboard LED and default I²C pins.
The YAML updates as you type. You can copy it or download it as <name>.yaml. It uses the
current syntax (ESPHome 2024.6 and later): esp32: board: with framework: type:, ota: as
a list with platform: esphome, one_wire: with dallas_temp, bme280_i2c, and
attenuation: 12db. The secrets.yaml panel lists every secret the config uses. It fills
in a random API encryption key (32 bytes, base64) and random OTA and hotspot passwords,
all generated in your browser.
Checks
The linter runs on the generated YAML and on anything you paste in:
-
Pins: a pin used twice (unless every use sets
allow_other_uses), flash pins, PSRAM pins on boards that have PSRAM, octal-PSRAM pins on the S3, pins the chip does not have, outputs on input-only pins (ESP32 GPIO34–39), pull-ups where there is no internal pull-up, strapping pins (respectingignore_strapping_warning), native USB pins, and the console UART pins while the logger uses UART0. -
ADC: a pin with no ADC channel; ADC2 while Wi-Fi is on, which is an error on the ESP32, S2, and S3 and a warning on the C3, where ADC2 is unreliable; ESP8266 analog reads that are not on
A0/VCC; attenuation on the ESP8266; and the old name11db. -
Buses: a missing
i2c:,spi:,uart:, orone_wire:bus or ADS1115 hub; a bus ID that does not exist; and I²C address clashes on the same bus, using each driver’s default address when none is given (for example, an INA219 and an HTU21D both sit at 0x40). -
Platform: ESP32-only components on the ESP8266 (
ledc, RMT LED strips, touch, BLE, camera, internal temperature) and the reverse (esp8266_pwm); Arduino-only drivers (neopixelbus, FastLED) under ESP-IDF; and the ESP-IDF framework on the ESP8266. -
Config: the hostname rules (lowercase letters, digits, and hyphens; 31 characters at most), duplicate IDs, references to missing IDs, binary outputs driving dimmable lights, RTC-capable wake-up pins for deep sleep,
api: password,ota:written as a map,dallas:, plain-text Wi-Fi passwords, and a missing framework type.
substitutions: are expanded before checking. Files pulled in with !include and
packages: are not read.
Import
Paste an existing configuration or open a file. !secret, !lambda, !include, and the
other ESPHome tags are understood, and 64-bit 1-Wire addresses keep every digit. You can
read the checks without changing anything, or press Load into builder. Components the
catalogue knows become editable forms. Anything else, such as globals:, scripts, template
sensors, and unfamiliar platforms, is kept as it is and written back unchanged, along with
any extra options the forms do not cover. YAML parsing uses js-yaml 4.1.0, loaded from
jsDelivr the first time you use this tab.
The Board pins tab lists every GPIO on the chosen board, marking pins as free, use with care, or avoid, with notes. The pin data comes from the Espressif datasheets (the same source as the Board pinouts tool). Clone boards sometimes differ, so check the silkscreen.
Sharing
Share link copies a URL that opens this tool with your current settings — every value it remembers between visits, packed into ?s=. Opening a link replaces your saved settings for this tool. Pasted YAML in the importer is not included, and literal Wi-Fi passwords are blanked (secret names are kept).
Feedback is a gift. Something to improve, a feature to add, or a bug? Tell me.
Runs entirely in your browser; nothing you type leaves this page.