"""Offline, accessible power report. No network requests or external resources.""" import base64 import html import json def render(report, csv_text): def esc(value): return html.escape(str(value), quote=True) def download(text, mime, filename, label): data = base64.b64encode(text.encode('utf-8')).decode('ascii') return f'{label}' rows = [] for metric, item in report['summary'].items(): numeric = 'mean' in item values = [item.get(key) for key in ('min', 'mean', 'max', 'last')] cells = ''.join(f'{esc(value) if value is not None else "Unknown"}' for value in values) states = ', '.join(item.get('states', [])) or ('Numeric' if numeric else 'Unknown') rows.append(f'{esc(metric)}{esc(item["unit"])}' f'{cells}{item["available"]} / {item["unavailable"]}' f'{esc(states)}{esc(", ".join(item["sources"]))}') missing = sorted({g for sample in report['samples'] for g in sample['unavailableGroups']}) json_text = json.dumps(report, allow_nan=False, indent=2) links = download(json_text, 'application/json', 'frame-power.json', 'Download JSON samples and summary') links += ' · ' + download(csv_text, 'text/csv', 'frame-power.csv', 'Download CSV samples') return f''' Frame power and heat report

Frame power and heat report

Headset: {esc(report.get("headset", {}).get("alias", "frame"))}

{len(report['samples'])} of {report['requestedSamples']} requested samples received; target interval {esc(report['intervalSeconds'])} seconds.

Collection: {esc(report['stopped'] or 'Completed')}. Results describe only the samples received.

{links}

Unknown means missing, unreadable or invalid, never zero. Means exclude unknown values and are not time-weighted. Battery watts: positive charging, negative discharge. C means °C, W watts, A amps, MHz megahertz, RPM revolutions per minute. Raw readings have no inferred percentage or worn threshold. Rails overlap: do not sum them.

Unavailable sensor groups in one or more samples: {esc(', '.join(missing) or 'None reported')}.

{''.join(rows)}
Received measurements, with units and availability counts
MetricUnitMinMeanMaxLastAvailable / unknownStatesSources

Sensor accuracy is unverified. Suspect negative thermistors remain visible. No temperature safety limits, energy use or battery-runtime estimates are inferred. JSON includes actual timing, OS builds and per-sample availability.

This file stays on your computer and works offline. Downloaded files contain sensor source paths and OS builds; review them before sharing. No settings, services, security or passwords were changed.

'''