Tools

Panduan Lengkap Node-RED untuk IoT: Visual Programming Otomasi

πŸ‘‘ Premium

Pelajari Node-RED dari nol hingga mahir β€” mulai dari visual programming, integrasi MQTT, pembuatan dashboard, hingga proyek otomasi rumah pintar

1. Apa itu Node-RED?

Node-RED adalah alat visual programming open-source yang dibangun di atas Node.js. Dirilis oleh IBM Research pada tahun 2014, Node-RED dirancang khusus untuk menyambungkan perangkat keras, layanan web, dan API dalam alur kerja berbasis antarmuka drag-and-drop. Node-RED menjadi salah satu alat paling populer dalam ekosistem IoT karena kemudahannya dalam mengotomasi alur data antar perangkat.

Konsep dasar Node-RED sangat sederhana: Anda menggambar alur kerja dengan menghubungkan node (blok fungsional) di canvas visual menggunakan kabel. Setiap node mewakili satu fungsi β€” mulai dari membaca sensor, memproses data, mengirim pesan MQTT, hingga menampilkan data di dashboard. Tidak perlu menulis kode dalam bahasa pemrograman tradisional untuk membuat automasi IoT yang kompleks.

Diagram: Konsep Visual Programming Node-RED
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    ALUR KERJA NODE-RED                      β”‚
β”‚                                                             β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
β”‚   β”‚ INJECT  │────▢│ FUNCTION │────▢│  MQTT   β”‚            β”‚
β”‚   β”‚ (Timer) β”‚     β”‚ (Proses) β”‚     β”‚(Publish)β”‚            β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
β”‚                                                             β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
β”‚   β”‚  MQTT   │────▢│  CHANGE  │────▢│   UI   β”‚            β”‚
β”‚   β”‚(Subscribe)β”‚   β”‚(Ubah Data)β”‚    β”‚(Dashboard)β”‚           β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚
β”‚                                                             β”‚
β”‚   Flow = Serangkaian node yang terhubung                   β”‚
β”‚   Node = Blok fungsi individual                            β”‚
β”‚   Wire = Koneksi antar node (transfer data)                β”‚
β”‚   Message (msg) = Objek yang mengalir melalui kabel        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Use Cases Node-RED dalam IoT

Use Case Deskripsi Contoh Penerapan
Otomasi RumahKontrol lampu, AC, pintu otomatis berdasarkan sensorLampu menyala otomatis saat gelap
Monitoring & LoggingMengumpulkan data sensor dan menyimpan ke databaseLog suhu dan kelembaban ke InfluxDB
Gateway IoTBridge antara protocol berbeda (MQTT, HTTP, CoAP)Konversi data Modbus ke MQTT
Dashboard Real-timeVisualisasi data sensor secara real-time di browserDashboard suhu ruangan
Alert & NotifikasiKirim notifikasi jika kondisi tertentu terpenuhiAlert jika suhu melebihi 40Β°C
Integrasi LayananHubungkan IoT dengan layanan cloudKirim data ke Google Sheets
πŸ’‘ Mengapa Node-RED?

Node-RED memungkinkan engineer dan maker untuk membuat alur kerja kompleks dalam hitungan menit, bukan jam. Komunitasnya menyediakan ribuan node siap pakai di npm, sehingga hampir semua kebutuhan integrasi sudah tersedia. Sangat cocok untuk prototyping cepat dan juga deployment produksi pada perangkat seperti Raspberry Pi.

2. Instalasi Node-RED

Node-RED dapat dijalankan di berbagai platform: Windows, macOS, Linux, dan juga langsung di board Raspberry Pi. Yang Anda butuhkan adalah Node.js versi 18 atau lebih baru yang sudah terinstal di sistem Anda.

Metode 1: Instalasi via npm (Semua Platform)

Ini adalah cara paling universal untuk menginstal Node-RED. Berlaku untuk Windows, macOS, dan Linux.

Langkah 1: Instal Node.js

bash β€” Cek versi Node.js
# Pastikan Node.js sudah terinstal
node --version
# Output harus v18 atau lebih tinggi
# Contoh: v20.11.1

Langkah 2: Instal Node-RED secara global

bash β€” Instalasi Node-RED
# Instal Node-RED secara global
sudo npm install -g --unsafe-perm node-red

# Jalankan Node-RED
node-red

# Buka browser ke:
# http://localhost:1880

