Each fan tile carries data-fan / data-ceil / data-measured and a small script polls /api/metrics/latest every 5s — the metrics collector's own sampling period, served from memory with no extra BMC call — updating each tile's spin rate, duty fill and tooltip in place. Polling faster would only re-read identical numbers; sampling the BMC faster would choke it under load. FanReading gains json tags for the endpoint. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019VHG21rgTUiR1G3qFHTVmN