design
VP, Telematics & KaaG
Section titled “VP, Telematics & KaaG”Job to be done
Section titled “Job to be done”Give the VP of Telematics & KaaG one surface that answers, in order: is the VCU estate healthy and reachable right now, is uptime improving or declining, which units and SIMs need intervention and of what kind, and — when a unit needs a push — let the VP send the command from here. The KaaG programme (sessions, energy, impact, rollout, the board report) remains a section within it, no longer the frame around it.
Information architecture
Section titled “Information architecture”The sidebar leads with a Telematics group; KaaG programme (sessions, usage & energy, rider impact, inspection & rollout) and Reporting follow.
- Fleet overview (
#page-fleet, the boot page): estate KPIs — active VCUs 339/348, fleet uptime 7 d with its WoW delta, not-reporting count split silent/offline/dark, Onomondo SIM sessions online — over the estate-wide last-seen honesty bucket strip, a 14-day daily-uptime trend charted against the 96% executive floor, a right-rail metric stack (commands sent · 7 d with median ack, firmware-current share and the OTA window, SIM data used MTD), and the estate-wide VCUs-needing-attention table. - VCU register (
#page-vcus): every provisioned VCU — KaaG and standard fleet — in one.tbl-cardfiltered by reporting state, programme, firmware and free search. Rows carry the RADR cell widgets (.agechips,.upt-spark,.soc-wrap,.carrier-cell+ RSSI,.fsyschips) plus a programme badge with the firmware as its sub and an Onomondo SIM-session cell with data MTD. Row click opens the VCU detail. - Connectivity & SIMs (
#page-sims): built on what the Onomondo API actually exposes. KPIs fromGET /sims(sessions online, silent > 24 h bylast_came_online_at, attach-blocked, data used MTD from the 15-minute usage webhooks). A connectivity watchlist separates the outage classes Onomondo lets us distinguish — session flapping (registration/deregistration pairs), online-with-zero-MQTT-bytes, blocked at the data cap (self-recovers atresets_at), auth-denied (network_whitelistconfig), IMEI mismatch (SIM pulled from its VCU), and SMS-only registration (is_data_attach: false, reachable for the out-of-band wake). Network distribution groups operator and RAT. The SIM estate table shows ICCID, session state, network, data against the 500 MB cap, and the issue class; the in-page note states that Onomondo exposes no radio signal metrics — RSSI everywhere on this surface is VCU-modem telemetry. - Uptime & health (
#page-health, formerly “Fleet health”): the 90-day uptime story with incident annotations, uptime by carrier, firmware spread, SOC-cutoff frequency and the attention table. - KaaG sessions (
#page-sessions): the generator product as sessions. Active sessions now (inverter on and drawing — rider, started, elapsed, draw W, energy so far at the ₦90 tariff, live SOC) over a filterable session history (end reasons: schedule end, manual off, SOC floor cutoff). Row click opens the session detail (#page-session-detail): a.pg-backinner page with the session’s KPIs (energy + ₦, duration, average draw against the 1 kW inverter, SOC start-to-end) and the energy-through-the-session chart — cumulative kWh area with the instantaneous draw line, hoverable per interval, with the SOC-floor cut annotated when it ended the session — plus session and measurement cards (inverter-kWh vs battery-Ah divergence, floor guard, billing). - Rider impact (
#page-impact): does KaaG improve efficiency and retention. Cohort KPIs (90-day retention 93% vs 84%, swaps per week, active days, monthly churn), a 12-week retention curve of KaaG riders against a matched non-KaaG cohort, efficiency-by-cohort paired bars, and the demand signal — riders with expressed interest (212), interest-to-installed conversion (58%, median 24 days), referral share. The in-card note is explicit: observational, cohorts matched on cluster and tenure, causality waits on the Q4 staggered-rollout readout. - Usage & energy / Inspection & rollout / Management report (
#page-usage,#page-rollout,#page-report): scoped to KaaG units only — standard-fleet units never appear in usage, billing or the programme funnel. The rollout pipeline starts at demand: Expressed interest (waitlist) tops the five-stage demand & eligibility pipeline. The former programme-overview page was retired — sessions carry the who-is-using-it story, rider impact carries adoption-vs-outcome, and never#page-overviewremains. - VCU detail (
#page-unit-detail): the record page — identity card (whose SIM row now carries the ICCID, RAT and data MTD with the SIM issue badge), decoded signals, 24 h connectivity timeline, display & indicators, session history, and the full per-unit event timeline (commands, auto policy, connectivity, firmware, lifecycle).View live streamsits in the page head as a.btn-secbesideSend commandand opens the view-only raw console — a read-only mirror ofpub/{serial}— in a wide centred.dlg(.dlg-xl, 1080px) rather than a card at the foot of the Overview tab, so triage never pushes the record below the fold. Frames render whole, never ellipsis-truncated, with a JSON / Plain text toggle in the console head: formatted multi-line JSON with syntax colour, or the raw single-line frame as it crosses the wire. The demo payload mirrors the production frame schema (fvr gps sig gst vol cur soc soh tmp spd rpm ger odo rem mcu kst inv); the offline tail ends on the retainedwill/{serial}LWT row. Closing the dialog (✕, overlay or Escape) stops the mirror. Commands sent from this surface appear in the timeline immediately, stamped to the sender.
Commands
Section titled “Commands”Send command is a .btn-pri on Fleet overview, the VCU register and the VCU detail, opening a centred .dlg with .fld fields: VCU picker (preselected from the detail), command — request telemetry snapshot, battery unlock (Magnetic), inverter ON/OFF (KAAG_ON/KAAG_OFF), reboot VCU, retry OTA, SMS wake — and a mandatory reason that goes to the audit log verbatim. Commands publish to cmd/{serial} over MQTT; the SMS wake goes out-of-band through the Onomondo SIM (POST /sms/{sim_id}) for units with no data session. A live unit acks in seconds; a silent unit shows QUEUED. Every send is written to [radar-command-audit] and prepended to the unit’s event timeline.
Access boundary
Section titled “Access boundary”The VP holds command authority over the estate (snapshot, unlock, inverter, reboot, OTA retry, SMS wake) — each send requires a reason and is audited. The live stream is a view-only mirror; command publishing over raw MQTT remains restricted to Engineering. Raw frames retained 90 days with 1 m/1 h aggregates keeping history. KaaG assignment, approval and billing edits stay with their own personas; this surface has no create/edit/assign affordances outside the command dialog. Retention honesty is stated in-page.
Web 1440 Atlas shell on the RADR visual foundation; kaag-radr-foundation.css loads before this flow’s own CSS so the canonical shell wins. KPI rows are canonical .pstat at 4-up; tables are .tbl-card > .tscroll > .tbl with filters as .filt-select in the .tbl-card-head (never a .pseg filter strip — .pseg stays on detail-page sub-sections); the command dialog is a centred .dlg with .fld fields; badges are .badge b-*; trend deltas are badge text, never text glyphs. The RADR cell widgets pair each reading with its qualifier in one cell (uptime under last-seen, SOH under SOC, fault chips under the carrier, firmware under the programme badge, data MTD under the SIM session) so the register reads at six columns. Serial numbers, ICCIDs and payload field names stay in General Sans with tabular-nums. Cards are shadowed, never bordered; no side drawers — the record is a full details page; toasts confirm sends.