Temperaturas

Temperaturas de frio e de confeção, medidas por uma pessoa ou comunicadas por um sensor — três coleções, e o que as distingue.

A temperatura é a medição de que depende uma inspeção de segurança alimentar, e a aplicação regista-a de três maneiras. Parecem-se umas com as outras e significam coisas diferentes, por isso vale a pena acertar na distinção antes de construir o que quer que seja sobre qualquer uma delas.

ColeçãoÂmbitoQuem fez a medição
temperature-recordstemperature-records:readUma pessoa, num frigorífico ou num congelador, durante um turno identificado.
temperature-readingstemperature-readings:readUm sensor, sozinho, sem ninguém presente.
cooking-temperature-recordscooking-temperature-records:readUma pessoa, num equipamento de confeção — um forno, um armário de manutenção a quente.

As três partilham o envelope de instantâneo: id, deleted, capturedAt, receivedAt, sequence e os restantes ficam ao lado do data descrito abaixo.

temperature-records

Um controlo manual feito num equipamento de cadeia de frio. Um registo por leitura, por equipamento, por turno.

CampoTipoSignificado
timestampstring, obrigatórioQuando a leitura foi feita, em milissegundos desde a época Unix, em forma de cadeia de caracteres.
valuenumber, obrigatórioA temperatura em si.
unitstring, obrigatórioCELSIUS em todos os registos que vimos. Leia-o em vez de o assumir.
shiftstring, obrigatórioO serviço a que pertence — MORNING, EVENING. Em maiúsculas.
equipmentIdstring, obrigatórioO equipamento medido.
correctiveActionsstring[]O que foi feito quando a leitura estava fora do intervalo. Vazio quando não foi preciso nada.
userIdstring | nullO funcionário que a fez, quando a aplicação registou um.
{
  "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 é uma leitura, não um veredito. Nada no registo diz se ela era aceitável: isso depende do min e do max do equipamento, que tem de ler à parte e que o restaurante pode alterar. Um registo feito a -14,4 °C é um problema num frigorífico e é normal num congelador.

correctiveActions é texto livre, escrito durante o serviço na língua do restaurante. Conte-o se quiser; não construa uma enumeração a partir dele.

temperature-readings

A mesma medição, comunicada por uma sonda sem fios em vez de por uma pessoa. O mesmo formato, menos os dois campos que só fazem sentido quando houve um humano envolvido: não há shift nem userId.

CampoTipoSignificado
timestampstring, obrigatórioQuando o sensor comunicou, em milissegundos desde a época Unix, em forma de cadeia de caracteres.
valuenumber, obrigatórioA temperatura.
unitstring, obrigatórioComo acima.
equipmentIdstring, obrigatórioO equipamento que o sensor vigia.
correctiveActionsstring[]Preenchido depois, por uma pessoa, quando se atuou sobre um alerta.

Estes chegam ao ritmo do próprio sensor, por isso um restaurante movimentado produz muitos mais destes do que de registos manuais — dimensione as suas consultas periódicas para o volume, e não para o número de pessoas.

Qual foi o sensor que comunicou não está na leitura. A ligação vive na coleção sensors, cujo sensorEquipmentId aponta de volta para o equipamento — atenção ao nome, não é equipmentId.

cooking-temperature-records

Uma pessoa a medir um equipamento de confeção em vez de um de frio. Idêntico a temperature-records, exceto que aponta para equipamento de confeção.

CampoTipoSignificado
timestampstring, obrigatórioQuando a leitura foi feita.
valuenumber, obrigatórioA temperatura.
unitstring, obrigatórioComo acima.
shiftstring, obrigatórioO serviço a que pertence.
cookingEquipmentIdstring, obrigatórioO equipamento de confeção medido — não equipmentId.
correctiveActionsstring[]O que foi feito a respeito de uma leitura fora do intervalo.
userIdstring | nullQuem a fez.

O nome do campo é a única diferença que morde: um cliente que leia aqui equipmentId recebe undefined, em silêncio, e um gráfico sem equipamento nenhum.

Ler as três em conjunto

Um painel que responda a «este frigorífico esteve dentro do intervalo hoje» quer temperature-records e temperature-readings reunidos pelo equipmentId, com os limiares vindos de equipment. Três percursos, unidos do seu lado — não há endpoint que o faça por si.

Duas coisas a implementar desde o início:

  • Ordene por capturedAt, não por receivedAt. Um tablet numa câmara frigorífica carrega quando encontra sinal, por isso o registo de uma leitura das 09:00 pode chegar às 14:00. A página do envelope conta a história toda.
  • A ausência não prova nada. Uma leitura em falta pode significar que o controlo foi saltado, ou que o dispositivo ainda não a carregou. Não produza uma taxa de execução a partir desta API e lhe chame conformidade — veja a nota de aviso.

Última atualização em 2026-09-20.