← Portal SIPASI R&D · Analisis Data
# Analisis Arsitektur Data Telemetri & Rantai Agregasi Debit — SIPASI (Oransbari Clone)
Tanggal: 27 Agustus 2026 ·
Disusun: Mantra + penelusuran kode aktual
---
1. Analisis Struktur `dd_device_in_minute` untuk Multi-Tipe Device
Kondisi Saat Ini
sql
data_id varchar(20) -- {device_id}.{HH}.{slot-5mnt} — kunci dedup
group_id varchar(20)
id_key varchar(60) -- kredensial device
last_update datetime
time_record int(13) -- unix timestamp device
data_1..14 varchar(100) -- nilai sensor generik posisional
flag1 varchar(20)
Masalah Struktural
- Tidak ada kolom tipe perangkat — filter per AWLR/AWS/ARR/Actuator hanya bisa dilakukan via JOIN ke `dts_device_node.device_type`.
- Field posisional generik (`data_1..14`) — makna `data_2` bergantung pada model firmware; firmware berbeda = tata letak berbeda → raw data sulit diinterpretasi lintas-perangkat.
- Semua value string — memaksa CAST saat agregasi matematis.
- `time_record int(13)` default `current_timestamp()` aneh untuk unix epoch.
- Tak ada index pada `id_key`/`last_update` → query rolling average full-scan.
Usulan Penataan Ulang (Non-Destructive)
sql
ALTER TABLE dd_device_in_minute
ADD COLUMN device_type VARCHAR(16) NOT NULL DEFAULT 'AWLR' AFTER id_key,
-- denormalisasi dari dts_device_node.device_type: AWLR|AWS|ARR|ACTUATOR|OTHER
ADD COLUMN data_map JSON NULL AFTER flag1,
-- pemetaan nama→nilai: {"water_level":40.91,"battery":11.38}
ADD INDEX idx_key_time (id_key, last_update),
ADD INDEX idx_type_time (device_type, last_update);
Aturan pengisian `data_map`:
- Endpoint POST JSON sudah menerima field bernama → simpan aslinya sebagai `data_map`, sambil tetap isi `data_1..n` untuk kompatibilitas pembaca lama.
- GET pipe-format: `data_map` diisi sesuai konfigurasi per-device (`dts_device_node.sensor_config` JSON nanti) — mapping slot → nama sensor.
Dampak: filter jadi `WHERE device_type='AWS'` tanpa join; analisis multi-model device tidak lagi menebak arti `data_3`.
---
2. Alur Agregasi: minute → real_ruas → harian → panca (hasil penelusuran kode)
dd_device_in_minute (RAW menitan, generic sensor)
│ Mdl_data_debit::debit_saluran_avg(id_ruas, durasi_avg)
│ ── SELECT ... WHERE id_key=.. AND last_update >= MAX-N MINUTE
│ ── filterCloseValues(): buang outlier >10% deviasi
│ ── rata-rata rolling → konversi via fak_a/fak_b (rumus Weir/Parshall utk kode_bgn_ukur)
▼
dd_debit_real_ruas (STATUS REALTIME PER RUAS — baris unik per id_ruas, REPLACE)
│ id(varchar) = {idkey_atau_admin}x{ruas}
│ debit_sensor / tma_sensor / debit_kebutuhan / faktor_k / debit_perintah
│ bukaan_pintu (actuator!) / debit_manual / tma_manual ← override operator
│ Penulis:
│ • Mdl_data_debit::update_debit_ruas() → replace otomatis dari sensor
│ • Awlms.php (jalur instant) → replace langsung tma+debit
│ • Operator manual via CMS → override manual fields
│ Pemicu posting berikutnya: Iopost::recDebitRuas()
│ dipanggil VIA URL (/cms/iopost/recDebitRuas) — TIDAK ADA cron!
▼
dd_debit_ruas_harian (SNAPSHOT PER SLOT WAKTU SATU HARI, rows bertambah)
│ id_data = identitas slot pencatatan
│ id_polatanam, dari/menuju, debit_kebutuhan, faktor_k, losses
│ debit_perintah, debit_real, tma, status, running, tujuan(bangunan/petak)
│ Penulis: Mdl_skema_jaringan::posting_kebutuhan_air() (baris ~1710 insert/update by id_data)
│ Pembaca: Apk.php (dashboard mobile), Blangko_o (laporan), Iopost panca
▼
dd_debit_ruas_panca (AGREGAT PANCA-WARNA: rata-rata periode 5-harian)
tanggal = awal periode panca (1,6,11,16,21,26)
idx = (bulan-1)*6 + floor(tgl/5)+1
AVG(debit_kebutuhan/perintah/faktor_k/debit_real)
dari dd_debit_ruas_harian BETWEEN date_start AND date_end — per id_ruas
Penulis: Iopost::recDebitRuasPanca() — juga via URL, TANPA cron otomatis
Peran Tiap Level
| Tabel | Karakter | Granularitas | Cara update | Konsumen |
|---|---|---|---|---|
| `dd_device_in_minute` | Raw telemetri | ≤1–5 menit | UPSERT by `data_id` | debit calc, SCADA, hujan, publik |
| `dd_debit_real_ruas` | Operasional realtime | terakhir per ruas (REPLACE) | auto-sensor/operator | Skema `pembagian()`, halaman publik |
| `dd_debit_ruas_harian` | Snapshot pencatatan | per posting event dalam hari | INSERT/UPDATE by `id_data` | APK dashboard, laporan Blangko |
| `dd_debit_ruas_panca` | Rekap panca-warna | rata-rata 5 hari | UPSERT by `tanggal+id_ruas` | Evaluasi rotasi/giliran air |
Temuan Penting (risiko)
- ⚠️ Tidak ada cron untuk `recDebitRuas` dan `recDebitRuasPanca` — keduanya hanya jalan bila URLnya diakses (dulu oleh server sapon via cron eksternal). Di environment riset ini rantai berhenti di realtime! → perlu cron sistem atau trigger dari Alur Simpan.
- ⚠️ `recDebitRuasPanca` membaca `dts_ruas_saluran.id_di` yang datanya kosong setelah refactor single-DI → fallback env sudah ada ✓.
- ⚠️ Query-kueri concat string (SQLi legacy) di rantai ini masuk backlog P0/P1 lama.
---
3. Rekomendasi Implementasi Lanjutan
- Terapkan ALTER TABLE §1 (+ backfill device_type dari dts_device_node).
- Buat cron lingkaran rantai: `recDebitRuas` tiap 5 menit, `recDebitRuasPanca` harian 23:55 — supaya pipeline hidup mandiri.
- `sensor_config` JSON per-device → generator `data_map` konsisten lintas firmware.