Inspiration

When Hurricane Ian hit Southwest Florida in September 2022, about 2.6 million Florida customers lost power, and NASA's night-light satellites showed whole neighborhoods around Fort Myers go dark. Utilities could see which feeders were down. They could not see which homes had an 80-year-old on an oxygen concentrator, sitting in rising heat with no way to call for help. Restoration usually follows the grid: biggest feeders first. We wanted to restore by who is in danger.

What it does

Nightlight is a small box that keeps reporting after the power goes out:

  • Wall power on or off
  • Indoor heat index (temperature and humidity)
  • An SOS button
  • A medical-load flag (a flag only, never a diagnosis)

Every 5 seconds it sends a 24-byte packet over a phone hotspot. If the network drops, packets wait in a queue on the device and send in order when it comes back, so the outage timeline has no gaps.

In the cloud, a deterministic scorer ranks every home by danger: heat index and its trend, hours dark, time since anyone moved, the medical flag, occupants, and SOS. It also forecasts the hours until a home becomes unsafe. NVIDIA Nemotron then explains the ranking and drafts the crew's restoration brief. It never decides the order itself, and a dispatcher approves.

The console has three views: a map of ranked homes, a device view with live charts and the raw packets from the real box, and a crew view with the Nemotron brief and resident check-ins.

How we built it

  • Hardware: ESP32 DevKit V1 + DHT11 temperature/humidity sensor + a pushbutton, wired on a breadboard with no soldering. A jumper wire stands in for the wall-power sensor in the demo. The firmware (Arduino C++) packs a frozen 24-byte packet with a CRC, runs a 900× demo clock, and keeps an offline queue.
  • Cloud: Python 3.11 + FastAPI + SQLite. The packet format is defined once and matched byte for byte across docs/PACKET.md, the firmware header and the Python decoder, with a round-trip test.
  • AI: NVIDIA Nemotron 3 through Nebius Token Factory (OpenAI-compatible API).
    • Nemotron 3 Nano (30B-A3B): one-sentence explanations for the top 20 homes, run in parallel, plus parsing messy resident messages ("my mom's oxygen machine battery dies tonight") into structured needs.
    • Nemotron 3 Super (120B-A12B): the crew restoration brief, built from the scorer's ranking.
  • Real data: HHS emPOWER (electricity-dependent Medicare beneficiaries per ZIP) and U.S. Census ACS 2023 (households with someone 65+), for 937 Florida ZIPs. Our demo area, Pine Island (ZIP 33956), has 1,852 households, 55% with someone 65+, and 51 people on powered medical equipment.
  • Console: plain HTML/JS with Leaflet, GSAP motion and Lucide icons, in light and dark modes, with no build step.

What's real and what's simulated: one real unit (our ESP32). The other 150 homes on the map are simulated from the real Pine Island ratios and labeled SIMULATED everywhere.

Challenges we ran into

  • First time building hardware. Our ESP32 has a single 3.3 V pin, so we shared it through a breadboard column. We also had to work out which DHT11 pin is which, and which legs of a 12 mm button are connected.
  • Nemotron 3 Nano returned empty answers. It reasons by default, and with a small max_tokens it spent the whole budget thinking. Turning thinking off for the Nano calls fixed it: answers came back in about a second.
  • Honesty about results. Our first outage simulation showed only about a 2% improvement for danger-first restoration, because it spread vulnerable homes evenly across feeders. Real data says otherwise: the share of residents on powered medical equipment ranges from 0% to 64% across Florida ZIPs. We report the small number honestly and name the assumption, instead of tuning it.

Accomplishments that we're proud of

  • A real device sending real packets end to end, decoded by the cloud byte for byte.
  • A ranking that is deterministic and explainable, with the LLM kept in the explainer role.
  • Every simulated element clearly labeled, and every statistic sourced.

What we learned

How to wire and flash a microcontroller from zero, how to design a tiny binary protocol that survives bad networks, and how to use an LLM where it helps (explaining and drafting) without letting it make the life-or-death call.

What's next for Nightlight

A real wall-power sensor instead of the jumper, a motion sensor, battery reporting, a pilot with a county emergency office, and deploying the API as a Nebius Serverless Endpoint for always-on ingest.

Built With

Share this project:

Updates

Submission history