Lewati ke konten

SQL TimescaleDB eksternal

Bila Anda ingin menyimpan telemetri di TimescaleDB milik sendiri (selain atau sebagai ganti Internal DB), pakai output PostgreSQL pada rule. Halaman ini memberi skema dan pemetaan template untuk pesan SenFlat v1 tunggal.

Unduh timescaledb-eksternal.sql (hypertable, kompresi, dan view; aman dijalankan ulang). Jalankan sebagai pemilik database:

Terminal window
psql "$URL" -f timescaledb-eksternal.sql

Dua tabel, satu rule per tabel, karena output PostgreSQL menulis satu baris per pesan pada mode biasa. Untuk banyak baris per pesan lihat Rule ke PostgreSQL: banyak baris.

  1. Channel Subscriber: channel berisi device. Subtopik +/telemetry untuk rule telemetri; +/event dan +/status untuk tabel event.
  2. Logic: Comparison yang meneruskan pesan SenFlat, misalnya message.payload.f sama dengan flat. Tanpa filter ini, pesan config dan cmd ikut diproses dan gagal di template.
  3. Output PostgreSQL: host, port, user, password, database, sslmode sesuai server (require bawaan), Schema iot, dan Table sesuai di bawah.
    • Pakai user khusus yang hanya punya INSERT (contoh CREATE ROLE dan GRANT ada di akhir berkas SQL).
    • Server di jaringan privat ditolak oleh pembatas jaringan kecuali administrator mengaktifkan RULES_ALLOW_PRIVATE_TARGETS.

Hasil template yang kosong menjadi NULL, jadi metrik yang tidak dikirim otomatis NULL; angka dan boolean dikonversi PostgreSQL ke tipe kolom.

Kolom Template
time {{.Message.created}}
device_ts {{with .Message.payload.t}}{{printf "%.3f" .}}{{end}}
device_id {{with .Message.payload.id}}{{.}}{{else}}{{.Message.publisher}}{{end}}
channel_id {{.Message.channel}}
publisher {{.Message.publisher}}
subtopic {{.Message.subtopic}}
temp_inlet, temp_outlet, temp_ambient, humidity {{.Message.payload.m.temp_inlet}} (nama metrik yang sama)
voltage, current, power_draw, energy, frequency, power_factor {{.Message.payload.m.voltage}}
uptime, heap_free, door_front_open, door_rear_open {{.Message.payload.m.uptime}}
metrics {{json .Message.payload.m}}
Kolom Template
time, device_ts, device_id, channel_id, publisher, subtopic Sama dengan di atas
state {{.Message.payload.m.state}}
fw {{.Message.payload.m.fw}}
ip {{.Message.payload.m.ip}}
metrics {{json .Message.payload.m}}

Isi lengkap event (misalnya {"door_front_open":true}) ada di kolom metrics:

SELECT * FROM iot.device_events_v WHERE kind = 'event' AND metrics ? 'door_front_open';
  • time adalah waktu terima di broker. Waktu ukur perangkat (t) disimpan di device_ts dan tersedia sebagai device_time di view *_v.
  • Metrik baru dari firmware tidak perlu mengubah rule: ia masuk ke metrics (jsonb). Untuk kolom sendiri: ALTER TABLE iot.device_telemetry ADD COLUMN nama double precision; lalu tambahkan satu baris kolom pada output.
  • Satu output maksimal 30 kolom.
  • Batas laju output: 100 baris burst dan 50 baris per detik per output. Untuk banyak device berinterval pendek, pantau galat di tab Executions.
  • Output ini membaca pesan berbentuk objek SenFlat tunggal. Array gabungan atau SenML butuh rule dan template berbeda.