// Proyek 128 - Notifikasi Listrik PLN Padam
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <time.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_LISTRIK = "ichibot/budi1234/p128/listrik";
const char* TOPIK_LOG     = "ichibot/budi1234/p128/log";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
bool sudahLapor = false;

void langganan() {}

void sambungDenganPesanTerakhir() {   // seperti sambungMQTT(), ditambah "last will"
  while (!mqtt.connected()) {
    // kalau koneksi putus tiba-tiba, BROKER yang mengirim "0" ke topic listrik
    if (mqtt.connect(WiFi.macAddress().c_str(), TOPIK_LISTRIK, 1, true, "0")) {
      mqtt.publish(TOPIK_LISTRIK, "1", true);
    } else {
      delay(3000);
    }
  }
}

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);
  sambungWiFi();
  configTime(7 * 3600, 0, "pool.ntp.org");
  mqtt.setServer(BROKER, 1883);
  mqtt.setKeepAlive(15);              // broker menganggap kita hilang setelah ±22 detik diam
}

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

  time_t t = time(nullptr);
  if (!sudahLapor && t > 1700000000) {
    sudahLapor = true;                // sekali setiap NodeMCU menyala = listrik baru kembali
    char jam[17];
    strftime(jam, sizeof(jam), "%d/%m %H:%M", localtime(&t));
    mqtt.publish(TOPIK_LOG, (String("Listrik menyala ") + jam).c_str());
  }
}
