Saltar al contenido principal

Documentation Index

Fetch the complete documentation index at: https://api-docs.rhombus.community/llms.txt

Use this file to discover all available pages before exploring further.

Esta página fue traducida automáticamente. Si encuentra errores o tiene sugerencias, contáctenos.
El stream de eventos WebSocket de Rhombus entrega notificaciones en tiempo real sobre todo lo que ocurre en tu organización. Esta guía cubre la estructura de los eventos, los tipos de entidades disponibles y los patrones para filtrar y procesar eventos.

Tópico de eventos

Todos los eventos organizacionales se publican en un único tópico:
/topic/change/{orgUuid}
Cada operación de creación, actualización y eliminación en tu organización Rhombus emite un evento en este tópico.

Estructura de la carga útil del evento

Cada frame MESSAGE contiene un cuerpo JSON con los siguientes campos:
{
  "entity": "POLICY_ALERT",
  "entityUuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "type": "CREATE",
  "deviceUuid": "d1e2f3a4-b5c6-7890-abcd-ef1234567890",
  "timestampMs": 1711843200000,
  "durationSec": 5.2,
  "policyAlertTriggers": ["PERSON_DETECTED", "LOITERING"],
  "textDescription": "Person detected near entrance"
}

Campos principales

CampoTipoDescripción
entitystringEl tipo de entidad que cambió
entityUuidstringIdentificador único de la entidad específica
typestringTipo de cambio: CREATE, UPDATE o DELETE
deviceUuidstringUUID del dispositivo asociado (cuando aplica)
timestampMsintegerTimestamp del evento en milisegundos Unix

Campos específicos de alertas

Estos campos están presentes cuando entity es POLICY_ALERT:
CampoTipoDescripción
durationSecfloatDuración del evento de alerta en segundos
policyAlertTriggersarrayLista de tipos de disparadores que causaron la alerta
textDescriptionstringDescripción legible de la alerta

Tipos de cambio

TipoDescripciónEjemplo
CREATESe creó una nueva entidadNueva alerta de política disparada
UPDATESe modificó una entidad existenteEstado de la alerta cambió
DELETESe eliminó una entidadAlerta descartada o limpiada

Tipos de entidad

El campo entity indica qué tipo de objeto cambió. Los tipos de entidad comunes incluyen:
EntidadDescripción
POLICY_ALERTAlerta por violación de política de seguridad
DEVICE_CONFIGCambio de configuración de cámara o sensor
Los tipos de entidad disponibles dependen de los dispositivos y políticas configurados en tu organización. Conéctate al WebSocket y suscríbete sin un filtro de entidad para descubrir todos los tipos de evento disponibles.
Comienza filtrando los eventos POLICY_ALERT, que son el caso de uso más común. Para recibir todos los tipos de evento, omite el filtro de tipo de entidad de tu destino SUBSCRIBE.

Disparadores de alertas de política

Cuando un evento tiene entity: "POLICY_ALERT", el array policyAlertTriggers indica qué causó la alerta:
DisparadorDescripción
PERSON_DETECTEDSe detectó una persona en el campo de visión de la cámara
LOITERINGUna persona permaneció en un área más allá del umbral configurado
VEHICLE_DETECTEDSe detectó un vehículo
MOTION_DETECTEDSe detectó movimiento general
LINE_CROSSINGUn objeto cruzó un límite virtual definido
AREA_INTRUSIONUn objeto entró en un área restringida

Filtrado de eventos

Por tipo de entidad

Filtra tipos de evento específicos para reducir el ruido:
def handle_message(payload):
    entity = payload.get("entity")

    if entity == "POLICY_ALERT":
        handle_alert(payload)
    elif entity == "DEVICE_CONFIG":
        handle_device_change(payload)
    else:
        # Log or ignore other entity types
        pass

Por tipo de cambio

Reacciona de forma distinta según si un evento fue creado, actualizado o eliminado:
def handle_alert(payload):
    change_type = payload.get("type")

    if change_type == "CREATE":
        # New alert - send notification
        send_notification(payload)
    elif change_type == "UPDATE":
        # Alert updated - refresh dashboard
        refresh_dashboard(payload)
    elif change_type == "DELETE":
        # Alert cleared - close ticket
        close_ticket(payload)

Por dispositivo

Filtra eventos de una cámara o sensor específico:
WATCHED_DEVICES = {
    "camera-uuid-lobby",
    "camera-uuid-parking-lot",
}

