📈 Data Time-Series

Timestamp, tag, field — dan kenapa database IoT bukan database biasa.

Struktur data time-series
Setiap titik = timestamp + measurement + tag + field

📌 1. Anatomi Data Time-Series

titik = { "ts": 1234.0, # TIMESTAMP — kapan (jantung time-series) "m": "suhu", # MEASUREMENT — apa yang diukur "tags": {"ruang": "kamar", # TAG — metadata untuk FILTER (indeks cepat) "device": "dht22-01"}, "v": 27.5 # FIELD/VALUE — nilainya }
BagianPeranContoh
TimestampKapan kejadian terjadi2026-09-10 08:30:00
MeasurementApa yang diukursuhu, daya, posisi
TagMetadata tetap untuk filterruang=kamar, gedung=A
FieldNilai yang berubah27.5 °C
💡 Kenapa tag penting? Query "suhu di ruang kamar" harus cepat — tag di-indeks, field tidak. Jangan taruh nilai yang sering berubah di tag.

📌 2. Database Time-Series (TSDB)

Database umum (MySQL/PostgreSQL) bisa menyimpan data IoT, tapi TSDB dioptimasi untuk pola IoT: tulis sangat cepat, baca per rentang waktu, kompresi tinggi.

TSDBKarakter
InfluxDBPopuler, query language Flux/InfluxQL, ada versi cloud
TimescaleDBEkstensi PostgreSQL — SQL biasa, hiperscale
QuestDBSangat cepat untuk ingest + SQL
PrometheusStandar monitoring infrastruktur (pull-based)

Di simulator, TimeSeriesDB memberikan API yang mirip konsepnya:

Output:

📌 3. Agregasi: Menyusutkan Data

Data mentah tiap 5 detik = 17.280 titik/hari per sensor. Untuk grafik "suhu rata-rata per jam", kita agregasi: kelompokkan ke bucket waktu, hitung mean/min/max/sum.

Output:

📌 4. Retention Policy & Downsampling

Pola storage bertingkat (piramida data) yang umum di produksi:

resolusi penuh (5 dtk) → disimpan 7 hari menit-an (1 mnt) → disimpan 1 tahun (agregasi mean) jam-an (1 jam) → disimpan 10 tahun (agregasi mean) harian (1 hari) → disimpan selamanya

TimeSeriesDB(max_points=N) mensimulasikan retention: saat melebihi N titik, data terlama dibuang otomatis.

⚠️ Simpan semua data mentah selamanya = biaya storage membengkak. Pertanyaan desain pertama selalu: berapa lama dan sehalus apa data ini perlu diingat?

🧠 Latihan

  1. Simpan 2 measurement (suhu dan co2) dengan tag berbeda, lalu query masing-masing — pastikan tidak tercampur.
  2. Hitung agregasi max dan min per 30 detik untuk suhu. Apa bedanya dengan mean? Kapan max lebih bermakna? (Petunjuk: alarm.)
  3. Buat TimeSeriesDB(max_points=10), tulis 15 titik, lalu cetak len(db.points) dan timestamp titik tertua. Berapa titik yang "terbuang"?
  4. Sebuah sistem menyimpan 100 sensor × 1 titik/menit × 4 field. Estimasi jumlah titik per bulan. Berapa jika di-downsample ke 1 titik/jam setelah 7 hari?