"use client"; // components/modules/Kue705FO.jsx import React, { useState, useEffect } from "react"; import ReactModal from "react-modal"; import Chart from "chart.js/auto"; import KueModal from "../modales/KueModal"; import "bootstrap-icons/font/bootstrap-icons.css"; // Import Bootstrap Icons function Kue705FO({ isolationswert, schleifenwiderstand, modulName, kueVersion = "V4.19", kueOnline, slotIndex, tdrLocation, alarmStatus, }) { const [currentAlarmStatus, setCurrentAlarmStatus] = useState(false); const [currentModulName, setCurrentModulName] = useState(modulName); const [activeButton, setActiveButton] = useState("Schleife"); const [loopDisplayText, setloopDisplayText] = useState( "Schleifenwiderstand [kOhm]" ); const [isoDisplayText, setIsoDisplayText] = useState("Aderbruch"); const [groundFaultDisplayText, setGroundFaultDisplayText] = useState("Erdschluss"); const [loopFaultDisplayText, setLoopFaultDisplayText] = useState("Schleifenfehler"); const [isoFaultDisplayText, setIsoFaultDisplayText] = useState("Isolationsfehler"); const [loading, setLoading] = useState(false); const [currentDisplayValue, setCurrentDisplayValue] = useState( schleifenwiderstand || "0" ); const [showModal, setShowModal] = useState(false); const [showChartModal, setShowChartModal] = useState(false); // Modal für die Messkurve const [chartData, setChartData] = useState(null); // State für die geladene Chart-Daten const handleOpenModal = () => { setShowModal(true); }; const handleCloseModal = () => { setShowModal(false); }; // Funktion zum Anzeigen des Chart-Modals const handleOpenChartModal = () => { setShowChartModal(true); if (activeButton === "TDR") { loadTDRChartData(); // Lade TDR-Daten, wenn der TDR-Button aktiv ist } else { loadLoopChartData(); // Andernfalls lade die Schleifenmessdaten } }; const handleCloseChartModal = () => { setShowChartModal(false); }; const environment = process.env.NODE_ENV || "production"; let fileData; // Daten laden und den TDR-Chart erstellen const loadTDRChartData = () => { const slot = slotIndex; //const fileData = `../cpl?lastTDR/slot${slot}.json`; // TDR-Daten je nach Slot laden if (environment === "production") { fileData = `/CPL?/CPL/lastTDR/slot${slot}.json`; // Produktions-Pfad } else { fileData = `/CPLmockData/lastTDR/slot${slot}.json`; // Mock-Daten-Pfad für Entwicklung } fetch(fileData) .then((response) => response.json()) .then((data) => { setChartData(data); // Daten setzen createTDRChart(data); // Chart für TDR-Messung erstellen }) .catch((error) => { console.error("Fehler beim Laden der TDR-Messkurvendaten:", error); }); }; // Daten laden und den Schleifenmessungs-Chart erstellen const loadLoopChartData = () => { const slot = slotIndex; //const fileData = `../cpl?4000values/slot${slot}.json`; // Schleifenmessdaten je nach Slot laden if (environment === "production") { fileData = `/CPL?/CPL/4000values/slot${slot}.json`; // Produktions-Pfad } else { fileData = `/CPLmockData/4000values/slot${slot}.json`; // Mock-Daten-Pfad für Entwicklung } fetch(fileData) .then((response) => response.json()) .then((data) => { setChartData(data); // Daten setzen createChart(data, "Schleifenmesskurve"); // Chart für Schleifenmessung erstellen }) .catch((error) => { console.error("Fehler beim Laden der Schleifenmesskurvendaten:", error); }); }; // Funktion zum Erstellen des Charts // Funktion zum Erstellen des Charts const createChart = (data) => { const ctx = document.getElementById("myChart").getContext("2d"); // Funktion zur Umwandlung des Datums in das deutsche Format const formatToGermanDate = (timestamp) => { const date = new Date(timestamp); return new Intl.DateTimeFormat("de-DE", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", second: "2-digit", }).format(date); }; // Ausgabe der Chart-Daten in der Konsole mit Slot-Informationen console.log(`Chart-Daten für Slot ${slotIndex + 1}:`, data); new Chart(ctx, { type: "line", data: { labels: data.map((row) => formatToGermanDate(row.t)).reverse(), // Zeitwerte ins deutsche Format umwandeln und umkehren datasets: [ { label: "Isolationswiderstand (MOhm)", // Einheit hinzugefügt data: data.map((row) => row.m).reverse(), borderColor: "#00AEEF", fill: false, yAxisID: "y", }, { label: "Schleifenwiderstand (kOhm)", // Einheit hinzugefügt data: data.map((row) => row.n).reverse(), borderColor: "black", fill: false, yAxisID: "y1", }, ], }, options: { scales: { y: { type: "linear", position: "left", title: { display: true, text: "MOhm", // Einheit für linke Achse hinzugefügt }, }, y1: { type: "linear", position: "right", title: { display: true, text: "kOhm", // Einheit für rechte Achse hinzugefügt }, }, }, }, }); }; // Funktion zum Erstellen des TDR-Charts const createTDRChart = (dataTDR) => { const ctx = document.getElementById("myChart").getContext("2d"); console.log(`TDR-Daten für Slot ${slotIndex + 1}:`, dataTDR); new Chart(ctx, { type: "line", data: { labels: dataTDR.map((row) => row.t), // Entfernung oder Zeit auf der x-Achse datasets: [ { label: "Pegel", data: dataTDR.map((row) => row.m), // Nur Pegel auf der y-Achse borderColor: "#00AEEF", borderWidth: 1, pointBorderWidth: 0, pointStyle: false, fill: false, }, ], }, options: { scales: { y: { type: "linear", position: "left", }, }, }, }); }; // Funktion für die TDR-Messung const goTDR = () => { //------------------------------------------------- /* const [isClient, setIsClient] = useState(false); useEffect(() => { // This will only run in the client/browser, not on the server setIsClient(true); }, []); if (!isClient) { return null; // or a loading spinner } */ //------------------------------------------------- let slot = slotIndex; if (slot >= 32) { return; } let slotFormat = slot < 10 ? `0${slot}` : `${slot}`; setLoading(true); alert(`TDR wird für Slot ${slot} gestartet...`); fetch(`/CPL?Service/KUEdetailTDR.ACP&KTT${slotFormat}=1&slot=${slot}`, { method: "GET", }) .then((response) => { if (response.ok) { alert(`TDR erfolgreich gestartet für Slot ${slot}`); console.log("TDR erfolgreich gestartet für Slot", slot); } else { console.error("Fehler beim Senden der TDR-Anfrage"); } }) .catch((error) => { console.error("Fehler:", error); }) .finally(() => setLoading(false)); }; // Funktion für die Schleifenmessung const goLoop = () => { let slot = slotIndex; if (slot >= 32) { return; } let slotFormat = slot < 10 ? `0${slot}` : `${slot}`; setLoading(true); // Setze den Ladezustand auf true alert(`Schleifenmessung wird für Slot ${slot} gestartet...`); fetch(`/CPL?Service/KUEdetail.HTML&KS_${slotFormat}=1&slot=${slot}`, { method: "GET", }) .then((response) => { if (response.ok) { alert(`Schleifenmessung erfolgreich gestartet für Slot ${slot}`); console.log("Schleifenmessung erfolgreich gestartet für Slot", slot); } else { alert("Fehler beim Starten der Schleifenmessung."); console.error("Fehler beim Senden der Schleifen-Anfrage"); } }) .catch((error) => { alert("Ein Fehler ist aufgetreten."); console.error("Fehler:", error); }) .finally(() => setLoading(false)); // Ladezustand zurücksetzen }; const handleModulNameChange = (newName) => { setCurrentModulName(newName); }; // Überprüfe, ob ein Modul im Slot vorhanden ist const isModulPresent = kueOnline === 1; // Since you're passing the status directly now const handleButtonClick = (button) => { if (button === "Schleife") { setActiveButton("Schleife"); setloopDisplayText("Schleifenwiderstand [kOhm]"); setCurrentDisplayValue(schleifenwiderstand || "0"); } else if (button === "TDR") { setActiveButton("TDR"); setloopDisplayText("Entfernung [Km]"); setCurrentDisplayValue(tdrLocation || "0"); } }; // Bestimme, welche Funktion ausgeführt wird, basierend auf dem aktiven Button const handleRefreshClick = () => { if (activeButton === "Schleife") { goLoop(); // Wenn Schleife aktiv ist, starte goLoop } else if (activeButton === "TDR") { goTDR(); // Wenn TDR aktiv ist, starte goTDR } }; useEffect(() => { setCurrentModulName(modulName); }, [modulName]); useEffect(() => { setCurrentDisplayValue(schleifenwiderstand); }, [schleifenwiderstand]); useEffect(() => { const updateAlarmStatus = () => { const alarmStatus = (window.kueAlarm1 && window.kueAlarm1[slotIndex]) || (window.kueAlarm2 && window.kueAlarm2[slotIndex]) || (window.kueCableBreak && window.kueCableBreak[slotIndex]) || (window.kueGroundFault && window.kueGroundFault[slotIndex]); setCurrentAlarmStatus(alarmStatus); // Aktualisiere den Alarmstatus }; // Aktualisierung sofort und alle 5 Sekunden updateAlarmStatus(); const interval = setInterval(updateAlarmStatus, 5000); return () => clearInterval(interval); // Bereinigung bei Entladen der Komponente }, [slotIndex]); //------------------------------------------------- // Intervall für den Wechsel der Anzeige zwischen "Aderbruch" und ">200 MOhm" useEffect(() => { if (window.kueCableBreak[slotIndex] === 1) { const intervalId = setInterval(() => { setIsoDisplayText((prevText) => prevText === "Aderbruch" ? ( ) : ( "Aderbruch" ) ); }, 2000); return () => clearInterval(intervalId); } else { setIsoDisplayText(isolationswert || ">200"); } }, [slotIndex, isolationswert]); //------------------------------------------------- useEffect(() => { if (window.kueGroundFault[slotIndex] === 1) { const intervalId = setInterval(() => { setGroundFaultDisplayText((prevText) => prevText === "Erdschluss" ? ( ) : ( "Erdschluss" ) ); }, 2000); // Wechsel alle 2 Sekunden return () => clearInterval(intervalId); } else { setGroundFaultDisplayText(isolationswert || ">200"); // Standardwert, wenn kein Erdschluss vorliegt } }, [slotIndex, isolationswert]); // Intervall für den Wechsel der Anzeige zwischen "Schleifenfehler" und dem Icon useEffect(() => { if (window.kueAlarm2[slotIndex] === 1) { const intervalId = setInterval(() => { setLoopFaultDisplayText((prevText) => prevText === "Schleifenfehler" ? ( ) : ( "Schleifenfehler" ) ); }, 2000); return () => clearInterval(intervalId); } else { setLoopFaultDisplayText(isolationswert || ">200"); } }, [slotIndex, isolationswert]); // Intervall für den Wechsel der Anzeige zwischen "Isolationsfehler" und dem Icon useEffect(() => { if (window.kueAlarm1[slotIndex] === 1) { const intervalId = setInterval(() => { setIsoFaultDisplayText((prevText) => prevText === "Isolationsfehler" ? ( ) : ( "Isolationsfehler" ) ); }, 2000); return () => clearInterval(intervalId); } else { setIsoFaultDisplayText(isolationswert || ">200"); } }, [slotIndex, isolationswert]); //------------------------------------------------ return (
{currentDisplayValue + " KOhm"}
Kein Modul im Slot {slotIndex + 1}