CreaRack-SL

Hito B · Honestidad de Adapters Signage (push real vs monitor-only)

Resumen

Segunda iniciativa del Plan Hardening post-Máster. Declara honestamente qué vendors de digital signage pueden enviar contenido a través de una API REST pública integrable, frente a aquellos que solo se monitorizan (SNMP) y controlan (display protocols), pero cuyo contenido se gestiona por su propio portal.

Hasta esta sesión (s96), el catálogo de adapters decía soportar push de contenido en los 12 vendors, pero solo 4 lo hacían de verdad. Los otros 8 resolvían a un fallback silencioso que reportaba éxito pero el contenido se perdía (Regla 13 “no fakes”).

Cambios principales

Nuevos Adapters con Push Real

Se implementan 3 adapters con integración de push de contenido real contra APIs REST públicas:

  1. Yodeck (signage/services/adapters/yodeck.py)

    • API: https://api.yodeck.com/v1
    • Auth: Token (header Authorization: Token <api_token>)
    • Push: POST /media/ (formulario multipart)
    • Endpoints: /monitors/, /playlists/, /schedules/, /proof-of-play/
  2. Signagelive (signage/services/adapters/signagelive.py)

    • API: https://api.signagelive.com/v1
    • Auth: OAuth (POST /token → Bearer token)
    • Push: POST /media (FormData con file + name)
    • Endpoints: /players, /media, /playlists, /schedules, /proof-of-play
  3. IAdea (signage/services/adapters/iadea.py)

    • API: http://<ip>:8080/v2 (local)
    • Auth: Token (GET param ?access_token=...)
    • Push: PUT /user-data/<filename> (raw binary)
    • Endpoints: /app/info, /app/start, /app/screenshot, /system/reboot

⚠ Nota crítica: Ninguno de los 3 adapters ha sido verificado contra hardware real. Se han construido siguiendo la documentación oficial de cada fabricante y validados con tests automáticos (mocks de aiohttp), pero requieren ajuste fino al probar en un equipo real.

Vendors marcados como Monitor-Only

Se marca honestamente como push_content: False y content_push_method: 'none' cinco vendors que no exponen una API REST pública de push de contenido:

  • Crestron: XiO Cloud es device-management (≤1 req/5 min), no CMS.
  • Philips: SICP/CMND son protocolos de control/display, no upload. Portal CMND es privado.
  • Barco: TransForm N es CMS de control rooms, sin API de push de contenido en el dispositivo.
  • Christie: Sin evidencia de API de push de contenido disponible.
  • NEC/Sharp: SoC Android + SDK privado; contenido gestiona solo por su portal/SDK partner.

Estos 5 conservan toda su funcionalidad de monitorización (SNMP) y control (PJLink/MDC/LG/SICP/CIP); solo dejan de aparentar un push que nunca ocurría.

Cambios en Registry

signage/services/adapters/registry.py:

  • Eliminado fallback silencioso: Antes, cualquier slug desconocido resolvía a GenericSNMP, cuyo push_content() devolvía False sin avisar. Ahora, un slug no registrado lanza ValueError explícitamente.
  • Mapeo explícito de 12 vendors:
    • 7 con push real: spinetix, brightsign, samsung, lg, yodeck, signagelive, iadea
    • 5 monitor-only (resuelven a GenericSNMP): crestron, philips, barco, christie, nec_sharp
    • 1 genérico: generic_snmp
  • Helper supports_real_push(slug: str) -> bool: Consulta la lista blanca de pushes reales. Usado por la API para indicar a la UI cuáles vendors pueden desplegar contenido.

Cambios en API

signage/api/players.py, endpoint list_adapters:

  • Añade un campo push_implemented: bool a cada vendor en la respuesta.
  • Derivado del registry mediante supports_real_push(slug).
  • Permite a la UI mostrar claramente qué vendors aceptan contenido vs. cuáles no.

signage/api/schemas.py, VendorAdapterOut:

  • Nuevo campo push_implemented: bool (default False).
  • Documentado como derivado del registry, distingue push real de status-only.

Migration

signage/migrations/0011_honest_monitor_only_adapters.py:

  • RunPython que marca los 5 monitor-only con capabilities['push_content'] = False y content_push_method = 'none'.
  • Reverse restaura los flags originales del seed 0002 (reversible).

Tests

tests/signage/test_adapters.py (16 nuevos tests):

  • Registry sin fallback silencioso: slug desconocido → ValueError.
  • Vendors monitor-only resuelven a GenericSNMP.
  • supports_real_push() retorna el valor correcto.
  • Los 3 adapters nuevos hacen un mock call al endpoint documentado (sin hardware).

Impacto al usuario

  • Pantallas existentes (SpinetiX, BrightSign, Samsung, LG): Sin cambios funcionales; siguen enviando contenido como antes.
  • Nuevos vendors de push (Yodeck, Signagelive, IAdea): Ahora disponibles. ⚠ Sin verificación E2E contra hardware real; el equipo operativo debe probar contra un dispositivo físico antes de usar en producción.
  • Pantallas “monitor-only” (Crestron, Philips, Barco, Christie, NEC/Sharp): Dejan de prometer falsa capacidad de push. Siguen siendo válidas para monitorización (SNMP) y control (display protocols).
  • API del UI: El campo push_implemented permite a la interfaz alertar si el usuario intenta enviar contenido a un vendor que no lo soporta.

Vías futuras

  • Philips CMND: Posible integración si se negocia acceso al developer program.
  • NEC/Sharp: Posible integración si se decide invertir en soporte del SDK del SoC Android.

Véase también

  • [[entity—signage—service—yodeck-adapter]]
  • [[entity—signage—service—signagelive-adapter]]
  • [[entity—signage—service—iadea-adapter]]
  • [[entity—signage—service—adapter-registry]]
  • [[entity—signage—model—signage-vendor-adapter]]
  • [[concept—signage—honestidad-api]]
  • [[concept—product—regla-no-fakes]]