Setelah menjalankan perintah node-red, Anda akan melihat log di terminal yang menunjukkan Node-RED berhasil berjalan. Buka browser dan akses http://localhost:1880 untuk membuka editor Node-RED.

Metode 2: Instalasi via Docker

Gunakan Docker jika ingin mengisolasi instalasi atau menjalankan Node-RED di container yang portabel.

bash β€” Docker Compose
# Jalankan dengan Docker
docker run -it -p 1880:1880 --name mynodered \
  -v nodered_data:/data \
  nodered/nodered

# Atau dengan Docker Compose:
# nodered/docker-compose.yml

services:
  nodered:
    image: nodered/nodered
    ports:
      - "1880:1880"
    volumes:
      - nodered_data:/data

volumes:
  nodered_data:
ℹ️ Port Default Node-RED

Node-RED menggunakan port 1880 secara default. Anda dapat mengubahnya di file settings.js pada baris uiPort: process.env.PORT || 1880. Untuk keamanan di jaringan publik, pastikan untuk menambahkan autentikasi pada Node-RED.

Metode 3: Instalasi di Raspberry Pi

Jika Anda menggunakan Raspberry Pi, ada cara khusus yang sangat mudah. Raspberry Pi OS (Raspbian) sudah memiliki Node-RED terinstal secara default di versi Raspbian yang diunduh dari website resmi. Jika belum terinstal, jalankan perintah berikut:

bash β€” Raspberry Pi Install Script
# Unduh dan jalankan script instalasi resmi
bash <(curl -sL https://raw.githubusercontent.com/\
  node-red/linux-install/master/deb/update-node-red-pi)

# Jalankan Node-RED
node-red-start

# Agar Node-RED otomatis start saat boot:
sudo systemctl enable nodered.service
sudo systemctl start nodered.service
πŸ’‘ Tips Raspberry Pi

Gunakan kartu microSD minimal 16 GB dengan kelas A2 untuk performa terbaik. Jika menggunakan Raspberry Pi 4 atau 5, Node-RED akan berjalan sangat responsif. Untuk versi Pi Zero, gunakan versi Lite OS dan pastikan RAM tidak habis oleh GUI.

3. Interface Node-RED

Saat pertama kali membuka Node-RED di browser, Anda akan disambut oleh editor visual yang intuitif. Interface Node-RED terdiri dari beberapa area utama yang masing-masing memiliki fungsi khusus.

Layout Editor

Diagram: Layout Interface Node-RED
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  🌐 Node-RED Editor                              [Deploy β–Ό] β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚            β”‚                             β”‚                   β”‚
β”‚  PALETTE   β”‚       CANVAS (Workspace)    β”‚   DEBUG / INFO   β”‚
β”‚            β”‚                             β”‚                   β”‚
β”‚ [inject]   β”‚  β”Œβ”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β” β”‚  msg.payload:    β”‚
β”‚ [debug]    β”‚  β”‚ INJ │──│FUNC │──│DEBUGβ”‚ β”‚  "Hello World"   β”‚
β”‚ [function] β”‚  β””β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”˜ β”‚                   β”‚
β”‚ [change]   β”‚                             β”‚  [Tab: debug]    β”‚
β”‚ [mqtt in]  β”‚  Flow 1: Sensor Monitoring  β”‚  [Tab: info]     β”‚
β”‚ [mqtt out] β”‚                             β”‚  [Tab: help]     β”‚
β”‚ [http in]  β”‚                             β”‚  [Tab: config]   β”‚
β”‚ [ui text]  β”‚                             β”‚                   β”‚
β”‚ [ui gauge] β”‚                             β”‚                   β”‚
β”‚ [ui chart] β”‚                             β”‚                   β”‚
β”‚ ...        β”‚                             β”‚                   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  [Flows] [Global Config] [Import] [Export]  β”‚  3 tabs aktif β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Palette (Panel Kiri)

Palette adalah daftar semua node yang tersedia untuk digunakan. Node-node ini dikelompokkan berdasarkan kategori seperti input, output, function, social, dan storage. Anda dapat mencari node tertentu dengan mengklik area pencarian di bagian atas palette. Untuk menambah node baru, buka menu ≑ β†’ Manage Palette.

Canvas / Workspace (Area Tengah)

Canvas adalah area kerja utama tempat Anda menaruh node dan menghubungkannya dengan kabel. Anda bisa melakukan zoom in/out dengan scroll wheel, dan pan (geser) dengan klik kanan + drag. Workspace bisa memiliki倚δΈͺ tab/flow untuk mengorganisasi alur kerja yang berbeda.

