#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <Preferences.h>
#include "time.h"
const char* ssid = "Uchar D1/1";
const char* password = "ramazuhayr";
const char* botToken = "7164767848:AAG-enx254qOmqMEzopTWHMIeS_sMWQAm30";
const String groupChatID = "-4220169840";
WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);
Preferences preferences;
unsigned long lastTimeBotRan;
const int botRequestDelay = 500;
int ledStates[2] = {LOW, LOW};
int pinss[2] = {14, 26}; // Pin untuk masing-masing tombol
void setup() {
Serial.begin(115200);
client.setCACert(TELEGRAM_CERTIFICATE_ROOT);
pinMode(pinss[0], OUTPUT);
pinMode(pinss[1], OUTPUT);
// Inisialisasi Preferences
preferences.begin("ledStates", false);
// Muat status LED dari Preferences
ledStates[0] = preferences.getBool("led1", LOW);
ledStates[1] = preferences.getBool("led2", LOW);
// Set pin sesuai dengan status yang tersimpan
digitalWrite(pinss[0], ledStates[0]);
digitalWrite(pinss[1], ledStates[1]);
setupNTP();
}
// Fungsi untuk mengatur NTP
void setupNTP() {
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600; // Offset waktu untuk UTC+8 (8 jam)
const int daylightOffset_sec = 0; // Tidak ada perbedaan daylight saving untuk zona waktu ini
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("NTP time synchronization done.");
}
// Mendefinisikan enum untuk format waktu
enum TimeFormat {
YEAR, // 0: YYYY
MONTH, // 1: MM
DAY, // 2: DD
DAY_NAME, // 3: Nama hari
HOUR, // 4: JAM
MINUTE, // 5: MENIT
SECOND // 6: DETIK
};
// Fungsi untuk mendapatkan waktu dan tanggal dalam format tertentu
String Get_time(int format) {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return ""; // Kembalikan string kosong jika gagal
}
// Array nama hari
String daysOfWeek[] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
// Mengembalikan informasi berdasarkan format yang diminta
switch (format) {
case YEAR: // Format: YYYY
return String(timeinfo.tm_year + 1900);
case MONTH: // Format: MM
return String(timeinfo.tm_mon + 1);
case DAY: // Format: DD
return String(timeinfo.tm_mday);
case DAY_NAME: // Format: Nama hari
return daysOfWeek[timeinfo.tm_wday];
case HOUR: // Format: JAM
return String(timeinfo.tm_hour);
case MINUTE: // Format: MENIT
return String(timeinfo.tm_min);
case SECOND: // Format: DETIK
return String(timeinfo.tm_sec);
default: // Kembalikan string kosong jika format tidak valid
return "";
}
}
void wifi_setup() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
}
Serial.println("Connected to WiFi");
}
}
void loop() {
wifi_setup();
String date = Get_time(DAY) + "/" + Get_time(MONTH) + "/" + Get_time(YEAR) + " - " + Get_time(HOUR) + ":" + Get_time(MINUTE) + ":" + Get_time(SECOND);
if (millis() - lastTimeBotRan > botRequestDelay) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
if (numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
String from_name = bot.messages[i].from_name;
if (from_name == "") {
from_name = "Guest";
}
Serial.println("Chat ID: " + chat_id);
if (bot.messages[i].type == "callback_query") {
String callbackData = bot.messages[i].text;
Serial.print("Call back button pressed by: ");
Serial.println(bot.messages[i].from_id);
Serial.print("Data on the button: ");
Serial.println(callbackData);
if (callbackData == "PC") {
ledStates[0] = !ledStates[0];
digitalWrite(pinss[0], ledStates[0]);
// Simpan status baru ke Preferences
preferences.putBool("led1", ledStates[0]);
String msg = date;
String keyboardJson = "[[{ \"text\" : \"" + String("PC") + " : " + (ledStates[0] ? "OFF" : "ON") + "\", \"callback_data\" : \"" + "PC" + "\" }]]";
bot.sendMessageWithInlineKeyboard(chat_id, msg, "Markdown", keyboardJson, bot.messages[i].message_id);
} else if (callbackData == "LAMP") {
ledStates[1] = !ledStates[1];
digitalWrite(pinss[1], ledStates[1]);
// Simpan status baru ke Preferences
preferences.putBool("led2", ledStates[1]);
String msg = date;
String keyboardJson = "[[{ \"text\" : \"" + String("LAMP") + " : " + (ledStates[1] ? "OFF" : "ON") + "\", \"callback_data\" : \"" + "LAMP" + "\" }]]";
bot.sendMessageWithInlineKeyboard(chat_id, msg, "Markdown", keyboardJson, bot.messages[i].message_id);
}
} else {
if (bot.messages[i].text == "/start") {
String msg = "Hi " + from_name + "!\n";
msg += "You can control the buttons below:\n";
String keyboardJson = "[[{ \"text\" : \"PC : " + String(ledStates[0] ? "ON" : "OFF") + "\", \"callback_data\" : \"PC\" }],";
keyboardJson += "[{ \"text\" : \"LAMP : " + String(ledStates[1] ? "ON" : "OFF") + "\", \"callback_data\" : \"LAMP\" }]]";
bot.sendMessageWithInlineKeyboard(chat_id, msg, "Markdown", keyboardJson);
}
}
}
}
lastTimeBotRan = millis();
}
}