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ị

3. Sơ đồ nối

Sơ đồ nối module relay 4 kênh IN1 IN2 IN3 IN4 vào GPIO32 33 26 27 của ESP32 DevKit V1, VCC vào VIN, GND chung, nút nhấn từ GPIO4 xuống GND; bảng nối dây
Cùng sơ đồ với các bài relay khác trong loạt.

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

Năm bước: cài ESPHome Device Builder trong Settings Apps, tạo thiết bị và dán cấu hình, nạp lần đầu qua dây USB, thêm vào Home Assistant, sửa cấu hình và nạp qua Wi-Fi
Tên nút theo giao diện tiếng Anh (bản 2026).
  1. 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.
  2. 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ối switch, binary_sensor, sensor, button ở mục 5, bấm Save.
  3. 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).
  4. 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.local hoặc IP của mạch.
  5. 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

Hai đoạn YAML trích từ tệp cấu hình: một kênh relay gpio có inverted và restore_mode, nút nhấn GPIO4 có pullup, lọc dội và switch.toggle; bảng vai trò các khối esphome, api, ota, wifi, switch, binary_sensor, sensor, button
Hai đoạn trích từ tệp cấu hình và vai trò từng khối.
  • esp32: variant: esp32: ESP32 đời đầu như DevKit V1. Tài liệu ESPHome khuyên ghi variant thay cho board; 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, inverted vì bấm là nối xuống GND, lọc dội 30 ms. on_press chạ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.
  • api có 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òng key trong YAML.
  • wifi_signal gửi cường độ Wi-Fi mỗi phút vào nhóm chẩn đoán; nút restart cho phép khởi động lại mạch từ Home Assistant.

7. ESPHome hay Arduino + MQTT

Bảng so sánh Arduino cộng MQTT với ESPHome: cách viết, cách nối với Home Assistant, máy chủ trung gian, nạp lại, nhớ trạng thái relay, logic riêng, dùng ngoài Home Assistant
Cùng một mạch, hai cách đưa vào Home Assistant.

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ượngNguyên nhân thường gặpCách xử lý
Bấm Install không thấy cổng USBDâ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ạpGiữ 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ạngThê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ắtThiếu inverted: trueThêm vào khối pin của từng kênh, Install lại
Nạp qua Wi-Fi báo lỗiMạch đang offline, sai mật khẩu OTAKiể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-PYWORLDSai tên hoặc mật khẩu Wi-Fi trong secrets.yaml, modem tắtVà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


Tin tức liên quan

Đưa ESP32 và relay 4 kênh vào Home Assistant bằng MQTT discovery, không viết YAML
Đưa ESP32 và relay 4 kênh vào Home Assistant bằng MQTT discovery, không viết YAML

ESP32 tự gửi tin cấu hình MQTT discovery, Home Assistant tạo 4 công tắc relay và cảm biến Wi-Fi; Mosquitto, tài khoản, di chúc, retain và bảng xử lý lỗi.

Xe tránh vật cản với ESP32: cảm biến siêu âm HC-SR04 trên servo quét, tự chọn đường
Xe tránh vật cản với ESP32: cảm biến siêu âm HC-SR04 trên servo quét, tự chọn đường

Làm xe robot tự tránh vật cản với ESP32: cảm biến siêu âm HC-SR04 gắn trên servo quét trái phải, cầu phân áp cho chân ECHO, thuật toán chọn đường, lưu đồ và thí nghiệm STEM.

Đế ra chân ESP32 30 chân: cấp nguồn DC 6,5–16 V, hàng chân G V S và jumper chọn 5 V hay 3,3 V
Đế ra chân ESP32 30 chân: cấp nguồn DC 6,5–16 V, hàng chân G V S và jumper chọn 5 V hay 3,3 V

Cách dùng đế ra chân ESP32 30 chân: cấu tạo, cắm ESP32 đúng chiều, cấp nguồn jack DC 6,5–16 V và tính nhiệt IC ổn áp, hàng G V S, jumper 5V/3.3V, ví dụ relay và nút nhấn.

Hướng dẫn nạp chương trình cho ESP32 qua Wi-Fi (OTA) bằng Arduino IDE
Hướng dẫn nạp chương trình cho ESP32 qua Wi-Fi (OTA) bằng Arduino IDE

Hướng dẫn bật OTA trên ESP32 bằng thư viện ArduinoOTA có sẵn, nạp chương trình qua Wi-Fi từ Arduino IDE 2.x, đặt mật khẩu và các quy tắc để không mất khả năng cập nhật từ xa.

LCD I2C không hiện chữ, chỉ hiện ô vuông, sai địa chỉ 0x27/0x3F: tìm lỗi từng bước
LCD I2C không hiện chữ, chỉ hiện ô vuông, sai địa chỉ 0x27/0x3F: tìm lỗi từng bước

LCD 1602, LCD 2004 I2C không hiện chữ, chỉ hiện hàng ô vuông đen hoặc sai địa chỉ 0x27/0x3F: tìm lỗi nguồn, tương phản, dây I2C, địa chỉ và chương trình kiểm tra tự động.

Module thời gian thực DS3231 với ESP32: đọc giờ, đặt giờ, báo thức hằng ngày, giữ giờ khi mất điện
Module thời gian thực DS3231 với ESP32: đọc giờ, đặt giờ, báo thức hằng ngày, giữ giờ khi mất điện

DS3231 khác DS1307 thế nào, nối với ESP32 qua I2C, thanh ghi và mã BCD, chương trình đọc giờ, nhiệt độ, đặt giờ qua Serial và báo thức hằng ngày qua chân SQW, kèm bảng lỗi.

Hướng dẫn sử dụng màn hình LCD 1602 I2C với Arduino Uno
Hướng dẫn sử dụng màn hình LCD 1602 I2C với Arduino Uno

Hướng dẫn nối màn hình LCD 1602 I2C với Arduino Uno, cài thư viện LiquidCrystal_I2C, chạy code hiển thị và quét địa chỉ I2C 0x27/0x3F.

Micro I2S INMP441 với ESP32: đo mức âm thanh dBFS, dB SPL và vỗ tay hai lần bật tắt đèn
Micro I2S INMP441 với ESP32: đo mức âm thanh dBFS, dB SPL và vỗ tay hai lần bật tắt đèn

Khung I2S của micro INMP441, nối với ESP32, đổi số đo 24 bit ra dBFS và ước tính dB SPL, nhận tiếng vỗ tay bằng mức nền và độ vọt, bật tắt đèn khi vỗ tay hai lần.


Bình luận
Đã thêm vào giỏ hàng