Temperature

Temperature dei frigoriferi e di cottura, rilevate da una persona o riportate da un sensore — tre collezioni, e ciò che le distingue.

La temperatura è la misurazione su cui ruota un'ispezione di sicurezza alimentare, e l'app la registra in tre modi. Si somigliano e significano cose diverse, quindi vale la pena capire bene la distinzione prima di costruirci sopra qualunque cosa.

CollezioneAmbitoChi ha effettuato la misurazione
temperature-recordstemperature-records:readUna persona, su un frigorifero o un congelatore, durante un turno indicato.
temperature-readingstemperature-readings:readUn sensore, per conto proprio, senza presidio.
cooking-temperature-recordscooking-temperature-records:readUna persona, su un'unità di cottura — un forno, un armadio di mantenimento.

Tutte e tre condividono l'involucro di istantanea: id, deleted, capturedAt, receivedAt, sequence e gli altri stanno accanto al data descritto qui sotto.

temperature-records

Un controllo manuale su un'apparecchiatura della catena del freddo. Un record per lettura, per apparecchiatura, per turno.

CampoTipoSignificato
timestampstringa, obbligatorioQuando è stata effettuata la lettura, millisecondi dall'epoch come stringa.
valuenumero, obbligatorioLa temperatura stessa.
unitstringa, obbligatorioCELSIUS in ogni record che abbiamo visto. La legga anziché darla per scontata.
shiftstringa, obbligatorioIl servizio a cui appartiene — MORNING, EVENING. Maiuscolo.
equipmentIdstringa, obbligatorioL'apparecchiatura misurata.
correctiveActionsstringa[]Cosa è stato fatto quando la lettura era fuori intervallo. Vuoto quando non serviva nulla.
userIdstringa | nullIl membro del personale che l'ha effettuata, quando l'app ne ha registrato uno.
{
  "id": "48a30f0b-ccc0-4d18-8404-525b16ecaaa6",
  "collection": "temperature-records",
  "deleted": false,
  "capturedAt": "1789772570338",
  "receivedAt": "1789772802108",
  "sequence": "1",
  "data": {
    "timestamp": "1789768800000",
    "value": -14.4,
    "unit": "CELSIUS",
    "shift": "MORNING",
    "equipmentId": "84ce5c13-3237-40d4-901a-cbba59a6406f",
    "userId": "2774953d-8d9b-4a68-8ec4-1209edd90777"
  }
}

value è una lettura, non un verdetto. Niente nel record dice se fosse accettabile: dipende dal min e dal max dell'apparecchiatura, che deve leggere separatamente e che il ristorante può modificare. Un record rilevato a -14,4 °C è un problema in un frigorifero ed è normale in un congelatore.

correctiveActions è testo libero, digitato durante il servizio nella lingua del ristorante. Lo conteggi pure, ma non ne costruisca un enum.

temperature-readings

La stessa misurazione, riportata da una sonda wireless anziché da una persona. Stessa forma meno i due campi che hanno senso solo quando è coinvolto un essere umano: non c'è né shiftuserId.

CampoTipoSignificato
timestampstringa, obbligatorioQuando il sensore ha riportato il dato, millisecondi dall'epoch come stringa.
valuenumero, obbligatorioLa temperatura.
unitstringa, obbligatorioCome sopra.
equipmentIdstringa, obbligatorioL'apparecchiatura che il sensore sorveglia.
correctiveActionsstringa[]Compilato in seguito, da una persona, quando si è agito su un allarme.

Questi arrivano secondo la cadenza del sensore, quindi un ristorante indaffarato ne produce molti di più che di record manuali — dimensioni il suo polling sul volume anziché sul numero di persone.

Quale sensore abbia riportato il dato non sta sulla lettura. Il collegamento sta nella collezione sensors, il cui sensorEquipmentId rimanda all'apparecchiatura — attenzione al nome, non è equipmentId.

cooking-temperature-records

Una persona che misura un'unità di cottura anziché una del freddo. Identico a temperature-records, salvo che punta a un'apparecchiatura di cottura.

CampoTipoSignificato
timestampstringa, obbligatorioQuando è stata effettuata la lettura.
valuenumero, obbligatorioLa temperatura.
unitstringa, obbligatorioCome sopra.
shiftstringa, obbligatorioIl servizio a cui appartiene.
cookingEquipmentIdstringa, obbligatorioL'unità di cottura misurata — non equipmentId.
correctiveActionsstringa[]Cosa è stato fatto per una lettura fuori intervallo.
userIdstringa | nullChi l'ha effettuata.

Il nome del campo è l'unica differenza che morde: un client che qui legge equipmentId ottiene undefined, in silenzio, e un grafico senza alcuna apparecchiatura.

Leggerle tutte e tre insieme

Una dashboard che risponde alla domanda «questo frigorifero è rimasto nell'intervallo oggi» vuole temperature-records e temperature-readings uniti su equipmentId, con le soglie da equipment. Tre percorsi, uniti dalla sua parte — non esiste un endpoint che lo faccia per lei.

Due cose da prevedere fin dall'inizio:

  • Ordini su capturedAt, non su receivedAt. Un tablet in una cella frigorifera carica i dati quando trova segnale, quindi il record di una lettura delle 09:00 può arrivare alle 14:00. La pagina sull'involucro racconta tutta la storia.
  • L'assenza non prova nulla. Una lettura mancante può significare che il controllo è stato saltato, oppure che il dispositivo non l'ha ancora caricata. Non stampi un tasso di completamento da questa API chiamandolo conformità — veda l'avvertenza.

Ultimo aggiornamento 2026-09-20.