Manual de uso
Niebla para fotografía: índice físico y fusión bayesiana multimodelo.
1. Qué es y qué no es
Es una página HTML autónoma que consulta la API pública de Open‑Meteo y estima el riesgo de niebla o bruma en las próximas horas y en la ventana del próximo amanecer, pensada para decidir si merece la pena salir a fotografiar. No es un modelo de capa límite ni sustituye al aviso oficial: es una herramienta de favorabilidad, con una segunda capa bayesiana que aprende de tus observaciones locales.
Dos pestañas. La primera, “Índice de niebla”, usa un único modelo numérico y muestra el índice hora a hora con toda la física visible. La segunda, “Fusión bayesiana”, descarga varios modelos en paralelo, convierte cada uno en una probabilidad y los combina en un posterior, ponderando cada modelo según lo bien que ha acertado en tu registro.
2. Instalación
No hay nada que instalar. Tres formas de usarla:
Local. Guarda niebla.html y manual-niebla.html en una carpeta y abre niebla.html con el navegador. Funciona con doble clic (origen file://).
GitHub Pages. Sube los dos archivos a un repositorio, activa Pages en Settings → Pages (rama main, carpeta raíz) y accede a https://usuario.github.io/repositorio/. El archivo se llama niebla.html precisamente para que sea la página de entrada.
Móvil. Abre la URL de Pages en el navegador del teléfono y añádela a la pantalla de inicio. El botón “Usar mi posición” pide permiso de geolocalización; en Pages funciona porque el sitio se sirve por HTTPS.
3. Controles comunes
| Control | Función |
|---|---|
| Latitud, Longitud | Punto para el que se pide la previsión. Se puede escribir a mano (formato decimal, longitud oeste negativa) o rellenar con “Usar mi posición”. |
| Entorno | Costero activa el término de niebla de advección y descarga la temperatura superficial del mar (SST). Interior lo desactiva y ahorra una petición. |
| Acimut hacia el mar | Solo aparece en modo Costero. Rumbo en grados desde el punto hacia el mar abierto. No entra en el índice: sirve para que la ficha etiquete cada hora con viento “del mar” o “de tierra”, contando como del mar la dirección que cae a menos de 60° del acimut. Déjalo vacío si no lo sabes. |
| ES / EN | Cambia el idioma de la interfaz y del manual. La elección se recuerda. |
| Manual | Abre este documento. |
4. Pestaña 1: índice de niebla
Selector de modelo
“Mejor disponible” deja que Open‑Meteo elija el modelo de mayor resolución para el punto (en Europa occidental suele ser ICON‑EU o AROME). Los demás fuerzan un modelo concreto; útil para comparar.
Tarjetas
Próximas 6 horas: máximo del índice en ese intervalo y a qué hora. Amanecer: máximo en la ventana de 2.5 h antes a 1.5 h después de la salida del sol, que es cuando la niebla de radiación alcanza su desarrollo y cuando interesa estar en el sitio. Mínima depresión del punto de rocío: el valor de ΔT = T − Td más bajo previsto esta noche, con T, Td, viento, nubes, SST y presión en ese instante. Es el dato físico más directo: si no baja de 1 °C, difícilmente habrá niebla de radiación.
Ventana fotográfica
Dentro de la tarjeta del amanecer, la línea “Ventana fotográfica” contesta a la pregunta práctica: de qué hora a qué hora hay algo que fotografiar. Busca el máximo del índice entre el amanecer −4 h y +6 h y recorta el tramo continuo que se mantiene por encima de 50 puntos, interpolando entre horas en los dos bordes, así que devuelve un intervalo con minutos y una duración. Si el pico llega a 75 la etiqueta es “niebla plena”; entre 50 y 74, “solo bruma”; si no se pasa de 50 en ninguna hora, no hay niebla que defender. Avisa además cuando el tramo dura menos de una hora y cuando el máximo cae más de media hora después del amanecer. La misma tarjeta da la dirección del viento (y si es del mar o de tierra, cuando has puesto el acimut), enlaza con la ficha de luz natural para la hora dorada y recuerda que el tramo posterior al amanecer descansa sobre el factor heurístico 0.85, la parte menos firme del cálculo.
Comparar con otro sitio (A o B)
El botón “Comparar con otro sitio” abre un segundo juego de latitud, longitud y entorno, y descarga el sitio B con el mismo modelo y la misma tubería que el A. La sección “A o B” pone las dos tarjetas del próximo amanecer una junto a otra, dibuja las dos curvas del índice y da un veredicto: ve a A, ve a B, o empate práctico si la diferencia es menor de 8 puntos, en cuyo caso deciden el acceso, la composición y la hora de salida. La comparación vive solo en esta pestaña: la fusión bayesiana y el registro de observaciones siguen siendo de un único emplazamiento, el de las coordenadas de arriba, porque mezclar dos sitios estropearía el aprendizaje.
Próximas mañanas
Una fila por amanecer, hasta siete días, con el máximo del índice dentro de la ventana −2.5 h/+1.5 h, el veredicto, la mínima depresión del punto de rocío de esa noche y el viento, las nubes medias y altas y la visibilidad de la hora del máximo. La última columna es la confianza según el plazo: los dos primeros amaneceres son la previsión de verdad, el tercero y el cuarto son orientativos y del quinto en adelante es una tendencia, no una previsión. Debajo, una frase dice cuál es la mejor mañana de la semana o que ninguna pasa de 50. Es la única vista que llega a siete días; la banda, las gráficas y la tabla horaria siguen cubriendo 48 horas.
Banda horaria
Una barra por hora, 48 horas. Altura = índice. Fondo gris = noche. Hora en rojo = amanecer. Color ámbar = bruma posible (50 a 74), rojizo = niebla probable (≥ 75). Al pasar el ratón se ven las señales activas. Las horas que caen dentro de la ventana fotográfica quedan recuadradas en ámbar.
De qué se compone el índice
Una barra apilada por hora con los puntos que aporta cada término, en el mismo orden en que se calculan; la lluvia se dibuja hacia abajo porque resta. La marca negra corta al valor final del índice, ya con el factor diurno aplicado y saturado a 100, y una marca gris en lo alto señala las horas en que la suma bruta se pasaba de 100. Sirve para ver qué término limita cada hora: si la barra se queda corta por el segmento de nubes, el freno es la nubosidad media y alta y no la humedad; si el segmento de ΔT es alto y el total sigue bajo, el freno es el viento. El recuadro ámbar marca la ventana fotográfica.
Gráfica de convergencia
T y Td en °C sobre el eje izquierdo; viento en km/h sobre el derecho. Las franjas rosadas marcan las horas con ΔT < 2 °C (más intensas si < 1 °C). La línea discontinua roja es el amanecer. La imagen que buscas: T y Td acercándose durante la noche, viento por debajo de 10 km/h y fondo gris sin nubes. Al pie, una barra morada marca las horas con visibilidad prevista por debajo de 2 km, más saturada por debajo de 1 km.
Qué vas a ver: contraste, distancia y focal
Una calculadora de contraste por visibilidad, para saber qué encuadre aguanta la niebla que se espera. Por la ley de Koschmieder, un objeto oscuro sobre el fondo del cielo conserva un contraste C/C₀ = exp(−3.912·d/V), de donde el 20 % de contraste queda a 0.41·V y el 5 % a 0.77·V. Los dos deslizadores recorren la visibilidad de 0.2 a 10 km y la distancia al sujeto de 20 m a 3 km, y el selector cubre de 28 a 135 mm. Las tarjetas dan el contraste residual con su lectura (volumen y textura, plano, apenas insinuado, desaparecido) y el campo horizontal, 36·d/f en formato 24×36: a 200 m un 43 mm abarca 167 m y un 135 mm, 53 m. Debajo, la curva completa y una tabla a 50, 150, 500 y 1000 m. La visibilidad arranca en la que el modelo da para el máximo del amanecer, o en un escenario supuesto a partir del índice si ese modelo no publica visibilidad; “Volver a la previsión” deshace los ajustes a mano.
Tabla horaria
Todas las variables usadas más dirección del viento (con la etiqueta del mar o de tierra si has puesto el acimut), nubes bajas, SST y presión. La columna “Vis km” es la visibilidad que pronostica el propio modelo: es su diagnóstico más directo de niebla, pero también la variable menos fiable de Open‑Meteo, así que léela como un escenario y no como una medida. Por debajo de 3 km apoya al resto de señales; por sí sola no decide, y de ahí que pese como mucho 20 puntos frente a los 40 de ΔT.
Fórmula del índice
| Término | Puntos | Justificación |
|---|---|---|
| ΔT = T − Td | 40 si ≤ 0.5 °C; lineal a 0 en 4 °C | Saturación. Condición necesaria. |
| Viento 10 m | <2: 14 · 2–8: 20 · 8–15: 8 · 15–20: 3 · >20: 0 | Niebla de radiación: algo de mezcla turbulenta la profundiza; calma absoluta da rocío; viento fuerte la impide. |
| Nubosidad sobre la capa (medias y altas) | <25 %: 20 · 25–60 %: 8 · >60 %: 0 (mitad de día) | Cielo despejado por encima = enfriamiento radiativo del suelo. Se usa máx(medias, 0.6·altas), no el total: la nubosidad baja de un modelo suele ser la propia niebla y no debe penalizar. Solo cuenta como estratos (y penaliza) si la visibilidad prevista es buena. |
| Visibilidad modelo | <1 km: 20 · <3 km: 10 · <6 km: 4 · sin dato: 5 | Diagnóstico directo del modelo. Los modelos que no la publican reciben un valor neutro para no quedar sistemáticamente por debajo. |
| Persistencia | +2 por hora nocturna previa consecutiva con ΔT < 1.5 °C y viento < 12 km/h, máximo +8 | La niebla necesita horas de enfriamiento: una saturación mantenida desde medianoche vale más que un instante a las 06:00. |
| HR ≥ 97 % | +10 | Redundante con ΔT pero robusto a redondeos. |
| Lluvia > 0.5 mm | −15 | Precipitación activa suele ir con nubes y viento. |
| Advección (costero) | hasta +30 si Td − SST > 0 y viento 8–30 km/h | Aire húmedo sobre mar más frío se enfría hasta saturar. No necesita calma ni cielo despejado. |
| Día | × 0.65; × 0.85 en las dos horas siguientes al amanecer | La radiación solar disipa la capa, pero tarda; justo después del amanecer la niebla suele seguir y es el mejor momento fotográfico. |
5. Pestaña 2: fusión bayesiana
Selección de modelos
Cada casilla es un modelo. Se descargan en paralelo con un límite de 12 s cada uno; los que no llegan a tiempo se descartan y se indica “timeout”. Tras cada cálculo aparece el tiempo de respuesta de cada modelo. Si alguno es sistemáticamente lento en tu conexión, desmárcalo: la selección se recuerda. Por defecto están activos ICON, GFS, AROME/ARPEGE, ECMWF y UKMO.
Cómo se combina: consenso y contracción
Primero se forma un consenso de los modelos como media ponderada en log‑odds: logit p̄ = Σ w_m · logit p_m / Σ w_m. Esta media está garantizadamente dentro de la envolvente: nunca por encima del modelo más alto ni por debajo del más bajo. Después el posterior se obtiene contrayendo ese consenso hacia la climatología local: logit P = logit π + γ · (logit p̄ − logit π). El resultado queda siempre entre tu tasa local π y el consenso p̄.
Parámetro γ
Cuánto te fías de los modelos frente a la climatología, entre 0.1 y 1 (defecto 0.7). Con γ = 1 el posterior es el consenso puro; con valores bajos se pega a la frecuencia histórica de tu registro. Mantener γ por debajo de 1 es razonable mientras la conversión de índice a probabilidad no esté contrastada con tus observaciones; la recalibración automática (ver más abajo) va supliendo este ajuste a mano a medida que acumulas noches.
Fuentes ensemble (EPS/ENS)
Además de los modelos deterministas hay fuentes de conjunto: el mismo modelo ejecutado 30 a 50 veces con perturbaciones. Para ellas la probabilidad no sale de la logística, sino de los propios miembros (media de las probabilidades de los miembros), lo que refleja la incertidumbre real de la atmósfera esa noche. ICON EPS viene activada por defecto; GFS ENS y ECMWF ENS son más pesadas y están desmarcadas.
Recalibración automática
Con 12 o más noches registradas, la aplicación ajusta una corrección de Platt q = σ(a·logit P + b) sobre los pares (posterior congelado, resultado observado), con prior a ≈ 1, b ≈ 0 para que pocas noches no la distorsionen. Corrige el sesgo sistemático del posterior; cuando está activa, la línea de estado muestra "recalibrado (n, a, b)".
Tarjetas
Posterior para las próximas 6 horas y para la ventana del amanecer, con el rango mínimo a máximo entre modelos y la probabilidad individual de cada uno. La tercera tarjeta da la desviación típica entre modelos en el amanecer: acuerdo alto (< 10 pp), moderado o desacuerdo. Un posterior del 40 % con acuerdo alto es una previsión más útil que un 55 % con desacuerdo. La tarjeta del amanecer trae además su propia ventana fotográfica, medida sobre el posterior con umbral del 25 % (“niebla plena” a partir del 50 %), y, para las fuentes de conjunto, la banda p10–p90 y cuántos miembros dan niebla.
Gráfica
Una línea fina por modelo, banda gris con el rango y línea gruesa negra con el posterior. Eje vertical en %.
Tablas
“Estado del amanecer por modelo” muestra, para cada modelo, su probabilidad máxima en la ventana y el estado físico previsto en esa hora. “Pesos bayesianos y prior” muestra w_m, el Brier, el porcentaje de aciertos (con el número de noches congeladas entre paréntesis), la log‑verosimilitud acumulada y el prior Beta actual. La log‑verosimilitud es lo que fija el peso; Brier y aciertos son la misma información en unidades legibles.
6. Entrenamiento: registro de observaciones
El aprendizaje consiste en comparar lo que cada modelo predijo con lo que tú viste. Para que la comparación sea honesta, la predicción tiene que quedar fijada antes de conocer el resultado. La herramienta lo hace sola:
Congelación automática. Cada vez que pulsas “Calcular” en la pestaña 2, las probabilidades de cada modelo para la ventana del próximo amanecer se guardan asociadas a la fecha de esa noche (la noche se identifica por la fecha de la tarde, es decir, el día anterior al amanecer). Si calculas varias veces, se conserva la última, que es la previsión más reciente antes del amanecer. La línea de estado indica “Previsión congelada para la noche del …”.
Por la mañana. El campo “Noche del” aparece ya con la fecha de la noche recién terminada (antes de las 14:00 propone ayer; después, hoy). Elige lo observado (Niebla si la visibilidad fue inferior a 1 km; Bruma o neblina si hubo reducción notable pero superior a 1 km; Nada) y pulsa “Guardar observación”. La observación se empareja con la previsión que se congeló la víspera para esa fecha. No importa que a esa hora ya exista una previsión nueva para mañana: no se usa.
Si esa noche no calculaste. No hay previsión congelada para esa fecha. La observación se guarda igualmente (aparece como “pendiente” en la columna posterior) y actualiza el prior climatológico, que solo necesita saber si hubo niebla o no; pero no modifica los pesos de los modelos, porque no hay predicción con la que compararla. Si más tarde ese mismo día calculas antes de que el amanecer cambie de fecha, la fila se completa automáticamente.
Con cada observación ocurren dos cosas. El prior Beta se actualiza (a += y, b += 1 − y, con y = 1, 0.5 o 0), de modo que la tasa base deja de ser el 12 % genérico y pasa a ser tu frecuencia local. Y la log‑verosimilitud de cada modelo acumula log P_m(y): un modelo que daba 80 % y hubo niebla suma log 0.8; uno que daba 10 % suma log 0.1. Los pesos w_m se recalculan como exp(0.7 · log‑verosimilitud) normalizado.
Debajo de la tabla del registro, “Lecciones de tu registro” resume tus umbrales locales a partir de las noches con rasgos congelados: con qué ΔT y qué viento previstos ha llegado a haber niebla o bruma en tu sitio, con cuánta nubosidad media y con qué visibilidad prevista, y cuál fue la noche sin nada con menor ΔT. Es la parte del registro que más deprisa cambia lo que haces en el campo.
Orientación sobre cantidad: con 10 noches los pesos ya empiezan a separarse; con 40 o 50 tienen significado; con más de 100 merece la pena pasar a una regresión logística sobre las variables crudas.
7. Datos y privacidad: dónde se guarda el registro
Todo el registro (observaciones, probabilidades, selección de modelos, idioma) se guarda con localStorage en el navegador desde el que se usa la página. Nada se envía a ningún servidor; GitHub solo sirve el HTML estático y no recibe ni conserva tus datos. Implicaciones concretas:
| Situación | Qué pasa con el registro |
|---|---|
| Misma URL, mismo navegador, mismo dispositivo | Persiste indefinidamente, aunque cierres el navegador o hagas push de una nueva versión del HTML. |
| Otro navegador u otro dispositivo | No está: localStorage es por navegador y por origen. Usa Exportar e Importar JSON. |
Abrir el archivo en local (file://) y también desde Pages (https://) | Son orígenes distintos; cada uno tiene su propio registro. Exporta de uno e importa en el otro. |
| Borrar datos de navegación o “datos de sitios” | Se pierde. Exporta el JSON de vez en cuando y guárdalo en el propio repositorio, por ejemplo. |
| Modo incógnito | Se borra al cerrar la ventana. |
Otras páginas en el mismo origen (usuario.github.io) | Comparten el espacio de localStorage; las claves de datos usadas aquí empiezan por niebla_ (niebla_bayes, niebla_models, niebla_lang) para no colisionar. La única excepción es pn-lang, la preferencia de idioma compartida a propósito con las demás páginas del sitio. |
8. Interpretación y buenas prácticas
Señal fuerte de niebla de radiación: ΔT previsto por debajo de 1 °C a partir de medianoche, viento entre 2 y 8 km/h, nubes por debajo del 25 %, presión alta y en ascenso, y visibilidad modelada menor de 3 km (esta última, la variable menos fiable del lote: apoya, no arbitra). Si además varios modelos coinciden (desacuerdo < 10 pp), la probabilidad es alta.
Señal de niebla de advección (costa): punto de rocío del aire uno o dos grados por encima de la SST, viento moderado del mar, humedad alta. Puede darse con cielo nublado y viento de 15 o 20 km/h; en esos casos la pestaña 1 en modo interior la infravalora.
Cuándo desconfiar: valles estrechos, zonas con suelo muy húmedo tras lluvia reciente o embalses y ríos, donde la niebla local se forma con ΔT previsto de 2 o 3 °C. Los modelos no resuelven esa escala; tu registro sí la captura, de ahí la importancia del prior local.
Calibración: la pestaña 2 dibuja ahora este diagrama de fiabilidad por ti, en la sección «Calibración» junto a la tabla de pesos: agrupa las filas del registro por posterior congelado (0–25 %, 25–50 %, 50–75 %, 75–100 %) y pinta cada grupo como un punto (posterior medio, frecuencia real de niebla) sobre la diagonal de calibración perfecta, con área proporcional al número de noches. La lectura sigue siendo la misma que harías a mano: si las frecuencias reales son sistemáticamente más extremas que el posterior, sube γ; si son menos extremas, bájalo; si los puntos se pegan a la diagonal, deja γ como está. La herramienta orienta a partir de unas 10 noches; la lectura es fiable a partir de 30.
9. Ajustes avanzados (editar el HTML)
Todas las constantes están al principio de la sección de la pestaña 2 en niebla.html:
const PI0=0.12, A0=1.2, B0=8.8 // prior Beta inicial (media 0.12) const LAMBDA=0.7 // tempering de los pesos const TH=70, KAP=11 // logística p = σ((s − TH)/KAP) const RECAL_N=12, RECAL_TAU=6 // noches mínimas y anchura del prior de Platt const TIMEOUT=12000 // ms por modelo (los ensembles usan +8 s)
En el archivo van todas en una sola línea const; aquí se abren para poder comentarlas.
El parámetro γ se cambia desde la propia interfaz. Los pesos w_m y el consenso se calculan en run2(); la contracción hacia la climatología es la línea logit P = logit π + γ·(logit p̄ − logit π).
Los pesos del índice están en la función score(), común a ambas pestañas. Para añadir un modelo, amplía el array MODELS con el identificador de Open‑Meteo (por ejemplo jma_seamless). Las coordenadas por defecto están en los atributos value de los campos de latitud y longitud, y de latitud B y longitud B para el sitio de comparación. La ventana fotográfica se recorta en winRange() y sus umbrales viajan en las llamadas a winTxt() (50 y 75 en la pestaña 1; 0.25 y 0.5 en la pestaña 2). La tabla de próximas mañanas está en morn(), el desglose en brk1() y la calculadora de contraste en renderK().
10. Problemas frecuentes
| Síntoma | Causa y solución |
|---|---|
| “Ningún modelo respondió a tiempo” | Open‑Meteo saturado o conexión lenta. Reintenta, reduce la selección o sube TIMEOUT. |
| Un modelo siempre en “timeout” | Desmárcalo; la fusión funciona con los que respondan. |
| “sin SST, advección desactivada” | El punto está tierra adentro para la API marina o la petición falló. En interior es lo esperado; en costa, prueba a mover el punto unos cientos de metros hacia el mar. |
| “Vis km” en blanco para algún modelo | Ese modelo no publica visibilidad (ECMWF, por ejemplo). El índice se calcula sin ese término. |
| El registro desapareció | Cambio de navegador, de dispositivo, de origen (file → https) o borrado de datos. Importa el JSON exportado. |
| “Usar mi posición” no hace nada | Permiso denegado o página servida sin HTTPS. Escribe las coordenadas a mano. |