Volver al portafolio

En construcción · Open source

Leufü Wechun

La DGA sólo publica el nivel de las estaciones que ya están en alerta: cuando el dato aparece, el río ya cruzó el umbral. Leufü Wechun recupera el caudal de las 55 estaciones fluviométricas de La Araucanía, detecta las crecidas por cercanía al umbral y por tendencia, y avisa mientras todavía queda margen de reacción.

Interfaz de Leufü Wechun: panel de alertas, mapa de estaciones y ficha del Río Trancura en alerta
Tipo
Proyecto open source · sin fines de lucro
Rol
Producto y desarrollo full-stack
Estado
En construcción · código público
Python FastAPI SQLAlchemy Alembic PostgreSQL PostGIS React Vite Leaflet Recharts

El problema: el dato llega cuando ya es tarde

La Dirección General de Aguas publica el estado de sus estaciones en un visor público. Pero tiene una limitación que lo inutiliza para prevenir: sólo informa el nivel de las estaciones que ya están en alerta. Las demás aparecen con valor 0.0 aunque estén transmitiendo con normalidad.

La magnitud del problema se ve en los números: a nivel nacional, de las 1.837 estaciones del visor, sólo 9 traen medición. Son exactamente las mismas 9 que están en alerta. Con esa única fuente no se puede anticipar nada, porque para cuando el dato existe, el río ya cruzó el umbral.

Y en sectores rurales ese margen es justamente lo único que hay: viviendas dispersas, sin sistema de aviso local, donde muchas veces la primera señal de una crecida es el ruido del agua.

Recuperar el dato que el visor no entrega

La solución pasa por entender que el visor hace dos llamadas distintas, no una. La primera devuelve el listado completo de estaciones con sus coordenadas y su estado, y es la que trae los ceros. La segunda es la que el visor dispara al pinchar un marcador: un POST de RichFaces que devuelve ultimoCaudalReg, el caudal real en m³/s de cualquier estación, esté o no en alerta.

Esa segunda llamada exige mantener la cookie de sesión y el javax.faces.ViewState, y va una petición por estación: unos 170 segundos para recorrer las 55 de la región. A cambio, 45 de esas 55 pasan a informar caudal donde antes había un cero.

Dos señales, y siempre gana la peor

Mapa de estaciones con marcadores coloreados según su nivel de alerta

Cada estación se evalúa por dos caminos independientes, y se toma el más grave de los dos. No se promedian: el nivel se mide en metros y el caudal en m³/s, así que mezclarlos daría un número sin significado físico.

La detección por tendencia es lo que hace que la alerta sea temprana, y tiene un detalle que decide si funciona o no: compara contra la lectura más antigua de la ventana, no contra la anterior. Una crecida que sube un 15 % por hora durante seis horas duplica el caudal sin que ninguna comparación consecutiva llegue a delatarla.

Además funciona en estaciones que no publican umbral, que de otro modo quedarían ciegas. Y hay una regla que no se negocia: cuando la DGA declara alerta oficialmente, el sistema nunca rebaja el nivel por debajo de «alerta». Es la fuente oficial y no se la contradice.

Episodios, no lecturas

Ficha de una estación con su estado, umbral e historial de nivel

El sistema no guarda una alerta por cada medición alta: registra episodios. Uno se abre cuando la estación deja de estar normal y se cierra cuando vuelve a estarlo.

La diferencia importa al mirar el historial. Con lecturas sueltas, la pregunta que puede responder es «cuántas mediciones altas hubo»; con episodios, «cuántas crecidas hubo», que es la que le interesa a alguien que vive junto al río.

De ahí sale también el criterio para avisar: sólo se emite un evento cuando el estado cambia — se abre, escala, desciende o se resuelve. Mientras el nivel se mantiene, el episodio se actualiza en silencio, para no ahogar a los vecinos en notificaciones repetidas de algo que ya saben.

Arquitectura

Backend en FastAPI con SQLAlchemy sobre PostgreSQL 16 con PostGIS, en las mismas capas que uso en el resto de mis proyectos: models → schemas → services → routes. La lógica de evaluación vive en alert_service.py, aislada del transporte, y por eso se puede probar sin levantar la API.

El frontend es React 19 con Vite, el mapa va sobre Leaflet con teselas de OpenStreetMap —que no piden clave de API, algo que importa en un proyecto que aspira a ser replicable sin costes— y el historial se dibuja con Recharts. Las alertas viajan por WebSocket con reconexión progresiva, así que el panel cambia solo cuando el estado de un río cambia.

La ingesta corre aparte, como servicio o desde cron, y va acumulando la serie histórica. Es una necesidad, no una elección: el visor de la DGA sólo entrega una fotografía del instante, nunca el pasado. El historial que muestra la ficha de cada estación existe porque este sistema lo construyó sondeando.

Por qué es open source

Porque el destinatario no tiene con qué pagarlo. Una junta de vecinos rural o un municipio pequeño no va a licitar un sistema de alerta temprana, y ese es exactamente el lugar donde más falta hace.

Con el código abierto, otra región puede instalarlo, ajustar los umbrales a sus ríos y mantenerlo sin depender de mí. Un proyecto de seguridad comunitaria que dependa de que su autor siga interesado es un proyecto frágil; abrirlo es lo que le da posibilidad de sobrevivir.

En qué está hoy

Funcionando sobre datos reales de las 55 estaciones de La Araucanía, con el repositorio público. Todavía no hay despliegue abierto al público ni el canal de notificación que cierra el círculo: hoy el sistema detecta y muestra, y el siguiente paso es que el aviso salga hacia el vecino sin que nadie tenga que estar mirando la pantalla.

Ver código en GitHub Ver otros proyectos

Repositorio público. El nombre viene del mapudungun: leufü es río, wechun es cumbre — el punto al que sube el agua.