signalk-pypilot-newui 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,357 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.2.1 — 2026-08-31 — Rev128
4
+
5
+ Docs-only patch release.
6
+
7
+ - **README** — embedded the four App Store screenshots as absolute
8
+ `raw.githubusercontent.com` URLs so they render both on the NPM
9
+ website (which only surfaces the README, not `signalk.screenshots[]`)
10
+ and inside any other viewer that follows the README markdown. The
11
+ registry serves the README frozen at publish time, so this bump is
12
+ the only way to get the updated README to `npmjs.com/package/signalk-pypilot-newui`.
13
+
14
+ ## 2.2.0 — 2026-08-31 — Rev88..Rev127
15
+
16
+ Forty in-session Revs of navigation-oriented features on top of the
17
+ 2.1.0 visual foundation. Themes: turn the plugin into an intelligence
18
+ layer over pypilot (historian → KPIs → alarms → Doctor → pre-departure
19
+ check), give sail-raising its own AP mode ("Aproado"), and rebuild the
20
+ Setup tab as an app-launcher grid of fullscreen tiles.
21
+
22
+ ### English
23
+
24
+ **Added**
25
+
26
+ - **Aproado pseudo-mode** (Rev87-92) — a new "raise the sails"
27
+ autopilot mode not in pypilot upstream. Pick BY BOW / BY STERN
28
+ via a 5 s modal, the plugin switches pypilot to wind mode with
29
+ target 0° (head to wind), and a floating HUD over the boat shows
30
+ elapsed time, straight-line distance from the start and the
31
+ compass heading captured at activation. SALIR restores the
32
+ previous mode + target + engaged state. The BY STERN branch
33
+ forces a stern-through swing by walking a chain of intermediate
34
+ targets 60° apart so pypilot cannot shortcut through the bow.
35
+ - **Telemetry historian + Chart tab** (Rev93-96) — RAM ring buffer
36
+ at 1 Hz for the last 30 min (backend, Pi 5 friendly). New Chart
37
+ tab shows nine Trip Stats cards (AP engaged time, distance,
38
+ energy, mean/RMS/p95 heading error, servo runtime, tacks/gybes,
39
+ peak servo A) all fed live via SK paths, plus a canvas history
40
+ with 30 s / 2 min / 10 min windows and per-path chips.
41
+ - **Sensor Quality panel** (Rev97-98) — age / observed Hz / jitter /
42
+ source for every critical SK path the AP depends on, with a
43
+ green / amber / red pill. Endpoint `/quality` and a poll while
44
+ Setup is visible.
45
+ - **Servo Health card** (Rev99) — baseline current learned from
46
+ the first ~10 min of engaged navigation, then a live deviation
47
+ ratio flags "elevated" (>1.20×) or "high" (>1.65×) — early
48
+ warning for a hard rudder, fouling, or a stiffened linkage. Six
49
+ new SK paths under `steering.autopilot.pypilot.servo.health.*`.
50
+ - **Alarm engine** (Rev100-101) — seven built-in rules (heading
51
+ deviation, unable to steer, servo overcurrent / temp, low
52
+ voltage, sensor lost, pypilot disconnected) publishing
53
+ canonical SK notifications `notifications.autopilot.*`. Sticky
54
+ banner in the visor with ACK + close, WebAudio beeps +
55
+ speech-synthesis of the message, and a full config panel in
56
+ Setup (enable / mute / status per rule).
57
+ - **Pre-departure check** (Rev102) — a single verdict card
58
+ (READY / READY-WITH-CAVEATS / DO-NOT-ENGAGE) that aggregates
59
+ connectivity, sensor quality, servo health and voltage into one
60
+ answer before you leave the dock.
61
+ - **Pypilot Doctor** (Rev103-104, Rev120-121) — press DIAGNOSE,
62
+ the plugin records 2-3 min with the AP engaged, runs heuristic
63
+ rules on the heading error stream (bias / oscillation / low
64
+ authority) and proposes P / I / D adjustments with a plain
65
+ explanation of why and what to expect. Nothing is applied
66
+ automatically — each suggestion has Apply and Discard buttons.
67
+ Rev120: the first Apply of a session forks the current pypilot
68
+ profile into a new `doctor-YYYYMMDD-HHMM` profile so the
69
+ previous gains stay one profile-select away.
70
+ - **Setup as a launcher grid** (Rev105-119, 124) — every setup
71
+ block is now a square tile in a 2 / 3 / 4-column grid. Tap
72
+ opens fullscreen with a small X to close and ESC support.
73
+ Body scroll is locked while a tile is fullscreen. Live summary
74
+ pill on every tile so the state reads at a glance without
75
+ expanding. Connection consolidated (status + LAN scan + manual
76
+ host + Autopilot Provider in one card). "Emergency" renamed to
77
+ "Remote Control Console".
78
+ - **Interactive SSH console** (Rev113-115) — free-form command
79
+ input with on-screen arrow buttons for mobile history
80
+ navigation, accumulative output textarea, clipboard fallback
81
+ for HTTP LAN, and 14 preset buttons with plain human labels
82
+ (Memory / IP table / WiFi / Temperature / Who is connected /
83
+ ...). BusyBox / piCore-safe fallbacks for every command.
84
+ - **Full RangeSetting sliders in Calibration** (Rev116-119) —
85
+ every pypilot `RangeSetting` grouped by category (rudder /
86
+ servo / imu / ap / other) with the same look as the Tune tab,
87
+ a lock checkbox with the padlock emoji, a frozen "before:"
88
+ baseline that never moves as you drag, and a per-slider ↺
89
+ restore button that snaps back to the baseline.
90
+ - **Nudge steps moved inside Calibration** (Rev124) — one card
91
+ less in the launcher grid; heading trim buttons live where
92
+ they belong conceptually.
93
+
94
+ **Changed**
95
+
96
+ - **Gota Chain shapes SWAP** (Rev122-126) — after several iterations
97
+ with Carlos on Tunatunes: the AMBER "A" arrow (apparent wind) is
98
+ now the LARGE piece (its tip reaches deep into the rose), and
99
+ the TEAL "T" arrow (true wind) is the SMALL outer one. Colors
100
+ and letters kept their canonical meaning; only the SVG paths
101
+ moved so the amber piece is visually the dominant one.
102
+ - **Alarm summary semantics** (Rev107-108) — "activa" (fired) was
103
+ ambiguous with "activada" (enabled). New wording separates
104
+ `firing / sonando` (fired now) from `watching / vigilando`
105
+ (enabled and healthy). Summary always shows both counts.
106
+ - **i18n audit** (Rev105, Rev112, Rev121) — every hard-coded
107
+ English string in the ES bundle purged ("engagear" → "activar",
108
+ KIP paths table fully translated, alarm messages), backend
109
+ suggestion reason / effect exposed as i18n keys + args so the
110
+ frontend renders in the user's language.
111
+ - **Sensor Quality thresholds** (Rev98) — dropped `minHz` from the
112
+ defaults; the 1 Hz sampler capped observed Hz, so the threshold
113
+ produced spurious "degraded" flags. Freshness (`age`) is now
114
+ the only signal that penalises status.
115
+
116
+ **Fixed**
117
+
118
+ - **Fullscreen tile portal** (Rev110-111) — Setup fullscreen tiles
119
+ are now portaled to `<body>` so the `.tab-panel` transform
120
+ (used by the tab animation) cannot break `position: fixed`.
121
+ Fullscreen always covers the viewport now, no matter which
122
+ card was scrolled into.
123
+ - **Copy button on HTTP** (Rev114) — `navigator.clipboard` is a
124
+ secure-context API; on plain http://192.168.x.y it silently
125
+ no-ops. Compat helper falls back to `document.execCommand("copy")`.
126
+ - **Doctor `elapsedSec`** (Rev104) — was counting past the target
127
+ duration once the session completed. Now freezes at the target.
128
+ - **Sliders baseline eaten by refresh** (Rev117-118) — the
129
+ Calibration "before:" value used to reset to the just-edited
130
+ number on every `/values` poll. Now captured once per name and
131
+ kept frozen across renders.
132
+ - **Aproado restore** (Rev90) — mode / target / engaged restore on
133
+ SALIR was skipping steps after one failure. Now each step is
134
+ guarded independently and logged in the console.
135
+ - **Sensor Quality parsing** (Rev94) — `navigation.attitude` is a
136
+ composite `{pitch, roll, yaw}` object, not a scalar path.
137
+ Custom subfield reader added for heel.
138
+ - Cosmetic Firefox warnings (`::-moz-focus-inner`, comment-nested
139
+ `*/`) purged (Rev95-106).
140
+
141
+ ### Español
142
+
143
+ **Nuevo**
144
+
145
+ - **Modo Aproado** (Rev87-92): pseudo-modo AP para subir velas.
146
+ Elige POR PROA / POR POPA en un modal de 5 s, el plugin pasa
147
+ pypilot a modo viento con objetivo 0° (proa al viento), y un
148
+ HUD flotante sobre el barco muestra tiempo transcurrido,
149
+ distancia lineal desde el arranque y el rumbo compás capturado
150
+ al activar. SALIR restaura modo + objetivo + engaged previos.
151
+ POR POPA fuerza el swing por popa con una cadena de objetivos
152
+ intermedios cada 60° para que pypilot no atajaje por proa.
153
+ - **Historian de telemetría + pestaña Gráfica** (Rev93-96):
154
+ buffer circular en RAM a 1 Hz durante 30 min (backend, Pi 5).
155
+ Nueva pestaña Gráfica con 9 tarjetas de estadísticas de sesión
156
+ (tiempo activo, distancia, energía, error medio / RMS / p95,
157
+ servo activo, viradas / trasluchadas, pico servo A) y canvas
158
+ con ventanas 30 s / 2 min / 10 min.
159
+ - **Panel Calidad de sensores** (Rev97-98): edad / Hz / jitter /
160
+ fuente por cada ruta SK crítica con semáforo verde / ámbar /
161
+ rojo.
162
+ - **Tarjeta Salud del servo** (Rev99): baseline aprendido de los
163
+ primeros ~10 min de navegación activa, luego ratio de
164
+ desviación marca "elevated" (>1.20×) o "high" (>1.65×) —
165
+ alerta temprana de timón duro, incrustaciones o rozamientos.
166
+ - **Motor de alarmas** (Rev100-101): 7 reglas built-in
167
+ (desviación de rumbo, incapaz de gobernar, sobrecorriente
168
+ servo, temperatura servo, batería baja, sensor perdido,
169
+ pypilot desconectado) publicando notifications SK canónicas.
170
+ Banner sticky en el visor con ACK y cierre X, beeps WebAudio
171
+ + speechSynthesis del mensaje, panel de configuración en
172
+ Setup (enable / mute / estado por regla).
173
+ - **Comprobación del piloto** (Rev102): tarjeta única con
174
+ veredicto (LISTO / LISTO CON RESERVAS / NO ACTIVAR) que
175
+ agrega conectividad, calidad de sensores, salud del servo y
176
+ voltaje.
177
+ - **Asesoramiento y diagnóstico** (Rev103-104, Rev120-121):
178
+ botón DIAGNOSTICAR, el plugin graba 2-3 min con el AP activo,
179
+ aplica reglas heurísticas (sesgo / oscilación / autoridad) y
180
+ propone ajustes P / I / D con explicación clara del porqué y
181
+ del efecto esperado. Nada se aplica automáticamente — cada
182
+ sugerencia tiene botones Aplicar y Descartar. Rev120: el
183
+ primer Aplicar de la sesión duplica el perfil actual en uno
184
+ nuevo `doctor-AAAAMMDD-HHMM` para que el original quede
185
+ intacto a un toque en Ajustes → Perfil.
186
+ - **Setup como launcher grid** (Rev105-119, 124): cada bloque
187
+ de Setup es un tile cuadrado en un grid 2 / 3 / 4 columnas.
188
+ Tap abre pantalla completa con X para cerrar, header sticky
189
+ y bloqueo de scroll de fondo. Etiqueta resumen en vivo en
190
+ cada tile. Conexión pypilot une 4 secciones. "Emergencia"
191
+ renombrada a "Consola control remoto".
192
+ - **Consola SSH interactiva** (Rev113-115): input libre con
193
+ botones ↑▲ ↓▼ para navegar el historial en móvil, textarea
194
+ acumulativo, fallback de portapapeles para LAN HTTP y 14
195
+ presets con etiquetas humanas (Memoria RAM / Tabla IP / WiFi
196
+ / Temperatura / Quien está conectado / ...). Todos los
197
+ comandos con fallbacks BusyBox / piCore.
198
+ - **Sliders completos de calibración** (Rev116-119): todos los
199
+ `RangeSetting` de pypilot agrupados por categoría (timón /
200
+ servo / imu / piloto / otros) con la misma apariencia que
201
+ Ajustes, candado azul con emoji, valor "antes:" congelado
202
+ que NUNCA se mueve al arrastrar, y un botón ↺ por slider
203
+ para restaurar el valor original.
204
+ - **Botones corrección rumbo dentro de Calibración** (Rev124):
205
+ una tarjeta menos en el grid; los pasos ±1 / ±10 quedan
206
+ donde corresponde conceptualmente.
207
+
208
+ **Cambiado**
209
+
210
+ - **Swap de formas en la Gota Chain** (Rev122-126): tras varias
211
+ iteraciones con Carlos en Tunatunes, la flecha AMARILLA "A"
212
+ (viento aparente) es ahora la GRANDE (su punta llega hasta
213
+ el centro de la rosa) y la flecha VERDE "T" (viento real)
214
+ es la PEQUEÑA externa. Colores y letras mantienen su
215
+ significado canónico; solo se movieron los paths SVG para
216
+ que la amarilla domine visualmente.
217
+ - **Semántica de alarmas** (Rev107-108): "activa" era ambiguo.
218
+ Nueva jerga separa `sonando` (disparada ahora) de `vigilando`
219
+ (habilitada y OK). El resumen muestra siempre ambos contadores.
220
+ - **Auditoría i18n** (Rev105, Rev112, Rev121): purga de cadenas
221
+ inglesas hardcoded en el bundle ES ("engagear" → "activar",
222
+ tabla de KIP totalmente traducida, mensajes de alarma).
223
+ Reason / effect de las sugerencias del Doctor expuestos como
224
+ claves i18n para render en el idioma del visor.
225
+ - **Umbrales Calidad de sensores** (Rev98): quitado `minHz` de
226
+ los defaults; el sampler a 1 Hz capaba la Hz observada y
227
+ generaba "degraded" falsos.
228
+
229
+ **Corregido**
230
+
231
+ - **Portal de tile fullscreen** (Rev110-111): tiles fullscreen
232
+ ahora se mueven al `<body>` para que el `transform` de
233
+ `.tab-panel` (animación entre pestañas) no rompa `position:
234
+ fixed`.
235
+ - **Botón Copiar en HTTP** (Rev114): `navigator.clipboard`
236
+ requiere secure context. Fallback a `document.execCommand("copy")`.
237
+ - **Doctor `elapsedSec`** (Rev104): contaba pasado el objetivo.
238
+ Ahora congela al final.
239
+ - **Baseline de sliders comido por refresh** (Rev117-118): el
240
+ valor "antes" se reseteaba a lo recién editado en cada poll.
241
+ Ahora se captura una vez y no se toca.
242
+ - **Restore de Aproado** (Rev90): SALIR saltaba pasos tras un
243
+ fallo. Ahora cada paso protegido por su try/catch.
244
+ - **Parsing Calidad de sensores** (Rev94): `navigation.attitude`
245
+ es objeto compuesto, no path escalar. Fix del subfield heel.
246
+ - Warnings cosméticos Firefox (`::-moz-focus-inner`, `*/` en
247
+ comentarios) purgados (Rev95-106).
248
+
249
+ ### Français
250
+
251
+ **Ajouté**
252
+
253
+ - **Mode Aproado** (Rev87-92) : pseudo-mode AP pour hisser les
254
+ voiles. PAR AVANT / PAR ARRIÈRE, l'AP passe en mode vent avec
255
+ cible 0° (nez au vent), HUD flottant avec temps, distance et
256
+ cap boussole capturé. SORTIR restaure mode / cible / engagé
257
+ précédents. PAR ARRIÈRE force le virage par l'arrière avec
258
+ une chaîne d'objectifs intermédiaires de 60°.
259
+ - **Historian de télémétrie + onglet Graphique** (Rev93-96) :
260
+ buffer 30 min en RAM à 1 Hz, canvas d'historique et 9 cartes
261
+ Trip Stats.
262
+ - **Panneau Qualité des capteurs** (Rev97-98) : âge / Hz /
263
+ jitter / source par chaque chemin SK critique.
264
+ - **Carte Santé du servo** (Rev99) : baseline appris + ratio de
265
+ déviation avec alertes "elevated" et "high".
266
+ - **Moteur d'alarmes** (Rev100-101) : 7 règles built-in,
267
+ notifications SK canoniques, banner avec ACK et fermeture,
268
+ audio WebAudio + parole synthétique, config par règle.
269
+ - **Vérification pré-départ** (Rev102) : verdict READY / avec
270
+ caveats / NE PAS ENGAGER.
271
+ - **Docteur pypilot** (Rev103-104, Rev120-121) : 2-3 min
272
+ d'enregistrement, règles heuristiques, propositions P / I / D
273
+ avec Appliquer et Rejeter. Le premier Appliquer crée un
274
+ nouveau profil `doctor-AAAAMMJJ-HHMM`.
275
+ - **Setup en grille launcher** (Rev105-119, 124) : tiles carrés,
276
+ fullscreen par tap, résumé en direct, connexion consolidée,
277
+ "Consola contrôle remote" (renommé).
278
+ - **Console SSH interactive** (Rev113-115) : entrée libre,
279
+ historique navigable au mobile, 14 presets aux noms humains,
280
+ fallbacks BusyBox / piCore.
281
+ - **Sliders complets de calibration** (Rev116-119) : chaque
282
+ RangeSetting groupé, cadenas, baseline gelée, bouton restaurer.
283
+ - **Boutons correction cap dans Calibration** (Rev124).
284
+
285
+ **Modifié**
286
+
287
+ - **Swap des formes Gota Chain** (Rev122-126) : la flèche AMBRE
288
+ "A" (vent apparent) est maintenant la GRANDE, la TEAL "T"
289
+ (vent réel) la petite. Couleurs et lettres conservent leur
290
+ sens canonique.
291
+ - **Sémantique alarmes** (Rev107-108) : `sonando` vs
292
+ `vigilando`, résumé affiche les deux compteurs.
293
+ - **Audit i18n** (Rev105, Rev112, Rev121) : purge de l'anglais
294
+ dans les bundles ES / FR / DE.
295
+ - **Seuils Qualité capteurs** (Rev98) : `minHz` supprimé.
296
+
297
+ **Corrigé**
298
+
299
+ - Portal du tile fullscreen (Rev110-111).
300
+ - Bouton Copier en HTTP (Rev114).
301
+ - Doctor `elapsedSec` gelé au final (Rev104).
302
+ - Baseline des sliders congelée (Rev117-118).
303
+ - Restore Aproado protégé par try/catch (Rev90).
304
+ - Lecture composite de `navigation.attitude` (Rev94).
305
+ - Warnings cosmétiques Firefox purgés (Rev95-106).
306
+
307
+ ### Deutsch
308
+
309
+ **Neu**
310
+
311
+ - **Aproado-Pseudomodus** (Rev87-92) — AP-Modus zum Segelhissen.
312
+ ÜBER BUG / ÜBER HECK, AP schaltet in Wind-Modus mit Ziel 0°,
313
+ HUD über dem Boot mit Zeit / Distanz / Kompass-Kurs. AUS
314
+ stellt Modus / Ziel / Engaged wieder her. ÜBER HECK erzwingt
315
+ den langen Schwenk mit Zwischen-Zielen alle 60°.
316
+ - **Telemetrie-Historian + Chart-Tab** (Rev93-96) — Ringpuffer
317
+ 30 min RAM bei 1 Hz, 9 Trip-Stats-Karten, Canvas mit Fenstern
318
+ 30 s / 2 min / 10 min.
319
+ - **Sensor-Qualität-Panel** (Rev97-98).
320
+ - **Servo-Health-Karte** (Rev99) — gelernter Baseline mit
321
+ Alarmen "elevated" / "high".
322
+ - **Alarm-Engine** (Rev100-101) — 7 built-in Regeln, SK
323
+ Notifications, Banner mit ACK und X, WebAudio + Sprache,
324
+ Config-Panel.
325
+ - **Pre-Departure-Check** (Rev102).
326
+ - **Pypilot Doctor** (Rev103-104, Rev120-121) — Diagnose-
327
+ Sitzung, Heuristik-Regeln, P/I/D-Vorschläge mit Anwenden /
328
+ Verwerfen. Erstes Anwenden erzeugt neues Profil.
329
+ - **Setup als Launcher-Grid** (Rev105-119, 124) — quadratische
330
+ Tiles, Vollbild-Tap, Live-Zusammenfassung.
331
+ - **Interaktive SSH-Konsole** (Rev113-115) — freie Eingabe,
332
+ Pfeil-Buttons mobil, 14 Presets mit menschlichen Labels.
333
+ - **Vollständige RangeSetting-Slider in Kalibrierung**
334
+ (Rev116-119) — Schloss, eingefrorene Baseline,
335
+ Wiederherstellen-Knopf pro Slider.
336
+ - **Nudge-Buttons in Kalibrierung** (Rev124).
337
+
338
+ **Geändert**
339
+
340
+ - **Gota-Chain-Form-SWAP** (Rev122-126).
341
+ - **Alarm-Semantik** (Rev107-108) — `sonando` / `vigilando`.
342
+ - **i18n-Audit** (Rev105, Rev112, Rev121).
343
+ - **Sensor-Qualität-Schwellen** (Rev98) — `minHz` entfernt.
344
+
345
+ **Behoben**
346
+
347
+ - Fullscreen-Tile-Portal (Rev110-111).
348
+ - Copy-Button auf HTTP (Rev114).
349
+ - Doctor `elapsedSec` (Rev104).
350
+ - Slider-Baseline eingefroren (Rev117-118).
351
+ - Aproado-Restore geschützt (Rev90).
352
+ - `navigation.attitude`-Zusammensetzung (Rev94).
353
+ - Kosmetische Firefox-Warnungen (Rev95-106).
354
+
3
355
  ## 2.1.0 — 2026-08-25 — Rev68..Rev87
