# Temperaturas

> Temperaturas de frío y de cocción, tomadas por una persona o informadas por un sensor: tres colecciones y qué las distingue.

Source: https://developers.backresto.com/es/docs/temperatures

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 | Scope | 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](https://developers.backresto.com/es/docs/facilities), 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 snapshot](https://developers.backresto.com/es/docs/collections): `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](https://developers.backresto.com/es/docs/facilities) 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. |

```json
{
  "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](https://developers.backresto.com/es/docs/facilities), 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 su
polling para el volumen, no para la plantilla.

Qué sensor informó no figura en la lectura. El vínculo vive en la colección
[`sensors`](https://developers.backresto.com/es/docs/facilities), 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](https://developers.backresto.com/es/docs/facilities).

| 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:

- **Informe sobre `capturedAt`, sincronice por `receivedAt`.** 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](https://developers.backresto.com/es/docs/collections) 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](https://developers.backresto.com/es/docs/support).
