Files
monitoring-air/bot.js
fakhrini f44f5cf855 done
2025-07-18 19:42:27 +07:00

136 lines
4.8 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { makeWASocket, useMultiFileAuthState } from "@whiskeysockets/baileys";
import qrcode from "qrcode-terminal";
import express from "express";
import bodyParser from "body-parser";
const app = express();
app.use(bodyParser.json());
let sock; // Variabel global untuk menyimpan socket WhatsApp
// Objek untuk menyimpan nilai terbaru
let latestData = {
tds: null,
flow: null,
ph: null,
suhu: null,
};
async function startBot() {
const { state, saveCreds } = await useMultiFileAuthState("auth_info");
sock = makeWASocket({
auth: state,
printQRInTerminal: true, // QR code akan muncul di terminal
});
sock.ev.on("creds.update", saveCreds);
sock.ev.on("connection.update", (update) => {
const { connection, lastDisconnect } = update;
if (connection === "close") {
console.log("Koneksi terputus, mencoba reconnect...");
startBot();
} else if (connection === "open") {
console.log("Bot WhatsApp berhasil terhubung!");
}
});
sock.ev.on("messages.upsert", async (m) => {
const msg = m.messages[0];
if (!msg.message) return;
const sender = msg.key.remoteJid;
const text = msg.message.conversation || msg.message.extendedTextMessage?.text || "";
console.log(`Pesan masuk dari ${sender}: ${text}`);
// Kirim nilai terbaru jika diminta
if (text.toLowerCase() === "suhu") {
await sock.sendMessage(sender, { text: `🌡 Suhu: ${latestData.suhu || "belum ada data"} °C` });
} else if (text.toLowerCase() === "ph") {
await sock.sendMessage(sender, { text: `🧪 pH: ${latestData.ph || "belum ada data"}` });
} else if (text.toLowerCase() === "tds") {
await sock.sendMessage(sender, { text: `⚡ TDS: ${latestData.tds || "belum ada data"} ppm` });
} else if (text.toLowerCase() === "debit") {
await sock.sendMessage(sender, { text: `💧 Debit: ${latestData.flow || "0"} L` });
} else if (text.toLowerCase() === "data") {
const message = `📊 Data Sensor Saat Ini:\n⚡ TDS: ${latestData.tds || "belum ada data"} ppm\n💧 Debit: ${latestData.flow || "0"} L\n🧪 PH: ${latestData.ph || "belum ada data"}\n🌡 Suhu: ${latestData.suhu || "belum ada data"} °C`;
await sock.sendMessage(sender, { text: message });
}
});
}
// Endpoint API untuk menerima data dan memperbarui nilai terbaru
let notifiedFlow = false;
app.post("/send-data", async (req, res) => {
let { tds, flow, ph, suhu } = req.body;
// Konversi ke float dan pastikan 2 desimal
tds = parseFloat(tds).toFixed(2);
flow = parseFloat(flow).toFixed(2);
ph = parseFloat(ph).toFixed(2);
suhu = parseFloat(suhu).toFixed(2);
// Pastikan tetap float
tds = parseFloat(tds);
flow = parseFloat(flow);
ph = parseFloat(ph);
suhu = parseFloat(suhu);
if (isNaN(tds) || isNaN(flow) || isNaN(ph) || isNaN(suhu)) {
return res.status(400).send("Semua parameter harus berupa angka.");
}
latestData = { tds, flow, ph, suhu };
console.log("Data diperbarui:", latestData);
// Kirim notifikasi
if (flow >= 100.00 && !notifiedFlow) {
try {
await sock.sendMessage('6281919281102@s.whatsapp.net', {
text: `⚠Peringatan⚠ \nDebit air melebihi batas harian\nTotal Debit: ${flow} Liter`
});
console.log("Notifikasi dikirim ke WhatsApp!");
notifiedFlow = true; // Set status notifikasi agar tidak dikirim berulang
} catch (error) {
console.error("Gagal mengirim notifikasi:", error);
}
}else if (tds<1000){
await sock.sendMessage('6281919281102@s.whatsapp.net', {
text: `⚠Peringatan⚠ \nTDS air melebihi batas\nTDS: ${tds} ppm` 
});
console.log("Notifikasi dikirim ke WhatsApp!");
}else if (ph<6 || ph>9){
await sock.sendMessage('6281919281102@s.whatsapp.net', {
text: `⚠Peringatan⚠ \nTDS air melebihi batas\nTDS: ${tds} ppm` 
});
console.log("Notifikasi dikirim ke WhatsApp!");
}else if (suhu>30){
await sock.sendMessage('6281919281102@s.whatsapp.net', {
text: `⚠Peringatan⚠ \nSuhu air melebihi batas\nSuhu: ${tds} °C` 
});
console.log("Notifikasi dikirim ke WhatsApp!");
}
// Reset status notifikasi jika flow turun di bawah 100
if (flow < 100.00) {
notifiedFlow = false;
}
res.status(200).send("Data berhasil diperbarui.");
});
// Endpoint API untuk mengambil data terbaru
app.get("/get-data", (req, res) => {
res.status(200).json(latestData);
});
// Jalankan server API
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server API berjalan di http://localhost:${PORT}`);
startBot(); // Jalankan bot WhatsApp
});