Praktikum Kontrol Relay ESP32 via MQTT: Pisahkan Command dan State
Tutorial kontrol aktuator ESP32 melalui MQTT dengan pola command/state, retained state, validasi payload, dan fail-safe lokal.
Artikel ini disusun sebagai panduan teknis Ruang IoT. Gunakan daftar isi untuk berpindah antarbagian dan ikuti langkah secara berurutan ketika artikel memuat praktik atau konfigurasi.
Kontrol aktuator melalui MQTT sebaiknya tidak berhenti pada “terima pesan lalu ubah pin”. Sistem yang lebih dapat diamati memisahkan topic command dan topic state: aplikasi mengirim perintah ke topic command, perangkat menjalankan perintah yang valid, lalu perangkat mempublikasikan state aktual. Dengan pola ini dashboard dapat membedakan perintah yang dikirim dan kondisi yang benar-benar diterapkan.
Keselamatan: gunakan LED atau beban DC tegangan rendah untuk praktikum. Artikel ini tidak memberikan instruksi wiring listrik mains.
Arsitektur topic
| Fungsi | Topic contoh | Payload |
|---|---|---|
| Command | lab/relay01/command | ON atau OFF |
| State | lab/relay01/state | ON atau OFF |
| Availability | lab/relay01/status | online/offline |
Topic hanyalah contoh. Pada platform produksi gunakan namespace dan kebijakan autentikasi resmi yang berlaku.
Program subscribe dan publish state
#include <WiFi.h>
#include <PubSubClient.h>
const int RELAY_PIN = 26;
const char* TOPIC_CMD = "lab/relay01/command";
const char* TOPIC_STATE = "lab/relay01/state";
WiFiClient net;
PubSubClient mqtt(net);
bool relayOn = false;
void publishState() {
mqtt.publish(TOPIC_STATE, relayOn ? "ON" : "OFF", true);
}
void setRelay(bool on) {
relayOn = on;
digitalWrite(RELAY_PIN, on ? LOW : HIGH); // sesuaikan modul
publishState();
}
void onMessage(char* topic, byte* payload, unsigned int length) {
String msg;
for (unsigned int i = 0; i < length; i++) msg += (char)payload[i];
msg.trim();
if (String(topic) != TOPIC_CMD) return;
if (msg == "ON") setRelay(true);
else if (msg == "OFF") setRelay(false);
else Serial.println("Command ditolak: payload tidak valid");
}
void connectMqtt() {
while (!mqtt.connected()) {
if (mqtt.connect("esp32-relay01")) {
mqtt.subscribe(TOPIC_CMD);
publishState();
} else {
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, HIGH);
mqtt.setCallback(onMessage);
// hubungkan Wi-Fi, mqtt.setServer(...), lalu connectMqtt()
}
void loop() {
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
}Pengujian
- Gunakan LED terlebih dahulu untuk memastikan logika ON/OFF benar.
- Subscribe topic state dari MQTT client.
- Kirim
ONke topic command dan verifikasi state menjadi ON. - Kirim payload salah seperti
START; perangkat harus menolak tanpa mengubah state. - Restart ESP32 dan periksa state yang dipublikasikan setelah reconnect.
Retained state dan availability
Contoh memakai retained message untuk state agar client baru segera mengetahui kondisi terakhir yang dipublikasikan. Dalam deployment nyata, bedakan state terakhir yang tersimpan di broker dari bukti bahwa perangkat sedang online. Availability atau heartbeat dibutuhkan agar antarmuka tidak menampilkan state lama seolah-olah perangkat masih terhubung.
Hardening
- Validasi semua payload command.
- Gunakan autentikasi dan otorisasi broker.
- Gunakan TLS bila arsitektur menuntut transport terenkripsi.
- Batasi aktuator dengan fail-safe lokal.
- Jangan menaruh kredensial sensitif pada source publik.
Kriteria keberhasilan
Command valid mengubah output dan menghasilkan state baru; command invalid ditolak; reconnect tidak membuat loop macet; dan state dapat diamati secara terpisah dari command.
Referensi resmi dan bacaan lanjut
Gunakan dokumentasi resmi berikut untuk memeriksa API, kompatibilitas board, dan perubahan versi library:
Sudah memahami alurnya?
Praktikkan konsep yang baru dipelajari melalui project, perangkat ESP32, telemetry, dashboard, atau Virtual Lab di Ruang IoT.