Controla la privacidad de las cámaras Reolink desde Home Assistant

Después de un gran parón en el que no me he pasado por aquí, (pero que no significa que me haya estado quieto), vuelvo con otra entrada relacionada con Home Assistant y el mundo de la domótica.

Aprovechando los prime day de Amazon, me hice con una cámara Reolink E1 Zoom, la cual estaba a bastante buen precio, y había visto que funcionaba bastante bien en local, cosa que con la Xiaomi nohe conseguido... y con la Tapo, Pi-Hole me muestra que abusa mucho del cloud.

En cuanto me llegó la instalé, actualicé y estuve probando un rato su funcionamiento, haciendo uso de la app, del cliente web que trae incorporado... y en cuanto la trasteé un poco, la integré con Home Assistant. Y ahí empezó "la fiesta"...

No voy a hablar aquí de cómo instalar y configurar la cámara porque no tiene misterio alguno. Pero sí me parece reseñable comentar que la integración de Reolink en Home Assistant fue bastante sencilla. Dicha integración viene ya con el sistema (sin necesidad de add-on extra ni de usar HACS), por lo que bastó con agregarla desde el centro de integraciones y configurar la cámara que acababa de instalar, haciendo uso del protocolo RTSP.

La integración oficial trae bastantes opciones para manejar la cámara, si bien el control remoto no me termina de convencer... no me permite controlar la cámara como tal, sino que va de extremo a extremo (si pulso sobre PTZ derecha se va al extremo derecho, e igual con el resto de puntos cardinales, sin poder controlar los movimientos de la cámara realmente). Pero no me preocupa de momento (de momeeeeeento), pues la quiero para que se active cuando pongo la alarma y se desactive cuando estoy en casa, al igual que ya hacía con la Tapo. Y es aquí donde descubrí... que no existe esa opción.

Desde la aplicación de Reolink puedo crear una máscara de privacidad (que no es más que un rectángulo sobre la imagen que "tapa" lo que hay detrás), pero es algo que no puedo hacer desde Home Assistant. Y buscando soluciones, acabé dando con una... ¡y de milagro, pues ya me planteaba devolverla! Y os cuento cómo, por si os viene bien a vosotros.

Resulta que, como tal, la cámara no tiene modo de privacidad. La solución que encontré fue la de usar las máscaras de privacidad haciendo que taparan el 100% del ángulo de visión de la cámara, de tal forma que sería lo mismo que tener un interruptor de privacidad.

La solución la encontré en este hilo del foro de Home Assistant, aunque me vi obligado a realizar algunos pequeños cambios, pues no me funcionaba como tal. Los pasos son los siguientes:

1. Obtener el script de control

Lo primero será obtener el siguiente script y descargarlo en nuestra máquina. Lo podemos obtener de este enlace. Tendremos que editar los siguientes campos con la información de conexión a nuestra cámara:

HOST="$REOLINK_NVR_HOST" # IP de la cámara
USER="$REOLINK_NVR_USER" # Usuario
PASS="$REOLINK_NVR_PASS" # Contraseña

Variables a modificar en el script

Le damos permisos de ejecución mediante chmod +x y pasamos al siguiente punto.

2. Crear y obtener la máscara de privacidad

Desde la app de Reolink, (o desde el cliente web) nos vamos a la configuración de la cámara, de ahí a Pantalla y entramos en Máscara de privacidad. Una vez ahí, definimos una nueva dibujando un rectángulo que ocupe toda la pantalla y le damos a guardar.

Para obtener la máscara de privacidad, hacemos uso del script del paso previo y ejecutamos lo siguiente:

./rl-api.sh GetMask '{"channel":0}' | jq '.' -c > json_mask_on

Comando para guardar la máscara actual en un fichero

Esto nos guardará la máscara en un fichero JSON, cuyo contenido será algo similar a esto:

{"Mask":{"area":[{"block":{"height":810,"width":1080,"x":0,"y":0},"screen":{"height":810,"width":1080}}],"channel":0,"enable":1}}

Ejemplo del contenido del fichero con la máscara activa

A continuación, desde la app (o el cliente web) borramos la máscara de privacidad de la cámara (haciendo lo mismo que antes pero eliminándola en esta ocasión) y ejecutamos el script de nuevo, guardándola a un nuevo fichero:

./rl-api.sh GetMask '{"channel":0}' | jq '.' -c > json_mask_off

Comando para guardar la máscara actual (deshabilitada) en un fichero

El contenido del fichero ahora será algo parecido a esto:

{"Mask":{"area":null,"channel":0,"enable":0}}

Ejemplo del contenido del fichero con la máscara inactiva

3. Copiar ficheros a Home Assistant

A continuación, deberemos copiar tanto el script que acabamos de usar, como los ficheros json_mask_[on|off] al directorio /config, el mismo donde tenemos el fichero configuration.yml

4. Añadir los comandos a Home Assistant

Una vez tenemos los ficheros, deberemos editar el fichero configuration.yml y añadirle las siguientes líneas:

shell_command:
  disable_cam_1: bash /config/rl-api.sh SetMask $(cat /config/json_mask_on)
  enable_cam_1: bash /config/rl-api.sh SetMask $(cat /config/json_mask_off)

Comandos añadidos a Home Assistant

Tras ello, hay que reiniciar Home Assistant.

5. Probar el comando y añadirlo a las automatizaciones

Una vez hemos hecho todo esto, sólo nos queda comprobar que todo funciona. Para ello, dentro de las Herramientas para desarrolladores (o Developer tools), nos vamos a la pestaña de Acciones, allí buscamos Shell command y seleccionamos uno de los dos, en función de cómo esté la cámara en ese momento (si está con la máscara puesta, seleccionamos disable_cam_1, por ejemplo). Al ejecutarlo, deberemos tener una salida como la siguiente:

stdout: |-
  {
    "rspCode": 200
  }
stderr: ""
returncode: 0

Respuesta OK tras ejecutar el comando

Si nos da un 200, y visualizamos la cámara, deberíamos ver un rectángulo negro. Si ahora ejecutamos el otro comando (que hemos llamado enable_cam_1), la cámara debería mostrarnos la imagen que esté enfocando en ese momento.

Máscara de privacidad activa en la cámara, visto desde Home Assistant

Así es como se ve en mi Home Assistant la cámara con la máscara activa. Además, le he añadido un par de botones para poder activarla o desactivarla manualmente. El código para ellos es el siguiente:

show_name: true
show_icon: false
type: button
name: Desactivar
icon: mdi:cctv-off
tap_action:
  action: call-service
  service: shell_command.disable_cam_1
layout_options:
  grid_columns: 2
  grid_rows: 1

Tarjeta para el botón de Desactivar cámara o aplicar máscara de privacidad

Y para activarla, basta con cambiar el service por enable_cam_1.

De la misma forma, en la automatización basta con añadir un paso que se encargue de ejecutar una acción (lo que antes se conocía como servicio) y que llame al shell_command.[enable|disable]_cam_1 en función de lo que queramos hacer.

Conclusión

Si bien me hubiera gustado que la integración oficial de Reolink tuviera este tipo de opciones disponibles directamente, al menos de esta forma tenemos un control totalmente local de nuestra cámara que nos permite obtener esa privacidad para cuando estamos en casa y no queremos estar "vigilados".

La entrada ha quedado bastante larga, por lo que dejo para otra la explicación de cómo visualizo las cámaras mediante la integración de webRTC, en lugar de usar la entidad de cámara propiamente dicha, que da bastante lag, así como el obtener instantáneas y recibir notificaciones con ellas (o bien a través de Telegram, por ejemplo).

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección: