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.
| Collezione | Ambito | Chi ha effettuato la misurazione |
|---|---|---|
temperature-records | temperature-records:read | Una persona, su un frigorifero o un congelatore, durante un turno indicato. |
temperature-readings | temperature-readings:read | Un sensore, per conto proprio, senza presidio. |
cooking-temperature-records | cooking-temperature-records:read | Una 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.
| Campo | Tipo | Significato |
|---|---|---|
timestamp | stringa, obbligatorio | Quando è stata effettuata la lettura, millisecondi dall'epoch come stringa. |
value | numero, obbligatorio | La temperatura stessa. |
unit | stringa, obbligatorio | CELSIUS in ogni record che abbiamo visto. La legga anziché darla per scontata. |
shift | stringa, obbligatorio | Il servizio a cui appartiene — MORNING, EVENING. Maiuscolo. |
equipmentId | stringa, obbligatorio | L'apparecchiatura misurata. |
correctiveActions | stringa[] | Cosa è stato fatto quando la lettura era fuori intervallo. Vuoto quando non serviva nulla. |
userId | stringa | null | Il 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é shift né userId.
| Campo | Tipo | Significato |
|---|---|---|
timestamp | stringa, obbligatorio | Quando il sensore ha riportato il dato, millisecondi dall'epoch come stringa. |
value | numero, obbligatorio | La temperatura. |
unit | stringa, obbligatorio | Come sopra. |
equipmentId | stringa, obbligatorio | L'apparecchiatura che il sensore sorveglia. |
correctiveActions | stringa[] | 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.
| Campo | Tipo | Significato |
|---|---|---|
timestamp | stringa, obbligatorio | Quando è stata effettuata la lettura. |
value | numero, obbligatorio | La temperatura. |
unit | stringa, obbligatorio | Come sopra. |
shift | stringa, obbligatorio | Il servizio a cui appartiene. |
cookingEquipmentId | stringa, obbligatorio | L'unità di cottura misurata — non equipmentId. |
correctiveActions | stringa[] | Cosa è stato fatto per una lettura fuori intervallo. |
userId | stringa | null | Chi 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 sureceivedAt. 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.