← Portal SIPASI R&D · Dokumentasi Teknis
# Dokumentasi Teknis: Sistem Koneksi Telemetri SIPASI (via /cms/41)
Tanggal: 27 Agustus 2026 ·
Oleh: Mantra (analisis kode aktual)
---
1. Peta Modul
| Komponen | Lokasi | Peran |
|---|---|---|
| Menu 41 "Setting AWLMS" | `cms_navigation.id=41` → `view_mode=listing` | CRUD pendaftaran device |
| Tabel properti listing | `cms_table_property id=11` | Render `dts_device_node` + filter `device_type IN ('AWLMS','AWLR-LIMPAS','AWLR')` |
| API controller | `Controllers/Api.php` (325 baris) | Endpoint ingest telemetri |
| Tabel target ingest | `dd_device_in_minute` | Data mentah per menit/5-menit, upsert by `data_id` |
| Konsumsi data | `Models/Sipasi/Mdl_data_debit.php` | Baca minute → hitung debit ruas → `dd_debit_real_ruas`, dll |
2. Tabel `dts_device_node` — Field Kunci
| Field | Fungsi |
|---|---|
| `id_key` |
Kredensial device (unik, dipakai di URL API). Contoh format: `CPIxSAPONxBSP0xINTAKE` |
| `name`, `address` | Identitas & lokasi stasiun |
| `id_ruas` | Relasi ke topologi skema (`b0xb1`) → menghubungkan data sensor ke bangunan jaringan |
| `head_sensor` | Range/kapasitas sensor |
| `kode_bgn_ukur`,`lebar_bgn_ukur`,`fak_a`,`fak_b` | Parameter hidrolika untuk konversi level→debit |
| `dtime` | Interval kirim device (detik) |
| `device_type` | AWLR / AWLR-LIMPAS / AWLMS |
| `status` | Hanya `Active` yang boleh ingest |
| `last_update`,`last_data` | Heartbeat + payload terakhir |
3. Rantai Aliran Data (ASCII)
Device ESP8266/ESP32/GSM
│ GET /api/key/{id_key}?parsing={unix}|{s1}|{s2}|...&boot=&fv=
▼
Controllers/Api.php::getpos()
│ cek isValidKey() regex [a-zA-Z0-9_-]{3,64}
│ cek dts_device_node: id_key cocok AND status='Active'
▼
ingestGetParsing(device,idKey,parsing)
├─ explode('|') → data_1..data_n (ix>=1)
├─ time_record: unix ts valid ±100rb detik → date()
├─ data_id = {device_id}.{HH}.{mm dibulatkan kelipatan 5}
├─ insert_minutes(): UPSERT dd_device_in_minute by data_id
├─ UPDATE dts_device_node SET last_update, last_data ← heartbeat
└─ log raw → writable/logs/device_{key}.log
▼
Mdl_data_debit.php::debit_saluran_avg(id_ruas, durasi_avg)
SELECT ... FROM dd_device_in_minute WHERE id_key=... last_update >= MAX - INTERVAL N MINUTE
→ rata-rata rolling → konversi fak_a/fak_b → dd_debit_real_ruas
4. Endpoint API (semua JSON)
| Endpoint | Method | Fungsi |
|---|---|---|
| `/api/dvc/{id_key}` | GET | Metadata device terdaftar |
| `/api/key/{id_key}?parsing={ts}\|{v1}\|{v2}..` | GET | Ingest format pipe (legacy MCU) |
| `/api/key/{id_key}` + body JSON/form (`time_record`, field bebas) | POST | Ingest modern; tiap field jadi `data_1..n` berurutan |
| `/api/key/{id_key}/espcam?listen=ready` / POST upload | GET/POST | Poll & upload foto ESP32-CAM |
| `/api/rain/{id_key}` (total_rain_day) | GET | Akumulasi hujan harian |
Respons GET-parsing juga membawa `OTA_update` flag & `dateNow` (fitur update firmware over-the-air).
5. Mekanisme `data_id` (deduplikasi)
`{id_device}.{jam HH}.{menit-dibulatkan-ke-bawah-kelipatan-5}` → contoh `1.14.25`.
Efek: device dengan `dtime=300` (5 menit) otomatis menghasilkan satu baris per slot 5 menit; retry/duplicate dikirim device akan
meng-update baris yang sama, bukan duplikat.
6. Temuan Catatan (untuk riset)
- `isValidKey()` hanya cek format — kekuatan otentikasi ada pada keunikan+kerahasiaan key di URL (GET). Untuk produksi pertimbangkan HMAC/token header.
- `api_post()` memetakan SEMUA field post → `data_1..n` berurutan; urutan field harus stabil antar device.
- Log raw ditulis per-device file (`writable/logs/device_*.log`) — bisa tumbuh besar; rotasi belum ada.
- Rute ini publik tanpa rate-limit — perlu throttle bila device banyak.
- `Mdl_data_debit` masih concat query mentah pada beberapa titik (bagian dari P0/P1 audit lama).
7. Integrasi dgn Skema (kaitan /cms/37)
Saat membuat skema sekarang, node bangunan dapat dihubungkan ke device via `id_ruas`:
- `dd_debit_real_ruas` dihitung dari device milik ruas tsb.
- Di `pembagian()` nilai debit real dipakai sebagai batas alokasi riil.
---
8. PEMBARUAN 27 AGUSTUS 2026
a) Koreksi Arsitektur Data (hasil penelusuran agy — DOC_TELEMETRI_FLOW.md)
Hipotesis awal "dd_device_in_minute → dd_awlr_log" TIDAK AKURAT. Fakta: dua jalur ingest PARALEL & INDEPENDEN:
- Jalur Api.php (`/api/key/{key}`): raw ke `dd_device_in_minute` → Mdl_data_debit (rolling avg, filter outlier) → `dd_debit_real_ruas` → agregat harian `dd_debit_sumber_harian`.
- Jalur Awlms.php (instant AWLMS/AWLR): log instan `dd_awlr_log` (log_id per jam:menit) + langsung hitung debit via DEBIT_FORMULA() → `dd_debit_real_ruas` & `dd_debit_sumber_48`.
Tidak ada kode yang memindahkan dd_device_in_minute → dd_awlr_log. Konversi head_sensor→tma→debit berlangsung inline di Awlms.php dengan fak_a/fak_b/lebar_bgn_ukur.
b) ESP32-CAM Dihapus dari Spesifikasi API
Endpoint polling/upload kamera tidak pernah diimplementasi — semua referensi dihapus dari README API.
c) HMAC Header Authentication (aktif, teruji)
- Kolom baru: `dts_device_node.api_secret` (NULL = legacy key-only)
- Header wajib saat secret terisi: `X-SIPASI-TS` (toleransi ±300 dtk), `X-SIPASI-SIGN = hmac_sha256("{id_key}|{ts}|{md5(body)}", secret)`
- Anti-replay ±5 menit; hash_equals anti timing-attack
- Uji live: tanpa sign=401, sign valid=200, replay 10m=401, sig salah=401