AI-Powered Home Assistant Nhận Diện Shipper Thông Minh với LLM
Camera AI như Frigate nhận diện tốt "person" nhưng chưa hiểu ngữ cảnh. Bài này hướng dẫn thiết lập automation + sensor trong Home Assistant để dùng LLM nhận diện shipper chính xác hơn và gửi thông báo đúng lúc.
Camera an ninh phổ biến (IMOU, Ezviz,...) thường chỉ nhận diện theo mức cơ bản như có người/có chuyển động. Khi đưa vào Home Assistant để làm automation, bạn sẽ gặp tình trạng cảnh báo giả khá nhiều.

Nhiều anh em homelab dùng Frigate để làm lớp AI local trước, cách này rất ổn vì nhanh và chủ động dữ liệu. Tuy nhiên, Frigate vẫn chủ yếu nhận diện theo nhãn object (person, car, dog...), chưa mạnh ở lớp hiểu ngữ cảnh nghề nghiệp.
Ví dụ: có người đứng trước cổng, nhưng đó là khách, hàng xóm hay shipper?
Giải pháp trong bài này là xếp tầng nhận diện:
- Frigate: lọc nhanh event có
person. - LLM trong Home Assistant: phân tích sâu ngữ cảnh để đếm shipper.
- Counter sensor: lưu số lượng shipper để trigger automation thông báo.
Kiến trúc triển khai
Luồng chạy:
- Frigate publish sự kiện vào MQTT topic
frigate/events. - Automation 1 trong HA nhận event, chỉ giữ event có label
person. - HA gọi
ai_task.generate_data(Gemini Flash) để phân tích camera cổng. - LLM trả về chuỗi chứa số shipper.
- Automation parse số, ghi vào
counter.shipper_count. - Automation 2 theo dõi
counter.shipper_count > 0để gửi Telegram. - Counter reset sau 5 phút.
Phần 1: Chuẩn bị entity và integration cần có
1) Bắt buộc phải có
- Frigate + MQTT đã hoạt động.
- Camera entity trong Home Assistant (ví dụ
camera.gate_camera). - Integration AI Task trong HA (để gọi service
ai_task.generate_data). - Telegram bot integration (nếu muốn gửi thông báo như ví dụ).
2) Tạo counter sensor để lưu số shipper
Vào Settings → Devices & Services → Helpers → Create Helper → Counter
- Name:
shipper_count - Entity ID:
counter.shipper_count - Initial value:
0 - Step:
1
Nếu bạn cấu hình YAML trực tiếp thì thêm vào phầncounter:trongconfiguration.yaml.
Phần 2: Tạo automation nhận diện shipper (AI layer)
Bạn có thể tạo qua UI Automation Editor hoặc paste YAML. Bên dưới là bản đã chuẩn hóa theo flow thực tế bạn đang dùng.
alias: Nhận diện human shipper trước cổng
description: ""
triggers:
- topic: frigate/events
trigger: mqtt
conditions:
- condition: template
value_template: "{{ trigger.payload_json['after']['label'] == 'person' }}"
actions:
- action: ai_task.generate_data
response_variable: shipper_count
data:
instructions: >-
You are an image analysis assistant.
Task: Đếm số shipper (người giao hàng) đang đứng trước cổng trong hình.
Rules:
- Chỉ dựa vào dấu hiệu nhận diện nghề nghiệp: đồng phục giao hàng,
mũ bảo hiểm có logo, áo khoác hãng vận chuyển, túi giao hàng,
thùng hàng, xe máy giao hàng, hành vi giao nhận.
- Không nhận diện danh tính cá nhân.
- Chỉ đếm người có dấu hiệu rõ ràng là shipper.
- Bỏ qua người đi đường hoặc người không có dấu hiệu shipper.
- Nếu cổng không rõ hoặc góc máy không thấy cổng,
chỉ đếm shipper trong khu vực trước camera.
- Trả về đúng một dòng theo format: "shipper_count: <number>"
Output: Chỉ một dòng duy nhất, không xuống dòng khác.
entity_id: ai_task.gemini_flash
attachments:
media_content_id: media-source://camera/camera.gate_camera
media_content_type: application/vnd.apple.mpegurl
metadata:
title: Gate Camera
thumbnail: /api/camera_proxy/camera.gate_camera
media_class: video
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://camera
task_name: Camera AI
- if:
- condition: template
value_template: >-
{{ (shipper_count['data'] | regex_findall_index('([0-9]+)', 0) | int(0)) > 0 }}
then:
- action: counter.set_value
data:
value: >-
{{ shipper_count['data'] | regex_findall_index('([0-9]+)', 0) | int(0) }}
target:
entity_id:
- counter.shipper_count
- action: camera.snapshot
data:
filename: /media/snapshots/gate_snapshot1.jpg
target:
entity_id: camera.gate_camera
- delay:
minutes: 5
- action: counter.reset
data: {}
target:
entity_id:
- counter.shipper_count
mode: single
Vì LLM có thể trả text linh hoạt, dùng regex ([0-9]+) là cách chống lỗi parse đơn giản và ổn định.Phần 3: Tạo automation thông báo khi có shipper
alias: Thông báo shipper đứng trước cổng
description: ""
triggers:
- trigger: numeric_state
entity_id:
- counter.shipper_count
above: 0
conditions: []
actions:
- action: telegram_bot.send_photo
data:
caption: AI nhận diện được có shipper đứng trước cổng kìa anh
file: /media/snapshots/gate_snapshot1.jpg
inline_keyboard:
- Chụp lại camera cổng và garage:/snapshot
mode: single
Bạn có thể thay telegram_bot.send_photo bằng:
notify.mobile_app_<phone_name>nếu muốn push notification về điện thoại.tts.speaknếu muốn loa trong nhà thông báo.
Phần 4: Kiểm thử từng bước
Test 1: Kiểm tra event từ Frigate
- Vào Developer Tools → MQTT → Listen to a topic
- Nhập
frigate/events - Đi qua vùng camera để xem payload có đẩy lên không.
Test 2: Kiểm tra service AI chạy được
- Vào Developer Tools → Actions
- Chạy thử
ai_task.generate_datavới camera cổng. - Xác nhận response có số (ví dụ
shipper_count: 1).
Test 3: Kiểm tra counter
- Vào States, xem
counter.shipper_countcó đổi sang > 0 khi có shipper. - Sau 5 phút counter phải tự reset về 0.
Test 4: Kiểm tra thông báo Telegram
- Đảm bảo bot có quyền gửi ảnh vào chat/group.
- Kiểm tra file
/media/snapshots/gate_snapshot1.jpgđã được tạo.
Mẹo giảm cảnh báo sai và tối ưu chi phí
- Chỉ gọi LLM sau lớp lọc local (
label == person). - Dùng model nhẹ (
gemini_flash) cho tác vụ near real-time. - Chuẩn hóa output prompt để parse ổn định.
- Thêm cooldown (delay/reset counter) để tránh spam notification.
- Chỉ gửi ảnh/clip cần thiết để giảm dữ liệu và bảo vệ riêng tư.
Troubleshooting nhanh
1) Lỗi parse số từ LLM
Triệu chứng: counter không tăng.
Cách xử lý:
- In tạm
{{ shipper_count['data'] }}ra log/notify để xem response thực tế. - Giữ prompt ép format 1 dòng + regex fallback
([0-9]+).
2) Không nhận được ảnh Telegram
- Kiểm tra đường dẫn
/media/snapshots/gate_snapshot1.jpg. - Đảm bảo automation nhận diện chạy tới bước
camera.snapshot.
3) Không trigger được automation
- Kiểm tra lại topic MQTT đúng
frigate/events. - Kiểm tra payload có
after.labelkhông. - Xác nhận camera Frigate và camera entity trong HA map đúng tên.
Kết luận
Điểm mạnh của mô hình này không phải thay Frigate bằng LLM, mà là kết hợp 2 lớp:
- Frigate xử lý nhanh và rẻ ở local.
- LLM bổ sung phần hiểu ngữ cảnh để ra quyết định tốt hơn.
Khi làm đúng pipeline, bạn sẽ giảm mạnh cảnh báo giả và có thể xây các automation thông minh hơn như mở cổng cho shipper, tạo lịch sử giao nhận, hoặc phân tích hành vi trước cổng.