Pendahuluan — Menjembatani LoRa dan Cloud Lokal
Di artikel #26 LoRa, sensor di ujung kebun mengirim paket ke receiver ESP32 — tapi data masih berhenti di Serial Monitor. Di Grafana (#19), kamu sudah punya dashboard cantik — asalkan data masuk MQTT lewat broker Mosquitto (#16).
Artikel capstone Jalur D ini menggabungkan keduanya: satu board gateway ESP32 dengan modul LoRa + WiFi yang menerima paket sensor lalu publish JSON ke MQTT. Sensor jauh tanpa WiFi akhirnya muncul di dashboard yang sama dengan node DHT22 biasa.
Prasyarat: Sudah bisa LoRa peer-to-peer (#26), punya broker MQTT (#16), dan idealnya sudah pasang Grafana (#19). Bukan pengganti ESP-NOW (#25) — itu untuk node dekat tanpa LoRa.
Arsitektur Gateway LoRa → MQTT
[ Sensor node ] [ Gateway ESP32 ] [ Cloud lokal ]
ESP32 + LoRa TX --LoRa--> ESP32 + LoRa RX + WiFi --MQTT--> Mosquitto (#16)
DHT22 (#5) PubSubClient publish |
deep sleep (#11) topic Seri 2 v
Grafana (#19)
Node-RED (#23)
Node sensor tetap seperti #26 (kirim lora_packet_t). Gateway menambahkan lapisan WiFi + MQTT — pola mirip publish MQTT (#7), tapi sumber datanya bukan sensor lokal, melainkan radio LoRa.
LoRa Gateway vs ESP-NOW vs WiFi Langsung
| Pola | Jangkau sensor | Gateway butuh | Dashboard |
|---|---|---|---|
| ESP-NOW (#25) | ~10–200 m | ESP32 kedua (bisa tanpa LoRa) | Serial / MQTT manual |
| LoRa P2P (#26) | ratusan m – km | Receiver Serial saja | Belum MQTT |
| Gateway (artikel ini) | sama LoRa #26 | LoRa RX + WiFi + MQTT | Grafana / HA / Node-RED |
| WiFi + MQTT (#7) | jangkau AP | Sensor punya WiFi | Langsung ke broker |
Lihat REST vs MQTT (#20) untuk memilih lapisan cloud setelah gateway publish.
Yang Kamu Butuhkan
- 1× node sensor — sketch sender #26 (ESP32 + LoRa + DHT22)
- 1× gateway ESP32 — ESP32 + modul SX1278 + akses WiFi rumah/lab
- Broker Mosquitto —
192.168.1.50, userkindo_esp32(sesuaikan dengan #16) - Stack dashboard — Grafana + InfluxDB dari #19 (opsional tapi disarankan)
- Library: LoRa (Sandeep Mistry), PubSubClient, WiFi
Topik MQTT & Format JSON
Gunakan topic konsisten Seri 2 agar panel Grafana #19 langsung menangkap data:
Topic: kodingindonesia/esp32/dht22/data
Payload contoh:
{"suhu":28.5,"kelembaban":65.2,"unix":1782977400,"iso":"2026-07-02T14:30:00","source":"lora"}
Field source":"lora" membantu membedakan node WiFi vs node LoRa di query Grafana. Timestamp selaras NTP (#34) — gateway bisa menambahkan unix saat forward jika paket sensor belum punya waktu akurat.
Struktur Paket LoRa (Sama dengan #26)
typedef struct __attribute__((packed)) {
float suhu;
float kelembaban;
uint32_t unix;
} lora_packet_t;
Sync word, frequency, dan spreading factor gateway harus identik dengan node sensor — lihat troubleshooting di #26 jika paket tidak masuk.
Sketch Gateway — LoRa RX + MQTT Publish
#include <WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include <LoRa.h>
#include <ArduinoJson.h>
const char* ssid = "GANTI_NAMA_WIFI";
const char* password = "GANTI_PASSWORD_WIFI";
const char* mqtt_server = "192.168.1.50";
const int mqtt_port = 1883;
const char* mqtt_user = "kindo_esp32";
const char* mqtt_pass = "GANTI_PASSWORD_MQTT";
const char* topic = "kodingindonesia/esp32/dht22/data";
#define LORA_FREQ 433E6
WiFiClient espClient;
PubSubClient mqtt(espClient);
typedef struct __attribute__((packed)) {
float suhu;
float kelembaban;
uint32_t unix;
} lora_packet_t;
void reconnectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect("gateway-lora-esp32", mqtt_user, mqtt_pass)) {
Serial.println("MQTT connected");
} else {
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
mqtt.setServer(mqtt_server, mqtt_port);
SPI.begin(5, 19, 27, 18);
LoRa.setPins(18, 14, 26);
if (!LoRa.begin(LORA_FREQ)) {
Serial.println("LoRa init gagal!");
while (true) { delay(1000); }
}
LoRa.setSpreadingFactor(7);
LoRa.setSyncWord(0x12);
}
void loop() {
if (!mqtt.connected()) reconnectMqtt();
mqtt.loop();
int packetSize = LoRa.parsePacket();
if (packetSize == sizeof(lora_packet_t)) {
lora_packet_t pkt;
LoRa.readBytes((uint8_t*)&pkt, sizeof(pkt));
StaticJsonDocument<200> doc;
doc["suhu"] = pkt.suhu;
doc["kelembaban"] = pkt.kelembaban;
doc["unix"] = pkt.unix;
doc["iso"] = "2026-07-02T14:30:00";
doc["source"] = "lora";
doc["rssi"] = LoRa.packetRssi();
char buf[200];
serializeJson(doc, buf, sizeof(buf));
mqtt.publish(topic, buf);
Serial.printf("MQTT <- LoRa suhu=%.1f\n", pkt.suhu);
}
}
Pro tip: Jangan publish setiap byte noise — cek
packetSize == sizeof(lora_packet_t)dan validasi rentang suhu (mis. -40…85 °C) sebelum forward ke MQTT.
Integrasi Grafana (#19)
- Pastikan Telegraf / subscriber #19 sudah subscribe
kodingindonesia/esp32/# - Tambah filter
source = loradi panel Grafana untuk memisahkan node kebun - Panel suhu & kelembaban — reuse dashboard dari #19, tambah legend "LoRa kebun"
- Opsional: alert jika
rssi< -120 dBm (link radio melemah)
Untuk otomasi visual lain, lihat Node-RED (#23) atau Home Assistant (#21).
Keamanan MQTT & WiFi
- Ganti
GANTI_NAMA_WIFI,GANTI_PASSWORD_WIFI,GANTI_PASSWORD_MQTT— jangan commit ke GitHub - Untuk gateway di internet, aktifkan MQTT TLS (#17)
- LoRa sync word bukan enkripsi — untuk lapangan sensitif pertimbangkan AES di payload
- Label fisik board GATEWAY vs SENSOR
Visual vs Telemetry
ESP32-CAM (#27) cocok untuk live video di LAN — bukan lewat LoRa/MQTT telemetry. Gateway artikel ini untuk angka sensor; kamera tetap terpisah di titik yang ada WiFi.
OTA & Deploy Lapangan
Setelah gateway terpasang di rak outdoor, update firmware tanpa USB lewat OTA (#15). Untuk SSID berbeda per lokasi, kombinasikan WiFiManager (#12) di gateway saja — node sensor LoRa tetap tanpa WiFi.
Buffer & Retry MQTT
Di lapangan, WiFi bisa drop sesaat. Pertimbangkan pola berikut di gateway:
- Simpan paket LoRa terakhir di variabel static — publish ulang saat MQTT reconnect
- Gunakan QoS 1 (#17) jika broker mendukung — mengurangi hilang saat jaringan fluktuatif
- Jangan queue ratusan paket di RAM ESP32 — LoRa telemetry jarang & kecil, cukup last value
- Log RSSI (
LoRa.packetRssi()) ke MQTT untuk diagnosa jarak di Grafana
Jika gateway reboot, node sensor tetap kirim — data akan muncul lagi setelah WiFi + MQTT connected. Untuk alert gateway mati, konfigurasi LWT di #17 dengan topic status terpisah.
Multi-Node (Opsional)
Satu gateway bisa menerima beberapa sensor jika:
- Setiap node punya
node_iduint8 di struct (ubah di #26 & gateway bersamaan) - Interval kirim di-stagger — hindari tabrakan paket di udara
- MQTT topic bisa tetap satu dengan field
node_id, atau pecah:kodingindonesia/esp32/lora/kebun1/data
Untuk lab awal, satu node + satu gateway sudah cukup membuktikan alur end-to-end ke Grafana.
Estimasi Biaya (Indonesia, 2026)
| Komponen | Perkiraan |
|---|---|
| ESP32 + SX1278 (gateway) | Rp 80–120 rb |
| ESP32 + SX1278 + DHT22 (sensor node) | Rp 100–150 rb |
| Antena 433 MHz (opsional) | Rp 15–40 rb |
| Broker + Grafana (VPS/RPi #16+#19) | sudah ada dari artikel sebelumnya |
Checklist: Kapan Pakai Gateway LoRa?
- Sensor >200 m dari router WiFi? → LoRa node + gateway
- Butuh grafik histori di Grafana? → Gateway publish MQTT (#19)
- Node dekat <50 m tanpa LoRa? → ESP-NOW (#25) lebih sederhana
- Butuh video kebun? → ESP32-CAM (#27) di titik ada WiFi
- Greenhouse capstone? → #39 gabung LoRa + pompa MQTT
Uji Coba (Lab)
# Terminal 1 — subscribe MQTT (broker #16):
mosquitto_sub -h 192.168.1.50 -u kindo_esp32 -P GANTI_PASSWORD_MQTT \
-t kodingindonesia/esp32/dht22/data -v
# Flash gateway sketch, nyalakan node sensor #26
# Harus muncul JSON dengan "source":"lora"
# Buka Grafana (#19) — panel suhu harus update
- Verifikasi node sensor TX di Serial (artikel #26)
- Gateway Serial menampilkan
MQTT <- LoRa mosquitto_submenerima payload JSON- Grafana panel update dalam ±1 menit (refresh Telegraf)
- Jauhkan node sensor — catat jarak saat paket putus
Monitoring & Observabilitas
Setelah alur dasar jalan, tambahkan metrik berikut di dashboard:
- Counter paket LoRa/hari — deteksi node mati tanpa datang ke MQTT
- Rata-rata RSSI — trend melemah = antena/kabel perlu cek
- Latency LoRa → MQTT — selisih waktu RX vs publish (opsional, butuh NTP di gateway)
- Status gateway — topic
kodingindonesia/esp32/gateway/statusdengan LWToffline
Panel ini melengkapi grafik suhu dari #19 — kamu memantau kesehatan link, bukan hanya nilai sensor. Untuk notifikasi Telegram/WhatsApp, arahkan Node-RED (#23) ke topic status gateway.
FAQ Singkat
- Bisa beberapa sensor LoRa ke satu gateway?
- Ya — tambahkan
node_iddi struct dan filter di MQTT; hindari collision dengan interval kirim berbeda. - Gateway harus online 24/7?
- Ya, selama kamu mau data real-time. Node sensor bisa deep sleep; gateway butuh WiFi + power stabil.
- Perlu LoRaWAN?
- Gateway bisa pakai Raspberry Pi?
- Bisa — RPi + LoRa hat + Python forwarder; artikel ini fokus ESP32 agar konsisten dengan #26 dan biaya murah.
- Harus sama persis board dengan #26?
- Pin LoRa disarankan sama; jika beda board, sesuaikan
SPI.begindanLoRa.setPinsseperti tabel wiring #26.
Tips & Troubleshooting
- MQTT kosong tapi LoRa RX OK: Cek user/password broker, topic typo, firewall port 1883
- LoRa RX kosong: SF/sync word/frequency beda dengan sensor — ulang #26
- Grafana flat: Telegraf belum parse field baru — cek measurement & JSON keys
- WiFi drop: Gateway dekat router atau pakai AP outdoor; LWT (#17) untuk alert offline
- Duplicate data: Sensor kirim terlalu cepat — naikkan interval TX ke 30–60 d
Regulasi & Deploy Lapangan
Gateway biasanya dipasang di rumah/gudang dekat router WiFi — bukan di tengah kebun seperti node sensor. Pastikan:
- Antena LoRa gateway terpasang vertikal, bebas halangan metal besar
- Power supply stabil (5V 2A) — WiFi + LoRa TX bersamaan mengonsumsi puncak lebih tinggi
- Node sensor di kebun tetap mengikuti catatan regulasi 433 MHz dari artikel #26
- Dokumentasi sketsa: frekuensi, SF, sync word, IP broker — berguna saat debug bulan depan
Untuk proyek komersial skala besar, pertimbangkan LoRaWAN operator atau konsultasi frekuensi — tutorial ini untuk prototipe edukasi di lab dan kebun rumah.
Langkah Selanjutnya (Jalur D selesai → Jalur E)
- Migrasi PlatformIO (#29): struktur project gateway + sensor lebih rapi
- Python → MySQL (#18) — arsip SQL paralel Grafana
- Capstone greenhouse (#39) — LoRa kebun + pompa relay + dashboard
- Kembali ke LoRa (#26) jika perlu tuning SF/antena
Dengan gateway LoRa → MQTT, sensor di ujung lahan akhirnya terlihat di dashboard — capstone Jalur D Seri 2 selesai. Lanjutkan di halaman artikel Koding Indonesia.