AI Hunter
Member
Hiện tại: Nhiệt độ hiện trên App -> Bạn thấy nóng -> Bạn bấm nút -> Quạt chạy.
Mục tiêu: Nhiệt độ tăng -> Jarvis thấy nóng -> Jarvis tự bấm nút.
Chúng ta sẽ viết một hàm logic đơn giản (If/Else) nhúng vào bên trong Server Python.
Một lỗi kinh điển của người mới (Newbie Trap):
=> Hậu quả: Khi nhiệt độ dao động ở mức 30.0 (lúc 30.1, lúc 29.9), cái quạt sẽ Bật/Tắt liên tục 10 lần/giây -> Cháy máy.
Giải pháp chuyên nghiệp: Dùng khoảng trễ (Hysteresis).
Mở file
*Lưu ý:* Logic kiểm tra
Vì chúng ta không thể chờ trời nóng lên 32 độ ngay lập tức, hãy "hack" nhiệt độ để test.
Cách 1: Tác động vật lý
Cách 2: Giả lập dữ liệu (Nhanh nhất)
Dùng phần mềm **MQTT Explorer** hoặc Terminal gửi dữ liệu giả mạo:
Đôi khi bạn muốn tự chỉnh tay mà không muốn Jarvis can thiệp (ví dụ đang lạnh nhưng vẫn muốn bật quạt cho thoáng). Bạn cần một cái công tắc "Auto Mode" trên App.
Tại Server (server.py): Thêm API đổi chế độ.
Tại App (DashboardScreen):
Thêm một nút Switch "Smart Mode". Khi bật -> Gọi API trên với `true`. Khi tắt -> Gọi với `false`.
Chúc mừng! Bạn đã hoàn thành khóa học sơ cấp về Smart Home Automation.
Hệ thống của bạn giờ đây đã hoạt động khép kín:
Cảm biến -> MQTT -> Server (Logic) -> MQTT -> Relay -> Thiết bị.
Vậy là kết thúc phần Code & Mạch. Nhưng nhìn đống dây nhợ lằng nhằng trên bàn, bạn có dám đem nó đi lắp ở phòng khách không? Chắc chắn là bị vợ/mẹ mắng vì quá bừa bộn.
Mục tiêu: Nhiệt độ tăng -> Jarvis thấy nóng -> Jarvis tự bấm nút.
Chúng ta sẽ viết một hàm logic đơn giản (If/Else) nhúng vào bên trong Server Python.
1. Nguyên lý Hysteresis (Khoảng trễ)
Một lỗi kinh điển của người mới (Newbie Trap):
Mã:
Nếu nhiệt độ > 30: Bật Quạt
Nếu nhiệt độ < 30: Tắt Quạt
Giải pháp chuyên nghiệp: Dùng khoảng trễ (Hysteresis).
- Ngưỡng trên (32°C): Nóng quá mới bật.
- Ngưỡng dưới (28°C): Mát hẳn mới tắt.
- Ở giữa 28-32: Giữ nguyên trạng thái hiện tại.
2. Cập nhật Code Server (server.py)
Mở file
backend/server.py. Chúng ta sẽ thêm hàm check_automation và gọi nó mỗi khi nhận được dữ liệu cảm biến mới.
Python:
# ... (Giữ nguyên các import và cấu hình cũ) ...
# Thêm biến lưu trạng thái tự động hóa (Để bật/tắt tính năng này trên App sau này)
is_automation_enabled = True
# --- HÀM LOGIC TỰ ĐỘNG ---
def check_automation(temp, hum):
global home_state
# Chỉ chạy khi tính năng Auto được bật
if not is_automation_enabled:
return
device_id = "light_living_room" # Giả sử Relay đang nối vào Quạt/Đèn
current_status = home_state.get(device_id, False) # Trạng thái hiện tại của Relay
# 1. QUY TẮC BẬT: Nóng trên 32 độ
if temp >= 32.0 and current_status == False:
print(f"🔥 Nóng quá ({temp}°C)! Jarvis tự bật quạt.")
# Cập nhật trạng thái
home_state[device_id] = True
# Gửi lệnh MQTT xuống ESP32
mqtt_client.publish("home/livingroom/light", "ON")
# 2. QUY TẮC TẮT: Mát dưới 28 độ
elif temp <= 28.0 and current_status == True:
print(f"❄️ Mát rồi ({temp}°C). Jarvis tắt quạt tiết kiệm điện.")
# Cập nhật trạng thái
home_state[device_id] = False
# Gửi lệnh MQTT xuống ESP32
mqtt_client.publish("home/livingroom/light", "OFF")
# --- CẬP NHẬT HÀM ON_MESSAGE ---
def on_message(client, userdata, msg):
global sensor_state
try:
payload = msg.payload.decode()
# print(f"📩 Nhận dữ liệu: {payload}") # Comment bớt cho đỡ rối
data = json.loads(payload)
if "temp" in data and "hum" in data:
sensor_state["temp"] = data["temp"]
sensor_state["hum"] = data["hum"]
# ---> GỌI HÀM AUTOMATION TẠI ĐÂY <---
check_automation(data["temp"], data["hum"])
except Exception as e:
print(f"⚠️ Lỗi xử lý: {e}")
# ... (Phần còn lại giữ nguyên) ...
*Lưu ý:* Logic kiểm tra
current_status rất quan trọng. Nếu quạt ĐANG BẬT rồi thì đừng gửi lệnh "ON" nữa, tránh spam đường truyền MQTT.3. Thử nghiệm thực tế (Testing)
Vì chúng ta không thể chờ trời nóng lên 32 độ ngay lập tức, hãy "hack" nhiệt độ để test.
Cách 1: Tác động vật lý
- Lấy máy sấy tóc (hoặc hà hơi liên tục, hoặc áp ngón tay ấm) vào cảm biến DHT11.
- Nhìn vào Terminal của Server Python.
Cách 2: Giả lập dữ liệu (Nhanh nhất)
Dùng phần mềm **MQTT Explorer** hoặc Terminal gửi dữ liệu giả mạo:
- Topic:
home/livingroom/sensor - Payload (Giả nóng):
{"temp": 35.0, "hum": 60}
=> Ngay lập tức Relay nhảy "TẠCH" (ON). Terminal báo: "
Nóng quá..."
- Payload (Giả mát):
{"temp": 25.0, "hum": 60}
=> Relay nhảy "TẠCH" (OFF). Terminal báo: "
Mát rồi..."
4. Mở rộng: Nút bật/tắt chế độ Auto trên App
Đôi khi bạn muốn tự chỉnh tay mà không muốn Jarvis can thiệp (ví dụ đang lạnh nhưng vẫn muốn bật quạt cho thoáng). Bạn cần một cái công tắc "Auto Mode" trên App.
Tại Server (server.py): Thêm API đổi chế độ.
Python:
@app.post("/set-automation")
async def set_automation(enable: bool):
global is_automation_enabled
is_automation_enabled = enable
return {"status": "Automation is " + ("ON" if enable else "OFF")}
Tại App (DashboardScreen):
Thêm một nút Switch "Smart Mode". Khi bật -> Gọi API trên với `true`. Khi tắt -> Gọi với `false`.
Tổng kết
Chúc mừng! Bạn đã hoàn thành khóa học sơ cấp về Smart Home Automation.
Hệ thống của bạn giờ đây đã hoạt động khép kín:
Cảm biến -> MQTT -> Server (Logic) -> MQTT -> Relay -> Thiết bị.
Vậy là kết thúc phần Code & Mạch. Nhưng nhìn đống dây nhợ lằng nhằng trên bàn, bạn có dám đem nó đi lắp ở phòng khách không? Chắc chắn là bị vợ/mẹ mắng vì quá bừa bộn.
Bài viết liên quan