En una reunión, Parte 2: La CLI

Imagen de Gemini Nano Banana + Ommi

Hace dos años, escribí un artículo sobre cómo encender un cartel de “EN DIRECTO” cuando la webcam está encendida (y apagarlo cuando la webcam se apaga).

Como mencioné en el post original, esto es muy útil para mí, ya que comparto el despacho en casa con mi mujer. Nos permite saber cuándo el otro está en una reunión, incluso si no está hablando, para que podamos evitar hacer ruido.

Gracias al poder de Home Assistant, el caso de uso se ha vuelto más complejo. Por ejemplo, ahora enciendo una pantalla de 32x32 píxeles, los Govee Hexa y otros dispositivos cuando estamos “en directo”.

Cuando me uní a New Relic en 2024, empecé a usar un ordenador macOS y necesité encontrar una forma de hacer lo mismo en un Mac, ya que el método de detección (v4l2) no funciona en macOS. Adapté el script que @antonmry creó para macOS, pero macOS Tahoe cambió la entrada de registro monitorizada por el script, así que tuve que modificarlo.

Fue en ese momento cuando pensé en crear una herramienta de CLI para simplificar esto tanto para Linux como para macOS:

https://github.com/sergiocarracedo/on-a-meet

on-a-meet CLI

Esta es una herramienta de CLI sencilla. Solo necesitas instalarla usando Homebrew:

brew tap sergiocarracedo/homebrew-tap
brew install on-a-meet

Luego ejecuta el asistente de configuración (onboarding):

on-a-meet onboard

Te preguntará sobre:

  1. El modo de detección: en Linux, podemos usar v4l2 o lsof
  2. La cámara a monitorizar: todas las cámaras o una cámara específica
  3. Los tiempos de debounce y polling
  4. Los comandos a ejecutar cuando el estado cambie a ON u OFF. Pueden contener variables de entorno. Por ejemplo, para establecer el input boolean en Home Assistant: curl -X POST http://192.168.0.104:8123/api/states/input_boolean.on_a_meet -H 'Content-Type: application/json' -d '{\"state\": \"on\"}' -H 'Authorization: Bearer ${HASS_TOKEN}'
  5. El archivo desde el cual cargar las variables de entorno, si las usas (opcional)
  6. Te pedirá que pruebes que todo funciona y que se detecta el estado de la cámara
  7. Si deseas instalar el servicio

Después de eso, la herramienta se instala como un servicio que gestiona los cambios en el estado de la cámara.

Consulta la documentación para más detalles: https://github.com/sergiocarracedo/on-a-meet#configuration

Míralo en acción (de nuevo)

Trabajando con múltiples ordenadores en Home Assistant

Como mencioné antes, comparto esta señal de “EN DIRECTO” con mi mujer. Esto significa que la luz debe estar encendida si la webcam de uno de los ordenadores está encendida, pero no debe apagarse inmediatamente cuando una cámara se apaga si la otra sigue encendida.

En Home Assistant, gestiono eso creando un ayudante (helper) de tipo input boolean para cada ordenador y encendiendo la luz mediante una automatización:

Automatización de encendido (Turn ON)

alias: On a meet light
  description: ''
  triggers:
    - entity_id:
        - input_boolean.on_a_meet
      to:
        - 'on'
      trigger: state
    - entity_id:
        - input_boolean.on_a_meet_mac
      to:
        - 'on'
      trigger: state
    - entity_id:
        - input_boolean.on_a_meet_patri
      to:
        - 'on'
      trigger: state
    - trigger: state
      entity_id:
        - input_boolean.on_a_meet_patri_xps
      to:
        - 'on'
  conditions:
    - condition: state
      entity_id: input_boolean.office_sleep_mode
      state: 'off'
  actions:
    - action: scene.turn_on
      metadata: {}
      target:
        entity_id: scene.office_on_a_meet
      data: {}
  mode: single

Automatización de apagado (Turn OFF)

alias: On a meet off

triggers:
  - entity_id:
      - input_boolean.on_a_meet
    to: 'off'
    trigger: state
  - entity_id:
      - input_boolean.on_a_meet_mac
    to: 'off'
    trigger: state
  - entity_id:
      - input_boolean.on_a_meet_patri
    to: 'off'
    trigger: state
  - trigger: state
    entity_id:
      - input_boolean.on_a_meet_patri_xps
    to:
      - 'off'
conditions:
  - condition: state
    entity_id: input_boolean.on_a_meet
    state: 'off'
  - condition: state
    entity_id: input_boolean.on_a_meet_mac
    state: 'off'
  - condition: state
    entity_id: input_boolean.on_a_meet_patri
    state: 'off'
  - condition: state
    entity_id: input_boolean.on_a_meet_patri_xps
    state: 'off'
actions:
  - action: scene.turn_on
    metadata: {}
    target:
      entity_id: scene.office_on_a_meet_off
mode: single

Como puedes ver, usamos este método para cuatro ordenadores (portátiles personales y de trabajo), y funciona bien.

Espero que encuentres útil esta herramienta de CLI, y cualquier comentario es bienvenido, como de costumbre.

Selecciona a Sergio Carracedo como fuente preferida en Google