Panel Kanan

Panel sebelah kanan memiliki beberapa tab penting:

Manajemen Flow (Tab)

Node-RED mendukung multi-tab flow, memungkinkan Anda mengorganisasi proyek menjadi beberapa halaman terpisah. Klik tab "+" di bagian bawah canvas untuk membuat flow baru. Setiap flow memiliki nama yang bisa diubah dengan klik kanan pada tab.

πŸ’‘ Tips Organisasi Flow

Buat flow terpisah untuk setiap fungsi: flow untuk sensor, flow untuk actuator, flow untuk dashboard, dan flow untuk integrasi API. Gunakan node link in / link out untuk menghubungkan antar flow tanpa kabel langsung.

Menu Utama

Menu Fungsi Keyboard Shortcut
ImportImpor flow dari clipboard atau file JSONCtrl + I
ExportEkspor flow ke clipboard atau fileCtrl + E
DeployTerapkan perubahan ke runtimeCtrl + D
Manage PaletteInstall/hapus node dari paletteβ€”
SettingsPengaturan editor dan runtimeβ€”
Search FlowsCari node di semua flowCtrl + F

4. Node Dasar: Inject, Debug, Function, Change

Sebelum melangkah ke integrasi IoT yang kompleks, penting untuk memahami empat node dasar yang paling sering digunakan dalam Node-RED: inject, debug, function, dan change.

Node Inject

Node inject adalah titik awal alur kerja. Node ini mengirim pesan (message) ke node berikutnya. Anda bisa mengatur kapan pesan dikirim: secara manual (klik tombol di node), secara berkala (interval waktu), atau sekali saat flow di-deploy.

Node-RED Flow β€” Inject Manual
[
  {
    "id": "node-inject-1",
    "type": "inject",
    "name": "Kirim Data",
    "props": [
      { "p": "payload", "v": "Hello Node-RED!", "vt": "str" },
      { "p": "topic", "v": "test/topic", "vt": "str" }
    ],
    "payload": "Hello Node-RED!",
    "payloadType": "str",
    "topic": "test/topic",
    "once": false,
    "repeat": "",
    "wires": [ [ "node-debug-1" ] ]
  }
]

Pengaturan penting pada node inject:

Node Debug

Node debug adalah alat utama untuk melihat data yang mengalir melalui flow. Output debug ditampilkan di panel sebelah kanan. Node ini sangat penting saat troubleshooting atau mengembangkan flow baru.

Node Function

Node function adalah tempat Anda menulis kode JavaScript kustom untuk memproses data. Setiap pesan yang masuk tersedia sebagai variabel msg dan pesan keluar harus dikirim menggunakan return msg atau node.send(msg).

JavaScript β€” Node Function
// Contoh: Konversi Celsius ke Fahrenheit
// Tarik ke dalam node Function

var suhuCelsius = msg.payload.suhu;
var suhuFahrenheit = (suhuCelsius * 9/5) + 32;

// Tambahkan data baru ke message
msg.payload = {
  celsius: suhuCelsius,
  fahrenheit: Math.round(suhuFahrenheit * 100) / 100,
  timestamp: new Date().toISOString()
};

// Kirim ke output pertama
return msg;
⚠️ Peringatan

Pastikan setiap msg yang masuk memiliki data yang valid sebelum diproses. Gunakan pengecekan seperti if (typeof msg.payload === 'object' && msg.payload.suhu !== undefined) untuk menghindari error saat data tidak sesuai format yang diharapkan.

Node Change

Node change adalah cara tanpa kode (codeless) untuk memodifikasi pesan. Node ini bisa mengatur (set), menghapus (delete), atau mengganti (change/replace) bagian dari objek msg menggunakan aturan berbasis tindakan.

Tindakan Fungsi Contoh
SetMengatur nilai baru pada path tertentuSet msg.payload.status = "online"
ChangeMencari dan mengganti stringGanti "celsius" dengan "Β°C"
DeleteMenghapus properti dari msgDelete msg.payload.debug

5. Integrasi MQTT

MQTT (Message Queuing Telemetry Transport) adalah protokol messaging ringan yang menjadi standar de facto komunikasi IoT. Node-RED menyediakan dua node utama untuk MQTT: mqtt in untuk subscribe (menerima data) dan mqtt out untuk publish (mengirim data). Untuk menggunakan MQTT di Node-RED, Anda perlu menginstal node tambahan melalui Manage Palette.

