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:
psql "$URL" -f timescaledb-eksternal.sqlDua 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.
Pengaturan di editor Rules
Section titled “Pengaturan di editor Rules”- Channel Subscriber: channel berisi device. Subtopik
+/telemetryuntuk rule telemetri;+/eventdan+/statusuntuk tabel event. - Logic: Comparison yang meneruskan pesan SenFlat, misalnya
message.payload.fsama denganflat. Tanpa filter ini, pesanconfigdancmdikut diproses dan gagal di template. - Output PostgreSQL: host, port, user, password, database,
sslmodesesuai server (requirebawaan), Schemaiot, dan Table sesuai di bawah.- Pakai user khusus yang hanya punya
INSERT(contohCREATE ROLEdanGRANTada di akhir berkas SQL). - Server di jaringan privat ditolak oleh pembatas jaringan kecuali administrator mengaktifkan
RULES_ALLOW_PRIVATE_TARGETS.
- Pakai user khusus yang hanya punya
Hasil template yang kosong menjadi NULL, jadi metrik yang tidak dikirim otomatis NULL; angka dan boolean dikonversi PostgreSQL ke tipe kolom.
Tabel iot.device_telemetry
Section titled “Tabel iot.device_telemetry”| 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}} |
Tabel iot.device_events
Section titled “Tabel iot.device_events”| 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';Catatan
Section titled “Catatan”timeadalah waktu terima di broker. Waktu ukur perangkat (t) disimpan didevice_tsdan tersedia sebagaidevice_timedi 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.