Sense Labs home-energy monitoring — no official API, viable via unofficial wrapper (PARKED)
DARE.CO.UK · PARKED SKETCH · 2026-05-20
Mirrored from ~/.claude/.../memory/project_sense_energy_api_parked.md. This is a design sketch parked for future build — read for context, not as a current deliverable.
Dan 2026-05-20 asked about Sense Labs developer API. HEAD-checked + confirmed his hunch — no official API (sense.com/developers, developer.sense.com both 404). BUT an established unofficial Python wrapper (sense-energy on PyPI, github scottbonline/sense — both 200) reverse-engineers the same backend the iOS/Android app uses. Viable for daily-pull integration into pa.gf.cx, with the caveat that Sense could break it any time. Parked; resume on third occurrence of “I wonder if the X is drawing power” or when energy reconciliation becomes load-bearing.
Dan, 2026-05-20:
“about sense labs app for monitoring home-energy, does it have a developer api access, likely not, small api, but cool idea”
Status — no official API, but an unofficial path exists
| Surface | URL | Status |
|---|---|---|
| Main site | https://sense.com/ | 200 |
| Developer portal | https://sense.com/developers/ | 404 |
| Developer subdomain | https://developer.sense.com/ | 000 (DNS fail) |
| API path | https://sense.com/api/ | 404 |
| Help article re: API | https://help.sense.com/hc/en-us/articles/360044980791-Sense-API | 403 (gated) |
| Unofficial Python wrapper repo | https://github.com/scottbonline/sense | 200 (active) |
| PyPI package | https://pypi.org/project/sense-energy/ | 200 |
Conclusion: Sense has deliberately not published a public developer API. The 403 on the help article suggests they have an internal policy doc explaining why, but it’s not publicly readable. Reasonable guess: they want to monetise data via Sense Plus subscription tier + Schneider Electric partnership; opening an API undercuts both.
But — sense-energy (Python) has been maintained since ~2018 and reverse-engineers the WebSocket protocol the iOS/Android app uses to talk to Sense’s cloud. Same data the user already sees in their app, just pullable via Python.
What an integration would look like
Same OAuth-pull-render template as eBay / Harvest / Privacy (already a 4th parked sketch in this family). The shape:
~/bin/sense_pull.py # daily / hourly pull from sense-energy wrapper
├─ authenticates with Sense via email + password (stored in 1Password)
├─ pulls current-state realtime feed (snapshot)
├─ pulls trend data (hourly / daily kWh + cost)
├─ pulls detected-device breakdown (the "ML found your fridge" data)
├─ writes ~/Downloads/sense_pull_<date>.{md,json}
└─ catalog picks it up via REPORT_PATTERNS (publish.py)
What makes Sense data uniquely interesting for pa.gf.cx
Energy data has a cross-reference angle that other API integrations don’t:
| Sense “detected device” | pa.gf.cx surface to correlate against |
|---|---|
| “Always-on” baseline | pool pump, well pump, fridge — equipment that should appear in the master records |
| Detected cycle: pool pump | pa/equipment/pool-pump (record doesn’t exist yet — Sense data would justify creating it) |
| Detected cycle: well pump | pa/equipment/well-system (same — annual filter change is a known recurring task) |
| Spikes during garden equipment runs | John Deere / Husqvarna 150BT / Makita BHX — if Sense can tag these, runtime hours appear automatically |
| BBQ propane vs gas burner runtime | If gas grill + propane meter feeds Sense (unlikely directly, but worth noting) |
| Anomalies (e.g. compressor failing) | Could surface “this fridge is drawing more than baseline” as an early signal |
The compounding angle: Sense data + equipment master records + Harvest expenses (electricity bill) would let pa.gf.cx answer questions like “how much did the John Deere cost to run this season” or “is the pool pump drifting upward over time” — operationally useful, currently unanswerable.
Risk profile
| Risk | Mitigation |
|---|---|
| Sense changes auth flow → wrapper breaks | sense-energy is actively maintained (last commit recent); community usually patches quickly |
| Sense aggressively rate-limits or blocks reverse-engineered clients | Use polite intervals (poll every 5+ min, not realtime); be ready to back off |
| Sense’s TOS prohibits “automated access” | Likely yes for resale/commercial; personal use is grey area. Dan’s a paying customer; impact of getting locked out is “lose access to the unofficial wrapper, still have the app” — soft fail |
| Sense Plus paywall expands to cover data export | If Sense’s official subscription unlocks data export at a reasonable price, switch to that route + drop the unofficial wrapper |
| Account credentials in 1Password could be misused if API surface widens | Custom-named concealed fields (per feedback_1password_custom_concealed_fields.md) + read-only intent |
Cost
| Item | Cost |
|---|---|
| Sense hardware | Already owned by Dan |
| Sense subscription (if Sense Plus required for API access via Schneider partnership) | TBD on resume — verify current account tier |
| Python wrapper | Free (open source) |
| Compute / storage | Same as other pulls (~negligible) |
| Marginal cost of integration: $0–$X subscription | TBD |
Build estimate (when triggered)
| Step | Effort | Notes |
|---|---|---|
| 1. Verify wrapper still works | 10 min | pip install sense-energy + smoke test against Dan’s credentials |
| 2. Credentials in 1Password (custom-named concealed fields) | 5 min | Dan adds; item Sense Labs API with email + password fields |
3. ~/bin/sense_pull.py — basic pull |
90 min | Realtime snapshot + trends + device breakdown |
| 4. Cross-reference against equipment master records | 60 min | Auto-link detected devices to pa/equipment/ pages where they exist |
| 5. Catalog wiring (publish.py REPORT_PATTERNS) | 10 min | Same shape as harvest_pull_* |
| 6. Smoke test + first real pull | 15 min | Verify shape, format, run cron-ready |
Total: ~3 hours active work.
Resume conditions (build when ANY hold)
- Third occurrence of “I wonder if the X is drawing power” — the wondering-without-data signal
- Electricity bill anomaly — month-over-month spike that needs root-cause investigation
- Building out pa/utilities/ as a system on the landing — Sense becomes the data backbone
- Pool / well-system records get built — Sense data justifies the master records by surfacing usage patterns
- A second smart-home API gets integrated (Hubitat / Home Assistant / Ecobee) — Sense becomes natural to add as part of the same pull cycle
Skip / defer
- Sense app on the phone is already easy to glance at; if curiosity-driven, manual is fine
- If the wrapper breaks and Sense doesn’t open an official path, no fallback — abandon gracefully
- Don’t build until at least one of the resume conditions fires; this is speculative until then
Today’s standing in the API integration family
This is the 4th parked OAuth-pull-render sketch banked today:
| API | Status | Memory |
|---|---|---|
| eBay Sell API | Phase 0 in flight (eBay approval pending) | project_ebay_seller_api_integration_parked |
| Harvest API | Phase 1 LIVE (harvest_pull.py shipped today) | project_harvest_api_integration_parked |
| Privacy.com API | Parked (agent-purchasing thesis) | project_privacy_com_agent_purchasing_thesis |
| Sense Labs API | Parked (unofficial wrapper path) | this file |
| (already shipped) GSC API | LIVE | project_gsc_three_property_baseline |
The template is now well-proven across 5 integrations. Each new one drops in faster.
Sibling memories
feedback_1password_custom_concealed_fields.md— credential storage disciplinefeedback_test_links_before_shipping.md— HEAD-checked all 7 URLs in this memo (5×200, 2×404, 1×403, 1×000) before writingfeedback_check_devreports_before_infra_gap_analysis.md— when resuming, check~/bin/sense_*+~/Downloads/sense_pull_*firstproject_harvest_api_integration_parked.md— sibling parked sketch, same template familyproject_dare_messaging_service_v1_built.md— Pushover messaging service that an energy anomaly could feed into (alert Dan when something draws unexpected power)
The aphorism
The official API doesn’t exist — the unofficial one is the API. Trust the wrapper, plan for the day it breaks, build the integration anyway.