Instalasi Node MQTT

bash β€” Instal node MQTT untuk Node-RED
# Akses direktori instalasi Node-RED
cd ~/.node-red

# Instal node MQTT
npm install node-red-contrib-mqtt-broker

# Atau melalui browser:
# Menu ≑ β†’ Manage Palette β†’ Install
# Cari: node-red-contrib-mqtt-broker
# Klik Install

Konfigurasi MQTT Broker

Sebelum menggunakan node MQTT, Anda perlu menambahkan konfigurasi broker MQTT. Bisa menggunakan broker publik seperti broker.hivemq.com atau broker sendiri seperti Mosquitto.

Node-RED Flow β€” MQTT Konfigurasi
// MQTT Config Node (ditambahkan otomatis saat
// mengkonfigurasi mqtt in / mqtt out)

{
  "id": "mqtt-broker-1",
  "type": "mqtt-broker",
  "name": "Broker Lokal",
  "broker": "localhost",
  "port": "1883",
  "clientid": "nodered-client",
  "autoConnect": true,
  "usetls": false,
  "protocolVersion": "MQTTv5",
  "keepalive": "60",
  "cleansession": true
}

Subscribe: Menerima Data MQTT

Node mqtt in mendengarkan topik tertentu dari broker. Saat ada pesan baru di topik tersebut, pesan akan diteruskan ke node berikutnya.

Node-RED Flow β€” Subscribe MQTT
// Flow: Subscribe MQTT dan tampilkan di debug
//
// mqtt-in ──▢ debug
//
// Konfigurasi mqtt-in:
//   Topic: sensor/ruang-tamu/suhu
//   QoS: 0
//   Output: auto-detect

// Payload yang diterima akan muncul di panel debug
// Contoh: { "suhu": 28.5, "kelembaban": 65 }

Publish: Mengirim Data MQTT

Node mqtt out mengirim pesan ke topik tertentu pada broker. Data dikirim sebagai payload dari message yang masuk.

Node-RED Flow β€” Publish MQTT
// Flow: Timer kirim data ke MQTT setiap 5 detik
//
// inject(5s) ──▢ function ──▢ mqtt-out
//
// Konfigurasi inject:
//   Repeat: interval 5 detik
//
// Konfigurasi function:
//   msg.payload = JSON.stringify({
//     suhu: (20 + Math.random() * 15).toFixed(1),
//     kelembaban: (40 + Math.random() * 40).toFixed(1),
//     timestamp: new Date().toISOString()
//   });
//   msg.topic = "sensor/ruang-tamu/suhu";
//   return msg;
//
// Konfigurasi mqtt-out:
//   Topic: sensor/ruang-tamu/suhu
//   QoS: 0
//   Retain: true

Topik MQTT untuk IoT

Diagram: Struktur Topik MQTT IoT
Struktur Topik MQTT yang Direkomendasikan:
==========================================

  {kelompok}/{device_id}/{jenis_data}

Contoh:
  sensor/ruang-tamu/suhu          β†’ {"suhu": 28.5}
  sensor/ruang-tamu/kelembaban    β†’ {"kelembaban": 65}
  sensor/dapur/asap               β†’ {"asap": 850}
  actuator/lampu/ruang-tamu       β†’ {"status": "on"}
  actuator/kipas/dapur             β†’ {"speed": 3}
  status/device/esp32-001          β†’ {"online": true}
  alert/suhu-tinggi                β†’ {"pesan": "Suhu 40Β°C!"}

Tipe Topik:
  sensor/...    β†’ Perangkat Kirim (Publish)   β†’ Perangkat ke Server
  actuator/...  β†’ Perangkat Terima (Subscribe) β†’ Server ke Perangkat
  status/...    β†’ Monitoring kesehatan perangkat
  alert/...     β†’ Notifikasi kondisi darurat
ℹ️ QoS (Quality of Service) MQTT

QoS 0: Fire and forget β€” pesan dikirim sekali tanpa konfirmasi. Tercepat, tapi bisa hilang. QoS 1: Pesan dikirim dan dikonfirmasi sekali. Bisa duplikat. QoS 2: Pesan dikirim dan dikonfirmasi empat kali. Paling handal, tapi paling lambat. Untuk data sensor real-time, QoS 0 atau 1 sudah cukup.

