Chris Collins

Tools · embedded

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

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 (respecting ignore_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 name 11db.

  • Buses: a missing i2c:, spi:, uart:, or one_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).

Runs entirely in your browser; nothing you type leaves this page.