← All case studies
Client project · mobile + IoT

Standby generator monitor

Start a standby generator from your phone, and know that it actually started.

Role
App, backend, firmware and hardware design
Stack
Expo · React Native · Firebase · ESP32 firmware (PlatformIO)
Status
App and firmware complete, on-site install next
Screens

The real app, with made-up data and placeholder names.

Generator detail for a running unit with start and stop buttons, an output voltage gauge, current and load
Live status, with start and stop for staff.
A confirmation dialog asking to start the generator remotely
Remote start always asks first.
Seven-day charts for load and battery voltage, with event filters for starts, stops, faults and commands
A week of history and the event log.
The generator detail screen in dark mode
Dark mode.
01

The problem

An electrical contractor installs whole-house standby generators. The manufacturer's own Wi-Fi feature only works locally, so neither the homeowner nor the contractor can tell from away whether a unit is healthy, or start it ahead of a storm.

The contractor wanted a branded, bilingual app for their customers, a staff view of every generator they look after, and hardware their own electrician could install.

02

What I built

Customer appLive status, run hours, battery voltage and fault tiles, charts and event history, open alerts, and service requests straight to the contractor.
Staff appEvery generator grouped by owner, remote start and stop, assigning generators to customers, archiving and an audit log of who did what.
Device firmwareESP32 firmware for a small box wired into the generator controller: a Wi-Fi setup portal, its own sign-in identity, run detection and debounced fault inputs.
Alerts and install guidePush notifications in French and English for faults, low battery and devices that go silent, plus a parts list and step-by-step install guide for the electrician.
03

How it works

The device and the apps never talk to each other directly. Everything goes through Firestore, and its security rules decide who may write what: staff, customers, or the device's own identity.

Status and start / stop

Generator controllerDocumented wiring harness
  • 2-wire run signal
  • Alarm, oil, temperature and frequency faults
  • Battery voltage
ESP32 devicePlatformIO · Arduino
  • Hold-based run relay
  • Debounced fault inputs
  • Polls for commands
FirestoreSecurity rules · 60+ tests
  • Device state and history
  • Commands
  • Alerts and audit log
Staff & customer appsExpo · React Native
  • Live status
  • Start / stop (staff only)
  • History and alerts

Alerts, with no cloud functions

FirestoreDevice state
  • Heartbeats
  • Pending commands
Background sweepNode · runs every minute
  • Silent devices
  • Command timeouts
  • Threshold alerts, de-duplicated
Customer's phoneExpo push
  • Message in the customer's language
04

Key decisions

  1. Done means the engine is runningA command moves from pending to acknowledged to completed only after run detection confirms the change. If it never does, the sweep times it out and raises an alert instead of showing a false success.
  2. Read the manufacturer's manual before buying partsThat turned up a documented 2-wire start/stop input and discrete fault outputs on the controller harness. The firmware was redesigned around that hold-based run signal instead of guessing at button presses.
  3. Free tier on purposeNo Cloud Functions: a small one-shot script run every minute handles offline detection, command timeouts, threshold alerts and push. Alert IDs are deterministic, so re-running it never sends a duplicate.
  4. A missing sensor is missing, not zeroEvery reading except run state is optional. A basic install shows only what it can really measure, and other generator brands fit the same schema without code changes.
  5. Test the rules with the queries the app really runsA rule that passed every single-document test failed for the list query a screen used. Rule tests now cover the exact query and batch shapes the app sends.
05

Where it stands

Today

App, backend and firmware are complete, and the firmware builds against the real ESP32 toolchain. Wi-Fi setup, sign-in, run detection and the command loop can all be bench-tested before any generator is touched.

Next

On-site install with the contractor's electrician: confirm the fault signals' polarity on the real unit and run the full start, detect, stop, detect loop.

ExpoReact NativeTypeScriptZustandFirebase AuthFirestoreSecurity rules testsExpo pushESP32PlatformIOC++i18n FR/EN

Have something people will use every day?

I'm happy to walk through any of these projects, including the private ones, in more depth.