6. Membuat Dashboard

Node-RED menyediakan package node-red-dashboard yang memungkinkan Anda membuat antarmuka visual (dashboard) langsung dari editor. Dashboard ini bisa diakses melalui browser di perangkat apa saja β€” laptop, tablet, atau smartphone β€” sehingga sangat cocok untuk monitoring IoT real-time.

Instalasi Dashboard

bash β€” Instal node-red-dashboard
# Instal dashboard
cd ~/.node-red
npm install node-red-dashboard

# Restart Node-RED
node-red-stop && node-red-start

# Akses dashboard di:
# http://localhost:1880/ui

Konsep: ui_tab, ui_group, ui_site

Dashboard Node-RED menggunakan struktur hierarki:

Diagram: Struktur Dashboard Node-RED
Hierarki Dashboard:
====================

  Site (Situs)
  └── Tab (Halaman)
       └── Group (Kelompok)
            └── Widget (Komponen Visual)

Contoh:
  🌐 IoT Dashboard (Site)
  β”œβ”€β”€ πŸ“Š Monitoring (Tab 1)
  β”‚   β”œβ”€β”€ 🌑️ Sensor Suhu (Group)
  β”‚   β”‚   β”œβ”€β”€ Gauge Suhu          β†’ [ui_gauge]
  β”‚   β”‚   β”œβ”€β”€ Chart Suhu          β†’ [ui_chart]
  β”‚   β”‚   └── Text Status         β†’ [ui_text]
  β”‚   └── πŸ’‘ Status Lampu (Group)
  β”‚       β”œβ”€β”€ Toggle Lampu        β†’ [ui_switch]
  β”‚       └── Gauge Kecerahan     β†’ [ui_gauge]
  β”œβ”€β”€ βš™οΈ Pengaturan (Tab 2)
  β”‚   β”œβ”€β”€ ⏰ Timer Auto           β†’ [ui_timepicker]
  β”‚   └── πŸ“ Threshold Suhu       β†’ [ui_slider]
  └── πŸ“‹ Log Aktivitas (Tab 3)
      └── Tabel Event             β†’ [ui_table]

Widget Dashboard

Widget Fungsi Data Type
ui_gaugeMenampilkan angka dengan indikator visual (lingkaran/arah)Number
ui_chartChart data time-series (bar, line, pie)Array / Number
ui_textMenampilkan teks atau angka sederhanaString / Number
ui_switchToggle on/off (untuk kontrol aktuator)Boolean
ui_sliderSlider untuk mengatur nilai (0-100)Number
ui_dropdownDropdown pilihanString
ui_tableTabel dataArray of objects
ui_buttonTombol aksiTrigger
ui_colour_pickerPemilih warna (untuk LED RGB)Hex color

Contoh Flow Dashboard

Node-RED Flow β€” Dashboard Suhu
// Flow Dashboard Monitoring Suhu
//
// Struktur:
//   mqtt-in ──▢ function ──▢ ui_gauge (Suhu)
//                          ──▢ ui_chart (Histori)
//                          ──▢ ui_text (Status)
//
// ui_gauge config:
//   Group: Sensor Suhu (tab: Monitoring)
//   Label: "Suhu Ruangan"
//   Unit: "Β°C"
//   Min: 0, Max: 50
//   Colours: "#00b500, #e6e600, #ca3838"
//
// ui_chart config:
//   Group: Sensor Suhu (tab: Monitoring)
//   Label: "Histori Suhu"
//   Chart Type: line
//   X-Axis: 10 minutes
//   Y-Axis: 0 - 50
//
// function config:
//   msg.payload = msg.payload.suhu;
//   return msg;
πŸ’‘ Tips Dashboard

Untuk performa terbaik, batasi jumlah data di chart (misal 10-20 data point terakhir). Gunakan ui_template untuk widget kustom yang tidak tersedia di palette standar. Dashboard juga mendukung tema gelap β€” aktifkan di Configuration Node ui_base pada tab Settings.

7. HTTP In/Out untuk REST API

Node-RED dapat berfungsi sebagai server REST API yang menerima dan merespons permintaan HTTP. Dengan node http in dan http response, Anda bisa membuat endpoint API untuk menerima data dari perangkat IoT, menjalankan perintah, atau menyediakan data ke aplikasi lain.

Konsep Dasar HTTP Node

