fix: Anzeige der analogen Eingänge auf 8 Einträge beschränkt und Chart korrigiert

- Tabelle filtert nun korrekt auf echte analoge Eingänge (ID vorhanden)
- Diagramm zeigt nur echte analoge Eingänge (ID vorhanden)
- Leere oder ungültige Einträge werden nicht mehr angezeigt
- Konsistente Darstellung in Tabelle und Chart
This commit is contained in:
ISA
2025-04-28 11:39:53 +02:00
parent db3ccf06c8
commit 7fead4cc39
8 changed files with 106 additions and 96 deletions

View File

@@ -1,12 +1,23 @@
// /apiMockData/SERVICE/analogeEingaengeMockData.js // /apiMockData/SERVICE/analogeEingaengeMockData.js
var win_analogeEingaenge1 = [1, 0, "Sensor2", 1, 1, 0, 1]; // Eingang 1 var win_analogInputsValues = [
var win_analogeEingaenge2 = [2, 22.91, "Feuchtigkeit", 1, 1, 1, 0]; // Eingang 2 4.771072, 5.665244, 0.005467, -0.007468, 0.000002, 0.000001, 0.000001,
var win_analogeEingaenge3 = [3, 0, "Test", 1, 1, 0, 1]; // Eingang 3 0.000007,
var win_analogeEingaenge4 = [4, 0, "test2", 1, 1, 0, 1]; // Eingang 4 ];
var win_analogeEingaenge5 = [5, 0, "----", 1, 1, 0, 1]; // Eingang 5 var win_analogInputsNames = [
var win_analogeEingaenge6 = [6, 21, "Temperatur", 1, 1, 0, 1]; // Eingang 6 "AE 1",
var win_analogeEingaenge7 = [7, 0, "----", 1, 1, 1, 0]; // Eingang 7 "AE 2",
var win_analogeEingaenge8 = [8, 0, "Test", 1, 1, 0, 1]; // Eingang 8 "AE 3",
"AE 4",
"AE 5",
"AE 6",
"AE 7",
"AE 8",
];
var win_analogInputsUnits = ["V", "V", "V", "V", "mA", "mA", "mA", "mA"];
var win_analogInputsFactor = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
var win_analogInputsOffset = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
var win_analogInputsWeighting = [0, 0, 0, 0, 0, 0, 0, 0];
var win_analogInputsloggerIntervall = [10, 10, 10, 10, 10, 10, 10, 10];
/* /*
ID (z. B. 1, 2, ... 8) → Identifikation des Eingangs ID (z. B. 1, 2, ... 8) → Identifikation des Eingangs

View File

@@ -1,4 +1,5 @@
"use client"; // components/main/analogeEingaenge/AnalogInputsChart.tsx "use client";
// components/main/analogeEingaenge/AnalogInputsChart.tsx
import React from "react"; import React from "react";
import { useSelector } from "react-redux"; import { useSelector } from "react-redux";
import { RootState } from "../../../redux/store"; import { RootState } from "../../../redux/store";
@@ -17,17 +18,15 @@ export default function AnalogInputsChart() {
(state: RootState) => state.analogeEingaengeSlice (state: RootState) => state.analogeEingaengeSlice
); );
// Daten für das Diagramm vorbereiten const chartData = Object.values(analogInputs)
const chartData = Object.values(analogInputs).map((input) => ({ .filter((input) => input?.id !== null && input?.id !== undefined)
name: `Input ${input.id}`, .map((input) => ({
value: input.value ?? 0, // Falls kein Wert vorhanden ist, wird 0 gesetzt name: `Eingang ${input.id}`,
})); Wert: input.value ?? 0,
}));
return ( return (
<div className="w-full h-[350px] bg-white shadow-md rounded-lg p-4 border border-gray-200"> <div className="w-full h-[350px] bg-white shadow-md rounded-lg p-4 border border-gray-200">
<h3 className="text-sm font-semibold mb-2 text-gray-700">
Analog Inputs Chart
</h3>
<ResponsiveContainer width="100%" height="100%"> <ResponsiveContainer width="100%" height="100%">
<LineChart <LineChart
data={chartData} data={chartData}
@@ -39,7 +38,7 @@ export default function AnalogInputsChart() {
<Tooltip /> <Tooltip />
<Line <Line
type="monotone" type="monotone"
dataKey="value" dataKey="Wert"
stroke="#4A90E2" stroke="#4A90E2"
strokeWidth={2} strokeWidth={2}
/> />

View File

@@ -1,4 +1,5 @@
"use client"; // components/main/analogeEingaenge/AnalogeEingaengeTable.tsx "use client";
// components/main/analogeEingaenge/AnalogeEingaengeTable.tsx
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { RootState, AppDispatch } from "../../../redux/store"; import { RootState, AppDispatch } from "../../../redux/store";
@@ -8,14 +9,14 @@ export default function AnalogeEingaengeTable() {
const dispatch = useDispatch<AppDispatch>(); const dispatch = useDispatch<AppDispatch>();
useEffect(() => { useEffect(() => {
dispatch(fetchAnalogeEingaengeThunk()); // ✅ Holt die API-Daten nur im Client dispatch(fetchAnalogeEingaengeThunk());
}, [dispatch]); }, [dispatch]);
const analogeEingaenge = useSelector( const analogeEingaenge = useSelector(
(state: RootState) => state.analogeEingaengeSlice (state: RootState) => state.analogeEingaengeSlice
); );
const [selectedEingang, setSelectedEingang] = useState(null); const [selectedEingang, setSelectedEingang] = useState<any>(null);
const openSettingsModal = (eingang: any) => { const openSettingsModal = (eingang: any) => {
setSelectedEingang(eingang); setSelectedEingang(eingang);
@@ -35,49 +36,32 @@ export default function AnalogeEingaengeTable() {
<th className="border p-1 text-left">Eingang</th> <th className="border p-1 text-left">Eingang</th>
<th className="border p-3 text-left">Wert</th> <th className="border p-3 text-left">Wert</th>
<th className="border p-3 text-left">Bezeichnung</th> <th className="border p-3 text-left">Bezeichnung</th>
{/*
<th className="border p-3 text-center">uW</th>
<th className="border p-3 text-center">uG</th>
<th className="border p-3 text-center">oW</th>
<th className="border p-3 text-center">oG</th>
*/}
<th className="border p-3 text-center">Einstellung</th> <th className="border p-3 text-center">Einstellung</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{Object.values(analogeEingaenge).map((eingang, index) => ( {Object.values(analogeEingaenge)
<tr .filter(
key={index} (eingang) => eingang?.id !== null && eingang?.id !== undefined
className="text-gray-700 hover:bg-gray-50 transition" )
> .map((eingang, index) => (
<td className="border p-3">{eingang.id ?? "-"}</td> <tr
<td className="border p-3">{eingang.value ?? "-"}</td> key={index}
<td className="border p-3">{eingang.name || "----"}</td> className="text-gray-700 hover:bg-gray-50 transition"
{/* >
<td className="border p-3 text-center"> <td className="border p-3">{eingang.id ?? "-"}</td>
{eingang.uW ? "🟢" : "⚪"} <td className="border p-3">{eingang.value ?? "-"}</td>
</td> <td className="border p-3">{eingang.name || "----"}</td>
<td className="border p-3 text-center"> <td className="border p-3 text-center">
{eingang.uG ? "🟢" : "⚪"} <button
</td> onClick={() => openSettingsModal(eingang)}
<td className="border p-3 text-center"> className="text-white bg-blue-500 hover:bg-blue-600 text-xs px-2 py-1 rounded transition"
{eingang.oW ? "🟠" : "⚪"} >
</td>
<td className="border p-3 text-center"> </button>
{eingang.oG ? "🟢" : "⚪"} </td>
</td> </tr>
*/} ))}
<td className="border p-3 text-center">
<button
onClick={() => openSettingsModal(eingang)}
className=" text-white text-xs px-2 py-1 rounded hover:bg-blue-500 transition"
>
</button>
</td>
</tr>
))}
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -102,12 +86,12 @@ export default function AnalogeEingaengeTable() {
<div> <div>
<strong>Einheit:</strong> <strong>Einheit:</strong>
</div> </div>
<div>{selectedEingang.einheit}</div> <div>{selectedEingang.unit}</div>
<div> <div>
<strong>Faktor:</strong> <strong>Faktor:</strong>
</div> </div>
<div>{selectedEingang.faktor}</div> <div>{selectedEingang.factor}</div>
<div> <div>
<strong>Offset:</strong> <strong>Offset:</strong>
@@ -117,12 +101,12 @@ export default function AnalogeEingaengeTable() {
<div> <div>
<strong>Gewichtung:</strong> <strong>Gewichtung:</strong>
</div> </div>
<div>{selectedEingang.gewichtung}</div> <div>{selectedEingang.weighting}</div>
<div> <div>
<strong>Loggerinterval:</strong> <strong>Logger-Intervall:</strong>
</div> </div>
<div>{selectedEingang.loggerinterval} Minuten</div> <div>{selectedEingang.loggerInterval} Minuten</div>
</div> </div>
<div className="flex justify-end mt-6"> <div className="flex justify-end mt-6">

View File

@@ -6,5 +6,5 @@
2: Patch oder Hotfix (Bugfixes oder kleine Änderungen). 2: Patch oder Hotfix (Bugfixes oder kleine Änderungen).
*/ */
const webVersion = "1.6.288"; const webVersion = "1.6.289";
export default webVersion; export default webVersion;

View File

@@ -36,7 +36,7 @@ function AnalogeEingaenge() {
{/* Diagramm als Card */} {/* Diagramm als Card */}
<div className="bg-white shadow-lg rounded-lg p-4 border border-gray-200"> <div className="bg-white shadow-lg rounded-lg p-4 border border-gray-200">
<h2 className="text-xl font-semibold mb-4 text-gray-700"> <h2 className="text-xl font-semibold mb-4 text-gray-700">
Analog Inputs Chart Analoge Eingäne Messkurve
</h2> </h2>
<AnalogInputsChart /> <AnalogInputsChart />
</div> </div>

View File

@@ -1,11 +1,22 @@
var win_analogeEingaenge1 = "<%AAV01%>"; // /public/CPL/SERVICE/ae.js
var win_analogeEingaenge2 = "<%AAV02%>"; //CGI-Variablen
var win_analogeEingaenge3 = "<%AAV03%>"; var win_analogInputsValues = [<%=AAV01%>,<%=AAV02%>,<%=AAV03%>,<%=AAV04%>,<%=AAV05%>,<%=AAV06%>,<%=AAV07%>,<%=AAV08%>];
var win_analogeEingaenge4 = "<%AAV04%>"; var win_analogInputsNames=[<%=ACN01%>,<%=ACN02%>,<%=ACN03%>,<%=ACN04%>,<%=ACN05%>,<%=ACN06%>,<%=ACN07%>,<%=ACN08%>];
var win_analogeEingaenge5 = "<%AAV05%>"; var win_analogInputsUnits=[<%=ACU01%>,<%=ACU02%>,<%=ACU03%>,<%=ACU04%>,<%=ACU05%>,<%=ACU06%>,<%=ACU07%>,<%=ACU08%>];
var win_analogeEingaenge6 = "<%AAV06%>"; var win_analogInputsFactor=[<%=ACF01%>,<%=ACF02%>,<%=ACF03%>,<%=ACF04%>,<%=ACF05%>,<%=ACF06%>,<%=ACF07%>,<%=ACF08%>];
var win_analogeEingaenge7 = "<%AAV07%>"; var win_analogInputsOffset=[<%=ACO01%>,<%=ACO02%>,<%=ACO03%>,<%=ACO04%>,<%=ACO05%>,<%=ACO06%>,<%=ACO07%>,<%=ACO08%>];
var win_analogeEingaenge8 = "<%AAV08%>"; var win_analogInputsWeighting=[<%=ACS01%>,<%=ACS02%>,<%=ACS03%>,<%=ACS04%>,<%=ACS05%>,<%=ACS06%>,<%=ACS07%>,<%=ACS08%>];
var win_analogInputsloggerIntervall =[<%=ACL01%>,<%=ACL02%>,<%=ACL03%>,<%=ACL04%>,<%=ACL05%>,<%=ACL06%>,<%=ACL07%>,<%=ACL08%>];
// CGI responsive Variablen
/*
var win_analogInputsValues = [4.771072,5.665244,0.005467,-0.007468,0.000002,0.000001,0.000001,0.000007];
var win_analogInputsNames=['AE 1','AE 2','AE 3','AE 4','AE 5','AE 6','AE 7','AE 8'];
var win_analogInputsUnits=['V','V','V','V','mA','mA','mA','mA'];
var win_analogInputsFactor=[1.000,1.000,1.000,1.000,1.000,1.000,1.000,1.000];
var win_analogInputsOffset=[0.000,0.000,0.000,0.000,0.000,0.000,0.000,0.000];
var win_analogInputsWeighting=[0,0,0,0,0,0,0,0];
var win_analogInputsloggerIntervall =[10,10,10,10,10,10,10,10];
/* /*
Kontext: Kontext:
Messwert Messwert
@@ -22,3 +33,4 @@ Systemspannungen
Ausgabeformat: Ausgabeformat:
%0.6f %0.6f
*/ */
// var system=[<%=AAV09%>,<%=AAV11%>,<%=AAV15%>,<%=AAV16%>,<%=AAV17%>,<%=AAV18%>];

View File

@@ -0,0 +1 @@
var win_systemVoltTemp=[<%=AAV09%>,<%=AAV11%>,<%=AAV15%>,<%=AAV16%>,<%=AAV17%>,<%=AAV18%>];

View File

@@ -7,46 +7,49 @@ export const fetchAnalogeEingaengeService = async (): Promise<Record<
try { try {
if (typeof window === "undefined") return null; if (typeof window === "undefined") return null;
// Umgebungserkennung: localhost = Entwicklung, alles andere = Produktion
const isDevelopment = process.env.NEXT_PUBLIC_NODE_ENV === "development"; const isDevelopment = process.env.NEXT_PUBLIC_NODE_ENV === "development";
// Skriptpfad abhängig von der Umgebung
const scriptSrc = isDevelopment const scriptSrc = isDevelopment
? "/api/cpl/analogeEingaengeAPIHandler" ? "/api/cpl/analogeEingaengeAPIHandler"
: "/CPL?/CPL/SERVICE/ae.js"; : "/CPL?/CPL/SERVICE/ae.js";
// Skript dynamisch laden
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
const script = document.createElement("script"); const script = document.createElement("script");
script.src = scriptSrc; script.src = scriptSrc;
script.async = true; script.async = true;
script.onload = () => resolve(); script.onload = () => resolve();
script.onerror = () => reject(`Fehler beim Laden von ${scriptSrc}`); script.onerror = () => reject(`Error loading ${scriptSrc}`);
document.body.appendChild(script); document.body.appendChild(script);
}); });
// Analoge Eingänge parsen (1 bis 8) // Now read the real variables
const result: Record<string, any> = {}; const values = (window as any).win_analogInputsValues || [];
for (let i = 1; i <= 8; i++) { const names = (window as any).win_analogInputsNames || [];
const varName = `win_analogeEingaenge${i}`; const units = (window as any).win_analogInputsUnits || [];
const data = (window as any)[varName]; const factor = (window as any).win_analogInputsFactor || [];
const offset = (window as any).win_analogInputsOffset || [];
const weighting = (window as any).win_analogInputsWeighting || [];
const loggerInterval =
(window as any).win_analogInputsloggerIntervall || [];
if (Array.isArray(data)) { const result: Record<string, any> = {};
result[varName] = {
id: data[0], for (let i = 0; i < values.length; i++) {
value: data[1], result[`analogInput${i + 1}`] = {
name: data[2], id: i + 1,
untererWarnwert: data[3] === 1, value: values[i],
untererGrenzwert: data[4] === 1, name: names[i],
obererWarnwert: data[5] === 1, unit: units[i],
obererGrenzwert: data[6] === 1, factor: factor[i],
}; offset: offset[i],
} weighting: weighting[i],
loggerInterval: loggerInterval[i],
};
} }
return result; return result;
} catch (error) { } catch (error) {
console.error("❌ Fehler beim Laden der analogen Eingänge:", error); console.error("❌ Error loading analog inputs:", error);
return null; return null;
} }
}; };