ESPHome cho ESP32: đưa relay 4 kênh vào Home Assistant không cần viết code Arduino
Dùng ESPHome Device Builder khai báo relay 4 kênh, nút nhấn, cảm biến Wi-Fi bằng YAML; nạp lần đầu qua USB, sau đó qua Wi-Fi; so sánh với cách Arduino + MQTT.
ESPHome là cách đưa ESP32 vào Home Assistant mà không viết chương trình Arduino: chỉ khai báo trong một tệp cấu hình YAML là chân nào nối relay, chân nào nối nút nhấn, ESPHome tự sinh chương trình, biên dịch và nạp vào mạch. Thiết bị nối thẳng với Home Assistant qua giao thức riêng của ESPHome, không cần máy chủ MQTT. Bài này làm lại đúng mạch relay 4 kênh của bài Home Assistant qua MQTT trong cùng loạt, để thấy hai cách khác nhau ở đâu.
1. ESPHome làm gì
- ESPHome Device Builder là một ứng dụng chạy trong Home Assistant: nơi soạn tệp YAML, biên dịch và nạp chương trình cho từng mạch.
- Mỗi mạch có một tệp YAML. Các khối như
switch,binary_sensor,sensorứng với công tắc, nút nhấn, cảm biến; mỗi mục hiện thành một thực thể trong Home Assistant. - Lần đầu nạp qua dây USB; từ lần sau sửa YAML rồi nạp qua Wi-Fi.
2. Chuẩn bị
- ESP32 DevKit V1 30 chân.
- Module relay 4 kênh 5 V kích mức thấp, một nút nhấn.
- Breadboard, dây cắm, dây USB nạp code (dây có lõi dữ liệu, không phải dây chỉ sạc).
- Home Assistant bản Home Assistant OS (có mục Apps). Bản chạy bằng Docker thì cài ESPHome Device Builder riêng trên máy tính theo hướng dẫn của esphome.io.
3. Sơ đồ nối

Relay đóng cắt điện 220 V phải lắp trong hộp kín, dây lưới điện có cầu chì và đủ tiết diện; khi chưa quen làm điện, chỉ thử với đèn LED hoặc tải điện áp thấp.
4. Năm bước làm

- Cài ESPHome Device Builder: trong Home Assistant vào Settings › Apps › Install App, chọn ESPHome Device Builder, bấm Install, Start, rồi Open Web UI.
- Tạo thiết bị: bấm Create device, chọn New Device Setup, đặt tên
relay-pyworld, chọn loại ESP32. Trình tạo sinh sẵn tệp YAML có Wi-Fi, khóa mã hóa API và mật khẩu nạp qua mạng. Bấm Edit, giữ nguyên phần đã sinh, thêm các khốiswitch,binary_sensor,sensor,buttonở mục 5, bấm Save. - Nạp lần đầu: cắm ESP32 vào máy tính, bấm Install và chọn cách nạp qua USB. ESPHome biên dịch (lần đầu mất vài phút) rồi nạp. Trình duyệt không cho nạp thẳng (cần Chrome hoặc Edge và trang mở bằng https) thì tải tệp chương trình về máy và nạp bằng trang ESPHome Web (web.esphome.io).
- Thêm vào Home Assistant: ESP32 vào Wi-Fi, Home Assistant thường tự phát hiện thiết bị ESPHome mới; bấm thêm. Không thấy thì vào Settings › Devices & services › Add Integration, chọn ESPHome, gõ
relay-pyworld.localhoặc IP của mạch. - Sửa về sau: sửa YAML, Save, Install: lần này nạp qua Wi-Fi, không cần cắm dây.
5. Tệp cấu hình
Tệp đầy đủ của mạch. Khối api, ota, wifi ở trên chỉ để đối chiếu: dùng phần trình tạo thiết bị đã sinh, nhất là khóa mã hóa API.
# PYWORLD.VN - ESP32 DevKit V1 + relay 4 kênh trong Home Assistant bằng ESPHome, không viết code Arduino
# Relay IN1–IN4 ở GPIO32, 33, 26, 27 (module kích mức thấp), nút nhấn GPIO4 xuống GND đảo kênh 1
# Các khối api, ota, wifi: giữ nguyên phần trình tạo thiết bị của ESPHome Device Builder đã sinh ra
esphome:
name: relay-pyworld
friendly_name: Relay PYWORLD
esp32:
variant: esp32 # ESP32 đời đầu (DevKit V1); framework mặc định là esp-idf
logger:
api:
encryption:
key: "KHOA_DO_TRINH_TAO_THIET_BI_SINH_RA"
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ap: # Không vào được Wi-Fi sau 90 giây: tự phát mạng dự phòng để cài lại
ssid: "Relay-PYWORLD"
password: !secret ap_password
captive_portal:
switch:
- platform: gpio
id: relay_1
name: "Kênh 1"
pin:
number: GPIO32
inverted: true # Module kích mức thấp: bật = mức LOW
restore_mode: RESTORE_DEFAULT_OFF # Có điện lại thì về trạng thái trước khi mất điện
- platform: gpio
id: relay_2
name: "Kênh 2"
pin:
number: GPIO33
inverted: true
restore_mode: RESTORE_DEFAULT_OFF
- platform: gpio
id: relay_3
name: "Kênh 3"
pin:
number: GPIO26
inverted: true
restore_mode: RESTORE_DEFAULT_OFF
- platform: gpio
id: relay_4
name: "Kênh 4"
pin:
number: GPIO27
inverted: true
restore_mode: RESTORE_DEFAULT_OFF
binary_sensor:
- platform: gpio
name: "Nút nhấn"
pin:
number: GPIO4
inverted: true # Bấm nối xuống GND
mode:
input: true
pullup: true
filters:
- delayed_on: 30ms # Chống dội phím
- delayed_off: 30ms
on_press:
then:
- switch.toggle: relay_1 # Dùng được cả khi mất Wi-Fi
sensor:
- platform: wifi_signal
name: "Cường độ Wi-Fi"
update_interval: 60s
entity_category: diagnostic
button:
- platform: restart
name: "Khởi động lại"
Các dòng !secret lấy giá trị từ tệp secrets.yaml dùng chung, để mật khẩu không nằm trong cấu hình từng mạch:
# PYWORLD.VN - Tệp secrets.yaml của ESPHome: mật khẩu để riêng, không nằm trong cấu hình thiết bị
# Mở ở mục Secrets của ESPHome Device Builder; mọi thiết bị dùng chung tệp này
# Thay các chữ giữ chỗ bằng giá trị thật; mật khẩu điểm phát dự phòng ít nhất 8 ký tự
wifi_ssid: "TEN_WIFI"
wifi_password: "MAT_KHAU_WIFI"
ota_password: "MAT_KHAU_NAP_QUA_MANG"
ap_password: "MAT_KHAU_DU_PHONG"
6. Giải thích các khối

