Smart thermostat tự học cách căn phòng ấm lên
Ghi chú làm smart thermostat bằng ESP32, ESPHome và Home Assistant, có lớp tốc độ làm ấm để bật đúng lúc mà vẫn giữ giới hạn an toàn.
Chia sẻ

Mình từng đặt lịch sưởi lúc 6:30 và nghĩ như vậy là đủ thông minh. Nhưng có hôm trời lạnh, 7 giờ phòng vẫn chưa ấm; hôm khác nắng lên sớm thì máy chạy thừa gần nửa tiếng. Thứ cần học không phải là một lịch cố định, mà là căn phòng cần bao lâu để đi từ nhiệt độ hiện tại tới nhiệt độ mình muốn.
Bài này là cách mình sẽ làm một smart thermostat nhỏ bằng ESP32, ESPHome và Home Assistant. Phần “học” khá khiêm tốn: nó ước lượng tốc độ làm ấm hoặc làm mát từ dữ liệu thật, rồi tính thời điểm cần bật trước. Điều khiển nhiệt cơ bản vẫn chạy cục bộ, kể cả khi Wi-Fi hay Home Assistant mất kết nối.
“Tự học” ở đây học điều gì?
Mình tách hệ thống thành hai lớp:
- Lớp điều khiển an toàn đọc cảm biến, đóng/ngắt HVAC theo hysteresis và giữ thời gian chạy/nghỉ tối thiểu.
- Lớp học quan sát các chu kỳ trước để dự đoán cần bật sớm bao nhiêu phút. Nó không được phép bỏ qua giới hạn của lớp đầu tiên.
Cách tách này quan trọng hơn việc chọn thuật toán nào. Nếu dự đoán sai, phòng có thể ấm muộn một chút; thiết bị không được vì thế mà đóng relay liên tục hoặc ép máy nén khởi động lại quá nhanh.
Phần cứng cho một bản MVP
Một bản thử gọn có thể dùng:
- ESP32-C3 hoặc ESP32-S3.
- Cảm biến SHT40/SHT41 cho nhiệt độ và độ ẩm.
- Màn hình nhỏ và một rotary encoder để chỉnh nhiệt độ tại chỗ.
- Mạch dry-contact hoặc giao tiếp HVAC được cách ly, đúng điện áp và dòng của hệ thống đang dùng.
- Nguồn đạt chuẩn, cầu chì và hộp kín nếu mạch nằm gần điện lưới.
Vị trí cảm biến ảnh hưởng rất nhiều tới dữ liệu học. Mình tránh đặt sát cửa sổ, luồng gió điều hòa, ánh nắng trực tiếp hoặc ngay trên bo mạch ESP32. Nếu vỏ máy tự nóng thêm 1-2 °C, thuật toán sẽ học rất chăm chỉ từ một con số sai.

Giữ phần điều khiển an toàn chạy cục bộ; dữ liệu học chỉ đề xuất thời điểm bật sớm hơn.
Với boiler, heat pump hoặc máy lạnh dùng điện lưới, breadboard chỉ nên dùng để thử logic ở mức điện áp thấp. Phần đấu nối thực tế cần relay/interface đúng chuẩn và người có chuyên môn kiểm tra. Đây là chỗ mình không cố tiết kiệm vài linh kiện.
Giữ bộ điều khiển nền thật đơn giản
ESPHome có thermostat climate controller chạy theo kiểu bang-bang. Mình bắt đầu bằng heating mode, hysteresis và thời gian chạy/nghỉ tối thiểu:
climate:
- platform: thermostat
name: "Room Thermostat"
sensor: room_temperature
min_heating_off_time: 300s
min_heating_run_time: 300s
min_idle_time: 30s
heat_deadband: 0.3
heat_overrun: 0.2
heat_action:
- switch.turn_on: hvac_dry_contact
idle_action:
- switch.turn_off: hvac_dry_contact
preset:
- name: Home
default_target_temperature_low: 22 °C
- name: Away
default_target_temperature_low: 17 °C
Các con số trên chỉ là điểm bắt đầu. Máy nén thường cần thời gian bảo vệ khác với boiler; hãy theo tài liệu của thiết bị thật. Nếu Home Assistant chưa sẵn sàng, Generic Thermostat cũng là một nền dễ thử với temperature sensor, switch, tolerance và minimum cycle duration.
Học tốc độ làm ấm của chính căn phòng
Cứ mỗi 1-5 phút, mình ghi lại nhiệt độ phòng, nhiệt độ mục tiêu, trạng thái HVAC, nhiệt độ ngoài trời và trạng thái cửa sổ. Chỉ những chu kỳ “sạch” mới được dùng để học: cảm biến hợp lệ, cửa đóng, setpoint không bị đổi giữa chừng và hệ thống chạy đủ lâu.
Sau một chu kỳ làm ấm, tốc độ mẫu được tính như sau:
sample_rate = (temperature_end - temperature_start) / duration_hours
learned_rate = 0.8 × learned_rate + 0.2 × sample_rate
Đây là trung bình trượt có trọng số, không phải AI thần kỳ. Nó chỉ giúp một lần mở cửa hay một ngày nắng bất thường không làm kết quả đổi quá mạnh. Khi có đủ dữ liệu, thời gian bật sớm có thể tính bằng:
lead_minutes = clamp(
60 × abs(target - current) / max(learned_rate, 0.1),
0,
90
)
Ví dụ phòng đang 19 °C, mục tiêu 22 °C và tốc độ đã học là 2 °C/giờ, hệ thống nên bắt đầu trước khoảng 90 phút. Mình vẫn chặn ở 90 phút để một mẫu dữ liệu xấu không kéo lịch chạy đi quá xa.

