Quando una dashboard legge un dispositivo, tre stati non sono equivalenti: una misura valida pari a zero, un campione assente e un valore non interpretabile. Usare Number(value) || 0 li confonde: anche una stringa vuota diventa zero.
Conserva lo stato, non solo il numero
Questo piccolo normalizzatore accetta numeri finiti non negativi e stringhe decimali semplici con punto. Rifiuta unità incorporate, booleani, virgole ambigue e notazione esponenziale nelle stringhe. La conversione delle unità deve avvenire prima, in un adattatore specifico del dispositivo.
export function sample(value, measuredAt, now, maxAgeMs = 60000) {
if (!Number.isFinite(now) || !Number.isFinite(maxAgeMs) || maxAgeMs < 0)
throw new TypeError("Orologio o soglia non validi");
if (value === null || value === undefined)
return { status: "missing" };
if (typeof value !== "number" && typeof value !== "string")
return { status: "invalid" };
if (typeof value === "string" &&
!/^(?:\d+(?:\.\d+)?|\.\d+)$/.test(value.trim()))
return { status: "invalid" };
const watts = Number(value);
if (!Number.isFinite(watts) || watts < 0 ||
!Number.isFinite(measuredAt) || measuredAt > now)
return { status: "invalid" };
if (now - measuredAt > maxAgeMs)
return { status: "stale", watts, measuredAt };
return { status: "ok", watts, measuredAt };
}
Casi da provare
Con now = 100000, sample(0, 99000, now) restituisce uno zero valido. sample(null, 99000, now) è mancante; sample("", 99000, now) è invalido. sample(200, 1000, now) è obsoleto: conserva il valore per diagnosi ma non fingere che sia attuale.
Un timestamp futuro è invalido. Non mescolare secondi e millisecondi: la funzione richiede millisecondi per tutti i tempi. Un orologio del dispositivo non sincronizzato richiede una strategia esplicita, per esempio un timestamp di ricezione affidabile lato collector.
Dal dato all'interfaccia
Mostra lo stato insieme al valore: “dato assente”, “campione obsoleto” oppure “200 W, misurati 5 secondi fa”. Un grafico può interrompere la linea nei buchi invece di inventare una caduta a zero. Non inviare un allarme “miner spento” solo perché una richiesta di rete è fallita.
Se calcoli energia da campioni, i buchi richiedono una politica documentata. Integrare potenza nel tempo non equivale a moltiplicare l'ultimo valore per tutta la giornata. Distingui l'energia osservata dalla parte stimata e indica la copertura temporale.
Il polling dovrebbe avere timeout, intervallo ragionevole e gestione degli errori; l'interfaccia di amministrazione del miner non va esposta pubblicamente. Non salvare password nei log e non chiedere mai seed phrase.
Contesto
Questo esempio è educativo, non un driver universale: i campi e le unità cambiano tra firmware. Per il contesto hardware, consulta il catalogo italiano di Mineshop.eu.
Trasparenza: pubblicato da Mineshop.eu, rivenditore di hardware. Testo e codice generati con assistenza AI e verificati con casi riproducibili; il link è al nostro negozio, non un endorsement indipendente.
Top comments (0)