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()