Four questions asked of an account that answers twenty-one

The connector called ten endpoints of the read surface the map lists, and
the charger card showed four views. Everything else an EV charger can
reach is now a capability too: the sessions and the history, the savings,
the sharing, the binding, the group, the Wi-Fi, the firmware and its
update log, the tamper records, the site's own detail, price, networks
and energy — plus the vehicle catalogue, dynamic pricing, the currencies
and the notification views. Thirty-eight endpoints, one action each. The
two message views are GET, so the request path grew a GET half that shares
the login retry with the POST one.

The per-charger fan-out asks all of them, six at a time rather than one
after another, and a charger that belongs to a site brings that site's
four views with it once the by-serial lookup has found it. A view that
answers with nothing now says so instead of vanishing: the station record
is empty for a standalone charger because it has no station, which is an
answer worth reading. And "source 0" in the OCPP box carries the address
the account's endpoint list gives it.

Anker's account-level writes stay out, as do the endpoints whose payloads
were only ever read out of the app package.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tajniak81
2026-09-02 22:53:36 +02:00
co-authored by Claude Opus 5
parent fb42791f8d
commit 3f9d5b943f
15 changed files with 839 additions and 70 deletions
@@ -545,9 +545,11 @@ func (s *Server) handleAnkerChargers(w http.ResponseWriter, r *http.Request) {
writeJSON(w, http.StatusOK, json.RawMessage(raw))
}
// GET /api/integrations/anker-solix/chargers/{sn}/details — every per-charger
// view the account holds: the station record, the charging totals, the OCPP
// backend and the RFID cards. Gated exactly like the charger list, and answered
// GET /api/integrations/anker-solix/chargers/{sn}/details — every view the
// account holds about one charger: the station record, the totals, the history,
// the sessions, the OCPP backend, the cards, the sharing, the binding, the
// firmware and the rest, plus the site's own views when the charger belongs to
// one. Gated exactly like the charger list, and answered
// the same way when a gate is off: 200 with nothing and the reason, because a
// disconnected integration is a normal state with an answer.
func (s *Server) handleAnkerChargerDetails(w http.ResponseWriter, r *http.Request) {