Biểu đồ nhiệt độ theo thời gian giúp mình nhận ra căn phòng ấm lên nhanh hay chậm trong từng điều kiện.
Nếu muốn tốt hơn, có thể lưu tốc độ theo vài nhóm nhiệt độ ngoài trời, chẳng hạn dưới 10 °C, 10-20 °C và trên 20 °C. Mình chưa vội dùng model phức tạp; ba nhóm dễ nhìn biểu đồ, dễ phát hiện sai và thường đã đủ hữu ích cho một căn phòng.
Học thói quen mà không làm người dùng khó chịu
Thời điểm bật sớm và lịch sinh hoạt là hai bài toán khác nhau. Với lịch, mình ghi nhận những lần người dùng chỉnh setpoint vào các ô 30 phút, tách ngày thường và cuối tuần. Chỉ khi một mẫu lặp lại ít nhất ba lần, hệ thống mới gợi ý lịch mới.
Tuần đầu mình chỉ ghi dữ liệu. Tuần thứ hai, dashboard hiện gợi ý kiểu “phòng thường cần 38 phút để đạt 22 °C”. Sau khi con số ổn định, automation mới được phép bật sớm trong giới hạn đã đặt. Mọi thay đổi vẫn phải có nút bỏ qua, tắt learning và quay về lịch cố định.

Núm xoay và chế độ thủ công luôn còn đó; thuật toán học không nên giành quyền quyết định khỏi người dùng.
Presence sensor có thể chuyển giữa Home và Away, nhưng mình tránh đổi nhiệt độ ngay khi không thấy người trong vài phút. Một khoảng trễ 20-30 phút hợp lý hơn, nhất là khi người dùng đang ngủ hoặc ngồi yên. Camera không cần thiết cho bài toán này.
Những lỗi mình sẽ kiểm tra trước
- Cảm biến mất kết nối: tắt learning, mở relay về trạng thái an toàn và báo lỗi rõ ràng.
- Cửa sổ mở: dừng chu kỳ học; tùy hệ thống, có thể tạm ngừng sưởi sau một khoảng trễ.
- Relay đóng/ngắt quá nhanh: kiểm tra lại
min_*_timevà log từng lần đổi trạng thái. - Dự đoán dao động: giảm trọng số mẫu mới hoặc chỉ cập nhật sau chu kỳ dài hơn 15 phút.
- Người dùng chỉnh tay thường xuyên: coi đó là tín hiệu lịch chưa phù hợp, không phải “ngoại lệ” cần bỏ qua.
Bản đầu tiên mình sẽ chạy ít nhất một tuần ở chế độ chỉ ghi log. Một thermostat tốt không cần tỏ ra thông minh mọi lúc; nó chỉ cần đưa căn phòng tới nhiệt độ dễ chịu đúng giờ, chạy ổn định và luôn cho phép mình chỉnh lại bằng tay.
Nguồn tham khảo
Chia sẻ
Tiếp tục khám phá
Đọc tiếp
Bài viết liên quan
Đồng hồ để bàn “chỉ báo chất lượng giấc ngủ” không cần camera
Ghi chú làm một đồng hồ ESP32 cạnh giường, dùng CO2, nhiệt độ, ánh sáng và cảm biến hiện diện để giải thích vì sao sáng dậy thấy phòng ngủ không ổn, không cần camera.
Remote giọng nói tiếng Việt cho Home Assistant chạy nội bộ
Ghi chú làm một remote giọng nói dùng ESP32-S3, ESPHome và Home Assistant Assist local để điều khiển nhà thông minh bằng tiếng Việt mà không phải gửi giọng nói lên cloud.
Thiết bị báo nhiệt độ tủ lạnh, tủ đông khi mất điện
Ghi chú thiết kế một hộp đo nhiệt độ đặt ngoài tủ lạnh, dùng ESP32, hai đầu dò DS18B20 và Home Assistant để biết sớm khi ngăn đông ấm lên sau mất điện.