How it works

One honest picture of every job site's hazards

PlanIT Control pulls live hazard data for 55 real Florida power plants, stops work when lightning gets close, and tells supervisors each evening whether tomorrow is go, caution or no-go.

The problem

Hazard data is scattered across agencies, so go/no-go calls get made on instinct.

A utility foreman deciding whether a crew should set up a bucket truck tomorrow would need to check a weather app, NWS alerts, a lightning map, FEMA flood maps, fire satellites and whatever the last crew said. Nobody has time for that at 6 AM, so the call is often a gut feeling.

Data sources

Nine sources, each checked as often as it actually changes.

  • GOES-19 GLM

    NOAA satellite lightning

    Every lightning flash over Florida (plus 30 mi), with its exact time and place. Drives stop-work alerts.

    Every 20 s

  • Open-Meteo

    Weather model forecasts

    Heat index, temperature, humidity, rain (past 72 h and next 24 h) and soil moisture for each site.

    Hourly

  • NWS alerts

    National Weather Service

    Active watches, warnings and advisories (flood, heat, storms, red flag) that cover each site.

    Every 5 min

  • FEMA flood zones

    National Flood Hazard Layer

    Whether a site sits in the 1%-a-year (high-risk) floodplain.

    Once per site

  • USGS rivers

    National Hydrography Dataset

    Whether a named river is within 1 mile.

    Once per site

  • NASA FIRMS

    VIIRS fire satellites

    Fire detections in the last 24 h, nearest distance and count within 25 mi. Needs an API key.

    Every 30 min

  • iNaturalist

    Wildlife sightings

    Alligators and venomous snakes seen within 5 km (about 3 mi) in the last 30 days.

    Every 6 h

  • Crew reports

    Field crews in this app

    Photo, pin and category from the field. A report within 2 mi in the last 48 h raises the matching hazard (flooding, heat, ground, fire, wildlife) to at least Watch; downed lines get their own crew-hazards card.

    Live

  • EIA-860M

    U.S. Energy Information Administration

    The 55 real Florida power plants we track: largest first, with regional minimums.

    Loaded once

If a source fails, the last good reading keeps being shown with its "as of" time, and the card is flagged when the reading gets old. A source with nothing yet shows "No data", never a made-up zero.

Stop-work rule

Lightning within 10 miles stops work. The 30-minute countdown restarts with every new strike.

  • Any flash within 10 miles of a site starts a stop-work alert.
  • All clear = the latest strike + 30 minutes. Each new strike pushes it later.
  • The countdown uses when the lightning struck, not when our server read the file, so late or out-of-order satellite data can never shorten it.
  • The check runs every 20 seconds even with no lightning, because the all-clear is triggered by silence.
Example: three strikes near one site

6:00 strike, 6.6 mi

Alert starts · all clear 6:30

6:12 strike, 3.2 mi

Countdown restarts · all clear 6:42

6:05 strike, file arrives late

Would end at 6:35: ignored, the countdown never gets shorter

Result

One continuous stop-work, 6:00 to 6:42. All clear at 6:42.

In a real replay of the August 4, 2025 storm, 21 of 55 sites got stop-work alerts. The busiest, Okeechobee Clean Energy Center, reset 177 times and cleared exactly 30 minutes after its final strike. Every reset is logged, so a safety manager can audit why a crew was stopped and when it was cleared.

The hazard index (0–10)

One number per site for today and tomorrow, in three fixed bands.

Low

0 to < 4

Elevated

4 to < 7

High

7 to 10

A hybrid: the highest risk wins

  1. The model learns storms and floods from the forecast, turning its estimated probability into a 0–10 weather score. An index of 7 does not mean a 70% chance.
  2. Take the highest score from the model, OSHA heat-index bands, wildfire detections, wildlife and crew reports. A mild forecast can never average away dangerous heat or a reported hazard.
  3. Official NWS warnings set minimum scores: at least 9 for a Hurricane Warning, 7 for other supported warnings, and 4 for watches or advisories. Floors only raise a lower score. A nearby downed-line report also sets today's minimum to 7; our flood-risk alert sets it to 4.
  4. Lightning stop-work overrides today's index to at least 9.0. The stop-work engine runs independently; no model forecast can shorten or clear its wait.
  5. Tomorrow uses tomorrow's forecast, peak heat, and watches or warnings in effect then. Today's crew-report floors, advisories and lightning stop-work do not carry over. If the model cannot score, safety rules still run.
Hybrid rules from the model service

