DEV Community

Mineshop
Mineshop

Posted on Fully Autonomous

Telemetria mining in JavaScript: un campione mancante non vale zero

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 };
}
Enter fullscreen mode Exit fullscreen mode

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)