135 lines
4.5 KiB
YAML
135 lines
4.5 KiB
YAML
blueprint:
|
||||
|
|
name: 腾讯云人脸检测自动化
|
|||
|
|
description: 检测到人脸时自动触发,可配合摄像头抓拍
|
|||
|
|
domain: automation
|
|||
|
|
input:
|
|||
|
|
camera_entity:
|
|||
|
|
name: 摄像头
|
|||
|
|
description: 用于人脸检测的摄像头实体
|
|||
|
|
selector:
|
|||
|
|
entity:
|
|||
|
|
domain: camera
|
|||
|
|
face_recognition_action:
|
|||
|
|
name: 检测到人脸时的操作
|
|||
|
|
description: 当检测到人脸时执行的操作(可以选择人脸搜索、检测等)
|
|||
|
|
default: detect
|
|||
|
|
selector:
|
|||
|
|
select:
|
|||
|
|
options:
|
|||
|
|
- label: "仅检测人脸"
|
|||
|
|
value: "detect"
|
|||
|
|
- label: "搜索人脸(人员库匹配)"
|
|||
|
|
value: "search"
|
|||
|
|
person_group_id:
|
|||
|
|
name: 人员库ID
|
|||
|
|
description: 人脸搜索时使用的人员库(仅搜索模式)
|
|||
|
|
default: "Hass"
|
|||
|
|
max_face_num:
|
|||
|
|
name: 最大人脸数
|
|||
|
|
description: 检测的最大人脸数量
|
|||
|
|
default: 3
|
|||
|
|
selector:
|
|||
|
|
number:
|
|||
|
|
min: 1
|
|||
|
|
max: 10
|
|||
|
|
mode: slider
|
|||
|
|
notification_action:
|
|||
|
|
name: 检测到已知人员时的通知
|
|||
|
|
description: 当匹配到已知人员时发送通知
|
|||
|
|
default: true
|
|||
|
|
selector:
|
|||
|
|
boolean:
|
|||
|
|
|
|||
|
|
trigger_variables:
|
|||
|
|
camera_entity: !input camera_entity
|
|||
|
|
face_recognition_action: !input face_recognition_action
|
|||
|
|
person_group_id: !input person_group_id
|
|||
|
|
max_face_num: !input max_face_num
|
|||
|
|
notification_action: !input notification_action
|
|||
|
|
|
|||
|
|
trigger:
|
|||
|
|
- platform: state
|
|||
|
|
entity_id: !input camera_entity
|
|||
|
|
attribute: motion_detected
|
|||
|
|
to: "true"
|
|||
|
|
- platform: homeassistant
|
|||
|
|
event: start
|
|||
|
|
|
|||
|
|
condition:
|
|||
|
|
- condition: template
|
|||
|
|
value_template: >
|
|||
|
|
{% if face_recognition_action == "search" %}
|
|||
|
|
{{ person_group_id | length > 0 }}
|
|||
|
|
{% else %}
|
|||
|
|
true
|
|||
|
|
{% endif %}
|
|||
|
|
|
|||
|
|
action:
|
|||
|
|
- variables:
|
|||
|
|
camera: !input camera_entity
|
|||
|
|
action_type: !input face_recognition_action
|
|||
|
|
alias: "开始人脸检测"
|
|||
|
|
- if:
|
|||
|
|
- condition: template
|
|||
|
|
value_template: "{{ action_type == 'detect' }}"
|
|||
|
|
then:
|
|||
|
|
- alias: "执行人脸检测"
|
|||
|
|
action: tencent_face_recognition.detect_face
|
|||
|
|
data:
|
|||
|
|
camera_entity_id: "{{ camera }}"
|
|||
|
|
max_face_num: "{{ max_face_num | int }}"
|
|||
|
|
response_variable: detection_result
|
|||
|
|
else:
|
|||
|
|
- alias: "执行人脸搜索"
|
|||
|
|
action: tencent_face_recognition.face_search
|
|||
|
|
data:
|
|||
|
|
camera_entity_id: "{{ camera }}"
|
|||
|
|
group_id: "{{ person_group_id }}"
|
|||
|
|
max_face_num: "{{ max_face_num | int }}"
|
|||
|
|
response_variable: detection_result
|
|||
|
|
|
|||
|
|
- alias: "检查检测结果"
|
|||
|
|
choose:
|
|||
|
|
- conditions:
|
|||
|
|
- condition: template
|
|||
|
|
value_template: >
|
|||
|
|
{{ detection_result.get('success', false) and
|
|||
|
|
detection_result.get('faces', []) | length > 0 }}
|
|||
|
|
sequence:
|
|||
|
|
- alias: "已知人员匹配到"
|
|||
|
|
if:
|
|||
|
|
- condition: template
|
|||
|
|
value_template: "{{ action_type == 'search' }}"
|
|||
|
|
then:
|
|||
|
|
- event: face_detected
|
|||
|
|
event_data:
|
|||
|
|
person_id: >
|
|||
|
|
{{ detection_result.faces[0].candidates[0].person_id
|
|||
|
|
if detection_result.faces[0].candidates else 'unknown' }}
|
|||
|
|
person_name: >
|
|||
|
|
{{ detection_result.faces[0].candidates[0].person_name
|
|||
|
|
if detection_result.faces[0].candidates else '未知' }}
|
|||
|
|
score: >
|
|||
|
|
{{ detection_result.faces[0].candidates[0].score
|
|||
|
|
if detection_result.faces[0].candidates else 0 }}
|
|||
|
|
- if:
|
|||
|
|
- condition: template
|
|||
|
|
value_template: "{{ notification_action }}"
|
|||
|
|
then:
|
|||
|
|
- alias: "发送通知"
|
|||
|
|
action: persistent_notification.create
|
|||
|
|
data:
|
|||
|
|
title: "人脸识别 - 已知人员"
|
|||
|
|
message: >
|
|||
|
|
检测到已知人员:{{ detection_result.faces[0].candidates[0].person_name
|
|||
|
|
if detection_result.faces[0].candidates else '未知' }}
|
|||
|
|
(匹配度:{{ detection_result.faces[0].candidates[0].score
|
|||
|
|
if detection_result.faces[0].candidates else 0 }}%)
|
|||
|
|
else:
|
|||
|
|
- event: face_detected
|
|||
|
|
event_data:
|
|||
|
|
face_count: "{{ detection_result.faces | length }}"
|
|||
|
|
details: "{{ detection_result.faces }}"
|
|||
|
|
|
|||
|
|
mode: single
|