Spaces:
Sleeping
Sleeping
| title: Appliance Health & Leakage Monitor | |
| emoji: ⚡ | |
| colorFrom: blue | |
| colorTo: indigo | |
| sdk: gradio | |
| sdk_version: 5.49.1 | |
| app_file: app.py | |
| pinned: false | |
| # ⚡ Appliance Health & Leakage Monitor | |
| A live monitoring dashboard built on the **AMPds2** household power dataset. It plays back the | |
| records hour-by-hour, builds a per-appliance **expected band with TimesFM 2.5**, and raises | |
| dashboard alerts for two independent problems: | |
| 1. **Appliance health** — an appliance drawing **more** (wear / fault) or **less** (under-draw / off) | |
| than its healthy rated power. | |
| 2. **Whole-house leakage** — the gap between the metered mains and the sum of all appliances | |
| (unaccounted load). | |
| You can **inject faults** into any appliance (over-draw / under-draw / off) and **inject house | |
| leakage**, then watch the dashboard respond in real time. | |
| ## Files | |
| | File | Purpose | | |
| |------|---------| | |
| | `app.py` | Gradio dashboard (playback, injection controls, charts, alerts) | | |
| | `engine.py` | Simulation + detection logic, TimesFM envelope builder | | |
| | `prepare_data.py` | One-time: AMPds2 zip → `data/ampds2_hourly.parquet` | | |
| | `requirements.txt` | Pinned dependencies | | |
| ## Quick start | |
| **1. Get the data.** Download AMPds2 (`dataverse_files.zip`) from | |
| [Harvard Dataverse](https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/FIE0S4). | |
| **2. Build the compact parquet** the app reads (resamples the minutely data to hourly): | |
| ```bash | |
| python prepare_data.py /path/to/dataverse_files.zip | |
| # -> writes data/ampds2_hourly.parquet | |
| ``` | |
| **3. Run locally:** | |
| ```bash | |
| pip install -r requirements.txt | |
| python app.py | |
| ``` | |
| ## Deploy to Hugging Face Spaces | |
| 1. Create a new **Gradio** Space. | |
| 2. Push `app.py`, `engine.py`, `prepare_data.py`, `requirements.txt`, `README.md`. | |
| 3. Add the data: commit `data/ampds2_hourly.parquet` (it's small after hourly resampling), or upload | |
| it via the Space's **Files** tab. (Run `prepare_data.py` locally first to create it.) | |
| 4. The Space builds from `requirements.txt`. **TimesFM 2.5** installs from GitHub and its weights | |
| download on first launch. | |
| **Hardware:** runs on the free **CPU** tier — first launch takes ~1–2 min while TimesFM loads and | |
| forecasts the expected bands. A **T4 GPU** makes initialization noticeably faster. If `timesfm` | |
| can't be imported, the app automatically falls back to a seasonal (hour-of-day) expected band so it | |
| still works. | |
| ## How to use | |
| 1. Set the **playback window** and **healthy context** lengths, click **Initialize** | |
| (the context window trains the baselines and TimesFM bands). | |
| 2. **▶ Play** (or **Step**) to stream the records; **Speed** sets hours per tick. | |
| 3. **Inject an appliance fault**: pick an appliance, choose Over-draw / Under-draw / Off, set the | |
| magnitude and when in the timeline it begins, then **Apply**. | |
| 4. **Inject leakage**: set a continuous phantom load (W) and a start point, then **Apply**. | |
| 5. Watch the **Alerts & status** panel and the two charts react. | |
| ## How detection works | |
| - **Expected band** is forecast once by **TimesFM 2.5** from the healthy context window, per | |
| appliance (shown as the q10–q90 ribbon on the focus chart). | |
| - **Over / under / off** fire when an appliance's trailing **ON-power** deviates from its healthy | |
| **rated** value — robust to normal on/off cycling. (The forecast band is the visual evidence; the | |
| rated comparison is the trigger, which avoids false alarms on sharp on/off loads.) | |
| - **Leakage** = `mains − Σ(appliances)`, compared to the normal hour-of-day residual band. | |
| Importantly, an appliance fault raises the mains by the same amount, so it does **not** move the | |
| residual — only a true leak does. That keeps the two alert types independent and physically | |
| consistent. | |
| - AMPds2 has no real fault/leak labels, so the system is validated by **injection** — exactly what | |
| the controls let you do. | |
| ## Notes | |
| - Power is in **watts**; hourly energy in kWh = W / 1000. | |
| - The mains meter is `WHE`; `UNE` (unmetered) is excluded from the appliance sum. | |
| - TimesFM is used **zero-shot** (pretrained, no training on AMPds2). | |