{
 "region": "grayslake",
 "region_name": "Grayslake / Lake County",
 "run_time": "2026-10-16T00:24-05:00",
 "morning": "2026-10-16",
 "sites": [
  {
   "id": "home",
   "name": "Grayslake (village center)",
   "lat": 42.3434,
   "lon": -88.0412,
   "features": [
    "lakes",
    "wetland",
    "golf"
   ],
   "drone_status": "unknown",
   "notes": "Village center from OpenStreetMap Nominatim (42.3433518, -88.0412192), fetched 16 Oct 2026",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.072,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:30.673506-05:00",
     "est_end": "2026-10-16 07:51:30.673506-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.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 59 % with visibility 16 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": {
     "delta_c": 8.7,
     "likely": false,
     "why": "river water +8.7 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 12 kt)",
     "gauge": "FOX RIVER NEAR MCHENRY, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.0999999999999996,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 11.600000000000001,
       "wind_after": 11.0,
       "gust_max": 29.0,
       "cloud_mh_night": 29.181818181818183,
       "cloud_low_night": 84.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15700.0,
       "low_sunrise": 59.0,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.4,
       "t_key": 9.3,
       "cooling": 6.1,
       "t_min_night": 9.3,
       "td_afternoon": 13.8,
       "crossover": -4.5,
       "td_drop": 6.700000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.6,
         "RH": 97,
         "wind": 7.3,
         "low": 100,
         "mid": 15,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.3,
         "RH": 91,
         "wind": 11.6,
         "low": 100,
         "mid": 24,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.8,
         "RH": 90,
         "wind": 11.5,
         "low": 100,
         "mid": 82,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.5,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.2,
         "low": 90,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 10.3,
         "RH": 87,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "03:00",
         "T": 11.6,
         "Td": 9.2,
         "RH": 85,
         "wind": 14.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "04:00",
         "T": 10.9,
         "Td": 8.5,
         "RH": 85,
         "wind": 13.8,
         "low": 59,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.3,
         "RH": 87,
         "wind": 11.4,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.6,
         "RH": 85,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 7.1,
         "RH": 86,
         "wind": 9.3,
         "low": 18,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "08:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.2,
         "RH": 86,
         "wind": 10.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 7.3,
         "RH": 82,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17900.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 6.9,
         "RH": 83,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16800.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \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.88,
        "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 = 6.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.5 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 84 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 0.9000000000000004,
       "rh_max": 98,
       "wind_mean": 12.25,
       "wind_after": 11.8,
       "gust_max": 21.8,
       "cloud_mh_night": 89.72727272727273,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 71.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.1,
       "t_key": 7.9,
       "cooling": 9.200000000000001,
       "t_min_night": 7.9,
       "td_afternoon": 15.8,
       "crossover": -7.9,
       "td_drop": 8.8,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 9.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 13.7,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.3,
         "Td": 12.3,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 10.9,
         "RH": 98,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.1,
         "Td": 9.6,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.9,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.5,
         "Td": 8.2,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 7.6,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.9,
         "Td": 7.0,
         "RH": 94,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.0,
         "Td": 7.4,
         "RH": 96,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 8.5,
         "RH": 91,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 9.1,
         "RH": 91,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 9.4,
         "RH": 88,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \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.2 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 = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 7.9 \u00b0C vs afternoon dewpoint 15.8 \u00b0C \u2192 -7.9 \u00b0C; rain last 48 h = 17.5 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.3,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.3,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.75,
       "crossover": -4.65,
       "td_drop": 7.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.6,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 11.4,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 5.4,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.6,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 6.4,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3434&longitude=-88.0412&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=42.3434&longitude=-88.0412&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:03+00:00",
     "elevation_m": 241.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3434&longitude=-88.0412&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:03+00:00",
     "elevation_m": 241.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3434&longitude=-88.0412&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:03+00:00",
     "elevation_m": 241.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3434&longitude=-88.0412&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:03+00:00",
     "elevation_m": 241.0
    }
   },
   "water_temp_c": 18.0,
   "dawn_temp_c": 9.3,
   "dawn_wind_kt": 9.3
  },
  {
   "id": "brae-loch-golf-club",
   "name": "Brae Loch Golf Club",
   "lat": 42.3491284,
   "lon": -88.0092054,
   "agency": "Lake County Forest Preserves (golf course)",
   "agency_url": "https://www.braelochgolfclub.org/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "LCFP Regulations Governing the General Use of District Property (approved Jan 14 2020, amended Jan 17 2024), Sec. III.A: \"No person shall use District Property for any of the following uses, unless the person has first obtained, and has physical possession of, a Permit allowing such use\"; item (v): \"use of any fuel-powered, air-propulsion, electric powered, radio-controlled, or cellular-controlled unmanned aerial Vehicle (commonly referred to as a \\\"drone\\\"), model or toy car, aircraft, boat or rocket, or any similar toy or model\"; item (xx): \"taking any still or motion pictures ... for commercial purposes or for use in commercial advertising\". LCFP's fee ordinance lists a 'Commercial Photography, Film or Video Permit'. Read from a Wayback copy (2024-02-25) because lcfpd.org returns a Cloudflare 403 to scripted fetches. No drone-specific permit procedure found; the model-aircraft page (archived 2026-02-15) offers only the Van Patten Woods field. A 2014 staff memo, seen only as a search-result excerpt, said drones may not launch or land elsewhere in the preserves.",
   "drone_rule_url": "https://www.lcfpd.org/file.aspx?DocumentId=9028",
   "drone_status": "permit",
   "features": [
    "pond",
    "mature trees",
    "gentle rolling terrain",
    "golf"
   ],
   "features_source": "Course page: \"18-hole, par-70 course with mature trees and sweeping vistas ... subtle rolling terrain\"; OSM: 5 natural=water polygons inside the course polygon (way 61431783). USGS 3DEP: site 792 ft, 1.5 km ring 772-841 ft. Coordinates: Nominatim 'Brae Loch Golf Course' (OSM way 61431783).",
   "drive_minutes_est": 8,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.7 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 3.3 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. Closest golf course to KUGN's boundary after Bittersweet/Heather Ridge/Merit.",
   "notes": "OWNERSHIP CORRECTION: the ticket listed Brae Loch under Lake County Forest Preserves and the course site confirms it (header 'Lake County Forest Preserves'; FAQ says 'all three Lake County Forest Preserves courses'). That makes it District Property, so the LCFP drone-permit rule applies on top of any owner consent. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.072,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:23.366623-05:00",
     "est_end": "2026-10-16 07:51:23.366623-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 61 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.3,
       "rh_max": 87,
       "wind_mean": 11.725,
       "wind_after": 11.1,
       "gust_max": 29.7,
       "cloud_mh_night": 28.09090909090909,
       "cloud_low_night": 86.27272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15800.0,
       "low_sunrise": 61.0,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 13.8,
       "crossover": -4.300000000000001,
       "td_drop": 6.6000000000000005,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.599999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.3,
         "Td": 15.8,
         "RH": 97,
         "wind": 7.9,
         "low": 100,
         "mid": 13,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 14.4,
         "RH": 91,
         "wind": 11.9,
         "low": 100,
         "mid": 33,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.6,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.7,
         "low": 100,
         "mid": 63,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.6,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 10.0,
         "RH": 86,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.6,
         "RH": 87,
         "wind": 14.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.5,
         "RH": 85,
         "wind": 13.8,
         "low": 54,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 11.4,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 7.9,
         "RH": 86,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.2,
         "RH": 86,
         "wind": 9.5,
         "low": 22,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "08:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 11.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 7.3,
         "RH": 86,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 11.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17800.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.06,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.7 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 = 28 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.3 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 86 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.3000000000000007,
       "dpd_key": 1.1000000000000005,
       "rh_max": 98,
       "wind_mean": 12.4,
       "wind_after": 12.149999999999999,
       "gust_max": 21.4,
       "cloud_mh_night": 90.45454545454545,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 72.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": 16.9,
       "t_key": 8.3,
       "cooling": 8.599999999999998,
       "t_min_night": 8.3,
       "td_afternoon": 15.35,
       "crossover": -7.049999999999999,
       "td_drop": 8.149999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.4,
         "Td": 15.4,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 13.9,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 12.3,
         "RH": 99,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 10.8,
         "RH": 97,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.4,
         "Td": 9.7,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.4,
         "Td": 9.1,
         "RH": 98,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.8,
         "Td": 8.3,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.5,
         "Td": 7.9,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.3,
         "Td": 7.2,
         "RH": 93,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.3,
         "RH": 93,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 8.4,
         "RH": 89,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 8.8,
         "RH": 88,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 9.0,
         "RH": 85,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 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 = 8.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.3 \u00b0C vs afternoon dewpoint 15.3 \u00b0C \u2192 -7.0 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.3,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.3,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.7,
       "crossover": -4.6,
       "td_drop": 7.799999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.2999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.6,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 11.4,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.2,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 5.4,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.6,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 6.4,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3491284&longitude=-88.0092054&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=42.3491284&longitude=-88.0092054&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:03+00:00",
     "elevation_m": 243.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3491284&longitude=-88.0092054&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:03+00:00",
     "elevation_m": 243.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3491284&longitude=-88.0092054&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:03+00:00",
     "elevation_m": 243.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3491284&longitude=-88.0092054&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:03+00:00",
     "elevation_m": 243.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.5,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "grayslake-golf-course",
   "name": "Grayslake Golf Course",
   "lat": 42.3755949,
   "lon": -88.0345872,
   "agency": "Grayslake Community Park District",
   "agency_url": "https://www.grayslakegolfcourse.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. Policies page (grayslakegolfcourse.com/policies) covers carts, minors and errant balls only. 620 ILCS 5/42.1(b-5) (per ticket C research) lets a local government adopt reasonable rules over its own recreation land; none located. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "wetland",
    "pond",
    "golf"
   ],
   "features_source": "Site: \"9-hole par 3 golf course ... The Grayslake Golf Course is a public course operated by the Grayslake Community Park District.\" OSM: 1-2 natural=wetland polygons and 1 water polygon within 350 m of the point. USGS 3DEP: 783 ft, ring 760-795 ft (flat). Coordinates: Nominatim street-level result for '2150 Drury Lane' (OSM way 21827148, the road); two directory sites (golfn.com, golfscout.net) give 42.3778,-88.0343, about 0.25 km north.",
   "drive_minutes_est": 7,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.9 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 3.5 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Course is not mapped as a golf_course polygon in OSM, so the coordinate is the road geocode. The only 'protected wetlands' claim is from a search summary of GolfAdvisor, not used. Walking-only course, 1,200 yards, address 2150 Drury Lane 60030. Same street name as Rollins Savanna's Drury Lane lot (Visit Lake County page); adjacency not verified. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.072,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:31.210631-05:00",
     "est_end": "2026-10-16 07:51:31.210631-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 62 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 11.75,
       "wind_after": 11.05,
       "gust_max": 29.5,
       "cloud_mh_night": 29.636363636363637,
       "cloud_low_night": 86.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 61.5,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.3,
       "cooling": 6.0,
       "t_min_night": 9.3,
       "td_afternoon": 13.7,
       "crossover": -4.399999999999999,
       "td_drop": 6.799999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.8,
         "Td": 15.3,
         "RH": 97,
         "wind": 7.1,
         "low": 100,
         "mid": 14,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.3,
         "RH": 91,
         "wind": 11.7,
         "low": 100,
         "mid": 28,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.7,
         "low": 100,
         "mid": 84,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.5,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.9,
         "low": 72,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.6,
         "RH": 87,
         "wind": 14.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.5,
         "RH": 85,
         "wind": 13.8,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 11.6,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 7.7,
         "RH": 85,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 6.9,
         "RH": 85,
         "wind": 9.5,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.5,
         "RH": 87,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.4,
         "RH": 82,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.06,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.87,
        "why": "overnight mid+high levels cloud = 30 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 0.8999999999999995,
       "rh_max": 98,
       "wind_mean": 12.25,
       "wind_after": 12.0,
       "gust_max": 21.4,
       "cloud_mh_night": 89.63636363636364,
       "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": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.0,
       "t_key": 8.1,
       "cooling": 8.9,
       "t_min_night": 8.1,
       "td_afternoon": 15.65,
       "crossover": -7.550000000000001,
       "td_drop": 8.45,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.4,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 11.0,
         "RH": 97,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.3,
         "Td": 9.9,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 9.0,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 8.4,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.3,
         "Td": 7.7,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.1,
         "Td": 7.2,
         "RH": 94,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.1,
         "Td": 7.5,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 8.5,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 9.1,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 9.4,
         "RH": 87,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \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.2 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 = 8.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.1 \u00b0C vs afternoon dewpoint 15.7 \u00b0C \u2192 -7.6 \u00b0C; rain last 48 h = 17.5 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.0,
       "rh_max": 80,
       "wind_mean": 11.6,
       "wind_after": 12.2,
       "gust_max": 29.0,
       "cloud_mh_night": 26.0,
       "cloud_low_night": 74.18181818181819,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 100.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.6,
       "t_key": 10.4,
       "cooling": 5.199999999999999,
       "t_min_night": 10.0,
       "td_afternoon": 14.75,
       "crossover": -4.75,
       "td_drop": 8.35,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.2000000000000455,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.8,
         "Td": 16.5,
         "RH": 98,
         "wind": 7.6,
         "low": 100,
         "mid": 53,
         "high": 46,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 16.4,
         "RH": 98,
         "wind": 10.7,
         "low": 100,
         "mid": 30,
         "high": 64,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 15.0,
         "RH": 96,
         "wind": 12.7,
         "low": 91,
         "mid": 16,
         "high": 50,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.1,
         "Td": 12.9,
         "RH": 92,
         "wind": 14.1,
         "low": 79,
         "mid": 6,
         "high": 21,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.7,
         "Td": 11.0,
         "RH": 89,
         "wind": 14.9,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.7,
         "Td": 9.4,
         "RH": 86,
         "wind": 14.6,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 8.0,
         "RH": 83,
         "wind": 13.7,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.1,
         "Td": 6.8,
         "RH": 80,
         "wind": 12.6,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 6.4,
         "RH": 78,
         "wind": 11.8,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.4,
         "RH": 77,
         "wind": 11.1,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 6.4,
         "RH": 76,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 6.1,
         "RH": 74,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.6,
         "RH": 71,
         "wind": 12.8,
         "low": 94,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 13.6,
         "low": 86,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 13.8,
         "low": 81,
         "mid": 27,
         "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.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.92,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.0 \u00b0C vs afternoon dewpoint 14.8 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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 = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.07
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.3,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.75,
       "crossover": -4.65,
       "td_drop": 7.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.6,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 11.4,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 5.4,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.6,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 6.4,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.7,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3755949&longitude=-88.0345872&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=42.3755949&longitude=-88.0345872&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:03+00:00",
     "elevation_m": 241.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3755949&longitude=-88.0345872&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:03+00:00",
     "elevation_m": 241.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3755949&longitude=-88.0345872&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:03+00:00",
     "elevation_m": 241.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3755949&longitude=-88.0345872&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:03+00:00",
     "elevation_m": 241.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.3,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "renwood-golf-course",
   "name": "Renwood Golf Course",
   "lat": 42.3707862,
   "lon": -88.0644949,
   "agency": "Round Lake Area Park District",
   "agency_url": "https://www.renwoodgolf.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. 620 ILCS 5/42.1(b-5) (per ticket C research) lets a local government adopt reasonable rules over its own recreation land; none located. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "stream",
    "golf"
   ],
   "features_source": "Site: \"a public 18-hole golf course operated by the Round Lake Area Park District\". OSM: 12 natural=water polygons and 1 stream inside the course polygon (way 61948902). USGS 3DEP: 781 ft, ring 762-832 ft. Coordinates: Nominatim 'Renwood Golf Course' (way 61948902).",
   "drive_minutes_est": 7,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 5.3 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 4.9 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Round Lake Beach mailing address, touches the west edge of Grayslake. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.074,
    "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.2 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:38.076684-05:00",
     "est_end": "2026-10-16 07:51:38.076684-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 62 % with visibility 16 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.1999999999999993,
       "dpd_key": 2.4000000000000004,
       "rh_max": 86,
       "wind_mean": 11.525,
       "wind_after": 10.95,
       "gust_max": 29.2,
       "cloud_mh_night": 31.90909090909091,
       "cloud_low_night": 85.54545454545455,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15800.0,
       "low_sunrise": 61.5,
       "vis_min": 15500.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.4,
       "t_key": 9.4,
       "cooling": 6.0,
       "t_min_night": 9.4,
       "td_afternoon": 13.85,
       "crossover": -4.449999999999999,
       "td_drop": 6.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.8,
         "Td": 15.2,
         "RH": 96,
         "wind": 6.6,
         "low": 100,
         "mid": 16,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.3,
         "RH": 91,
         "wind": 11.7,
         "low": 100,
         "mid": 35,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "00:00",
         "T": 13.5,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.4,
         "RH": 86,
         "wind": 14.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.6,
         "RH": 85,
         "wind": 13.7,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.7,
         "Td": 8.5,
         "RH": 86,
         "wind": 11.4,
         "low": 72,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 7.6,
         "RH": 84,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 7.0,
         "RH": 85,
         "wind": 9.1,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 7.5,
         "RH": 86,
         "wind": 11.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 7.3,
         "RH": 86,
         "wind": 10.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18200.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.1,
         "RH": 83,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.35,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.2 \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.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.84,
        "why": "overnight mid+high levels cloud = 32 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.4 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 6.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 = 15.5 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 86 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.051
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.1999999999999993,
       "dpd_key": 0.7999999999999998,
       "rh_max": 99,
       "wind_mean": 12.1,
       "wind_after": 11.8,
       "gust_max": 21.6,
       "cloud_mh_night": 88.9090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 69.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 16.9,
       "t_key": 7.8,
       "cooling": 9.099999999999998,
       "t_min_night": 7.8,
       "td_afternoon": 15.45,
       "crossover": -7.6499999999999995,
       "td_drop": 8.45,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 5.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 16.6,
         "RH": 100,
         "wind": 7.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.2,
         "Td": 15.2,
         "RH": 100,
         "wind": 9.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 13.7,
         "RH": 100,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.3,
         "Td": 12.3,
         "RH": 100,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.1,
         "Td": 10.8,
         "RH": 98,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.0,
         "Td": 9.7,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.1,
         "Td": 8.9,
         "RH": 99,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.5,
         "Td": 8.3,
         "RH": 99,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.1,
         "Td": 7.6,
         "RH": 97,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.8,
         "Td": 7.0,
         "RH": 95,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.1,
         "Td": 7.3,
         "RH": 95,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 8.4,
         "RH": 90,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 9.0,
         "RH": 90,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 9.3,
         "RH": 87,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.2 \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.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (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.4,
        "why": "crossover: forecast night minimum 7.8 \u00b0C vs afternoon dewpoint 15.4 \u00b0C \u2192 -7.6 \u00b0C; rain last 48 h = 23.1 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.109
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.5,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.4,
       "cooling": 5.799999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.0,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.0,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.7,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.9,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 7.2,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 23.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 has no visibility field; max RH before sunrise = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.8,
       "dpd_key": 3.5999999999999996,
       "rh_max": 83,
       "wind_mean": 12.95,
       "wind_after": 12.6,
       "gust_max": 27.0,
       "cloud_mh_night": 60.09090909090909,
       "cloud_low_night": 80.63636363636364,
       "cloud_mh_sunrise": 24.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 59.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.0,
       "t_key": 9.6,
       "cooling": 5.4,
       "t_min_night": 9.3,
       "td_afternoon": 13.7,
       "crossover": -4.399999999999999,
       "td_drop": 7.699999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.4,
         "low": 100,
         "mid": 83,
         "high": 66,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.3,
         "Td": 14.6,
         "RH": 90,
         "wind": 11.1,
         "low": 100,
         "mid": 100,
         "high": 92,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 12.4,
         "RH": 83,
         "wind": 14.2,
         "low": 100,
         "mid": 93,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.5,
         "Td": 11.2,
         "RH": 81,
         "wind": 14.7,
         "low": 100,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.2,
         "Td": 9.3,
         "RH": 77,
         "wind": 13.0,
         "low": 79,
         "mid": 62,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 8.1,
         "RH": 76,
         "wind": 14.8,
         "low": 100,
         "mid": 12,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 7.0,
         "RH": 76,
         "wind": 14.2,
         "low": 67,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.0,
         "Td": 5.6,
         "RH": 74,
         "wind": 13.4,
         "low": 41,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.3,
         "Td": 6.3,
         "RH": 82,
         "wind": 13.3,
         "low": 57,
         "mid": 0,
         "high": 71,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.5,
         "Td": 6.7,
         "RH": 83,
         "wind": 13.1,
         "low": 80,
         "mid": 31,
         "high": 77,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 6.0,
         "RH": 78,
         "wind": 12.0,
         "low": 63,
         "mid": 21,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 6.3,
         "RH": 77,
         "wind": 13.0,
         "low": 56,
         "mid": 28,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.4,
         "RH": 75,
         "wind": 12.2,
         "low": 83,
         "mid": 14,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.2,
         "Td": 6.1,
         "RH": 71,
         "wind": 12.1,
         "low": 99,
         "mid": 43,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 5.9,
         "RH": 68,
         "wind": 14.7,
         "low": 98,
         "mid": 37,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 7.7 \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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 81 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.035
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 23.1,
    "soil_moisture_top": 0.299,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3707862&longitude=-88.0644949&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=42.3707862&longitude=-88.0644949&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:03+00:00",
     "elevation_m": 237.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3707862&longitude=-88.0644949&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:03+00:00",
     "elevation_m": 237.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3707862&longitude=-88.0644949&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:03+00:00",
     "elevation_m": 237.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3707862&longitude=-88.0644949&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:03+00:00",
     "elevation_m": 237.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.4,
   "dawn_wind_kt": 9.1
  },
  {
   "id": "village-green-country-club",
   "name": "Village Green Country Club",
   "lat": 42.2984329,
   "lon": -88.0185856,
   "agency": "Unverified (directory listings say public; one says run by GolfVisions)",
   "agency_url": null,
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. Official site not reached (villagegreencc.com failed to connect).",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "golf"
   ],
   "features_source": "OSM: 4 natural=water polygons inside the course polygon (way 196052496). USGS 3DEP: 813 ft, ring 765-839 ft. Coordinates: Nominatim 'Village Green Country Club' (way 1162839820, 2501 N Midlothian Rd, Mundelein).",
   "drive_minutes_est": 8,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 6.0 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 5.5 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Public status comes only from search-result summaries of GolfPass/OpenGolfAPI, not an official page. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.07,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:22.276560-05:00",
     "est_end": "2026-10-16 07:51:22.276560-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 65 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.2,
       "rh_max": 87,
       "wind_mean": 13.125,
       "wind_after": 12.3,
       "gust_max": 30.1,
       "cloud_mh_night": 25.272727272727273,
       "cloud_low_night": 88.36363636363636,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 65.0,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 13.9,
       "crossover": -4.4,
       "td_drop": 6.6000000000000005,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 16.5,
         "RH": 97,
         "wind": 8.7,
         "low": 100,
         "mid": 12,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 14.6,
         "RH": 92,
         "wind": 12.6,
         "low": 100,
         "mid": 29,
         "high": 0,
         "vis": 13600.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 12.9,
         "low": 100,
         "mid": 37,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.5,
         "Td": 11.8,
         "RH": 89,
         "wind": 13.7,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 10.8,
         "RH": 87,
         "wind": 15.1,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 10.6,
         "RH": 89,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "03:00",
         "T": 11.6,
         "Td": 9.3,
         "RH": 86,
         "wind": 16.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "04:00",
         "T": 10.9,
         "Td": 8.7,
         "RH": 86,
         "wind": 15.4,
         "low": 77,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 13.1,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.8,
         "RH": 86,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.3,
         "RH": 86,
         "wind": 10.6,
         "low": 30,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.2,
         "RH": 86,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 7.6,
         "RH": 84,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "11:00",
         "T": 9.6,
         "Td": 7.1,
         "RH": 84,
         "wind": 12.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.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 = 13.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 25 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 6.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.4 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 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.052
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.5,
       "dpd_key": 1.0999999999999996,
       "rh_max": 97,
       "wind_mean": 13.2,
       "wind_after": 12.7,
       "gust_max": 21.6,
       "cloud_mh_night": 90.0,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 70.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": 17.2,
       "t_key": 8.0,
       "cooling": 9.2,
       "t_min_night": 8.0,
       "td_afternoon": 15.45,
       "crossover": -7.449999999999999,
       "td_drop": 8.549999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 6.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 8.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.4,
         "Td": 15.4,
         "RH": 100,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.2,
         "RH": 99,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 10.6,
         "RH": 96,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.2,
         "Td": 9.6,
         "RH": 96,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.7,
         "RH": 97,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.6,
         "Td": 8.1,
         "RH": 97,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 7.6,
         "RH": 96,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.0,
         "Td": 6.9,
         "RH": 93,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 7.1,
         "RH": 93,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 8.4,
         "RH": 89,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 8.7,
         "RH": 88,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 9.0,
         "RH": 86,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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.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 = 9.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.0 \u00b0C vs afternoon dewpoint 15.4 \u00b0C \u2192 -7.4 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 8.5 \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.106
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.1,
       "t_key": 10.3,
       "cooling": 5.800000000000001,
       "t_min_night": 10.1,
       "td_afternoon": 15.0,
       "crossover": -4.9,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.7,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.3,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.1,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.9,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.3,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 10.1 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.9 \u00b0C; rain last 48 h = 12.3 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.072
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.8,
       "dpd_key": 3.3999999999999995,
       "rh_max": 83,
       "wind_mean": 11.9,
       "wind_after": 11.149999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 60.18181818181818,
       "cloud_low_night": 81.81818181818181,
       "cloud_mh_sunrise": 44.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 66.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.4,
       "t_key": 9.2,
       "cooling": 6.200000000000001,
       "t_min_night": 9.0,
       "td_afternoon": 13.75,
       "crossover": -4.75,
       "td_drop": 7.95,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.300000000000068,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 15.8,
         "RH": 95,
         "wind": 8.3,
         "low": 100,
         "mid": 87,
         "high": 57,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 15.1,
         "RH": 90,
         "wind": 10.0,
         "low": 100,
         "mid": 100,
         "high": 32,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 13.2,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.3,
         "RH": 80,
         "wind": 12.9,
         "low": 98,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.5,
         "Td": 9.1,
         "RH": 75,
         "wind": 12.6,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 7.9,
         "RH": 74,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 6.8,
         "RH": 74,
         "wind": 13.5,
         "low": 75,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 5.4,
         "RH": 72,
         "wind": 12.0,
         "low": 34,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.0,
         "Td": 5.7,
         "RH": 80,
         "wind": 12.0,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 6.3,
         "RH": 83,
         "wind": 12.2,
         "low": 74,
         "mid": 24,
         "high": 93,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 5.8,
         "RH": 79,
         "wind": 11.4,
         "low": 66,
         "mid": 31,
         "high": 22,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 5.5,
         "RH": 75,
         "wind": 11.2,
         "low": 66,
         "mid": 32,
         "high": 4,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.4,
         "Td": 6.4,
         "RH": 76,
         "wind": 11.1,
         "low": 59,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.2,
         "low": 100,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 12.3,
         "Td": 5.7,
         "RH": 64,
         "wind": 14.5,
         "low": 92,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.0 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 82 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.3,
    "soil_moisture_top": 0.34,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2984329&longitude=-88.0185856&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=42.2984329&longitude=-88.0185856&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:03+00:00",
     "elevation_m": 247.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2984329&longitude=-88.0185856&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:03+00:00",
     "elevation_m": 247.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2984329&longitude=-88.0185856&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:03+00:00",
     "elevation_m": 247.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2984329&longitude=-88.0185856&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:03+00:00",
     "elevation_m": 247.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.5,
   "dawn_wind_kt": 10.6
  },
  {
   "id": "bittersweet-golf-club",
   "name": "Bittersweet Golf Club",
   "lat": 42.3722842,
   "lon": -87.9799696,
   "agency": "Village of Gurnee",
   "agency_url": "https://www.bittersweetgolf.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. 620 ILCS 5/42.1(b-5) (per ticket C research) lets a local government adopt reasonable rules over its own recreation land; none located. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "wetland",
    "golf"
   ],
   "features_source": "Site: \"an 18-hole championship course owned by the Village of Gurnee\". OSM: 17 natural=water and 2 natural=wetland polygons inside the course (relation 4087152). USGS 3DEP: 761 ft, ring 741-798 ft. Coordinates: Nominatim 'Bittersweet Golf Club' (relation 4087152).",
   "drive_minutes_est": 11,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 1.8 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 1.5 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. CLOSEST to KUGN of the golf courses: 1.8 nm from the Class D edge at the geocoded point; the course is large, so check the actual launch point.",
   "notes": "Most water of any course in OSM (17 polygons). Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.072,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:17.873132-05:00",
     "est_end": "2026-10-16 07:51:17.873132-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 62 % with visibility 16 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.1000000000000014,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 12.025,
       "wind_after": 11.05,
       "gust_max": 29.9,
       "cloud_mh_night": 30.727272727272727,
       "cloud_low_night": 87.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16100.0,
       "low_sunrise": 61.5,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 13.75,
       "crossover": -4.25,
       "td_drop": 6.65,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.5,
         "RH": 97,
         "wind": 7.7,
         "low": 100,
         "mid": 10,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 14.3,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "23:00",
         "T": 14.7,
         "Td": 13.0,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 89,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 11.8,
         "RH": 88,
         "wind": 12.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 11.0,
         "RH": 87,
         "wind": 13.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 12.0,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.8,
         "Td": 10.0,
         "RH": 89,
         "wind": 13.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 8.6,
         "RH": 84,
         "wind": 13.9,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "05:00",
         "T": 10.8,
         "Td": 8.7,
         "RH": 87,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 7.9,
         "RH": 85,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.1,
         "RH": 85,
         "wind": 10.0,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.6,
         "RH": 86,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 11.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 11.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17700.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \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.86,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.2 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.4 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.052
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 0.8999999999999995,
       "rh_max": 98,
       "wind_mean": 12.4,
       "wind_after": 12.3,
       "gust_max": 21.2,
       "cloud_mh_night": 90.0,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 72.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 16.8,
       "t_key": 8.1,
       "cooling": 8.700000000000001,
       "t_min_night": 8.1,
       "td_afternoon": 15.55,
       "crossover": -7.450000000000001,
       "td_drop": 8.350000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.4,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 10.8,
         "RH": 97,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.2,
         "Td": 9.8,
         "RH": 97,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.9,
         "RH": 98,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 8.4,
         "RH": 98,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.4,
         "Td": 7.8,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.1,
         "Td": 7.2,
         "RH": 94,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.3,
         "Td": 7.4,
         "RH": 94,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 8.5,
         "RH": 89,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 8.9,
         "RH": 88,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 9.2,
         "RH": 85,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 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 = 8.7 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.1 \u00b0C vs afternoon dewpoint 15.6 \u00b0C \u2192 -7.5 \u00b0C; rain last 48 h = 17.5 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.3,
       "t_key": 10.4,
       "cooling": 5.9,
       "t_min_night": 10.3,
       "td_afternoon": 15.100000000000001,
       "crossover": -4.800000000000001,
       "td_drop": 9.100000000000001,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.0,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.0,
         "Td": 17.7,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.7,
         "Td": 16.1,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.9,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 8.3,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 7.2,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.3,
         "Td": 6.6,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.3,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 6.0,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.7,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 5.7,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 15.1 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.4,
       "cooling": 5.799999999999999,
       "t_min_night": 9.2,
       "td_afternoon": 13.8,
       "crossover": -4.600000000000001,
       "td_drop": 7.800000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.5,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.9,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.5,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.5,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 8.1,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.5,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.2,
         "Td": 5.7,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.5,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 6.0,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 6.7,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.1,
         "Td": 5.8,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 5.7,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3722842&longitude=-87.9799696&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=42.3722842&longitude=-87.9799696&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:03+00:00",
     "elevation_m": 231.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3722842&longitude=-87.9799696&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:03+00:00",
     "elevation_m": 231.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3722842&longitude=-87.9799696&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:03+00:00",
     "elevation_m": 231.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3722842&longitude=-87.9799696&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:03+00:00",
     "elevation_m": 231.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.5,
   "dawn_wind_kt": 10.0
  },
  {
   "id": "heather-ridge-golf-course",
   "name": "HeatherRidge Golf Course",
   "lat": 42.3484035,
   "lon": -87.9524143,
   "agency": "Unverified (listings say public, managed by GolfVisions)",
   "agency_url": null,
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. OSM-listed site heatherridgegolf.com served an unrelated spam page on 2026-10-16.",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "stream",
    "golf"
   ],
   "features_source": "OSM: 4 natural=water polygons and 10 stream ways inside the course polygon (way 296130363). USGS 3DEP: 685 ft, ring 654-753 ft. Coordinates: Nominatim 'Heather Ridge Golf Course' (way 296130363, 5900 Heather Ridge Dr, Gurnee).",
   "drive_minutes_est": 12,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 1.8 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 1.4 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. Edge of KUGN Class D at about 1.8 nm; re-check at launch point.",
   "notes": "Operating status and management from search-result summaries (GolfNow, Visit Lake County), no official page reached. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.073,
    "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.2 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:09.677900-05:00",
     "est_end": "2026-10-16 07:51:09.677900-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 66 % with visibility 16 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.200000000000001,
       "dpd_key": 2.5999999999999996,
       "rh_max": 86,
       "wind_mean": 11.65,
       "wind_after": 10.6,
       "gust_max": 30.3,
       "cloud_mh_night": 30.727272727272727,
       "cloud_low_night": 87.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16400.0,
       "low_sunrise": 65.5,
       "vis_min": 15600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.7,
       "cooling": 5.600000000000001,
       "t_min_night": 9.7,
       "td_afternoon": 13.6,
       "crossover": -3.9000000000000004,
       "td_drop": 6.5,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.7000000000000455,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 7.8,
         "low": 100,
         "mid": 4,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 16.1,
         "Td": 14.5,
         "RH": 90,
         "wind": 11.2,
         "low": 100,
         "mid": 72,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "23:00",
         "T": 14.8,
         "Td": 13.1,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 62,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 11.8,
         "RH": 87,
         "wind": 12.2,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "01:00",
         "T": 13.3,
         "Td": 11.0,
         "RH": 86,
         "wind": 13.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 10.0,
         "RH": 85,
         "wind": 12.0,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "03:00",
         "T": 11.9,
         "Td": 10.1,
         "RH": 89,
         "wind": 13.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "04:00",
         "T": 11.4,
         "Td": 8.8,
         "RH": 84,
         "wind": 13.7,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "05:00",
         "T": 10.8,
         "Td": 8.6,
         "RH": 86,
         "wind": 11.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "06:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 9.5,
         "low": 31,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.7,
         "RH": 86,
         "wind": 10.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 7.6,
         "RH": 86,
         "wind": 11.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 10.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17600.0
        },
        {
         "t": "11:00",
         "T": 10.1,
         "Td": 7.3,
         "RH": 83,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.35,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.2 \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.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.86,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -3.9 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.5 \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.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.051
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 1.0,
       "rh_max": 98,
       "wind_mean": 12.05,
       "wind_after": 12.0,
       "gust_max": 21.2,
       "cloud_mh_night": 89.72727272727273,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 72.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 16.9,
       "t_key": 8.1,
       "cooling": 8.799999999999999,
       "t_min_night": 8.1,
       "td_afternoon": 15.950000000000001,
       "crossover": -7.850000000000001,
       "td_drop": 8.850000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 5.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 7.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 9.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.4,
         "RH": 100,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 10.9,
         "RH": 98,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.2,
         "Td": 9.8,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 9.0,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 8.4,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.3,
         "Td": 7.9,
         "RH": 97,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.1,
         "Td": 7.1,
         "RH": 93,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.8,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 8.8,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 9.3,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 9.7,
         "RH": 87,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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.1 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 = 8.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.1 \u00b0C vs afternoon dewpoint 16.0 \u00b0C \u2192 -7.9 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.109
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.4,
       "t_key": 10.5,
       "cooling": 5.899999999999999,
       "t_min_night": 10.4,
       "td_afternoon": 15.2,
       "crossover": -4.799999999999999,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.1,
         "Td": 18.0,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.1,
         "Td": 17.8,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.8,
         "Td": 16.2,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 13.5,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 11.4,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 9.8,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 8.4,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 7.3,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 6.7,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.4,
         "Td": 6.4,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.5,
         "Td": 6.1,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 5.8,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 5.6,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 5.8,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.4 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.700000000000001,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.3,
       "td_afternoon": 13.95,
       "crossover": -4.649999999999999,
       "td_drop": 7.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.2,
         "Td": 15.6,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 15.0,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 12.8,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 11.6,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.6,
         "Td": 9.4,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.5,
         "Td": 8.2,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 7.2,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.3,
         "Td": 5.8,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 6.6,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 6.1,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 6.1,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 6.8,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.2,
         "Td": 5.9,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.9,
         "Td": 5.8,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3484035&longitude=-87.9524143&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=42.3484035&longitude=-87.9524143&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:03+00:00",
     "elevation_m": 211.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3484035&longitude=-87.9524143&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:03+00:00",
     "elevation_m": 211.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3484035&longitude=-87.9524143&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:03+00:00",
     "elevation_m": 211.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3484035&longitude=-87.9524143&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:04+00:00",
     "elevation_m": 211.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.7,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "pine-meadow-golf-club",
   "name": "Pine Meadow Golf Club",
   "lat": 42.2901043,
   "lon": -87.9885937,
   "agency": "Unverified owner; site calls it \"An Illinois Top 10 public Course\"",
   "agency_url": "https://www.pinemeadowgc.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "wetland",
    "golf"
   ],
   "features_source": "OSM: 4 natural=water and 1 natural=wetland polygons inside the course (way 196052494). USGS 3DEP: 742 ft, ring 718-769 ft. Coordinates: Nominatim OSM lookup of way 196052494 (name search resolves to a Wisconsin course).",
   "drive_minutes_est": 13,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 5.6 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 5.0 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Mundelein/Libertyville line. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.07,
    "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.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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:14.523974-05:00",
     "est_end": "2026-10-16 07:51:14.523974-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.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 55 % with visibility 16 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.3000000000000007,
       "dpd_key": 2.3999999999999995,
       "rh_max": 86,
       "wind_mean": 12.375,
       "wind_after": 11.2,
       "gust_max": 30.3,
       "cloud_mh_night": 26.0,
       "cloud_low_night": 86.18181818181819,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16200.0,
       "low_sunrise": 55.0,
       "vis_min": 15600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.4,
       "t_key": 9.6,
       "cooling": 5.800000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 13.8,
       "crossover": -4.200000000000001,
       "td_drop": 6.6000000000000005,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.3,
         "Td": 16.8,
         "RH": 97,
         "wind": 7.5,
         "low": 100,
         "mid": 9,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 16.1,
         "Td": 14.6,
         "RH": 91,
         "wind": 11.5,
         "low": 100,
         "mid": 41,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 14.8,
         "Td": 13.0,
         "RH": 89,
         "wind": 12.3,
         "low": 100,
         "mid": 36,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 12.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 10.8,
         "RH": 86,
         "wind": 14.0,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "02:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "03:00",
         "T": 11.9,
         "Td": 9.6,
         "RH": 86,
         "wind": 15.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 8.8,
         "RH": 85,
         "wind": 14.6,
         "low": 70,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.2,
         "RH": 86,
         "wind": 12.1,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 7.8,
         "RH": 85,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.2,
         "RH": 85,
         "wind": 10.0,
         "low": 22,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.8,
         "RH": 87,
         "wind": 11.3,
         "low": 88,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.4,
         "RH": 86,
         "wind": 11.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 7.5,
         "RH": 83,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        },
        {
         "t": "11:00",
         "T": 9.9,
         "Td": 7.1,
         "RH": 83,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.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.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.92,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.2 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 6.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.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 86 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.05
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.40000000000000036,
       "dpd_key": 1.200000000000001,
       "rh_max": 97,
       "wind_mean": 12.4,
       "wind_after": 11.8,
       "gust_max": 21.8,
       "cloud_mh_night": 90.0909090909091,
       "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": 17.3,
       "t_key": 8.3,
       "cooling": 9.0,
       "t_min_night": 8.3,
       "td_afternoon": 15.600000000000001,
       "crossover": -7.300000000000001,
       "td_drop": 8.500000000000002,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.3,
         "Td": 17.3,
         "RH": 100,
         "wind": 6.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 17.2,
         "Td": 17.2,
         "RH": 100,
         "wind": 8.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 15.7,
         "RH": 100,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 14.2,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.8,
         "Td": 12.7,
         "RH": 99,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.6,
         "Td": 11.0,
         "RH": 96,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.5,
         "Td": 9.8,
         "RH": 95,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.6,
         "Td": 9.2,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.0,
         "Td": 8.6,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.6,
         "Td": 7.9,
         "RH": 95,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.3,
         "Td": 7.1,
         "RH": 92,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.3,
         "RH": 92,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 8.2,
         "RH": 88,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 8.6,
         "RH": 87,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 9.3,
         "RH": 86,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 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 = 9.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.3 \u00b0C vs afternoon dewpoint 15.6 \u00b0C \u2192 -7.3 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 8.5 \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.107
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.3,
       "t_key": 10.4,
       "cooling": 5.9,
       "t_min_night": 10.3,
       "td_afternoon": 15.100000000000001,
       "crossover": -4.800000000000001,
       "td_drop": 9.100000000000001,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.0,
         "Td": 17.9,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.0,
         "Td": 17.7,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.7,
         "Td": 16.1,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 13.5,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 11.3,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.9,
         "Td": 9.7,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 8.3,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 7.2,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.3,
         "Td": 6.6,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.3,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 6.0,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.7,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.5,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.5,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 5.7,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 15.1 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.3 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.072
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 11.9,
       "wind_after": 11.149999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 60.18181818181818,
       "cloud_low_night": 81.81818181818181,
       "cloud_mh_sunrise": 44.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 66.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 9.3,
       "cooling": 6.199999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.899999999999999,
       "crossover": -4.799999999999999,
       "td_drop": 7.999999999999998,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.7,
         "Td": 15.9,
         "RH": 95,
         "wind": 8.3,
         "low": 100,
         "mid": 87,
         "high": 57,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 15.2,
         "RH": 90,
         "wind": 10.0,
         "low": 100,
         "mid": 100,
         "high": 32,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 12.8,
         "RH": 82,
         "wind": 13.2,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 11.4,
         "RH": 80,
         "wind": 12.9,
         "low": 98,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.6,
         "Td": 9.2,
         "RH": 75,
         "wind": 12.6,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.5,
         "Td": 8.0,
         "RH": 74,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 6.9,
         "RH": 74,
         "wind": 13.5,
         "low": 75,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.5,
         "RH": 72,
         "wind": 12.0,
         "low": 34,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.8,
         "RH": 80,
         "wind": 12.0,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.5,
         "RH": 83,
         "wind": 12.2,
         "low": 74,
         "mid": 24,
         "high": 93,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 5.9,
         "RH": 79,
         "wind": 11.4,
         "low": 66,
         "mid": 31,
         "high": 22,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.7,
         "RH": 75,
         "wind": 11.2,
         "low": 66,
         "mid": 32,
         "high": 4,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.5,
         "Td": 6.5,
         "RH": 76,
         "wind": 11.1,
         "low": 59,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.2,
         "Td": 5.7,
         "RH": 69,
         "wind": 12.2,
         "low": 100,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 12.4,
         "Td": 5.8,
         "RH": 64,
         "wind": 14.5,
         "low": 92,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 82 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.3,
    "soil_moisture_top": 0.34,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2901043&longitude=-87.9885937&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=42.2901043&longitude=-87.9885937&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:04+00:00",
     "elevation_m": 225.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2901043&longitude=-87.9885937&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:04+00:00",
     "elevation_m": 225.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2901043&longitude=-87.9885937&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:04+00:00",
     "elevation_m": 225.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2901043&longitude=-87.9885937&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:04+00:00",
     "elevation_m": 225.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.6,
   "dawn_wind_kt": 10.0
  },
  {
   "id": "ivanhoe-club",
   "name": "Ivanhoe Club",
   "lat": 42.2811902,
   "lon": -88.0642733,
   "agency": "Private club",
   "agency_url": "https://www.ivanhoeclub.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "creek",
    "pond",
    "golf"
   ],
   "features_source": "Site: \"An award-winning private golf club offering 3 distinct 9-hole golf courses\". OSM: 13 natural=water polygons and 9 stream ways (Manitou Creek) inside the course (relation 15342412). USGS 3DEP: 837 ft, ring 793-847 ft. Coordinates: Nominatim OSM lookup of relation 15342412.",
   "drive_minutes_est": 13,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 8.0 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 7.6 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Private members' club, Mundelein. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.068,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:32.114577-05:00",
     "est_end": "2026-10-16 07:51:32.114577-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 68 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.3,
       "rh_max": 87,
       "wind_mean": 13.15,
       "wind_after": 12.5,
       "gust_max": 29.4,
       "cloud_mh_night": 24.272727272727273,
       "cloud_low_night": 90.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15700.0,
       "low_sunrise": 67.5,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 9.6,
       "cooling": 5.9,
       "t_min_night": 9.6,
       "td_afternoon": 13.899999999999999,
       "crossover": -4.299999999999999,
       "td_drop": 6.599999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.599999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.4,
         "RH": 97,
         "wind": 9.0,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 14.4,
         "RH": 91,
         "wind": 12.9,
         "low": 100,
         "mid": 18,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 12.9,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.8,
         "RH": 89,
         "wind": 13.7,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 10.8,
         "RH": 87,
         "wind": 14.8,
         "low": 100,
         "mid": 99,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 10.8,
         "RH": 90,
         "wind": 12.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "03:00",
         "T": 11.6,
         "Td": 9.4,
         "RH": 86,
         "wind": 16.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.9,
         "RH": 87,
         "wind": 15.4,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 13.2,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.8,
         "RH": 86,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.3,
         "RH": 86,
         "wind": 10.6,
         "low": 35,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "08:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.2,
         "RH": 86,
         "wind": 12.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 7.5,
         "RH": 83,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.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 = 13.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.94,
        "why": "overnight mid+high levels cloud = 24 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.3 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 6.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.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 90 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.052
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.40000000000000036,
       "dpd_key": 1.0,
       "rh_max": 97,
       "wind_mean": 13.3,
       "wind_after": 12.8,
       "gust_max": 21.8,
       "cloud_mh_night": 89.18181818181819,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 71.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.2,
       "t_key": 7.8,
       "cooling": 9.399999999999999,
       "t_min_night": 7.8,
       "td_afternoon": 15.7,
       "crossover": -7.8999999999999995,
       "td_drop": 8.899999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 8.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 13.7,
         "RH": 100,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.3,
         "Td": 12.2,
         "RH": 99,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.9,
         "Td": 10.5,
         "RH": 97,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 9.9,
         "Td": 9.3,
         "RH": 96,
         "wind": 14.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.0,
         "Td": 8.6,
         "RH": 97,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.4,
         "Td": 8.0,
         "RH": 97,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.0,
         "Td": 7.4,
         "RH": 96,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.8,
         "Td": 6.8,
         "RH": 93,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 8.2,
         "RH": 89,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 8.7,
         "RH": 89,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 9.1,
         "RH": 87,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (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.39,
        "why": "crossover: forecast night minimum 7.8 \u00b0C vs afternoon dewpoint 15.7 \u00b0C \u2192 -7.9 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 8.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.106
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.072
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 4.200000000000001,
       "rh_max": 83,
       "wind_mean": 12.25,
       "wind_after": 11.85,
       "gust_max": 27.2,
       "cloud_mh_night": 54.18181818181818,
       "cloud_low_night": 84.27272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 63.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.3,
       "cooling": 5.799999999999999,
       "t_min_night": 8.9,
       "td_afternoon": 13.7,
       "crossover": -4.799999999999999,
       "td_drop": 8.6,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.7,
         "Td": 15.7,
         "RH": 94,
         "wind": 11.3,
         "low": 100,
         "mid": 85,
         "high": 58,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.8,
         "RH": 90,
         "wind": 11.3,
         "low": 100,
         "mid": 100,
         "high": 28,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.2,
         "Td": 12.1,
         "RH": 82,
         "wind": 13.3,
         "low": 100,
         "mid": 96,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.3,
         "Td": 10.9,
         "RH": 80,
         "wind": 13.9,
         "low": 100,
         "mid": 88,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 8.7,
         "RH": 75,
         "wind": 13.2,
         "low": 93,
         "mid": 87,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 7.5,
         "RH": 74,
         "wind": 13.8,
         "low": 100,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 6.5,
         "RH": 75,
         "wind": 13.8,
         "low": 59,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 5.1,
         "RH": 75,
         "wind": 12.7,
         "low": 44,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 6.2,
         "RH": 83,
         "wind": 12.4,
         "low": 80,
         "mid": 5,
         "high": 5,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 6.4,
         "RH": 82,
         "wind": 12.5,
         "low": 83,
         "mid": 15,
         "high": 92,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 5.1,
         "RH": 75,
         "wind": 11.4,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.4,
         "Td": 5.8,
         "RH": 78,
         "wind": 11.0,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 6.2,
         "RH": 77,
         "wind": 12.7,
         "low": 60,
         "mid": 29,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 5.8,
         "RH": 72,
         "wind": 12.1,
         "low": 100,
         "mid": 42,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 5.7,
         "RH": 67,
         "wind": 14.5,
         "low": 81,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.04,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.56,
        "why": "overnight mid+high levels cloud = 54 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 84 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.038
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.5,
    "soil_moisture_top": 0.286,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2811902&longitude=-88.0642733&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=42.2811902&longitude=-88.0642733&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:04+00:00",
     "elevation_m": 240.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2811902&longitude=-88.0642733&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:04+00:00",
     "elevation_m": 240.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2811902&longitude=-88.0642733&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:04+00:00",
     "elevation_m": 240.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2811902&longitude=-88.0642733&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:04+00:00",
     "elevation_m": 240.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.6,
   "dawn_wind_kt": 10.6
  },
  {
   "id": "hickory-knoll-golf-course",
   "name": "Hickory Knoll Golf Course",
   "lat": 42.3989565,
   "lon": -88.1155479,
   "agency": "Not stated on the page reached",
   "agency_url": "https://www.hickoryknollgc.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "hilly terrain",
    "golf"
   ],
   "features_source": "Site: \"strategically designed on picturesque, hilly terrain\" and \"water hazards don't come into play\". OSM maps no water inside the course polygon (way 730896775). USGS 3DEP: 829 ft vs ring 738-811 ft, so the point is above its surroundings (poor cold-pool site). Coordinates: Nominatim 'Hickory Knoll Golf Course' (way 730896775).",
   "drive_minutes_est": 14,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Not under the Class B shelf; Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 7.1 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 7.0 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. Beyond the Class B shelf at this point (no Class B polygon).",
   "notes": "Weakest fog candidate of the courses: no water, above its ring. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.06,
    "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.078,
    "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.0 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:52.200593-05:00",
     "est_end": "2026-10-16 07:51:52.200593-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 76 % with visibility 15 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.0,
       "dpd_key": 2.0,
       "rh_max": 87,
       "wind_mean": 11.925,
       "wind_after": 11.0,
       "gust_max": 28.0,
       "cloud_mh_night": 31.545454545454547,
       "cloud_low_night": 86.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15200.0,
       "low_sunrise": 75.5,
       "vis_min": 15200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.1,
       "cooling": 6.1,
       "t_min_night": 9.1,
       "td_afternoon": 13.7,
       "crossover": -4.6,
       "td_drop": 6.6,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0.4,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.6,
         "Td": 15.0,
         "RH": 96,
         "wind": 5.8,
         "low": 100,
         "mid": 8,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.5,
         "Td": 14.0,
         "RH": 91,
         "wind": 11.6,
         "low": 100,
         "mid": 43,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 14.2,
         "Td": 12.6,
         "RH": 90,
         "wind": 11.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "00:00",
         "T": 13.2,
         "Td": 11.3,
         "RH": 88,
         "wind": 12.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "01:00",
         "T": 12.8,
         "Td": 10.3,
         "RH": 85,
         "wind": 14.0,
         "low": 89,
         "mid": 94,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "02:00",
         "T": 12.1,
         "Td": 9.8,
         "RH": 86,
         "wind": 11.5,
         "low": 90,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 9.1,
         "RH": 86,
         "wind": 14.6,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "04:00",
         "T": 10.8,
         "Td": 8.6,
         "RH": 86,
         "wind": 14.1,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.3,
         "RH": 87,
         "wind": 12.2,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.5,
         "RH": 85,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 9.1,
         "Td": 7.1,
         "RH": 87,
         "wind": 8.9,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "08:00",
         "T": 9.6,
         "Td": 7.5,
         "RH": 87,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.1,
         "RH": 86,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 7.0,
         "RH": 81,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 6.9,
         "RH": 83,
         "wind": 12.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \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 = 11.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.85,
        "why": "overnight mid+high levels cloud = 32 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 6.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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "precipitation around dawn (0.4 mm): drizzle/rain, not radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.032
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.20000000000000107,
       "dpd_key": 0.7999999999999998,
       "rh_max": 99,
       "wind_mean": 11.9,
       "wind_after": 11.899999999999999,
       "gust_max": 21.4,
       "cloud_mh_night": 88.45454545454545,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 68.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.0,
       "t_key": 7.6,
       "cooling": 9.4,
       "t_min_night": 7.6,
       "td_afternoon": 15.15,
       "crossover": -7.550000000000001,
       "td_drop": 8.350000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.8,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.5,
         "Td": 16.5,
         "RH": 100,
         "wind": 5.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "22:00",
         "T": 16.3,
         "Td": 16.3,
         "RH": 100,
         "wind": 8.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "23:00",
         "T": 14.9,
         "Td": 14.9,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.4,
         "Td": 13.4,
         "RH": 100,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 12.0,
         "Td": 12.0,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.9,
         "Td": 10.5,
         "RH": 98,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 9.8,
         "Td": 9.5,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 8.9,
         "Td": 8.7,
         "RH": 99,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.3,
         "Td": 8.0,
         "RH": 98,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 7.8,
         "Td": 7.3,
         "RH": 97,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.6,
         "Td": 6.8,
         "RH": 95,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.0,
         "Td": 7.2,
         "RH": 95,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 8.9,
         "RH": 91,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 9.2,
         "RH": 87,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.2 \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 = 11.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 = 9.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 7.6 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -7.6 \u00b0C; rain last 48 h = 23.1 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.11
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.2,
       "dpd_key": 4.000000000000001,
       "rh_max": 80,
       "wind_mean": 11.6,
       "wind_after": 12.2,
       "gust_max": 29.0,
       "cloud_mh_night": 26.0,
       "cloud_low_night": 74.18181818181819,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 100.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 10.3,
       "cooling": 5.199999999999999,
       "t_min_night": 9.9,
       "td_afternoon": 14.65,
       "crossover": -4.75,
       "td_drop": 8.350000000000001,
       "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": 16.7,
         "Td": 16.4,
         "RH": 98,
         "wind": 7.6,
         "low": 100,
         "mid": 53,
         "high": 46,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 16.3,
         "RH": 98,
         "wind": 10.7,
         "low": 100,
         "mid": 30,
         "high": 64,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.6,
         "Td": 15.0,
         "RH": 96,
         "wind": 12.7,
         "low": 91,
         "mid": 16,
         "high": 50,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.0,
         "Td": 12.8,
         "RH": 92,
         "wind": 14.1,
         "low": 79,
         "mid": 6,
         "high": 21,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.6,
         "Td": 10.9,
         "RH": 89,
         "wind": 14.9,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.6,
         "Td": 9.3,
         "RH": 86,
         "wind": 14.6,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.6,
         "Td": 7.9,
         "RH": 83,
         "wind": 13.7,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.0,
         "Td": 6.8,
         "RH": 80,
         "wind": 12.6,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 6.3,
         "RH": 78,
         "wind": 11.8,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 6.3,
         "RH": 77,
         "wind": 11.1,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 6.3,
         "RH": 76,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 6.0,
         "RH": 74,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.6,
         "RH": 71,
         "wind": 12.8,
         "low": 94,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 5.3,
         "RH": 69,
         "wind": 13.6,
         "low": 86,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 10.9,
         "Td": 5.5,
         "RH": 69,
         "wind": 13.8,
         "low": 81,
         "mid": 27,
         "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.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.92,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 14.7 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 8.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 = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.071
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.700000000000001,
       "dpd_key": 3.5999999999999996,
       "rh_max": 83,
       "wind_mean": 12.95,
       "wind_after": 12.6,
       "gust_max": 27.0,
       "cloud_mh_night": 60.09090909090909,
       "cloud_low_night": 80.63636363636364,
       "cloud_mh_sunrise": 24.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 59.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.5,
       "cooling": 5.4,
       "t_min_night": 9.1,
       "td_afternoon": 13.55,
       "crossover": -4.450000000000001,
       "td_drop": 7.65,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.2999999999999545,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.9,
         "Td": 15.3,
         "RH": 96,
         "wind": 8.4,
         "low": 100,
         "mid": 83,
         "high": 66,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.1,
         "Td": 14.5,
         "RH": 90,
         "wind": 11.1,
         "low": 100,
         "mid": 100,
         "high": 92,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.2,
         "Td": 12.3,
         "RH": 83,
         "wind": 14.2,
         "low": 100,
         "mid": 93,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.3,
         "Td": 11.1,
         "RH": 81,
         "wind": 14.7,
         "low": 100,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 9.2,
         "RH": 77,
         "wind": 13.0,
         "low": 79,
         "mid": 62,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.1,
         "Td": 8.0,
         "RH": 76,
         "wind": 14.8,
         "low": 100,
         "mid": 12,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 6.9,
         "RH": 76,
         "wind": 14.2,
         "low": 67,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.9,
         "Td": 5.5,
         "RH": 74,
         "wind": 13.4,
         "low": 41,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 13.3,
         "low": 57,
         "mid": 0,
         "high": 71,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 6.6,
         "RH": 83,
         "wind": 13.1,
         "low": 80,
         "mid": 31,
         "high": 77,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 5.9,
         "RH": 78,
         "wind": 12.0,
         "low": 63,
         "mid": 21,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 6.1,
         "RH": 77,
         "wind": 13.0,
         "low": 56,
         "mid": 28,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.5,
         "Td": 6.3,
         "RH": 75,
         "wind": 12.2,
         "low": 83,
         "mid": 14,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.1,
         "Td": 6.0,
         "RH": 71,
         "wind": 12.1,
         "low": 99,
         "mid": 43,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 5.8,
         "RH": 68,
         "wind": 14.7,
         "low": 98,
         "mid": 37,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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 = 12.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.5 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 7.7 \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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 81 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 23.1,
    "soil_moisture_top": 0.299,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3989565&longitude=-88.1155479&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=42.3989565&longitude=-88.1155479&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:04+00:00",
     "elevation_m": 255.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3989565&longitude=-88.1155479&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:04+00:00",
     "elevation_m": 255.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3989565&longitude=-88.1155479&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:04+00:00",
     "elevation_m": 255.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3989565&longitude=-88.1155479&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:04+00:00",
     "elevation_m": 255.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.1,
   "dawn_wind_kt": 8.9
  },
  {
   "id": "merit-club",
   "name": "Merit Club",
   "lat": 42.3349518,
   "lon": -87.9595884,
   "agency": "Private club (\"A Golf-Only Club\")",
   "agency_url": "https://www.meritclub.org/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "wetland",
    "golf"
   ],
   "features_source": "Site: \"A Golf-Only Club\" in Libertyville. OSM: 7 natural=water and 2 natural=wetland polygons inside the course (way 195246183). USGS 3DEP: 695 ft vs ring 656-763 ft. Coordinates: Nominatim 'Merit Club' (way 195246183, 1500 Merit Club Ln).",
   "drive_minutes_est": 14,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 2.6 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 2.1 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.072,
    "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.2 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:10.513510-05:00",
     "est_end": "2026-10-16 07:51:10.513510-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 66 % with visibility 16 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.200000000000001,
       "dpd_key": 2.5999999999999996,
       "rh_max": 86,
       "wind_mean": 11.65,
       "wind_after": 10.6,
       "gust_max": 30.3,
       "cloud_mh_night": 30.727272727272727,
       "cloud_low_night": 87.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16400.0,
       "low_sunrise": 65.5,
       "vis_min": 15600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.7,
       "cooling": 5.600000000000001,
       "t_min_night": 9.7,
       "td_afternoon": 13.6,
       "crossover": -3.9000000000000004,
       "td_drop": 6.5,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.7000000000000455,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 7.8,
         "low": 100,
         "mid": 4,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 16.1,
         "Td": 14.5,
         "RH": 90,
         "wind": 11.2,
         "low": 100,
         "mid": 72,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "23:00",
         "T": 14.8,
         "Td": 13.1,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 62,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 11.8,
         "RH": 87,
         "wind": 12.2,
         "low": 91,
         "mid": 100,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "01:00",
         "T": 13.3,
         "Td": 11.0,
         "RH": 86,
         "wind": 13.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 10.0,
         "RH": 85,
         "wind": 12.0,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "03:00",
         "T": 11.9,
         "Td": 10.1,
         "RH": 89,
         "wind": 13.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "04:00",
         "T": 11.4,
         "Td": 8.8,
         "RH": 84,
         "wind": 13.7,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "05:00",
         "T": 10.8,
         "Td": 8.6,
         "RH": 86,
         "wind": 11.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "06:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 9.5,
         "low": 31,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.7,
         "RH": 86,
         "wind": 10.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 7.6,
         "RH": 86,
         "wind": 11.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 10.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17600.0
        },
        {
         "t": "11:00",
         "T": 10.1,
         "Td": 7.3,
         "RH": 83,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.35,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.2 \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.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.86,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -3.9 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.5 \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.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.051
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 1.0999999999999996,
       "rh_max": 98,
       "wind_mean": 12.1,
       "wind_after": 11.8,
       "gust_max": 21.4,
       "cloud_mh_night": 90.18181818181819,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 71.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": 17.1,
       "t_key": 8.1,
       "cooling": 9.000000000000002,
       "t_min_night": 8.1,
       "td_afternoon": 16.05,
       "crossover": -7.950000000000001,
       "td_drop": 9.05,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 5.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 7.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.4,
         "Td": 15.4,
         "RH": 100,
         "wind": 9.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 13.9,
         "RH": 100,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 12.5,
         "RH": 100,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 11.0,
         "RH": 98,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.2,
         "Td": 9.7,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.9,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 8.4,
         "RH": 98,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.3,
         "Td": 7.8,
         "RH": 97,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.1,
         "Td": 7.0,
         "RH": 93,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.6,
         "RH": 95,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 8.9,
         "RH": 91,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 9.2,
         "RH": 89,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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.1 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 = 9.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.1 \u00b0C vs afternoon dewpoint 16.1 \u00b0C \u2192 -8.0 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.4,
       "t_key": 10.5,
       "cooling": 5.899999999999999,
       "t_min_night": 10.4,
       "td_afternoon": 15.2,
       "crossover": -4.799999999999999,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.1,
         "Td": 18.0,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.1,
         "Td": 17.8,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.8,
         "Td": 16.2,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 13.5,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 11.4,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 9.8,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 8.4,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 7.3,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 6.7,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.4,
         "Td": 6.4,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.5,
         "Td": 6.1,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 5.8,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 5.6,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.3,
         "Td": 5.8,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.4 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.700000000000001,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.3,
       "td_afternoon": 13.95,
       "crossover": -4.649999999999999,
       "td_drop": 7.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.2,
         "Td": 15.6,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 15.0,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 12.8,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 11.6,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.6,
         "Td": 9.4,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.5,
         "Td": 8.2,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 7.2,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.3,
         "Td": 5.8,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 6.6,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 6.1,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 6.1,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 6.8,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.2,
         "Td": 5.9,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.9,
         "Td": 5.8,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3349518&longitude=-87.9595884&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=42.3349518&longitude=-87.9595884&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:04+00:00",
     "elevation_m": 211.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3349518&longitude=-87.9595884&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:04+00:00",
     "elevation_m": 211.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3349518&longitude=-87.9595884&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:04+00:00",
     "elevation_m": 211.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3349518&longitude=-87.9595884&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:04+00:00",
     "elevation_m": 211.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.7,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "steeple-chase-golf-club",
   "name": "Steeple Chase Golf Club",
   "lat": 42.2625893,
   "lon": -88.053746,
   "agency": "Mundelein Park & Recreation District",
   "agency_url": "https://mundeleinparks.org/steeple-chase-golf-club",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. 620 ILCS 5/42.1(b-5) (per ticket C research) lets a local government adopt reasonable rules over its own recreation land; none located. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "pond",
    "wetland",
    "golf"
   ],
   "features_source": "District site lists Steeple Chase Golf Club as a district facility. OSM: 7 natural=water and 1 natural=wetland polygons inside the course (way 296074173). USGS 3DEP: 815 ft, ring 788-835 ft. Coordinates: Nominatim 'Steeple Chase Golf Club' (way 296074173).",
   "drive_minutes_est": 15,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 8.7 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 8.1 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Edge of the 15-minute limit (OSRM 14.6 min). Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.067,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:28.361327-05:00",
     "est_end": "2026-10-16 07:51:28.361327-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 74 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.3,
       "rh_max": 87,
       "wind_mean": 13.15,
       "wind_after": 12.25,
       "gust_max": 29.5,
       "cloud_mh_night": 22.90909090909091,
       "cloud_low_night": 92.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 73.5,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 9.6,
       "cooling": 5.9,
       "t_min_night": 9.6,
       "td_afternoon": 13.85,
       "crossover": -4.25,
       "td_drop": 6.55,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.2,
         "Td": 16.7,
         "RH": 97,
         "wind": 8.6,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.5,
         "RH": 92,
         "wind": 12.9,
         "low": 100,
         "mid": 17,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.8,
         "RH": 90,
         "wind": 13.1,
         "low": 100,
         "mid": 33,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.8,
         "RH": 89,
         "wind": 13.7,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 10.7,
         "RH": 87,
         "wind": 14.8,
         "low": 96,
         "mid": 91,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 10.7,
         "RH": 90,
         "wind": 13.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13900.0
        },
        {
         "t": "03:00",
         "T": 11.5,
         "Td": 9.2,
         "RH": 86,
         "wind": 16.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "04:00",
         "T": 10.9,
         "Td": 8.8,
         "RH": 87,
         "wind": 15.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 13.2,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.8,
         "RH": 86,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.3,
         "RH": 86,
         "wind": 10.8,
         "low": 47,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.5,
         "Td": 7.6,
         "RH": 88,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.1,
         "RH": 86,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 7.4,
         "RH": 84,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        },
        {
         "t": "11:00",
         "T": 9.6,
         "Td": 7.0,
         "RH": 84,
         "wind": 13.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.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 = 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 = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.2 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 6.5 \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.4 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 92 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 1.2000000000000002,
       "rh_max": 96,
       "wind_mean": 13.45,
       "wind_after": 12.5,
       "gust_max": 21.8,
       "cloud_mh_night": 88.9090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 71.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": 17.2,
       "t_key": 7.8,
       "cooling": 9.399999999999999,
       "t_min_night": 7.8,
       "td_afternoon": 15.55,
       "crossover": -7.750000000000001,
       "td_drop": 8.950000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 7.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 9.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 12.3,
         "RH": 99,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.9,
         "Td": 10.4,
         "RH": 97,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.0,
         "Td": 9.2,
         "RH": 95,
         "wind": 14.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.1,
         "Td": 8.5,
         "RH": 96,
         "wind": 14.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.6,
         "Td": 8.0,
         "RH": 96,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.1,
         "Td": 7.5,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.8,
         "Td": 6.6,
         "RH": 92,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 6.8,
         "RH": 91,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 8.1,
         "RH": 89,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 8.6,
         "RH": 89,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 9.1,
         "RH": 87,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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 = 13.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (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.39,
        "why": "crossover: forecast night minimum 7.8 \u00b0C vs afternoon dewpoint 15.6 \u00b0C \u2192 -7.8 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 9.0 \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.104
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.500000000000001,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.1,
       "t_key": 10.3,
       "cooling": 5.800000000000001,
       "t_min_night": 10.1,
       "td_afternoon": 14.899999999999999,
       "crossover": -4.799999999999999,
       "td_drop": 9.099999999999998,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.7,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.5,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 15.9,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.3,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.1,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.1,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.8,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.5,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.3,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.3,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 5.5,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 10.1 \u00b0C vs afternoon dewpoint 14.9 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.3 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.072
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 3.499999999999999,
       "rh_max": 83,
       "wind_mean": 11.9,
       "wind_after": 11.149999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 60.18181818181818,
       "cloud_low_night": 81.81818181818181,
       "cloud_mh_sunrise": 44.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 66.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.2,
       "cooling": 6.100000000000001,
       "t_min_night": 8.9,
       "td_afternoon": 13.7,
       "crossover": -4.799999999999999,
       "td_drop": 7.999999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.300000000000068,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.5,
         "Td": 15.7,
         "RH": 95,
         "wind": 8.3,
         "low": 100,
         "mid": 87,
         "high": 57,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 15.0,
         "RH": 90,
         "wind": 10.0,
         "low": 100,
         "mid": 100,
         "high": 32,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 13.2,
         "low": 100,
         "mid": 98,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.3,
         "RH": 80,
         "wind": 12.9,
         "low": 98,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.1,
         "RH": 75,
         "wind": 12.6,
         "low": 96,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 7.8,
         "RH": 74,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 6.8,
         "RH": 74,
         "wind": 13.5,
         "low": 75,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 5.3,
         "RH": 72,
         "wind": 12.0,
         "low": 34,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 5.7,
         "RH": 80,
         "wind": 12.0,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.0,
         "Td": 6.3,
         "RH": 83,
         "wind": 12.2,
         "low": 74,
         "mid": 24,
         "high": 93,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 5.7,
         "RH": 79,
         "wind": 11.4,
         "low": 66,
         "mid": 31,
         "high": 22,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.7,
         "Td": 5.5,
         "RH": 75,
         "wind": 11.2,
         "low": 66,
         "mid": 32,
         "high": 4,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.4,
         "Td": 6.3,
         "RH": 76,
         "wind": 11.1,
         "low": 59,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.2,
         "low": 100,
         "mid": 36,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 12.3,
         "Td": 5.7,
         "RH": 64,
         "wind": 14.5,
         "low": 92,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.3 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 82 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.3,
    "soil_moisture_top": 0.34,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2625893&longitude=-88.053746&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=42.2625893&longitude=-88.053746&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:04+00:00",
     "elevation_m": 252.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2625893&longitude=-88.053746&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:04+00:00",
     "elevation_m": 252.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2625893&longitude=-88.053746&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:04+00:00",
     "elevation_m": 252.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2625893&longitude=-88.053746&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:04+00:00",
     "elevation_m": 252.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.6,
   "dawn_wind_kt": 10.8
  },
  {
   "id": "stonewall-orchard-golf-club",
   "name": "Stonewall Orchard Golf Club",
   "lat": 42.3121125,
   "lon": -88.1274235,
   "agency": "Public course; owner not stated on the page reached",
   "agency_url": "https://www.stonewallorchard.com/",
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No drone rule found on the pages reached. ",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "wetland",
    "pond",
    "rolling hills",
    "golf"
   ],
   "features_source": "Site: \"the acres and acres of rolling hills, tranquil wetlands and wildlife\"; \"ranked as the 3rd best public course in Illinois\". OSM: 8 natural=water polygons inside the course (way 377411373). USGS 3DEP: 799 ft, ring 788-839 ft. Coordinates: Nominatim 'Stonewall Orchard Golf Club' (way 377411373, 25675 Wilson Rd, Grayslake 60030).",
   "drive_minutes_est": 18,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 9.3 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 8.9 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "OVER the 15-minute limit (OSRM 18.3 min) but kept because it has a Grayslake 60030 address. Course hours not found on the pages reached. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "fairway fog over ponds and tree lines at sunrise; drone from the course if this is the client's (owner's permission settled); Class G at the surface, no LAANC",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:49.320321-05:00",
     "est_end": "2026-10-16 07:51:49.320321-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.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 59 % with visibility 16 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.1000000000000014,
       "dpd_key": 2.2,
       "rh_max": 87,
       "wind_mean": 12.925,
       "wind_after": 12.5,
       "gust_max": 28.2,
       "cloud_mh_night": 31.818181818181817,
       "cloud_low_night": 87.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15800.0,
       "low_sunrise": 59.0,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 9.4,
       "cooling": 6.1,
       "t_min_night": 9.4,
       "td_afternoon": 13.85,
       "crossover": -4.449999999999999,
       "td_drop": 6.6499999999999995,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.3,
         "Td": 15.6,
         "RH": 96,
         "wind": 7.4,
         "low": 100,
         "mid": 12,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.6,
         "Td": 14.1,
         "RH": 91,
         "wind": 12.9,
         "low": 100,
         "mid": 43,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "23:00",
         "T": 14.4,
         "Td": 12.7,
         "RH": 90,
         "wind": 12.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "00:00",
         "T": 13.4,
         "Td": 11.4,
         "RH": 88,
         "wind": 13.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "01:00",
         "T": 12.8,
         "Td": 10.7,
         "RH": 87,
         "wind": 13.7,
         "low": 100,
         "mid": 94,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 10.7,
         "RH": 91,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 9.0,
         "RH": 85,
         "wind": 16.4,
         "low": 100,
         "mid": 1,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "04:00",
         "T": 10.8,
         "Td": 8.7,
         "RH": 87,
         "wind": 15.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.2,
         "RH": 86,
         "wind": 13.2,
         "low": 49,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.6,
         "RH": 85,
         "wind": 13.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 7.2,
         "RH": 86,
         "wind": 10.3,
         "low": 18,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "08:00",
         "T": 9.6,
         "Td": 7.3,
         "RH": 86,
         "wind": 12.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.0,
         "RH": 85,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 7.0,
         "RH": 81,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 7.0,
         "RH": 83,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.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.84,
        "why": "overnight mid+high levels cloud = 32 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.4 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 6.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.4 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 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.05
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.09999999999999964,
       "dpd_key": 0.9000000000000004,
       "rh_max": 99,
       "wind_mean": 12.925,
       "wind_after": 12.5,
       "gust_max": 22.2,
       "cloud_mh_night": 89.27272727272727,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 74.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.2,
       "t_key": 7.4,
       "cooling": 9.799999999999999,
       "t_min_night": 7.4,
       "td_afternoon": 15.55,
       "crossover": -8.15,
       "td_drop": 9.05,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 6.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 16.5,
         "RH": 100,
         "wind": 8.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 14.9,
         "Td": 14.9,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.4,
         "Td": 13.4,
         "RH": 100,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 11.9,
         "Td": 11.9,
         "RH": 100,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.6,
         "Td": 10.5,
         "RH": 99,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 9.6,
         "Td": 9.3,
         "RH": 98,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 8.7,
         "Td": 8.6,
         "RH": 99,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 7.9,
         "Td": 7.8,
         "RH": 99,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 7.5,
         "Td": 7.1,
         "RH": 97,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.4,
         "Td": 6.5,
         "RH": 94,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 6.8,
         "RH": 94,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.2,
         "RH": 90,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 8.8,
         "RH": 91,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 9.2,
         "RH": 88,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (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.39,
        "why": "crossover: forecast night minimum 7.4 \u00b0C vs afternoon dewpoint 15.6 \u00b0C \u2192 -8.2 \u00b0C; rain last 48 h = 12.5 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 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.106
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 2.999999999999999,
       "dpd_key": 5.2,
       "rh_max": 82,
       "wind_mean": 11.95,
       "wind_after": 12.3,
       "gust_max": 28.6,
       "cloud_mh_night": 18.09090909090909,
       "cloud_low_night": 78.0909090909091,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 85.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 16.3,
       "t_key": 9.9,
       "cooling": 6.4,
       "t_min_night": 9.9,
       "td_afternoon": 15.25,
       "crossover": -5.35,
       "td_drop": 10.55,
       "airmass_change": true,
       "precip_night_mm": 0.7000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.3,
         "Td": 17.0,
         "RH": 98,
         "wind": 9.4,
         "low": 89,
         "mid": 43,
         "high": 28,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.1,
         "Td": 16.6,
         "RH": 97,
         "wind": 12.4,
         "low": 82,
         "mid": 23,
         "high": 41,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 14.9,
         "RH": 94,
         "wind": 14.0,
         "low": 80,
         "mid": 12,
         "high": 32,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.0,
         "Td": 12.5,
         "RH": 91,
         "wind": 14.7,
         "low": 79,
         "mid": 5,
         "high": 14,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 10.5,
         "RH": 88,
         "wind": 14.8,
         "low": 77,
         "mid": 1,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 9.2,
         "RH": 86,
         "wind": 14.3,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 8.1,
         "RH": 84,
         "wind": 13.2,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 7.2,
         "RH": 82,
         "wind": 12.4,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 6.3,
         "RH": 78,
         "wind": 11.9,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 5.3,
         "RH": 73,
         "wind": 11.8,
         "low": 84,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.9,
         "Td": 4.7,
         "RH": 70,
         "wind": 11.7,
         "low": 89,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 4.6,
         "RH": 69,
         "wind": 11.9,
         "low": 81,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.4,
         "Td": 5.1,
         "RH": 70,
         "wind": 12.7,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 13.0,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 10.8,
         "Td": 5.6,
         "RH": 70,
         "wind": 13.4,
         "low": 53,
         "mid": 23,
         "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.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.9 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 = 6.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -5.3 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 10.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 = 82 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.075
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.8000000000000007,
       "dpd_key": 4.199999999999999,
       "rh_max": 83,
       "wind_mean": 12.25,
       "wind_after": 11.85,
       "gust_max": 27.2,
       "cloud_mh_night": 54.18181818181818,
       "cloud_low_night": 84.27272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 63.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.2,
       "cooling": 5.9,
       "t_min_night": 8.9,
       "td_afternoon": 13.600000000000001,
       "crossover": -4.700000000000001,
       "td_drop": 8.600000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 15.6,
         "RH": 94,
         "wind": 11.3,
         "low": 100,
         "mid": 85,
         "high": 58,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 14.8,
         "RH": 90,
         "wind": 11.3,
         "low": 100,
         "mid": 100,
         "high": 28,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.1,
         "Td": 12.1,
         "RH": 82,
         "wind": 13.3,
         "low": 100,
         "mid": 96,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 10.8,
         "RH": 80,
         "wind": 13.9,
         "low": 100,
         "mid": 88,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 8.6,
         "RH": 75,
         "wind": 13.2,
         "low": 93,
         "mid": 87,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 7.5,
         "RH": 74,
         "wind": 13.8,
         "low": 100,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 6.4,
         "RH": 75,
         "wind": 13.8,
         "low": 59,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 5.1,
         "RH": 75,
         "wind": 12.7,
         "low": 44,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 6.1,
         "RH": 83,
         "wind": 12.4,
         "low": 80,
         "mid": 5,
         "high": 5,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.3,
         "RH": 82,
         "wind": 12.5,
         "low": 83,
         "mid": 15,
         "high": 92,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 5.0,
         "RH": 75,
         "wind": 11.4,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.4,
         "Td": 5.7,
         "RH": 78,
         "wind": 11.0,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 6.1,
         "RH": 77,
         "wind": 12.7,
         "low": 60,
         "mid": 29,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 5.8,
         "RH": 72,
         "wind": 12.1,
         "low": 100,
         "mid": 42,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 5.6,
         "RH": 67,
         "wind": 14.5,
         "low": 81,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.04,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.56,
        "why": "overnight mid+high levels cloud = 54 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 84 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.5,
    "soil_moisture_top": 0.286,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3121125&longitude=-88.1274235&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=42.3121125&longitude=-88.1274235&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:04+00:00",
     "elevation_m": 250.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3121125&longitude=-88.1274235&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:04+00:00",
     "elevation_m": 250.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3121125&longitude=-88.1274235&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:04+00:00",
     "elevation_m": 250.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3121125&longitude=-88.1274235&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:04+00:00",
     "elevation_m": 250.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.4,
   "dawn_wind_kt": 10.3
  },
  {
   "id": "rollins-savanna-forest-preserve",
   "name": "Rollins Savanna Forest Preserve",
   "lat": 42.3732256,
   "lon": -88.0289285,
   "agency": "Lake County Forest Preserves",
   "agency_url": "https://www.lcfpd.org/rollins-savanna/",
   "dawn_access": "\"Hours: 6:30 am-sunset, daily.\" (lcfpd.org page, Wayback copy 2025-09-14; live page Cloudflare-blocked). Banner: \"Most preserves open 6:30 am-sunset.\"",
   "dawn_access_ok": true,
   "drone_rule": "LCFP Regulations Governing the General Use of District Property (approved Jan 14 2020, amended Jan 17 2024), Sec. III.A: \"No person shall use District Property for any of the following uses, unless the person has first obtained, and has physical possession of, a Permit allowing such use\"; item (v): \"use of any fuel-powered, air-propulsion, electric powered, radio-controlled, or cellular-controlled unmanned aerial Vehicle (commonly referred to as a \\\"drone\\\"), model or toy car, aircraft, boat or rocket, or any similar toy or model\"; item (xx): \"taking any still or motion pictures ... for commercial purposes or for use in commercial advertising\". LCFP's fee ordinance lists a 'Commercial Photography, Film or Video Permit'. Read from a Wayback copy (2024-02-25) because lcfpd.org returns a Cloudflare 403 to scripted fetches. No drone-specific permit procedure found; the model-aircraft page (archived 2026-02-15) offers only the Van Patten Woods field. A 2014 staff memo, seen only as a search-result excerpt, said drones may not launch or land elsewhere in the preserves.",
   "drone_rule_url": "https://www.lcfpd.org/file.aspx?DocumentId=9028",
   "drone_status": "permit",
   "features": [
    "wetland",
    "savanna",
    "prairie",
    "oak grove",
    "marsh",
    "stream"
   ],
   "features_source": "LCFP page: \"A 7.75-mile gravel trail with bridges and boardwalks winds through wetlands, groves of large oaks and open prairies\"; 1,253 acres. INPC page: nature preserve consists of \"savanna ... marsh, stream, wetland and prairie\". USGS 3DEP: 774 ft, ring 761-784 ft (flat). Coordinates: Nominatim centroid of 'Rollins Savanna Forest Preserve' (way 59518933); the preserve is 1,253 acres, so the entrance is elsewhere: LCFP page: main entrance on Washington Street at Atkinson Road, a second entrance to the north (street name cut off in my extract; Visit Lake County mentions a \"Drury Lane parking lot\").",
   "drive_minutes_est": 7,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.7 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 3.3 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Opens 6:30 am, before sunrise (~7:10). Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM estimate to the centroid.",
   "look": "marsh and savanna fog from the ground at 6:30 opening; drone needs a Lake County Forest Preserves permit",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.072,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:29.694952-05:00",
     "est_end": "2026-10-16 07:51:29.694952-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 62 % with visibility 16 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.0999999999999996,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 11.75,
       "wind_after": 11.05,
       "gust_max": 29.5,
       "cloud_mh_night": 29.636363636363637,
       "cloud_low_night": 86.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 61.5,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.4,
       "cooling": 5.9,
       "t_min_night": 9.4,
       "td_afternoon": 13.7,
       "crossover": -4.299999999999999,
       "td_drop": 6.699999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.599999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.9,
         "Td": 15.4,
         "RH": 97,
         "wind": 7.1,
         "low": 100,
         "mid": 14,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.4,
         "RH": 91,
         "wind": 11.7,
         "low": 100,
         "mid": 28,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.7,
         "low": 100,
         "mid": 84,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.9,
         "low": 72,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.6,
         "RH": 87,
         "wind": 14.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.6,
         "RH": 85,
         "wind": 13.8,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 11.6,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 7.7,
         "RH": 85,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 7.0,
         "RH": 85,
         "wind": 9.5,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.6,
         "RH": 86,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 7.5,
         "RH": 87,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.06,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.87,
        "why": "overnight mid+high levels cloud = 30 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.4 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.3 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.3000000000000007,
       "dpd_key": 0.9999999999999991,
       "rh_max": 98,
       "wind_mean": 12.25,
       "wind_after": 12.0,
       "gust_max": 21.4,
       "cloud_mh_night": 89.63636363636364,
       "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": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.1,
       "t_key": 8.2,
       "cooling": 8.900000000000002,
       "t_min_night": 8.2,
       "td_afternoon": 15.75,
       "crossover": -7.550000000000001,
       "td_drop": 8.55,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.4,
         "Td": 15.4,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 13.9,
         "RH": 100,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 12.5,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.5,
         "Td": 11.0,
         "RH": 97,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.4,
         "Td": 9.9,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.4,
         "Td": 9.1,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.8,
         "Td": 8.5,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.4,
         "Td": 7.8,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.2,
         "Td": 7.2,
         "RH": 94,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 7.6,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 8.6,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 9.2,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 9.5,
         "RH": 87,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \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.2 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 = 8.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 15.8 \u00b0C \u2192 -7.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.5,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.4,
       "cooling": 5.799999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.05,
       "crossover": -4.850000000000001,
       "td_drop": 9.15,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.0,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.0,
         "Td": 17.7,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.7,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.9,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.3,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 7.2,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.6,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.7,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.1 \u00b0C \u2192 -4.9 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.5,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.4,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.8,
       "crossover": -4.700000000000001,
       "td_drop": 7.9,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.5,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.5,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.5,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.7,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.5,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.8,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3732256&longitude=-88.0289285&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=42.3732256&longitude=-88.0289285&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:04+00:00",
     "elevation_m": 234.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3732256&longitude=-88.0289285&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:04+00:00",
     "elevation_m": 234.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3732256&longitude=-88.0289285&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:04+00:00",
     "elevation_m": 234.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3732256&longitude=-88.0289285&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:04+00:00",
     "elevation_m": 234.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.4,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "almond-marsh-forest-preserve",
   "name": "Almond Marsh Forest Preserve",
   "lat": 42.3302681,
   "lon": -87.9857045,
   "agency": "Lake County Forest Preserves",
   "agency_url": "https://www.lcfpd.org/almond-marsh/",
   "dawn_access": "\"Hours: 6:30 am-sunset, daily.\" (LCFP page, Wayback copy 2025-07-17); Visit Lake County: \"Open daily 6:30 a.m.-sunset.\" But Visit Lake County says: \"Parking, trails and facilities are not available at this site. Parking along Almond Road can be dangerous due to poor sight lines and fast moving traffic.\"",
   "dawn_access_ok": true,
   "drone_rule": "LCFP Regulations Governing the General Use of District Property (approved Jan 14 2020, amended Jan 17 2024), Sec. III.A: \"No person shall use District Property for any of the following uses, unless the person has first obtained, and has physical possession of, a Permit allowing such use\"; item (v): \"use of any fuel-powered, air-propulsion, electric powered, radio-controlled, or cellular-controlled unmanned aerial Vehicle (commonly referred to as a \\\"drone\\\"), model or toy car, aircraft, boat or rocket, or any similar toy or model\"; item (xx): \"taking any still or motion pictures ... for commercial purposes or for use in commercial advertising\". LCFP's fee ordinance lists a 'Commercial Photography, Film or Video Permit'. Read from a Wayback copy (2024-02-25) because lcfpd.org returns a Cloudflare 403 to scripted fetches. No drone-specific permit procedure found; the model-aircraft page (archived 2026-02-15) offers only the Van Patten Woods field. A 2014 staff memo, seen only as a search-result excerpt, said drones may not launch or land elsewhere in the preserves.",
   "drone_rule_url": "https://www.lcfpd.org/file.aspx?DocumentId=9028",
   "drone_status": "permit",
   "features": [
    "marsh",
    "sedge meadow",
    "savanna",
    "wetland",
    "oak woodland"
   ],
   "features_source": "INPC page: \"wetlands, oak woodlands, savanna, and old fields\"; \"a marsh and sedge meadow complex\"; LCFP: 503 acres, ~110 acres dedicated Illinois Nature Preserve. USGS 3DEP: 736 ft vs ring 715-810 ft (low basin). Coordinates: Nominatim centroid (way 560399537); address 32550 N Almond Rd.",
   "drive_minutes_est": 9,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.6 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 3.2 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Best cold-pool terrain on the list but no parking: roadside only. Nature-preserve portion may carry extra INPC rules (not researched). Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "marsh and savanna fog from the ground at 6:30 opening; drone needs a Lake County Forest Preserves permit",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.067,
    "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.072,
    "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.2 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:16.477485-05:00",
     "est_end": "2026-10-16 07:51:16.477485-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 64 % with visibility 16 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.1999999999999993,
       "dpd_key": 2.3999999999999995,
       "rh_max": 86,
       "wind_mean": 12.0,
       "wind_after": 10.85,
       "gust_max": 30.1,
       "cloud_mh_night": 28.545454545454547,
       "cloud_low_night": 88.36363636363636,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16200.0,
       "low_sunrise": 63.5,
       "vis_min": 15500.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.6,
       "cooling": 5.700000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 13.8,
       "crossover": -4.200000000000001,
       "td_drop": 6.6000000000000005,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.5,
         "Td": 16.0,
         "RH": 97,
         "wind": 8.2,
         "low": 100,
         "mid": 9,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 16.0,
         "Td": 14.4,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 41,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "23:00",
         "T": 14.7,
         "Td": 13.1,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 64,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 11.8,
         "RH": 88,
         "wind": 12.6,
         "low": 88,
         "mid": 100,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 10.8,
         "RH": 86,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 9.9,
         "RH": 85,
         "wind": 12.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "03:00",
         "T": 11.8,
         "Td": 9.7,
         "RH": 87,
         "wind": 14.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 8.6,
         "RH": 84,
         "wind": 13.9,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "05:00",
         "T": 10.7,
         "Td": 8.5,
         "RH": 86,
         "wind": 11.7,
         "low": 91,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 7.9,
         "RH": 85,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.2,
         "RH": 85,
         "wind": 10.0,
         "low": 27,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.7,
         "RH": 86,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.5,
         "RH": 86,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17800.0
        },
        {
         "t": "11:00",
         "T": 9.9,
         "Td": 7.1,
         "RH": 83,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.35,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.2 \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.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 = 5.7 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.2 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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.5 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.051
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.5,
       "dpd_key": 1.3000000000000007,
       "rh_max": 97,
       "wind_mean": 12.625,
       "wind_after": 12.149999999999999,
       "gust_max": 21.6,
       "cloud_mh_night": 90.36363636363636,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 71.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": 17.3,
       "t_key": 8.4,
       "cooling": 8.9,
       "t_min_night": 8.4,
       "td_afternoon": 15.55,
       "crossover": -7.15,
       "td_drop": 8.450000000000001,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.1,
         "Td": 17.1,
         "RH": 100,
         "wind": 6.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 8.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.6,
         "Td": 15.6,
         "RH": 100,
         "wind": 10.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 14.1,
         "Td": 14.1,
         "RH": 100,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.7,
         "Td": 12.5,
         "RH": 99,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.6,
         "Td": 10.8,
         "RH": 95,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.5,
         "Td": 9.7,
         "RH": 95,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.6,
         "Td": 9.0,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 8.4,
         "RH": 97,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.7,
         "Td": 7.9,
         "RH": 95,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.4,
         "Td": 7.1,
         "RH": 92,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.6,
         "Td": 7.5,
         "RH": 93,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 8.4,
         "RH": 88,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 8.9,
         "RH": 88,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 9.1,
         "RH": 85,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.5 \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.6 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 = 8.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.4 \u00b0C vs afternoon dewpoint 15.6 \u00b0C \u2192 -7.2 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.5 \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.107
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.3,
       "t_key": 10.4,
       "cooling": 5.9,
       "t_min_night": 10.3,
       "td_afternoon": 15.100000000000001,
       "crossover": -4.800000000000001,
       "td_drop": 9.100000000000001,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 18.0,
         "Td": 17.9,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 18.0,
         "Td": 17.7,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.7,
         "Td": 16.1,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 13.5,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 11.3,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.9,
         "Td": 9.7,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 8.3,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 7.2,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.3,
         "Td": 6.6,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.3,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 6.0,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.7,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.5,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.5,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 5.7,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 15.1 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.8000000000000007,
       "dpd_key": 3.5,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.2,
       "td_afternoon": 13.899999999999999,
       "crossover": -4.699999999999999,
       "td_drop": 7.899999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.2,
         "Td": 15.5,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 14.9,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 12.7,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.8,
         "Td": 11.5,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.5,
         "Td": 9.4,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 8.1,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 7.1,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 5.5,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.2,
         "Td": 5.8,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 6.5,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 6.0,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 6.0,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 6.7,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.1,
         "Td": 5.8,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.9,
         "Td": 5.7,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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 = 13.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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.035
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3302681&longitude=-87.9857045&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=42.3302681&longitude=-87.9857045&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:04+00:00",
     "elevation_m": 224.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3302681&longitude=-87.9857045&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:04+00:00",
     "elevation_m": 224.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3302681&longitude=-87.9857045&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:04+00:00",
     "elevation_m": 224.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3302681&longitude=-87.9857045&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:04+00:00",
     "elevation_m": 224.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.6,
   "dawn_wind_kt": 10.0
  },
  {
   "id": "lakewood-forest-preserve",
   "name": "Lakewood Forest Preserve",
   "lat": 42.2600097,
   "lon": -88.0862135,
   "agency": "Lake County Forest Preserves",
   "agency_url": "https://www.lcfpd.org/lakewood/",
   "dawn_access": "LCFP banner (archived pages): \"Most preserves open 6:30 am-sunset.\" Lakewood's own page seen only as a search-result excerpt: 6:30 a.m. to sunset daily; portions closed for construction (not verified).",
   "dawn_access_ok": true,
   "drone_rule": "LCFP Regulations Governing the General Use of District Property (approved Jan 14 2020, amended Jan 17 2024), Sec. III.A: \"No person shall use District Property for any of the following uses, unless the person has first obtained, and has physical possession of, a Permit allowing such use\"; item (v): \"use of any fuel-powered, air-propulsion, electric powered, radio-controlled, or cellular-controlled unmanned aerial Vehicle (commonly referred to as a \\\"drone\\\"), model or toy car, aircraft, boat or rocket, or any similar toy or model\"; item (xx): \"taking any still or motion pictures ... for commercial purposes or for use in commercial advertising\". LCFP's fee ordinance lists a 'Commercial Photography, Film or Video Permit'. Read from a Wayback copy (2024-02-25) because lcfpd.org returns a Cloudflare 403 to scripted fetches. No drone-specific permit procedure found; the model-aircraft page (archived 2026-02-15) offers only the Van Patten Woods field. A 2014 staff memo, seen only as a search-result excerpt, said drones may not launch or land elsewhere in the preserves.",
   "drone_rule_url": "https://www.lcfpd.org/file.aspx?DocumentId=9028",
   "drone_status": "permit",
   "features": [
    "bog",
    "marsh",
    "wetland",
    "pond",
    "oak woodland"
   ],
   "features_source": "Search-result excerpts of lcfpd.org/Lakewood and INPC (not read in full): Wauconda Bog (70 acres), Broberg Marsh state nature preserve, fishing ponds, oak woodlands. USGS 3DEP: 811 ft, ring 808-898 ft. Coordinates: Nominatim centroid (relation 13539101); address 27277 Forest Preserve Rd, Wauconda (excerpt).",
   "drive_minutes_est": 14,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 9.7 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 9.3 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "Acreage conflicts in excerpts (2,835 vs 2,996). Wayback copy of the Lakewood page was not the preserve page, so hours/features rest on excerpts. Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "marsh and savanna fog from the ground at 6:30 opening; drone needs a Lake County Forest Preserves permit",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.0 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:35.990020-05:00",
     "est_end": "2026-10-16 07:51:35.990020-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 74 % with visibility 16 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.0,
       "dpd_key": 2.1999999999999993,
       "rh_max": 87,
       "wind_mean": 13.15,
       "wind_after": 12.25,
       "gust_max": 29.5,
       "cloud_mh_night": 22.90909090909091,
       "cloud_low_night": 92.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 73.5,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 9.6,
       "cooling": 5.9,
       "t_min_night": 9.6,
       "td_afternoon": 13.9,
       "crossover": -4.300000000000001,
       "td_drop": 6.5,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.2,
         "Td": 16.8,
         "RH": 97,
         "wind": 8.6,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.5,
         "RH": 92,
         "wind": 12.9,
         "low": 100,
         "mid": 17,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 13.1,
         "low": 100,
         "mid": 33,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.8,
         "RH": 89,
         "wind": 13.7,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 10.8,
         "RH": 87,
         "wind": 14.8,
         "low": 96,
         "mid": 91,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 10.8,
         "RH": 90,
         "wind": 13.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13900.0
        },
        {
         "t": "03:00",
         "T": 11.5,
         "Td": 9.3,
         "RH": 86,
         "wind": 16.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "04:00",
         "T": 10.9,
         "Td": 8.8,
         "RH": 87,
         "wind": 15.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.6,
         "RH": 87,
         "wind": 13.2,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.8,
         "RH": 86,
         "wind": 13.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.4,
         "RH": 86,
         "wind": 10.8,
         "low": 47,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.5,
         "Td": 7.7,
         "RH": 88,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.2,
         "RH": 86,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 7.5,
         "RH": 84,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17100.0
        },
        {
         "t": "11:00",
         "T": 9.6,
         "Td": 7.1,
         "RH": 84,
         "wind": 13.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.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.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 = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 13.9 \u00b0C \u2192 -4.3 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 6.5 \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.4 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 92 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.054
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 1.3999999999999995,
       "rh_max": 96,
       "wind_mean": 13.200000000000001,
       "wind_after": 12.25,
       "gust_max": 21.6,
       "cloud_mh_night": 89.0909090909091,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 73.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": 17.4,
       "t_key": 7.8,
       "cooling": 9.599999999999998,
       "t_min_night": 7.8,
       "td_afternoon": 15.7,
       "crossover": -7.8999999999999995,
       "td_drop": 9.299999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.0,
         "Td": 17.0,
         "RH": 100,
         "wind": 6.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 8.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.3,
         "RH": 99,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.0,
         "Td": 10.4,
         "RH": 96,
         "wind": 13.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.1,
         "Td": 9.3,
         "RH": 95,
         "wind": 14.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.4,
         "RH": 95,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.5,
         "Td": 7.9,
         "RH": 96,
         "wind": 13.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.0,
         "Td": 7.3,
         "RH": 95,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.8,
         "Td": 6.4,
         "RH": 91,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.1,
         "Td": 6.9,
         "RH": 92,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.8,
         "Td": 8.2,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 8.6,
         "RH": 89,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 9.1,
         "RH": 87,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.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 = 13.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (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.39,
        "why": "crossover: forecast night minimum 7.8 \u00b0C vs afternoon dewpoint 15.7 \u00b0C \u2192 -7.9 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 9.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.104
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.7,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.3,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.1,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.3,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.072
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 4.199999999999999,
       "rh_max": 83,
       "wind_mean": 12.25,
       "wind_after": 11.85,
       "gust_max": 27.2,
       "cloud_mh_night": 54.18181818181818,
       "cloud_low_night": 84.27272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 63.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.1,
       "t_key": 9.2,
       "cooling": 5.9,
       "t_min_night": 8.9,
       "td_afternoon": 13.65,
       "crossover": -4.75,
       "td_drop": 8.65,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 15.7,
         "RH": 94,
         "wind": 11.3,
         "low": 100,
         "mid": 85,
         "high": 58,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 14.8,
         "RH": 90,
         "wind": 11.3,
         "low": 100,
         "mid": 100,
         "high": 28,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.1,
         "Td": 12.1,
         "RH": 82,
         "wind": 13.3,
         "low": 100,
         "mid": 96,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 10.8,
         "RH": 80,
         "wind": 13.9,
         "low": 100,
         "mid": 88,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 8.7,
         "RH": 75,
         "wind": 13.2,
         "low": 93,
         "mid": 87,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 7.5,
         "RH": 74,
         "wind": 13.8,
         "low": 100,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 6.4,
         "RH": 75,
         "wind": 13.8,
         "low": 59,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 5.1,
         "RH": 75,
         "wind": 12.7,
         "low": 44,
         "mid": 0,
         "high": 5,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 6.2,
         "RH": 83,
         "wind": 12.4,
         "low": 80,
         "mid": 5,
         "high": 5,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.3,
         "RH": 82,
         "wind": 12.5,
         "low": 83,
         "mid": 15,
         "high": 92,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 5.0,
         "RH": 75,
         "wind": 11.4,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.4,
         "Td": 5.8,
         "RH": 78,
         "wind": 11.0,
         "low": 58,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 6.1,
         "RH": 77,
         "wind": 12.7,
         "low": 60,
         "mid": 29,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.6,
         "Td": 5.8,
         "RH": 72,
         "wind": 12.1,
         "low": 100,
         "mid": 42,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 5.6,
         "RH": 67,
         "wind": 14.5,
         "low": 81,
         "mid": 42,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.04,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.56,
        "why": "overnight mid+high levels cloud = 54 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.39,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 12.5 mm; BUT dewpoint falls 8.7 \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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 84 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.038
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 12.5,
    "soil_moisture_top": 0.286,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2600097&longitude=-88.0862135&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=42.2600097&longitude=-88.0862135&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:04+00:00",
     "elevation_m": 246.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2600097&longitude=-88.0862135&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:04+00:00",
     "elevation_m": 246.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2600097&longitude=-88.0862135&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:05+00:00",
     "elevation_m": 246.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.2600097&longitude=-88.0862135&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:05+00:00",
     "elevation_m": 246.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.6,
   "dawn_wind_kt": 10.8
  },
  {
   "id": "grant-woods-forest-preserve",
   "name": "Grant Woods Forest Preserve",
   "lat": 42.4114883,
   "lon": -88.1180989,
   "agency": "Lake County Forest Preserves",
   "agency_url": "https://www.lcfpd.org/grant-woods/",
   "dawn_access": "\"Hours: 6:30 am-sunset, daily.\" (LCFP page, Wayback copy 2025-09-14)",
   "dawn_access_ok": true,
   "drone_rule": "LCFP Regulations Governing the General Use of District Property (approved Jan 14 2020, amended Jan 17 2024), Sec. III.A: \"No person shall use District Property for any of the following uses, unless the person has first obtained, and has physical possession of, a Permit allowing such use\"; item (v): \"use of any fuel-powered, air-propulsion, electric powered, radio-controlled, or cellular-controlled unmanned aerial Vehicle (commonly referred to as a \\\"drone\\\"), model or toy car, aircraft, boat or rocket, or any similar toy or model\"; item (xx): \"taking any still or motion pictures ... for commercial purposes or for use in commercial advertising\". LCFP's fee ordinance lists a 'Commercial Photography, Film or Video Permit'. Read from a Wayback copy (2024-02-25) because lcfpd.org returns a Cloudflare 403 to scripted fetches. No drone-specific permit procedure found; the model-aircraft page (archived 2026-02-15) offers only the Van Patten Woods field. A 2014 staff memo, seen only as a search-result excerpt, said drones may not launch or land elsewhere in the preserves.",
   "drone_rule_url": "https://www.lcfpd.org/file.aspx?DocumentId=9028",
   "drone_status": "permit",
   "features": [
    "marsh",
    "prairie",
    "woodland",
    "bog",
    "pond"
   ],
   "features_source": "LCFP page: \"gently rolling landscape of woodlands, prairie and marsh\"; \"a tamarack bog\"; \"springtime ponds\"; 1,226 acres. USGS 3DEP: 779 ft, ring 736-821 ft. Coordinates: Nominatim centroid (relation 11123083); address 25405 W Monaville Rd, Ingleside.",
   "drive_minutes_est": 15,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Not under the Class B shelf; Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 7.1 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 7.1 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. Beyond the Class B shelf at this point.",
   "notes": "LCFP fall hunting or deer-management closures were not researched. Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "marsh and savanna fog from the ground at 6:30 opening; drone needs a Lake County Forest Preserves permit",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.059,
    "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.0 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:53.641862-05:00",
     "est_end": "2026-10-16 07:51:53.641862-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 76 % with visibility 15 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.0,
       "dpd_key": 2.0999999999999996,
       "rh_max": 87,
       "wind_mean": 11.925,
       "wind_after": 11.0,
       "gust_max": 28.0,
       "cloud_mh_night": 31.545454545454547,
       "cloud_low_night": 86.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15200.0,
       "low_sunrise": 75.5,
       "vis_min": 15200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.2,
       "cooling": 6.0,
       "t_min_night": 9.2,
       "td_afternoon": 13.75,
       "crossover": -4.550000000000001,
       "td_drop": 6.65,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0.4,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.7,
         "Td": 15.1,
         "RH": 96,
         "wind": 5.8,
         "low": 100,
         "mid": 8,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.5,
         "Td": 14.1,
         "RH": 91,
         "wind": 11.6,
         "low": 100,
         "mid": 43,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 14.3,
         "Td": 12.7,
         "RH": 90,
         "wind": 11.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14200.0
        },
        {
         "t": "00:00",
         "T": 13.3,
         "Td": 11.3,
         "RH": 88,
         "wind": 12.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "01:00",
         "T": 12.8,
         "Td": 10.4,
         "RH": 85,
         "wind": 14.0,
         "low": 89,
         "mid": 94,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.5,
         "low": 90,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "03:00",
         "T": 11.5,
         "Td": 9.2,
         "RH": 86,
         "wind": 14.6,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "04:00",
         "T": 10.9,
         "Td": 8.6,
         "RH": 86,
         "wind": 14.1,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.4,
         "RH": 87,
         "wind": 12.2,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.6,
         "RH": 85,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 7.1,
         "RH": 87,
         "wind": 8.9,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "08:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "09:00",
         "T": 9.4,
         "Td": 7.2,
         "RH": 86,
         "wind": 11.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 7.1,
         "RH": 81,
         "wind": 13.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 7.0,
         "RH": 83,
         "wind": 12.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \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 = 11.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.85,
        "why": "overnight mid+high levels cloud = 32 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 6.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 = 15.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "precipitation around dawn (0.4 mm): drizzle/rain, not radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.032
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 1.0999999999999996,
       "rh_max": 96,
       "wind_mean": 12.15,
       "wind_after": 12.05,
       "gust_max": 21.8,
       "cloud_mh_night": 88.36363636363636,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 69.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": 17.1,
       "t_key": 8.0,
       "cooling": 9.100000000000001,
       "t_min_night": 8.0,
       "td_afternoon": 15.15,
       "crossover": -7.15,
       "td_drop": 8.25,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "11:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.6,
         "Td": 16.6,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 4680.0
        },
        {
         "t": "22:00",
         "T": 16.4,
         "Td": 16.4,
         "RH": 100,
         "wind": 8.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "23:00",
         "T": 15.0,
         "Td": 15.0,
         "RH": 100,
         "wind": 10.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 13.6,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 12.3,
         "Td": 12.1,
         "RH": 99,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.7,
         "Td": 10.9,
         "RH": 95,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.5,
         "Td": 9.7,
         "RH": 95,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.5,
         "Td": 8.9,
         "RH": 96,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 8.1,
         "RH": 95,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 7.4,
         "RH": 95,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.0,
         "Td": 6.9,
         "RH": 93,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.4,
         "RH": 93,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.8,
         "Td": 8.4,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.2,
         "Td": 8.9,
         "RH": 92,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 9.3,
         "RH": 88,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \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.2 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 = 9.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.0 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -7.2 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 8.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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.107
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3,
       "dpd_key": 4.0,
       "rh_max": 80,
       "wind_mean": 11.6,
       "wind_after": 12.2,
       "gust_max": 29.0,
       "cloud_mh_night": 26.0,
       "cloud_low_night": 74.18181818181819,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 100.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.6,
       "t_key": 10.4,
       "cooling": 5.199999999999999,
       "t_min_night": 10.0,
       "td_afternoon": 14.75,
       "crossover": -4.75,
       "td_drop": 8.35,
       "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": 16.8,
         "Td": 16.5,
         "RH": 98,
         "wind": 7.6,
         "low": 100,
         "mid": 53,
         "high": 46,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.7,
         "Td": 16.4,
         "RH": 98,
         "wind": 10.7,
         "low": 100,
         "mid": 30,
         "high": 64,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 15.0,
         "RH": 96,
         "wind": 12.7,
         "low": 91,
         "mid": 16,
         "high": 50,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.1,
         "Td": 12.8,
         "RH": 92,
         "wind": 14.1,
         "low": 79,
         "mid": 6,
         "high": 21,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.7,
         "Td": 11.0,
         "RH": 89,
         "wind": 14.9,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.7,
         "Td": 9.4,
         "RH": 86,
         "wind": 14.6,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 8.0,
         "RH": 83,
         "wind": 13.7,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.1,
         "Td": 6.8,
         "RH": 80,
         "wind": 12.6,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 6.4,
         "RH": 78,
         "wind": 11.8,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.4,
         "RH": 77,
         "wind": 11.1,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 6.4,
         "RH": 76,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 6.1,
         "RH": 74,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.6,
         "RH": 71,
         "wind": 12.8,
         "low": 94,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 13.6,
         "low": 86,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 5.6,
         "RH": 69,
         "wind": 13.8,
         "low": 81,
         "mid": 27,
         "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.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.92,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.0 \u00b0C vs afternoon dewpoint 14.8 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 8.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 = 80 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.07
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 3.6999999999999993,
       "rh_max": 83,
       "wind_mean": 12.95,
       "wind_after": 12.6,
       "gust_max": 27.0,
       "cloud_mh_night": 60.09090909090909,
       "cloud_low_night": 80.63636363636364,
       "cloud_mh_sunrise": 24.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 59.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.0,
       "t_key": 9.6,
       "cooling": 5.4,
       "t_min_night": 9.2,
       "td_afternoon": 13.600000000000001,
       "crossover": -4.400000000000002,
       "td_drop": 7.700000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.4,
         "low": 100,
         "mid": 83,
         "high": 66,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.2,
         "Td": 14.6,
         "RH": 90,
         "wind": 11.1,
         "low": 100,
         "mid": 100,
         "high": 92,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 12.4,
         "RH": 83,
         "wind": 14.2,
         "low": 100,
         "mid": 93,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.4,
         "Td": 11.2,
         "RH": 81,
         "wind": 14.7,
         "low": 100,
         "mid": 91,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.2,
         "Td": 9.2,
         "RH": 77,
         "wind": 13.0,
         "low": 79,
         "mid": 62,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 8.1,
         "RH": 76,
         "wind": 14.8,
         "low": 100,
         "mid": 12,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 7.0,
         "RH": 76,
         "wind": 14.2,
         "low": 67,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.0,
         "Td": 5.6,
         "RH": 74,
         "wind": 13.4,
         "low": 41,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.2,
         "Td": 6.3,
         "RH": 82,
         "wind": 13.3,
         "low": 57,
         "mid": 0,
         "high": 71,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 6.7,
         "RH": 83,
         "wind": 13.1,
         "low": 80,
         "mid": 31,
         "high": 77,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 5.9,
         "RH": 78,
         "wind": 12.0,
         "low": 63,
         "mid": 21,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 6.2,
         "RH": 77,
         "wind": 13.0,
         "low": 56,
         "mid": 28,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 6.3,
         "RH": 75,
         "wind": 12.2,
         "low": 83,
         "mid": 14,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.2,
         "Td": 6.1,
         "RH": 71,
         "wind": 12.1,
         "low": 99,
         "mid": 43,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 5.9,
         "RH": 68,
         "wind": 14.7,
         "low": 98,
         "mid": 37,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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 = 12.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.5,
        "why": "overnight mid+high levels cloud = 60 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 23.1 mm; BUT dewpoint falls 7.7 \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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 81 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.036
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 23.1,
    "soil_moisture_top": 0.299,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.4114883&longitude=-88.1180989&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=42.4114883&longitude=-88.1180989&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:05+00:00",
     "elevation_m": 242.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.4114883&longitude=-88.1180989&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:05+00:00",
     "elevation_m": 242.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.4114883&longitude=-88.1180989&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:05+00:00",
     "elevation_m": 242.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.4114883&longitude=-88.1180989&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:05+00:00",
     "elevation_m": 242.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.2,
   "dawn_wind_kt": 8.9
  },
  {
   "id": "volo-bog-state-natural-area",
   "name": "Volo Bog State Natural Area",
   "lat": 42.351,
   "lon": -88.189,
   "agency": "Illinois Department of Natural Resources",
   "agency_url": "https://dnr.illinois.gov/parks/park.volobog.html",
   "dawn_access": "IDNR about page: \"Site Hours: Gates open at 8:00 am 363 days a year-closed on Christmas and New Year's Days. Closing time is posted as one enters the parking lot ... plan to be back to the parking lot no later than 30 minutes before sunset.\" Gates open about 1 hr after sunrise.",
   "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.\" (verified at ilga.gov 2026-10-16). No site-specific drone page found. Wording says 'aircraft', not 'drone', 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": [
    "bog",
    "marsh",
    "prairie",
    "woodland"
   ],
   "features_source": "IDNR page: \"Formed in an ancient glacial kettlehole lake, Volo Bog features a floating mat of sphagnum moss, cattails, and sedges surrounding the open water\"; natural area \"includes marshes, prairie restoration areas, woodlands, two other bogs\". USGS 3DEP: 773 ft, ring 739-772 ft. Coordinates: IDNR page Park Latitude/Longitude 42.351/-88.189 (Nominatim: 42.3559,-88.1887).",
   "drive_minutes_est": 19,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Not under the Class B shelf; Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 10.9 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 10.5 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. Beyond the Class B shelf at this point.",
   "notes": "Deer archery hunting at Volo Bog is held in the fall (IDNR activities page); no drones for any aspect of hunting (520 ILCS 5/2.33(i)). Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "Deer archery hunting at Volo Bog is held in the fall (IDNR activities page); no drones for any aspect of hunting (520 ILCS 5/2.33(i)). Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:38",
    "sunrise": "07:07",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:21",
    "sun_12deg": "08:20"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.07,
    "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.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.0 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:22:06.675734-05:00",
     "est_end": "2026-10-16 07:52:06.675734-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.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 60 % with visibility 16 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": null,
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.0,
       "dpd_key": 2.1999999999999993,
       "rh_max": 87,
       "wind_mean": 11.65,
       "wind_after": 11.45,
       "gust_max": 27.6,
       "cloud_mh_night": 29.90909090909091,
       "cloud_low_night": 86.36363636363636,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15500.0,
       "low_sunrise": 60.0,
       "vis_min": 15200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.2,
       "cooling": 6.100000000000001,
       "t_min_night": 9.2,
       "td_afternoon": 13.75,
       "crossover": -4.550000000000001,
       "td_drop": 6.75,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.3,
         "RH": 96,
         "wind": 5.1,
         "low": 100,
         "mid": 27,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.5,
         "Td": 13.9,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 43,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "23:00",
         "T": 14.3,
         "Td": 12.3,
         "RH": 88,
         "wind": 12.2,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "00:00",
         "T": 13.3,
         "Td": 11.3,
         "RH": 88,
         "wind": 12.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "01:00",
         "T": 12.7,
         "Td": 10.6,
         "RH": 87,
         "wind": 12.5,
         "low": 100,
         "mid": 57,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 10.8,
         "RH": 91,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 8.9,
         "RH": 85,
         "wind": 14.6,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "04:00",
         "T": 10.7,
         "Td": 8.7,
         "RH": 87,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 8.0,
         "RH": 86,
         "wind": 12.2,
         "low": 30,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 7.6,
         "RH": 85,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 7.0,
         "RH": 86,
         "wind": 9.3,
         "low": 20,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "08:00",
         "T": 9.6,
         "Td": 7.4,
         "RH": 86,
         "wind": 11.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.1,
         "RH": 85,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 7.2,
         "RH": 81,
         "wind": 13.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18200.0
        },
        {
         "t": "11:00",
         "T": 10.0,
         "Td": 7.1,
         "RH": 82,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \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.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.87,
        "why": "overnight mid+high levels cloud = 30 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 19.3 mm; BUT dewpoint falls 6.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 = 15.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 86 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.054
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.40000000000000036,
       "rh_max": 100,
       "wind_mean": 11.0,
       "wind_after": 11.2,
       "gust_max": 21.6,
       "cloud_mh_night": 88.36363636363636,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 73.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.0,
       "t_key": 6.9,
       "cooling": 10.1,
       "t_min_night": 6.9,
       "td_afternoon": 15.8,
       "crossover": -8.9,
       "td_drop": 9.3,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "not within 4 h",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.4,
         "Td": 16.4,
         "RH": 100,
         "wind": 5.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 4680.0
        },
        {
         "t": "22:00",
         "T": 16.1,
         "Td": 16.1,
         "RH": 100,
         "wind": 7.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "23:00",
         "T": 14.7,
         "Td": 14.7,
         "RH": 100,
         "wind": 8.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 12760.0
        },
        {
         "t": "00:00",
         "T": 13.2,
         "Td": 13.2,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 11.7,
         "RH": 100,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.2,
         "Td": 10.2,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 9.2,
         "Td": 9.2,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 8.4,
         "RH": 100,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 7.7,
         "Td": 7.7,
         "RH": 100,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 7.2,
         "Td": 6.9,
         "RH": 98,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 6.9,
         "Td": 6.5,
         "RH": 97,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 7.4,
         "Td": 7.1,
         "RH": 98,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.2,
         "Td": 8.3,
         "RH": 94,
         "wind": 11.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.0,
         "Td": 9.3,
         "RH": 95,
         "wind": 10.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.0,
         "Td": 9.6,
         "RH": 91,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.1,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.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 = 10.1 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 6.9 \u00b0C vs afternoon dewpoint 15.8 \u00b0C \u2192 -8.9 \u00b0C; rain last 48 h = 19.3 mm; BUT dewpoint falls 9.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 11 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.112
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.000000000000001,
       "dpd_key": 5.2,
       "rh_max": 82,
       "wind_mean": 11.95,
       "wind_after": 12.3,
       "gust_max": 28.6,
       "cloud_mh_night": 18.09090909090909,
       "cloud_low_night": 78.0909090909091,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 85.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 16.4,
       "t_key": 10.0,
       "cooling": 6.399999999999999,
       "t_min_night": 10.0,
       "td_afternoon": 15.35,
       "crossover": -5.35,
       "td_drop": 10.55,
       "airmass_change": true,
       "precip_night_mm": 0.7000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.4,
         "Td": 17.1,
         "RH": 98,
         "wind": 9.4,
         "low": 89,
         "mid": 43,
         "high": 28,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.2,
         "Td": 16.7,
         "RH": 97,
         "wind": 12.4,
         "low": 82,
         "mid": 23,
         "high": 41,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.9,
         "Td": 15.0,
         "RH": 94,
         "wind": 14.0,
         "low": 80,
         "mid": 12,
         "high": 32,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.1,
         "Td": 12.6,
         "RH": 91,
         "wind": 14.7,
         "low": 79,
         "mid": 5,
         "high": 14,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 10.6,
         "RH": 88,
         "wind": 14.8,
         "low": 77,
         "mid": 1,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.5,
         "Td": 9.3,
         "RH": 86,
         "wind": 14.3,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 8.2,
         "RH": 84,
         "wind": 13.2,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 7.3,
         "RH": 82,
         "wind": 12.4,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 6.4,
         "RH": 78,
         "wind": 11.9,
         "low": 73,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.0,
         "Td": 5.4,
         "RH": 73,
         "wind": 11.8,
         "low": 84,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.0,
         "Td": 4.8,
         "RH": 70,
         "wind": 11.7,
         "low": 89,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 4.7,
         "RH": 69,
         "wind": 11.9,
         "low": 81,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.5,
         "Td": 5.2,
         "RH": 70,
         "wind": 12.7,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 5.5,
         "RH": 70,
         "wind": 13.0,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 10.9,
         "Td": 5.7,
         "RH": 70,
         "wind": 13.4,
         "low": 53,
         "mid": 23,
         "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.05,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.9 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 = 6.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.0 \u00b0C vs afternoon dewpoint 15.3 \u00b0C \u2192 -5.3 \u00b0C; rain last 48 h = 19.3 mm; BUT dewpoint falls 10.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 = 82 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.075
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 3.8000000000000007,
       "rh_max": 83,
       "wind_mean": 12.7,
       "wind_after": 12.25,
       "gust_max": 26.0,
       "cloud_mh_night": 56.09090909090909,
       "cloud_low_night": 82.27272727272727,
       "cloud_mh_sunrise": 6.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 59.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.4,
       "cooling": 5.5,
       "t_min_night": 8.9,
       "td_afternoon": 13.600000000000001,
       "crossover": -4.700000000000001,
       "td_drop": 8.000000000000002,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.3,
         "Td": 15.4,
         "RH": 94,
         "wind": 9.8,
         "low": 100,
         "mid": 82,
         "high": 63,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.2,
         "Td": 14.4,
         "RH": 89,
         "wind": 11.9,
         "low": 99,
         "mid": 100,
         "high": 71,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.1,
         "Td": 12.0,
         "RH": 82,
         "wind": 14.0,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 10.6,
         "RH": 79,
         "wind": 14.8,
         "low": 100,
         "mid": 93,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 8.7,
         "RH": 75,
         "wind": 13.3,
         "low": 89,
         "mid": 54,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.0,
         "Td": 7.5,
         "RH": 74,
         "wind": 14.3,
         "low": 100,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 6.3,
         "RH": 74,
         "wind": 14.1,
         "low": 56,
         "mid": 6,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.4,
         "Td": 5.2,
         "RH": 75,
         "wind": 13.5,
         "low": 41,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.9,
         "Td": 6.2,
         "RH": 83,
         "wind": 12.9,
         "low": 74,
         "mid": 3,
         "high": 50,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.3,
         "RH": 82,
         "wind": 12.7,
         "low": 81,
         "mid": 23,
         "high": 74,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 5.6,
         "RH": 77,
         "wind": 11.7,
         "low": 65,
         "mid": 6,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.7,
         "Td": 6.0,
         "RH": 78,
         "wind": 11.6,
         "low": 53,
         "mid": 6,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.3,
         "Td": 6.4,
         "RH": 77,
         "wind": 12.9,
         "low": 70,
         "mid": 20,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 6.2,
         "RH": 73,
         "wind": 11.7,
         "low": 92,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.4,
         "Td": 5.3,
         "RH": 66,
         "wind": 14.8,
         "low": 97,
         "mid": 43,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.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.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 = 5.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 19.3 mm; BUT dewpoint falls 8.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 82 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.037
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 19.3,
    "soil_moisture_top": 0.293,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.351&longitude=-88.189&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=42.351&longitude=-88.189&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:05+00:00",
     "elevation_m": 234.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.351&longitude=-88.189&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:05+00:00",
     "elevation_m": 234.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.351&longitude=-88.189&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:05+00:00",
     "elevation_m": 234.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.351&longitude=-88.189&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:05+00:00",
     "elevation_m": 234.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 9.2,
   "dawn_wind_kt": 9.3
  },
  {
   "id": "chain-o-lakes-state-park",
   "name": "Chain O'Lakes State Park",
   "lat": 42.467,
   "lon": -88.189,
   "agency": "Illinois Department of Natural Resources",
   "agency_url": "https://dnr.illinois.gov/parks/park.chainolakes.html",
   "dawn_access": "IDNR: \"Summer hours 6:00 a.m. to 9:00 p.m. Winter hours: 8:00 a.m. to sunset. Summer hours take effect April 1st and terminate the last weekend in October when hunting begins and the entire park is closed for hunting. Hunting is by registration only. Entrance gates will be locked from 10:00 pm to 6:00 am during summer hours and sunset to 8 am during winter hours.\"",
   "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.\" (verified at ilga.gov 2026-10-16). No site-specific drone page found. Wording says 'aircraft', not 'drone', 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": [
    "lake",
    "river",
    "marsh",
    "backwater"
   ],
   "features_source": "IDNR page: \"6,500 acres of water and 488 miles of shoreline, Chain O' Lakes State Park is the heart of a water wonderland\"; page also mentions marsh. USGS 3DEP: 802 ft, ring 737-875 ft. Coordinates: IDNR page Park Latitude/Longitude 42.467/-88.189 (Nominatim: 42.4585,-88.1768).",
   "drive_minutes_est": 30,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Not under the Class B shelf; Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; outside the O'Hare Mode C veil; surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 10.5 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 10.3 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft. OUTSIDE the O'Hare Mode C veil here (32 nm from ORD).",
   "notes": "OUTSIDE the 20-minute target (OSRM 29.6 min); kept because the ticket asked for it. Dawn access is undecided: summer hours (gate open from 6:00 am) apply until 'the last weekend in October', which falls on Oct 24-25 or Oct 31-Nov 1 depending on reading, and then the park closes entirely for hunting. Next-week dates are at risk. Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "OUTSIDE the 20-minute target (OSRM 29.6 min); kept because the ticket asked for it. Dawn access is undecided: summer hours (gate open from 6:00 am) apply until 'the last weekend in October', which falls on Oct 24-25 or Oct 31-Nov 1 depending on reading, and then the park closes entirely for hunting. Next-week dates are at risk. Sunrise at Grayslake is about 7:08-7:15 am CDT on Oct 19-25 2026 (my NOAA-formula estimate, +/-2 min); clocks fall back Nov 1 (sunrise then ~6:24 CST). Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:38",
    "sunrise": "07:07",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 13.0,
    "sun_2deg": "07:21",
    "sun_12deg": "08:20"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.073,
    "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.051,
    "confidence": "high",
    "confidence_why": "4 models within 0.05 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.0 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:22:14.345994-05:00",
     "est_end": "2026-10-16 07:52:14.345994-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 87 % with visibility 15 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 9.1,
     "likely": false,
     "why": "river water +9.1 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 12 kt)",
     "gauge": "FOX RIVER NEAR MCHENRY, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.0,
       "dpd_key": 2.0,
       "rh_max": 87,
       "wind_mean": 11.825,
       "wind_after": 11.45,
       "gust_max": 27.6,
       "cloud_mh_night": 21.818181818181817,
       "cloud_low_night": 86.81818181818181,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15100.0,
       "low_sunrise": 87.0,
       "vis_min": 15100.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 8.9,
       "cooling": 6.0,
       "t_min_night": 8.9,
       "td_afternoon": 13.600000000000001,
       "crossover": -4.700000000000001,
       "td_drop": 6.700000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.4,
         "Td": 14.8,
         "RH": 96,
         "wind": 4.1,
         "low": 89,
         "mid": 10,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.2,
         "Td": 13.6,
         "RH": 90,
         "wind": 12.5,
         "low": 100,
         "mid": 28,
         "high": 0,
         "vis": 13900.0
        },
        {
         "t": "23:00",
         "T": 13.9,
         "Td": 12.1,
         "RH": 89,
         "wind": 12.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "00:00",
         "T": 13.1,
         "Td": 11.3,
         "RH": 89,
         "wind": 12.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "01:00",
         "T": 12.7,
         "Td": 10.1,
         "RH": 84,
         "wind": 14.8,
         "low": 88,
         "mid": 2,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 8.9,
         "RH": 85,
         "wind": 14.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 13.4,
         "low": 40,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 8.1,
         "RH": 87,
         "wind": 12.2,
         "low": 77,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 7.3,
         "RH": 84,
         "wind": 12.4,
         "low": 87,
         "mid": 0,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 6.9,
         "RH": 87,
         "wind": 9.3,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "08:00",
         "T": 9.5,
         "Td": 7.4,
         "RH": 87,
         "wind": 11.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "09:00",
         "T": 9.3,
         "Td": 7.2,
         "RH": 87,
         "wind": 11.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "10:00",
         "T": 9.8,
         "Td": 6.9,
         "RH": 82,
         "wind": 13.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17400.0
        },
        {
         "t": "11:00",
         "T": 9.6,
         "Td": 6.9,
         "RH": 83,
         "wind": 13.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.06,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.8 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 = 6.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 20.0 mm; BUT dewpoint falls 6.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 = 15.1 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.056
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.6000000000000014,
       "dpd_key": 1.0,
       "rh_max": 96,
       "wind_mean": 12.2,
       "wind_after": 12.0,
       "gust_max": 22.2,
       "cloud_mh_night": 86.27272727272727,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 65.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 16.7,
       "t_key": 7.5,
       "cooling": 9.2,
       "t_min_night": 7.5,
       "td_afternoon": 15.25,
       "crossover": -7.75,
       "td_drop": 8.75,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "11:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.3,
         "Td": 16.3,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 4680.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 15.9,
         "RH": 100,
         "wind": 8.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 14.5,
         "RH": 100,
         "wind": 10.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 12760.0
        },
        {
         "t": "00:00",
         "T": 13.1,
         "Td": 13.1,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.8,
         "Td": 11.7,
         "RH": 99,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 10.6,
         "Td": 10.2,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 9.6,
         "Td": 9.0,
         "RH": 96,
         "wind": 13.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 8.8,
         "Td": 8.2,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 7.5,
         "RH": 95,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 7.7,
         "Td": 6.8,
         "RH": 94,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 7.5,
         "Td": 6.5,
         "RH": 93,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.0,
         "RH": 95,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 8.1,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.3,
         "Td": 9.1,
         "RH": 92,
         "wind": 11.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "11:00",
         "T": 11.2,
         "Td": 9.1,
         "RH": 87,
         "wind": 12.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \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.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.24,
        "why": "overnight total cloud (levels unavailable) cloud = 86 % (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.4,
        "why": "crossover: forecast night minimum 7.5 \u00b0C vs afternoon dewpoint 15.2 \u00b0C \u2192 -7.8 \u00b0C; rain last 48 h = 20.0 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.107
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 2.7,
       "dpd_key": 4.800000000000001,
       "rh_max": 83,
       "wind_mean": 12.725000000000001,
       "wind_after": 13.45,
       "gust_max": 28.2,
       "cloud_mh_night": 31.181818181818183,
       "cloud_low_night": 74.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 90.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.8,
       "t_key": 10.4,
       "cooling": 5.4,
       "t_min_night": 9.9,
       "td_afternoon": 14.899999999999999,
       "crossover": -4.999999999999998,
       "td_drop": 9.299999999999999,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.300000000000068,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.2,
         "Td": 15.9,
         "RH": 98,
         "wind": 9.0,
         "low": 87,
         "mid": 63,
         "high": 74,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 15.5,
         "RH": 97,
         "wind": 12.4,
         "low": 82,
         "mid": 41,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.0,
         "Td": 14.1,
         "RH": 94,
         "wind": 14.3,
         "low": 78,
         "mid": 24,
         "high": 78,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 12.2,
         "RH": 90,
         "wind": 15.0,
         "low": 74,
         "mid": 10,
         "high": 33,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 15.3,
         "low": 71,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.6,
         "Td": 9.2,
         "RH": 85,
         "wind": 15.1,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.6,
         "Td": 8.2,
         "RH": 85,
         "wind": 14.3,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.0,
         "Td": 7.3,
         "RH": 83,
         "wind": 13.4,
         "low": 62,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 6.7,
         "RH": 80,
         "wind": 12.9,
         "low": 69,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 5.9,
         "RH": 75,
         "wind": 12.3,
         "low": 81,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 12.3,
         "low": 89,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.5,
         "Td": 5.3,
         "RH": 70,
         "wind": 12.9,
         "low": 91,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 5.4,
         "RH": 70,
         "wind": 14.0,
         "low": 90,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.5,
         "RH": 70,
         "wind": 15.0,
         "low": 86,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 10.8,
         "Td": 6.0,
         "RH": 72,
         "wind": 15.4,
         "low": 77,
         "mid": 20,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.22,
        "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.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.85,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.4 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 14.9 \u00b0C \u2192 -5.0 \u00b0C; rain last 48 h = 20.0 mm; BUT dewpoint falls 9.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 = 83 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 13 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.5999999999999996,
       "dpd_key": 3.799999999999999,
       "rh_max": 84,
       "wind_mean": 13.7,
       "wind_after": 13.65,
       "gust_max": 26.2,
       "cloud_mh_night": 58.72727272727273,
       "cloud_low_night": 78.27272727272727,
       "cloud_mh_sunrise": 25.5,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 54.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.7,
       "t_key": 9.2,
       "cooling": 5.5,
       "t_min_night": 8.7,
       "td_afternoon": 13.55,
       "crossover": -4.850000000000001,
       "td_drop": 8.15,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.400000000000091,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.4,
         "Td": 14.8,
         "RH": 96,
         "wind": 8.1,
         "low": 100,
         "mid": 90,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 15.6,
         "Td": 13.8,
         "RH": 89,
         "wind": 12.3,
         "low": 100,
         "mid": 86,
         "high": 79,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 14.8,
         "Td": 12.5,
         "RH": 86,
         "wind": 15.2,
         "low": 98,
         "mid": 81,
         "high": 3,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 10.2,
         "RH": 80,
         "wind": 16.7,
         "low": 100,
         "mid": 85,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.6,
         "Td": 8.7,
         "RH": 77,
         "wind": 14.8,
         "low": 91,
         "mid": 9,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.5,
         "Td": 7.4,
         "RH": 76,
         "wind": 16.0,
         "low": 81,
         "mid": 28,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.5,
         "Td": 5.8,
         "RH": 73,
         "wind": 15.2,
         "low": 54,
         "mid": 7,
         "high": 1,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 5.4,
         "RH": 77,
         "wind": 14.6,
         "low": 39,
         "mid": 4,
         "high": 68,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 6.1,
         "RH": 84,
         "wind": 14.1,
         "low": 59,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.9,
         "Td": 6.2,
         "RH": 83,
         "wind": 13.5,
         "low": 80,
         "mid": 30,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 5.4,
         "RH": 77,
         "wind": 12.6,
         "low": 59,
         "mid": 30,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 6.1,
         "RH": 78,
         "wind": 12.8,
         "low": 49,
         "mid": 21,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 6.1,
         "RH": 76,
         "wind": 14.5,
         "low": 80,
         "mid": 32,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 6.5,
         "RH": 74,
         "wind": 13.1,
         "low": 60,
         "mid": 53,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 6.1,
         "RH": 71,
         "wind": 14.7,
         "low": 97,
         "mid": 44,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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 = 13.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.5 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.7 \u00b0C vs afternoon dewpoint 13.6 \u00b0C \u2192 -4.9 \u00b0C; rain last 48 h = 20.0 mm; BUT dewpoint falls 8.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 = 84 %"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 14 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.062
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 20.0,
    "soil_moisture_top": 0.281,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.467&longitude=-88.189&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=42.467&longitude=-88.189&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:05+00:00",
     "elevation_m": 247.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.467&longitude=-88.189&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:05+00:00",
     "elevation_m": 247.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.467&longitude=-88.189&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:05+00:00",
     "elevation_m": 247.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.467&longitude=-88.189&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:05+00:00",
     "elevation_m": 247.0
    }
   },
   "water_temp_c": 18.0,
   "dawn_temp_c": 8.9,
   "dawn_wind_kt": 9.3
  },
  {
   "id": "third-lake",
   "name": "Third Lake",
   "lat": 42.3739105,
   "lon": -88.0109121,
   "agency": null,
   "agency_url": null,
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No rule found; no managing agency identified.",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "lake"
   ],
   "features_source": "Named lake in OSM (relation 125682); Nominatim centroid is the lake centre, not a shore access point. Terrain from USGS 3DEP not summarised for open water.",
   "drive_minutes_est": 11,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.0 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 2.6 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.073,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:25.412753-05:00",
     "est_end": "2026-10-16 07:51:25.412753-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 62 % with visibility 16 km (stratus, not fog) \u2014 flat grey, no beams"
    },
    "steam_fog": {
     "delta_c": 8.7,
     "likely": false,
     "why": "river water +8.7 \u00b0C warmer than the forecast dawn air (steam fog over open water needs roughly \u22655 \u00b0C and light wind; forecast wind 12 kt)",
     "gauge": "FOX RIVER NEAR MCHENRY, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.0999999999999996,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 11.75,
       "wind_after": 11.05,
       "gust_max": 29.5,
       "cloud_mh_night": 29.636363636363637,
       "cloud_low_night": 86.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 15900.0,
       "low_sunrise": 61.5,
       "vis_min": 15300.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.3,
       "cooling": 6.0,
       "t_min_night": 9.3,
       "td_afternoon": 13.7,
       "crossover": -4.399999999999999,
       "td_drop": 6.799999999999999,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.8,
         "Td": 15.4,
         "RH": 97,
         "wind": 7.1,
         "low": 100,
         "mid": 14,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.3,
         "RH": 91,
         "wind": 11.7,
         "low": 100,
         "mid": 28,
         "high": 0,
         "vis": 13800.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.7,
         "low": 100,
         "mid": 84,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.5,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 13.0,
         "Td": 10.7,
         "RH": 86,
         "wind": 13.6,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.9,
         "low": 72,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 9.6,
         "RH": 87,
         "wind": 14.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15100.0
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 8.6,
         "RH": 85,
         "wind": 13.8,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 11.6,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "06:00",
         "T": 10.1,
         "Td": 7.7,
         "RH": 85,
         "wind": 12.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 6.9,
         "RH": 85,
         "wind": 9.5,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 15900.0
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 11.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 7.5,
         "RH": 87,
         "wind": 10.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.4,
         "RH": 82,
         "wind": 12.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "11:00",
         "T": 9.7,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.06,
        "why": "mean 10 m wind in the 3 h before sunrise = 11.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.87,
        "why": "overnight mid+high levels cloud = 30 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.4 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.3 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 87 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.053
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.29999999999999893,
       "dpd_key": 0.8999999999999995,
       "rh_max": 98,
       "wind_mean": 12.25,
       "wind_after": 12.0,
       "gust_max": 21.4,
       "cloud_mh_night": 89.63636363636364,
       "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": 11,
       "first_sat_hour": "21:00",
       "t_evening": 17.0,
       "t_key": 8.1,
       "cooling": 8.9,
       "t_min_night": 8.1,
       "td_afternoon": 15.65,
       "crossover": -7.550000000000001,
       "td_drop": 8.45,
       "airmass_change": true,
       "precip_night_mm": 0.5,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.3,
         "Td": 15.3,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.8,
         "Td": 13.8,
         "RH": 100,
         "wind": 10.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.4,
         "Td": 12.4,
         "RH": 100,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 11.0,
         "RH": 97,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.3,
         "Td": 9.9,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.3,
         "Td": 9.0,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.7,
         "Td": 8.4,
         "RH": 98,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.3,
         "Td": 7.7,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.1,
         "Td": 7.2,
         "RH": 94,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.1,
         "Td": 7.5,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 8.5,
         "RH": 91,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 9.1,
         "RH": 90,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 9.4,
         "RH": 87,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \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.2 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 = 8.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.1 \u00b0C vs afternoon dewpoint 15.7 \u00b0C \u2192 -7.6 \u00b0C; rain last 48 h = 17.5 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.799999999999999,
       "dpd_key": 3.5,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.4,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.75,
       "crossover": -4.65,
       "td_drop": 7.85,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.4,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.4,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.7,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.4,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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 = 13.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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.035
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3739105&longitude=-88.0109121&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=42.3739105&longitude=-88.0109121&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:05+00:00",
     "elevation_m": 240.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3739105&longitude=-88.0109121&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:05+00:00",
     "elevation_m": 240.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3739105&longitude=-88.0109121&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:05+00:00",
     "elevation_m": 240.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3739105&longitude=-88.0109121&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:05+00:00",
     "elevation_m": 240.0
    }
   },
   "water_temp_c": 18.0,
   "dawn_temp_c": 9.3,
   "dawn_wind_kt": 9.5
  },
  {
   "id": "gages-lake",
   "name": "Gages Lake",
   "lat": 42.3534726,
   "lon": -87.9819737,
   "agency": null,
   "agency_url": null,
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No rule found; no managing agency identified.",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "lake"
   ],
   "features_source": "Named lake in OSM (relation 122063); Nominatim centroid is the lake centre, not a shore access point. Terrain from USGS 3DEP not summarised for open water.",
   "drive_minutes_est": 9,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 2.5 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 2.2 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.068,
    "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.073,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:17.112457-05:00",
     "est_end": "2026-10-16 07:51:17.112457-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 62 % with visibility 16 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 12 kt)",
     "gauge": "FOX RIVER NEAR MCHENRY, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.0999999999999996,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 12.025,
       "wind_after": 11.05,
       "gust_max": 29.9,
       "cloud_mh_night": 30.727272727272727,
       "cloud_low_night": 87.9090909090909,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16100.0,
       "low_sunrise": 61.5,
       "vis_min": 15400.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.5,
       "cooling": 5.699999999999999,
       "t_min_night": 9.5,
       "td_afternoon": 13.7,
       "crossover": -4.199999999999999,
       "td_drop": 6.6,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.0,
         "Td": 15.5,
         "RH": 97,
         "wind": 7.7,
         "low": 100,
         "mid": 10,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.9,
         "Td": 14.2,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "23:00",
         "T": 14.6,
         "Td": 13.0,
         "RH": 90,
         "wind": 11.9,
         "low": 100,
         "mid": 89,
         "high": 0,
         "vis": 14000.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 11.7,
         "RH": 88,
         "wind": 12.8,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 11.0,
         "RH": 87,
         "wind": 13.5,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "02:00",
         "T": 12.1,
         "Td": 9.8,
         "RH": 86,
         "wind": 12.0,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.7,
         "Td": 10.0,
         "RH": 89,
         "wind": 13.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 8.6,
         "RH": 84,
         "wind": 13.9,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": 16500.0
        },
        {
         "t": "05:00",
         "T": 10.7,
         "Td": 8.6,
         "RH": 87,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 7.8,
         "RH": 85,
         "wind": 12.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.1,
         "RH": 85,
         "wind": 10.0,
         "low": 23,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 11.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "10:00",
         "T": 10.4,
         "Td": 7.4,
         "RH": 82,
         "wind": 11.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 17700.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \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.86,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.7 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 13.7 \u00b0C \u2192 -4.2 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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.4 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.052
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.3000000000000007,
       "dpd_key": 1.1000000000000005,
       "rh_max": 98,
       "wind_mean": 12.4,
       "wind_after": 12.149999999999999,
       "gust_max": 21.4,
       "cloud_mh_night": 90.45454545454545,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 72.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": 16.9,
       "t_key": 8.3,
       "cooling": 8.599999999999998,
       "t_min_night": 8.3,
       "td_afternoon": 15.45,
       "crossover": -7.149999999999999,
       "td_drop": 8.25,
       "airmass_change": true,
       "precip_night_mm": 0.3,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.9,
         "Td": 16.9,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.8,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.4,
         "Td": 15.4,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.9,
         "Td": 13.9,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.5,
         "Td": 12.3,
         "RH": 99,
         "wind": 11.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 10.8,
         "RH": 97,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.4,
         "Td": 9.8,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.4,
         "Td": 9.1,
         "RH": 98,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.8,
         "Td": 8.3,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.5,
         "Td": 7.9,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.3,
         "Td": 7.2,
         "RH": 93,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.3,
         "RH": 93,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.2,
         "Td": 8.5,
         "RH": 89,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 8.8,
         "RH": 88,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.5,
         "Td": 9.0,
         "RH": 85,
         "wind": 12.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 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 = 8.6 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.3 \u00b0C vs afternoon dewpoint 15.4 \u00b0C \u2192 -7.1 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.3000000000000007,
       "dpd_key": 4.4,
       "rh_max": 80,
       "wind_mean": 11.625,
       "wind_after": 11.399999999999999,
       "gust_max": 28.0,
       "cloud_mh_night": 11.818181818181818,
       "cloud_low_night": 71.27272727272727,
       "cloud_mh_sunrise": 0.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": 16.2,
       "t_key": 10.3,
       "cooling": 5.899999999999999,
       "t_min_night": 10.2,
       "td_afternoon": 15.0,
       "crossover": -4.800000000000001,
       "td_drop": 9.1,
       "airmass_change": true,
       "precip_night_mm": 1.4000000000000001,
       "precip_dawn_mm": 0,
       "pressure_trend": 7.600000000000023,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 17.9,
         "Td": 17.8,
         "RH": 99,
         "wind": 7.6,
         "low": 100,
         "mid": 35,
         "high": 6,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 17.9,
         "Td": 17.6,
         "RH": 98,
         "wind": 9.9,
         "low": 100,
         "mid": 9,
         "high": 13,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 16.6,
         "Td": 16.0,
         "RH": 96,
         "wind": 11.5,
         "low": 93,
         "mid": 5,
         "high": 10,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.6,
         "Td": 13.4,
         "RH": 92,
         "wind": 13.0,
         "low": 82,
         "mid": 13,
         "high": 4,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.9,
         "Td": 11.2,
         "RH": 89,
         "wind": 13.9,
         "low": 71,
         "mid": 17,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.6,
         "RH": 86,
         "wind": 14.0,
         "low": 61,
         "mid": 13,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 13.1,
         "low": 51,
         "mid": 5,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.4,
         "Td": 7.1,
         "RH": 80,
         "wind": 12.3,
         "low": 46,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 6.5,
         "RH": 78,
         "wind": 11.7,
         "low": 51,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.2,
         "Td": 6.2,
         "RH": 76,
         "wind": 11.4,
         "low": 61,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 5.9,
         "RH": 74,
         "wind": 11.1,
         "low": 68,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 5.6,
         "RH": 72,
         "wind": 11.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.6,
         "Td": 5.4,
         "RH": 70,
         "wind": 11.6,
         "low": 60,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.8,
         "Td": 5.4,
         "RH": 69,
         "wind": 11.7,
         "low": 56,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 12.1,
         "low": 57,
         "mid": 32,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.1,
        "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.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": 1.0,
        "why": "overnight mid+high levels cloud = 12 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.2 \u00b0C vs afternoon dewpoint 15.0 \u00b0C \u2192 -4.8 \u00b0C; rain last 48 h = 17.5 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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.073
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.799999999999999,
       "dpd_key": 3.5,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.4,
       "cooling": 5.799999999999999,
       "t_min_night": 9.1,
       "td_afternoon": 13.8,
       "crossover": -4.700000000000001,
       "td_drop": 7.9,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.4,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.8,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.6,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.4,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.4,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.3,
         "Td": 8.0,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.4,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.1,
         "Td": 5.7,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.4,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 5.9,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 6.6,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.0,
         "Td": 5.7,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 5.6,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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 = 13.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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.035
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3534726&longitude=-87.9819737&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=42.3534726&longitude=-87.9819737&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:05+00:00",
     "elevation_m": 239.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3534726&longitude=-87.9819737&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:05+00:00",
     "elevation_m": 239.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3534726&longitude=-87.9819737&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:05+00:00",
     "elevation_m": 239.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3534726&longitude=-87.9819737&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:05+00:00",
     "elevation_m": 239.0
    }
   },
   "water_temp_c": 18.0,
   "dawn_temp_c": 9.5,
   "dawn_wind_kt": 10.0
  },
  {
   "id": "fourth-lake",
   "name": "Fourth Lake",
   "lat": 42.3912897,
   "lon": -88.0333753,
   "agency": null,
   "agency_url": null,
   "dawn_access": null,
   "dawn_access_ok": null,
   "drone_rule": "No rule found; no managing agency identified.",
   "drone_rule_url": null,
   "drone_status": "unknown",
   "features": [
    "lake"
   ],
   "features_source": "Named lake in OSM (relation 151493); Nominatim centroid is the lake centre, not a shore access point. Terrain from USGS 3DEP not summarised for open water.",
   "drive_minutes_est": 14,
   "airspace_note": "FAA Class_Airspace + UAS Facility Map query 2026-10-16 at the geocoded point: Chicago Class B shelf above, floor 3,600 ft MSL (about 2,800 ft above ground); Chicago Class E5 (floor 700 ft AGL) and Illinois Class E5; inside the O'Hare Mode C veil (surface-10,000 ft MSL); surface is Class G. Not inside KUGN Class D or its Class E2 surface area (boundary about 3.6 nm away); no UAS Facility Map grid at the point (nearest KUGN grid about 3.3 nm, ceiling 400 ft), so no LAANC needed at 400 ft AGL or below. Not in any TFR (none in IL/WI/IN on the live list) or national-security restriction (FAA 99.7 list has no Lake County IL entry). Distances are from the geocoded point, +/-0.3 nm: re-check at the real launch point in B4UFLY/Aloft.",
   "notes": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "look": "No public-access page, boat launch or shoreline park was identified, so this is a view-from-elsewhere candidate only. Drive time is an OSRM public-router estimate from Grayslake centre (42.3447,-88.0418), not a measurement.",
   "evidence": "research/D-grayslake-locations.md",
   "sun": {
    "civil_dawn": "06:37",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "night_length_h": 12.9,
    "sun_2deg": "07:20",
    "sun_12deg": "08:19"
   },
   "score": {
    "fog_probability": 0.01,
    "raw_blend": 0.059,
    "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.077,
    "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.1 \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 KUGN 07:00 (run 2026-10-15 19:00): no level saturated (T\u2212Td \u2264 1 \u00b0C), temperature change 10 m \u2192 80 m: -0.4 \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:31.956473-05:00",
     "est_end": "2026-10-16 07:51:31.956473-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 66 % with visibility 16 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 12 kt)",
     "gauge": "FOX RIVER NEAR MCHENRY, IL"
    },
    "photo_score": 0.0,
    "grade": "F",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.1000000000000014,
       "dpd_key": 2.4000000000000004,
       "rh_max": 87,
       "wind_mean": 11.55,
       "wind_after": 10.850000000000001,
       "gust_max": 29.2,
       "cloud_mh_night": 31.0,
       "cloud_low_night": 88.27272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 16000.0,
       "low_sunrise": 65.5,
       "vis_min": 15500.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 9.5,
       "cooling": 5.800000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 13.8,
       "crossover": -4.300000000000001,
       "td_drop": 6.700000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0.4,
       "pressure_trend": 7.599999999999909,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 15.8,
         "Td": 15.3,
         "RH": 97,
         "wind": 5.9,
         "low": 100,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "22:00",
         "T": 15.8,
         "Td": 14.4,
         "RH": 91,
         "wind": 11.5,
         "low": 100,
         "mid": 38,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 12.9,
         "RH": 90,
         "wind": 11.5,
         "low": 100,
         "mid": 92,
         "high": 0,
         "vis": 14100.0
        },
        {
         "t": "00:00",
         "T": 13.6,
         "Td": 11.6,
         "RH": 88,
         "wind": 12.4,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "01:00",
         "T": 13.1,
         "Td": 11.0,
         "RH": 87,
         "wind": 13.1,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "02:00",
         "T": 12.2,
         "Td": 9.9,
         "RH": 86,
         "wind": 11.6,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "03:00",
         "T": 11.8,
         "Td": 9.9,
         "RH": 88,
         "wind": 13.1,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "04:00",
         "T": 11.2,
         "Td": 8.6,
         "RH": 84,
         "wind": 13.2,
         "low": 74,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "05:00",
         "T": 10.8,
         "Td": 8.7,
         "RH": 87,
         "wind": 11.6,
         "low": 92,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 7.9,
         "RH": 85,
         "wind": 11.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.1,
         "RH": 85,
         "wind": 9.5,
         "low": 31,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.7,
         "RH": 86,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 10.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "10:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 18000.0
        },
        {
         "t": "11:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 12.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \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.85,
        "why": "overnight mid+high levels cloud = 31 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.3 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 6.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 = 15.5 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       },
       {
        "mult": 0.6,
        "why": "precipitation around dawn (0.4 mm): drizzle/rain, not radiation fog"
       },
       {
        "mult": 0.6,
        "why": "low cloud deck 88 % overnight with good visibility: stratus, not fog"
       }
      ],
      "raw": 0.031
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 0.3999999999999986,
       "dpd_key": 0.9000000000000004,
       "rh_max": 97,
       "wind_mean": 12.4,
       "wind_after": 12.149999999999999,
       "gust_max": 21.4,
       "cloud_mh_night": 88.54545454545455,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 68.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 16200.0,
       "low_sunrise": null,
       "vis_min": 16200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 11,
       "first_sat_hour": "21:00",
       "t_evening": 16.9,
       "t_key": 8.0,
       "cooling": 8.899999999999999,
       "t_min_night": 8.0,
       "td_afternoon": 15.5,
       "crossover": -7.5,
       "td_drop": 8.4,
       "airmass_change": true,
       "precip_night_mm": 0.8,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.7,
         "Td": 16.7,
         "RH": 100,
         "wind": 6.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "22:00",
         "T": 16.6,
         "Td": 16.6,
         "RH": 100,
         "wind": 7.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "23:00",
         "T": 15.2,
         "Td": 15.2,
         "RH": 100,
         "wind": 9.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "00:00",
         "T": 13.7,
         "Td": 13.7,
         "RH": 100,
         "wind": 10.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14480.0
        },
        {
         "t": "01:00",
         "T": 12.3,
         "Td": 12.2,
         "RH": 99,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 10.9,
         "RH": 97,
         "wind": 12.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "03:00",
         "T": 10.2,
         "Td": 9.6,
         "RH": 96,
         "wind": 13.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.2,
         "Td": 8.8,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 8.6,
         "Td": 8.2,
         "RH": 97,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 8.3,
         "Td": 7.7,
         "RH": 96,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "07:00",
         "T": 8.0,
         "Td": 7.1,
         "RH": 94,
         "wind": 11.5,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "08:00",
         "T": 8.2,
         "Td": 7.3,
         "RH": 94,
         "wind": 12.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "09:00",
         "T": 10.1,
         "Td": 8.4,
         "RH": 89,
         "wind": 12.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 10.7,
         "Td": 9.0,
         "RH": 89,
         "wind": 11.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 11.6,
         "Td": 9.4,
         "RH": 86,
         "wind": 13.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.03,
        "why": "mean 10 m wind in the 3 h before sunrise = 12.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.21,
        "why": "overnight total cloud (levels unavailable) cloud = 89 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 8.0 \u00b0C vs afternoon dewpoint 15.5 \u00b0C \u2192 -7.5 \u00b0C; rain last 48 h = 17.5 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.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [
       {
        "mult": 0.25,
        "why": "wind 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.108
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 3.299999999999999,
       "dpd_key": 4.0,
       "rh_max": 80,
       "wind_mean": 11.6,
       "wind_after": 12.2,
       "gust_max": 29.0,
       "cloud_mh_night": 26.0,
       "cloud_low_night": 74.18181818181819,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 100.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.7,
       "t_key": 10.5,
       "cooling": 5.199999999999999,
       "t_min_night": 10.1,
       "td_afternoon": 14.75,
       "crossover": -4.65,
       "td_drop": 8.25,
       "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": 16.9,
         "Td": 16.5,
         "RH": 98,
         "wind": 7.6,
         "low": 100,
         "mid": 53,
         "high": 46,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.8,
         "Td": 16.4,
         "RH": 98,
         "wind": 10.7,
         "low": 100,
         "mid": 30,
         "high": 64,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.8,
         "Td": 15.1,
         "RH": 96,
         "wind": 12.7,
         "low": 91,
         "mid": 16,
         "high": 50,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 12.9,
         "RH": 92,
         "wind": 14.1,
         "low": 79,
         "mid": 6,
         "high": 21,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 12.8,
         "Td": 11.0,
         "RH": 89,
         "wind": 14.9,
         "low": 67,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 9.5,
         "RH": 86,
         "wind": 14.6,
         "low": 55,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 8.0,
         "RH": 83,
         "wind": 13.7,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 6.9,
         "RH": 80,
         "wind": 12.6,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.1,
         "Td": 6.4,
         "RH": 78,
         "wind": 11.8,
         "low": 57,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 10.3,
         "Td": 6.4,
         "RH": 77,
         "wind": 11.1,
         "low": 83,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 10.5,
         "Td": 6.5,
         "RH": 76,
         "wind": 10.9,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 6.2,
         "RH": 74,
         "wind": 11.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.8,
         "Td": 5.7,
         "RH": 71,
         "wind": 12.8,
         "low": 94,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 10.9,
         "Td": 5.4,
         "RH": 69,
         "wind": 13.6,
         "low": 86,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.1,
         "Td": 5.6,
         "RH": 69,
         "wind": 13.8,
         "low": 81,
         "mid": 27,
         "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.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.92,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.2 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 10.1 \u00b0C vs afternoon dewpoint 14.8 \u00b0C \u2192 -4.7 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 8.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 12 kt: too much mixing for radiation fog"
       }
      ],
      "raw": 0.07
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 3.4000000000000004,
       "rh_max": 83,
       "wind_mean": 13.125,
       "wind_after": 12.7,
       "gust_max": 27.2,
       "cloud_mh_night": 59.09090909090909,
       "cloud_low_night": 80.0,
       "cloud_mh_sunrise": 35.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 65.5,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 9.4,
       "cooling": 5.799999999999999,
       "t_min_night": 9.2,
       "td_afternoon": 13.8,
       "crossover": -4.600000000000001,
       "td_drop": 7.800000000000001,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 5.399999999999977,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 16.1,
         "Td": 15.5,
         "RH": 96,
         "wind": 8.0,
         "low": 100,
         "mid": 85,
         "high": 61,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 16.5,
         "Td": 14.9,
         "RH": 90,
         "wind": 10.7,
         "low": 100,
         "mid": 100,
         "high": 96,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 15.7,
         "Td": 12.7,
         "RH": 82,
         "wind": 14.2,
         "low": 100,
         "mid": 97,
         "high": 0,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.7,
         "Td": 11.5,
         "RH": 81,
         "wind": 14.3,
         "low": 100,
         "mid": 100,
         "high": 0,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.5,
         "Td": 9.3,
         "RH": 76,
         "wind": 13.2,
         "low": 83,
         "mid": 89,
         "high": 0,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 12.4,
         "Td": 8.1,
         "RH": 75,
         "wind": 15.1,
         "low": 100,
         "mid": 2,
         "high": 0,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 14.6,
         "low": 74,
         "mid": 8,
         "high": 0,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 5.5,
         "RH": 72,
         "wind": 13.3,
         "low": 36,
         "mid": 0,
         "high": 4,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 9.2,
         "Td": 5.7,
         "RH": 79,
         "wind": 13.5,
         "low": 50,
         "mid": 0,
         "high": 18,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.2,
         "Td": 6.5,
         "RH": 83,
         "wind": 13.3,
         "low": 70,
         "mid": 23,
         "high": 100,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 9.4,
         "Td": 6.0,
         "RH": 79,
         "wind": 12.4,
         "low": 67,
         "mid": 29,
         "high": 3,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.0,
         "Td": 5.9,
         "RH": 76,
         "wind": 12.9,
         "low": 64,
         "mid": 38,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.7,
         "Td": 6.7,
         "RH": 76,
         "wind": 12.5,
         "low": 72,
         "mid": 27,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 11.1,
         "Td": 5.8,
         "RH": 70,
         "wind": 12.4,
         "low": 100,
         "mid": 39,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 11.8,
         "Td": 5.7,
         "RH": 66,
         "wind": 15.9,
         "low": 95,
         "mid": 46,
         "high": 0,
         "vis": null
        }
       ]
      },
      "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.1 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.51,
        "why": "overnight mid+high levels cloud = 59 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.8 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.4,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 13.8 \u00b0C \u2192 -4.6 \u00b0C; rain last 48 h = 17.5 mm; BUT dewpoint falls 7.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 = 83 %"
       }
      },
      "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": 17.5,
    "soil_moisture_top": 0.338,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3912897&longitude=-88.0333753&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=42.3912897&longitude=-88.0333753&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:05+00:00",
     "elevation_m": 230.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3912897&longitude=-88.0333753&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:05+00:00",
     "elevation_m": 230.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3912897&longitude=-88.0333753&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:05+00:00",
     "elevation_m": 230.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=42.3912897&longitude=-88.0333753&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:05+00:00",
     "elevation_m": 230.0
    }
   },
   "water_temp_c": 18.0,
   "dawn_temp_c": 9.5,
   "dawn_wind_kt": 9.5
  }
 ],
 "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=KUGN%2CKPWK%2CKENW%2CKDPA&format=json",
  "obs": [
   {
    "id": "KDPA",
    "time": "2026-10-16T05:00:00.000Z",
    "temp_c": 13.9,
    "dewp_c": 11.7,
    "wind_kt": 10,
    "wind_dir": 280,
    "vis_mi": "10+",
    "clouds": [
     [
      "BKN",
      1600
     ],
     [
      "BKN",
      2400
     ],
     [
      "OVC",
      3300
     ]
    ],
    "wx": "-RA",
    "raw": "METAR KDPA 160452Z 28010G22KT 10SM -RA BKN016 BKN024 OVC033 14/12 A2983 RMK AO2 SLP103 P0000 T01390117"
   },
   {
    "id": "KENW",
    "time": "2026-10-16T05:00:00.000Z",
    "temp_c": 13.3,
    "dewp_c": 11.7,
    "wind_kt": 13,
    "wind_dir": 280,
    "vis_mi": "10+",
    "clouds": [
     [
      "SCT",
      1400
     ],
     [
      "BKN",
      2100
     ],
     [
      "OVC",
      4000
     ]
    ],
    "wx": "BR",
    "raw": "METAR KENW 160453Z AUTO 28013G24KT 10SM BR SCT014 BKN021 OVC040 13/12 A2979 RMK AO2 PK WND 27026/0419 SLP088 T01330117"
   },
   {
    "id": "KPWK",
    "time": "2026-10-16T05:00:00.000Z",
    "temp_c": 15,
    "dewp_c": 12.2,
    "wind_kt": 12,
    "wind_dir": 290,
    "vis_mi": "10+",
    "clouds": [
     [
      "BKN",
      1600
     ],
     [
      "BKN",
      2400
     ],
     [
      "OVC",
      2900
     ]
    ],
    "wx": null,
    "raw": "METAR KPWK 160452Z AUTO 29012G20KT 10SM BKN016 BKN024 OVC029 15/12 A2981 RMK AO2 SLP095 T01500122"
   },
   {
    "id": "KUGN",
    "time": "2026-10-16T05:04:00.000Z",
    "temp_c": 13.9,
    "dewp_c": 12.2,
    "wind_kt": 10,
    "wind_dir": 270,
    "vis_mi": "10+",
    "clouds": [
     [
      "SCT",
      1400
     ],
     [
      "BKN",
      2300
     ],
     [
      "OVC",
      3000
     ]
    ],
    "wx": null,
    "raw": "SPECI KUGN 160504Z AUTO 27010G22KT 10SM SCT014 BKN023 OVC030 14/12 A2978 RMK AO2 T01390122"
   }
  ]
 },
 "gauges": {
  "url": "https://waterservices.usgs.gov/nwis/iv/?sites=05528000%2C05527800%2C05549500&parameterCd=00065%2C00010&format=json&period=P1D",
  "gauges": {
   "05527800": {
    "name": "DES PLAINES RIVER AT RUSSELL, IL",
    "stage_ft": 4.4,
    "stage_ft_time": "2026-10-15T22:30:00.000-06:00"
   },
   "05528000": {
    "name": "DES PLAINES RIVER NEAR GURNEE, IL",
    "stage_ft": 3.11,
    "stage_ft_time": "2026-10-15T22:30:00.000-06:00"
   },
   "05549500": {
    "name": "FOX RIVER NEAR MCHENRY, IL",
    "water_temp_c": 18.0,
    "water_temp_c_time": "2026-10-15T22:00:00.000-06:00",
    "stage_ft": 4.01,
    "stage_ft_time": "2026-10-15T22:15: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": "KUGN",
  "rows": [
   {
    "local": "2026-10-16 00:00",
    "TMP": 56,
    "DPT": 56,
    "WSP": 12,
    "SKY": 93,
    "VIS": 9.0,
    "LIV": 0,
    "IFV": 4,
    "MVV": 17,
    "CIG": 11
   },
   {
    "local": "2026-10-16 01:00",
    "TMP": 53,
    "DPT": 53,
    "WSP": 13,
    "SKY": 96,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 4,
    "MVV": 15,
    "CIG": 13
   },
   {
    "local": "2026-10-16 02:00",
    "TMP": 51,
    "DPT": 50,
    "WSP": 14,
    "SKY": 94,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 4,
    "MVV": 15,
    "CIG": 13
   },
   {
    "local": "2026-10-16 03:00",
    "TMP": 49,
    "DPT": 48,
    "WSP": 15,
    "SKY": 87,
    "VIS": 10.0,
    "LIV": 3,
    "IFV": 4,
    "MVV": 13,
    "CIG": 13
   },
   {
    "local": "2026-10-16 04:00",
    "TMP": 48,
    "DPT": 47,
    "WSP": 14,
    "SKY": 81,
    "VIS": 10.0,
    "LIV": 3,
    "IFV": 4,
    "MVV": 13,
    "CIG": 13
   },
   {
    "local": "2026-10-16 05:00",
    "TMP": 47,
    "DPT": 46,
    "WSP": 14,
    "SKY": 79,
    "VIS": 10.0,
    "LIV": 3,
    "IFV": 4,
    "MVV": 13,
    "CIG": 13
   },
   {
    "local": "2026-10-16 06:00",
    "TMP": 46,
    "DPT": 45,
    "WSP": 13,
    "SKY": 71,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 5,
    "MVV": 14,
    "CIG": 15
   },
   {
    "local": "2026-10-16 07:00",
    "TMP": 46,
    "DPT": 44,
    "WSP": 13,
    "SKY": 70,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 6,
    "MVV": 14,
    "CIG": 15
   },
   {
    "local": "2026-10-16 08:00",
    "TMP": 48,
    "DPT": 45,
    "WSP": 13,
    "SKY": 67,
    "VIS": 9.0,
    "LIV": 3,
    "IFV": 9,
    "MVV": 20,
    "CIG": 13
   },
   {
    "local": "2026-10-16 09:00",
    "TMP": 51,
    "DPT": 46,
    "WSP": 13,
    "SKY": 88,
    "VIS": 9.0,
    "LIV": 4,
    "IFV": 11,
    "MVV": 21,
    "CIG": 13
   },
   {
    "local": "2026-10-16 10:00",
    "TMP": 53,
    "DPT": 46,
    "WSP": 13,
    "SKY": 83,
    "VIS": 9.0,
    "LIV": 4,
    "IFV": 13,
    "MVV": 20,
    "CIG": 13
   },
   {
    "local": "2026-10-16 11:00",
    "TMP": 55,
    "DPT": 46,
    "WSP": 15,
    "SKY": 83,
    "VIS": 10.0,
    "LIV": 3,
    "IFV": 12,
    "MVV": 19,
    "CIG": 15
   },
   {
    "local": "2026-10-16 12:00",
    "TMP": 55,
    "DPT": 46,
    "WSP": 16,
    "SKY": 85,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 9,
    "MVV": 16,
    "CIG": 18
   },
   {
    "local": "2026-10-16 13:00",
    "TMP": 55,
    "DPT": 45,
    "WSP": 17,
    "SKY": 88,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 9,
    "MVV": 15,
    "CIG": 18
   },
   {
    "local": "2026-10-16 14:00",
    "TMP": 55,
    "DPT": 45,
    "WSP": 19,
    "SKY": 89,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 7,
    "MVV": 14,
    "CIG": 22
   },
   {
    "local": "2026-10-16 15:00",
    "TMP": 55,
    "DPT": 43,
    "WSP": 20,
    "SKY": 77,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 6,
    "MVV": 13,
    "CIG": 27
   },
   {
    "local": "2026-10-16 16:00",
    "TMP": 54,
    "DPT": 42,
    "WSP": 20,
    "SKY": 69,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 6,
    "MVV": 12,
    "CIG": 22
   },
   {
    "local": "2026-10-16 17:00",
    "TMP": 53,
    "DPT": 40,
    "WSP": 20,
    "SKY": 53,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 6,
    "MVV": 10,
    "CIG": 22
   },
   {
    "local": "2026-10-16 18:00",
    "TMP": 51,
    "DPT": 39,
    "WSP": 19,
    "SKY": 51,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 5,
    "MVV": 10,
    "CIG": 27
   },
   {
    "local": "2026-10-16 19:00",
    "TMP": 48,
    "DPT": 39,
    "WSP": 17,
    "SKY": 43,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 2,
    "MVV": 6,
    "CIG": 27
   },
   {
    "local": "2026-10-16 20:00",
    "TMP": 46,
    "DPT": 38,
    "WSP": 17,
    "SKY": 27,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 3,
    "MVV": 6,
    "CIG": 35
   },
   {
    "local": "2026-10-16 21:00",
    "TMP": 45,
    "DPT": 37,
    "WSP": 16,
    "SKY": 30,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 4,
    "MVV": 7,
    "CIG": 35
   },
   {
    "local": "2026-10-16 22:00",
    "TMP": 44,
    "DPT": 36,
    "WSP": 14,
    "SKY": 26,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 4,
    "MVV": 6,
    "CIG": 45
   },
   {
    "local": "2026-10-16 23:00",
    "TMP": 43,
    "DPT": 35,
    "WSP": 13,
    "SKY": 24,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 3,
    "MVV": 4,
    "CIG": 45
   },
   {
    "local": "2026-10-17 00:00",
    "TMP": 41,
    "DPT": 34,
    "WSP": 12,
    "SKY": 17,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": 45
   }
  ]
 },
 "profile": {
  "url": "https://www.meteo.psu.edu/bufkit/data/HRRR/00/hrrr_kugn.buf",
  "cycle": "00",
  "init_local": "2026-10-15 19:00",
  "dawn_hours": [
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.6,
    "lowest_levels": [
     [
      11.1,
      12.34,
      9.99
     ],
     [
      35.8,
      12.14,
      9.82
     ],
     [
      82.1,
      11.74,
      9.62
     ],
     [
      161.3,
      11.04,
      9.36
     ],
     [
      280.3,
      9.94,
      9.0
     ]
    ],
    "valid_local": "03:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.6,
    "lowest_levels": [
     [
      11.0,
      11.44,
      9.18
     ],
     [
      35.7,
      11.24,
      8.98
     ],
     [
      81.8,
      10.84,
      8.8
     ],
     [
      160.7,
      10.14,
      8.52
     ],
     [
      279.2,
      9.04,
      8.16
     ]
    ],
    "valid_local": "04:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.6,
    "lowest_levels": [
     [
      11.0,
      11.14,
      8.51
     ],
     [
      35.7,
      10.94,
      8.28
     ],
     [
      81.7,
      10.54,
      8.05
     ],
     [
      160.5,
      9.84,
      7.74
     ],
     [
      278.9,
      8.74,
      7.34
     ]
    ],
    "valid_local": "05:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.5,
    "lowest_levels": [
     [
      10.1,
      10.74,
      8.12
     ],
     [
      34.7,
      10.64,
      7.89
     ],
     [
      80.6,
      10.24,
      7.68
     ],
     [
      160.2,
      9.54,
      7.36
     ],
     [
      277.5,
      8.44,
      6.89
     ]
    ],
    "valid_local": "06:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.4,
    "lowest_levels": [
     [
      10.9,
      10.34,
      7.65
     ],
     [
      35.4,
      10.24,
      7.43
     ],
     [
      82.1,
      9.94,
      7.24
     ],
     [
      160.5,
      9.34,
      6.92
     ],
     [
      278.4,
      8.24,
      6.51
     ]
    ],
    "valid_local": "07:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.6,
    "lowest_levels": [
     [
      10.9,
      10.24,
      8.33
     ],
     [
      35.4,
      10.04,
      8.13
     ],
     [
      81.1,
      9.64,
      7.97
     ],
     [
      160.3,
      8.94,
      7.68
     ],
     [
      278.0,
      7.84,
      7.25
     ]
    ],
    "valid_local": "08:00"
   },
   {
    "saturated_depth_m": 0.0,
    "inversion_dT_c": -0.6,
    "lowest_levels": [
     [
      10.9,
      10.54,
      7.51
     ],
     [
      36.3,
      10.34,
      7.24
     ],
     [
      82.0,
      9.94,
      7.03
     ],
     [
      161.2,
      9.14,
      6.75
     ],
     [
      278.1,
      8.04,
      6.39
     ]
    ],
    "valid_local": "09:00"
   }
  ],
  "station": "KUGN"
 },
 "obs_context": {
  "available": true,
  "metar": {
   "id": "KUGN",
   "time": "2026-10-16T05:04:00.000Z",
   "temp_c": 13.9,
   "dewp_c": 12.2,
   "wind_kt": 10,
   "wind_dir": 270,
   "vis_mi": "10+",
   "clouds": [
    [
     "SCT",
     1400
    ],
    [
     "BKN",
     2300
    ],
    [
     "OVC",
     3000
    ]
   ],
   "wx": null,
   "raw": "SPECI KUGN 160504Z AUTO 27010G22KT 10SM SCT014 BKN023 OVC030 14/12 A2978 RMK AO2 T01390122"
  },
  "station": "KUGN",
  "hrrr_now": {
   "T": 13.5,
   "Td": 11.6,
   "wind": 12.2,
   "low": 90
  },
  "dpd_obs": 1.7,
  "dpd_model": 1.9
 },
 "outlook": {
  "rows": [
   {
    "day": 1,
    "date": "2026-10-16",
    "weekday": "Fri 16 Oct",
    "setup_score": 0.06,
    "band": "poor",
    "spread": 0.072,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "HRRR",
    "type": "shallow ground fog",
    "light": "filtered sun",
    "sunrise": "07:06",
    "azimuth": 101.5,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.0999999999999996,
     "wind_mean": 11.600000000000001,
     "cloud_mh_night": 29.181818181818183,
     "hours_saturated": 0
    },
    "confidence": "see the main report (calibrated, HRRR included)",
    "per_model": {
     "gfs_hrrr": 0.05,
     "ecmwf_ifs025": 0.068,
     "gfs_global": 0.031,
     "icon_seamless": 0.033,
     "ncep_nbm_conus": 0.103
    }
   },
   {
    "day": 2,
    "date": "2026-10-17",
    "weekday": "Sat 17 Oct",
    "setup_score": 0.457,
    "band": "marginal",
    "spread": 0.481,
    "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:07",
    "azimuth": 102.0,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.0,
     "wind_mean": 5.75,
     "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.519,
     "ecmwf_ifs025": 0.492,
     "gfs_global": 0.395,
     "icon_seamless": 0.1,
     "ncep_nbm_conus": 0.581
    }
   },
   {
    "day": 3,
    "date": "2026-10-18",
    "weekday": "Sun 18 Oct",
    "setup_score": 0.281,
    "band": "poor",
    "spread": 0.395,
    "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:08",
    "azimuth": 102.5,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 5.8,
     "wind_mean": 8.35,
     "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.091,
     "gfs_global": 0.088,
     "icon_seamless": 0.483,
     "ncep_nbm_conus": 0.429
    }
   },
   {
    "day": 4,
    "date": "2026-10-19",
    "weekday": "Mon 19 Oct",
    "setup_score": 0.535,
    "band": "marginal",
    "spread": 0.591,
    "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.0,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.6999999999999997,
     "wind_mean": 4.725,
     "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.606,
     "gfs_global": 0.118,
     "icon_seamless": 0.709,
     "ncep_nbm_conus": 0.624
    }
   },
   {
    "day": 5,
    "date": "2026-10-20",
    "weekday": "Tue 20 Oct",
    "setup_score": 0.435,
    "band": "poor",
    "spread": 0.714,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "overcast above the fog",
    "sunrise": "07:11",
    "azimuth": 103.5,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.2,
     "wind_mean": 2.4,
     "cloud_mh_night": 91.36363636363636,
     "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.479,
     "gfs_global": 0.092,
     "icon_seamless": 0.101,
     "ncep_nbm_conus": 0.806
    }
   },
   {
    "day": 6,
    "date": "2026-10-21",
    "weekday": "Wed 21 Oct",
    "setup_score": 0.625,
    "band": "decent set-up",
    "spread": 0.801,
    "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:12",
    "azimuth": 103.9,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.0999999999999996,
     "wind_mean": 3.0,
     "cloud_mh_night": 1.1818181818181819,
     "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.798,
     "gfs_global": 0.09,
     "icon_seamless": 0.487,
     "ncep_nbm_conus": 0.891
    }
   },
   {
    "day": 7,
    "date": "2026-10-22",
    "weekday": "Thu 22 Oct",
    "setup_score": 0.527,
    "band": "marginal",
    "spread": 0.565,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "filtered sun",
    "sunrise": "07:13",
    "azimuth": 104.4,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.5,
     "wind_mean": 3.1,
     "cloud_mh_night": 33.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.679,
     "gfs_global": 0.114,
     "icon_seamless": 0.603,
     "ncep_nbm_conus": 0.607
    }
   }
  ],
  "best_days": [
   "2026-10-21",
   "2026-10-19",
   "2026-10-22"
  ],
  "sources": {
   "gfs_hrrr": "https://api.open-meteo.com/v1/forecast?latitude=42.3434&longitude=-88.0412&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=42.3434&longitude=-88.0412&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=42.3434&longitude=-88.0412&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=42.3434&longitude=-88.0412&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=42.3434&longitude=-88.0412&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-LCP-12412-N.jpg",
    "2026-10-16-LCP-12467-E.jpg",
    "2026-10-16-LCP-cam172_30_47_161-N.jpg"
   ]
  },
  {
   "morning": "2026-10-16",
   "run_time": "2026-10-16T00:24-05:00",
   "kind": "predawn",
   "fog_probability": 0.01,
   "raw_blend": 0.068,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "high",
   "observed_min_vis_mi": null,
   "observed_fog": null,
   "cams": [
    "2026-10-16-LCP-12412-N.jpg",
    "2026-10-16-LCP-12467-E.jpg",
    "2026-10-16-LCP-cam172_30_47_161-N.jpg"
   ]
  }
 ]
}