// Proyek 116 - Alarm Getaran Brankas
// 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_ALARM = "ichibot/budi1234/p116/alarm";
const char* TOPIK_SIAGA = "ichibot/budi1234/p116/siaga";
const char* TOPIK_LOG   = "ichibot/budi1234/p116/log";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int GETAR = D5, SIRINE = D2;
const int BATAS_GETAR = 5;            // jumlah getaran dalam 2 detik yang dianggap bongkar paksa
bool siaga = false, berbunyi = false, tadi = LOW;
int getaran = 0;
unsigned long jendela = 0;

void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
  String p;
  for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
  siaga = (p == "ON");
  berbunyi = false;
  mqtt.publish(TOPIK_ALARM, "0", true);
}

void langganan() {
  mqtt.subscribe(TOPIK_SIAGA);
}

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(GETAR, INPUT);
  pinMode(SIRINE, OUTPUT);
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
  mqtt.setCallback(pesanMasuk);
}

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

  bool sekarang = digitalRead(GETAR);              // SW-420: HIGH saat bergetar
  if (sekarang == HIGH && tadi == LOW) {           // hitung tiap awal getaran
    if (millis() - jendela > 2000) { jendela = millis(); getaran = 0; }
    getaran++;
    if (siaga && !berbunyi && getaran >= BATAS_GETAR) {
      berbunyi = true;
      mqtt.publish(TOPIK_ALARM, "1", true);
      mqtt.publish(TOPIK_LOG, ("Brankas diguncang! " + String(getaran) + " getaran dalam 2 detik").c_str());
    }
  }
  tadi = sekarang;
  digitalWrite(SIRINE, berbunyi && (millis() / 200) % 2);
}
