// Proyek 002 - LED Kedip dengan Kecepatan dari Slider
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";

// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_KEDIP = "ichibot/budi1234/p002/kedip";
const char* TOPIK_JEDA  = "ichibot/budi1234/p002/jeda";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int LED = D1;                   // GPIO5
bool kedip = true;
int jeda = 500;                       // ms antara nyala dan mati
unsigned long terakhir = 0;

void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
  String topik = t, p;
  for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
  if (topik == TOPIK_KEDIP) kedip = (p == "ON");
  else if (topik == TOPIK_JEDA) jeda = constrain(p.toInt(), 50, 2000);
  if (!kedip) digitalWrite(LED, LOW);
  Serial.println(topik + " = " + p);
}

void langganan() {
  mqtt.subscribe(TOPIK_KEDIP);
  mqtt.subscribe(TOPIK_JEDA);
}

void sambungWiFi() {
  WiFi.begin(WIFI_NAMA, WIFI_PASS);
  Serial.print("WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" OK, IP " + WiFi.localIP().toString());
}

void sambungMQTT() {
  while (!mqtt.connected()) {
    if (mqtt.connect(WiFi.macAddress().c_str())) {
      Serial.println("Terhubung ke Klenik");
      langganan();
    } else {
      Serial.println("Broker gagal, coba lagi 3 detik");
      delay(3000);
    }
  }
}
void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
  mqtt.setCallback(pesanMasuk);
}

void loop() {
  if (!mqtt.connected()) sambungMQTT();
  mqtt.loop();

  if (kedip && millis() - terakhir >= (unsigned long)jeda) {
    terakhir = millis();
    digitalWrite(LED, !digitalRead(LED));
  }
}
