Actualizaciones de transmisión

Home Assistant ha aprendido un nuevo truco para obtener la información más reciente del servidor: actualizaciones en streaming. La interfaz ya no realizará una encuesta cada 30 segundos en busca de actualizaciones, sino que mantendrá una conexión abierta y recibirá los últimos cambios tan pronto como se produzcan.

Se agregó una nueva opción a la barra lateral para activar y desactivar las actualizaciones de transmisión. Esta preferencia se guardará para cada navegador utilizando el almacenamiento local. La palanca también indicará cuando haya un error al configurar una transmisión, después de lo cual volverá a utilizar el sondeo.

Las actualizaciones de transmisión se han implementado utilizando HTML5. EventSource etiqueta. La implementación es bastante sencilla ya que toda la lógica de reconexión será manejada por la etiqueta de origen del evento. El código del lado del servidor tiene 50 líneas y el código del lado del cliente tiene 80 líneas de código.

Todos los eventos que sucedan en el servidor ahora también se enviarán al navegador. Esto convierte cualquier navegador que ejecute la interfaz de usuario en una instancia esclava de Home Assistant en pleno funcionamiento. Esto abre nuevas posibilidades para los componentes de Home Assistant que viven completamente del lado del cliente.

La implementación de EventSource no estuvo exenta de desafíos. Éstos son algunos de los problemas que tuvieron que resolverse:

Una conexión puede quedar obsoleta en Chrome sin que se llame a ningún controlador de eventos. Esto sucede cuando un dispositivo entra en modo de espera. En las computadoras esto es raro, pero en los teléfonos ocurre con bastante frecuencia. Esto se solucionó enviando un ping regular desde el servidor. La interfaz asumirá que la conexión se ha quedado obsoleta cuando no haya escuchado ninguna comunicación durante un tiempo. Enviar un ping también ayudará al servidor a detectar conexiones rotas y limpiarlas.

Otro problema que encontré es que Safari y Firefox no activaban el open evento cuando se ha abierto la conexión pero cuando se ha recibido el primer mensaje. Para solucionar este problema, el servidor ahora activará un ping cuando se abra la conexión.