#include <DHTesp.h>
#include <WiFi.h>
#include <ThingsBoard.h>
#include <Arduino_MQTT_Client.h>
#include <ESP32Servo.h>

#define pinDht 15
#define pinLDR 36 // Pin untuk sensor LDR
#define LDR_THRESHOLD 270 // Ambang batas cahaya untuk servo

DHTesp dhtSensor;

#define WIFI_AP "Wokwi-GUEST"
#define WIFI_PASS ""

#define TB_SERVER "thingsboard.cloud"
#define TOKEN "zIP38kwGCGPfpMNt3Cdk"

constexpr uint16_t MAX_MESSAGE_SIZE = 128u;

WiFiClient espClient;
Arduino_MQTT_Client mqttClient(espClient);
ThingsBoard tb(mqttClient, MAX_MESSAGE_SIZE);

#define pinServo 12
Servo servoMotor;

void connectToWiFi() {
  Serial.println("Connecting to WiFi...");
  int attempts = 0;

  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    WiFi.begin(WIFI_AP, WIFI_PASS, 6);
    delay(500);
    Serial.print(".");
    attempts++;
  }

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("\nFailed to connect to WiFi.");
  } else {
    Serial.println("\nConnected to WiFi");
  }
}

void connectToThingsBoard() {
  if (!tb.connected()) {
    Serial.println("Connecting to ThingsBoard server");

    if (!tb.connect(TB_SERVER, TOKEN)) {
      Serial.println("Failed to connect to ThingsBoard");
    } else {
      Serial.println("Connected to ThingsBoard");
    }
  }
}

void sendDataToThingsBoard(float temp, int hum, int light) {
  String jsonData = "{\"temperature\":" + String(temp) + ", \"humidity\":" + String(hum) + ", \"light\":" + String(light) + "}";
  tb.sendTelemetryJson(jsonData.c_str());
  Serial.println("Data sent");
}

void setup() {
  Serial.begin(115200);
  dhtSensor.setup(pinDht, DHTesp::DHT22);
  servoMotor.attach(pinServo); // Inisialisasi servo
  connectToWiFi();
  connectToThingsBoard();
}

void loop() {
  connectToWiFi();

  TempAndHumidity data = dhtSensor.getTempAndHumidity();
  float temp = data.temperature;
  int hum = data.humidity;

  // Baca nilai sensor LDR
  int light = analogRead(pinLDR);

  Serial.println(temp);
  Serial.println(hum);
  Serial.println(light); // Tampilkan nilai cahaya

  if (!tb.connected()) {
    connectToThingsBoard();
  }

  sendDataToThingsBoard(temp, hum, light);

  // Tambahkan logika untuk servo berdasarkan nilai kelembapan
  if (hum <= 65 && light < LDR_THRESHOLD) {
    // Buka servo jika kelembapan di bawah 65
    servoMotor.write(90); // Contoh: Posisi 90 derajat
  } else if (hum >= 78) {
    // Tutup servo jika kelembapan di atas 78
    servoMotor.write(0); // Contoh: Kembalikan ke posisi 0 derajat
  }

  delay(1000);
  tb.loop();
}