Rule ke PostgreSQL: banyak baris
Output PostgreSQL biasanya memasukkan satu baris per pesan. Pesan SenFlat v2 dari gateway bisa memuat banyak sumber (s[]), dan pesan riwayat (h=1) memuat deret titik waktu. Untuk memasukkan semuanya, aktifkan sakelar Satu baris per elemen hasil pada node PostgreSQL, dan ratakan pesannya menjadi daftar baris.
Panduan ini memakai bentuk lebar: satu baris per (sumber, waktu), kolom = metrik. Pesan riwayat ikut: titik dengan waktu yang sama digabung dalam satu baris.
Cara paling sederhana: node Pemecah SenFlat v2
Section titled “Cara paling sederhana: node Pemecah SenFlat v2”Logic bawaan Pemecah SenFlat v2 → baris meratakan pesan tanpa kode. Semua metrik yang ada pada satu waktu menjadi kunci baris. Pesan yang bukan SenFlat v2 tidak diteruskan.
Kolom dasar tiap baris: device_id, t_ms (epoch milidetik), time (RFC 3339 UTC), time_trusted, history (pesan riwayat), dan q.
Contoh satu rule untuk beberapa kebutuhan sekaligus:
Channel Subscriber → Pemecah SenFlat v2 ├─ Bypass ───────────────────────────────────────→ PostgreSQL (semua baris, termasuk riwayat; atomik) ├─ Comparison (temp_inlet > 30, Hanya data langsung) → Telegram (pemicu notifikasi) ├─ Comparison (temp_inlet > 30, Langsung + riwayat segar) → Telegram (riwayat 5 menit terakhir ikut) ├─ Bypass → Alarm perangkat (mengikuti jendela riwayatnya sendiri) └─ Comparison (temp_inlet > 30, Semua data) → Webhook (semua data yang memenuhi syarat)Perilaku node di bawah pemecah:
- Comparison menilai tiap baris dan hanya meneruskan yang memenuhi syarat. Path memakai kunci baris:
message.payload.temp_inlet. - PostgreSQL menerima daftar utuh dalam satu
INSERTatomik. - Alarm, Alarm perangkat, E-Mail, Telegram, Webhook, Channel Publisher berjalan sekali per baris, berurutan menurut waktu, dengan baris itu sebagai
.Result. Maksimal 500 baris per pesan per output; lebih dari itu node ditandai galat, jadi saring dengan Comparison dulu. - Internal DB tidak menerima daftar baris. Untuk tetap menyimpan ke Internal DB, buat cabang terpisah: Channel Subscriber → Bypass → Internal DB.
Tabel contoh
Section titled “Tabel contoh”CREATE TABLE telemetri ( device_id text NOT NULL, waktu timestamptz NOT NULL, waktu_tepercaya boolean NOT NULL, riwayat boolean NOT NULL, q bigint, temp_inlet double precision, temp_outlet double precision, voltage double precision, current double precision, power_draw double precision, energy double precision, door_front_open boolean);CREATE INDEX ON telemetri (device_id, waktu);Pemetaan kolom
Section titled “Pemetaan kolom”| Kolom | Template nilai |
|---|---|
device_id |
{{.Row.device_id}} |
waktu |
{{.Row.time}} |
waktu_tepercaya |
{{.Row.time_trusted}} |
riwayat |
{{.Row.history}} |
q |
{{printf "%.0f" .Row.q}} |
Metrik, mis. temp_inlet |
{{.Row.temp_inlet}} |
Catatan template:
- Nilai dikirim sebagai parameter teks dan dikonversi PostgreSQL ke tipe kolom. Metrik yang tidak ada pada baris itu menjadi NULL.
- Angka besar seperti
qdicetak dengan notasi eksponen bila tanpa format: pakai{{printf "%.0f" .Row.q}}. - Jangan pakai
printf "%.1f"pada metrik yang bisa hilang: nilai kosong dicetak%!f(<nil>). - Fungsi
tsmsmengubah waktu epoch milidetik menjadi teks RFC 3339 UTC:{{tsms .Row.t_ms}}.
Alternatif dengan Lua
Section titled “Alternatif dengan Lua”Bila perlu mengubah nilai, membatasi metrik, atau membentuk kolom sendiri, pakai logic Lua yang mengembalikan array objek, lalu aktifkan Satu baris per elemen hasil. Skrip siap pakai meratakan SenFlat v2 (termasuk riwayat, dengan penandaan waktu tepercaya):
Aturan hasil logic pada mode ini:
| Hasil logic | Perilaku |
|---|---|
| Array objek | Satu baris per elemen. |
| Satu objek | Satu baris. |
nil, {}, atau array kosong |
Tidak menulis apa pun (bukan galat). |
| Nilai lain (angka, teks) | Galat “hasil logic harus array objek”. |
| Lebih dari 500 elemen | Galat, tidak dipotong diam-diam. |
Ingat: skrip rule wajib berbentuk function logicFunction() … end diikuti return logicFunction().
Langkah di editor
Section titled “Langkah di editor”- Buat rule: Channel Subscriber (channel gateway) → Pemecah SenFlat v2 (atau Lua) → PostgreSQL.
- Di node PostgreSQL isi koneksi, tabel, dan kolom seperti di atas, lalu aktifkan Satu baris per elemen hasil.
- Gunakan Test Rule dengan payload contoh. Pratinjau menampilkan
rowCountdan 20 baris pertama tanpa menulis apa pun. Uji koneksi memeriksa tabel, kolom, dan hakINSERT. - Aktifkan rule.
- 500 baris per pesan dan 30 kolom per output.
- Logic Lua dibatasi 100.000 simpul dan hasil maksimal 1 MiB; waktu eksekusi 500 ms.
- Server pelanggan di jaringan privat butuh
RULES_ALLOW_PRIVATE_TARGETS=true, danSECRETS_KEYterisi untuk menyimpan password. - Celestian membuang duplikat
qselama 72 jam sebelum rule berjalan.