Bỏ qua đến nội dung
AI-Powered Home Assistant Nhận Diện Shipper Thông Minh với LLM

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.

Tự làm AI Camera để nâng cao bảo mật cho nhà của bạn, khắc phục độ trễ và các cảnh báo giả
Vì sao cần tự làm AI Camera? Từ khóa: frigate, home assistant, proxmox.

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:

  1. Frigate: lọc nhanh event có person.
  2. LLM trong Home Assistant: phân tích sâu ngữ cảnh để đếm shipper.
  3. 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:

  1. Frigate publish sự kiện vào MQTT topic frigate/events.
  2. Automation 1 trong HA nhận event, chỉ giữ event có label person.
  3. HA gọi ai_task.generate_data (Gemini Flash) để phân tích camera cổng.
  4. LLM trả về chuỗi chứa số shipper.
  5. Automation parse số, ghi vào counter.shipper_count.
  6. Automation 2 theo dõi counter.shipper_count > 0 để gửi Telegram.
  7. 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ần counter: trong configuration.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.speak nế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_data vớ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_count có đổ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í

  1. Chỉ gọi LLM sau lớp lọc local (label == person).
  2. Dùng model nhẹ (gemini_flash) cho tác vụ near real-time.
  3. Chuẩn hóa output prompt để parse ổn định.
  4. Thêm cooldown (delay/reset counter) để tránh spam notification.
  5. 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.label khô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.

Bạn thấy bài viết hữu ích?

Đăng ký để nhận thông báo khi có bài viết mới.

Kiểm tra hộp thư để xác nhận email!
Bạn đã đăng ký thành công vào Geek Playground
Tuyệt vời! Tiếp theo, hoàn tất thanh toán để có quyền truy cập đầy đủ vào Geek Playground
Chào mừng trở lại! Bạn đã đăng nhập thành công.
Thành công! Tài khoản của bạn đã được kích hoạt đầy đủ, bạn hiện có quyền truy cập vào tất cả nội dung.
Thành công! Thông tin thanh toán của bạn đã được cập nhật.
Cập nhật thông tin thanh toán không thành công.