Gửi thông báo lên Telegram kèm hình ảnh và mô tả khi camera nhận biết người trước cổng

Sử dụng AI nhận biết hoạt động trong hình ảnh, gửi ảnh GIF lên Telegram kèm mô tả ngắn. Thực hiện hoàn toàn miễn phí

Gửi thông báo lên Telegram kèm hình ảnh và mô tả khi camera nhận biết người trước cổng
AXnfe1X.jpeg

Mục tiêu đặt ra

Mình mong muốn một hệ thống cảnh báo an ninh hoạt động hoàn hảo nhất có thể, đảm bảo kể cả khi toàn bộ hệ thống bị tắt (do bị cắt cầu giao tổng) thì mình vẫn có đủ thông tin để biết chuyện gì đã xảy ra nhằm có sự chuẩn bị phù hợp.

Mình có thể tưởng tượng kẻ trộm có thể cắt điện trước khi đột nhập vào nhà, hoặc chỉ đơn thuần là phá toàn bộ hệ thống camera trước cổng, cúp điện và đợi mình mở cửa để kiểm tra thì khống chế và đột nhập. Làm thế nào để kể cả khi gặp tình huống trên mình vẫn có được hệ thống dự phòng để xem thông tin khi toàn bộ hệ thống chính rơi vào trạng thái offline?

Phương án đặt ra là mình sẽ gửi một GIF hoặc video ngắn ghi lại hoạt cảnh chuyển động khi các cảm biến camera ghi nhận có người. Và sẽ trông thú vị hơn nếu có thể dùng AI để mô tả nhanh chuyện đã xảy ra dựa trên các hình ảnh chụp nhanh lại được. Khỏi mất thời gian coi qua từng clip

Các bước thực hiện

Gửi ảnh GIF qua Telegram

Mình đã sử dụng ChatGPT để hỗ trợ khá nhiều cho phần tạo python hay viết automation

Tạo dịch vụ tạo ảnh GIF từ nhiều tấm hình tĩnh

Bạn cần tạo một file đuôi .py với nội dung tương tự như sau:

from PIL import Image

import sys

# Đường dẫn tới các ảnh được truyền từ Home Assistant

image1_path = sys.argv[1]

image2_path = sys.argv[2]

image3_path = sys.argv[3]

output_path = sys.argv[4] 

# Mở các ảnh

images = [Image.open(image1_path), Image.open(image2_path), Image.open(image3_path)]

# Tạo ảnh GIF từ các ảnh

images[0].save(output_path, save_all=True, append_images=images[1:], duration=500, loop=0)

Kết nối với Google AI - Nếu không cần mô tả bằng AI thì bỏ qua bước này cũng được

Vào Device & Service > Add Intergation để thêm cấu hình Generative AI. Google cho phép tạo API Key free ở đây: https://aistudio.google.com/app/apikey

Có thể mình sẽ cần đi qua một số bước đăng ký, mình cũng không nhớ rõ các bước như thế nào nhưng không quá khó để thực hiện.

Tạo Script để chạy hàng loạt các lệnh chụp và gửi mô tả ảnh

Trong script này mình thực hiện tuần tự các lệnh:

  1. Mỗi 1s chụp 1 tấm hình từ camera chỉ định, lưu trữ local theo cấu trúc tên quy định
  2. Sử dụng action đã tạo bằng python bên trên để biến các tấm hình tĩnh này thành hình động
  3. Gửi các tấm hình tĩnh này lên Google AI để trả về mô tả hình ảnh
  4. (Tùy chọn) Xét điều kiện nếu Google AI không trả về mô tả thì khỏi cần gửi tin nhắn Telegram vì có vẻ như là cảnh báo nhầm Code tham khảo:
alias: Garage - Snapshot, AI & Notification
sequence:
  - metadata: {}
    data:
      filename: /media/snapshots/garage_snapshot1.jpg
    enabled: true
    action: camera.snapshot
    target:
      entity_id: camera.garage_camera
  - delay:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 500
    enabled: true
  - metadata: {}
    data:
      filename: /media/snapshots/garage_snapshot2.jpg
    enabled: true
    action: camera.snapshot
    target:
      entity_id: camera.garage_camera
  - delay:
      hours: 0
      minutes: 0
      seconds: 1
      milliseconds: 500
    enabled: true
  - metadata: {}
    data:
      filename: /media/snapshots/garage_snapshot3.jpg
    enabled: true
    action: camera.snapshot
    target:
      entity_id: camera.garage_camera
  - action: shell_command.create_gif
    data: {}
  - metadata: {}
    data:
      prompt: >-
        Phát hiện chuyển động, so sánh và mô tả ngắn gọn những gì bạn thấy trong
        loạt ảnh từ camera ở lối vào nhà tôi. Bạn nghĩ nguyên nhân nào gây ra
        báo động chuyển động? Nếu có người hoặc xe, hãy mô tả chi tiết. Không mô
        tả vật thể đứng yên hoặc tòa nhà. Nếu không thấy nguyên nhân rõ ràng,
        hãy trả lời: “Camera phát hiện người ở Garage”
      image_filename:
        - /media/snapshots/garage_snapshot1.jpg
        - /media/snapshots/garage_snapshot2.jpg
        - /media/snapshots/garage_snapshot3.jpg
    response_variable: generated_content
    action: google_generative_ai_conversation.generate_content
  - if:
      - condition: template
        value_template: |
          {{ generated_content['text'] == ' Camera phát hiện người ở Garage' }} 
    then:
      - stop: ""
    else:
      - data:
          caption: "{{ generated_content['text'] }}"
          file: /media/snapshots/garage_motion.gif
        action: telegram_bot.send_document
mode: single
description: ""

Tạo Automation để trigger gửi notification

Do phần lớn các thao tác đã thực hiện ở phần Script nên ở automation chỉ cần thực hiện các trigger và xét điều kiện mong muốn

Giải thích phần automation mình đã tạo:

  1. Khi cổng được mở (trong khoảng thời gian quy định), hoặc khi có người phát hiện ở các khu vực mình quy định sẽ bắt đầu kịch bản tự động hóa
  2. Xét nếu bên ngoài cổng có người thì gửi hình ảnh phía ngoài cổng, nếu bên trong garage có người thì gửi hình ảnh phía trong camera