signalk-pypilot-newui 2.2.1 → 2.4.0
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 +325 -0
- package/README.md +133 -4
- package/dist/doctor.js +26 -3
- package/dist/index.js +726 -59
- package/dist/session-recorder.js +253 -0
- package/package.json +7 -5
- package/public/app.js +1724 -27
- package/public/index.html +78 -6
- package/public/screenshots/01-control-rose.jpg +0 -0
- package/public/screenshots/02-chart-trip-stats.jpg +0 -0
- package/public/screenshots/03-tune-gains.jpg +0 -0
- package/public/screenshots/04-setup-launcher.jpg +0 -0
- package/public/screenshots/05-race-timer.jpg +0 -0
- package/public/screenshots/06-info.jpg +0 -0
- package/public/style.css +145 -0
- package/public/screenshots/02-tune-gains.jpg +0 -0
- package/public/screenshots/03-info.jpg +0 -0
- package/public/screenshots/04-setup.jpg +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,330 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.4.0 — 2026-09-07 — Rev138..Rev145
|
|
4
|
+
|
|
5
|
+
Feature release. The plugin has learnt to behave itself around the
|
|
6
|
+
Pi Zero (following direct advice from Sean D'Epagnier, pypilot author)
|
|
7
|
+
and now speaks the sailor's language instead of pilot-programmer
|
|
8
|
+
jargon.
|
|
9
|
+
|
|
10
|
+
### English
|
|
11
|
+
|
|
12
|
+
**Added**
|
|
13
|
+
|
|
14
|
+
- **Dynamic watch focus (Rev140..Rev141)** — the old policy kept ~170
|
|
15
|
+
pypilot subscriptions pinned to `pypilot_web`, which pressured the
|
|
16
|
+
Pi Zero W and eventually locked its socket buffer. The backend now
|
|
17
|
+
keeps a minimal always-on core (~15 paths, 1-2 Hz) and accepts
|
|
18
|
+
short-lived focus requests from the visor: Tune bumps the gain
|
|
19
|
+
paths only while it is on screen, same for the Calibration
|
|
20
|
+
sliders. TTL expires when the tab closes. New endpoints
|
|
21
|
+
`/watch/focus`, `/watch/release`, `/watch/status`, a live inspector
|
|
22
|
+
in Setup → Remote Control Console, and a `Restart pypilot_web`
|
|
23
|
+
button that runs `sv restart pypilot_web` via SSH.
|
|
24
|
+
- **Navigation session recorder + advice loop (Rev143)** — every
|
|
25
|
+
engaged AP session is now saved as JSONL to
|
|
26
|
+
`~/.signalk/plugin-config-data/signalk-pypilot-newui/nav-sessions/`.
|
|
27
|
+
Users label conditions (wind / sea / motor / point of sail / crew)
|
|
28
|
+
from a modal in Setup → Doctor, share the file via WhatsApp or
|
|
29
|
+
email, receive an "advice" JSON back and upload it - the visor
|
|
30
|
+
renders it as a "Consejos recibidos" card. First step of the
|
|
31
|
+
AI-tuned Doctor roadmap: no AI runs at runtime, learning happens
|
|
32
|
+
off-boat and gets injected as plain heuristics in later Revs.
|
|
33
|
+
- **Pi Zero log capture (Rev138)** — piCore keeps `/var/log` in
|
|
34
|
+
tmpfs, so a hard reset wipes the previous session's logs. New
|
|
35
|
+
opt-in poller SSHes into the Pi Zero on a configurable cadence,
|
|
36
|
+
tails `/var/log/pypilot/*` and appends new lines to a persistent
|
|
37
|
+
daily file on the Pi 5. Toggle + downloader live in the Remote
|
|
38
|
+
Control Console.
|
|
39
|
+
- **Plain-language help for every gain (Rev139)** — every P / I / D
|
|
40
|
+
/ DD / PR / FF slider in Tune and every documented RangeSetting in
|
|
41
|
+
Setup → Calibration now carries a short "what it does" line plus a
|
|
42
|
+
`?` button that expands into "when to raise, when to lower". EN /
|
|
43
|
+
ES / DE / FR. Aligned with Sean's own forum suggestion.
|
|
44
|
+
- **Doctor findings and summary translated (Rev136)** — backend now
|
|
45
|
+
emits i18n keys with args so the whole Doctor panel reads in the
|
|
46
|
+
active language instead of half English / half Spanish.
|
|
47
|
+
- **Alarm engine i18n (Rev135..Rev136)** — the seven built-in rules
|
|
48
|
+
(heading-deviation, unable-to-steer, servo-overcurrent,
|
|
49
|
+
servo-temp-high, low-voltage, sensor-lost, pypilot-disconnected)
|
|
50
|
+
render banners and speak in the active language. The backend still
|
|
51
|
+
ships English strings on `notifications.autopilot.*` for
|
|
52
|
+
KIP / WilhelmSK compatibility.
|
|
53
|
+
- **Mode selector proper i18n + uppercase tabs (Rev142, Rev144)** —
|
|
54
|
+
`compass`, `wind`, `true wind`, `nav` and the plugin's own
|
|
55
|
+
`aproado` render as translated UPPERCASE labels ("COMPAS", "VIENTO
|
|
56
|
+
APARENTE", "APROADO"). Tab labels are UPPERCASE too so accents
|
|
57
|
+
become optional (RAE convention). Language switch now refreshes
|
|
58
|
+
the mode selector and gain help lines immediately.
|
|
59
|
+
- **Doctor - persistent Hide button (Rev135..Rev136)** — the discard
|
|
60
|
+
action stays visible even after a suggestion has been applied,
|
|
61
|
+
the tile chip mirrors the count.
|
|
62
|
+
- **Setup launcher - live status chips (Rev130..Rev135)** — pypilot
|
|
63
|
+
host+port, active language, calibration last-adjust timestamp
|
|
64
|
+
(with a Reset button), count of active SK sentences vs the plugin
|
|
65
|
+
catalogue total, and an SSH-configured pill on Remote Control
|
|
66
|
+
Console. Sensor Quality gains a per-row Ignore / Restore button so
|
|
67
|
+
a sensor absent from the boat (rudder feedback missing, ...)
|
|
68
|
+
stops turning the chip red.
|
|
69
|
+
- **Chart hover freeze + per-band Y axis (Rev129)** — touch or hover
|
|
70
|
+
to freeze the auto-refresh and read the exact value at that point
|
|
71
|
+
for every band. Min / mid / max ticks in the right gutter.
|
|
72
|
+
- **Tune - per-slider ↺ restore + profile-fork prompt (Rev129,
|
|
73
|
+
Rev132..Rev134)** — snap back to the frozen "was:" baseline, or
|
|
74
|
+
save the change in a new `tune-YYYYMMDD-HHMM` fork on first
|
|
75
|
+
unlock, or Cancel and revert.
|
|
76
|
+
- **Nav bar slide-down gesture (Rev129)** — swipe from the top to
|
|
77
|
+
bring the tab bar back, counterpart to the existing slide-up hide.
|
|
78
|
+
|
|
79
|
+
**Changed**
|
|
80
|
+
|
|
81
|
+
- The `RESERVED_PYPILOT_KEYS` set now only blocks publish, not
|
|
82
|
+
subscribe. Rev141 regression fix: `ap.mode`, `ap.enabled`,
|
|
83
|
+
`ap.heading_command` are needed internally to sync with the SK
|
|
84
|
+
Autopilot API v2.
|
|
85
|
+
- All six screenshots refreshed to match the current UI.
|
|
86
|
+
|
|
87
|
+
### Español
|
|
88
|
+
|
|
89
|
+
**Añadido**
|
|
90
|
+
|
|
91
|
+
- **Watch focus dinámico** — el plugin mantiene un núcleo mínimo
|
|
92
|
+
suscrito (~15 keys, 1-2 Hz) y sube el rate solo mientras haya una
|
|
93
|
+
pestaña que necesite ver esos valores. Sigue la recomendación de
|
|
94
|
+
Sean D'Epagnier: pypilot_web se satura si le mandas ~170
|
|
95
|
+
suscripciones constantes. Nuevos endpoints, inspector en vivo y
|
|
96
|
+
botón "Reiniciar pypilot_web" en la consola remota.
|
|
97
|
+
- **Grabador de sesiones + loop de consejos** — cada sesión con el
|
|
98
|
+
AP enganchado se guarda como JSONL. Etiquetas por condiciones
|
|
99
|
+
(viento / mar / propulsión / rumbo / tripulación), botón compartir
|
|
100
|
+
por WhatsApp, y subida del JSON de consejos que se recibe de
|
|
101
|
+
vuelta. Primer paso del "Doctor afinado por IA": la IA no corre
|
|
102
|
+
en tiempo real, aprende offline y sus heurísticas se inyectan
|
|
103
|
+
como código en las próximas Revs.
|
|
104
|
+
- **Captura de logs Pi Zero** — piCore guarda `/var/log` solo en
|
|
105
|
+
RAM, un hard reset borra el historial. Toggle en la consola
|
|
106
|
+
remota que hace SSH cada N segundos y guarda los logs en un
|
|
107
|
+
archivo persistente del Pi 5.
|
|
108
|
+
- **Explicaciones "en cristiano" para cada ganancia** — P / I / D /
|
|
109
|
+
DD / PR / FF más los sliders principales de Calibration llevan
|
|
110
|
+
una línea corta con qué hace y un `?` que expande "cuándo subir,
|
|
111
|
+
cuándo bajar". EN / ES / DE / FR.
|
|
112
|
+
- **Doctor + alarmas en tu idioma** — findings, summary y las siete
|
|
113
|
+
reglas de alarma ahora se traducen en el visor. El backend sigue
|
|
114
|
+
enviando inglés al SK para KIP / WilhelmSK.
|
|
115
|
+
- **Selector de modo traducido en MAYÚSCULAS** — "COMPAS", "VIENTO
|
|
116
|
+
APARENTE", "VIENTO REAL", "APROADO", ... con jerga marinera. Las
|
|
117
|
+
pestañas también en MAYÚSCULAS para que la tilde sea opcional.
|
|
118
|
+
- **Doctor - botón Ocultar siempre visible** — no se atasca la
|
|
119
|
+
lista de sugerencias aunque ya las hayas aplicado.
|
|
120
|
+
- **Setup - chips vivos en cada tile** — host + puerto TinyPilot,
|
|
121
|
+
idioma activo, fecha del último ajuste de calibración, sentencias
|
|
122
|
+
SK activas y SSH configurado.
|
|
123
|
+
- **Sensor Quality con Ignorar / Restaurar por fila** — para
|
|
124
|
+
sensores que no existen en el barco (por ejemplo el timón sin
|
|
125
|
+
feedback).
|
|
126
|
+
- **Chart con freeze al pasar el cursor + escala Y por banda**.
|
|
127
|
+
- **Tune con ↺ por slider + fork de perfil al primer cambio**.
|
|
128
|
+
- **Slide desde arriba para mostrar la barra de pestañas**.
|
|
129
|
+
|
|
130
|
+
**Cambiado**
|
|
131
|
+
|
|
132
|
+
- Regresión Rev141 corregida: `RESERVED_PYPILOT_KEYS` bloquea
|
|
133
|
+
solo publish, no subscribe. El selector de modo del AP vuelve
|
|
134
|
+
a poblarse correctamente.
|
|
135
|
+
- 6 screenshots actualizados a la UI actual.
|
|
136
|
+
|
|
137
|
+
### Deutsch
|
|
138
|
+
|
|
139
|
+
**Neu**
|
|
140
|
+
|
|
141
|
+
- Dynamischer Watch-Fokus, entlastet pypilot_web auf dem Pi Zero.
|
|
142
|
+
- Sitzungs-Rekorder + Ratschlag-Loop (JSONL pro Engage).
|
|
143
|
+
- Pi Zero Log-Capture (persistiert /var/log auf dem Pi 5).
|
|
144
|
+
- Klartext-Hilfe pro Gain-Slider.
|
|
145
|
+
- Doctor + Alarme in aktiver Sprache.
|
|
146
|
+
- Modus-Auswahl uebersetzt in GROSSBUCHSTABEN.
|
|
147
|
+
- Doctor: Verwerfen bleibt sichtbar.
|
|
148
|
+
- Setup-Kacheln zeigen Live-Status.
|
|
149
|
+
- Sensor Quality: Ignorieren pro Zeile.
|
|
150
|
+
- Chart: Hover-Freeze + Y-Achse pro Band.
|
|
151
|
+
- Tune: ↺ pro Slider + Fork-Dialog.
|
|
152
|
+
- Wisch-von-oben blendet Tab-Leiste ein.
|
|
153
|
+
|
|
154
|
+
### Français
|
|
155
|
+
|
|
156
|
+
**Nouveautés**
|
|
157
|
+
|
|
158
|
+
- Focus d'abonnements dynamique, allege pypilot_web sur le Pi Zero.
|
|
159
|
+
- Enregistreur de sessions + boucle de conseils (JSONL par engage).
|
|
160
|
+
- Capture des logs Pi Zero sur le Pi 5.
|
|
161
|
+
- Aide en clair par slider de gain.
|
|
162
|
+
- Doctor et alarmes dans la langue active.
|
|
163
|
+
- Selecteur de mode traduit en MAJUSCULES.
|
|
164
|
+
- Doctor: bouton Masquer toujours visible.
|
|
165
|
+
- Puces de statut vivantes sur chaque tuile Setup.
|
|
166
|
+
- Sensor Quality avec Ignorer / Restaurer par ligne.
|
|
167
|
+
- Chart: figeage au survol + graduation Y par bande.
|
|
168
|
+
- Tune: ↺ par slider + modal de fork de profil.
|
|
169
|
+
- Glissement du haut vers le bas pour reafficher la barre d'onglets.
|
|
170
|
+
|
|
171
|
+
## 2.3.0 — 2026-08-31 — Rev130..Rev137
|
|
172
|
+
|
|
173
|
+
Feature batch on top of 2.2.x. Themes: make the visor speak the user's
|
|
174
|
+
language end-to-end (Doctor findings, alarm banners and TTS voice
|
|
175
|
+
included), turn the Setup launcher into an at-a-glance dashboard,
|
|
176
|
+
give Tune the same profile-fork discipline the Doctor already had,
|
|
177
|
+
and make Sensor Quality something the skipper can silence for
|
|
178
|
+
sensors that aren't on this boat.
|
|
179
|
+
|
|
180
|
+
### English
|
|
181
|
+
|
|
182
|
+
**Added**
|
|
183
|
+
|
|
184
|
+
- **Chart tab — interactive hover** (Rev129) — freeze the auto-refresh
|
|
185
|
+
and read the exact value of every band at any point in the history
|
|
186
|
+
window by hovering the graph. Y-axis ticks (min / mid / max) now
|
|
187
|
+
sit inside the right gutter for each band.
|
|
188
|
+
- **Tune tab — per-slider restore + profile fork prompt** (Rev129,
|
|
189
|
+
Rev132..Rev134) — every gain slider gets a ↺ button that snaps
|
|
190
|
+
back to the frozen baseline captured when you unlocked the panel.
|
|
191
|
+
On the first change of an unlock session a modal asks whether to
|
|
192
|
+
keep the tweaks in the current profile, save them in a new
|
|
193
|
+
`tune-YYYYMMDD-HHMM` fork (mirroring the Doctor pattern), or
|
|
194
|
+
Cancel and revert the change entirely.
|
|
195
|
+
- **Setup launcher — live status chips on every tile** (Rev130..Rev135)
|
|
196
|
+
— Pypilot Connection shows `host:port`, Language shows the active
|
|
197
|
+
locale, Calibration shows the timestamp of the last slider
|
|
198
|
+
adjustment (with a `Reset historial` button on the card), Signal K
|
|
199
|
+
Sentences shows the count of published SK paths out of the plugin
|
|
200
|
+
catalog total, and Remote Control Console reports whether SSH
|
|
201
|
+
creds are stored.
|
|
202
|
+
- **Sensor Quality — per-row Ignore / Restore** (Rev134..Rev135) —
|
|
203
|
+
the chip now also counts "missing" sensors (a watched path that
|
|
204
|
+
has never emitted a delta) into the failure tally, and each row
|
|
205
|
+
gains an Ignore / Restore button so a sensor you don't have on
|
|
206
|
+
this boat (rudder without a rudder feedback, temp probe absent,
|
|
207
|
+
...) stops turning the chip red. Persisted per-browser.
|
|
208
|
+
- **Nav bar slide-down gesture** (Rev129) — the counterpart to the
|
|
209
|
+
existing slide-up hide; drag from the top of the visor to bring
|
|
210
|
+
the tab bar back.
|
|
211
|
+
- **Doctor — Hide button always visible + i18n findings**
|
|
212
|
+
(Rev135..Rev136) — the Descartar / Ocultar button stays visible
|
|
213
|
+
even after a suggestion has been applied so you can clear stale
|
|
214
|
+
advice from the list. Hidden suggestions also drop off the tile
|
|
215
|
+
chip's counter so the card goes back to `sano` once you've cleared
|
|
216
|
+
everything. Backend now emits i18n keys + args for findings and
|
|
217
|
+
summary so the whole Doctor panel reads in the active language.
|
|
218
|
+
- **Alarm engine i18n** (Rev135..Rev136) — the seven built-in alarm
|
|
219
|
+
rules (heading-deviation, unable-to-steer, servo-overcurrent,
|
|
220
|
+
servo-temp-high, low-voltage, sensor-lost, pypilot-disconnected)
|
|
221
|
+
now render banners and speak the message in the active language
|
|
222
|
+
(EN / ES / DE / FR). The backend still publishes the English
|
|
223
|
+
notification message on `notifications.autopilot.*` for
|
|
224
|
+
KIP / WilhelmSK compatibility.
|
|
225
|
+
- **Info tab — English classic-UI link fix** (Rev129) — the
|
|
226
|
+
hardcoded Spanish string "Interfaz clasica pypilot" that leaked
|
|
227
|
+
into every language moved to a proper i18n key with `{host}` /
|
|
228
|
+
`{port}` interpolation.
|
|
229
|
+
- **Remote Control Console — TinyPilot defaults** (Rev136) — the
|
|
230
|
+
tile no longer wears its emergency red frame; the SSH user field
|
|
231
|
+
is pre-filled with the TinyPilot default (`tc`) and a hint spells
|
|
232
|
+
out that the default password is `tc` too, so the setup is a
|
|
233
|
+
two-click job on a stock TinyPilot.
|
|
234
|
+
- **Better DE / FR coverage** (Rev134..Rev136) — Setup tile titles,
|
|
235
|
+
calibration strings, Tune fork modal, chip labels, Doctor summary
|
|
236
|
+
/ findings and alarm messages now translate in Deutsch and
|
|
237
|
+
Français instead of falling back to English.
|
|
238
|
+
|
|
239
|
+
**Changed**
|
|
240
|
+
|
|
241
|
+
- **All six screenshots refreshed** to match the current UI
|
|
242
|
+
(Control rose with the Gota Chain arrow layout, Chart Trip Stats,
|
|
243
|
+
Tune with per-slider reset, Setup launcher chips, Race timer,
|
|
244
|
+
Info panel).
|
|
245
|
+
|
|
246
|
+
### Español
|
|
247
|
+
|
|
248
|
+
**Añadido**
|
|
249
|
+
|
|
250
|
+
- **Chart — cursor sobre gráficas** — al pasar el dedo o el ratón
|
|
251
|
+
sobre una gráfica se congela el refresh y aparece una línea
|
|
252
|
+
vertical + tooltip con `-X.Xs` y el valor de cada banda en ese
|
|
253
|
+
punto. Escala Y (min / mid / max) por banda en el margen derecho.
|
|
254
|
+
- **Tune — botón ↺ por slider + prompt de perfil** — cada gain trae
|
|
255
|
+
un ↺ que vuelve al valor previo (el que había al desbloquear). El
|
|
256
|
+
primer cambio tras unlock lanza un modal preguntando si guardar
|
|
257
|
+
en el perfil actual, crear un nuevo `tune-YYYYMMDD-HHMM` (mismo
|
|
258
|
+
patrón que Doctor) o cancelar y revertir.
|
|
259
|
+
- **Setup — chips vivos en cada tile** — TinyPilot con host:port,
|
|
260
|
+
idioma actual, fecha del último ajuste de calibración (con botón
|
|
261
|
+
Reset historial), contador de sentencias SK publicadas frente al
|
|
262
|
+
total del catálogo del plugin, y aviso de SSH configurado en
|
|
263
|
+
Remote Control Console.
|
|
264
|
+
- **Sensor Quality — Ignorar / Restaurar por fila** — los sensores
|
|
265
|
+
que nunca han reportado también cuentan en el ✕, y cada fila con
|
|
266
|
+
problema tiene ahora un botón Ignorar (persistente en el
|
|
267
|
+
navegador) para no volver a teñir el chip por un sensor que no
|
|
268
|
+
hay en el barco.
|
|
269
|
+
- **Slide desde arriba para mostrar la barra de pestañas** — vuelta
|
|
270
|
+
atrás del slide hacia arriba que ya escondía la nav.
|
|
271
|
+
- **Doctor — botón Ocultar siempre + findings traducidos** — se
|
|
272
|
+
puede vaciar la lista de sugerencias aunque ya las hubieras
|
|
273
|
+
aplicado, y el chip del tile vuelve a "sano" cuando no queda
|
|
274
|
+
ninguna. Backend emite ahora claves i18n para findings y summary.
|
|
275
|
+
- **Alarmas en tu idioma** — las siete reglas (desvío de rumbo,
|
|
276
|
+
autoridad, servo, temperatura, tensión, sensor perdido,
|
|
277
|
+
desconexión pypilot) se muestran y se hablan en el idioma activo.
|
|
278
|
+
Al SK sigue viajando el mensaje en inglés para compatibilidad con
|
|
279
|
+
KIP / WilhelmSK.
|
|
280
|
+
- **Info EN sin fugas al ES** — el "Interfaz clásica pypilot" que
|
|
281
|
+
se colaba en cualquier idioma pasó a clave i18n.
|
|
282
|
+
- **Remote Console con defaults TinyPilot** — sin borde rojo,
|
|
283
|
+
usuario `tc` pre-cargado y aviso de que la contraseña por defecto
|
|
284
|
+
también es `tc`.
|
|
285
|
+
- **Mejor cobertura DE / FR** en todos los strings visibles del
|
|
286
|
+
Setup, Tune, Doctor y alarmas.
|
|
287
|
+
|
|
288
|
+
**Cambiado**
|
|
289
|
+
|
|
290
|
+
- **6 screenshots** actualizados a la UI actual.
|
|
291
|
+
|
|
292
|
+
### Deutsch
|
|
293
|
+
|
|
294
|
+
**Neu**
|
|
295
|
+
|
|
296
|
+
- Chart mit Hover-Freeze und Y-Achse pro Band.
|
|
297
|
+
- Tune-Slider mit ↺ und Profil-Fork-Dialog (Cancel setzt zurueck).
|
|
298
|
+
- Setup-Kacheln zeigen Live-Status (Host, Sprache,
|
|
299
|
+
Kalibrierdatum, aktive SK-Saetze, SSH konfiguriert).
|
|
300
|
+
- Sensor Quality mit "missing" im Chip-Zaehler und einer
|
|
301
|
+
Ignore / Restore-Taste pro Zeile.
|
|
302
|
+
- Slide von oben zeigt die Tab-Leiste wieder.
|
|
303
|
+
- Doctor: Ausblenden-Taste bleibt sichtbar, Findings und Summary
|
|
304
|
+
jetzt uebersetzt.
|
|
305
|
+
- Alarm-Meldungen und Sprachausgabe in der aktiven Sprache.
|
|
306
|
+
- Remote-Konsole ohne roten Rahmen; `tc` als Standard-Login.
|
|
307
|
+
- Erweiterte DE-Uebersetzungen.
|
|
308
|
+
|
|
309
|
+
### Français
|
|
310
|
+
|
|
311
|
+
**Nouveautés**
|
|
312
|
+
|
|
313
|
+
- Onglet Chart avec figeage au survol et graduation Y par bande.
|
|
314
|
+
- Onglet Tune avec bouton ↺ par slider et modal de fork de profil
|
|
315
|
+
(Annuler revient a la valeur d'origine).
|
|
316
|
+
- Grille Setup avec puces d'etat vivantes (hote, langue, dernier
|
|
317
|
+
ajustement de calibration, phrases SK actives, SSH configure).
|
|
318
|
+
- Sensor Quality avec "missing" dans le compteur et un bouton
|
|
319
|
+
Ignorer / Restaurer par ligne.
|
|
320
|
+
- Glissement du haut vers le bas pour reafficher la barre
|
|
321
|
+
d'onglets.
|
|
322
|
+
- Doctor: bouton Masquer toujours visible, findings et resume
|
|
323
|
+
traduits.
|
|
324
|
+
- Alarmes et voix TTS dans la langue active.
|
|
325
|
+
- Console distante sans cadre rouge; `tc` par defaut.
|
|
326
|
+
- Traductions FR etendues.
|
|
327
|
+
|
|
3
328
|
## 2.2.1 — 2026-08-31 — Rev128
|
|
4
329
|
|
|
5
330
|
Docs-only patch release.
|
package/README.md
CHANGED
|
@@ -11,13 +11,142 @@ by Panaaj — see [Working alongside pypilot-autopilot-provider](#working-alongs
|
|
|
11
11
|
|
|
12
12
|
## Screenshots
|
|
13
13
|
|
|
14
|
-
| Control |
|
|
14
|
+
| Control | Chart |
|
|
15
15
|
|---|---|
|
|
16
|
-
|  |  |  |
|
|
17
17
|
|
|
18
|
-
|
|
|
18
|
+
| Tune | Setup |
|
|
19
19
|
|---|---|
|
|
20
|
-
|  |  |
|
|
21
|
+
|
|
22
|
+
| Race | Info |
|
|
23
|
+
|---|---|
|
|
24
|
+
|  |  |
|
|
25
|
+
|
|
26
|
+
## What's new in 2.4.0
|
|
27
|
+
|
|
28
|
+
Feature release. The plugin has learnt to behave itself around the Pi
|
|
29
|
+
Zero and now speaks the sailor's language instead of pilot-programmer
|
|
30
|
+
jargon. The rework was driven by direct feedback from **Sean D'Epagnier**
|
|
31
|
+
(pypilot author) on how his `pypilot_web` handles a firehose of
|
|
32
|
+
subscriptions, and by field observations from Carlos on Tunatunes.
|
|
33
|
+
|
|
34
|
+
- **Dynamic watch focus (per Sean D'Epagnier's advice)** — before, the
|
|
35
|
+
plugin permanently subscribed ~170 pypilot values, which pressured
|
|
36
|
+
`pypilot_web` on the Pi Zero W and eventually locked its socket
|
|
37
|
+
buffer. Now the backend keeps a minimal always-on "core" set (~15
|
|
38
|
+
paths) and accepts short-lived `focus` requests from the visor: the
|
|
39
|
+
Tune tab bumps its gain paths to 2 Hz only while it is on screen,
|
|
40
|
+
same for the Calibration sliders in Setup. When the tab closes the
|
|
41
|
+
TTL expires and the rate drops back. New endpoints
|
|
42
|
+
`/watch/focus`, `/watch/release` and `/watch/status`, a live
|
|
43
|
+
inspector in Setup → Remote Control Console, plus a `Restart
|
|
44
|
+
pypilot_web` button that runs `sv restart pypilot_web` via SSH.
|
|
45
|
+
- **Navigation session recorder + shared-advice loop** — every engaged
|
|
46
|
+
AP session is now saved as JSONL to
|
|
47
|
+
`~/.signalk/plugin-config-data/signalk-pypilot-newui/nav-sessions/`.
|
|
48
|
+
Users label conditions (wind, sea state, propulsion, point of sail,
|
|
49
|
+
crew) from a modal in Setup → Doctor, share the file via WhatsApp
|
|
50
|
+
or email, receive an "advice" JSON back and upload it to the visor,
|
|
51
|
+
where it renders as "Consejos recibidos". First step towards an
|
|
52
|
+
AI-tuned Doctor: the plugin does not run any AI at runtime - all
|
|
53
|
+
the learning happens off-boat and gets injected into future Revs as
|
|
54
|
+
plain heuristics.
|
|
55
|
+
- **Pi Zero log capture** — piCore keeps `/var/log` in tmpfs, so a
|
|
56
|
+
hang wipes the logs the moment the user hits the hard reset relay.
|
|
57
|
+
A new opt-in poller SSHes into the Pi Zero on a configurable
|
|
58
|
+
cadence, tails `/var/log/pypilot/*` and appends the new lines to a
|
|
59
|
+
persistent daily file on the Pi 5. Toggle + downloader live in the
|
|
60
|
+
Remote Control Console.
|
|
61
|
+
- **Plain-language help for every gain** — every P / I / D / DD / PR
|
|
62
|
+
/ FF slider in Tune and every documented RangeSetting slider in
|
|
63
|
+
Setup → Calibration now carries a short "what it does" line plus a
|
|
64
|
+
`?` button that expands into "when to raise, when to lower". EN /
|
|
65
|
+
ES / DE / FR. Directly inspired by Sean's own suggestion in the
|
|
66
|
+
pypilot forum.
|
|
67
|
+
- **Alarm engine and Doctor speak the user's language** — the seven
|
|
68
|
+
built-in alarm rules and the Doctor findings + summary now render
|
|
69
|
+
in the active language (EN / ES / DE / FR); the backend still ships
|
|
70
|
+
English strings on `notifications.autopilot.*` for KIP / WilhelmSK
|
|
71
|
+
compatibility.
|
|
72
|
+
- **Mode selector proper i18n and uppercase tabs** — pypilot mode
|
|
73
|
+
strings (`compass`, `wind`, `true wind`, `nav`) plus the plugin's
|
|
74
|
+
own `aproado` pseudo-mode all render as translated UPPERCASE labels
|
|
75
|
+
("COMPAS", "VIENTO APARENTE", "APROADO", ...). Sailing tab labels
|
|
76
|
+
are UPPERCASE too so accents remain optional per RAE convention.
|
|
77
|
+
- **Doctor UX polish** — every suggestion carries a Hide/Discard
|
|
78
|
+
button that stays visible even after the suggestion has been
|
|
79
|
+
applied, so stale advice never sticks in the list; the Setup tile
|
|
80
|
+
chip mirrors the visible count.
|
|
81
|
+
- **Setup launcher — live status chips on every tile** — pypilot
|
|
82
|
+
host+port, active language, last calibration adjustment timestamp
|
|
83
|
+
(with a Reset button), count of active SK sentences vs the total
|
|
84
|
+
catalogue (all 181 keys), and an SSH-configured pill on Remote
|
|
85
|
+
Control Console. Sensor Quality gains a per-row Ignore / Restore
|
|
86
|
+
button so a rudder feedback that does not exist on this boat stops
|
|
87
|
+
turning the chip red.
|
|
88
|
+
- **Chart tab — hover freeze + per-band Y-axis** — touch or hover
|
|
89
|
+
over the timeline to freeze the auto-refresh and read the exact
|
|
90
|
+
value at that point for every band. Min / mid / max ticks appear
|
|
91
|
+
inside the right gutter of each band.
|
|
92
|
+
- **Tune — per-slider ↺ restore and profile-fork prompt** — every
|
|
93
|
+
gain gets a ↺ that snaps back to the frozen "was:" baseline. The
|
|
94
|
+
first change per unlock triggers a Doctor-style modal to keep the
|
|
95
|
+
tweaks in the current profile, save them in a new
|
|
96
|
+
`tune-YYYYMMDD-HHMM` fork, or Cancel and revert.
|
|
97
|
+
- **Nav bar slide-down gesture** — swipe from the top of the visor
|
|
98
|
+
to bring the tab bar back (counterpart to the existing slide-up
|
|
99
|
+
hide).
|
|
100
|
+
|
|
101
|
+
## What's new in 2.3.0
|
|
102
|
+
|
|
103
|
+
Feature batch on top of 2.2.x:
|
|
104
|
+
|
|
105
|
+
- **Chart tab — interactive hover** — freeze the auto-refresh and
|
|
106
|
+
read the exact value of every band at any point in the history
|
|
107
|
+
window by hovering the graph. Y-axis ticks (min / mid / max) now
|
|
108
|
+
sit inside the right gutter for each band.
|
|
109
|
+
- **Tune tab — per-slider restore + profile fork prompt** — every
|
|
110
|
+
gain slider gets a ↺ button that snaps back to the frozen
|
|
111
|
+
baseline captured when you unlocked the panel. On the first
|
|
112
|
+
change of an unlock session a modal asks whether to keep the
|
|
113
|
+
tweaks in the current profile, save them in a new
|
|
114
|
+
`tune-YYYYMMDD-HHMM` fork (mirroring the Doctor pattern), or
|
|
115
|
+
Cancel and revert.
|
|
116
|
+
- **Setup launcher — live status chips on every tile** — Pypilot
|
|
117
|
+
Connection shows `host:port`, Language shows the active locale,
|
|
118
|
+
Calibration shows the timestamp of the last slider adjustment
|
|
119
|
+
(with a `Reset historial` button on the card), Signal K Sentences
|
|
120
|
+
shows the count of published SK paths, and Remote Control Console
|
|
121
|
+
says whether SSH creds are stored. Sensor Quality now counts
|
|
122
|
+
missing sensors into the failure tally and each row gains an
|
|
123
|
+
Ignore / Restore button so a sensor you don't have on this boat
|
|
124
|
+
(rudder without a rudder feedback, temp probe absent, ...) stops
|
|
125
|
+
turning the chip red.
|
|
126
|
+
- **Nav bar slide-down gesture** — the counterpart to the existing
|
|
127
|
+
slide-up hide; drag from the top of the visor to bring the tab
|
|
128
|
+
bar back.
|
|
129
|
+
- **Doctor tab — Hide / Discard on every suggestion** — the
|
|
130
|
+
Descartar / Ocultar button stays visible even after a suggestion
|
|
131
|
+
has been applied so you can clear stale advice from the list.
|
|
132
|
+
Hidden suggestions also drop off the tile chip's counter so the
|
|
133
|
+
card goes back to `sano` once you've cleared everything. Backend
|
|
134
|
+
now emits i18n keys + args for findings and summary so the whole
|
|
135
|
+
Doctor panel reads in the active language.
|
|
136
|
+
- **Alarm engine i18n** — the seven built-in alarm rules
|
|
137
|
+
(heading-deviation, unable-to-steer, servo-overcurrent, etc.) now
|
|
138
|
+
render banners and speak the message in the active language
|
|
139
|
+
(EN / ES / DE / FR). The backend still publishes the English
|
|
140
|
+
notification message on `notifications.autopilot.*` for
|
|
141
|
+
KIP / WilhelmSK compatibility.
|
|
142
|
+
- **Better DE / FR coverage** — Setup tile titles, calibration
|
|
143
|
+
strings, Tune fork modal and Info tab now translate in Deutsch
|
|
144
|
+
and Français instead of falling back to English.
|
|
145
|
+
- **Remote Control Console defaults** — the tile no longer wears
|
|
146
|
+
its emergency red frame; the SSH user field is pre-filled with
|
|
147
|
+
the TinyPilot default (`tc`) and a hint spells out that the
|
|
148
|
+
default password is `tc` too, so the setup is a two-click job on
|
|
149
|
+
a stock TinyPilot.
|
|
21
150
|
|
|
22
151
|
## What's new in 2.2.0
|
|
23
152
|
|
package/dist/doctor.js
CHANGED
|
@@ -175,6 +175,8 @@ class DoctorEngine {
|
|
|
175
175
|
severity: "warn",
|
|
176
176
|
message: `Only ${n} engaged samples collected. Analysis skipped - keep the AP engaged during the whole session.`,
|
|
177
177
|
metric: `n=${n}`,
|
|
178
|
+
messageKey: "doctor.finding.insufficientData",
|
|
179
|
+
messageArgs: { n: String(n) },
|
|
178
180
|
});
|
|
179
181
|
return this.buildResult(session, now, samples, engaged, findings, suggestions);
|
|
180
182
|
}
|
|
@@ -185,6 +187,8 @@ class DoctorEngine {
|
|
|
185
187
|
severity: Math.abs(meanDeg) > 6 ? "critical" : "warn",
|
|
186
188
|
message: `Persistent heading offset of ${meanDeg.toFixed(1)}° (mean error).`,
|
|
187
189
|
metric: `meanErr=${meanDeg.toFixed(2)}°`,
|
|
190
|
+
messageKey: "doctor.finding.bias",
|
|
191
|
+
messageArgs: { deg: meanDeg.toFixed(1) },
|
|
188
192
|
});
|
|
189
193
|
const I = session.initialGains["I"];
|
|
190
194
|
if (typeof I === "number" && I > 0) {
|
|
@@ -215,6 +219,8 @@ class DoctorEngine {
|
|
|
215
219
|
severity: "warn",
|
|
216
220
|
message: `Heading oscillating with period ~${oscPeriodS.toFixed(1)}s, RMS ${rmsDeg.toFixed(1)}°.`,
|
|
217
221
|
metric: `oscPeriod=${oscPeriodS.toFixed(1)}s rms=${rmsDeg.toFixed(2)}°`,
|
|
222
|
+
messageKey: "doctor.finding.oscillation",
|
|
223
|
+
messageArgs: { period: oscPeriodS.toFixed(1), rms: rmsDeg.toFixed(1) },
|
|
218
224
|
});
|
|
219
225
|
const D = session.initialGains["D"];
|
|
220
226
|
if (typeof D === "number" && D > 0) {
|
|
@@ -246,6 +252,8 @@ class DoctorEngine {
|
|
|
246
252
|
severity: "critical",
|
|
247
253
|
message: `Servo running at ${(servoDuty * 100).toFixed(0)}% duty but heading error still ${rmsDeg.toFixed(1)}°. AP is losing authority.`,
|
|
248
254
|
metric: `rms=${rmsDeg.toFixed(2)}° duty=${(servoDuty * 100).toFixed(0)}%`,
|
|
255
|
+
messageKey: "doctor.finding.authority",
|
|
256
|
+
messageArgs: { duty: (servoDuty * 100).toFixed(0), rms: rmsDeg.toFixed(1) },
|
|
249
257
|
});
|
|
250
258
|
const P = session.initialGains["P"];
|
|
251
259
|
if (typeof P === "number" && P > 0) {
|
|
@@ -275,6 +283,8 @@ class DoctorEngine {
|
|
|
275
283
|
severity: "info",
|
|
276
284
|
message: `Heading is tight (${rmsDeg.toFixed(2)}°) but servo running ${(servoDuty * 100).toFixed(0)}% duty - possible chatter on a noisy heading signal.`,
|
|
277
285
|
metric: `rms=${rmsDeg.toFixed(2)}° duty=${(servoDuty * 100).toFixed(0)}%`,
|
|
286
|
+
messageKey: "doctor.finding.noise",
|
|
287
|
+
messageArgs: { rms: rmsDeg.toFixed(2), duty: (servoDuty * 100).toFixed(0) },
|
|
278
288
|
});
|
|
279
289
|
// No P/I/D suggestion - chatter is usually a deadband issue.
|
|
280
290
|
}
|
|
@@ -282,12 +292,23 @@ class DoctorEngine {
|
|
|
282
292
|
}
|
|
283
293
|
buildResult(session, now, samples, engaged, findings, suggestions) {
|
|
284
294
|
let summary;
|
|
285
|
-
|
|
295
|
+
let summaryKey;
|
|
296
|
+
let summaryArgs;
|
|
297
|
+
if (findings.length === 0) {
|
|
286
298
|
summary = "No significant issues detected. Current gains look healthy.";
|
|
287
|
-
|
|
299
|
+
summaryKey = "doctor.summary.clean";
|
|
300
|
+
summaryArgs = {};
|
|
301
|
+
}
|
|
302
|
+
else if (suggestions.length === 0) {
|
|
288
303
|
summary = `${findings.length} issue(s) noted (no gain change suggested).`;
|
|
289
|
-
|
|
304
|
+
summaryKey = "doctor.summary.notedOnly";
|
|
305
|
+
summaryArgs = { issues: findings.length };
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
290
308
|
summary = `${findings.length} issue(s) detected. ${suggestions.length} gain change(s) suggested.`;
|
|
309
|
+
summaryKey = "doctor.summary.detected";
|
|
310
|
+
summaryArgs = { issues: findings.length, suggestions: suggestions.length };
|
|
311
|
+
}
|
|
291
312
|
return {
|
|
292
313
|
sessionId: session.id,
|
|
293
314
|
startedTs: session.startedTs,
|
|
@@ -301,6 +322,8 @@ class DoctorEngine {
|
|
|
301
322
|
findings,
|
|
302
323
|
suggestions,
|
|
303
324
|
summary,
|
|
325
|
+
summaryKey,
|
|
326
|
+
summaryArgs,
|
|
304
327
|
};
|
|
305
328
|
}
|
|
306
329
|
// Rev120 (Carlos): on the FIRST apply of this session we fork the
|