4
356
 
5
357
  Twenty in-session Revs of iterative visual + reliability work rolled up
package/README.md CHANGED
@@ -9,6 +9,78 @@ and switches out of the box.
9
9
  Runs alongside [`pypilot-autopilot-provider`](https://www.npmjs.com/package/pypilot-autopilot-provider)
10
10
  by Panaaj — see [Working alongside pypilot-autopilot-provider](#working-alongside-pypilot-autopilot-provider).
11
11
 
12
+ ## Screenshots
13
+
14
+ | Control | Tune |
15
+ |---|---|
16
+ | ![Control tab](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/01-control-rose.jpg) | ![Tune tab](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/02-tune-gains.jpg) |
17
+
18
+ | Info | Setup |
19
+ |---|---|
20
+ | ![Info tab](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/03-info.jpg) | ![Setup tab](https://raw.githubusercontent.com/Aitonos/signalk-pypilot-newui/main/public/screenshots/04-setup.jpg) |
21
+
22
+ ## What's new in 2.2.0
23
+
24
+ 2.2.0 turns the plugin into an **intelligence layer over pypilot**. Forty
25
+ in-session Revs on top of the 2.1.0 visual foundation. Highlights:
26
+
27
+ - **Aproado pseudo-mode** — a new "raise the sails" AP mode not in
28
+ pypilot upstream. Pick BY BOW / BY STERN via a 5 s modal, the
29
+ plugin switches pypilot to wind mode with target 0° (head to
30
+ wind), and a floating HUD over the boat shows elapsed time,
31
+ straight-line distance from the start and the compass heading
32
+ captured at activation. SALIR restores the previous mode + target
33
+ + engaged state. BY STERN forces a stern-through swing by walking
34
+ a chain of intermediate targets 60° apart so pypilot cannot
35
+ shortcut through the bow.
36
+ - **Telemetry historian + Chart tab** — RAM ring buffer at 1 Hz for
37
+ the last 30 min (backend, Pi 5 friendly). Nine Trip Stats cards
38
+ (AP engaged time, distance, energy, mean / RMS / p95 heading
39
+ error, servo runtime, tacks / gybes, peak servo A) fed live via
40
+ SK paths, plus a canvas with 30 s / 2 min / 10 min windows.
41
+ - **Sensor Quality + Servo Health + Alarm engine + Pre-departure
42
+ check** — new backend modules that grade every SK path the AP
43
+ depends on, learn a baseline servo current and flag anomalies,
44
+ evaluate seven alarm rules that publish canonical
45
+ `notifications.autopilot.*`, and roll everything into a single
46
+ READY / READY-WITH-CAVEATS / DO-NOT-ENGAGE verdict.
47
+ - **Pypilot Doctor** — press DIAGNOSE, the plugin records 2-3 min
48
+ with the AP engaged, runs heuristic rules on the heading error
49
+ stream (bias / oscillation / low authority) and proposes P / I /
50
+ D adjustments with a plain explanation. Nothing is applied
51
+ automatically. The first Apply of a session **forks the current
52
+ pypilot profile** into a new `doctor-YYYYMMDD-HHMM` profile so
53
+ the previous gains stay one profile-select away.
54
+ - **Setup as a launcher grid** — every setup block is now a square
55
+ tile in a 2 / 3 / 4-column grid. Tap opens fullscreen with a
56
+ small X to close and ESC support. Live summary pill on every
57
+ tile. Connection consolidated (status + LAN scan + manual host +
58
+ Autopilot Provider in one card). "Emergency" renamed to "Remote
59
+ Control Console".
60
+ - **Interactive SSH console** — free-form command input with
61
+ on-screen arrow buttons for mobile history navigation,
62
+ accumulative output textarea, clipboard fallback for HTTP LAN,
63
+ and 14 preset buttons with plain human labels (Memory / IP
64
+ table / WiFi / Temperature / Who is connected / ...). BusyBox /
65
+ piCore-safe fallbacks for every command.
66
+ - **Full RangeSetting sliders in Calibration** — every pypilot
67
+ `RangeSetting` grouped by category (rudder / servo / imu / ap /
68
+ other) with the same look as the Tune tab, a lock checkbox with
69
+ the padlock emoji, a frozen "before:" baseline that never moves
70
+ as you drag, and a per-slider ↺ restore button.
71
+ - **Gota Chain shape swap** — after iterations with skippers using
72
+ the plugin: the AMBER "A" arrow (apparent wind) is now the LARGE
73
+ piece and the TEAL "T" arrow (true wind) the SMALL outer one.
74
+ Colors and letters kept their canonical meaning; only the SVG
75
+ paths moved so the amber piece is visually the dominant one.
76
+ - **Full i18n audit** across EN / ES / FR / DE — every hard-coded
77
+ English string in the non-EN bundles purged, alarm messages and
78
+ Doctor suggestion reason / effect exposed as i18n keys + args so
79
+ the frontend renders in the user's language.
80
+
81
+ See [`CHANGELOG.md`](./CHANGELOG.md) for the full detailed list in
82
+ four languages.
83
+
12
84
  ## Upgrading from 1.0.0 to 2.0.0
13
85
 
14
86
  2.0.0 is a **breaking release** addressing feedback from Sean D'Epagnier
@@ -162,15 +234,35 @@ that isolated TinyPilot.
162
234
 
163
235
  | Method | Path | Purpose |
164
236
  |---|---|---|
165
- | `GET` | `/plugins/signalk-pypilot-newui/status` | Connection + last-seen catalog summary + Rev + version |
237
+ | `GET` | `/plugins/signalk-pypilot-newui/status` | Connection + last-seen catalog summary + Rev + version + historian header + KPI computedTs |
166
238
  | `GET` | `/plugins/signalk-pypilot-newui/scan` | Scan LAN for `pypilot_web` hosts |
167
239
  | `GET` | `/plugins/signalk-pypilot-newui/paths` | Live list of published SK paths with GET / PUT URLs and units |
168
240
  | `GET` | `/plugins/signalk-pypilot-newui/catalog` | Raw pypilot catalog (all values + metadata) |
241
+ | `GET` | `/plugins/signalk-pypilot-newui/values` | Current pypilot value cache |
169
242
  | `PUT` | `/plugins/signalk-pypilot-newui/raw` | Send raw `name=value` to pypilot (protected by `allowWrites`) |
170
- | `POST` | `/plugins/signalk-pypilot-newui/restart-pypilot` | SSH `sv restart` of pypilot core+web on the TinyPilot, uses `sshUser` + `sshPassword` from plugin config |
171
- | `POST` | `/plugins/signalk-pypilot-newui/debug-cmd` | Run one of a closed whitelist of preset diagnostic / restart commands over SSH (`restart.web`, `reboot.pi`, `logs.pypilot`, `logs.web`, `dmesg`, `top`, `uptime`, `df`, `pypilot.version`). Body: `{ "preset": "<name>" }` |
172
- | `POST` | `/plugins/signalk-pypilot-newui/pause` | Disconnect local socket (for scripts) |
173
- | `POST` | `/plugins/signalk-pypilot-newui/resume` | Reconnect local socket (for scripts) |
243
+ | `GET` | `/plugins/signalk-pypilot-newui/history` | Historian slice. Query `?window=30s\|2m\|10m` and `?paths=headingCmd,rudder,...`. RAM ring buffer at 1 Hz. |
244
+ | `GET` | `/plugins/signalk-pypilot-newui/stats` | KPI snapshot: session (engaged time, distance, energy, tacks, gybes, max servo A) + window1m (mean / RMS / p95 heading error, servo duty). |
245
+ | `POST` | `/plugins/signalk-pypilot-newui/session/reset` | Reset the KPI session counters. History buffer is kept. |
246
+ | `GET` | `/plugins/signalk-pypilot-newui/quality` | Sensor Quality snapshot: age / observed Hz / jitter / source / status per watched SK path. |
247
+ | `GET` | `/plugins/signalk-pypilot-newui/servo-health` | Servo Health snapshot: learned baseline current, deviation ratio, peak A, samples in the learn window. |
248
+ | `GET` | `/plugins/signalk-pypilot-newui/alarms/state` | Active alarms + short resolved history. |
249
+ | `GET` | `/plugins/signalk-pypilot-newui/alarms/rules` | Rule metadata (id / label / severity / enabled / muted / active). |
250
+ | `POST` | `/plugins/signalk-pypilot-newui/alarms/ack/:id` | Acknowledge one active alarm (silences the sound, banner stays visible). |
251
+ | `POST` | `/plugins/signalk-pypilot-newui/alarms/mute/:id` | Mute the RULE for N minutes (query `?min=15`). |
252
+ | `POST` | `/plugins/signalk-pypilot-newui/alarms/enable/:id` | Enable / disable a rule (query `?on=1\|0`). |
253
+ | `GET` | `/plugins/signalk-pypilot-newui/prechecks` | Pre-departure autopilot check verdict: `ready` / `ready-with-caveats` / `do-not-engage` + per-item detail. |
254
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/start` | Start a diagnostic session (query `?duration=180`). Requires AP engaged. |
255
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/cancel` | Cancel the current session. |
256
+ | `GET` | `/plugins/signalk-pypilot-newui/doctor/status` | Session state + progress + result (when completed). |
257
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/apply/:id` | Apply one gain suggestion. The FIRST apply of the session forks the profile into `doctor-YYYYMMDD-HHMM`. |
258
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/apply-all` | Apply every non-dismissed suggestion (all land in the same forked profile). |
259
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/dismiss/:id` | Mark a suggestion as dismissed (user rejects it). |
260
+ | `POST` | `/plugins/signalk-pypilot-newui/doctor/reset` | Clear result, back to idle. |
261
+ | `POST` | `/plugins/signalk-pypilot-newui/restart-pypilot` | SSH `sv restart` of pypilot core+web on the TinyPilot. |
262
+ | `POST` | `/plugins/signalk-pypilot-newui/debug-cmd` | Run one of a closed whitelist of preset diagnostic / restart commands over SSH. Body: `{ "preset": "<name>" }`. |
263
+ | `POST` | `/plugins/signalk-pypilot-newui/ssh-exec` | Free-form SSH command (Remote Control Console). Body: `{ "cmd": "<any shell>" }`. Requires `allowWrites`. |
264
+ | `POST` | `/plugins/signalk-pypilot-newui/pause` | Disconnect local socket (for scripts). |
265
+ | `POST` | `/plugins/signalk-pypilot-newui/resume` | Reconnect local socket (for scripts). |
174
266
 
175
267
  ## Safety
176
268