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

PolaJangkau sensorGateway butuhDashboard
ESP-NOW (#25)~10–200 mESP32 kedua (bisa tanpa LoRa)Serial / MQTT manual
LoRa P2P (#26)ratusan m – kmReceiver Serial sajaBelum MQTT
Gateway (artikel ini)sama LoRa #26LoRa RX + WiFi + MQTTGrafana / HA / Node-RED
WiFi + MQTT (#7)jangkau APSensor punya WiFiLangsung 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 Mosquitto192.168.1.50, user kindo_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)

  1. Pastikan Telegraf / subscriber #19 sudah subscribe kodingindonesia/esp32/#
  2. Tambah filter source = lora di panel Grafana untuk memisahkan node kebun
  3. Panel suhu & kelembaban — reuse dashboard dari #19, tambah legend "LoRa kebun"
  4. 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:

  1. Setiap node punya node_id uint8 di struct (ubah di #26 & gateway bersamaan)
  2. Interval kirim di-stagger — hindari tabrakan paket di udara
  3. 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)

KomponenPerkiraan
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?

  1. Sensor >200 m dari router WiFi? → LoRa node + gateway
  2. Butuh grafik histori di Grafana? → Gateway publish MQTT (#19)
  3. Node dekat <50 m tanpa LoRa? → ESP-NOW (#25) lebih sederhana
  4. Butuh video kebun? → ESP32-CAM (#27) di titik ada WiFi
  5. 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
  1. Verifikasi node sensor TX di Serial (artikel #26)
  2. Gateway Serial menampilkan MQTT <- LoRa
  3. mosquitto_sub menerima payload JSON
  4. Grafana panel update dalam ±1 menit (refresh Telegraf)
  5. 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/status dengan LWT offline

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_id di 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.begin dan LoRa.setPins seperti 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)

Dengan gateway LoRa → MQTT, sensor di ujung lahan akhirnya terlihat di dashboard — capstone Jalur D Seri 2 selesai. Lanjutkan di halaman artikel Koding Indonesia.