Cria entidades do Unifi Protect no HA para reconhecimento de objetos em cameras - aantonelloborges/codesamples GitHub Wiki
Descrição do Script
Integração com o Unifi Protect:
- Acessa os eventos usando a API do Unifi Protect.
- Filtra eventos do tipo smartDetectZone (reconhecimento de objetos).
Publicação no MQTT:
- Cada evento gera uma entidade com sensores para:
- Presença (on/off)
- Acuracidade (campo accuracy)
- Qualidade da captura (quality)
- Entidades são publicadas no formato compatível com o Home Assistant.
Configuração:
- Substitua <IP_DO_UNIFI_PROTECT>, <SUA_API_KEY>, <IP_DO_BROKER> e CAMERAS pelas informações específicas do seu ambiente.
Script
import json
import requests
import paho.mqtt.client as mqtt
# Configurações do Unifi Protect
UNIFI_PROTECT_URL = "https://<IP_DO_UNIFI_PROTECT>"
UNIFI_API_KEY = "<SUA_API_KEY>"
CAMERAS = ["camera1", "camera2"] # Substitua pelos nomes das suas câmeras no Unifi Protect
# Configurações do MQTT
MQTT_BROKER = "<IP_DO_BROKER>"
MQTT_PORT = 1883
MQTT_TOPIC_PREFIX = "homeassistant"
# Conexão ao MQTT Broker
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Conectado ao MQTT Broker")
else:
print(f"Erro ao conectar ao MQTT Broker: {rc}")
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60)
mqtt_client.loop_start()
# Função para publicar entidades via MQTT
def publish_entity(camera, entity_id, object_type, accuracy, quality):
unique_id = f"{camera}_{entity_id}_{object_type}"
base_topic = f"{MQTT_TOPIC_PREFIX}/{camera}/{object_type}"
# Configuração da entidade para o Home Assistant
config = {
"name": f"{camera} {object_type}",
"state_topic": f"{base_topic}/presence",
"json_attributes_topic": f"{base_topic}/attributes",
"unique_id": unique_id,
"device": {
"identifiers": [camera],
"name": camera,
"model": "Unifi Camera",
"manufacturer": "Ubiquiti"
}
}
# Publicar configuração no tópico do Home Assistant
mqtt_client.publish(f"homeassistant/sensor/{unique_id}/config", json.dumps(config), retain=True)
# Publicar estado e atributos iniciais
mqtt_client.publish(f"{base_topic}/presence", "on")
attributes = {
"accuracy": accuracy,
"quality": quality
}
mqtt_client.publish(f"{base_topic}/attributes", json.dumps(attributes), retain=True)
# Função para obter eventos do Unifi Protect
def get_unifi_events():
headers = {"Authorization": f"Bearer {UNIFI_API_KEY}"}
response = requests.get(f"{UNIFI_PROTECT_URL}/api/events", headers=headers, verify=False)
if response.status_code == 200:
return response.json()
else:
print(f"Erro ao obter eventos do Unifi Protect: {response.status_code}")
return []
# Loop principal para processar eventos
try:
while True:
events = get_unifi_events()
for event in events:
if event.get("type") == "smartDetectZone":
camera = event.get("camera")
object_type = event.get("metadata", {}).get("objectType")
accuracy = event.get("metadata", {}).get("accuracy", 0)
quality = event.get("metadata", {}).get("quality", 0)
if camera in CAMERAS and object_type:
entity_id = event.get("id")
publish_entity(camera, entity_id, object_type, accuracy, quality)
except KeyboardInterrupt:
print("Encerrando script...")
mqtt_client.loop_stop()
mqtt_client.disconnect()