{
 "region": "kankakee",
 "region_name": "Kankakee / Bourbonnais",
 "run_time": "2026-10-16T00:24-05:00",
 "morning": "2026-10-16",
 "sites": [
  {
   "id": "home",
   "name": "Home (Bourbonnais, 60914)",
   "lat": 41.153,
   "lon": -87.879,
   "features": [
    "corn",
    "tree line"
   ],
   "drone_status": "unknown",
   "sun": {
    "civil_dawn": "06:36",
    "sunrise": "07:04",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:18",
    "sun_12deg": "08:15"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.049,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.069,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.4 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:19:34.589136-05:00",
     "est_end": "2026-10-16 07:49:34.589136-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 72 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.4000000000000004,
       "dpd_key": 2.8000000000000007,
       "rh_max": 85,
       "wind_mean": 13.75,
       "wind_after": 12.65,
       "gust_max": 27.6,
       "cloud_mh_night": 46.63636363636363,
       "cloud_low_night": 95.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16600.0,
       "low_sunrise": 72.5,
       "vis_min": 15700.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.9,
       "t_key": 9.9,
       "cooling": 9.999999999999998,
       "t_min_night": 9.9,
       "td_afternoon": 16.700000000000003,
       "crossover": -6.8000000000000025,
       "td_drop": 9.600000000000003,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.7,
         "Td": 19.9,
         "RH": 95,
         "wind": 11.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 19.8,
         "Td": 18.8,
         "RH": 94,
         "wind": 12.3,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "23:00",
         "T": 18.4,
         "Td": 16.9,
         "RH": 91,
         "wind": 17.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "00:00",
         "T": 16.2,
         "Td": 14.4,
         "RH": 89,
         "wind": 16.0,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 12.7,
         "RH": 86,
         "wind": 14.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "02:00",
         "T": 13.6,
         "Td": 11.2,
         "RH": 85,
         "wind": 15.0,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "03:00",
         "T": 12.0,
         "Td": 9.6,
         "RH": 85,
         "wind": 15.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "04:00",
         "T": 11.3,
         "Td": 8.9,
         "RH": 85,
         "wind": 15.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "05:00",
         "T": 11.3,
         "Td": 8.4,
         "RH": 82,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.0
        },
        {
         "t": "06:00",
         "T": 10.9,
         "Td": 7.9,
         "RH": 82,
         "wind": 13.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "07:00",
         "T": 9.9,
         "Td": 7.1,
         "RH": 83,
         "wind": 13.2,
         "low": 45,
         "mid": 0,
         "high": 0,
         "vis": 16600.0
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 7.0,
         "RH": 81,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 6.5,
         "RH": 77,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19100.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 6.3,
         "RH": 78,
         "wind": 13.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "11:00",
         "T": 10.6,
         "Td": 6.5,
         "RH": 76,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.3,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.64,
        "why": "overnight mid+high levels cloud = 47 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 16.7 \u00b0C \u2192 -6.8 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 9.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 15.7 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 95 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.042
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.299999999999999,
       "dpd_key": 1.5999999999999996,
       "rh_max": 92,
       "wind_mean": 12.0,
       "wind_after": 11.899999999999999,
       "gust_max": 19.8,
       "cloud_mh_night": 88.18181818181819,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 61.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.6,
       "t_key": 8.6,
       "cooling": 13.000000000000002,
       "t_min_night": 8.6,
       "td_afternoon": 18.65,
       "crossover": -10.049999999999999,
       "td_drop": 11.649999999999999,
       "airmass_change": true,
       "precip_night_mm": 1.2,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.5,
         "Td": 19.3,
         "RH": 99,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.4,
         "Td": 19.2,
         "RH": 99,
         "wind": 8.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.0,
         "Td": 18.0,
         "RH": 100,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.2,
         "Td": 16.0,
         "RH": 99,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 14.6,
         "Td": 14.1,
         "RH": 97,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.2,
         "Td": 12.2,
         "RH": 94,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 11.8,
         "Td": 10.5,
         "RH": 92,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 9.3,
         "RH": 92,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 8.8,
         "RH": 92,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 8.0,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.6,
         "Td": 7.0,
         "RH": 90,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.2,
         "RH": 92,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 7.7,
         "RH": 83,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 7.8,
         "RH": 78,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.0 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.22,
        "why": "overnight total cloud (levels unavailable) cloud = 88 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 13.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.6 \u00b0C vs afternoon dewpoint 18.6 \u00b0C \u2192 -10.0 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.086
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.9,
       "dpd_key": 5.9,
       "rh_max": 72,
       "wind_mean": 14.175,
       "wind_after": 13.65,
       "gust_max": 30.3,
       "cloud_mh_night": 28.545454545454547,
       "cloud_low_night": 62.81818181818182,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 38.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.7,
       "t_key": 10.8,
       "cooling": 9.899999999999999,
       "t_min_night": 10.8,
       "td_afternoon": 18.0,
       "crossover": -7.199999999999999,
       "td_drop": 13.1,
       "airmass_change": true,
       "precip_night_mm": 0.30000000000000004,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.5,
         "Td": 19.8,
         "RH": 96,
         "wind": 13.7,
         "low": 80,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.7,
         "Td": 18.7,
         "RH": 94,
         "wind": 12.9,
         "low": 80,
         "mid": 26,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.3,
         "Td": 16.8,
         "RH": 91,
         "wind": 12.5,
         "low": 83,
         "mid": 44,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.5,
         "Td": 14.2,
         "RH": 86,
         "wind": 13.7,
         "low": 87,
         "mid": 67,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 11.9,
         "RH": 82,
         "wind": 15.0,
         "low": 85,
         "mid": 76,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.8,
         "Td": 10.0,
         "RH": 78,
         "wind": 15.5,
         "low": 73,
         "mid": 57,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.7,
         "Td": 8.4,
         "RH": 75,
         "wind": 15.1,
         "low": 55,
         "mid": 24,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.9,
         "Td": 7.0,
         "RH": 72,
         "wind": 14.8,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.4,
         "Td": 6.1,
         "RH": 70,
         "wind": 14.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.0,
         "Td": 5.4,
         "RH": 68,
         "wind": 13.9,
         "low": 35,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.8,
         "Td": 4.9,
         "RH": 67,
         "wind": 13.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.9,
         "Td": 4.6,
         "RH": 65,
         "wind": 13.5,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.2,
         "Td": 4.4,
         "RH": 63,
         "wind": 13.8,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.3,
         "Td": 4.3,
         "RH": 62,
         "wind": 13.9,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 4.7,
         "RH": 64,
         "wind": 13.7,
         "low": 63,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.9 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.89,
        "why": "overnight mid+high levels cloud = 29 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.8 \u00b0C vs afternoon dewpoint 18.0 \u00b0C \u2192 -7.2 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 13.1 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 72 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.9 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.017
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.999999999999999,
       "dpd_key": 4.6,
       "rh_max": 82,
       "wind_mean": 13.575,
       "wind_after": 12.5,
       "gust_max": 29.4,
       "cloud_mh_night": 71.81818181818181,
       "cloud_low_night": 79.27272727272727,
       "cloud_mh_sunrise": 2.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 53.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.8,
       "t_key": 9.6,
       "cooling": 10.200000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 16.25,
       "crossover": -6.65,
       "td_drop": 11.25,
       "airmass_change": true,
       "precip_night_mm": 1.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.0,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.6,
         "Td": 18.7,
         "RH": 89,
         "wind": 15.2,
         "low": 100,
         "mid": 83,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.6,
         "Td": 17.0,
         "RH": 85,
         "wind": 14.0,
         "low": 100,
         "mid": 65,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.9,
         "Td": 16.3,
         "RH": 85,
         "wind": 13.2,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.5,
         "Td": 14.7,
         "RH": 84,
         "wind": 15.9,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.6,
         "Td": 12.5,
         "RH": 82,
         "wind": 12.3,
         "low": 87,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.8,
         "Td": 11.1,
         "RH": 79,
         "wind": 15.9,
         "low": 90,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.1,
         "Td": 8.7,
         "RH": 75,
         "wind": 16.4,
         "low": 88,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.6,
         "Td": 6.3,
         "RH": 70,
         "wind": 15.6,
         "low": 43,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 5.9,
         "RH": 75,
         "wind": 14.0,
         "low": 43,
         "mid": 61,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.7,
         "Td": 6.7,
         "RH": 82,
         "wind": 12.5,
         "low": 77,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 5.0,
         "RH": 73,
         "wind": 12.2,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.2,
         "Td": 5.3,
         "RH": 77,
         "wind": 11.7,
         "low": 53,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.3,
         "Td": 4.9,
         "RH": 74,
         "wind": 13.3,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 5.0,
         "RH": 70,
         "wind": 13.7,
         "low": 70,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 6.1,
         "RH": 71,
         "wind": 14.3,
         "low": 84,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.15,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.38,
        "why": "overnight mid+high levels cloud = 72 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 16.2 \u00b0C \u2192 -6.7 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 82 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.048
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 7.7,
    "soil_moisture_top": 0.227,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 202.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 202.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 202.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 202.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.9,
   "dawn_wind_kt": 13.2
  },
  {
   "id": "midewin-iron-bridge-trailhead",
   "name": "Midewin National Tallgrass Prairie - Iron Bridge Trailhead",
   "lat": 41.3789147,
   "lon": -88.1230504,
   "agency": "USDA Forest Service, Midewin National Tallgrass Prairie",
   "agency_url": "https://www.fs.usda.gov/r09/midewin/recreation/iron-bridge-trailhead",
   "dawn_access": "\"Visitors and trail users are welcome to the open areas of Midewin every day of the year from 4 am until 10 pm.\" (hiking page); trailhead page: \"Trails: year-round, Mon - Sun, 4:00 a.m. to 10:00 p.m. (Closed on federal holidays)\"",
   "dawn_access_ok": true,
   "drone_rule": "Midewin links to the national FS page: \"Individuals and organizations may fly UAS for hobby or recreational purposes\"; \"UAS must be flown below 400 feet\"; \"Keep your UAS away from populated and noise-sensitive areas, such as campgrounds, trail heads, and visitor centers.\" Midewin safety page: \"Avoid Drone Use Near Bison\". Forest Orders page: \"Currently there are no active Forest Orders at Midewin National Tallgrass Prairie.\" No Midewin-specific filming/commercial permit rule found.",
   "drone_rule_url": "https://www.fs.usda.gov/visit/know-before-you-go/recreational-drone-tips",
   "drone_status": "allowed",
   "features": [
    "prairie",
    "tree line",
    "farmland"
   ],
   "features_source": "FS trailhead page: \"Adjacent to the Iron Bridge Trailhead is Midewin's second largest restoration prairie\"; OSM Overpass within 1.5 km: 2 tree_row ways, 1 farmland polygon, 21 stream/river ways; USGS 3DEP: site 639 ft, 1.5 km ring 608-643 ft (flat). Coordinates: OSM node 1233563855 (FS trailhead).",
   "drive_minutes_est": 43,
   "airspace_note": "FAA Class_Airspace data: Chicago Class E5 (floor 700 ft AGL) + Illinois Class E5; surface is Class G. No UAS Facility Map grid. KJOT 8.7 nm, Dresden Generating Station 6.6 nm, Braidwood 9.4 nm. Not in any national-security UAS restriction layer.",
   "notes": "Drive time is an OSRM estimate. FS tips page cites Section 336 (outdated wording) and says to fly >=5 miles from an airport (KJOT is 8.7 nm away). Bison are present at Midewin; location of herd vs this trailhead not verified.",
   "look": "deep-bank aerial over prairie + tree rows; lone-tree shots from the trail",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:05",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:19",
    "sun_12deg": "08:17"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.051,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.058,
    "confidence": "high",
    "confidence_why": "4 models within 0.06 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.3 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:20:47.629401-05:00",
     "est_end": "2026-10-16 07:50:47.629401-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 100 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.3000000000000007,
       "dpd_key": 2.5999999999999996,
       "rh_max": 86,
       "wind_mean": 13.3,
       "wind_after": 12.5,
       "gust_max": 27.0,
       "cloud_mh_night": 14.181818181818182,
       "cloud_low_night": 100.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16900.0,
       "low_sunrise": 100.0,
       "vis_min": 15700.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.2,
       "t_key": 10.0,
       "cooling": 9.2,
       "t_min_night": 10.0,
       "td_afternoon": 16.450000000000003,
       "crossover": -6.450000000000003,
       "td_drop": 9.050000000000002,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.100000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.9,
         "Td": 19.0,
         "RH": 95,
         "wind": 11.7,
         "low": 100,
         "mid": 4,
         "high": 0,
         "vis": 12300.0
        },
        {
         "t": "22:00",
         "T": 19.4,
         "Td": 18.1,
         "RH": 92,
         "wind": 13.2,
         "low": 100,
         "mid": 4,
         "high": 0,
         "vis": 6100.0
        },
        {
         "t": "23:00",
         "T": 17.0,
         "Td": 15.5,
         "RH": 91,
         "wind": 14.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13900.0
        },
        {
         "t": "00:00",
         "T": 14.9,
         "Td": 13.1,
         "RH": 89,
         "wind": 14.1,
         "low": 100,
         "mid": 47,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "01:00",
         "T": 14.1,
         "Td": 12.1,
         "RH": 88,
         "wind": 15.0,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "02:00",
         "T": 12.7,
         "Td": 10.4,
         "RH": 86,
         "wind": 15.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.4,
         "RH": 86,
         "wind": 14.8,
         "low": 100,
         "mid": 0,
         "high": 1,
         "vis": 15900.0
        },
        {
         "t": "04:00",
         "T": 11.3,
         "Td": 9.0,
         "RH": 86,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "05:00",
         "T": 11.0,
         "Td": 8.7,
         "RH": 86,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "06:00",
         "T": 10.5,
         "Td": 8.0,
         "RH": 85,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 10.0,
         "Td": 7.4,
         "RH": 84,
         "wind": 12.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 6.8,
         "RH": 81,
         "wind": 11.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "09:00",
         "T": 9.3,
         "Td": 6.7,
         "RH": 84,
         "wind": 13.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "10:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 12.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "11:00",
         "T": 9.9,
         "Td": 7.1,
         "RH": 83,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.32,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 14 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 10.0 \u00b0C vs afternoon dewpoint 16.5 \u00b0C \u2192 -6.5 \u00b0C; rain last 48 h = 10.1 mm; BUT dewpoint falls 9.1 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 15.7 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 100 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.051
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.5,
       "dpd_key": 2.0,
       "rh_max": 90,
       "wind_mean": 14.15,
       "wind_after": 14.3,
       "gust_max": 21.2,
       "cloud_mh_night": 87.45454545454545,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 63.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.1,
       "t_key": 8.6,
       "cooling": 12.500000000000002,
       "t_min_night": 8.6,
       "td_afternoon": 18.5,
       "crossover": -9.9,
       "td_drop": 11.9,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.3,
         "Td": 19.0,
         "RH": 98,
         "wind": 9.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "22:00",
         "T": 19.2,
         "Td": 18.7,
         "RH": 97,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 17.7,
         "Td": 17.2,
         "RH": 97,
         "wind": 14.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 15.8,
         "Td": 15.2,
         "RH": 96,
         "wind": 14.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7960.0
        },
        {
         "t": "01:00",
         "T": 14.3,
         "Td": 13.2,
         "RH": 93,
         "wind": 14.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "02:00",
         "T": 12.9,
         "Td": 11.5,
         "RH": 91,
         "wind": 14.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 12760.0
        },
        {
         "t": "03:00",
         "T": 11.6,
         "Td": 9.9,
         "RH": 89,
         "wind": 15.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 9.0,
         "RH": 90,
         "wind": 14.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 8.5,
         "RH": 90,
         "wind": 14.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 7.6,
         "RH": 89,
         "wind": 14.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.6,
         "Td": 6.6,
         "RH": 87,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.0,
         "RH": 90,
         "wind": 14.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 7.5,
         "RH": 84,
         "wind": 14.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 7.8,
         "RH": 82,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 8.1,
         "RH": 79,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.6,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.23,
        "why": "overnight total cloud (levels unavailable) cloud = 87 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.6 \u00b0C vs afternoon dewpoint 18.5 \u00b0C \u2192 -9.9 \u00b0C; rain last 48 h = 10.1 mm; BUT dewpoint falls 11.9 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.077
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.1,
       "dpd_key": 5.2,
       "rh_max": 76,
       "wind_mean": 12.125,
       "wind_after": 12.55,
       "gust_max": 28.2,
       "cloud_mh_night": 21.727272727272727,
       "cloud_low_night": 65.63636363636364,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 42.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.0,
       "t_key": 10.5,
       "cooling": 9.5,
       "t_min_night": 10.5,
       "td_afternoon": 17.25,
       "crossover": -6.75,
       "td_drop": 11.95,
       "airmass_change": true,
       "precip_night_mm": 1.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.7000000000000455,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.9,
         "Td": 19.8,
         "RH": 99,
         "wind": 12.5,
         "low": 86,
         "mid": 22,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.3,
         "Td": 19.0,
         "RH": 98,
         "wind": 12.3,
         "low": 90,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 17.9,
         "Td": 16.9,
         "RH": 94,
         "wind": 12.2,
         "low": 88,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.1,
         "Td": 14.1,
         "RH": 88,
         "wind": 13.1,
         "low": 83,
         "mid": 48,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 14.5,
         "Td": 11.6,
         "RH": 83,
         "wind": 14.3,
         "low": 77,
         "mid": 52,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.3,
         "Td": 9.9,
         "RH": 80,
         "wind": 14.1,
         "low": 68,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.3,
         "Td": 8.5,
         "RH": 78,
         "wind": 13.0,
         "low": 57,
         "mid": 16,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 7.4,
         "RH": 76,
         "wind": 12.3,
         "low": 49,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.0,
         "Td": 6.5,
         "RH": 74,
         "wind": 12.0,
         "low": 44,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.7,
         "Td": 5.8,
         "RH": 72,
         "wind": 12.0,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.5,
         "Td": 5.3,
         "RH": 70,
         "wind": 12.2,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 4.9,
         "RH": 68,
         "wind": 12.4,
         "low": 44,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 4.9,
         "RH": 67,
         "wind": 12.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 4.8,
         "RH": 66,
         "wind": 12.6,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 5.1,
         "RH": 67,
         "wind": 12.2,
         "low": 66,
         "mid": 4,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.04,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.98,
        "why": "overnight mid+high levels cloud = 22 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 10.5 \u00b0C vs afternoon dewpoint 17.2 \u00b0C \u2192 -6.8 \u00b0C; rain last 48 h = 10.1 mm; BUT dewpoint falls 11.9 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 76 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.1 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.019
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.8,
       "rh_max": 80,
       "wind_mean": 11.25,
       "wind_after": 11.05,
       "gust_max": 27.6,
       "cloud_mh_night": 64.81818181818181,
       "cloud_low_night": 78.18181818181819,
       "cloud_mh_sunrise": 26.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 18.7,
       "t_key": 9.5,
       "cooling": 9.2,
       "t_min_night": 9.5,
       "td_afternoon": 15.9,
       "crossover": -6.4,
       "td_drop": 11.2,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.0,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.3,
         "Td": 17.8,
         "RH": 91,
         "wind": 12.7,
         "low": 100,
         "mid": 83,
         "high": 3,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.7,
         "Td": 16.6,
         "RH": 88,
         "wind": 12.1,
         "low": 100,
         "mid": 83,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 17.8,
         "Td": 15.4,
         "RH": 86,
         "wind": 12.9,
         "low": 100,
         "mid": 99,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.2,
         "Td": 12.8,
         "RH": 80,
         "wind": 12.8,
         "low": 92,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.4,
         "Td": 11.5,
         "RH": 78,
         "wind": 12.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.2,
         "Td": 9.6,
         "RH": 74,
         "wind": 13.6,
         "low": 94,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.3,
         "Td": 7.6,
         "RH": 73,
         "wind": 14.5,
         "low": 49,
         "mid": 86,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 5.9,
         "RH": 71,
         "wind": 12.9,
         "low": 30,
         "mid": 58,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 6.7,
         "RH": 80,
         "wind": 10.6,
         "low": 49,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 6.4,
         "RH": 79,
         "wind": 10.8,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 4.7,
         "RH": 72,
         "wind": 10.7,
         "low": 63,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.1,
         "Td": 4.9,
         "RH": 75,
         "wind": 10.5,
         "low": 67,
         "mid": 0,
         "high": 49,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.3,
         "Td": 4.9,
         "RH": 74,
         "wind": 11.6,
         "low": 75,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.1,
         "Td": 5.7,
         "RH": 74,
         "wind": 12.1,
         "low": 94,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 6.6,
         "RH": 73,
         "wind": 13.2,
         "low": 72,
         "mid": 53,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.11,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.09,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.45,
        "why": "overnight mid+high levels cloud = 65 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 15.9 \u00b0C \u2192 -6.4 \u00b0C; rain last 48 h = 10.1 mm; BUT dewpoint falls 11.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 11 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.052
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 10.1,
    "soil_moisture_top": 0.246,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.3789147&longitude=-88.1230504&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.3789147&longitude=-88.1230504&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 195.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.3789147&longitude=-88.1230504&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 195.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.3789147&longitude=-88.1230504&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 195.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.3789147&longitude=-88.1230504&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 195.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 10.0,
   "dawn_wind_kt": 12.7
  },
  {
   "id": "kankakee-river-state-park",
   "name": "Kankakee River State Park",
   "lat": 41.203,
   "lon": -87.979,
   "agency": "Illinois Department of Natural Resources",
   "agency_url": "https://dnr.illinois.gov/parks/park.kankakeeriver.html",
   "dawn_access": "No opening hours on the park page. Activities page: \"Quiet hours are 10 p.m. to 7 a.m. Vehicle traffic is not allowed during quiet hours.\"",
   "dawn_access_ok": false,
   "drone_rule": "17 Ill. Adm. Code 110.160(i): it is unlawful \"Except in cases of emergency, for any person to land or attempt to land any aircraft on Department-owned, -leased or -managed property without prior authorization for each landing or attempted landing from the Department.\" No site-specific drone page found for this site. The wording says 'aircraft', not 'drone/unmanned', and does not name the superintendent; treat as authorization required until the site office says otherwise.",
   "drone_rule_url": "https://www.ilga.gov/commission/jcar/admincode/017/017001100A01600R.html",
   "drone_status": "permit",
   "features": [
    "river",
    "river-valley relief"
   ],
   "features_source": "IDNR park page: \"Enveloping both sides of the Kankakee River for 11 miles... approximately 4,000 acres\"; USGS 3DEP at Warner Bridge Rd river crossing: 546 ft vs 586-623 ft on a 1.5 km ring (river valley 40-77 ft below rim). Coordinates: IDNR page Park Latitude/Longitude 41.203/-87.979 (park office area).",
   "drive_minutes_est": 12,
   "airspace_note": "Illinois Class E5 only (floor 1200 ft AGL); surface is Class G. KIKK 9.9 nm. Private strips nearby: Hawker (12IL) 1.7 nm, Classic Landings (05IL) 3.3 nm (OSM/FAA IDs).",
   "notes": "Vehicle ban until 7:00 am means pre-sunrise access by car is not allowed; sunrise is roughly 7:00-7:10 am CDT now but about 6:20-6:40 am CST after Nov 1. Walk-in before 7 is not addressed on the page. Park office: 815-933-1383, Mon-Fri 8:00-3:30 (metal detecting permit text). Hunting seasons run in the park (archery deer, waterfowl, upland).",
   "look": "river steam fog in the valley; rim gives an elevated view over the fog (drone needs IDNR authorization)",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:36",
    "sunrise": "07:05",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:19",
    "sun_12deg": "08:16"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.048,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.075,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.5 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:20:01.791269-05:00",
     "est_end": "2026-10-16 07:50:01.791269-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 100 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.9,
     "likely": false,
     "why": "river water +8.9 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 14 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.5,
       "dpd_key": 2.6000000000000005,
       "rh_max": 85,
       "wind_mean": 13.825,
       "wind_after": 13.8,
       "gust_max": 28.0,
       "cloud_mh_night": 45.72727272727273,
       "cloud_low_night": 99.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16700.0,
       "low_sunrise": 100.0,
       "vis_min": 16000.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.2,
       "t_key": 9.9,
       "cooling": 10.299999999999999,
       "t_min_night": 9.9,
       "td_afternoon": 16.9,
       "crossover": -6.999999999999998,
       "td_drop": 9.599999999999998,
       "airmass_change": true,
       "precip_night_mm": 0.4,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.7999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.5,
         "Td": 19.6,
         "RH": 95,
         "wind": 10.9,
         "low": 89,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 19.9,
         "Td": 18.8,
         "RH": 93,
         "wind": 13.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 12700.0
        },
        {
         "t": "23:00",
         "T": 18.1,
         "Td": 16.4,
         "RH": 90,
         "wind": 16.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 15.8,
         "Td": 14.3,
         "RH": 91,
         "wind": 17.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 14.9,
         "Td": 12.7,
         "RH": 87,
         "wind": 15.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "02:00",
         "T": 13.5,
         "Td": 11.0,
         "RH": 85,
         "wind": 15.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "03:00",
         "T": 12.1,
         "Td": 9.4,
         "RH": 84,
         "wind": 16.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 9.0,
         "RH": 85,
         "wind": 15.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "05:00",
         "T": 11.4,
         "Td": 8.6,
         "RH": 83,
         "wind": 14.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.0
        },
        {
         "t": "06:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 13.6,
         "low": 100,
         "mid": 1,
         "high": 0,
         "vis": 17000.0
        },
        {
         "t": "07:00",
         "T": 9.9,
         "Td": 7.3,
         "RH": 84,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 7.1,
         "RH": 82,
         "wind": 13.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 6.8,
         "RH": 81,
         "wind": 14.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17800.0
        },
        {
         "t": "10:00",
         "T": 9.7,
         "Td": 6.7,
         "RH": 82,
         "wind": 14.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "11:00",
         "T": 10.5,
         "Td": 7.0,
         "RH": 79,
         "wind": 13.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.28,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 46 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.3 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 16.9 \u00b0C \u2192 -7.0 \u00b0C; rain last 48 h = 9.4 mm; BUT dewpoint falls 9.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.0 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 99 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.041
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.1000000000000014,
       "dpd_key": 1.5000000000000009,
       "rh_max": 93,
       "wind_mean": 12.9,
       "wind_after": 13.2,
       "gust_max": 20.0,
       "cloud_mh_night": 88.0,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 64.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.5,
       "t_key": 8.3,
       "cooling": 13.2,
       "t_min_night": 8.3,
       "td_afternoon": 18.75,
       "crossover": -10.45,
       "td_drop": 11.95,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.3,
         "Td": 19.3,
         "RH": 100,
         "wind": 8.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.1,
         "Td": 19.1,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 17.8,
         "Td": 17.8,
         "RH": 100,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 15.9,
         "Td": 15.9,
         "RH": 100,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 14.2,
         "Td": 13.9,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 12.8,
         "Td": 11.9,
         "RH": 94,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 10.2,
         "RH": 92,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 9.2,
         "RH": 93,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.8,
         "Td": 8.7,
         "RH": 93,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 7.9,
         "RH": 92,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.3,
         "Td": 6.8,
         "RH": 90,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 7.1,
         "RH": 93,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 8.1,
         "RH": 84,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 8.1,
         "RH": 79,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.8,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.22,
        "why": "overnight total cloud (levels unavailable) cloud = 88 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 13.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 8.3 \u00b0C vs afternoon dewpoint 18.8 \u00b0C \u2192 -10.4 \u00b0C; rain last 48 h = 9.4 mm; BUT dewpoint falls 11.9 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.092
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.8999999999999995,
       "dpd_key": 5.9,
       "rh_max": 72,
       "wind_mean": 14.175,
       "wind_after": 13.65,
       "gust_max": 30.3,
       "cloud_mh_night": 28.545454545454547,
       "cloud_low_night": 62.81818181818182,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 38.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.8,
       "t_key": 11.0,
       "cooling": 9.8,
       "t_min_night": 11.0,
       "td_afternoon": 18.1,
       "crossover": -7.100000000000001,
       "td_drop": 13.000000000000002,
       "airmass_change": true,
       "precip_night_mm": 0.30000000000000004,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.6,
         "Td": 20.0,
         "RH": 96,
         "wind": 13.7,
         "low": 80,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.8,
         "Td": 18.8,
         "RH": 94,
         "wind": 12.9,
         "low": 80,
         "mid": 26,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.4,
         "Td": 16.9,
         "RH": 91,
         "wind": 12.5,
         "low": 83,
         "mid": 44,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.7,
         "Td": 14.3,
         "RH": 86,
         "wind": 13.7,
         "low": 87,
         "mid": 67,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.1,
         "Td": 12.1,
         "RH": 82,
         "wind": 15.0,
         "low": 85,
         "mid": 76,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.9,
         "Td": 10.1,
         "RH": 78,
         "wind": 15.5,
         "low": 73,
         "mid": 57,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.9,
         "Td": 8.5,
         "RH": 75,
         "wind": 15.1,
         "low": 55,
         "mid": 24,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.1,
         "Td": 7.2,
         "RH": 72,
         "wind": 14.8,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.5,
         "Td": 6.2,
         "RH": 70,
         "wind": 14.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.2,
         "Td": 5.5,
         "RH": 68,
         "wind": 13.9,
         "low": 35,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.0,
         "Td": 5.1,
         "RH": 67,
         "wind": 13.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.1,
         "Td": 4.7,
         "RH": 65,
         "wind": 13.5,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.3,
         "Td": 4.5,
         "RH": 63,
         "wind": 13.8,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.5,
         "Td": 4.4,
         "RH": 62,
         "wind": 13.9,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 4.8,
         "RH": 64,
         "wind": 13.7,
         "low": 63,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.9 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.89,
        "why": "overnight mid+high levels cloud = 29 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 11.0 \u00b0C vs afternoon dewpoint 18.1 \u00b0C \u2192 -7.1 \u00b0C; rain last 48 h = 9.4 mm; BUT dewpoint falls 13.0 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 72 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.9 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.017
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.500000000000001,
       "dpd_key": 4.6,
       "rh_max": 84,
       "wind_mean": 12.8,
       "wind_after": 12.15,
       "gust_max": 29.2,
       "cloud_mh_night": 69.45454545454545,
       "cloud_low_night": 80.27272727272727,
       "cloud_mh_sunrise": 10.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 60.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.4,
       "t_key": 9.7,
       "cooling": 9.7,
       "t_min_night": 9.7,
       "td_afternoon": 16.1,
       "crossover": -6.400000000000002,
       "td_drop": 11.000000000000002,
       "airmass_change": true,
       "precip_night_mm": 1.1,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.899999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.2,
         "Td": 18.5,
         "RH": 90,
         "wind": 14.2,
         "low": 100,
         "mid": 76,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.3,
         "Td": 16.9,
         "RH": 86,
         "wind": 13.2,
         "low": 100,
         "mid": 85,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.7,
         "Td": 16.3,
         "RH": 86,
         "wind": 12.8,
         "low": 100,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.9,
         "Td": 14.0,
         "RH": 83,
         "wind": 16.1,
         "low": 90,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.8,
         "Td": 12.5,
         "RH": 81,
         "wind": 12.7,
         "low": 99,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.8,
         "Td": 11.0,
         "RH": 78,
         "wind": 14.9,
         "low": 98,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.0,
         "Td": 8.7,
         "RH": 75,
         "wind": 16.4,
         "low": 79,
         "mid": 94,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 6.2,
         "RH": 70,
         "wind": 14.8,
         "low": 39,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.3,
         "RH": 77,
         "wind": 12.6,
         "low": 44,
         "mid": 23,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.3,
         "RH": 84,
         "wind": 11.7,
         "low": 75,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 5.1,
         "RH": 73,
         "wind": 12.1,
         "low": 59,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.3,
         "Td": 5.3,
         "RH": 76,
         "wind": 11.3,
         "low": 62,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 5.2,
         "RH": 75,
         "wind": 13.0,
         "low": 65,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 5.5,
         "RH": 72,
         "wind": 13.3,
         "low": 86,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 6.6,
         "RH": 73,
         "wind": 14.3,
         "low": 79,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.27,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.01,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.41,
        "why": "overnight mid+high levels cloud = 69 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.7 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 16.1 \u00b0C \u2192 -6.4 \u00b0C; rain last 48 h = 9.4 mm; BUT dewpoint falls 11.0 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 84 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 80 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 9.4,
    "soil_moisture_top": 0.237,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.203&longitude=-87.979&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.203&longitude=-87.979&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:00+00:00",
     "elevation_m": 182.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.203&longitude=-87.979&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 182.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.203&longitude=-87.979&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 182.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.203&longitude=-87.979&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 182.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 9.9,
   "dawn_wind_kt": 11.9
  },
  {
   "id": "perry-farm-park",
   "name": "Perry Farm Park",
   "lat": 41.1456745,
   "lon": -87.8849315,
   "agency": "Bourbonnais Township Park District",
   "agency_url": "https://www.btpd.org/perry-farm-park",
   "dawn_access": "\"Hours of Operation: Dawn until Dusk, Year Round\"",
   "dawn_access_ok": true,
   "drone_rule": "no rule found; default is FAA recreational/Part 107 rules (<=400 ft AGL, visual line of sight, Class G needs no authorization) but unverified for this site",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "river",
    "river-valley relief",
    "pond",
    "orchard/farmstead"
   ],
   "features_source": "BTPD page: \"the Indian Caves, a staple to the Kankakee River\", \"Centennial Orchard\", pond events; USGS 3DEP: park 656 ft vs 586 ft low point within 1.5 km (about 70 ft above the river valley). OSM within 1.5 km: 38 mapped tree nodes, 12 river/stream ways, 3 farmland polygons. Coordinates: Nominatim (OSM way 66311888).",
   "drive_minutes_est": 5,
   "airspace_note": "Kankakee Class E5 (floor 700 ft AGL) + Illinois Class E5; surface is Class G. KIKK 4.8 nm (inside the roughly 4-5 nm ring where a Class E surface area would sit, but FAA data shows no surface area). No UAS Facility Map grid.",
   "notes": "btpd.org site search for 'drone' returns no results and the Rules and Regulations page has no aircraft clause. Illinois law (620 ILCS 5/42.1(b-5)) lets a park district adopt reasonable rules for airspace over its parkland, so call 815-933-9905 to confirm. Park coordinates are the OSM centroid, not the overlook.",
   "look": "bluff ~70 ft above the river: ground-level view DOWN onto river fog without a drone; pond and orchard for lone-tree frames",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:36",
    "sunrise": "07:04",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:18",
    "sun_12deg": "08:15"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.049,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.069,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.5 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:19:35.547751-05:00",
     "est_end": "2026-10-16 07:49:35.547751-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 73 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.5,
     "likely": false,
     "why": "river water +8.5 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 14 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.5,
       "dpd_key": 2.8000000000000007,
       "rh_max": 85,
       "wind_mean": 13.5,
       "wind_after": 12.2,
       "gust_max": 27.6,
       "cloud_mh_night": 46.54545454545455,
       "cloud_low_night": 94.54545454545455,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16800.0,
       "low_sunrise": 73.0,
       "vis_min": 16000.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.1,
       "t_key": 10.3,
       "cooling": 9.8,
       "t_min_night": 10.3,
       "td_afternoon": 17.05,
       "crossover": -6.75,
       "td_drop": 9.55,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.7,
         "Td": 19.9,
         "RH": 95,
         "wind": 10.3,
         "low": 94,
         "mid": 1,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 19.9,
         "Td": 18.7,
         "RH": 93,
         "wind": 10.8,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "23:00",
         "T": 18.3,
         "Td": 16.8,
         "RH": 91,
         "wind": 17.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13600.0
        },
        {
         "t": "00:00",
         "T": 16.2,
         "Td": 14.6,
         "RH": 90,
         "wind": 15.9,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 12.7,
         "RH": 86,
         "wind": 14.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "02:00",
         "T": 13.6,
         "Td": 11.3,
         "RH": 86,
         "wind": 14.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "03:00",
         "T": 12.1,
         "Td": 9.4,
         "RH": 84,
         "wind": 15.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 11.4,
         "Td": 8.9,
         "RH": 85,
         "wind": 14.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "05:00",
         "T": 11.3,
         "Td": 8.3,
         "RH": 82,
         "wind": 13.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        },
        {
         "t": "06:00",
         "T": 10.9,
         "Td": 7.9,
         "RH": 82,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 7.5,
         "RH": 83,
         "wind": 12.9,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.3,
         "RH": 82,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 6.6,
         "RH": 79,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18600.0
        },
        {
         "t": "10:00",
         "T": 9.8,
         "Td": 6.5,
         "RH": 80,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17900.0
        },
        {
         "t": "11:00",
         "T": 10.4,
         "Td": 6.9,
         "RH": 79,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18600.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.28,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.65,
        "why": "overnight mid+high levels cloud = 47 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 17.1 \u00b0C \u2192 -6.8 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 9.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.0 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 95 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.041
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.299999999999999,
       "dpd_key": 1.5999999999999996,
       "rh_max": 92,
       "wind_mean": 12.0,
       "wind_after": 11.899999999999999,
       "gust_max": 19.8,
       "cloud_mh_night": 88.18181818181819,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 61.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.6,
       "t_key": 8.6,
       "cooling": 13.000000000000002,
       "t_min_night": 8.6,
       "td_afternoon": 18.7,
       "crossover": -10.1,
       "td_drop": 11.7,
       "airmass_change": true,
       "precip_night_mm": 1.2,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.5,
         "Td": 19.3,
         "RH": 99,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.4,
         "Td": 19.2,
         "RH": 99,
         "wind": 8.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.0,
         "Td": 18.0,
         "RH": 100,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.2,
         "Td": 16.0,
         "RH": 99,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 14.6,
         "Td": 14.1,
         "RH": 97,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.2,
         "Td": 12.2,
         "RH": 94,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 11.8,
         "Td": 10.5,
         "RH": 92,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 9.3,
         "RH": 92,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 8.8,
         "RH": 92,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 8.0,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.6,
         "Td": 7.0,
         "RH": 90,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.3,
         "RH": 92,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 7.7,
         "RH": 83,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 7.8,
         "RH": 78,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.0 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.22,
        "why": "overnight total cloud (levels unavailable) cloud = 88 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 13.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.6 \u00b0C vs afternoon dewpoint 18.7 \u00b0C \u2192 -10.1 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.7 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.086
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.9,
       "dpd_key": 5.9,
       "rh_max": 72,
       "wind_mean": 14.175,
       "wind_after": 13.65,
       "gust_max": 30.3,
       "cloud_mh_night": 28.545454545454547,
       "cloud_low_night": 62.81818181818182,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 38.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.7,
       "t_key": 10.9,
       "cooling": 9.799999999999999,
       "t_min_night": 10.9,
       "td_afternoon": 18.0,
       "crossover": -7.1,
       "td_drop": 13.0,
       "airmass_change": true,
       "precip_night_mm": 0.30000000000000004,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.5,
         "Td": 19.8,
         "RH": 96,
         "wind": 13.7,
         "low": 80,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.7,
         "Td": 18.7,
         "RH": 94,
         "wind": 12.9,
         "low": 80,
         "mid": 26,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.3,
         "Td": 16.8,
         "RH": 91,
         "wind": 12.5,
         "low": 83,
         "mid": 44,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.6,
         "Td": 14.2,
         "RH": 86,
         "wind": 13.7,
         "low": 87,
         "mid": 67,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 12.0,
         "RH": 82,
         "wind": 15.0,
         "low": 85,
         "mid": 76,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.8,
         "Td": 10.0,
         "RH": 78,
         "wind": 15.5,
         "low": 73,
         "mid": 57,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.8,
         "Td": 8.4,
         "RH": 75,
         "wind": 15.1,
         "low": 55,
         "mid": 24,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.0,
         "Td": 7.1,
         "RH": 72,
         "wind": 14.8,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.4,
         "Td": 6.1,
         "RH": 70,
         "wind": 14.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.1,
         "Td": 5.4,
         "RH": 68,
         "wind": 13.9,
         "low": 35,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.9,
         "Td": 5.0,
         "RH": 67,
         "wind": 13.5,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.0,
         "Td": 4.6,
         "RH": 65,
         "wind": 13.5,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.2,
         "Td": 4.4,
         "RH": 63,
         "wind": 13.8,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.4,
         "Td": 4.3,
         "RH": 62,
         "wind": 13.9,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 4.7,
         "RH": 64,
         "wind": 13.7,
         "low": 63,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.9 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.89,
        "why": "overnight mid+high levels cloud = 29 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.9 \u00b0C vs afternoon dewpoint 18.0 \u00b0C \u2192 -7.1 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 13.0 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 72 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.9 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.017
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.999999999999999,
       "dpd_key": 4.6,
       "rh_max": 82,
       "wind_mean": 13.575,
       "wind_after": 12.5,
       "gust_max": 29.4,
       "cloud_mh_night": 71.81818181818181,
       "cloud_low_night": 79.27272727272727,
       "cloud_mh_sunrise": 2.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 53.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.8,
       "t_key": 9.6,
       "cooling": 10.200000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 16.25,
       "crossover": -6.65,
       "td_drop": 11.25,
       "airmass_change": true,
       "precip_night_mm": 1.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.899999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.6,
         "Td": 18.7,
         "RH": 89,
         "wind": 15.2,
         "low": 100,
         "mid": 83,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.6,
         "Td": 17.0,
         "RH": 85,
         "wind": 14.0,
         "low": 100,
         "mid": 65,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.9,
         "Td": 16.3,
         "RH": 85,
         "wind": 13.2,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.5,
         "Td": 14.7,
         "RH": 84,
         "wind": 15.9,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.6,
         "Td": 12.5,
         "RH": 82,
         "wind": 12.3,
         "low": 87,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.8,
         "Td": 11.2,
         "RH": 79,
         "wind": 15.9,
         "low": 90,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.1,
         "Td": 8.7,
         "RH": 75,
         "wind": 16.4,
         "low": 88,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.6,
         "Td": 6.3,
         "RH": 70,
         "wind": 15.6,
         "low": 43,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 5.9,
         "RH": 75,
         "wind": 14.0,
         "low": 43,
         "mid": 61,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.7,
         "Td": 6.7,
         "RH": 82,
         "wind": 12.5,
         "low": 77,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 5.0,
         "RH": 73,
         "wind": 12.2,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.2,
         "Td": 5.4,
         "RH": 77,
         "wind": 11.7,
         "low": 53,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.3,
         "Td": 4.9,
         "RH": 74,
         "wind": 13.3,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 5.0,
         "RH": 70,
         "wind": 13.7,
         "low": 70,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 6.2,
         "RH": 71,
         "wind": 14.3,
         "low": 84,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.15,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.38,
        "why": "overnight mid+high levels cloud = 72 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 16.2 \u00b0C \u2192 -6.7 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 82 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.048
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 7.7,
    "soil_moisture_top": 0.227,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1456745&longitude=-87.8849315&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1456745&longitude=-87.8849315&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 199.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1456745&longitude=-87.8849315&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 199.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1456745&longitude=-87.8849315&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 199.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1456745&longitude=-87.8849315&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 199.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 10.3,
   "dawn_wind_kt": 12.9
  },
  {
   "id": "bird-park-kankakee",
   "name": "Bird Park",
   "lat": 41.1213415,
   "lon": -87.8791619,
   "agency": "Kankakee Valley Park District",
   "agency_url": "https://www.kvpd.com/parks-facilities/bird-park",
   "dawn_access": "Opening time not stated. Page lists: \"Park Closes At Dusk\"",
   "dawn_access_ok": null,
   "drone_rule": "no rule found; default is FAA recreational/Part 107 rules (<=400 ft AGL, visual line of sight, Class G needs no authorization) but unverified for this site",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "river",
    "open field",
    "trees"
   ],
   "features_source": "KVPD page amenity list includes \"riverfront access\" and \"open field\"; OSM within 1.5 km: 210 mapped tree nodes, 19 wood polygons, 4 river/stream ways; USGS 3DEP: 614 ft, ring 608-646 ft. Coordinates: Nominatim (OSM way 66455326).",
   "drive_minutes_est": 7,
   "airspace_note": "Kankakee Class E5 (floor 700 ft AGL) + Illinois Class E5; surface is Class G. KIKK 3.3 nm. Kankakee Airport (3KK) 2.0 nm. No UAS Facility Map grid.",
   "notes": "In-town park (893 W. Station St., Kankakee). kvpd.com search for 'drone' returned a page with no match. Same Illinois (b-5) local-rule caveat as Perry Farm.",
   "look": "riverfront + open field + mature trees; closest aerial option in Class G",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:36",
    "sunrise": "07:04",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:18",
    "sun_12deg": "08:15"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.047,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.069,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.8 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:19:32.614686-05:00",
     "est_end": "2026-10-16 07:49:32.614686-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 95 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.1,
     "likely": false,
     "why": "river water +8.1 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 13 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.8000000000000007,
       "dpd_key": 2.999999999999999,
       "rh_max": 83,
       "wind_mean": 12.925,
       "wind_after": 11.2,
       "gust_max": 27.4,
       "cloud_mh_night": 46.45454545454545,
       "cloud_low_night": 98.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16900.0,
       "low_sunrise": 95.0,
       "vis_min": 16300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.3,
       "t_key": 10.7,
       "cooling": 9.600000000000001,
       "t_min_night": 10.7,
       "td_afternoon": 16.9,
       "crossover": -6.199999999999999,
       "td_drop": 9.2,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.0,
         "Td": 20.0,
         "RH": 94,
         "wind": 10.0,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "22:00",
         "T": 20.1,
         "Td": 18.6,
         "RH": 91,
         "wind": 10.2,
         "low": 100,
         "mid": 9,
         "high": 0,
         "vis": 13200.0
        },
        {
         "t": "23:00",
         "T": 18.8,
         "Td": 17.1,
         "RH": 90,
         "wind": 17.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13900.0
        },
        {
         "t": "00:00",
         "T": 16.6,
         "Td": 14.8,
         "RH": 89,
         "wind": 14.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "01:00",
         "T": 15.2,
         "Td": 12.5,
         "RH": 84,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "02:00",
         "T": 13.7,
         "Td": 11.2,
         "RH": 85,
         "wind": 14.2,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "03:00",
         "T": 12.2,
         "Td": 9.5,
         "RH": 84,
         "wind": 14.9,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 8.7,
         "RH": 83,
         "wind": 14.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 11.5,
         "Td": 8.4,
         "RH": 81,
         "wind": 12.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "06:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "07:00",
         "T": 10.7,
         "Td": 7.7,
         "RH": 82,
         "wind": 12.4,
         "low": 90,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 6.4,
         "RH": 77,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19200.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 6.5,
         "RH": 79,
         "wind": 11.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18200.0
        },
        {
         "t": "11:00",
         "T": 10.4,
         "Td": 6.7,
         "RH": 78,
         "wind": 11.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.2,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.8 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.65,
        "why": "overnight mid+high levels cloud = 46 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.7 \u00b0C vs afternoon dewpoint 16.9 \u00b0C \u2192 -6.2 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 9.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 99 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.299999999999999,
       "dpd_key": 1.5999999999999996,
       "rh_max": 92,
       "wind_mean": 11.6,
       "wind_after": 11.6,
       "gust_max": 19.8,
       "cloud_mh_night": 88.27272727272727,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 61.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 22.0,
       "t_key": 8.7,
       "cooling": 13.3,
       "t_min_night": 8.7,
       "td_afternoon": 18.9,
       "crossover": -10.2,
       "td_drop": 11.799999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.9,
         "Td": 19.6,
         "RH": 98,
         "wind": 7.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.6,
         "Td": 19.3,
         "RH": 98,
         "wind": 8.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.3,
         "Td": 18.1,
         "RH": 99,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.4,
         "Td": 16.2,
         "RH": 99,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 14.8,
         "Td": 14.3,
         "RH": 97,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.6,
         "Td": 12.6,
         "RH": 94,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 12.1,
         "Td": 10.8,
         "RH": 92,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.8,
         "Td": 9.5,
         "RH": 92,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 8.9,
         "RH": 92,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.5,
         "Td": 8.1,
         "RH": 91,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 7.1,
         "RH": 90,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 7.9,
         "RH": 83,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 8.0,
         "RH": 78,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.07,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.22,
        "why": "overnight total cloud (levels unavailable) cloud = 88 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 13.3 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.7 \u00b0C vs afternoon dewpoint 18.9 \u00b0C \u2192 -10.2 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.8 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.087
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 5.1,
       "dpd_key": 5.800000000000001,
       "rh_max": 71,
       "wind_mean": 15.225,
       "wind_after": 14.75,
       "gust_max": 32.7,
       "cloud_mh_night": 11.363636363636363,
       "cloud_low_night": 63.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 29.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.4,
       "t_key": 10.9,
       "cooling": 10.499999999999998,
       "t_min_night": 10.9,
       "td_afternoon": 18.9,
       "crossover": -7.999999999999998,
       "td_drop": 13.799999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.199999999999932,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.8,
         "Td": 19.8,
         "RH": 94,
         "wind": 13.7,
         "low": 86,
         "mid": 9,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.1,
         "Td": 18.9,
         "RH": 93,
         "wind": 12.6,
         "low": 90,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.8,
         "Td": 17.1,
         "RH": 90,
         "wind": 12.7,
         "low": 91,
         "mid": 11,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.1,
         "Td": 14.6,
         "RH": 85,
         "wind": 13.9,
         "low": 90,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.6,
         "Td": 12.3,
         "RH": 81,
         "wind": 15.6,
         "low": 85,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.3,
         "Td": 10.3,
         "RH": 77,
         "wind": 16.2,
         "low": 72,
         "mid": 28,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.1,
         "Td": 8.6,
         "RH": 74,
         "wind": 16.1,
         "low": 55,
         "mid": 12,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.1,
         "Td": 7.0,
         "RH": 71,
         "wind": 15.9,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.5,
         "Td": 6.0,
         "RH": 69,
         "wind": 15.5,
         "low": 33,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.1,
         "Td": 5.5,
         "RH": 68,
         "wind": 15.0,
         "low": 28,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.9,
         "Td": 5.1,
         "RH": 67,
         "wind": 14.5,
         "low": 27,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.0,
         "Td": 4.5,
         "RH": 64,
         "wind": 14.5,
         "low": 32,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.4,
         "Td": 4.1,
         "RH": 61,
         "wind": 15.0,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.6,
         "Td": 3.9,
         "RH": 59,
         "wind": 15.2,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 4.3,
         "RH": 60,
         "wind": 15.0,
         "low": 65,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 5.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 15.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 11 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.9 \u00b0C vs afternoon dewpoint 18.9 \u00b0C \u2192 -8.0 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 13.8 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 71 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 5.1 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.000000000000001,
       "dpd_key": 4.6,
       "rh_max": 82,
       "wind_mean": 13.575,
       "wind_after": 12.5,
       "gust_max": 29.4,
       "cloud_mh_night": 71.81818181818181,
       "cloud_low_night": 79.27272727272727,
       "cloud_mh_sunrise": 2.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 53.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.9,
       "t_key": 9.7,
       "cooling": 10.2,
       "t_min_night": 9.7,
       "td_afternoon": 16.35,
       "crossover": -6.650000000000002,
       "td_drop": 11.250000000000002,
       "airmass_change": true,
       "precip_night_mm": 1.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.0,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.7,
         "Td": 18.8,
         "RH": 89,
         "wind": 15.2,
         "low": 100,
         "mid": 83,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.7,
         "Td": 17.1,
         "RH": 85,
         "wind": 14.0,
         "low": 100,
         "mid": 65,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.0,
         "Td": 16.4,
         "RH": 85,
         "wind": 13.2,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.6,
         "Td": 14.8,
         "RH": 84,
         "wind": 15.9,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 12.3,
         "low": 87,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.9,
         "Td": 11.3,
         "RH": 79,
         "wind": 15.9,
         "low": 90,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.2,
         "Td": 8.8,
         "RH": 75,
         "wind": 16.4,
         "low": 88,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.7,
         "Td": 6.4,
         "RH": 70,
         "wind": 15.6,
         "low": 43,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.3,
         "Td": 6.0,
         "RH": 75,
         "wind": 14.0,
         "low": 43,
         "mid": 61,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 6.8,
         "RH": 82,
         "wind": 12.5,
         "low": 77,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 5.1,
         "RH": 73,
         "wind": 12.2,
         "low": 53,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.3,
         "Td": 5.4,
         "RH": 77,
         "wind": 11.7,
         "low": 53,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 5.0,
         "RH": 74,
         "wind": 13.3,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 5.1,
         "RH": 70,
         "wind": 13.7,
         "low": 70,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 6.2,
         "RH": 71,
         "wind": 14.3,
         "low": 84,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.15,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.38,
        "why": "overnight mid+high levels cloud = 72 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 16.4 \u00b0C \u2192 -6.7 \u00b0C; rain last 48 h = 7.7 mm; BUT dewpoint falls 11.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 82 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.048
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 7.7,
    "soil_moisture_top": 0.227,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1213415&longitude=-87.8791619&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1213415&longitude=-87.8791619&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 185.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1213415&longitude=-87.8791619&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 185.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1213415&longitude=-87.8791619&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 185.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1213415&longitude=-87.8791619&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 185.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 10.7,
   "dawn_wind_kt": 12.4
  },
  {
   "id": "kankakee-sands-illinois",
   "name": "Kankakee Sands - Illinois (The Nature Conservancy)",
   "lat": 41.07935,
   "lon": -87.65675,
   "agency": "The Nature Conservancy",
   "agency_url": "https://www.nature.org/en-us/get-involved/how-to-help/places-we-protect/kankakee-sands-illinois/",
   "dawn_access": "\"Open sunrise to sunset, 365 days a year\"",
   "dawn_access_ok": true,
   "drone_rule": "\"Drones\u2014aka personal aircraft, unmanned aircraft systems (UAS) and unmanned aerial vehicles (UAV): Self-propelled or other aircraft are prohibited from taking off, landing or being operated on any TNC preserve except for official TNC purposes, approved research or in an emergency landing situation.\"",
   "drone_rule_url": "https://www.nature.org/en-us/get-involved/how-to-help/places-we-protect/kankakee-sands-illinois/",
   "drone_status": "prohibited",
   "features": [
    "oak savanna",
    "prairie",
    "lone trees",
    "sand dunes"
   ],
   "features_source": "TNC page: \"a birdsong-filled, tree-dotted grassland known as a savanna\"; \"rare black oak savannas\"; image caption \"Sunrises over the rare black oaks at Kankakee Sands-Illinois\"; 1,800 acres. USGS 3DEP: 660 ft, ring 638-673 ft. Coordinates: TNC page map marker 41.079350,-87.656750.",
   "drive_minutes_est": 37,
   "airspace_note": "Illinois Class E5 only (floor 1200 ft AGL); surface is Class G. KIKK 8.6 nm. No UAS Facility Map grid.",
   "notes": "Best-fit terrain for the lone-tree-in-fog look from the ground, but drones are prohibited. TNC page: deer hunting allowed on many preserves from October through first week of January (blaze orange suggested). Not the same as Kankakee Sands-Indiana (Morocco) or the Will County FPD Kankakee Sands Preserve.",
   "look": "best lone-tree savanna terrain for the ground frame; NO drone",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:35",
    "sunrise": "07:03",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:17",
    "sun_12deg": "08:14"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.044,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.069,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.6 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:18:36.527420-05:00",
     "est_end": "2026-10-16 07:48:36.527420-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 50 %, plus a low deck \u2248 86 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.5999999999999996,
       "dpd_key": 3.0,
       "rh_max": 84,
       "wind_mean": 15.325,
       "wind_after": 12.55,
       "gust_max": 29.9,
       "cloud_mh_night": 55.81818181818182,
       "cloud_low_night": 97.54545454545455,
       "cloud_mh_sunrise": 50.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 17200.0,
       "low_sunrise": 86.5,
       "vis_min": 16600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.0,
       "t_key": 10.5,
       "cooling": 8.5,
       "t_min_night": 10.5,
       "td_afternoon": 16.700000000000003,
       "crossover": -6.200000000000003,
       "td_drop": 9.200000000000003,
       "airmass_change": true,
       "precip_night_mm": 0.4,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.400000000000091,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.3,
         "Td": 20.5,
         "RH": 95,
         "wind": 11.4,
         "low": 100,
         "mid": 6,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 20.3,
         "Td": 18.8,
         "RH": 91,
         "wind": 10.1,
         "low": 100,
         "mid": 8,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 19.7,
         "Td": 17.7,
         "RH": 88,
         "wind": 14.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "00:00",
         "T": 17.3,
         "Td": 15.8,
         "RH": 91,
         "wind": 14.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 13300.0
        },
        {
         "t": "01:00",
         "T": 15.2,
         "Td": 13.0,
         "RH": 87,
         "wind": 15.9,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 14.1,
         "Td": 11.8,
         "RH": 86,
         "wind": 15.9,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "03:00",
         "T": 12.6,
         "Td": 10.0,
         "RH": 84,
         "wind": 17.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 8.7,
         "RH": 83,
         "wind": 17.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "05:00",
         "T": 11.2,
         "Td": 8.6,
         "RH": 84,
         "wind": 15.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16600.0
        },
        {
         "t": "06:00",
         "T": 10.8,
         "Td": 8.1,
         "RH": 83,
         "wind": 14.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "07:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 14.5,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 7.2,
         "RH": 83,
         "wind": 12.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 6.8,
         "RH": 79,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19100.0
        },
        {
         "t": "10:00",
         "T": 9.6,
         "Td": 6.5,
         "RH": 81,
         "wind": 13.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17700.0
        },
        {
         "t": "11:00",
         "T": 10.1,
         "Td": 6.8,
         "RH": 80,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.25,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 15.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.54,
        "why": "overnight mid+high levels cloud = 56 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.5 \u00b0C vs afternoon dewpoint 16.7 \u00b0C \u2192 -6.2 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 9.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 98 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.1999999999999993,
       "dpd_key": 1.5,
       "rh_max": 92,
       "wind_mean": 12.825,
       "wind_after": 12.5,
       "gust_max": 20.2,
       "cloud_mh_night": 89.72727272727273,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 70.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.2,
       "t_key": 8.9,
       "cooling": 12.299999999999999,
       "t_min_night": 8.9,
       "td_afternoon": 18.5,
       "crossover": -9.6,
       "td_drop": 11.1,
       "airmass_change": true,
       "precip_night_mm": 1.1,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.2,
         "Td": 19.2,
         "RH": 100,
         "wind": 8.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.1,
         "Td": 19.1,
         "RH": 100,
         "wind": 9.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.1,
         "Td": 18.1,
         "RH": 100,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.5,
         "Td": 16.5,
         "RH": 100,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 14.9,
         "Td": 14.8,
         "RH": 99,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.6,
         "Td": 12.7,
         "RH": 94,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 12.1,
         "Td": 10.9,
         "RH": 92,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.7,
         "Td": 9.3,
         "RH": 91,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 8.9,
         "RH": 92,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.5,
         "Td": 8.3,
         "RH": 92,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.4,
         "RH": 90,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.6,
         "Td": 7.5,
         "RH": 93,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.8,
         "RH": 89,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 7.8,
         "RH": 79,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.75,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.2 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.01,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.2,
        "why": "overnight total cloud (levels unavailable) cloud = 90 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.3 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 18.5 \u00b0C \u2192 -9.6 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 11.1 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.087
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 5.300000000000001,
       "dpd_key": 5.6000000000000005,
       "rh_max": 70,
       "wind_mean": 15.2,
       "wind_after": 14.149999999999999,
       "gust_max": 31.5,
       "cloud_mh_night": 2.0,
       "cloud_low_night": 58.63636363636363,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 30.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.4,
       "t_key": 11.3,
       "cooling": 10.099999999999998,
       "t_min_night": 11.3,
       "td_afternoon": 18.15,
       "crossover": -6.849999999999998,
       "td_drop": 12.45,
       "airmass_change": true,
       "precip_night_mm": 0.2,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.7,
         "Td": 19.9,
         "RH": 95,
         "wind": 12.9,
         "low": 81,
         "mid": 1,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.0,
         "Td": 19.0,
         "RH": 94,
         "wind": 12.2,
         "low": 80,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.8,
         "Td": 17.3,
         "RH": 91,
         "wind": 12.3,
         "low": 83,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.4,
         "Td": 15.3,
         "RH": 87,
         "wind": 13.4,
         "low": 87,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.1,
         "Td": 13.2,
         "RH": 83,
         "wind": 14.9,
         "low": 85,
         "mid": 7,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.7,
         "Td": 10.9,
         "RH": 78,
         "wind": 15.6,
         "low": 71,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.4,
         "Td": 8.9,
         "RH": 74,
         "wind": 16.0,
         "low": 50,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.4,
         "Td": 7.1,
         "RH": 70,
         "wind": 16.0,
         "low": 34,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.8,
         "Td": 6.3,
         "RH": 69,
         "wind": 15.7,
         "low": 26,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.5,
         "Td": 6.0,
         "RH": 69,
         "wind": 14.8,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.3,
         "Td": 5.7,
         "RH": 68,
         "wind": 14.3,
         "low": 25,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.3,
         "Td": 5.0,
         "RH": 65,
         "wind": 14.1,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.4,
         "Td": 4.2,
         "RH": 61,
         "wind": 14.2,
         "low": 52,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.6,
         "Td": 3.9,
         "RH": 59,
         "wind": 14.1,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 4.0,
         "RH": 59,
         "wind": 14.1,
         "low": 81,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 5.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 15.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 2 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 11.3 \u00b0C vs afternoon dewpoint 18.1 \u00b0C \u2192 -6.8 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 12.4 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 70 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 5.3 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.1999999999999993,
       "dpd_key": 3.1999999999999993,
       "rh_max": 80,
       "wind_mean": 13.45,
       "wind_after": 12.05,
       "gust_max": 29.4,
       "cloud_mh_night": 81.72727272727273,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 18.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 67.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.3,
       "t_key": 9.7,
       "cooling": 9.600000000000001,
       "t_min_night": 9.7,
       "td_afternoon": 15.7,
       "crossover": -6.0,
       "td_drop": 9.2,
       "airmass_change": true,
       "precip_night_mm": 2.1,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.7000000000000455,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.1,
         "Td": 20.0,
         "RH": 93,
         "wind": 12.3,
         "low": 93,
         "mid": 79,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.2,
         "Td": 18.4,
         "RH": 89,
         "wind": 12.6,
         "low": 100,
         "mid": 57,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.3,
         "Td": 16.6,
         "RH": 84,
         "wind": 12.6,
         "low": 100,
         "mid": 82,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 18.5,
         "Td": 16.2,
         "RH": 86,
         "wind": 10.9,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.1,
         "Td": 13.3,
         "RH": 83,
         "wind": 14.9,
         "low": 78,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 15.4,
         "Td": 12.4,
         "RH": 82,
         "wind": 12.1,
         "low": 100,
         "mid": 99,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 14.2,
         "Td": 10.3,
         "RH": 77,
         "wind": 14.8,
         "low": 85,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.3,
         "Td": 7.8,
         "RH": 74,
         "wind": 15.4,
         "low": 48,
         "mid": 85,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.9,
         "Td": 5.9,
         "RH": 71,
         "wind": 14.5,
         "low": 30,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 6.1,
         "RH": 78,
         "wind": 12.7,
         "low": 63,
         "mid": 66,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 6.5,
         "RH": 80,
         "wind": 11.2,
         "low": 83,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 5.4,
         "RH": 74,
         "wind": 11.2,
         "low": 52,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 5.6,
         "RH": 74,
         "wind": 12.9,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 5.3,
         "RH": 70,
         "wind": 13.1,
         "low": 64,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 5.7,
         "RH": 68,
         "wind": 12.6,
         "low": 79,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.12,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.2 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.28,
        "why": "overnight mid+high levels cloud = 82 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 15.7 \u00b0C \u2192 -6.0 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 9.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 80 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.025
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 8.0,
    "soil_moisture_top": 0.21,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.07935&longitude=-87.65675&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.07935&longitude=-87.65675&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 207.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.07935&longitude=-87.65675&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 207.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.07935&longitude=-87.65675&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 207.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.07935&longitude=-87.65675&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 207.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 10.5,
   "dawn_wind_kt": 14.5
  },
  {
   "id": "island-park-momence",
   "name": "Island Park (Momence)",
   "lat": 41.1630009,
   "lon": -87.654792,
   "agency": "Momence Park District",
   "agency_url": "https://www.momenceparkdistrict.org/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "no rule found; default is FAA recreational/Part 107 rules (<=400 ft AGL, visual line of sight, Class G needs no authorization) but unverified for this site",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "river",
    "island",
    "flat terrain"
   ],
   "features_source": "City of Momence page: \"The thirty-acre Island Park located on Mill Street, maintained by Momence Park District\"; park district page: \"Discover the natural beauty of our rivers at Momence Island Park\"; USGS gauge 05520500 Kankakee River at Momence (41.15994, -87.66875) about 0.8 mi west; USGS 3DEP: 623 ft, ring 622-638 ft (flat). Coordinates: Nominatim (OSM way 66134648).",
   "drive_minutes_est": 29,
   "airspace_note": "No Class E polygon from the FAA data at this point; surface is Class G. KIKK 10.3 nm, Bult Field (C56) 12.9 nm. No UAS Facility Map grid.",
   "notes": "Town-center park; no verified corn or tree-line view. No hours or drone rule on momence.org or momenceparkdistrict.org. visitkankakeecounty.com pages returned HTTP 403.",
   "look": "river island, flat; steam fog over water",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:35",
    "sunrise": "07:03",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:17",
    "sun_12deg": "08:14"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.042,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.066,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.8 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:18:41.374268-05:00",
     "est_end": "2026-10-16 07:48:41.374268-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 48 %, plus a low deck \u2248 100 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.1,
     "likely": false,
     "why": "river water +8.1 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 14 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.799999999999999,
       "dpd_key": 2.8999999999999995,
       "rh_max": 83,
       "wind_mean": 14.5,
       "wind_after": 12.8,
       "gust_max": 29.7,
       "cloud_mh_night": 58.0,
       "cloud_low_night": 99.63636363636364,
       "cloud_mh_sunrise": 47.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 17400.0,
       "low_sunrise": 100.0,
       "vis_min": 16800.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 18.5,
       "t_key": 10.7,
       "cooling": 7.800000000000001,
       "t_min_night": 10.7,
       "td_afternoon": 16.15,
       "crossover": -5.449999999999999,
       "td_drop": 8.349999999999998,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.4,
         "Td": 20.4,
         "RH": 94,
         "wind": 9.8,
         "low": 100,
         "mid": 32,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "22:00",
         "T": 20.4,
         "Td": 18.7,
         "RH": 90,
         "wind": 12.5,
         "low": 100,
         "mid": 49,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "23:00",
         "T": 19.7,
         "Td": 18.2,
         "RH": 91,
         "wind": 15.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "00:00",
         "T": 17.1,
         "Td": 15.2,
         "RH": 89,
         "wind": 14.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "01:00",
         "T": 15.1,
         "Td": 12.8,
         "RH": 86,
         "wind": 15.0,
         "low": 100,
         "mid": 66,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 14.1,
         "Td": 12.2,
         "RH": 88,
         "wind": 15.5,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "03:00",
         "T": 12.6,
         "Td": 10.0,
         "RH": 84,
         "wind": 16.0,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "04:00",
         "T": 11.7,
         "Td": 8.9,
         "RH": 83,
         "wind": 16.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "05:00",
         "T": 11.5,
         "Td": 8.7,
         "RH": 83,
         "wind": 14.1,
         "low": 100,
         "mid": 91,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "06:00",
         "T": 11.1,
         "Td": 8.3,
         "RH": 83,
         "wind": 13.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "07:00",
         "T": 10.7,
         "Td": 7.8,
         "RH": 82,
         "wind": 13.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.0,
         "RH": 81,
         "wind": 12.6,
         "low": 100,
         "mid": 95,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.5,
         "RH": 76,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 20300.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 6.5,
         "RH": 79,
         "wind": 13.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18400.0
        },
        {
         "t": "11:00",
         "T": 10.6,
         "Td": 6.7,
         "RH": 77,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19100.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.2,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.8 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.52,
        "why": "overnight mid+high levels cloud = 58 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.7 \u00b0C vs afternoon dewpoint 16.1 \u00b0C \u2192 -5.4 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 8.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.8 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 100 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.034
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.3000000000000007,
       "dpd_key": 1.6000000000000005,
       "rh_max": 92,
       "wind_mean": 12.725,
       "wind_after": 12.7,
       "gust_max": 20.4,
       "cloud_mh_night": 89.9090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 69.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.5,
       "t_key": 8.8,
       "cooling": 12.7,
       "t_min_night": 8.8,
       "td_afternoon": 18.5,
       "crossover": -9.7,
       "td_drop": 11.3,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.4,
         "Td": 19.4,
         "RH": 100,
         "wind": 8.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "22:00",
         "T": 19.4,
         "Td": 19.2,
         "RH": 99,
         "wind": 9.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.2,
         "Td": 18.1,
         "RH": 100,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.6,
         "Td": 16.4,
         "RH": 99,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 14.6,
         "RH": 98,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.6,
         "Td": 12.6,
         "RH": 94,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 12.1,
         "Td": 10.8,
         "RH": 92,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.7,
         "Td": 9.2,
         "RH": 91,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 8.7,
         "RH": 92,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 8.0,
         "RH": 91,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.8,
         "Td": 7.2,
         "RH": 90,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.5,
         "RH": 94,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 7.8,
         "RH": 83,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 7.8,
         "RH": 78,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.01,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.2,
        "why": "overnight total cloud (levels unavailable) cloud = 90 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.7 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.8 \u00b0C vs afternoon dewpoint 18.5 \u00b0C \u2192 -9.7 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 11.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.084
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 5.1,
       "dpd_key": 5.6,
       "rh_max": 71,
       "wind_mean": 14.625,
       "wind_after": 12.85,
       "gust_max": 32.1,
       "cloud_mh_night": 16.545454545454547,
       "cloud_low_night": 61.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 28.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.5,
       "t_key": 11.1,
       "cooling": 9.4,
       "t_min_night": 11.1,
       "td_afternoon": 18.1,
       "crossover": -7.000000000000002,
       "td_drop": 12.600000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.099999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.5,
         "Td": 20.0,
         "RH": 97,
         "wind": 12.8,
         "low": 94,
         "mid": 9,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.8,
         "Td": 19.0,
         "RH": 95,
         "wind": 12.2,
         "low": 90,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.6,
         "Td": 17.3,
         "RH": 92,
         "wind": 12.5,
         "low": 90,
         "mid": 24,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.0,
         "Td": 14.8,
         "RH": 87,
         "wind": 13.8,
         "low": 90,
         "mid": 40,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.5,
         "Td": 12.6,
         "RH": 83,
         "wind": 15.3,
         "low": 85,
         "mid": 46,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.2,
         "Td": 10.6,
         "RH": 79,
         "wind": 15.9,
         "low": 70,
         "mid": 35,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.0,
         "Td": 8.5,
         "RH": 74,
         "wind": 15.9,
         "low": 50,
         "mid": 15,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.1,
         "Td": 7.0,
         "RH": 71,
         "wind": 15.7,
         "low": 34,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.6,
         "Td": 6.1,
         "RH": 69,
         "wind": 15.1,
         "low": 26,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.3,
         "Td": 5.8,
         "RH": 69,
         "wind": 14.3,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.1,
         "Td": 5.5,
         "RH": 68,
         "wind": 13.4,
         "low": 24,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.1,
         "Td": 4.8,
         "RH": 65,
         "wind": 13.0,
         "low": 32,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.2,
         "Td": 4.2,
         "RH": 62,
         "wind": 12.7,
         "low": 44,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.3,
         "Td": 4.1,
         "RH": 61,
         "wind": 12.7,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 4.6,
         "RH": 63,
         "wind": 12.8,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 5.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 17 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 11.1 \u00b0C vs afternoon dewpoint 18.1 \u00b0C \u2192 -7.0 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 12.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 71 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 5.1 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.200000000000001,
       "dpd_key": 3.200000000000001,
       "rh_max": 80,
       "wind_mean": 13.45,
       "wind_after": 12.05,
       "gust_max": 29.4,
       "cloud_mh_night": 81.72727272727273,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 18.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 67.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.4,
       "t_key": 9.8,
       "cooling": 9.599999999999998,
       "t_min_night": 9.8,
       "td_afternoon": 15.8,
       "crossover": -6.0,
       "td_drop": 9.200000000000001,
       "airmass_change": true,
       "precip_night_mm": 2.1,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.7999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.2,
         "Td": 20.1,
         "RH": 93,
         "wind": 12.3,
         "low": 93,
         "mid": 79,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.3,
         "Td": 18.5,
         "RH": 89,
         "wind": 12.6,
         "low": 100,
         "mid": 57,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.4,
         "Td": 16.7,
         "RH": 84,
         "wind": 12.6,
         "low": 100,
         "mid": 82,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 18.6,
         "Td": 16.3,
         "RH": 86,
         "wind": 10.9,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.2,
         "Td": 13.4,
         "RH": 83,
         "wind": 14.9,
         "low": 78,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 15.5,
         "Td": 12.5,
         "RH": 82,
         "wind": 12.1,
         "low": 100,
         "mid": 99,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 14.3,
         "Td": 10.4,
         "RH": 77,
         "wind": 14.8,
         "low": 85,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.4,
         "Td": 7.9,
         "RH": 74,
         "wind": 15.4,
         "low": 48,
         "mid": 85,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.0,
         "Td": 6.0,
         "RH": 71,
         "wind": 14.5,
         "low": 30,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 6.2,
         "RH": 78,
         "wind": 12.7,
         "low": 63,
         "mid": 66,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 6.6,
         "RH": 80,
         "wind": 11.2,
         "low": 83,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.5,
         "RH": 74,
         "wind": 11.2,
         "low": 52,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 5.7,
         "RH": 74,
         "wind": 12.9,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 13.1,
         "low": 64,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 5.8,
         "RH": 68,
         "wind": 12.6,
         "low": 79,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.12,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.2 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.28,
        "why": "overnight mid+high levels cloud = 82 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 15.8 \u00b0C \u2192 -6.0 \u00b0C; rain last 48 h = 8.0 mm; BUT dewpoint falls 9.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 80 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.025
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 8.0,
    "soil_moisture_top": 0.21,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1630009&longitude=-87.654792&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1630009&longitude=-87.654792&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 192.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1630009&longitude=-87.654792&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 192.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1630009&longitude=-87.654792&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 192.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1630009&longitude=-87.654792&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 192.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 10.7,
   "dawn_wind_kt": 13.9
  },
  {
   "id": "momence-wetlands-nature-preserve",
   "name": "Momence Wetlands Nature Preserve",
   "lat": 41.1643173,
   "lon": -87.5542197,
   "agency": "Illinois Department of Natural Resources (Illinois Nature Preserves Commission listing)",
   "agency_url": "https://dnr.illinois.gov/inpc/area.area3kankakeemomencewetlands.html",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "17 Ill. Adm. Code 110.160(i): it is unlawful \"Except in cases of emergency, for any person to land or attempt to land any aircraft on Department-owned, -leased or -managed property without prior authorization for each landing or attempted landing from the Department.\" No site-specific drone page found for this site. The wording says 'aircraft', not 'drone/unmanned', and does not name the superintendent; treat as authorization required until the site office says otherwise.",
   "drone_rule_url": "https://www.ilga.gov/commission/jcar/admincode/017/017001100A01600R.html",
   "drone_status": "permit",
   "features": [
    "river",
    "bottomland",
    "floodplain forest"
   ],
   "features_source": "INPC page: \"These wetlands along the Kankakee River contain trees commonly associated with floodplains. These include green ash, sycamore, silver maple and eastern cottonwood.\" 72 acres, dedicated September 1988; Ownership: Illinois Department of Natural Resources. USGS 3DEP: 624 ft, ring 621-633 ft (flat). Coordinates: Nominatim (OSM node 354252332).",
   "drive_minutes_est": 38,
   "airspace_note": "No Class E polygon from the FAA data at this point; surface is Class G. KIKK 14.3 nm, Bult Field (C56) 14.1 nm. No UAS Facility Map grid.",
   "notes": "Page gives only directions: \"From Momence, take Highway 114 east 6 miles to a county road. Turn north on this road and go 0.75 mile. The preserve is on the west side of the road.\" No parking, trail or hours stated. 17 Ill. Adm. Code 110.120(b) bars entry to a dedicated nature preserve where posted rules prohibit it. Contact listed: Site Superintendent, Iroquois County Conservation Area, 815-435-2218.",
   "look": "floodplain forest: treetops-in-fog aerial if authorized",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:34",
    "sunrise": "07:03",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:17",
    "sun_12deg": "08:14"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.046,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.069,
    "confidence": "high",
    "confidence_why": "4 models within 0.07 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.7 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:18:17.302145-05:00",
     "est_end": "2026-10-16 07:48:17.302145-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 50 %, plus a low deck \u2248 100 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.1,
     "likely": false,
     "why": "river water +8.1 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 14 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 2.999999999999999,
       "rh_max": 83,
       "wind_mean": 13.625,
       "wind_after": 11.8,
       "gust_max": 29.0,
       "cloud_mh_night": 56.72727272727273,
       "cloud_low_night": 100.0,
       "cloud_mh_sunrise": 50.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 17200.0,
       "low_sunrise": 100.0,
       "vis_min": 16600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 18.2,
       "t_key": 10.7,
       "cooling": 7.5,
       "t_min_night": 10.7,
       "td_afternoon": 16.1,
       "crossover": -5.400000000000002,
       "td_drop": 8.400000000000002,
       "airmass_change": true,
       "precip_night_mm": 0.4,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.400000000000091,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.4,
         "Td": 20.3,
         "RH": 93,
         "wind": 10.6,
         "low": 100,
         "mid": 13,
         "high": 0,
         "vis": 13000.0
        },
        {
         "t": "22:00",
         "T": 20.5,
         "Td": 18.8,
         "RH": 90,
         "wind": 11.4,
         "low": 100,
         "mid": 27,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "23:00",
         "T": 19.6,
         "Td": 18.0,
         "RH": 90,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 17.1,
         "Td": 15.6,
         "RH": 91,
         "wind": 13.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 13600.0
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 12.7,
         "RH": 86,
         "wind": 14.7,
         "low": 100,
         "mid": 84,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 14.1,
         "Td": 12.3,
         "RH": 89,
         "wind": 14.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "03:00",
         "T": 12.7,
         "Td": 10.1,
         "RH": 84,
         "wind": 14.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "04:00",
         "T": 11.6,
         "Td": 8.9,
         "RH": 83,
         "wind": 15.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16800.0
        },
        {
         "t": "05:00",
         "T": 11.3,
         "Td": 8.5,
         "RH": 83,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16600.0
        },
        {
         "t": "06:00",
         "T": 11.0,
         "Td": 8.1,
         "RH": 82,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.0
        },
        {
         "t": "07:00",
         "T": 10.7,
         "Td": 7.7,
         "RH": 82,
         "wind": 12.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 7.3,
         "RH": 83,
         "wind": 11.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "09:00",
         "T": 10.5,
         "Td": 6.7,
         "RH": 77,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19600.0
        },
        {
         "t": "10:00",
         "T": 9.9,
         "Td": 6.5,
         "RH": 79,
         "wind": 13.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18200.0
        },
        {
         "t": "11:00",
         "T": 10.5,
         "Td": 6.5,
         "RH": 76,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 19400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.23,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.7 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.53,
        "why": "overnight mid+high levels cloud = 57 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.7 \u00b0C vs afternoon dewpoint 16.1 \u00b0C \u2192 -5.4 \u00b0C; rain last 48 h = 6.8 mm; BUT dewpoint falls 8.4 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 100 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.1999999999999993,
       "dpd_key": 1.5000000000000009,
       "rh_max": 92,
       "wind_mean": 12.525,
       "wind_after": 12.5,
       "gust_max": 21.0,
       "cloud_mh_night": 90.81818181818181,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 74.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.1,
       "t_key": 8.8,
       "cooling": 12.3,
       "t_min_night": 8.8,
       "td_afternoon": 18.0,
       "crossover": -9.2,
       "td_drop": 10.7,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.3,
         "Td": 19.3,
         "RH": 100,
         "wind": 8.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "22:00",
         "T": 19.3,
         "Td": 19.1,
         "RH": 99,
         "wind": 9.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 12760.0
        },
        {
         "t": "23:00",
         "T": 18.2,
         "Td": 18.2,
         "RH": 100,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 15.2,
         "Td": 14.9,
         "RH": 98,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 13.7,
         "Td": 12.9,
         "RH": 95,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 12.2,
         "Td": 10.9,
         "RH": 92,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.7,
         "Td": 9.3,
         "RH": 91,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 8.9,
         "RH": 92,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 8.2,
         "RH": 92,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.8,
         "Td": 7.3,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.6,
         "Td": 7.4,
         "RH": 92,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 7.5,
         "RH": 76,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.75,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.2 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.02,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.19,
        "why": "overnight total cloud (levels unavailable) cloud = 91 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.3 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 8.8 \u00b0C vs afternoon dewpoint 18.0 \u00b0C \u2192 -9.2 \u00b0C; rain last 48 h = 6.8 mm; BUT dewpoint falls 10.7 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.087
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 5.0,
       "dpd_key": 5.0,
       "rh_max": 71,
       "wind_mean": 14.85,
       "wind_after": 12.35,
       "gust_max": 31.3,
       "cloud_mh_night": 14.545454545454545,
       "cloud_low_night": 62.90909090909091,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 43.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.2,
       "t_key": 11.1,
       "cooling": 9.1,
       "t_min_night": 11.1,
       "td_afternoon": 17.35,
       "crossover": -6.250000000000002,
       "td_drop": 11.250000000000002,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.599999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.4,
         "Td": 19.8,
         "RH": 96,
         "wind": 12.2,
         "low": 99,
         "mid": 29,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.8,
         "Td": 19.0,
         "RH": 95,
         "wind": 11.7,
         "low": 100,
         "mid": 37,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.8,
         "Td": 17.5,
         "RH": 92,
         "wind": 12.2,
         "low": 96,
         "mid": 34,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 17.4,
         "Td": 15.2,
         "RH": 87,
         "wind": 13.4,
         "low": 88,
         "mid": 26,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.0,
         "Td": 13.1,
         "RH": 83,
         "wind": 14.7,
         "low": 77,
         "mid": 18,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.7,
         "Td": 11.1,
         "RH": 79,
         "wind": 15.6,
         "low": 62,
         "mid": 11,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.4,
         "Td": 8.9,
         "RH": 74,
         "wind": 16.3,
         "low": 44,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.4,
         "Td": 7.3,
         "RH": 71,
         "wind": 16.3,
         "low": 32,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.7,
         "Td": 6.4,
         "RH": 70,
         "wind": 15.6,
         "low": 28,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.3,
         "Td": 6.3,
         "RH": 71,
         "wind": 14.3,
         "low": 30,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.1,
         "Td": 6.1,
         "RH": 71,
         "wind": 13.2,
         "low": 36,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.1,
         "Td": 5.4,
         "RH": 68,
         "wind": 12.5,
         "low": 50,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.2,
         "Td": 4.6,
         "RH": 64,
         "wind": 12.2,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.3,
         "Td": 4.3,
         "RH": 62,
         "wind": 12.0,
         "low": 80,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 4.4,
         "RH": 62,
         "wind": 12.4,
         "low": 80,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 5.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 15 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 11.1 \u00b0C vs afternoon dewpoint 17.4 \u00b0C \u2192 -6.3 \u00b0C; rain last 48 h = 6.8 mm; BUT dewpoint falls 11.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 71 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 5.0 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 3.3,
       "rh_max": 80,
       "wind_mean": 12.975,
       "wind_after": 11.55,
       "gust_max": 29.4,
       "cloud_mh_night": 84.63636363636364,
       "cloud_low_night": 79.63636363636364,
       "cloud_mh_sunrise": 22.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 67.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 18.8,
       "t_key": 9.6,
       "cooling": 9.200000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 15.35,
       "crossover": -5.75,
       "td_drop": 9.05,
       "airmass_change": true,
       "precip_night_mm": 1.6,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.0,
         "Td": 20.0,
         "RH": 94,
         "wind": 11.6,
         "low": 92,
         "mid": 82,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.2,
         "Td": 18.3,
         "RH": 89,
         "wind": 12.4,
         "low": 95,
         "mid": 70,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.3,
         "Td": 16.7,
         "RH": 85,
         "wind": 12.6,
         "low": 100,
         "mid": 87,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 18.5,
         "Td": 16.1,
         "RH": 86,
         "wind": 10.5,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.3,
         "Td": 13.4,
         "RH": 83,
         "wind": 14.6,
         "low": 76,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 15.4,
         "Td": 12.1,
         "RH": 81,
         "wind": 12.2,
         "low": 98,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 14.3,
         "Td": 10.1,
         "RH": 76,
         "wind": 14.0,
         "low": 95,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.4,
         "Td": 7.9,
         "RH": 74,
         "wind": 14.8,
         "low": 49,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 14.0,
         "low": 31,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 5.9,
         "RH": 77,
         "wind": 12.4,
         "low": 58,
         "mid": 66,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 6.3,
         "RH": 80,
         "wind": 10.7,
         "low": 82,
         "mid": 44,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 5.6,
         "RH": 74,
         "wind": 10.8,
         "low": 52,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 5.7,
         "RH": 74,
         "wind": 12.3,
         "low": 52,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 5.7,
         "RH": 71,
         "wind": 12.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 5.7,
         "RH": 68,
         "wind": 12.2,
         "low": 71,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.11,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.0 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.25,
        "why": "overnight mid+high levels cloud = 85 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 15.3 \u00b0C \u2192 -5.8 \u00b0C; rain last 48 h = 6.8 mm; BUT dewpoint falls 9.1 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.04
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 6.8,
    "soil_moisture_top": 0.221,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1643173&longitude=-87.5542197&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1643173&longitude=-87.5542197&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 205.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1643173&longitude=-87.5542197&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 205.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1643173&longitude=-87.5542197&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 205.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.1643173&longitude=-87.5542197&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 205.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 10.7,
   "dawn_wind_kt": 12.6
  },
  {
   "id": "des-plaines-sfwa",
   "name": "Des Plaines State Fish and Wildlife Area",
   "lat": 41.372,
   "lon": -88.207,
   "agency": "Illinois Department of Natural Resources",
   "agency_url": "https://dnr.illinois.gov/parks/park.desplaines.html",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "17 Ill. Adm. Code 110.160(i): it is unlawful \"Except in cases of emergency, for any person to land or attempt to land any aircraft on Department-owned, -leased or -managed property without prior authorization for each landing or attempted landing from the Department.\" No site-specific drone page found for this site. The wording says 'aircraft', not 'drone/unmanned', and does not name the superintendent; treat as authorization required until the site office says otherwise.",
   "drone_rule_url": "https://www.ilga.gov/commission/jcar/admincode/017/017001100A01600R.html",
   "drone_status": "permit",
   "features": [
    "river",
    "bottomland",
    "prairie",
    "ponds",
    "open fields"
   ],
   "features_source": "IDNR activities page: \"The Kankakee River borders the site on the south with 3 miles of shoreline\"; \"plentiful open areas, swampy backwater areas and woodlands\"; \"Eighty acres of the Des Plaines SFWA are dedicated as a nature preserve which contains many remnants of the Illinois' natural prairie.\" USGS gauge 05527500 Kankakee River near Wilmington (41.3463, -88.1867) about 2 mi away. 3DEP: 515 ft, ring 504-532 ft. Coordinates: IDNR page Park Latitude/Longitude.",
   "drive_minutes_est": 48,
   "airspace_note": "No Class E polygon from the FAA data at this point; surface is Class G. Dresden Generating Station (nuclear) 3.0 nm, Braidwood 7.8 nm, KJOT 8.9 nm. FAA FDC 6/8818 advises avoiding airspace in close proximity to nuclear plants; no mapped hard restriction found.",
   "notes": "Drive estimate is just over the 45-minute target. Hunting is a main use (IDNR activities page has a hunting section; hunting-season dates not checked). IDNR: \"Boat ramps are closed seasonally from the end of October for pheasant hunting season thru mid-April\"; hand trap and archery ranges are \"Closed during pheasant season.\" General daily hours not found; equestrian trail \"6 a.m. to 10 p.m. daily\" is trail-specific.",
   "look": "bottomland + prairie + backwaters; over the 45-min line; Dresden station 3 nm",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:18"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.056,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.076,
    "confidence": "high",
    "confidence_why": "4 models within 0.08 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.4 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:21:07.350015-05:00",
     "est_end": "2026-10-16 07:51:07.350015-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 100 % with visibility 17 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.5,
     "likely": false,
     "why": "river water +8.5 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 11 kt)",
     "gauge": "KANKAKEE RIVER NEAR WILMINGTON, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.3999999999999986,
       "dpd_key": 2.6000000000000005,
       "rh_max": 85,
       "wind_mean": 11.475,
       "wind_after": 11.4,
       "gust_max": 27.0,
       "cloud_mh_night": 13.727272727272727,
       "cloud_low_night": 94.36363636363636,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16900.0,
       "low_sunrise": 100.0,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.5,
       "t_key": 10.3,
       "cooling": 9.2,
       "t_min_night": 10.3,
       "td_afternoon": 16.75,
       "crossover": -6.449999999999999,
       "td_drop": 9.05,
       "airmass_change": true,
       "precip_night_mm": 0.7,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.2999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.0,
         "Td": 19.2,
         "RH": 95,
         "wind": 10.3,
         "low": 100,
         "mid": 10,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "22:00",
         "T": 19.5,
         "Td": 18.4,
         "RH": 93,
         "wind": 11.3,
         "low": 100,
         "mid": 3,
         "high": 0,
         "vis": 4300.0
        },
        {
         "t": "23:00",
         "T": 17.0,
         "Td": 15.2,
         "RH": 89,
         "wind": 13.0,
         "low": 92,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "00:00",
         "T": 15.1,
         "Td": 13.1,
         "RH": 88,
         "wind": 11.9,
         "low": 100,
         "mid": 29,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 14.3,
         "Td": 12.5,
         "RH": 89,
         "wind": 14.0,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "02:00",
         "T": 12.7,
         "Td": 10.3,
         "RH": 85,
         "wind": 13.8,
         "low": 100,
         "mid": 9,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "03:00",
         "T": 11.9,
         "Td": 9.4,
         "RH": 85,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "04:00",
         "T": 11.5,
         "Td": 9.1,
         "RH": 85,
         "wind": 11.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 11.2,
         "Td": 8.8,
         "RH": 85,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 7.9,
         "RH": 85,
         "wind": 11.7,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 7.7,
         "RH": 84,
         "wind": 10.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.1,
         "RH": 81,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 6.7,
         "RH": 83,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "10:00",
         "T": 9.9,
         "Td": 7.2,
         "RH": 83,
         "wind": 11.7,
         "low": 96,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        },
        {
         "t": "11:00",
         "T": 10.2,
         "Td": 7.2,
         "RH": 82,
         "wind": 11.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.3,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.08,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 14 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 16.8 \u00b0C \u2192 -6.4 \u00b0C; rain last 48 h = 11.7 mm; BUT dewpoint falls 9.1 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 11 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 94 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.052
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.0999999999999996,
       "dpd_key": 1.5999999999999996,
       "rh_max": 93,
       "wind_mean": 12.65,
       "wind_after": 13.1,
       "gust_max": 20.4,
       "cloud_mh_night": 84.63636363636364,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 60.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.1,
       "t_key": 8.2,
       "cooling": 12.900000000000002,
       "t_min_night": 8.2,
       "td_afternoon": 18.85,
       "crossover": -10.650000000000002,
       "td_drop": 12.250000000000002,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.2,
         "Td": 19.2,
         "RH": 100,
         "wind": 8.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.1,
         "Td": 18.9,
         "RH": 99,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 17.3,
         "Td": 17.3,
         "RH": 100,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 15.5,
         "Td": 15.3,
         "RH": 99,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7960.0
        },
        {
         "t": "01:00",
         "T": 13.9,
         "Td": 13.2,
         "RH": 96,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "02:00",
         "T": 12.6,
         "Td": 11.5,
         "RH": 93,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 12760.0
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 10.0,
         "RH": 92,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 9.2,
         "RH": 93,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.7,
         "Td": 8.6,
         "RH": 93,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.9,
         "Td": 7.6,
         "RH": 92,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.2,
         "Td": 6.6,
         "RH": 90,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.3,
         "Td": 7.2,
         "RH": 93,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 8.1,
         "RH": 88,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 8.5,
         "RH": 86,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 8.6,
         "RH": 81,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.8,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.02,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.25,
        "why": "overnight total cloud (levels unavailable) cloud = 85 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 18.9 \u00b0C \u2192 -10.7 \u00b0C; rain last 48 h = 11.7 mm; BUT dewpoint falls 12.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.094
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.499999999999999,
       "dpd_key": 5.6000000000000005,
       "rh_max": 74,
       "wind_mean": 13.175,
       "wind_after": 14.1,
       "gust_max": 29.0,
       "cloud_mh_night": 23.181818181818183,
       "cloud_low_night": 58.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 32.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.8,
       "t_key": 10.4,
       "cooling": 10.4,
       "t_min_night": 10.4,
       "td_afternoon": 18.45,
       "crossover": -8.049999999999999,
       "td_drop": 13.649999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 8.0,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.6,
         "Td": 19.9,
         "RH": 96,
         "wind": 14.6,
         "low": 74,
         "mid": 23,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 19.8,
         "Td": 19.0,
         "RH": 95,
         "wind": 13.8,
         "low": 80,
         "mid": 30,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 18.4,
         "Td": 16.9,
         "RH": 91,
         "wind": 13.2,
         "low": 80,
         "mid": 40,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.6,
         "Td": 14.1,
         "RH": 85,
         "wind": 13.8,
         "low": 76,
         "mid": 51,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.0,
         "Td": 11.6,
         "RH": 80,
         "wind": 14.9,
         "low": 71,
         "mid": 54,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.9,
         "Td": 9.9,
         "RH": 77,
         "wind": 15.0,
         "low": 62,
         "mid": 40,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.0,
         "Td": 8.9,
         "RH": 76,
         "wind": 14.2,
         "low": 52,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.2,
         "Td": 7.7,
         "RH": 74,
         "wind": 13.7,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.4,
         "Td": 6.6,
         "RH": 72,
         "wind": 13.2,
         "low": 37,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.8,
         "Td": 5.5,
         "RH": 70,
         "wind": 12.9,
         "low": 32,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 4.8,
         "RH": 68,
         "wind": 12.9,
         "low": 31,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 4.5,
         "RH": 66,
         "wind": 13.6,
         "low": 34,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.1,
         "Td": 4.6,
         "RH": 64,
         "wind": 14.6,
         "low": 39,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.5,
         "Td": 4.7,
         "RH": 63,
         "wind": 14.9,
         "low": 47,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 5.2,
         "RH": 65,
         "wind": 14.4,
         "low": 59,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 13.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.96,
        "why": "overnight mid+high levels cloud = 23 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 10.4 \u00b0C vs afternoon dewpoint 18.4 \u00b0C \u2192 -8.0 \u00b0C; rain last 48 h = 11.7 mm; BUT dewpoint falls 13.6 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 74 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.5 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.1000000000000005,
       "dpd_key": 4.6,
       "rh_max": 81,
       "wind_mean": 11.225,
       "wind_after": 11.45,
       "gust_max": 27.0,
       "cloud_mh_night": 62.63636363636363,
       "cloud_low_night": 76.9090909090909,
       "cloud_mh_sunrise": 31.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 67.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 18.9,
       "t_key": 9.7,
       "cooling": 9.2,
       "t_min_night": 9.7,
       "td_afternoon": 16.3,
       "crossover": -6.600000000000001,
       "td_drop": 11.200000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.4,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.199999999999932,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.3,
         "Td": 17.6,
         "RH": 90,
         "wind": 12.7,
         "low": 100,
         "mid": 79,
         "high": 11,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.7,
         "Td": 16.7,
         "RH": 88,
         "wind": 12.4,
         "low": 100,
         "mid": 88,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 17.7,
         "Td": 15.0,
         "RH": 84,
         "wind": 13.6,
         "low": 99,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 16.3,
         "Td": 12.8,
         "RH": 80,
         "wind": 12.4,
         "low": 86,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 15.4,
         "Td": 11.4,
         "RH": 77,
         "wind": 13.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 14.1,
         "Td": 9.5,
         "RH": 74,
         "wind": 14.3,
         "low": 82,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 12.3,
         "Td": 7.2,
         "RH": 71,
         "wind": 14.4,
         "low": 43,
         "mid": 78,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 6.5,
         "RH": 73,
         "wind": 12.4,
         "low": 37,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.3,
         "Td": 7.2,
         "RH": 81,
         "wind": 10.7,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.1,
         "RH": 76,
         "wind": 11.0,
         "low": 75,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 5.1,
         "RH": 73,
         "wind": 10.8,
         "low": 69,
         "mid": 0,
         "high": 13,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.2,
         "Td": 5.2,
         "RH": 76,
         "wind": 10.9,
         "low": 65,
         "mid": 0,
         "high": 50,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 5.1,
         "RH": 74,
         "wind": 12.0,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 6.1,
         "RH": 75,
         "wind": 12.2,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 13.8,
         "low": 72,
         "mid": 67,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.13,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.09,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.47,
        "why": "overnight mid+high levels cloud = 63 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 16.3 \u00b0C \u2192 -6.6 \u00b0C; rain last 48 h = 11.7 mm; BUT dewpoint falls 11.2 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 81 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 11 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.056
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 11.7,
    "soil_moisture_top": 0.148,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.372&longitude=-88.207&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.372&longitude=-88.207&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 158.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.372&longitude=-88.207&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 158.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.372&longitude=-88.207&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 158.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.372&longitude=-88.207&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 158.0
    }
   },
   "water_temp_c": 18.8,
   "dawn_temp_c": 10.3,
   "dawn_wind_kt": 10.5
  },
  {
   "id": "iroquois-county-swa",
   "name": "Iroquois County State Wildlife Area",
   "lat": 40.994,
   "lon": -87.599,
   "agency": "Illinois Department of Natural Resources",
   "agency_url": "https://dnr.illinois.gov/parks/park.iroquoiscounty.html",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "17 Ill. Adm. Code 110.160(i): it is unlawful \"Except in cases of emergency, for any person to land or attempt to land any aircraft on Department-owned, -leased or -managed property without prior authorization for each landing or attempted landing from the Department.\" No site-specific drone page found for this site. The wording says 'aircraft', not 'drone/unmanned', and does not name the superintendent; treat as authorization required until the site office says otherwise.",
   "drone_rule_url": "https://www.ilga.gov/commission/jcar/admincode/017/017001100A01600R.html",
   "drone_status": "permit",
   "features": [
    "marsh",
    "sand ridges",
    "savanna",
    "prairie remnant"
   ],
   "features_source": "IDNR page: \"situated in a low glacial outwash plain associated with the Kankakee River Valley that consists of marshland, sand ridges and dunes\"; \"Hooper Branch Savanna, 480 acres of this parcel is considered the largest single tract of rare native savanna remaining in Illinois\". USGS 3DEP: 644 ft, ring 627-653 ft. Coordinates: IDNR page Park Latitude/Longitude 40.994/-87.599.",
   "drive_minutes_est": 55,
   "airspace_note": "No Class E polygon from the FAA data at this point; surface is Class G. KIKK 12.1 nm. No UAS Facility Map grid.",
   "notes": "OUTSIDE the 45-minute target (OSRM estimate 55 min) and kept because the terrain matches the lone-tree look. IDNR page: \"The majority of the area, 2,000 acres, is managed as a public hunting area... Nonconsumptive recreation, in the form of hiking and nature study, is available when the facility is closed to hunting.\" Hunting seasons overlap Oct-Nov. IDNR: drones for any aspect of hunting are unlawful. Site office 815-435-2218.",
   "look": "lone trees on sand ridges, marsh fog; over the 45-min line; hunting-season access limits",
   "evidence": "research/C-locations.md",
   "sun": {
    "civil_dawn": "06:35",
    "sunrise": "07:03",
    "azimuth": 101.3,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:17",
    "sun_12deg": "08:14"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.04,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.056,
    "confidence": "high",
    "confidence_why": "4 models within 0.06 of each other on the blend score",
    "fog_type": {
     "type": "shallow ground fog",
     "depth_est": "0\u20133 m, if any (estimate)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.6 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KIKK 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.7 \u00b0C \u2014 profile shows no saturated layer at the airport; any fog will be local to low ground and water"
    },
    "burnoff": {
     "est_start": "2026-10-16 07:18:17.245368-05:00",
     "est_end": "2026-10-16 07:48:17.245368-05:00",
     "model_clear": null,
     "notes": [
      "wind picking up after sunrise mixes it out faster"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.2,
     "label": "overcast above the fog",
     "why": "mid+high cloud at sunrise \u2248 50 %, plus a low deck \u2248 92 % with visibility 18 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.5999999999999996,
       "dpd_key": 3.1000000000000005,
       "rh_max": 84,
       "wind_mean": 14.9,
       "wind_after": 12.899999999999999,
       "gust_max": 29.9,
       "cloud_mh_night": 62.18181818181818,
       "cloud_low_night": 98.45454545454545,
       "cloud_mh_sunrise": 50.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 17800.0,
       "low_sunrise": 91.5,
       "vis_min": 16300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 19.2,
       "t_key": 10.8,
       "cooling": 8.399999999999999,
       "t_min_night": 10.8,
       "td_afternoon": 16.5,
       "crossover": -5.699999999999999,
       "td_drop": 8.8,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.2999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 22.0,
         "Td": 21.0,
         "RH": 94,
         "wind": 15.3,
         "low": 100,
         "mid": 81,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "22:00",
         "T": 20.8,
         "Td": 19.1,
         "RH": 90,
         "wind": 10.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "23:00",
         "T": 20.1,
         "Td": 18.1,
         "RH": 88,
         "wind": 12.6,
         "low": 100,
         "mid": 13,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "00:00",
         "T": 17.7,
         "Td": 16.3,
         "RH": 91,
         "wind": 14.7,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 13600.0
        },
        {
         "t": "01:00",
         "T": 15.5,
         "Td": 13.0,
         "RH": 85,
         "wind": 15.9,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "02:00",
         "T": 14.3,
         "Td": 11.8,
         "RH": 85,
         "wind": 16.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "03:00",
         "T": 12.8,
         "Td": 10.2,
         "RH": 84,
         "wind": 17.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "04:00",
         "T": 11.6,
         "Td": 9.0,
         "RH": 84,
         "wind": 17.1,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 11.3,
         "Td": 8.7,
         "RH": 84,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "06:00",
         "T": 11.0,
         "Td": 8.3,
         "RH": 83,
         "wind": 14.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "07:00",
         "T": 10.8,
         "Td": 7.7,
         "RH": 81,
         "wind": 13.6,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": 17800.0
        },
        {
         "t": "08:00",
         "T": 10.3,
         "Td": 7.4,
         "RH": 82,
         "wind": 13.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 17500.0
        },
        {
         "t": "09:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.7,
         "low": 85,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "10:00",
         "T": 9.9,
         "Td": 6.4,
         "RH": 79,
         "wind": 13.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "11:00",
         "T": 10.1,
         "Td": 6.4,
         "RH": 78,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18500.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.25,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.48,
        "why": "overnight mid+high levels cloud = 62 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 10.8 \u00b0C vs afternoon dewpoint 16.5 \u00b0C \u2192 -5.7 \u00b0C; rain last 48 h = 6.7 mm; BUT dewpoint falls 8.8 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 98 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.5999999999999996,
       "dpd_key": 1.5999999999999996,
       "rh_max": 90,
       "wind_mean": 12.1,
       "wind_after": 12.0,
       "gust_max": 19.4,
       "cloud_mh_night": 90.9090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 74.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 22.0,
       "t_key": 9.1,
       "cooling": 12.9,
       "t_min_night": 9.1,
       "td_afternoon": 18.9,
       "crossover": -9.799999999999999,
       "td_drop": 11.399999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.8999999999999999,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 19.7,
         "Td": 19.7,
         "RH": 100,
         "wind": 8.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "22:00",
         "T": 19.5,
         "Td": 19.3,
         "RH": 99,
         "wind": 8.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "23:00",
         "T": 18.5,
         "Td": 18.5,
         "RH": 100,
         "wind": 9.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "00:00",
         "T": 17.1,
         "Td": 16.7,
         "RH": 98,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 15.5,
         "Td": 15.0,
         "RH": 97,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 14.1,
         "Td": 13.1,
         "RH": 94,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 12.5,
         "Td": 11.0,
         "RH": 91,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 9.4,
         "RH": 89,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.8,
         "RH": 90,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 8.2,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 9.1,
         "Td": 7.5,
         "RH": 90,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.8,
         "Td": 7.7,
         "RH": 93,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 7.8,
         "RH": 87,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 7.7,
         "RH": 82,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 7.6,
         "RH": 76,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.56,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.19,
        "why": "overnight total cloud (levels unavailable) cloud = 91 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 12.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 18.9 \u00b0C \u2192 -9.8 \u00b0C; rain last 48 h = 6.7 mm; BUT dewpoint falls 11.4 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 16.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.074
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 4.800000000000001,
       "dpd_key": 4.800000000000001,
       "rh_max": 72,
       "wind_mean": 14.825,
       "wind_after": 12.55,
       "gust_max": 32.1,
       "cloud_mh_night": 18.0,
       "cloud_low_night": 60.45454545454545,
       "cloud_mh_sunrise": 2.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 43.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 21.3,
       "t_key": 11.4,
       "cooling": 9.9,
       "t_min_night": 11.4,
       "td_afternoon": 18.05,
       "crossover": -6.65,
       "td_drop": 11.450000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.7000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 6.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 20.9,
         "Td": 20.1,
         "RH": 95,
         "wind": 12.7,
         "low": 89,
         "mid": 16,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.2,
         "Td": 19.4,
         "RH": 95,
         "wind": 12.3,
         "low": 90,
         "mid": 18,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.2,
         "Td": 18.1,
         "RH": 93,
         "wind": 12.5,
         "low": 88,
         "mid": 19,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 18.1,
         "Td": 16.3,
         "RH": 89,
         "wind": 13.2,
         "low": 84,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.8,
         "Td": 14.3,
         "RH": 85,
         "wind": 14.2,
         "low": 77,
         "mid": 21,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 15.4,
         "Td": 12.0,
         "RH": 80,
         "wind": 15.3,
         "low": 62,
         "mid": 23,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.9,
         "Td": 9.6,
         "RH": 75,
         "wind": 16.1,
         "low": 44,
         "mid": 25,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.7,
         "Td": 7.6,
         "RH": 71,
         "wind": 16.4,
         "low": 32,
         "mid": 24,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 12.0,
         "Td": 6.9,
         "RH": 71,
         "wind": 15.6,
         "low": 29,
         "mid": 18,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.7,
         "Td": 6.8,
         "RH": 72,
         "wind": 14.3,
         "low": 32,
         "mid": 10,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.4,
         "Td": 6.6,
         "RH": 72,
         "wind": 13.0,
         "low": 38,
         "mid": 4,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.3,
         "Td": 5.8,
         "RH": 69,
         "wind": 12.6,
         "low": 49,
         "mid": 1,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.3,
         "Td": 4.7,
         "RH": 64,
         "wind": 12.5,
         "low": 64,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.3,
         "Td": 4.1,
         "RH": 61,
         "wind": 12.6,
         "low": 75,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 4.3,
         "RH": 61,
         "wind": 12.8,
         "low": 78,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 4.8 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 18 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 9.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 11.4 \u00b0C vs afternoon dewpoint 18.1 \u00b0C \u2192 -6.7 \u00b0C; rain last 48 h = 6.7 mm; BUT dewpoint falls 11.5 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 72 %"
       }
      },
      "gates": [
       {
        "mult": 0.3,
        "why": "dewpoint depression never below 4.8 \u00b0C: air does not saturate"
       },
       {
        "mult": 0.25,
        "why": "wind 15 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.018
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 3.3,
       "rh_max": 80,
       "wind_mean": 14.075,
       "wind_after": 12.5,
       "gust_max": 29.9,
       "cloud_mh_night": 89.27272727272727,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 36.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 69.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 20.1,
       "t_key": 9.5,
       "cooling": 10.600000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 16.1,
       "crossover": -6.600000000000001,
       "td_drop": 9.900000000000002,
       "airmass_change": true,
       "precip_night_mm": 2.3,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.699999999999932,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 21.4,
         "Td": 20.2,
         "RH": 93,
         "wind": 13.0,
         "low": 88,
         "mid": 76,
         "high": 0,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 20.7,
         "Td": 18.7,
         "RH": 88,
         "wind": 13.4,
         "low": 94,
         "mid": 62,
         "high": 0,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 19.7,
         "Td": 16.9,
         "RH": 84,
         "wind": 13.2,
         "low": 100,
         "mid": 81,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 19.0,
         "Td": 16.2,
         "RH": 84,
         "wind": 10.9,
         "low": 98,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 16.7,
         "Td": 13.8,
         "RH": 83,
         "wind": 16.4,
         "low": 87,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 15.5,
         "Td": 13.0,
         "RH": 85,
         "wind": 11.7,
         "low": 98,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 14.3,
         "Td": 10.7,
         "RH": 79,
         "wind": 15.6,
         "low": 82,
         "mid": 100,
         "high": 2,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 12.6,
         "Td": 8.1,
         "RH": 74,
         "wind": 16.5,
         "low": 53,
         "mid": 93,
         "high": 8,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 11.2,
         "Td": 6.2,
         "RH": 71,
         "wind": 15.1,
         "low": 34,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 6.0,
         "RH": 77,
         "wind": 13.3,
         "low": 61,
         "mid": 93,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 6.2,
         "RH": 80,
         "wind": 11.4,
         "low": 85,
         "mid": 73,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 5.4,
         "RH": 74,
         "wind": 11.6,
         "low": 54,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 5.4,
         "RH": 73,
         "wind": 13.4,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 5.3,
         "RH": 69,
         "wind": 13.5,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 5.8,
         "RH": 67,
         "wind": 13.0,
         "low": 85,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.11,
        "why": "min T\u2212Td in the 3 h before sunrise = 3.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 14.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.21,
        "why": "overnight mid+high levels cloud = 89 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 10.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.36,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 16.1 \u00b0C \u2192 -6.6 \u00b0C; rain last 48 h = 6.7 mm; BUT dewpoint falls 9.9 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 80 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.023
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 6.7,
    "soil_moisture_top": 0.222,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=40.994&longitude=-87.599&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=40.994&longitude=-87.599&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 197.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=40.994&longitude=-87.599&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 197.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=40.994&longitude=-87.599&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 197.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=40.994&longitude=-87.599&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-16T16%3A00",
     "fetched_utc": "2026-10-16T05:25:01+00:00",
     "elevation_m": 197.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 10.8,
   "dawn_wind_kt": 13.6
  }
 ],
 "log": [],
 "calibration": {
  "a": 5.511394479940868,
  "b": -5.384646836851622,
  "n": 329,
  "events": 34,
  "period": "2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL",
  "fitted_utc": "2026-10-16T04:17:08+00:00"
 },
 "models": [
  "gfs_hrrr",
  "ncep_nbm_conus",
  "ecmwf_ifs025",
  "icon_seamless"
 ],
 "version": "0.2.0",
 "afd": {
  "url": "https://api.weather.gov/products/edaf68a5-efec-4b1b-aad7-9453fc278cb4",
  "issued": "2026-10-15T23:37:00+00:00",
  "fog_paragraphs": [
   "The primary low-pressure system will track directly over northern Illinois early this evening, then deepen as it shifts northeast into lower Michigan tonight. Expect a brief period of lower ceilings and reduced visibility for a few hours as the low moves overhead. Conditions will improve rapidly later tonight following a sharp cold front. In its wake, northwest winds will become gusty (3035 mph) overnight, while strong cold air advection drops temperatures into the 40s to low 50s by early Friday morning. Breezy conditions (gusts of 35 to 40 mph) will persist through Friday due to strong pressure rises behind the departing low and ahead of a 1035+ mb surface high building in from the Plains. Even stronger northerly winds (~45 mph) are projected over southern Lake Michigan Friday afternoon and evening. Onshore flow will push some of these higher winds inland across far northern Porter County, Indiana, where a Wind Advisory is in effect from 1:00 PM to 10:00 PM CDT Friday."
  ]
 },
 "metar": {
  "url": "https://aviationweather.gov/api/data/metar?ids=KIKK%2CKJOT%2CKC75%2CKLOT%2CKGYY&format=json",
  "obs": [
   {
    "id": "KC75",
    "time": "2026-10-16T05:15:00.000Z",
    "temp_c": 12.2,
    "dewp_c": 9.3,
    "wind_kt": 11,
    "wind_dir": 300,
    "vis_mi": "10+",
    "clouds": [
     [
      "OVC",
      1400
     ]
    ],
    "wx": null,
    "raw": "METAR KC75 160515Z AUTO 30011G19KT 10SM OVC014 12/09 A2996 RMK AO2 T01220093"
   },
   {
    "id": "KGYY",
    "time": "2026-10-16T05:15:00.000Z",
    "temp_c": 16,
    "dewp_c": 16,
    "wind_kt": 13,
    "wind_dir": 280,
    "vis_mi": "10+",
    "clouds": [
     [
      "BKN",
      1200
     ],
     [
      "OVC",
      1800
     ]
    ],
    "wx": null,
    "raw": "METAR KGYY 160515Z AUTO 28013G21KT 10SM BKN012 OVC018 16/16 A2981 RMK AO2"
   },
   {
    "id": "KIKK",
    "time": "2026-10-16T05:15:00.000Z",
    "temp_c": 15,
    "dewp_c": 13.6,
    "wind_kt": 11,
    "wind_dir": 300,
    "vis_mi": "10+",
    "clouds": [
     [
      "SCT",
      800
     ],
     [
      "SCT",
      1300
     ],
     [
      "OVC",
      1800
     ]
    ],
    "wx": null,
    "raw": "METAR KIKK 160515Z AUTO 30011G22KT 10SM SCT008 SCT013 OVC018 15/14 A2988 RMK AO2 T01500136"
   },
   {
    "id": "KJOT",
    "time": "2026-10-16T05:15:00.000Z",
    "temp_c": 15.2,
    "dewp_c": 13.6,
    "wind_kt": 8,
    "wind_dir": 300,
    "vis_mi": "10+",
    "clouds": [
     [
      "OVC",
      1800
     ]
    ],
    "wx": null,
    "raw": "METAR KJOT 160515Z AUTO 30008G19KT 10SM OVC018 15/14 A2986 RMK AO2 T01520136"
   },
   {
    "id": "KLOT",
    "time": "2026-10-16T05:15:00.000Z",
    "temp_c": 14,
    "dewp_c": 14,
    "wind_kt": 15,
    "wind_dir": 280,
    "vis_mi": "10+",
    "clouds": [
     [
      "BKN",
      1600
     ],
     [
      "OVC",
      2100
     ]
    ],
    "wx": null,
    "raw": "METAR KLOT 160515Z AUTO 28015G23KT 10SM BKN016 OVC021 14/14 A2986 RMK AO2"
   }
  ]
 },
 "gauges": {
  "url": "https://waterservices.usgs.gov/nwis/iv/?sites=05520500%2C05526000%2C05527500&parameterCd=00065%2C00010&format=json&period=P1D",
  "gauges": {
   "05520500": {
    "name": "KANKAKEE RIVER AT MOMENCE, IL",
    "stage_ft": 2.1,
    "stage_ft_time": "2026-10-15T22:45:00.000-06:00"
   },
   "05526000": {
    "name": "IROQUOIS RIVER NEAR CHEBANSE, IL",
    "stage_ft": 2.92,
    "stage_ft_time": "2026-10-15T22:45:00.000-06:00"
   },
   "05527500": {
    "name": "KANKAKEE RIVER NEAR WILMINGTON, IL",
    "water_temp_c": 18.8,
    "water_temp_c_time": "2026-10-15T22:45:00.000-06:00",
    "stage_ft": 1.59,
    "stage_ft_time": "2026-10-15T22:45:00.000-06:00"
   }
  }
 },
 "nbm_text": {
  "url": "https://nomads.ncep.noaa.gov/pub/data/nccf/com/blend/prod/blend.20261016/04/text/blend_nbhtx.t04z",
  "cycle_utc": "2026-10-16T04:00:00+00:00",
  "station": "KIKK",
  "rows": [
   {
    "local": "2026-10-16 00:00",
    "TMP": 61,
    "DPT": 61,
    "WSP": 13,
    "SKY": 96,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 3,
    "MVV": 8,
    "CIG": 11
   },
   {
    "local": "2026-10-16 01:00",
    "TMP": 58,
    "DPT": 57,
    "WSP": 14,
    "SKY": 96,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 2,
    "MVV": 7,
    "CIG": 13
   },
   {
    "local": "2026-10-16 02:00",
    "TMP": 55,
    "DPT": 53,
    "WSP": 14,
    "SKY": 92,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 2,
    "MVV": 6,
    "CIG": 13
   },
   {
    "local": "2026-10-16 03:00",
    "TMP": 53,
    "DPT": 50,
    "WSP": 15,
    "SKY": 96,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 1,
    "MVV": 4,
    "CIG": 13
   },
   {
    "local": "2026-10-16 04:00",
    "TMP": 51,
    "DPT": 48,
    "WSP": 14,
    "SKY": 91,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 3,
    "CIG": 15
   },
   {
    "local": "2026-10-16 05:00",
    "TMP": 50,
    "DPT": 47,
    "WSP": 14,
    "SKY": 89,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 1,
    "CIG": 15
   },
   {
    "local": "2026-10-16 06:00",
    "TMP": 48,
    "DPT": 46,
    "WSP": 14,
    "SKY": 77,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 13
   },
   {
    "local": "2026-10-16 07:00",
    "TMP": 47,
    "DPT": 44,
    "WSP": 13,
    "SKY": 71,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 15
   },
   {
    "local": "2026-10-16 08:00",
    "TMP": 47,
    "DPT": 45,
    "WSP": 13,
    "SKY": 54,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 18
   },
   {
    "local": "2026-10-16 09:00",
    "TMP": 49,
    "DPT": 44,
    "WSP": 14,
    "SKY": 67,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 18
   },
   {
    "local": "2026-10-16 10:00",
    "TMP": 51,
    "DPT": 43,
    "WSP": 14,
    "SKY": 79,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 15
   },
   {
    "local": "2026-10-16 11:00",
    "TMP": 53,
    "DPT": 42,
    "WSP": 14,
    "SKY": 79,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 15
   },
   {
    "local": "2026-10-16 12:00",
    "TMP": 54,
    "DPT": 42,
    "WSP": 14,
    "SKY": 88,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 15
   },
   {
    "local": "2026-10-16 13:00",
    "TMP": 54,
    "DPT": 42,
    "WSP": 14,
    "SKY": 80,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 15
   },
   {
    "local": "2026-10-16 14:00",
    "TMP": 55,
    "DPT": 41,
    "WSP": 14,
    "SKY": 80,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 4,
    "MVV": 9,
    "CIG": 18
   },
   {
    "local": "2026-10-16 15:00",
    "TMP": 55,
    "DPT": 41,
    "WSP": 14,
    "SKY": 74,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 1,
    "MVV": 3,
    "CIG": 22
   },
   {
    "local": "2026-10-16 16:00",
    "TMP": 55,
    "DPT": 41,
    "WSP": 15,
    "SKY": 75,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 3,
    "MVV": 6,
    "CIG": 22
   },
   {
    "local": "2026-10-16 17:00",
    "TMP": 55,
    "DPT": 41,
    "WSP": 16,
    "SKY": 68,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 2,
    "MVV": 4,
    "CIG": 22
   },
   {
    "local": "2026-10-16 18:00",
    "TMP": 53,
    "DPT": 40,
    "WSP": 15,
    "SKY": 61,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-16 19:00",
    "TMP": 49,
    "DPT": 40,
    "WSP": 14,
    "SKY": 71,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-16 20:00",
    "TMP": 47,
    "DPT": 40,
    "WSP": 14,
    "SKY": 61,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-16 21:00",
    "TMP": 45,
    "DPT": 39,
    "WSP": 13,
    "SKY": 37,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-16 22:00",
    "TMP": 44,
    "DPT": 38,
    "WSP": 13,
    "SKY": 34,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-16 23:00",
    "TMP": 43,
    "DPT": 37,
    "WSP": 12,
    "SKY": 35,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 22
   },
   {
    "local": "2026-10-17 00:00",
    "TMP": 41,
    "DPT": 36,
    "WSP": 11,
    "SKY": 29,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 27
   }
  ]
 },
 "profile": {
  "url": "https://www.meteo.psu.edu/bufkit/data/HRRR/00/hrrr_kikk.buf",
  "cycle": "00",
  "init_local": "2026-10-15 19:00",
  "dawn_hours": [
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      11.1,
      13.24,
      10.62
     ],
     [
      35.8,
      13.04,
      10.34
     ],
     [
      82.0,
      12.54,
      10.09
     ],
     [
      161.9,
      11.74,
      9.77
     ],
     [
      280.7,
      10.64,
      9.33
     ]
    ],
    "valid_local": "03:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      10.2,
      11.84,
      9.07
     ],
     [
      35.6,
      11.64,
      8.8
     ],
     [
      81.5,
      11.14,
      8.6
     ],
     [
      161.0,
      10.34,
      8.31
     ],
     [
      279.1,
      9.24,
      7.96
     ]
    ],
    "valid_local": "04:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      10.1,
      11.44,
      8.43
     ],
     [
      35.5,
      11.24,
      8.18
     ],
     [
      81.4,
      10.74,
      7.97
     ],
     [
      160.7,
      10.04,
      7.68
     ],
     [
      278.6,
      8.94,
      7.28
     ]
    ],
    "valid_local": "05:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      11.0,
      11.14,
      8.15
     ],
     [
      36.3,
      10.94,
      7.89
     ],
     [
      81.2,
      10.44,
      7.66
     ],
     [
      161.3,
      9.74,
      7.32
     ],
     [
      279.0,
      8.64,
      6.85
     ]
    ],
    "valid_local": "06:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      10.9,
      10.54,
      8.0
     ],
     [
      35.3,
      10.24,
      7.78
     ],
     [
      81.7,
      9.84,
      7.59
     ],
     [
      160.6,
      9.04,
      7.34
     ],
     [
      277.9,
      7.94,
      6.98
     ]
    ],
    "valid_local": "07:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.7,
    "lowest_levels": [
     [
      10.9,
      10.14,
      7.46
     ],
     [
      35.2,
      9.84,
      7.21
     ],
     [
      81.6,
      9.44,
      7.0
     ],
     [
      160.3,
      8.64,
      6.72
     ],
     [
      278.1,
      7.44,
      6.4
     ]
    ],
    "valid_local": "08:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.8,
    "lowest_levels": [
     [
      10.9,
      9.94,
      6.63
     ],
     [
      35.2,
      9.64,
      6.35
     ],
     [
      80.6,
      9.14,
      6.13
     ],
     [
      160.1,
      8.44,
      5.85
     ],
     [
      277.0,
      7.24,
      5.52
     ]
    ],
    "valid_local": "09:00"
   }
  ],
  "station": "KIKK"
 },
 "obs_context": {
  "available": true,
  "metar": {
   "id": "KIKK",
   "time": "2026-10-16T05:15:00.000Z",
   "temp_c": 15,
   "dewp_c": 13.6,
   "wind_kt": 11,
   "wind_dir": 300,
   "vis_mi": "10+",
   "clouds": [
    [
     "SCT",
     800
    ],
    [
     "SCT",
     1300
    ],
    [
     "OVC",
     1800
    ]
   ],
   "wx": null,
   "raw": "METAR KIKK 160515Z AUTO 30011G22KT 10SM SCT008 SCT013 OVC018 15/14 A2988 RMK AO2 T01500136"
  },
  "station": "KIKK",
  "hrrr_now": {
   "T": 16.2,
   "Td": 14.4,
   "wind": 16.0,
   "low": 100
  },
  "dpd_obs": 1.4,
  "dpd_model": 1.8
 },
 "outlook": {
  "rows": [
   {
    "day": 1,
    "date": "2026-10-16",
    "weekday": "Fri 16 Oct",
    "setup_score": 0.048,
    "band": "poor",
    "spread": 0.066,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "HRRR",
    "type": "shallow ground fog",
    "light": "overcast above the fog",
    "sunrise": "07:04",
    "azimuth": 101.3,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.4000000000000004,
     "wind_mean": 13.75,
     "cloud_mh_night": 46.63636363636363,
     "hours_saturated": 0
    },
    "confidence": "see the main report (calibrated, HRRR included)",
    "per_model": {
     "gfs_hrrr": 0.039,
     "ecmwf_ifs025": 0.016,
     "gfs_global": 0.062,
     "icon_seamless": 0.044,
     "ncep_nbm_conus": 0.082
    }
   },
   {
    "day": 2,
    "date": "2026-10-17",
    "weekday": "Sat 17 Oct",
    "setup_score": 0.195,
    "band": "poor",
    "spread": 0.437,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "HRRR",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:05",
    "azimuth": 101.8,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 4.5,
     "wind_mean": 8.4,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "HRRR reaches this morning; models usually agree on the airmass; backtest AUC at this lead 0.726 (measured at 2 days)",
    "per_model": {
     "gfs_hrrr": 0.092,
     "ecmwf_ifs025": 0.111,
     "gfs_global": 0.104,
     "icon_seamless": 0.117,
     "ncep_nbm_conus": 0.529
    }
   },
   {
    "day": 3,
    "date": "2026-10-18",
    "weekday": "Sun 18 Oct",
    "setup_score": 0.453,
    "band": "marginal",
    "spread": 0.542,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:06",
    "azimuth": 102.3,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 3.3,
     "wind_mean": 6.375,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "set-up only: dewpoint, wind and sky from the global models; backtest AUC at this lead 0.738 (measured at 3 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.421,
     "gfs_global": 0.109,
     "icon_seamless": 0.508,
     "ncep_nbm_conus": 0.651
    }
   },
   {
    "day": 4,
    "date": "2026-10-19",
    "weekday": "Mon 19 Oct",
    "setup_score": 0.507,
    "band": "marginal",
    "spread": 0.58,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:07",
    "azimuth": 102.7,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.2,
     "wind_mean": 4.15,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "set-up only: dewpoint, wind and sky from the global models; backtest AUC at this lead 0.738 (measured at 3 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.579,
     "gfs_global": 0.133,
     "icon_seamless": 0.713,
     "ncep_nbm_conus": 0.549
    }
   },
   {
    "day": 5,
    "date": "2026-10-20",
    "weekday": "Tue 20 Oct",
    "setup_score": 0.536,
    "band": "marginal",
    "spread": 0.636,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "filtered sun",
    "sunrise": "07:09",
    "azimuth": 103.2,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.4,
     "wind_mean": 2.65,
     "cloud_mh_night": 24.0,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.731,
     "gfs_global": 0.095,
     "icon_seamless": 0.623,
     "ncep_nbm_conus": 0.592
    }
   },
   {
    "day": 6,
    "date": "2026-10-21",
    "weekday": "Wed 21 Oct",
    "setup_score": 0.593,
    "band": "marginal",
    "spread": 0.683,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:10",
    "azimuth": 103.7,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.7000000000000002,
     "wind_mean": 3.725,
     "cloud_mh_night": 3.0,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.712,
     "gfs_global": 0.116,
     "icon_seamless": 0.567,
     "ncep_nbm_conus": 0.799
    }
   },
   {
    "day": 7,
    "date": "2026-10-22",
    "weekday": "Thu 22 Oct",
    "setup_score": 0.597,
    "band": "marginal",
    "spread": 0.631,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "filtered sun",
    "sunrise": "07:11",
    "azimuth": 104.2,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.2000000000000002,
     "wind_mean": 2.2,
     "cloud_mh_night": 36.18181818181818,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.767,
     "gfs_global": 0.136,
     "icon_seamless": 0.689,
     "ncep_nbm_conus": 0.683
    }
   }
  ],
  "best_days": [
   "2026-10-22",
   "2026-10-21",
   "2026-10-20"
  ],
  "sources": {
   "gfs_hrrr": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-22T16%3A00",
   "ecmwf_ifs025": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-22T16%3A00",
   "gfs_global": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_global&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-22T16%3A00",
   "icon_seamless": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-22T16%3A00",
   "ncep_nbm_conus": "https://api.open-meteo.com/v1/forecast?latitude=41.153&longitude=-87.879&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-15T20%3A00&end_hour=2026-10-22T16%3A00"
  },
  "band_rates": [
   {
    "band": "strong set-up",
    "lo": 0.75,
    "n": 44,
    "fog_rate": 0.25
   },
   {
    "band": "decent set-up",
    "lo": 0.6,
    "n": 82,
    "fog_rate": 0.17
   },
   {
    "band": "marginal",
    "lo": 0.45,
    "n": 154,
    "fog_rate": 0.12
   },
   {
    "band": "poor",
    "lo": 0.0,
    "n": 285,
    "fog_rate": 0.08
   }
  ],
  "lead_skill": {
   "1": 0.746,
   "2": 0.726,
   "3": 0.738,
   "5": 0.627
  },
  "note": "Set-up score = the same factor blend the day-1 report uses, before calibration. It ranks mornings; it is not a probability. Day 1 is calibrated in the main report."
 },
 "history": [
  {
   "morning": "2026-10-16",
   "run_time": "2026-10-15T23:47-05:00",
   "kind": "evening",
   "fog_probability": 0.01,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "high",
   "observed_min_vis_mi": null,
   "observed_fog": null,
   "cams": [
    "2026-10-16-IL-IDOTD4-3011-N.jpg",
    "2026-10-16-IL-IDOTD4-3033-N.jpg",
    "2026-10-16-IL-IDOTD4-3077-E.jpg"
   ]
  },
  {
   "morning": "2026-10-16",
   "run_time": "2026-10-16T00:24-05:00",
   "kind": "predawn",
   "fog_probability": 0.01,
   "raw_blend": 0.049,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "high",
   "observed_min_vis_mi": null,
   "observed_fog": null,
   "cams": [
    "2026-10-16-IL-IDOTD4-3011-N.jpg",
    "2026-10-16-IL-IDOTD4-3033-N.jpg",
    "2026-10-16-IL-IDOTD4-3077-E.jpg"
   ]
  }
 ]
}