The hazard index is the highest of: the ML weather score (the model's calibrated probability mapped to 0-10), the OSHA heat-index band, and the wildfire, wildlife and crew-report rules. An NWS Hurricane Warning raises it to at least 9; another NWS warning (flood, flash flood, severe thunderstorm, tornado, tropical storm, extreme heat, red flag) or a downed-line crew report to at least 7; an NWS watch or advisory, or our flood-risk alert, to at least 4. While a site has an active lightning stop-work, today's index is at least 9. Every factor says whether it came from the model or a rule.

Machine learning model

A model estimates the chance of a crew-relevant hazardous weather day: NOAA Storm Events logs a storm, flood or other hazardous weather near the site. It mainly learns storms and floods; it does not predict injuries or the time of a lightning strike.

It learns from archived Open-Meteo forecasts matched against NOAA Storm Events, using the same kind of forecast it receives live.

Trained on 2022–2023 across 55 sites (40,150 site-days, 1,152 reported hazardous days). Calibrated on 2024; tested on 2025, kept out of training and tuning.

Compared with two baselines

The model's same-day PR-AUC is 4.0× Climatology; 3.2× Simple rule. This measures how well rare hazardous days rise to the top, not percent accuracy.

2025 test results · same-day forecasts
MethodPR-AUC ↑ROC-AUC ↑Brier ↓
Hazard model (LightGBM)Calibrated probability from the weather forecast, season and site.0.12850.84190.02219
ClimatologyThe training years' hazardous-day rate for that calendar month.0.03180.61540.02319
Simple ruleFlag the day if forecast rain is at least 1 in or the heat index reaches 108°F.0.03960.59940.02308

PR-AUC and ROC-AUC measure ranking; higher is better. Brier measures probability error; lower is better. Reported hazards occurred on 2.37% of test site-days (476 of 20,075).

Day-ahead results and label definition
2025 test results · forecasts issued a day earlier
MethodPR-AUC ↑ROC-AUC ↑Brier ↓
Hazard model (LightGBM)0.10210.82530.02271
Climatology0.03180.61540.02319
Simple rule0.03380.56440.02313

— = not evaluated. A site-day is one site on one local calendar day.

Label: NOAA Storm Events crew-relevant event within 15 mi or in the site's NWS zone/county, by site-local date

Weather input: Open-Meteo gfs_seamless (HRRR over Florida); training on the Historical Forecast API

Calibration: predicted chances versus reported events
Model calibration: predicted probability compared with the observed share of hazardous site-days. Points on the diagonal indicate matching probabilities.

The diagonal is a perfect match between predicted and observed chances. The model is better at ranking days than estimating exact probabilities; the highest probabilities can be overconfident.

Model evaluation limits
  • The label is "NOAA logged a hazardous-weather event", not "it happened": rural sites and nights are under-reported, and lightning is logged only when it causes damage or injury.
  • Location is partly reporting bias: areas near people get more reports, so the model rates them riskier. That's why "Area with frequent past severe-weather reports" can be a top factor.
  • Heat isn't learned (NOAA logged Florida heat only in 2022-2023), so heat comes from the OSHA rule.
  • Wildfire is barely predicted by weather alone, so fires come from the satellite-detection rule.
  • Two training years, one calibration year (2024, with three hurricanes) and one test year: very high probabilities (above ~20%) run over-confident in ordinary years.
  • Much better at ranking days than at exact probabilities: 4% Brier skill over monthly averages today, not significant a day ahead.

Honest limits

What this system can't tell you, so nobody over-trusts it.

  • Rainfall is a model estimate.

    Open-Meteo rain totals come from weather models, not a rain gauge at the site. Real totals can be higher or lower.

  • Wildfire depends on satellite passes.

    VIIRS satellites see a given spot only a few times a day, so a new fire can burn for hours before it shows up. Hot spots within 1 km of a plant are treated as plant heat and ignored, so a real fire inside that ring would be missed. Without a FIRMS key, wildfire data is off and the card says so.

  • It predicts hazardous weather days, not injuries.

    A high index flags conditions to check; it does not mean someone will get hurt. A low index does not mean a site is safe. It supports a supervisor's judgment; it doesn't replace it.

  • Lightning positions are approximate.

    Satellite pixels are about 8–14 km across, so a strike reported at 9.8 mi could be a little closer or farther. A strike reaches us 20–40 seconds after it happens.

  • Hazardous days are rare, and exact probabilities are uncertain.

    There are few reported events to learn from. The model ranks risky days better than it estimates exact chances; the highest probabilities can be overconfident. Day-ahead probability gains over the baselines are not statistically conclusive.

  • Reporting bias affects the model.

    NOAA records reported events, not every event that happened. Rural sites and nights are under-reported; lightning is usually logged only after damage or injury. Location partly reflects where reports come from, so a low score at a remote site is weaker evidence of a quiet day.

  • Heat and wildfire cannot be learned reliably from these labels.

    Heat reports are too sparse to validate the model's heat predictions, and weather alone captures wildfire poorly without drought or fuel conditions. OSHA heat bands and satellite fire detections supply the safety rules for these hazards.

Replay mode

A real recorded storm, played through the real pipeline, at 30× speed.

Lightning doesn't strike on cue for a demo. Replay takes an hour of real GOES-19 satellite files from a past Florida storm and feeds them, one by one, through the same code the live system uses. A simulated clock starts at the storm's first file and runs 30× faster, so an hour of lightning plays in about two minutes.

  • Why the real pipeline: it proves the code that protects crews actually works, and it gives exactly the alerts crews would have seen that evening. The alert engine has no clock of its own; it runs on whatever time it's given.
  • Replay alerts are stored separately and never mix with live ones. Real lightning keeps being tracked during a replay: real alerts stay on screen next to the replay's, which are tagged REPLAY.
  • After the last file, replay runs 31 quiet simulated minutes so every countdown can finish.
  • Heat, rain, fire and wildlife stay live during a replay; only lightning is replayed.

Try it: open the dashboard and press ⚡ Replay storm