esp32: variant: esp32: ESP32 đời đầu như DevKit V1. Tài liệu ESPHome khuyên ghivariantthay choboard; khung phần mềm mặc định là ESP-IDF.inverted: true: module relay kích mức thấp, bật là đưa chân xuống LOW. Thiếu dòng này thì bấm bật trên Home Assistant relay lại tắt.restore_mode: RESTORE_DEFAULT_OFF: có điện lại thì relay về trạng thái trước khi mất điện; không đọc được thì tắt. Mặc định của ESPHome làALWAYS_OFF(luôn tắt khi khởi động). Thiết bị không nên tự bật lại sau mất điện (máy bơm, bếp) thì giữALWAYS_OFF.- Nút nhấn: chân GPIO4 bật điện trở kéo lên,
invertedvì bấm là nối xuống GND, lọc dội 30 ms.on_presschạy ngay trên ESP32 nên nút vẫn đảo kênh 1 khi mất Wi-Fi hoặc Home Assistant đang tắt. - Wi-Fi dự phòng: 90 giây không vào được Wi-Fi nhà, mạch phát mạng
Relay-PYWORLD; vào mạng này bằng điện thoại, trang cài đặt (captive_portal) cho chọn Wi-Fi mới. Đây là chức năng mà bài cấu hình Wi-Fi bằng điện thoại cùng loạt tự viết bằng Arduino. apicó khóa mã hóa: Home Assistant nói chuyện với mạch qua cổng 6053, dữ liệu được mã hóa. Khi thêm thủ công, Home Assistant hỏi khóa này: chép từ dòngkeytrong YAML.wifi_signalgửi cường độ Wi-Fi mỗi phút vào nhóm chẩn đoán; nútrestartcho phép khởi động lại mạch từ Home Assistant.
7. ESPHome hay Arduino + MQTT

Chỉ dùng Home Assistant và muốn xong nhanh, dễ sửa: ESPHome. Cần logic riêng phức tạp, cần nhiều phần mềm khác cùng đọc dữ liệu, hoặc muốn hiểu từng dòng chương trình: Arduino + MQTT. Hai cách dùng chung được trong một nhà; mỗi mạch chọn một cách.
8. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Bấm Install không thấy cổng USB | Dây chỉ sạc, chưa cài driver CH340, trình duyệt không hỗ trợ | Đổi dây USB có lõi dữ liệu, cài driver, dùng Chrome hoặc Edge; hoặc tải tệp chương trình và nạp bằng web.esphome.io |
| Nạp lần đầu đứng ở "Connecting" | Mạch không tự vào chế độ nạp | Giữ nút BOOT trên ESP32 khi bắt đầu nạp, thả ra khi thấy tiến trình chạy |
| Home Assistant không tự phát hiện thiết bị | Modem chặn mDNS, khác mạng | Thêm bằng IP của mạch (xem trên trang modem hoặc log của ESPHome) |
| Bật trên Home Assistant thì relay tắt | Thiếu inverted: true | Thêm vào khối pin của từng kênh, Install lại |
| Nạp qua Wi-Fi báo lỗi | Mạch đang offline, sai mật khẩu OTA | Kiểm tra mạch có trong mạng; mật khẩu OTA phải khớp lần nạp trước, sai thì nạp lại qua USB |
| Xuất hiện mạng Relay-PYWORLD | Sai tên hoặc mật khẩu Wi-Fi trong secrets.yaml, modem tắt | Vào mạng dự phòng để chọn Wi-Fi, hoặc sửa secrets.yaml và nạp lại |
9. Xem thêm
- Hướng dẫn dùng MQTT với ESP32: gửi dữ liệu và điều khiển relay bằng PubSubClient
- Nạp chương trình cho ESP32 qua Wi-Fi (OTA)
- Hộp mica cho ESP32 DevKit 30 chân
- Các bài cùng loạt: đưa ESP32 vào Home Assistant bằng MQTT discovery (Arduino), cấu hình Wi-Fi bằng điện thoại.
Xem thêm