SenFlat v2
SenFlat v2 dirancang untuk gateway: satu pesan membawa banyak sumber (id) dan banyak titik waktu, termasuk data riwayat yang dikirim setelah koneksi pulih. Setiap titik membawa waktu pembuatannya di perangkat sumber, bukan waktu kirim gateway. Gateway hanya mengumpulkan dan meneruskan, dan tidak boleh mengubah waktu titik.
Hasil penguraian sama dengan SenML dan SenFlat v1, sehingga rule, dashboard, alarm, dan penyimpanan tidak berubah. SenFlat v1 tetap berlaku.
Bentuk
Section titled “Bentuk”{ "f": "flat", "v": 2, "q": 1791755578291, "h": 0, "tx": 1790003600000, "s": [ { "id": "001a2b3c4d5e", "t0": 1789999000000, "ts": 1, "m": { "temp_inlet": [[0, 22.4], [10000, 22.5], [20000, 22.6]], "voltage": [[3000, 230.1], [13000, 230.0]], "door_front_open": [[18000, true]], "state": "online" } }, { "id": "001a2b3c4d5f", "t0": 1789999400000, "m": { "temp_inlet": [[0, 23.1], [10000, 23.2]] } } ]}| Field | Wajib | Arti |
|---|---|---|
f |
ya | Persis "flat". |
v |
ya | 2. |
q |
ya | Nomor urut pesan per publisher (gateway), untuk membuang kiriman ulang. |
h |
ya | 1 = riwayat (dikirim ulang setelah koneksi pulih), 0 = pembacaan terkini. |
tx |
tidak | Waktu kirim oleh gateway (epoch milidetik UTC). Hanya dicatat. |
s |
ya | Daftar sumber, minimal satu. |
s[].id |
ya | Identitas sumber. Metrik tersimpan sebagai <id>:<nama>. |
s[].t0 |
ya | Waktu dasar sumber ini, epoch milidetik UTC, dari jam perangkat sumber. |
s[].ts |
tidak | 1 = jam perangkat tersinkron (NTP); 0 = tidak. Bila tidak ada, dianggap 1. |
s[].m |
ya | Metrik. Nilai skalar = satu titik pada t0; atau array titik [[dt, nilai], ...]. |
dtadalah milidetik integer darit0(boleh negatif). Waktu titik =t0 + dt.- Titik antar-metrik tidak perlu sejajar. Pembacaan yang gagal tidak ditulis (tanpa
null). - Urutan titik dalam satu deret bebas.
- Nilai: angka terhingga, boolean, atau string (dipotong 500 karakter).
- v2 hanya satu objek, bukan array objek. Tanpa
qatauhyang valid, payload bukan metrik.
Batas ukuran
Section titled “Batas ukuran”Payload maksimal 512 KiB per pesan (dihitung per byte), dan pagar pengaman 50.000 titik. Payload yang lebih besar ditolak di semua jalur; tidak pernah dipotong lalu diuraikan. Gateway harus memecah riwayat besar menjadi beberapa pesan dengan q masing-masing.
Waktu tepercaya
Section titled “Waktu tepercaya”Sebuah sumber dianggap waktu tidak tepercaya bila ts bernilai 0, atau ada titik yang t0 + dt-nya di luar rentang −1 tahun sampai +1 hari dari waktu terima server.
Semua titik sumber itu tetap disimpan, dengan waktu perkiraan dari waktu terima dan ditandai tidak tepercaya. Titik terakhir sumber dijangkarkan ke waktu terima dan jarak antar titik dipertahankan:
waktu = waktu_terima − (dt_maks − dt)Tanda ini tampil di Messages sebagai badge Waktu perkiraan dan di kolom time_trusted pada unduhan CSV. Sumber lain di pesan yang sama tidak terpengaruh.
Last Seen dan nilai terakhir
Section titled “Last Seen dan nilai terakhir”- Last Seen dan status online device pengirim (gateway) memakai waktu terima server.
- Nilai terakhir per metrik memakai waktu data tertinggi: riwayat yang tiba belakangan tidak menimpa nilai yang lebih baru.
- Untuk sumber anak pada pesan riwayat (
h=1), terakhir terlihat memakai waktu data terbaru, bukan waktu terima, supaya riwayat lama tidak membuat sensor yang sudah lama diam tampak baru aktif.
Pembuangan duplikat (q)
Section titled “Pembuangan duplikat (q)”Mesin rule mengingat q per (rule, publisher, himpunan id sumber) selama 72 jam (dapat diubah administrator). Pesan dengan q dan himpunan sumber yang sama dari publisher yang sama dilewati sebelum rule berjalan, jadi semua output (penyimpanan, alarm, webhook, e-mail) tidak mengerjakannya dua kali.
Syarat untuk pengirim:
qbertambah untuk setiap pesan baru dari pengirim yang sama, dan tidak boleh kembali ke nilai lama, termasuk setelah restart. Simpan penghitung di penyimpanan persisten, atau mulai dari waktu (milidetik).- Pesan yang dikirim ulang harus memakai
qyang sama dengan aslinya. - Node di belakang gateway boleh punya penghitung
qsendiri-sendiri;qyang sama dari sumber berbeda bukan duplikat. - Bila Redis tidak tersedia, pesan tetap diproses (lebih baik duplikat daripada kehilangan data).
tx dan jam gateway
Section titled “tx dan jam gateway”tx dicatat dan tidak dipakai mengoreksi waktu data. Bila tx menyimpang lebih dari 5 detik dari waktu server, server mencatat peringatan di log. Payload apa adanya terlihat di tab Pesan terakhir.
Sinkronisasi waktu
Section titled “Sinkronisasi waktu”Agar ts: 1 bermakna, jam perangkat harus akurat:
- Gateway sebaiknya punya server NTP sendiri.
- Setiap perangkat sumber menyinkronkan jam ke gateway, atau ke server NTP Celestian.
- Bila tidak tersedia, gunakan pool NTP publik (misalnya
0.id.pool.ntp.org). - Selama jam belum tersinkron, perangkat mengirim
ts: 0.
Topologi: lewat gateway atau langsung
Section titled “Topologi: lewat gateway atau langsung”| Lewat gateway | Langsung | |
|---|---|---|
| Publisher terautentikasi | Gateway | Perangkat itu sendiri |
s[].id |
MAC atau serial node | MAC atau serial perangkat itu sendiri |
Penghitung q |
Per node, atau per komponen agregasi di gateway | Per perangkat (persisten) |
| Riwayat saat Celestian tak terjangkau | Antrean di gateway | Tidak ada, kecuali perangkat punya buffer sendiri |
Memakai di rule
Section titled “Memakai di rule”- Pemecah SenFlat v2 → baris (node rule) memecah pesan menjadi baris lebar tanpa Lua.
- Alarm dan Alarm perangkat punya jendela riwayat dan opsi retroaktif (Alarms).
- Contoh lengkap menyimpan ke PostgreSQL: Rule ke PostgreSQL.