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_tokensit 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
- arduino
- c++
- census-api
- css
- esp32
- fastapi
- gsap
- hhs-empower
- html
- javascript
- leaflet.js
- nasa-black-marble
- nebius
- nebius-token-factory
- nemotron-3-nano
- nemotron-3-super
- nvidia-nemotron
- openai-api
- python
- sqlite
Log in or sign up for Devpost to join the conversation.