Details
Measured array curve
120 ms, 24 points, about 0.04 Wh — the battery absorbs it and the bus moves ~2.6 V. For the shading study press Auto off first, so P&O has time to settle onto a local peak before you sweep.
What the curve says
Fill factor tracked day to day is soiling and degradation monitoring with no extra instrument. A curve taken while the light was moving is marked light moved — the board rejects its diagnostics and so should you; just sweep again.
Settings that govern a sweep
These are read-only here — change them on Config. They are listed because they are the three reasons a sweep silently does nothing: no charge headroom, the stage holding the bus, or a sweep less than 60 s ago.
Battery pack
Energy
Statistics
Peaks, hours and counters restart at the board's midnight (the date pushed by the ESP32) or on Reset today. Full cycles = charge Ah / the pack's rated Ah as the BMS reports it over CAN (0x7320); until that frame has been heard, BATT_PACK_AH in firmware (314 Ah).
Processor
ISR load is measured by bracketing the cycle counter around the control ISR — the only exact method on this part. The ISR runs at priority 0, so its share is the only thing that can starve the main loop. A measured rate that is not the configured one means every control gain is wrong.
Lifetime
Peaks are sampled at 10 Hz and survive power cycles — they answer “has this board ever been near its limits”, not “what was the transient”; the hardware OVP/OCP catches those. MCU boots climbing with no manual resets means brownouts — chase the supply. Clear stats on the dashboard resets the peaks and nothing else.
Warranty
Two independent clocks — either can expire, and a zero term disables that one. The board has no RTC: its date is whatever the ESP32 last pushed, so a board that has never been told the date cannot age the day clock.
Serial links & CAN
COM1 is the ESP32 on TTL, COM2 the RS485 port. Resyncs mean the parser had to hunt for AA 55 again — a few after a reboot are normal, a climbing count is noise on the line. The CAN error counters back off on their own: error-passive with the BMS still answering means the bus is marginal, not dead, and bus-off means it stopped transmitting entirely.
5V logic only. Disconnect the bus, battery and PV before updating. Local mode uploads over the LAN; Cloud mode sends over the MQTT broker from anywhere. A failed transfer keeps the old firmware, but a power loss during the ~1 s flash burn needs ST-Link recovery. The converter is stopped automatically before flashing.
In Local mode: one upload straight to the board over the LAN. In Cloud mode: chunked over the MQTT broker — works from anywhere on the internet, no VPN needed. The agent flashes itself and reboots — telemetry drops for about 20 s. A failed transfer is harmless: the ESP32 verifies the image before switching to it, so the current firmware keeps running. But firmware that flashes and then cannot reach WiFi needs a USB cable to recover — test the build before sending it to a remote site.
The MCU clamps out-of-range values. Each row shows the value the MCU stored, not the one you sent.