flespi: echtes Lesen statt Zwischenspeicher, und kein Gleichstand ohne Grundlage

Der Waechter meldete am 04.09.2026 "stimmt ueberein" fuer
trip_scenario.ign_off_timeout: 900 gegen unsere Konstante NACHLAUF_S = 900.
Das Geraet hat dort 0 - das Trip-Szenario ist abgeschaltet. flespis
Zwischenspeicher trug den Stand vom 01.09. 13:15, dreieinhalb Tage alt.
Der Eigentuemer hat es aufgedeckt: "die gelesenen werte sind veraltet".

Zwei Aenderungen:

1. "Jetzt lesen" leert erst den Zwischenspeicher der ueberwachten
   Einstellungen (DELETE /gw/devices/{id}/settings/{name} - die
   API-Entsprechung des Panel-Knopfes "clear cache and synchronize"; loescht
   den gespeicherten Wert, nicht den im Geraet) und holt dann neu.
   Einstellungen mit einem AUSSTEHENDEN Wert werden uebersprungen: dasselbe
   DELETE wuerde ihn verwerfen, und die Aenderung kaeme nie an - wie
   1003/1004, die am 04.09. acht Stunden in der Warteschlange standen.

2. `abweichung` ist dreiwertig: true, false und **null (kein Urteil)**. Null
   steht dort, wo ein Vergleich nichts aussagt - der Wert wurde nie vom
   Geraet bestaetigt, oder es ist gerade eine Aenderung unterwegs. Dazu
   traegt jede Zeile `gemeldet_am` (flespis `updated`), und beide
   Oberflaechen zeigen es an: "bestaetigt 01.09.2026 (4 T. alt)" bzw.
   "nie bestaetigt".

Ein stiller Gleichstand mit einem veralteten Wert ist schlimmer als gar kein
Vergleich: er behauptet Sicherheit, wo keine ist.

tsc sauber, 271 Tests, vite build sauber, Panel als Modul geparst,
py_compile sauber, audi_ha_test auf 2026.9.4.26 ohne Traceback.
This commit is contained in:
2026-09-05 01:11:23 +02:00
parent 9ac69cdf44
commit 5621b818cc
7 changed files with 175 additions and 21 deletions
+13 -1
View File
@@ -255,7 +255,15 @@ export interface DongleWert {
offen: unknown;
/** Unser eigener Wert, sofern es einen zu vergleichen gibt. */
unser: number | null;
abweichung: boolean;
/** Dreiwertig: true weicht ab, false stimmt überein, **null kein
Urteil** — der Wert wurde nie vom Gerät bestätigt, oder es ist
gerade eine Änderung zu ihm unterwegs. Bis zum 04.09.2026 war das
ein Bool, und `false` behauptete Übereinstimmung auch gegen einen
tagealten Wert. */
abweichung: boolean | null;
/** Wann das Gerät diesen Wert zuletzt bestätigt hat (flespis
`updated`) — null heißt: nie. */
gemeldet_am?: string | null;
}
export interface DongleStand {
@@ -264,6 +272,10 @@ export interface DongleStand {
anzahl?: number;
werte?: DongleWert[];
abweichungen?: number;
/** Zeilen ohne Urteil: nie bestätigt oder gerade unterwegs. */
unbekannt?: number;
/** Welche Zwischenspeicher dieser Abruf geleert hat. */
geleert?: string[];
/** Wie viele der gezeigten Werte noch zum Gerät unterwegs sind. */
offen?: number;
fehler: string | null;
+16 -3
View File
@@ -25,6 +25,19 @@ import { HistorienImport } from "./HistorienImport"
import type { ServicebuchEintrag } from "./Service"
import { zugangLesenSynchron, zugangVergessen } from "./zugang"
/* Wann das Gerät einen Wert zuletzt bestätigt hat — oder dass es das nie
getan hat. Steht dort, wo vorher nichts stand, wenn kein Urteil möglich
ist: ein stiller Gleichstand mit einem veralteten Wert ist schlimmer als
gar kein Vergleich (04.09.2026). Wortgleich mit dongleStand() im Panel. */
function dongleStand(w: { gemeldet_am?: string | null }): string {
if (!w.gemeldet_am) return "nie bestätigt"
const d = new Date(w.gemeldet_am)
if (Number.isNaN(d.getTime())) return "nie bestätigt"
const tage = Math.floor((Date.now() - d.getTime()) / 86400000)
const wann = datum(d)
return tage >= 1 ? `bestätigt ${wann} (${tage} T. alt)` : `bestätigt ${wann}`
}
export function Einstellungen({
tabBeschriftung,
setzeTabBeschriftung,
@@ -964,13 +977,13 @@ export function Einstellungen({
key={w.schluessel}
label={`${w.titel} ${w.nummer}`}
wert={`${w.geraet ?? ""}${w.einheit ? " " + w.einheit : ""}`}
warnung={Boolean(w.abweichung)}
warnung={w.abweichung === true}
zusatz={
w.offen != null
? `${w.offen}, unterwegs`
: w.abweichung
: w.abweichung === true
? `(wir: ${w.unser})`
: undefined
: dongleStand(w)
}
/>
))}