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í
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:
- 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
- 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
- Gửi các tấm hình tĩnh này lên Google AI để trả về mô tả hình ảnh
- (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:
- 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
- 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