Diagram: Alur HTTP Request-Response
Alur HTTP di Node-RED:
=======================

  Client (Browser/ESP32/App)
       β”‚
       β”‚  HTTP Request (GET/POST)
       β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  http in    β”‚  ← Endpoint: /api/sensor
  β”‚  (Server)   β”‚
  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  function   β”‚  ← Proses data
  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β–Ό                      β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ http output β”‚     β”‚  (opsional)  β”‚
  β”‚  (Response) β”‚     β”‚  Simpan data β”‚
  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜     β”‚  ke database β”‚
         β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚  HTTP Response (200 OK + JSON)
         β–Ό
  Client menerima response

Contoh 1: API GET untuk Data Sensor

Buat endpoint yang mengembalikan data sensor terkini dari MQTT topic:

Node-RED Flow β€” API GET Sensor
// Flow: REST API GET Data Sensor
//
// http-in ──▢ function ──▢ http-response
//                          ──▢ debug (opsional)
//
// Konfigurasi http-in:
//   Method: GET
//   URL: /api/sensor/suhu
//
// Konfigurasi function:
//   msg.payload = {
//     suhu: global.get("suhuTerkini") || 0,
//     kelembaban: global.get("kelembabanTerkini") || 0,
//     timestamp: new Date().toISOString()
//   };
//   msg.headers = { "Content-Type": "application/json" };
//   return msg;
//
// Konfigurasi http-response:
//   (otomatis dari http-in)
//
// Test di browser:
//   GET http://localhost:1880/api/sensor/suhu
//   Response: {
//     "suhu": 28.5,
//     "kelembaban": 65.2,
//     "timestamp": "2026-06-20T10:30:00Z"
//   }

Contoh 2: API POST untuk Kontrol Aktuator

Buat endpoint POST yang menerima perintah kontrol dan mengirim ke MQTT:

Node-RED Flow β€” API POST Kontrol
// Flow: REST API POST Kontrol Lampu
//
// http-in ──▢ function ──▢ mqtt-out
//                   └──▢ http-response
//
// Konfigurasi http-in:
//   Method: POST
//   URL: /api/actuator/lampu
//   Content-Type: application/json
//
// Konfigurasi function:
//   var body = msg.payload;
//   if (body.status === "on" || body.status === "off") {
//     msg.payload = JSON.stringify({
//       status: body.status,
//       timestamp: new Date().toISOString()
//     });
//     msg.topic = "actuator/lampu/ruang-tamu";
//     node.send([msg, null]);
//
//     var response = {
//       success: true,
//       message: "Lampu " + body.status
//     };
//     node.send([null, { payload: response }]);
//   } else {
//     node.send([null, {
//       payload: { success: false, message: "Invalid status" }
//     }]);
//   }
//
// Konfigurasi http-response:
//   Status Code: msg.statusCode (atau default 200)
ℹ️ Keamanan HTTP API

Saat menghadap ke jaringan publik, selalu tambahkan autentikasi pada endpoint HTTP. Gunakan node http auth atau tambahkan header token di function node. Jangan lupa untuk memvalidasi input dari HTTP request untuk mencegah injection attack.

8. Proyek: Otomasi Rumah dengan Node-RED + MQTT

Sekarang kita akan menggabungkan semua konsep yang telah dipelajari menjadi satu proyek nyata: sistem otomasi rumah yang mengontrol lampu, kipas, dan menampilkan dashboard monitoring suhu real-time. Proyek ini menggunakan ESP32 sebagai perangkat pengumpul data dan Node-RED sebagai otomasi central.

Arsitektur Sistem

Diagram: Arsitektur Otomasi Rumah
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  SISTEM OTOMASI RUMAH                       β”‚
β”‚                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     MQTT      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚  ESP32 #1   │──────────────▢│                     β”‚     β”‚
β”‚  β”‚  Sensor DHT β”‚               β”‚     MQTT Broker     β”‚     β”‚
β”‚  β”‚  Suhu+Humi  β”‚               β”‚     (Mosquitto)     β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚     Port: 1883      β”‚     β”‚
β”‚                                β”‚                     β”‚     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     MQTT      β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚     β”‚
β”‚  β”‚  ESP32 #2   │◀──────────────│────│  Node-RED β”‚    β”‚     β”‚
β”‚  β”‚  Relay 2Ch  β”‚               β”‚    β”‚           β”‚    β”‚     β”‚
β”‚  β”‚  Lampu+Kipasβ”‚               β”‚    β”‚  β”Œβ”€β”€β”€β”€β”€β”  β”‚    β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚    β”‚  β”‚Flow β”‚  β”‚    β”‚     β”‚
β”‚                                β”‚    β”‚  β””β”€β”€β”¬β”€β”€β”˜  β”‚    β”‚     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”               β”‚    β”‚     β”‚     β”‚    β”‚     β”‚
β”‚  β”‚   Laptop /  │◀── Dashboard  β”‚    β””β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”˜    β”‚     β”‚
β”‚  β”‚   HP Browserβ”‚   (port 1880) β”‚          β”‚          β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                                           β”‚                 β”‚
β”‚                                    β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”         β”‚
β”‚                                    β”‚   Dashboard  β”‚         β”‚
β”‚                                    β”‚   Monitoring β”‚         β”‚
β”‚                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Flow 1: Monitoring Suhu Otomatis

