// Proyek 121 - Monitor Tegangan & Arus DC INA219
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_INA219.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_VOLT = "ichibot/budi1234/p121/volt";
const char* TOPIK_ARUS = "ichibot/budi1234/p121/arus";
const char* TOPIK_DAYA = "ichibot/budi1234/p121/daya";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
Adafruit_INA219 ina;                  // alamat I2C 0x40
unsigned long terakhir = 0;

void langganan() {}

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);
  if (!ina.begin()) Serial.println("INA219 tidak ditemukan, cek SDA/SCL");
  sambungWiFi();
  mqtt.setServer(BROKER, 1883);
}

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

  if (millis() - terakhir >= 1000) {
    terakhir = millis();
    float volt = ina.getBusVoltage_V() + ina.getShuntVoltage_mV() / 1000;   // tegangan sumber
    float mA = ina.getCurrent_mA();
    float mW = ina.getPower_mW();
    Serial.printf("%.2f V  %.0f mA  %.0f mW\n", volt, mA, mW);
    mqtt.publish(TOPIK_VOLT, String(volt, 2).c_str());
    mqtt.publish(TOPIK_ARUS, String(mA, 0).c_str());
    mqtt.publish(TOPIK_DAYA, String(mW / 1000, 2).c_str());
  }
}
