Temperaturas
Temperaturas de frío y de cocción, tomadas por una persona o informadas por un sensor: tres colecciones y qué las distingue.
La temperatura es la medición sobre la que gira una inspección de seguridad alimentaria, y la aplicación la registra de tres maneras. Se parecen y significan cosas distintas, así que conviene entender bien la diferencia antes de construir sobre cualquiera de ellas.
| Colección | Permiso | Quién tomó la medición |
|---|---|---|
temperature-records | temperature-records:read | Una persona, en una nevera o un congelador, durante un turno concreto. |
temperature-readings | temperature-readings:read | Un sensor, por su cuenta, sin intervención. |
cooking-temperature-records | cooking-temperature-records:read | Una persona, en un equipo de cocción: un horno, un armario de mantenimiento. |
Las tres comparten el sobre de instantánea: id,
deleted, capturedAt, receivedAt, sequence y los demás campos acompañan
al data que se describe más abajo.
temperature-records
Un control manual sobre un equipo de cadena de frío. Un registro por lectura, por equipo y por turno.
| Campo | Tipo | Significado |
|---|---|---|
timestamp | string, obligatorio | Cuándo se tomó la lectura, en milisegundos desde la época Unix como cadena. |
value | number, obligatorio | La temperatura en sí. |
unit | string, obligatorio | CELSIUS en todos los registros que hemos visto. Léalo en lugar de suponerlo. |
shift | string, obligatorio | El servicio al que pertenece: MORNING, EVENING. En mayúsculas. |
equipmentId | string, obligatorio | El equipo medido. |
correctiveActions | string[] | Qué se hizo cuando la lectura estaba fuera de rango. Vacío cuando no hizo falta nada. |
userId | string | null | El miembro del personal que la tomó, cuando la aplicación registró 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 es una lectura, no un veredicto. Nada en el registro dice si era
aceptable: eso depende del min y el max del equipo, que
tiene que leer aparte y que el restaurante puede cambiar. Un registro tomado a
-14,4 °C es un problema en una nevera y lo normal en un congelador.
correctiveActions es texto libre, tecleado durante el servicio en el
idioma del restaurante. Cuéntelo si quiere; no construya un enum a partir de él.
temperature-readings
La misma medición, informada por una sonda inalámbrica en lugar de por una
persona. La misma forma menos los dos campos que solo tienen sentido cuando
interviene alguien: no hay shift ni userId.
| Campo | Tipo | Significado |
|---|---|---|
timestamp | string, obligatorio | Cuándo informó el sensor, en milisegundos desde la época Unix como cadena. |
value | number, obligatorio | La temperatura. |
unit | string, obligatorio | Como arriba. |
equipmentId | string, obligatorio | El equipo que vigila el sensor. |
correctiveActions | string[] | Se rellena después, por una persona, cuando se actuó sobre una alerta. |
Llegan al ritmo que marca el propio sensor, así que un restaurante con mucha actividad produce muchos más de estos que de registros manuales: dimensione sus consultas para el volumen, no para la plantilla.
Qué sensor informó no figura en la lectura. El vínculo vive en la colección
sensors, cuyo sensorEquipmentId apunta de vuelta al
equipo: atención al nombre, no es equipmentId.
cooking-temperature-records
Una persona que mide un equipo de cocción en lugar de uno de frío. Idéntico a
temperature-records salvo que apunta a un
equipo de cocción.
| Campo | Tipo | Significado |
|---|---|---|
timestamp | string, obligatorio | Cuándo se tomó la lectura. |
value | number, obligatorio | La temperatura. |
unit | string, obligatorio | Como arriba. |
shift | string, obligatorio | El servicio al que pertenece. |
cookingEquipmentId | string, obligatorio | El equipo de cocción medido: no equipmentId. |
correctiveActions | string[] | Qué se hizo ante una lectura fuera de rango. |
userId | string | null | Quién la tomó. |
El nombre del campo es la única diferencia que hace daño: un cliente que lea
equipmentId aquí obtiene undefined, en silencio, y un gráfico sin ningún
equipo.
Leer las tres juntas
Un cuadro de mando que responda a «¿estuvo esta nevera en rango hoy?» necesita
temperature-records y temperature-readings fusionados por equipmentId, con
los umbrales de equipment. Tres recorridos, unidos por su parte: no hay ningún
endpoint que lo haga por usted.
Dos cosas que conviene incorporar desde el principio:
- Ordene por
capturedAt, no porreceivedAt. Una tableta en una cámara frigorífica sube los datos cuando encuentra cobertura, así que el registro de una lectura de las 09:00 puede llegar a las 14:00. La página del sobre cuenta la historia completa. - La ausencia no prueba nada. Una lectura que falta puede significar que el control se omitió, o que el dispositivo todavía no la ha subido. No saque de esta API una tasa de cumplimentación y la llame cumplimiento: consulte la nota sobre exhaustividad.