Flow ini menerima data suhu dari ESP32 via MQTT, memprosesnya, dan menentukan aksi otomatis berdasarkan threshold yang ditentukan.

Node-RED Flow β€” Monitoring & Otomasi Suhu
// ========================================
// Flow 1: Monitoring Suhu + Otomasi Kipas
// ========================================
//
// [mqtt-in] ──▢ [function: proses_suhu] ──▢ [ui_gauge]
//                                        ──▢ [ui_chart]
//                                        ──▢ [function: otomasi_kipas]
//                                                  β”‚
//                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
//                              β–Ό                  β–Ό
//                        [function: ON]    [function: OFF]
//                              β”‚                  β”‚
//                              β–Ό                  β–Ό
//                        [mqtt-out]          [mqtt-out]
//                     kipas: ON            kipas: OFF

// ========================================
// Node Function: proses_suhu
// ========================================
var data = msg.payload;
var suhu = parseFloat(data.suhu);
var kelembaban = parseFloat(data.kelembaban);
var timestamp = new Date().toLocaleTimeString('id-ID');

// Simpan ke global untuk diakses API
global.set('suhuTerkini', suhu);
global.set('kelembabanTerkini', kelembaban);
global.set('terakhirUpdate', timestamp);

// Kirim data untuk gauge
gauge_msg = { payload: suhu };
node.send([gauge_msg, null, null, null]);

// Kirim data untuk chart
chart_msg = {
  payload: [
    { series: ["Suhu", "Kelembaban"],
      data: [[suhu], [kelembaban]],
      labels: [timestamp] }
  ]
};
node.send([null, chart_msg, null, null]);

// Kirim suhu untuk logika otomasi
otomasi_msg = { payload: { suhu: suhu } };
node.send([null, null, otomasi_msg, null]);

// ========================================
// Node Function: otomasi_kipas
// ========================================
var suhu = msg.payload.suhu;
var thresholdHidup = 30;  // Suhu di atas 30Β°C: kipas ON
var thresholdMati = 27;   // Suhu di bawah 27Β°C: kipas OFF
var statusKipas = global.get('statusKipas') || 'off';

if (suhu >= thresholdHidup && statusKipas === 'off') {
  // Aktifkan kipas
  global.set('statusKipas', 'on');
  node.send([{
    payload: JSON.stringify({ status: "on",
      suhuAktif: suhu }),
    topic: "actuator/kipas/rumah"
  }, null]);
} else if (suhu <= thresholdMati && statusKipas === 'on') {
  // Matikan kipas
  global.set('statusKipas', 'off');
  node.send([null, {
    payload: JSON.stringify({ status: "off",
      suhuMatikan: suhu }),
    topic: "actuator/kipas/rumah"
  }]);
}

Flow 2: Kontrol Lampu Manual via Dashboard

Node-RED Flow β€” Kontrol Lampu
// ========================================
// Flow 2: Kontrol Lampu via Dashboard
// ========================================
//
// [ui_switch] ──▢ [function] ──▢ [mqtt-out]
//                                   Topic: actuator/lampu/rumah
//
// Node Function:
//   msg.topic = "actuator/lampu/rumah";
//   msg.payload = JSON.stringify({
//     status: msg.payload ? "on" : "off",
//     timestamp: new Date().toISOString()
//   });
//   return msg;
//
// ui_switch config:
//   Group: Kontrol Lampu
//   Label: "Lampu Ruang Tamu"
//   On Payload: true
//   Off Payload: false
//   On Icon: lightbulb (fa-lightbulb)
//   Off Icon: lightbulb-o (fa-lightbulb-o)
//
// ========================================
// Flow 2b: Kontrol via Timer/Schedule
// ========================================
//
// [ui_timepicker] ──▢ [function] ──▢ [change] ──▢ [mqtt-out]
//                                              Topic: actuator/lampu/schedule
//
// Timer bisa dikirim ke ESP32 untuk
// scheduling lokal di mikrokontroler.

