Dieses Dokument beschreibt wie Daten in der Anwendung gespeichert werden.
Folgende Datensätze werden für jede Messgröẞe durch die Anwendung erfasst:
- die Daten der letzten 24 Stunden (minimales Intervall 4 Minuten)
- die Daten der letzten 31 Tage (minimales Intervall 48 Minuten)
- die Daten des letzten Monats (minimales Intervall 48 Minuten)
- die Daten der letzten 365 Tage (minimales Intervall 10 Stunden)
- die Daten des letzten Jahres (minimales Intervall 10 Stunden)
Das minimale Intervall ist jeweils so gewählt, dass die maximale Menge an gespeicherten Daten vorher bekannt und eine ganze Zahl ist.
Die erhobenen Daten werden binär gespeichert. Bei der Speicherung wird unterschieden zwischen Daten, die temporär gespeichert (und nach einem gewissen Zeitraum verworfen) werden und Daten, die permanent gespeichert werden.
Die Daten der letzten 24 Stunden und der letzten 31 Tage werden in einem Ringpuffer gespeichert. Somit werden die ältesten Daten jeweils von den neusten Daten überschrieben.
Die Daten für einen festen Zeitraum (ein Monat oder ein Jahr) werden permanent, dass heißt ohne die Intention einer Löschung gespeichert.
Das Format in dem die Daten gespeichert werden hängt von der Art der Daten ab. Temporäre Daten werden in einem Ringpuffer gespeichert, permanente Daten werden binär als Datei abgespeichert.
Jeder Eintrag in dem Ringpuffer umfasst 10 Bytes. Alle Integer werden im little-endian Format gespeichert. Der allererste Eintrag teilt sich auf in
- 4 Bytes für die Zahl der Elemente des Ringpuffers als 32-Bit Integer
- 4 Bytes für das aktuelle Element des Ringpuffers als 32-Bit Integer
- 2 Bytes als Padding
Für alle folgenden Einträge enthalten die ersten 8 Bytes dabei einen unsignierten 64-Bit Integer im little-endian Format kodierten Unix-Zeitstempel. Dieser beschreibt die Zeit, zu der die Daten erhoben wurden. Die folgenden zwei Bytes enthalten einen unsignierten 16-Bit Integer im little-endian Format mit den erhobenen Daten.
Das Format von permanenten Daten ähnelt dem des Ringpuffers. Jeder Eintrag umfasst ebenfalls 10 Bytes.
Der allererste Eintrag enthält
- 4 Bytes für die Zahl der Elemente des Puffers als 32-Bit Integer
- 6 Bytes als Padding
Das Format der weiteren Einträge entspricht dem des Ringpuffers, die ersten 8 Bytes enthalten dabei jeweils einen unsignierten 64-Bit Integer im little-endian Format kodierten Unix-Zeitstempel. Dieser beschreibt die Zeit, zu der die Daten erhoben wurden. Die folgenden zwei Bytes enthalten einen unsignierten 16-Bit Integer im little-endian Format mit den erhobenen Daten.
Der Speicherort der Daten wird durch die Umgebungsvariable DATA_DIR
bestimmt.
Zusätzlich ist der Speicherort vom aktuellen Datum abhängig.
Am 19.04.2021 würden Temperaturdaten vom Ort Aquarium zum Beispiel an den
folgenden Orten persistiert werden:
Pfad | Beschreibung |
---|---|
${DATA_DIR}/aquarium/temparature/24h.dat |
Der Ringpuffer mit den Daten der letzten 24 Stunden |
${DATA_DIR}/aquarium/temperature/31d.dat |
Der Ringpuffer mit den Daten der letzten 31 Tage |
${DATA_DIR}/aquarium/temperature/2021.dat |
Die gesammelten Daten des Jahres 2021 |
${DATA_DIR}/aquarium/temperature/2021/04.dat |
Die gesammelten Daten des Aprils '21 |
In den Daten eines Monats oder eines Jahres werden die Daten als Duchschnitt eines Intervalls zusammengfasst. Dazu wird beim Eingang eines neuen Datums geprüft, ob das letzte Datum der Messgröße im selben Intervall (selbe Stunde oder selber Tag) liegt. Ist dies der Fall, wird das neue Datum lediglich im Ringpuffer persistiert. Andernfalls wird aus allen Daten des letzten Intervalls (Stunde oder Tag) der Durchschnitt gebildet und persistiert.