Skip to content

feat(midea): serve cloud AC state from cache (stale-while-revalidate) - #215

Merged
CallMeTechie merged 1 commit into
masterfrom
feat/midea-state-cache
Jul 3, 2026
Merged

feat(midea): serve cloud AC state from cache (stale-while-revalidate)#215
CallMeTechie merged 1 commit into
masterfrom
feat/midea-state-cache

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Problem

/midea und das Portal-Widget rufen beim Laden pro Gerät getState() auf, und getState machte für Cloud-Geräte immer einen vollen Cloud-Roundtrip (~1,4 s) — plus einen Re-Login, sobald Midea den Token hat ablaufen lassen. Der vorhandene In-Memory-State-Cache wurde geschrieben, aber nie zum Ausliefern gelesen. Ergebnis: langsames Widget-Laden und der Eindruck „bei jedem Aufruf ein Login".

Diagnose (live am Prod-Container verifiziert, read-only)

  • Session (accessToken + Session-Keys) ist verschlüsselt persistiert und wiederverwendbarlistDevices und sendCommand(buildQuery) funktionieren mit der gespeicherten Session ohne Re-Login.
  • Der Login passiert also nur bei Token-Ablauf — aber weil nichts gecacht wurde, traf jeder Seitenaufruf die Cloud (und damit jeden abgelaufenen Token sofort).

Fix

getState liefert einen bekannt-online Cloud-Zustand sofort aus dem Cache aus, solange er < 90 s alt ist (kein Cloud-Roundtrip, kein Re-Login). Darüber hinaus wird der gecachte Zustand weiterhin sofort zurückgegeben, aber ein entprellter Hintergrund-Refresh angestoßen. LAN-Geräte unverändert. Session-Persistenz war bereits vorhanden und bleibt unangetastet.

  • CLOUD_STATE_TTL_MS = 90000, per-Device Dedupe der Hintergrund-Refreshes.
  • Eigene Steuerbefehle (setState) aktualisieren den Cache ohnehin sofort → Anzeige bleibt live.

Tests

  • Neuer Test in midea_devices.test.js: kalt = genau 1 Cloud-Roundtrip, warm innerhalb TTL = kein weiterer Call.
  • Lokal grün: midea_devices, midea_api, midea_portal_display (47 Tests).

🤖 Generated with Claude Code

/midea and the portal widget called getState per device on every load, and
getState always did a full cloud round-trip (~1.4s) — plus a re-login whenever
Midea had expired the token. The in-memory state cache was written but never
read to short-circuit.

Now getState serves a known-online cached cloud state instantly within a 90s
TTL (no cloud round-trip, no re-login); beyond the TTL it still returns the
cached state immediately but kicks a single deduped background refresh. LAN
devices are unchanged. Session persistence already worked and is untouched;
this just stops hitting the cloud (and thus its token expiry) on every load.
@CallMeTechie
CallMeTechie merged commit 5122a9a into master Jul 3, 2026
8 checks passed
@CallMeTechie
CallMeTechie deleted the feat/midea-state-cache branch July 3, 2026 19:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant