

| RPM | Floor (%) | Knee (%) | Locked | Learn °F | Last seen |
|---|
Pick a pill to focus on one protection. Tune the control loops first (in the Tuning tab, protections off), then adjust these after.
When measured alternator current exceeds the safe limit for the debounce duration, the trip fires. Set Command Limit to the lowest safe maximum on the alternator side of the system — alternator continuous rating, mechanical belt drive capacity, fuse ratings, and wiring limits. Whichever is lowest. Battery acceptance is handled separately by the Group 4 Battery Charge Current Limit. The trip threshold is automatically 10 A above Command Limit.
Predicts where battery voltage will be a fraction of a second from now: predicted = measured + Prediction Horizon × voltage rise rate. Engages when the prediction exceeds the active charge target by more than the Group 1 Trigger Margin. dvdt EMA TC sets how much the rise rate is smoothed before prediction — larger TC means smoother but laggier. Group 1 Enable turns the whole layer off.
Engages when measured battery voltage exceeds the active charge target by more than the Group 2 Trigger Margin. Group 2 Enable turns the whole layer off.
Watches alternator output current. Two regimes, split at the Strict Over-Current Band below target. Near the target: engages when the time-averaged current rises above the commanded setpoint by more than the Detection Threshold. Below the band: the looser Detection Threshold (Bulk) takes over, judged against the commanded ceiling instead of the moving setpoint — so normal speed-up ramps don't false-trip. The threshold is bounded by the Threshold Floor / Ceiling (amps), and Release Hysteresis sets the re-arm point.
Two battery-side features. Battery Charge Current Limit is a ceiling, not a trip: the commanded alternator current is capped at the limit plus the measured house-load draw, so the battery never sees more than the set amps no matter what the loads are doing. It needs the INA228 battery shunt and is off when set to 0. Load Dump is a protection: three tiered thresholds on the rate-of-change of battery current — Tier 1 fires when one sample exceeds its threshold, Tier 2 when two consecutive do, Tier 3 when three consecutive do — catching FET-disconnect or load-drop events. Unlike the over-current detectors, Load Dump stays armed even when test protections are disabled.
The field drive FET is switched off and the field collapses through the coil's natural time constant. The only knob is the trip debounce above; none of the integrator-bleed actions used by the other protections apply here.
KHard — Response Slope sets how aggressively the current cap is trimmed per volt of overshoot — recomputed from the live overshoot every tick. Shared with Measured OV. AW Bleed Rate continuously drains the voltage integrator while any of the other protections is clamping.
Same KHard — Response Slope cap-trim mechanism as Predictive OV (shared parameter). AW Bleed Rate continuously drains the voltage integrator while the clamp is active.
Trims the current cap by the measured amount of excess each tick — the same cap-trim action the OV groups apply, but driven by alternator-current overshoot rather than voltage. K_bleed — Integrator Bleed Mode additionally drains the voltage integrator when the event fires — 0 means snap to zero (maximum response); > 0 takes a single bite proportional to the amount of excess. AW Bleed Rate also drains continuously while active.
Battery Charge Current Limit has no trip response — it is a ceiling the command simply never exceeds. Load Dump snaps the voltage integrator to 0 instantly on the rising edge of the trip — hardcoded, no adjustable parameter for the snap itself. AW Bleed Rate drains the integrator continuously while it is active.
After the trip, the regulator enters a ramp-and-lockout — the field stays at 0 until the over-current condition has cleared. The recovery path used by the other protections (Recovery Seed Fraction, Seed Protect Window) is not used here.
When all protections have released, the voltage integrator is restored to pre-event value × Recovery Seed Fraction. Seed Protect Window protects the fresh seed from being immediately drained by a brief subsequent event. Fast Setpoint Rise Rate then accelerates the slewed current setpoint back up while battery voltage is comfortably below target, so the alternator crosses its deadband and starts producing current again quickly.
Battery-side protections that ramp the field down or cut it entirely when a battery-safety limit is exceeded. These thresholds sit above the four control-loop throttling protections (Setup → Alternator → Protections) and a separate hardware overvoltage backup (needs no configuration).
Rebulk: The system always begins in Bulk when charging is enabled. It returns to Bulk from Float or Idle if battery voltage drops below Rebulk Voltage or net discharge current exceeds Rebulk Current Threshold — continuously for Rebulk Debounce Time. The timer resets if the condition clears before the debounce expires. If SoC data is available, it suppresses rebulk when the battery is at or above the block threshold and permits it again when SoC drops to the allow threshold — but SoC alone cannot trigger rebulk; voltage, current, or (in float) timeout criteria must also be met.
Bulk: The system pushes the maximum thermally- (and otherwise-) allowed current from the RPM Cap Table. Bulk ends once battery voltage has remained continuously at or above Bulk Voltage for Bulk Voltage Debounce Time.
Absorption: The voltage loop holds the battery at Absorption Voltage. Current is no longer commanded — the battery dictates how much it accepts and it tapers naturally as the battery fills. Absorption ends when current drops to or below Tail Current continuously for Absorption Completion Time. If the system is thermally constrained (the thermal penalty is meaningfully active and current is already near the tail threshold), tail detection is suspended until thermal headroom recovers — this prevents a false "battery full" exit triggered by the thermal loop pulling current down. If tail current is never reached, a safety exit to float or idle occurs after Absorption Timeout.
Float (if enabled): The system holds the battery gently at Float Voltage. After Minimum Float Time has elapsed, rebulk criteria are evaluated. Float also has a hard ceiling — if Float Duration elapses while in float, the system returns to Bulk regardless of voltage or current. (Idle has no equivalent timeout; only the rebulk conditions can leave it.) If Use Float is OFF, charging stops after Absorption and the system idles until rebulk criteria are met — better for lithium longevity in cycling applications.
| Day | Irradiance (kWh/m²) ℹ️ Solar energy hitting your location per square meter per day | Predicted (kWh) ℹ️ Expected output based on your panels' rating and performance ratio |
|---|---|---|
| Today | 0.0 | 0.00 |
| Tomorrow | 0.0 | 0.00 |
| Day 2 | 0.0 | 0.00 |
Weather mode automatically fetches solar irradiance forecasts using your GPS coordinates and calculates expected solar panel output. GPS coordinates are obtained automatically — first from your NMEA2000 network (boat GPS), and if that goes silent, from your phone's location (when the app has location permission). You can also type coordinates manually below; a manual entry is a sticky override that takes priority over both the boat and phone GPS until you press "Use automatic GPS" to return to automatic sourcing. When high solar conditions are predicted for two of the next three days, alternator charging is paused. Solar panel wattage and performance ratio settings allow accurate prediction of future solar energy production. GPS coordinates are required for weather forecasts to work. If the "Update Weather Now" button fails and forecasts are not updated, check the Console tab for troubleshooting information (missing GPS, weak WiFi, etc.). This feature reduces fuel consumption and system wear when Mother Nature is planning to help.
Four independent checkpoints decide what data gets recorded on the Live Data → Diag tab. These are their gates & tuning knobs — pick a pill to see only that checkpoint's settings; a setting shared by two checkpoints shows under both of them.
C1 — Anomaly Detection watches the fast current sensor for rectifier/stator fault signatures. It shares the fast channel and its steady-state admission gates (current drift floor/slope, input-range switching) with C2 — those live in the shared Fast Current Channel section. Its own pieces: the fault alarm, the fault-class and lifetime-anomaly readouts, and the anomaly snapshots in the Waveforms flipbook. Arming ignores engine speed entirely, so it keeps working with a dead tach.
C2 — Resonance & Ripple Map learns the strongest current-ripple tones at every engine speed and load, from the same fast channel as C1. It uses the shared current-drift gates plus two gates of its own: the steady-state RPM margin (a window is discarded when the engine sits on a speed-bin edge) and the minimum tone amplitude. Its results: the map itself, the worst ripple & tone table, and the biggest actionable disturbance.
C3 — Charging System Health grades output amps against the best this machine has ever done at the same operating point. A point is admitted only after every signal — RPM, field duty, voltage, temperature, amps — holds steady. Those admission gates and the curve-fit tuning are the knobs under Gates & Tuning in this section; the resulting health gauge, session plot, and engine-hours trend appear on Live Data → Diag → Alternator.
C4 — Ripple Measurements is one measurement engine with two collectors: the RPM ripple table is filled only by the commissioning game, and the ripple-vs-current line on the Protections plots is filled only by Commissioning Step 5. These gates define what counts as a valid measurement for both. They are deliberately separate from C1/C2’s gates, so tuning them can never loosen fault-detector arming.
Steady-State Detection
Point Admission
Curve Fitting
High-Field Alert
Reference & Data
Performance Learning ℹ️Settings for the best-ever boat-speed learning system. The live polar / motoring display is under Live Data → GPS/Travel/Wind.
A reading is only banked when conditions hold steady. Most inputs below come as a pair: a band (how much that value may drift) and a steady time (how long it must stay inside the band before the reading counts). Tighter bands and longer times give fewer but cleaner points.
Fuel Consumption
Motion Events
A wizard to pre-tune the current and voltage control loops (and some additional parameters) for this alternator.
Steps
Progress is saved on the regulator, so it survives a page reload and shows the same on any device. The badge on the right of each step shows its state: ✓ DONE = finished, ▶ = the step you're on (RUNNING while the wizard is open, RESUME when paused), ○ = not yet run. Tick the steps to run, then press the button below — coupled steps are selected automatically.
Only the ticked steps will run.
Test Parameters
Test Results
Rise/fall delays from the most recent Step run. Sine Sweep (Bode) results appear in the test window while that test runs.
Rise Delays (ms)
Fall Delays (ms)
| # | Rise Avg (ms) | Fall Avg (ms) | Rise Trials (ms) | Fall Trials (ms) | Step Amp (A) | Quiet PP (A) | Setup (%) | RPM | Alt Temp (°F) | Bus V | Stage | Abort | Date/Time |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No records — open section to load. | |||||||||||||
Sorted by Rise Average (lower = faster plant = better). Aborted runs sink to end and are dimmed.
Abort column shows Rreason/Pphase — reason 254 = stabilize-phase timeout; others map to the firmware's FieldEventReason enum.
| # | Roll-off (Hz) ↑ | DC gain (A/%) | Worst lag (°) | Wave Amp (%) | Wave Floor (A) | Sweep (Hz) | RPM | Alt Temp (°F) | Bus V | Stage | Date/Time |
|---|---|---|---|---|---|---|---|---|---|---|---|
| No records — open section to load. | |||||||||||
Open-loop plant frequency response, one row per completed Sine Sweep. Sorted by −3 dB roll-off (higher = faster plant = better). Click a row to show that run's full gain/phase curve.
Apply Results
The test measures the field coil's electrical lag (plant delay). The "Set All Filters" button inside the modal writes plant/3 to the two alternator-current filters (the PID feedback and the on-screen display) and the full plant delay to the voltage filter — see each tooltip below for the reasoning. You can also override any value individually.
plant/3 lets the controller see current dynamics in close to real time without feeding raw sensor noise into Kp/Kd. Separate from the alternator current display filter and from the iExcess detector's own averaging (Group 3/4). Mostly inert when the Output PID signal source is MA(N) or Raw, but the same EMA is also used unconditionally to seed the CV integrator on the AUTO→CV handoff. Echoed read-only in Current tab → Output Current Controller.
Control Loop
Term Contributions
Field Output
| # | Score ↑ | Kp | Ki | Kd | SDiv | Track | DRamp | Amp | Per | Floor | RPM | Temp°F | Worst | t(s) | BusV | Stage | Date/Time |
|---|
Score = ISE/s (lower is better). Scored within 5s of each setpoint step, after 2 ring-in cycles. ■ <5 ■ <10 ■ ≥10. Highlighted rows match current PID + wave settings.
| # | Bandwidth (Hz) ↑ | Peak gain | Worst lag (°) | Kp | Ki | Kd | Sweep (Hz) | Amp (A) | Base (A) | Bus V | RPM | RPM min–max | Temp°F | Coh | Clip | Stage | Date/Time |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No records — open section to load. | |||||||||||||||||
Sorted by −3 dB closed-loop bandwidth (higher = the loop follows faster setpoint motion = better). Click a row to show that run's full gain/phase curve. Highlighted row matches current Kp/Ki/Kd.
Voltage Control Loop
| # | Score | ↑Settle | ↑OvV | ↑ISE | ↓Score | ↓Settle | ↓OvV | ↓ISE | ↓US | VKp | VKi | SRR | SFR | AwBl | AwRec | AwSP | RsF | KS | KH | IEx% | IEτ | IKB | LDT2 | LDT1 | LDT3 | TC | WA | WP | KO | CR | OVf | IEf | LDf | HOCf | RPM | Temp | BattV | SOC% | CVT | Stage | Date/Time |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No records yet — open section to fetch. | |||||||||||||||||||||||||||||||||||||||||
Score = (HIGH ISE + LOW re-overshoot ISE + LOW undershoot ISE) ÷ total active time, ×1000. HIGH phase: squared error; overshoot above 25mV dead-band weighted by Overshoot Penalty (K), approach weighted ×1. LOW phase overshoot: squared ISE, only after voltage crosses below target (no descent-from-HIGH penalty). LOW phase undershoot (↓US): squared ISE ×0.15, 1s grace from phase start then ramps to full weight over 10s. Both lower is better. ■ <10 ■ <20 ■ ≥20. Highlighted rows match current VKp/VKi + wave settings. OVf/IEf/LDf/HOCf = protection fire counts during scored phases.
Thermal Loop Status
Term Contributions
PID Control Architecture
Three-Loop Cascaded Control: Three independent controllers run at different rates and stack on top of each other. The output current loop runs 10 times per second and drives the alternator field duty cycle to chase a current target. The voltage loop also runs 10 times per second during the voltage-hold phases (Absorption and Float) — it computes the current target that holds the battery at the configured voltage. In the current-limited phase (Bulk) the voltage loop stands aside and the system charges at the ceiling. The temperature loop runs once every 5 seconds, and outputs a single thermal penalty in amps that gets subtracted from the RPM Cap Table ceiling before the inner loops see it. The cascade is strict: temperature constrains what current the voltage loop is allowed to ask for; the voltage loop constrains what the output current loop is allowed to chase; the output current loop is the only thing that touches the field. Each layer never reaches past the one below it.
RPM Cap Table: For each engine RPM range, you configure a hard ceiling based on your installation's physical limits — belt load, shaft stress, alternator and battery bank ratings. This ceiling is enforced after the thermal penalty is applied and is never exceeded regardless of thermal state. The ceiling can be entered as either a current limit (Amps mode) or a power limit (kW mode) using the toggle above the table. In Amps mode the configured value is a fixed current ceiling. In kW mode the regulator divides your power limit by live battery voltage on every control tick to derive the amp ceiling — so the mechanical load on the belt and shaft stays constant regardless of voltage sag or rise during charging.
Forecasted Thermal Penalty: The temperature controller acts on the higher of two temperatures: the present filtered reading, and a projected temperature — present temperature plus the measured rate of rise multiplied by the Thermal Lookahead horizon. Projection is what lets the loop pull current down before the alternator actually reaches the limit, while taking the higher of the two means a hot alternator is never given current back just because the temperature trend has flattened. The setpoint is the real damage limit (Alternator Temp Limit) and the output is a penalty in amps: zero means no restriction, higher numbers mean more current pulled away from what the RPM Cap Table would otherwise allow. Because the penalty is relative rather than absolute, it transfers cleanly across RPM and stage changes. The penalty itself is slew-limited so brief temperature noise doesn't cause harsh current swings.
Voltage Loop: A proportional-integral controller (Voltage Loop Kp and Ki) holds battery voltage at target during the voltage-hold phases (Absorption and Float). Its output is an alternator-current target, capped at the RPM Cap Table ceiling (with thermal derating) and, when the Group 4 Battery Charge Current Limit is set, at that limit plus the measured house-load draw — so the battery's share of the output is bounded regardless of what the loads are doing. The current-limited phase (Bulk) commands alternator current the same way. The integrator uses asymmetric gain — it bleeds down fast when voltage runs above target and rises slowly when below, biasing toward safety. The Slope Bleed Gain drains the integrator when voltage is climbing quickly, which prevents overshoot during the approach to target. Anti-windup freezes upward integration whenever the current ceiling — not voltage — is the binding constraint, so the integrator does not load up while unable to act. The loop gains are set by the commissioning wizard's plant fit rather than tuned by hand (see below), and can be automatically re-scaled with board temperature to hold the loop's speed and damping constant as the battery's internal resistance changes with temperature.
Three-Stage Charging: The regulator implements a constant-current / constant-voltage / float charging cycle (CC/CV/Float), with an optional Idle mode after Absorption for lithium longevity.
In Bulk, the voltage loop is off and the system charges at the maximum thermally allowed current from the RPM Cap Table. This continues until battery voltage has been held at the Bulk Voltage target continuously for the Bulk Voltage Debounce Time — a debounce that prevents transient voltage spikes from triggering a premature transition.
In Absorption, the voltage loop engages and holds the battery at the Absorption Voltage. The battery itself now dictates how much current it accepts — current tapers naturally as the battery fills. The system exits Absorption when charge current has dropped to or below the Tail Current for the Absorption Completion Time, confirming the battery is genuinely full. If the system is thermally constrained — meaning the thermal penalty is meaningfully active AND current is already near the Tail Current — tail detection is suspended until thermal headroom recovers, preventing a false exit before the battery is truly full. A safety timeout (Absorption Timeout) forces a transition to Float (or Idle, if Use Float is Off) if Tail Current is never reached.
In Float, the voltage loop holds the battery at the lower Float Voltage. After the Minimum Float Time has elapsed, the system monitors for voltage sag or sustained discharge current. If either condition persists for the Rebulk Debounce Time, or if Float Duration expires, Bulk charging restarts — subject to SoC blocking if SoC data is available. If Use Float is Off, the system skips Float entirely and enters Idle after Absorption, charging again only when rebulk criteria are met.
Independent Protection Layers: Several fast-response protections sit outside the three-loop cascade and act on raw sensor readings without filter lag. Fast OV (Groups 1 and 2) caps current immediately when raw battery voltage runs above a margin below the charging target. Load Dump protection (Group 4) caps current when a sustained battery-current rise rate is detected, catching FET disconnect or load drop events. The over-current detector (iExcess, Group 3) caps the current ceiling when measured alternator current overshoots the commanded setpoint — with a strict regime near the voltage target and a looser one in bulk — and collapses the voltage-loop integrator at the same time so it can't immediately re-demand the excess. Its trip threshold is not a single fixed number: it is max(floor, percent·commanded current, ceiling), so the percentage term rides up with the commanded current — tight at low current (catches real over-current sooner) and looser under heavy output (tolerates the larger legitimate ripple that comes with load) — while the floor guards the low-command case and the ceiling caps it. You set those in Protections; the commissioning wizard measures the ripple and plots it against your thresholds so you can check them, but never sets them for you. None of these depend on the control loops being active — they are always armed.
Stability and Recovery: All mode transitions are bumpless — both the output current loop integrator and the voltage loop integrator are seeded to the operating point before the new mode takes over, so transitions never produce a setpoint step. If the temperature sensor goes stale, the temperature loop holds its last penalty value and re-enters smoothly when fresh data returns rather than snapping back. Anti-windup keeps the temperature integrator parked near any tighter non-thermal constraint when thermals are not the binding limit, so the penalty can climb the instant temperature demands it. A hardware-level shutdown path (GPIO4) provides two independent escape hatches: immediate cut for critical conditions (temperature critically over limit, hard fault) and a controlled ramp-then-cut for sustained warning-level conditions. GPIO4 protection remains active regardless of loop state. Any fault that interrupts charging restarts from Bulk when charging resumes, never mid-cycle.
How the Control Loops Are Tuned
Start with commissioning — it does nearly all of this for you. The Commissioning tab runs a guided wizard that measures your specific alternator and battery bank and sets almost every loop and protection parameter automatically. You creep the throttle when it asks and confirm each step; it does the math. On most installs this is the only tuning you ever do — the manual procedure below is for hand-verifying or fine-tuning after the wizard, or for the rare case where you want to override what it found.
The wizard walks eight steps, each writing real settings on Apply:
• Prep — snapshots your current settings and checks preconditions (engine
running, headroom, a valid battery shunt) so a run can be reviewed or reverted.
• Field curve — ramps field duty open-loop and maps duty→output current,
finding the saturation knee.
• Min% floor — finds the field level where each RPM range first starts making
current, and fills the RPM table's Min(%) column.
• Plant fit — a sine sweep on field duty measures the inner current loop's
plant (time constant and gain) and proposes its PID gains and filter constants (also on the Plant
Delay tab).
• Verify — a closed-loop sweep with the new inner-loop gains, confirming the
loop is stable before anything downstream trusts it.
• Disturbances — you creep idle→cruise while it records the worst ripple
per RPM range (belt resonance) on both the alternator and battery signals, building the Resonance
& Ripple Map.
• Thresholds — a read-only review: it draws the over-current detector's trip
threshold (from the floor, ceiling, and percent you set in Protections) against the ripple just
measured, so you can confirm your settings clear it. Nothing is written here.
• CV plant fit — commands one bounded current pulse through the tuned inner
loop and measures how battery voltage responds to the current step (the finite-horizon gain K20),
then computes the voltage-loop gains from your chosen response time.
Every step is advisory — it proposes, and nothing changes until you press Apply. You can re-run a single step, or clear and start over. Progress is stored on the regulator, so it survives a reload and looks the same from any device.
Manual tuning (optional). The output current loop and the voltage loop each also have their own live tuning mode you can drive by hand — Tuning Mode for the inner current loop (Current tab), and the plant-fit / Auto-or-Manual gain selector on the Voltage tab for the voltage loop. Tune them in that order — inner loop first, then voltage — because each layer depends on the one beneath it being stable. The rest of this section covers hand-tuning the inner current loop; the voltage loop has its own dedicated tab with a built-in step test, an Auto mode that reuses the commissioned plant fit, and live scoring. The temperature loop is tuned offline from logged data (no live step test) — its tab shows the live control plot and the controller parameters.
Three-Phase Process: The goal is to tune the core PID first, then verify it handles the rate limiters gracefully with anti-windup tracking. Tune in bulk stage — absorption and float share the same output current loop, so a well-tuned bulk response carries through automatically.
Phase 1 — Core Loop (Unrestricted):
Set both slew limiters to very high values to effectively disable them:
• Setpoint Rise Rate: 1000 A/s
• Setpoint Fall Rate: 1000 A/s
• Duty Ramp Rate: 1000 %/s
Enable Tuning Mode and watch the step response on the plots. Tune Kp, Ki, and Kd until you get
well-damped step responses with minimal overshoot (10–20%) and fast settling time (2–4 seconds).
Phase 2 — Actuator Slew + Anti-Windup:
Re-enable the actuator slew limiter by setting Duty Ramp Rate to a realistic value (typically
10–30 %/s). Keep setpoint slew limiters high (1000 A/s). Run tuning mode again and watch for
overshoot after transitions. If you see overshoot once the duty ramp catches up, increase
PID Tracking Gain until the overshoot disappears. This is the
back-calculation gain that bleeds the integrator down whenever the duty output is rate-limited.
Phase 3 — Production Verification:
Set Setpoint Rise Rate and Setpoint Fall Rate to your desired production values
(typically 5–20 A/s rise, 20–50 A/s fall). Run tuning mode one final time to verify the loop remains
stable and well-behaved with both rate limiters active.
Tuning Philosophy for Cruising:
Run tests at moderate RPM within your typical cruising range. A slower, well-damped loop (4–6
second settling time) is preferable to a fast loop that causes harsh load transitions. The
independent protection layers (Fast OV, Load Dump, the Group 3/4 iExcess detectors, GPIO4 hard cut) handle the
unsafe edges — you don't need the loop itself to react instantly. Smooth and stable beats fast and
harsh.
Every installation is different — always verify with a step test in your own setup.
Alternator Current
0 A ↑— ↓—
Temperature
Field Control
Alt Current Zero Offset (Auto-Learned)
0.00 A
State of Charge
0 % ↑— ↓—
Voltage
Charging Mode
-
Current
Charge/Discharge Time
SOC Gain Factor (Auto-Learned)
1.000
Apparent Wind ℹ️ Wind as measured on the boat (includes boat motion). The needle points to the apparent wind angle off the bow; the two screens read apparent speed and angle.
Wind Trend ℹ️ Direction (left axis) and speed (right axis) over the last hour, so you can see wind shifts and gust trends. Toggle between true and apparent wind. The Beaufort force and gale duration (from the 2-minute sustained true wind) show as a watermark.
Solar (Victron MPPT)
Speed ℹ️Best-ever boat speed versus the wind (Sailing) or engine RPM (Motoring), corrected for sea state — how much the boat pitches. Predicts speed through the water, or GPS speed if no log. Curve = learned best; the "now" dot is your current speed — green while it is being recorded into the learned best (a steady run), orange while conditions are still settling. A sustained drop below best = dirty bottom or adverse current.
What it measures. The fastest boat speed achieved for the conditions — apparent wind speed and angle when sailing, engine speed (RPM) when motoring — corrected for sea state (measured as how much the bow pitches) and wind. A sustained shortfall against best may point to a dirty bottom, poor sail trim, or adverse current (if not using STW).
Learned on the device. Steady-state capture runs about 10 times a second; the % of best comparison runs once per second. Instead of averaging nearby records (which reads falsely low at the edge of the conditions sailed so far), it fits the local slope of the best-ever surface through the nearby records and compares the present speed against that fit. The label under the % says what the comparison is based on — MEASURED (a recorded best exists for these conditions), ESTIMATED (interpolated between nearby records), or "learning" / "no reference" when there isn't enough recorded here to grade fairly (no number is shown). Two surfaces are learned independently: a sailing polar and a motoring speed-vs-RPM map.
Reading the plot. The blue curve is the learned best. The moving dot is your current speed for the conditions right now: it turns green once conditions have held steady long enough that the point is being recorded into the best (a steady run), and orange while conditions are still settling and nothing is being recorded yet. The status by the title mirrors this — Settling with a countdown of the seconds left before recording begins, then Settled once it does.
Pruned in the cloud (optional). About every 15 minutes, engine off and system online, new points upload and the cloud prunes redundant interior points back to the envelope, then returns the cleaned set.
Quick View
Fuel Economy vs RPM (this session) ℹ️ Observed nautical miles per gallon at each RPM, this session only. A point is recorded only after RPM and boat speed hold steady for 40 s (so the boat has reached true steady speed for that throttle), then the next 20 s of economy is averaged in. The peak is your most efficient cruise RPM. Cleared on reboot, on Reset, or when the fuel table is edited.
Most efficient so far: —
Heading & Course
GPS Position —
VMG (Manual Bearing)
Motion
Anchorage Comfort
Sea State Hours (Lifetime) ℹ️Cumulative hours bucketed by Motion Sickness Index and speed (moving = SOG ≥ 1.5 kt). Buckets: Gentle (MSI < 10), Moderate (10–30), Rough (30–70), Extreme (MSI ≥ 70). Logged once per minute.
Passage Comfort
Lifetime Maximums
Events (Current Window) ℹ️The current window is the regulator's fixed data-recording interval (10 minutes). At the end of each window the accumulated statistics are written to the history log and these counters reset to zero. The Events (Lifetime) counters are never reset.
Events (Lifetime)
Raw Accelerometer (g)
Raw Gyroscope (°/s)
Window Stats — Accel (g) ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.
Window Stats — Gyro (°/s) ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.
Window Stats — Calculated ℹ️Min/max/average accumulated over the regulator's fixed data-recording window (10 minutes). Values reset when each window is written to the history log.
System
Memory ℹ️ Updated every 7 seconds. Internal RAM is fast on-chip SRAM shared by the CPU, stacks, and DMA. PSRAM is the external 8 MB SPI RAM used for most heap allocations. Heap fragmentation is an internal-only metric: 0% = fully contiguous, 100% = worst case. High fragmentation with adequate free space can still cause allocation failures for large contiguous buffers.
CPU Load (%) ℹ️ Core 0: WiFi/system tasks, Core 1: main control loop. Per-core CPU load for ESP32-S3 using FreeRTOS runtime stats. Works for SMP with unpinned tasks because idle tasks are core-pinned, but does not provide per-task or per-core attribution of non-idle time; values are estimates, not exact accounting of where each task actually executed.
Session Info
WiFi Status
Function Timing — Worst Case (ms) ℹ️ Worst-case execution time (duration) per function. The 5s column resets every 5 seconds — shows active spikes. The "Worst — last X min / X.X hr" column shows the worst since the most recent "Reset Peak Values" press (or boot, if never pressed) — catches infrequent spikes. Nested calls are included: a flash write inside Read Analog Inputs shows up under that row. Important: because these are durations, a whole-core freeze is charged to whichever function happened to be running when it hit, so the row that spikes is not necessarily the cause. These rows are not gated by field state — to tell whether a spike actually landed during active control, use the gated interval cards lower down (INA228 Read Interval and CV Voltage Loop Firing Interval only count while the field is on).
Inner Current Loop Timing — two separate clocks: how often the current sensor is READ vs how often the control loop FIRES
Voltage Loop Timing — two separate clocks: how often the voltage sensor is READ vs how often the CV loop FIRES
NVS Full Save ℹ️ The full save writes all session and lifetime totals (charged energy, runtime, fuel, distance, lifetime damage, learned tuning, motion-event counters) to flash in one blocking commit. By design it runs only at the field-off edge (about 5 s after the field cuts), at shutdown, and on capsize/pitchpole events — never while the field is on. The commit freezes the control core for as long as it takes, which is safe precisely because the field is off so there is no overvoltage risk during the stall. Trade-off: if you run continuously for hours and lose power before the next field-off edge, everything accumulated since the last save is lost.
Accelerometer / IMU
Alternator Temperature Sensor Health (DS18B20)
Counts since boot. One read failure on startup is normal. Persistent failures need attention; occasional CRC recoveries are fine.
Counts of protection events since boot or last reset. All counters are rising-edge — each number represents how many times that protection mechanism activated, not how long it was active. Use the per-category reset buttons to establish a clean baseline after tuning changes or suspected transient conditions. FastOV events are normal during load transients; sustained accumulation at idle is not.
Voltage & Current Protection
Thermal Protection Events
Charging System Health vs Engine Hours ℹ️Each point is the alternator's output as a percentage of its own best-ever, plotted against engine-hours since the last "Start Over". The bold line tracks the WORST operating region (the early warning); the faint line is the overall average. Only FULL steady runs feed this trend — graded against the active reference (Measured/Estimated only; learning-a-new-region and no-reference runs are excluded), at most one sample every 10 seconds. A bucket needs at least 2 such samples (the "min samples per bucket" setting) before it commits a point; a sparser bucket shows a gap rather than a single-reading artifact. The bucket spans one engine-hour in normal use (shorter for testing). The in-progress bucket persists across reboots, so a part-finished hour resumes where it left off. A healthy charging system holds a roughly flat line in the mid-90s — a steady downward trend is what to watch for. A clean 100% is not expected (sensor noise + battery acceptance scatter). Absolute standing vs other alternators comes from the cloud, not this self-baseline. Use the Window buttons (10 h / 100 h / All) to zoom the engine-hours axis; click the axis numbers to set the % range, or the "auto" box to refit.
This Session ℹ️A health reading every 5 seconds since this page was opened, but only while the operating point is holding steady (the lighter session gate: all inputs steady for a few seconds and temperature steady for half the full record-book dwell). Green dots are measured comparisons (a recorded best exists at that operating point); blue dots are estimated (interpolated between nearby records). A dot ringed in orange is also a full steady run — the same kind of point that updates the reference and the engine-hours trend. Shaded spans are periods with no dot — not holding steady, no reference yet, or not running — where no number is shown on purpose. (A full steady run in brand-new territory has no reference to grade against, so it shows no dot and no ring here, by design.) Click the axis numbers to set the plot range.
Today's output vs. the highest the alternator has produced at the same conditions.
MEASURED — a recorded best exists at this operating point; ESTIMATED — interpolated between trustworthy nearby records; Learning this operating region — the recorded data around this point is too one-sided to grade fairly, so no number is shown; No reference here yet — nothing recorded nearby, and a steady run here records a new point instead of guessing.
Data is optionally pruned in the cloud. Every 15 minutes, if the engine is off and device online, new frontier points upload. The cloud then drops points that have become redundant (sitting below the envelope of their neighbours) and returns the cleaned set.
Fast current channel: ? ℹ️Whether the fast current sensor feeding this scope is actively sampling, dormant (its sense wire reads open, so the regulator stopped and re-probes every few minutes), or switched off with the Fast Current Channel master toggle in Setup → Diag.
| Worst | Pk-Pk (A) | Tone (Hz) | RPM | Output Current (A) | Alt Temp (°F) | Date |
|---|---|---|---|---|---|---|
| Ripple Pk-Pk | ? | ALL | ? | ? | ? | ? |
| Highest Tone | ? | ? | ? | ? | ? | ? |
How tightly each control loop tracks its target, and its worst single excursion in the damaging direction — counted only while that loop actually held control (so a cold alternator or a stage with no current headroom is never scored against it). Lower is better. Accumulates since the last reset; auto-resets after each daily cloud snapshot, or press Reset below. Dash = no qualifying data yet.
| Good | Watch | Poor | |
|---|---|---|---|
| Current RMS | < 3 A | 3 – 5 A | ≥ 5 A |
| Voltage RMS | < 200 mV | 200 – 300 mV | ≥ 300 mV |
| Voltage overshoot | < 100 mV | 100 – 150 mV | ≥ 150 mV |
| Thermal RMS | < 10 °F | 10 – 15 °F | ≥ 15 °F |
| Thermal overshoot | < 1 °F | 1 – 2 °F | ≥ 2 °F |
Thermal-overshoot bands track the live over-temp shutdown trip (default 2 °F); red means it reached shutdown. Current overshoot is not scored at this time, too noisy to be meaningful.
This subtab is the health station for the charging system — the alternator, its rectifier and belt drive, and the control loops driving them. Everything here is results; the detection gates and tuning knobs live in Setup → Diag (link at the bottom of the page).
Charging System Health grades today's alternator output against the best it's ever done under the same conditions. The engine-hours trend is the plot to watch: a healthy system holds roughly flat in the mid-90s+, and a steady downward slope is an early warning. The This Session plot below it shows the same grading live since this page was opened.
Live Oscilloscope & Historical Snapshots shows the alternator's output current sampled 20,000 times a second — fast enough to see individual rectifier pulses. Reference pages are known-good waveforms frozen once per RPM band; anomaly captures are saved automatically when the fault monitor trips. When something looks off, flip between the capture and the reference for that speed and compare.
Resonance & Ripple Map is a learned table of the strongest ripple tone at every speed and load — used by the commissioning wizard to help optimize signal filter and control response.
Wear Rate & Component Life estimates how fast the alternator is aging at the present speed and temperature, and roughly how much component life remains (based on physics, but not yet calibrated…)
Control Accuracy Scores grade how tightly each loop — current, voltage, thermal — holds its target while avoiding overshoot. Grading is limited to transient scenarios so that long steady runs are not rewarded.
Is an anomaly alert a confirmed failure? No. The fault class is the monitor's best guess from the ripple pattern. Treat it as a prompt to compare the anomaly capture against the reference page for that RPM band before touching hardware.
Does it need anything from me? No — everything on this page learns on its own during ordinary steady running. A new install shows gaps and "learning" labels until the engine has spent time at more speeds and loads.
Replaced the alternator, regulator, or belt? Reset the learned baselines so old data doesn't grade the new hardware: Start Over (health record book, in Setup → Diag), Re-baseline (reference pages), and Clear Map (ripple map).
Oldest row is the baseline. @25°C normalizes for board temperature so runs are comparable; Δ base is the temp-corrected change since the baseline (the aging signal). Fit ✓ = the scored steps agreed; ⚠ = scattered, treat that row with care.
| When | DCIR (mΩ) | @25°C (mΩ) | Δ base | Fit | ΔV (mV) | ΔI (A) | Dwell (s) | SoC | Batt V | Board °F | Step | Steps |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| No tests yet | ||||||||||||
Measured capacity needs an independent low state-of-charge anchor from a rested voltage. Edit the rested open-circuit-voltage curve for your bank (LiFePO4 default shown, scaled to your nominal voltage). Only the bottom-knee rows (≤20%) are actually used for the anchor, so those are the ones worth getting right.
| SoC % | Rested V |
|---|---|
| … | |
This page tracks how the battery bank is aging, from two independent signals: an internal-resistance test you run on demand, and a capacity estimate captured automatically each time the bank reaches full charge. The bank is assumed brand-new when first installed — the first capacity reading becomes the 100% baseline.
Resistance Test (DCIR) steps the charge current up and down with the engine running and measures how far the battery voltage moves for a known change in current. Rising resistance over months is an early aging signal. The absolute number depends on temperature and state of charge, so compare runs taken under similar conditions; the trend matters more than any single value.
Capacity Trend: each time the bank charges from a low point all the way to full, the amp-hours returned are extrapolated to a full 0–100% span and plotted. A falling line is real capacity fade. Only deep charges qualify, so the plot fills in slowly.
Replaced the bank? Press Start Over in the Resistance Test section — the next capacity reading becomes the new 100% baseline.
Note: lots of better functionality is planned for future versions of this page.
Loading leaderboards...
Loading fleet statistics...
Loading shared configurations...