Temperaturen
Kühl- und Gartemperaturen, von einer Person gemessen oder von einem Sensor gemeldet — drei Collections und was sie voneinander unterscheidet.
Die Temperatur ist der Messwert, an dem eine Lebensmittelkontrolle hängt, und die App erfasst sie auf drei Wegen. Sie sehen sich ähnlich und bedeuten Verschiedenes, es lohnt sich also, den Unterschied zu klären, bevor Sie auf einem davon aufbauen.
| Collection | Berechtigung | Wer gemessen hat |
|---|---|---|
temperature-records | temperature-records:read | Eine Person, an einem Kühl- oder Gefriergerät, während einer benannten Schicht. |
temperature-readings | temperature-readings:read | Ein Sensor, von sich aus, unbeaufsichtigt. |
cooking-temperature-records | cooking-temperature-records:read | Eine Person, an einem Gargerät — einem Ofen, einem Warmhalteschrank. |
Alle drei teilen sich den Snapshot-Umschlag: id,
deleted, capturedAt, receivedAt, sequence und der Rest stehen neben dem
data, das unten beschrieben ist.
temperature-records
Eine von Hand erfasste Kontrolle an einem Gerät der Kühlkette. Ein Datensatz pro Messung, pro Gerät, pro Schicht.
| Feld | Typ | Bedeutung |
|---|---|---|
timestamp | string, Pflicht | Wann gemessen wurde, als Zeichenkette mit Millisekunden seit der Epoche. |
value | number, Pflicht | Die Temperatur selbst. |
unit | string, Pflicht | In jedem Datensatz, den wir gesehen haben, CELSIUS. Lesen Sie es, statt es anzunehmen. |
shift | string, Pflicht | Der Dienst, zu dem sie gehört — MORNING, EVENING. Großgeschrieben. |
equipmentId | string, Pflicht | Das gemessene Gerät. |
correctiveActions | string[] | Was getan wurde, als die Messung außerhalb des Bereichs lag. Leer, wenn nichts nötig war. |
userId | string | null | Der Mitarbeiter, der sie erfasst hat, sofern die App einen erfasst hat. |
{
"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 ist eine Messung, kein Urteil. Nichts im Datensatz sagt, ob sie
zulässig war: Das hängt an min und max auf dem Gerät,
die Sie getrennt lesen müssen und die das Restaurant ändern kann. Ein Datensatz
mit -14,4 °C ist in einem Kühlschrank ein Problem und in einem Gefriergerät
normal.
correctiveActions ist Freitext, während des Betriebs getippt, in der
Sprache des Restaurants. Zählen Sie es, wenn Sie mögen; bauen Sie kein Enum
daraus.
temperature-readings
Dieselbe Messung, von einem Funkfühler gemeldet statt von einer Person.
Dieselbe Struktur, abzüglich der beiden Felder, die nur Sinn ergeben, wenn ein
Mensch beteiligt war: Es gibt kein shift und kein userId.
| Feld | Typ | Bedeutung |
|---|---|---|
timestamp | string, Pflicht | Wann der Sensor gemeldet hat, als Zeichenkette mit Millisekunden seit der Epoche. |
value | number, Pflicht | Die Temperatur. |
unit | string, Pflicht | Wie oben. |
equipmentId | string, Pflicht | Das Gerät, das der Sensor überwacht. |
correctiveActions | string[] | Nachträglich von einer Person eingetragen, wenn auf einen Alarm reagiert wurde. |
Diese kommen im Takt des Sensors, ein gut besuchtes Restaurant erzeugt also weit mehr davon als von Hand erfasste Datensätze — richten Sie Ihre Abfragen nach der Menge aus, nicht nach der Zahl der Mitarbeiter.
Welcher Sensor gemeldet hat, steht nicht auf der Messung. Die Verbindung liegt
in der Collection sensors, deren sensorEquipmentId
zurück auf das Gerät zeigt — achten Sie auf den Namen, es ist nicht
equipmentId.
cooking-temperature-records
Eine Person misst ein Gargerät statt eines Kühlgeräts. Identisch mit
temperature-records, nur zeigt es auf ein
Gargerät.
| Feld | Typ | Bedeutung |
|---|---|---|
timestamp | string, Pflicht | Wann gemessen wurde. |
value | number, Pflicht | Die Temperatur. |
unit | string, Pflicht | Wie oben. |
shift | string, Pflicht | Der Dienst, zu dem sie gehört. |
cookingEquipmentId | string, Pflicht | Das gemessene Gargerät — nicht equipmentId. |
correctiveActions | string[] | Was wegen einer Messung außerhalb des Bereichs getan wurde. |
userId | string | null | Wer sie erfasst hat. |
Der Feldname ist der eine Unterschied, der weh tut: Ein Client, der hier
equipmentId liest, bekommt stillschweigend undefined und ein Diagramm ohne
Geräte darin.
Alle drei zusammen lesen
Ein Dashboard, das die Frage „War dieser Kühlschrank heute im Bereich“
beantwortet, will temperature-records und temperature-readings über
equipmentId zusammengeführt haben, dazu die Schwellen aus equipment. Drei
Durchläufe, auf Ihrer Seite verbunden — es gibt keinen Endpunkt, der das für Sie
tut.
Zwei Dinge, die Sie von Anfang an einbauen sollten:
- Ordnen Sie nach
capturedAt, nicht nachreceivedAt. Ein Tablet in einem Kühlraum lädt hoch, sobald es Empfang findet; der Datensatz einer Messung um 09:00 Uhr kann also um 14:00 Uhr ankommen. Die Seite zum Umschlag erzählt die ganze Geschichte. - Abwesenheit beweist nichts. Eine fehlende Messung kann heißen, dass die Kontrolle ausgefallen ist, oder dass das Gerät sie noch nicht hochgeladen hat. Drucken Sie aus dieser API keine Erfüllungsquote und nennen Sie sie Compliance — siehe die Anmerkung zur Vollständigkeit.