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)

  1. Third occurrence of “I wonder if the X is drawing power” — the wondering-without-data signal
  2. Electricity bill anomaly — month-over-month spike that needs root-cause investigation
  3. Building out pa/utilities/ as a system on the landing — Sense becomes the data backbone
  4. Pool / well-system records get built — Sense data justifies the master records by surfacing usage patterns
  5. 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

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

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.

Source: parked_sketch_sense_energy_api_2026-05-20.md · Rendered 2026-05-20 18:23