Lewati ke konten

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 INSERT atomik.
  • 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.
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);
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 q dicetak 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 tsms mengubah waktu epoch milidetik menjadi teks RFC 3339 UTC: {{tsms .Row.t_ms}}.

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):

Unduh senflat2-lebar.lua

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

  1. Buat rule: Channel Subscriber (channel gateway) → Pemecah SenFlat v2 (atau Lua) → PostgreSQL.
  2. Di node PostgreSQL isi koneksi, tabel, dan kolom seperti di atas, lalu aktifkan Satu baris per elemen hasil.
  3. Gunakan Test Rule dengan payload contoh. Pratinjau menampilkan rowCount dan 20 baris pertama tanpa menulis apa pun. Uji koneksi memeriksa tabel, kolom, dan hak INSERT.
  4. Aktifkan rule.