def handle_message(payload):
    device_uuid = payload.get("deviceUuid")
    if device_uuid in WATCHED_DEVICES:
        process_event(payload)

Por disparador de alerta

Reacciona a tipos específicos de eventos de seguridad:
HIGH_PRIORITY_TRIGGERS = {"PERSON_DETECTED", "AREA_INTRUSION", "LINE_CROSSING"}

def handle_alert(payload):
    triggers = set(payload.get("policyAlertTriggers", []))
    if triggers & HIGH_PRIORITY_TRIGGERS:
        send_urgent_notification(payload)

Enriquecer eventos con datos de la API REST

Los eventos WebSocket contienen datos mínimos por eficiencia. Usa la API REST para obtener detalles adicionales cuando los necesites:

Obtener el nombre de la cámara desde el UUID del dispositivo

import requests

def get_camera_name(api_token, device_uuid):
    """Fetch camera name for display purposes."""
    response = requests.post(
        "https://api2.rhombussystems.com/api/camera/getMinimalCameraStateList",
        headers={
            "x-auth-apikey": api_token,
            "Content-Type": "application/json"
        },
        json={}
    )
    cameras = response.json().get("cameraStates", [])
    for camera in cameras:
        if camera.get("uuid") == device_uuid:
            return camera.get("name", "Unknown Camera")
    return "Unknown Camera"

Obtener detalles de la alerta

def get_alert_details(api_token, alert_uuid):
    """Fetch full alert details from the REST API."""
    response = requests.post(
        "https://api2.rhombussystems.com/api/alert/getAlert",
        headers={
            "x-auth-apikey": api_token,
            "Content-Type": "application/json"
        },
        json={"alertUuid": alert_uuid}
    )
    return response.json()
Almacena los nombres de cámaras en caché localmente para evitar llamadas excesivas a la API REST. Los nombres de las cámaras cambian con poca frecuencia, así que un caché con TTL de 5 minutos funciona bien.

Formatos de salida

Visualización formateada de la alerta

from datetime import datetime

def display_alert(payload, camera_name=""):
    ts = datetime.fromtimestamp(payload["timestampMs"] / 1000)
    triggers = ", ".join(payload.get("policyAlertTriggers", []))
    duration = payload.get("durationSec", 0)
    description = payload.get("textDescription", "")

    print(f"[{ts:%H:%M:%S}] ALERT  camera={camera_name}")
    print(f"  triggers={triggers}  duration={duration}s")
    if description:
        print(f"  {description}")
    print(f"  uuid={payload['entityUuid']}")
    print()

Salida JSON sin procesar

Para canalizar a otras herramientas o sistemas de logging:
import json

def output_json(payload):
    print(json.dumps(payload, indent=2))

Patrones de integración

Reenvío a webhook

Reenvía los eventos de Rhombus a tu propio endpoint webhook:
import requests

WEBHOOK_URL = "https://your-server.com/webhooks/rhombus"

def relay_to_webhook(payload):
    try:
        requests.post(WEBHOOK_URL, json=payload, timeout=5)
    except requests.RequestException as e:
        print(f"Webhook relay failed: {e}")

Notificaciones de Slack

Envía alertas de alta prioridad a un canal de Slack:
def send_slack_alert(payload, webhook_url):
    triggers = ", ".join(payload.get("policyAlertTriggers", []))
    message = {
        "text": f":rotating_light: *Security Alert*\n"
                f"Triggers: {triggers}\n"
                f"{payload.get('textDescription', 'No description')}"
    }
    try:
        requests.post(webhook_url, json=message, timeout=5)
    except requests.RequestException as e:
        print(f"Slack notification failed: {e}")

Registro en base de datos

Persiste eventos para análisis histórico:
import sqlite3
import json

def log_event(db_path, payload):
    conn = sqlite3.connect(db_path)
    conn.execute("""
        INSERT INTO events (entity, entity_uuid, change_type, device_uuid, timestamp_ms, payload)
        VALUES (?, ?, ?, ?, ?, ?)
    """, (
        payload.get("entity"),
        payload.get("entityUuid"),
        payload.get("type"),
        payload.get("deviceUuid"),
        payload.get("timestampMs"),
        json.dumps(payload)
    ))
    conn.commit()
    conn.close()
Last modified on April 30, 2026