Lewati ke konten

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.

{
"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], ...].
  • dt adalah milidetik integer dari t0 (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 q atau h yang valid, payload bukan metrik.

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.

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 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.

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:

  • q bertambah 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 q yang sama dengan aslinya.
  • Node di belakang gateway boleh punya penghitung q sendiri-sendiri; q yang sama dari sumber berbeda bukan duplikat.
  • Bila Redis tidak tersedia, pesan tetap diproses (lebih baik duplikat daripada kehilangan data).

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.

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.
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
  • 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.