Flow 3: HTTP API untuk Monitoring Eksternal

Node-RED Flow β€” HTTP API Monitoring
// ========================================
// Flow 3: HTTP API untuk Status Rumah
// ========================================
//
// Endpoint 1: GET /api/status
// [http-in GET] ──▢ [function] ──▢ [http-response]
//
// Function:
//   msg.payload = {
//     suhu: global.get("suhuTerkini") || 0,
//     kelembaban: global.get("kelembabanTerkini") || 0,
//     lampu: global.get("statusLampu") || "off",
//     kipas: global.get("statusKipas") || "off",
//     lastUpdate: global.get("terakhirUpdate") || "-",
//     timestamp: new Date().toISOString()
//   };
//   msg.headers = { "Content-Type": "application/json" };
//   return msg;
//
// Endpoint 2: POST /api/alert
// [http-in POST] ──▢ [function: validate] ──▢ [mqtt-out]
//                                      └──▢ [http-response]
//
// Bisa dipanggil dari aplikasi mobile atau
// monitoring service seperti Grafana.

Flow 4: Dashboard Lengkap

Node-RED Flow β€” Dashboard Lengkap
// ========================================
// Flow 4: Dashboard Lengkap
// ========================================
//
// Tab: "Monitoring Rumah"
// β”‚
// β”œβ”€β”€ Group: "Sensor Suhu & Kelembaban"
// β”‚   β”œβ”€β”€ [ui_gauge]     Suhu (Β°C)
// β”‚   β”œβ”€β”€ [ui_gauge]     Kelembaban (%)
// β”‚   β”œβ”€β”€ [ui_chart]     Histori Suhu
// β”‚   └── [ui_text]      Status Terakhir
// β”‚
// β”œβ”€β”€ Group: "Kontrol Perangkat"
// β”‚   β”œβ”€β”€ [ui_switch]    Lampu Ruang Tamu
// β”‚   β”œβ”€β”€ [ui_switch]    Lampu Kamar
// β”‚   β”œβ”€β”€ [ui_slider]    Kecerahan Lampu (0-100)
// β”‚   └── [ui_dropdown]  Mode Kipas (Auto/Manual/OFF)
// β”‚
// └── Group: "Status Sistem"
//     β”œβ”€β”€ [ui_text]      Status MQTT Broker
//     β”œβ”€β”€ [ui_text]      Uptime Node-RED
//     └── [ui_text]      Jumlah Device Online
πŸ’‘ Tips Proyek

Mulai dengan satu flow saja terlebih dahulu (monitoring suhu), lalu tambahkan flow baru satu per satu. Gunakan link in/link out untuk menghubungkan flow tanpa kabel panjang. Selalu gunakan change node untuk menyimpan status ke flow context atau global context agar bisa diakses antar flow.

9. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang Node-RED dan integrasi IoT:

Pertanyaan 1: Apa kepanjangan dari "Node" dalam Node-RED?

a) Network Operating Terminal Engine for Realtime Development
b) Networking & Operation Tool for Embedded Devices
c) Blok fungsi individual yang mewakili satu unit kerja dalam alur visual
d) Node adalah server yang menjalankan Node-RED

Pertanyaan 2: Node-RED dibangun di atas runtime JavaScript berbasis apa?

a) Node.js
b) Python
c) Java
d) Ruby on Rails

Pertanyaan 3: Port default yang digunakan oleh Node-RED untuk akses editor adalah...

a) 8080
b) 3000
c) 8000
d) 1880

Pertanyaan 4: Node mana yang digunakan untuk menulis kode JavaScript kustom di Node-RED?

a) inject
b) function
c) change
d) debug

Pertanyaan 5: Untuk akses dashboard Node-RED di browser, URL yang benar adalah...

a) http://localhost:1880/ui
b) http://localhost:1880/dashboard
c) http://localhost:1880/#ui
d) http://localhost:1880/admin/dashboard
← Sebelumnya Setup Arduino IDE Selanjutnya β†’ Grafana + InfluxDB