"use client"; import { useState, useEffect } from "react"; // Import ikon yang diperlukan import { Activity, Power, ZapOff, AlertTriangle, Lightbulb, Wind, Projector } from "lucide-react"; export default function PowerMonitoringPage() { const fetchPowerStatus = async () => { try { const response = await fetch("http://172.17.172.17:8080/api/hardware/power-status"); const data = await response.json(); // Asumsikan data dari HA berupa string angka, kita update ke room D101 setRooms(prev => prev.map(room => room.name === "Kelas D101" ? { ...room, power: parseFloat(data.power) || 0 } : room )); } catch (err) { console.error("Gagal mengambil data daya:", err); } }; useEffect(() => { // Ambil data awal fetchPowerStatus(); // Set interval untuk update setiap 5 detik agar real-time sesuai HA const interval = setInterval(fetchPowerStatus, 5000); return () => clearInterval(interval); }, []); const [rooms, setRooms] = useState([]); // 1. STATE BARU: Dipisahkan berdasarkan ID Ruangan agar tidak bentrok const [roomDeviceStatus, setRoomDeviceStatus] = useState<{ [roomId: string]: { [deviceName: string]: boolean } }>({}); useEffect(() => { // Simulasi Data Ruangan dari IoT const dummyRooms = [ { id: 1, name: "Kelas D101", power: 1250, isRelayOn: true, lastUpdate: "Baru saja" }, { id: 2, name: "Kelas D102", power: 0, isRelayOn: false, lastUpdate: "2 mnt lalu" }, { id: 3, name: "Kelas D103", power: 45, isRelayOn: true, lastUpdate: "Baru saja" }, { id: 4, name: "Kelas D104", power: 0, isRelayOn: false, lastUpdate: "10 mnt lalu" }, ]; setRooms(dummyRooms); // Inisialisasi status default (semua OFF) untuk setiap ruangan const initialStatus: { [roomId: string]: { [deviceName: string]: boolean } } = {}; dummyRooms.forEach(room => { initialStatus[`room_${room.id}`] = { "Lampu 1": false, "Lampu 2": false, "AC 1": false, "Proyektor": false, }; }); setRoomDeviceStatus(initialStatus); }, []); // 2. FUNGSI HANDLE TOGGLE YANG DIPERBAIKI (Menerima roomId) const handleDeviceToggle = async (roomId: number, roomName: string, deviceName: string) => { const roomIdKey = `room_${roomId}`; const currentStatus = roomDeviceStatus[roomIdKey]?.[deviceName] || false; const actionType = currentStatus ? "off" : "on"; const confirmMsg = `Apakah Anda yakin ingin mematikan ${deviceName} di ${roomName}?`; if (currentStatus && !confirm(confirmMsg)) return; let backendDevice = ""; if (deviceName === 'AC 1') backendDevice = "ac"; else if (deviceName === 'Proyektor') backendDevice = "projector"; else if (deviceName === 'Lampu 1') backendDevice = "lampu1"; else if (deviceName === 'Lampu 2') backendDevice = "lampu2"; try { // Tembak API Golang (Ganti dengan endpoint aslimu jika berbeda) const response = await fetch("http://172.17.172.17:8080/api/hardware/control", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ device: backendDevice, action: actionType }), }); if (response.ok) { // 3. UPDATE STATE HANYA UNTUK RUANGAN YANG DIKLIK setRoomDeviceStatus(prev => ({ ...prev, [roomIdKey]: { ...prev[roomIdKey], [deviceName]: !currentStatus, }, })); } else { const errorData = await response.json(); alert(`GAGAL: ${errorData.error || response.statusText}`); } } catch (error) { console.error("Error API:", error); alert("GAGAL: Tidak dapat terhubung ke Server Golang."); } }; const handleCutOff = (roomName: string) => { if (confirm(`PERINGATAN: Anda yakin ingin mematikan daya secara paksa di ${roomName}?`)) { alert(`Sinyal pemutusan daya dikirim ke Relay Master ${roomName}.`); } }; return (
{/* Header section... */}

Power Monitoring & Control

Pantau konsumsi daya kWh meter dan kendalikan *relay* sirkuit ruangan.

{[...rooms].sort((a, b) => a.name.localeCompare(b.name)).map((room) => { // Ambil status spesifik untuk ruangan ini const roomIdKey = `room_${room.id}`; const currentRoomStatus = roomDeviceStatus[roomIdKey] || {}; return (
{/* Status Badge */}
{room.isRelayOn ? 'Sirkuit Aktif' : 'Sirkuit Terputus'}

{room.name}

{/* Power display... */}
1000 ? 'text-orange-500' : 'text-gray-800'}`}> {room.power} Watts
{room.power > 1000 && (
Beban Tinggi Terdeteksi!
)} {/* 3. PANEL KONTROL IoT BARU DENGAN LOGIKA WARNA DIPERBAIKI */}

IoT Device Control

{/* LAMPU 1 */} {/* LAMPU 2 */} {/* AC 1 */} {/* PROYEKTOR */}
{/* Footer... */}
Update: {room.lastUpdate}
); })}
); }