Create and configure ESPHome devices for DIY smart home sensors and actuators. Write YAML configurations for ESP8266/ESP32 boards, sensors, displays, and automations. Use when building custom IoT devices, flashing ESPHome firmware, or integrating with Home Assistant. (project)
Scanned 2/12/2026
Install via CLI
openskills install majiayu000/claude-skill-registry---
name: esphome-devices
description: Create and configure ESPHome devices for DIY smart home sensors and actuators. Write YAML configurations for ESP8266/ESP32 boards, sensors, displays, and automations. Use when building custom IoT devices, flashing ESPHome firmware, or integrating with Home Assistant. (project)
---
# ESPHome Devices
Expert guidance for ESPHome DIY smart home devices.
## When to Use This Skill
- Creating custom ESP8266/ESP32 devices
- Configuring sensors (temperature, motion, etc.)
- Building smart switches and relays
- Creating LED controllers
- Setting up displays and notifications
- Integrating with Home Assistant
## Installation & Setup
```yaml
# docker-compose.yml
version: '3.8'
services:
esphome:
image: esphome/esphome
volumes:
- ./config:/config
- /etc/localtime:/etc/localtime:ro
network_mode: host
restart: unless-stopped
```
```bash
# CLI installation
pip install esphome
# Create new device
esphome wizard my_device.yaml
# Compile and upload
esphome run my_device.yaml
# Just compile
esphome compile my_device.yaml
# OTA upload
esphome upload my_device.yaml --device 192.168.1.100
# View logs
esphome logs my_device.yaml
```
## Basic Configuration
```yaml
# my_device.yaml
esphome:
name: my-device
friendly_name: My Device
platform: ESP8266 # or ESP32
board: nodemcuv2 # or esp32dev, d1_mini, etc.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Optional: Static IP
manual_ip:
static_ip: 192.168.1.100
gateway: 192.168.1.1
subnet: 255.255.255.0
# Fallback AP
ap:
ssid: "My-Device Fallback"
password: "fallback123"
captive_portal:
# Enable logging
logger:
level: DEBUG
# Enable Home Assistant API
api:
encryption:
key: !secret api_encryption_key
# Enable OTA updates
ota:
password: !secret ota_password
# Web server (optional)
web_server:
port: 80
```
### Secrets File
```yaml
# secrets.yaml
wifi_ssid: "MyWiFi"
wifi_password: "password123"
api_encryption_key: "generated-key-here"
ota_password: "ota-password"
```
## Common Sensors
### Temperature & Humidity (DHT22)
```yaml
sensor:
- platform: dht
pin: D2
model: DHT22
temperature:
name: "Temperature"
filters:
- offset: -0.5 # Calibration
humidity:
name: "Humidity"
update_interval: 60s
```
### Temperature (Dallas DS18B20)
```yaml
dallas:
- pin: D4
sensor:
- platform: dallas
address: 0x1234567890ABCDEF
name: "Temperature"
resolution: 12
```
### BME280 (I2C)
```yaml
i2c:
sda: D2
scl: D1
scan: true
sensor:
- platform: bme280
temperature:
name: "Temperature"
oversampling: 16x
pressure:
name: "Pressure"
humidity:
name: "Humidity"
address: 0x76
update_interval: 60s
```
### Motion Sensor (PIR)
```yaml
binary_sensor:
- platform: gpio
pin: D5
name: "Motion"
device_class: motion
filters:
- delayed_off: 30s
```
### Door/Window Sensor
```yaml
binary_sensor:
- platform: gpio
pin:
number: D1
mode: INPUT_PULLUP
inverted: true
name: "Door"
device_class: door
```
### Light Sensor (BH1750)
```yaml
sensor:
- platform: bh1750
name: "Illuminance"
address: 0x23
update_interval: 60s
```
### Analog Sensor
```yaml
sensor:
- platform: adc
pin: A0
name: "Soil Moisture"
update_interval: 60s
unit_of_measurement: "%"
filters:
- calibrate_linear:
- 0.85 -> 0.0
- 0.35 -> 100.0
```
## Switches & Relays
### Basic Relay
```yaml
switch:
- platform: gpio
pin: D1
name: "Relay"
id: relay1
restore_mode: RESTORE_DEFAULT_OFF
```
### Button-Controlled Relay
```yaml
binary_sensor:
- platform: gpio
pin:
number: D2
mode: INPUT_PULLUP
inverted: true
name: "Button"
on_press:
- switch.toggle: relay1
switch:
- platform: gpio
pin: D1
name: "Relay"
id: relay1
```
### Sonoff Basic
```yaml
esphome:
name: sonoff-basic
platform: ESP8266
board: esp01_1m
binary_sensor:
- platform: gpio
pin:
number: GPIO0
mode: INPUT_PULLUP
inverted: true
name: "Button"
on_press:
- switch.toggle: relay
- platform: status
name: "Status"
switch:
- platform: gpio
pin: GPIO12
name: "Relay"
id: relay
status_led:
pin:
number: GPIO13
inverted: true
```
## Lights & LEDs
### PWM LED
```yaml
output:
- platform: esp8266_pwm
pin: D1
id: led_output
light:
- platform: monochromatic
name: "LED"
output: led_output
gamma_correct: 2.8
```
### RGB LED Strip (WS2812B)
```yaml
light:
- platform: fastled_clockless
chipset: WS2812B
pin: D4
num_leds: 60
rgb_order: GRB
name: "LED Strip"
effects:
- random:
- pulse:
- strobe:
- flicker:
- addressable_rainbow:
- addressable_color_wipe:
- addressable_scan:
- addressable_fireworks:
```
### RGBW LED
```yaml
output:
- platform: esp8266_pwm
pin: D1
id: red
- platform: esp8266_pwm
pin: D2
id: green
- platform: esp8266_pwm
pin: D3
id: blue
- platform: esp8266_pwm
pin: D4
id: white
light:
- platform: rgbw
name: "RGBW Light"
red: red
green: green
blue: blue
white: white
```
## Displays
### OLED Display (SSD1306)
```yaml
i2c:
sda: D2
scl: D1
font:
- file: "fonts/arial.ttf"
id: font1
size: 14
display:
- platform: ssd1306_i2c
model: "SSD1306 128x64"
address: 0x3C
lambda: |-
it.printf(0, 0, id(font1), "Temp: %.1f°C", id(temperature).state);
it.printf(0, 20, id(font1), "Humidity: %.1f%%", id(humidity).state);
```
### E-Paper Display
```yaml
spi:
clk_pin: D5
mosi_pin: D7
display:
- platform: waveshare_epaper
cs_pin: D8
dc_pin: D1
busy_pin: D2
reset_pin: D0
model: 2.90in
lambda: |-
it.print(0, 0, id(font1), "Hello World!");
```
## Automations
```yaml
# Time-based automation
time:
- platform: homeassistant
id: homeassistant_time
on_time:
- seconds: 0
minutes: 0
hours: 7
then:
- light.turn_on: led
# State-based automation
binary_sensor:
- platform: gpio
pin: D5
name: "Motion"
on_press:
then:
- light.turn_on:
id: led
brightness: 100%
transition_length: 1s
on_release:
then:
- delay: 5min
- light.turn_off:
id: led
transition_length: 2s
# Template automation
interval:
- interval: 1min
then:
- if:
condition:
sensor.in_range:
id: temperature
above: 25
then:
- switch.turn_on: fan
else:
- switch.turn_off: fan
```
## ESP32 Bluetooth
### BLE Presence Detection
```yaml
esp32_ble_tracker:
scan_parameters:
interval: 1100ms
window: 1100ms
active: true
binary_sensor:
- platform: ble_presence
mac_address: AA:BB:CC:DD:EE:FF
name: "Phone Present"
```
### Xiaomi Sensors
```yaml
esp32_ble_tracker:
sensor:
- platform: xiaomi_lywsd03mmc
mac_address: "A4:C1:38:XX:XX:XX"
bindkey: "your-bind-key"
temperature:
name: "Temperature"
humidity:
name: "Humidity"
battery_level:
name: "Battery"
```
## Best Practices
1. **Use secrets.yaml** for sensitive data
2. **Set static IPs** for reliability
3. **Enable fallback AP** for recovery
4. **Use meaningful names** for HA integration
5. **Add filters** for sensor smoothing
6. **Enable OTA** for remote updates
7. **Test with logs** before deploying
8. **Use restore_mode** for switches
9. **Add status LED** for debugging
10. **Document pin assignments**
## Troubleshooting
```yaml
# Enable verbose logging
logger:
level: VERBOSE
# Check WiFi signal
sensor:
- platform: wifi_signal
name: "WiFi Signal"
update_interval: 60s
# Restart button
button:
- platform: restart
name: "Restart"
# Safe mode
button:
- platform: safe_mode
name: "Safe Mode"
```
No comments yet. Be the first to comment!