analoge eingänge
This commit is contained in:
@@ -6,5 +6,5 @@ NEXT_PUBLIC_USE_MOCK_BACKEND_LOOP_START=false
|
||||
NEXT_PUBLIC_EXPORT_STATIC=false
|
||||
NEXT_PUBLIC_USE_CGI=false
|
||||
# App-Versionsnummer
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.419
|
||||
NEXT_PUBLIC_CPL_MODE=json # json (Entwicklungsumgebung) oder jsmock (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter)
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.420
|
||||
NEXT_PUBLIC_CPL_MODE=jsmock # json (Entwicklungsumgebung) oder jsmock (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter)
|
||||
@@ -5,5 +5,5 @@ NEXT_PUBLIC_CPL_API_PATH=/CPL
|
||||
NEXT_PUBLIC_EXPORT_STATIC=true
|
||||
NEXT_PUBLIC_USE_CGI=true
|
||||
# App-Versionsnummer
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.419
|
||||
NEXT_PUBLIC_APP_VERSION=1.6.420
|
||||
NEXT_PUBLIC_CPL_MODE=production
|
||||
@@ -1,10 +1,10 @@
|
||||
// /apiMockData/SERVICE/analogeEingaengeMockData.js
|
||||
// /apiMockData/SERVICE/analogInputsMockData.js
|
||||
|
||||
var win_analogInputsValues = [4.771072, 5.665244, 0.005467, -0.007468, 0.000002, 0.000001, 0.000001, 0.000007];
|
||||
var win_analogInputsNames = ["AE1", "AE 2", "AE 3", "AE 4", "AE 5", "AE 6", "AE 7", "AE 8"];
|
||||
var win_analogInputsNames = ["Test", "AE 2", "AE 3", "AE 4", "AE 5", "AE 6", "AE 7", "AE 8"];
|
||||
var win_analogInputsOffset = [11.001, 0.0, 0.0, 0, 0.0, 0.0, 0.0, 0.0];
|
||||
var win_analogInputsFactor = [12.001, 1.0, 1.0, 1, 1.0, 1.0, 1.0, 1.0];
|
||||
var win_analogInputsloggerIntervall = [5, 10, 10, 10, 10, 10, 10, 10];
|
||||
var win_analogInputsloggerIntervall = [10, 10, 10, 10, 10, 10, 10, 10];
|
||||
var win_analogInputsUnits = ["V", "V", "V", "V", "mA", "mA", "mA", "mA"];
|
||||
var win_analogInputsWeighting = [0, 0, 0, 0, 0, 0, 0, 0];
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
"use client"; // /components/main/analogeEingaenge/AnalogeEingaengeTable.tsx
|
||||
"use client"; // /components/main/analogInputs/AnalogInputsTable.tsx
|
||||
import React, { useEffect } from "react";
|
||||
import { useDispatch, useSelector } from "react-redux";
|
||||
import { RootState, AppDispatch } from "../../../redux/store";
|
||||
import { fetchAnalogeEingaengeThunk } from "../../../redux/thunks/fetchAnalogeEingaengeThunk";
|
||||
import { RootState, AppDispatch } from "@/redux/store";
|
||||
import { fetchAnalogInputsThunk } from "@/redux/thunks/fetchAnalogInputsThunk";
|
||||
import { Icon } from "@iconify/react";
|
||||
import settingsIcon from "@iconify/icons-mdi/settings";
|
||||
import waveformIcon from "@iconify/icons-mdi/waveform";
|
||||
|
||||
export default function AnalogeEingaengeTable({
|
||||
export default function AnalogInputsTable({
|
||||
setSelectedId,
|
||||
setSelectedInput,
|
||||
setIsSettingsModalOpen,
|
||||
@@ -20,11 +20,11 @@ export default function AnalogeEingaengeTable({
|
||||
const [activeId, setActiveId] = React.useState<number | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
dispatch(fetchAnalogeEingaengeThunk());
|
||||
dispatch(fetchAnalogInputsThunk());
|
||||
}, [dispatch]);
|
||||
|
||||
const analogeEingaenge = useSelector(
|
||||
(state: RootState) => state.analogeEingaengeSlice
|
||||
const analogInputs = useSelector(
|
||||
(state: RootState) => state.analogeInputsSlice
|
||||
);
|
||||
|
||||
const handleSelect = (id: number) => {
|
||||
@@ -53,7 +53,7 @@ export default function AnalogeEingaengeTable({
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{Object.values(analogeEingaenge)
|
||||
{Object.values(analogInputs)
|
||||
.filter((e) => e?.id !== null && e?.id !== undefined)
|
||||
.map((e, index) => (
|
||||
<tr
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"win_da_state": [
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
],
|
||||
"win_da_bezeichnung": [
|
||||
"Ausgang1",
|
||||
"Ausgang11",
|
||||
"Ausgang2",
|
||||
"Ausgang3",
|
||||
"Ausgang4"
|
||||
|
||||
@@ -1,7 +1,19 @@
|
||||
// /apiMockData/SERVICE/analogeEingaengeMockData.js
|
||||
// /mocks/device-cgi-simulator/SERVICE/analogInputsMockData.js
|
||||
|
||||
var win_analogInputsValues = [4.771072, 5.665244, 0.005467, -0.007468, 0.000002, 0.000001, 0.000001, 0.000007];
|
||||
var win_analogInputsNames = ["AE1", "AE 2", "AE 3", "AE 4", "AE 5", "AE 6", "AE 7", "AE 8"];
|
||||
var win_analogInputsValues = [
|
||||
4.771072, 5.665244, 0.005467, -0.007468, 0.000002, 0.000001, 0.000001,
|
||||
0.000007,
|
||||
];
|
||||
var win_analogInputsNames = [
|
||||
"AE1",
|
||||
"AE 2",
|
||||
"AE 3",
|
||||
"AE 4",
|
||||
"AE 5",
|
||||
"AE 6",
|
||||
"AE 7",
|
||||
"AE 8",
|
||||
];
|
||||
var win_analogInputsOffset = [11.001, 0.0, 0.0, 0, 0.0, 0.0, 0.0, 0.0];
|
||||
var win_analogInputsFactor = [12.001, 1.0, 1.0, 1, 1.0, 1.0, 1.0, 1.0];
|
||||
var win_analogInputsloggerIntervall = [5, 10, 10, 10, 10, 10, 10, 10];
|
||||
@@ -1,2 +1,2 @@
|
||||
win_da_state = [1, 1, 1, 1];
|
||||
win_da_bezeichnung = ["Ausgang11", "Ausgang2", "Ausgang3", "Ausgang4"];
|
||||
win_da_state = [0, 1, 1, 1];
|
||||
win_da_bezeichnung = ["Ausgang111", "Ausgang2", "Ausgang3", "Ausgang4"];
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.419",
|
||||
"version": "1.6.420",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.419",
|
||||
"version": "1.6.420",
|
||||
"dependencies": {
|
||||
"@fontsource/roboto": "^5.1.0",
|
||||
"@iconify-icons/ri": "^1.2.10",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cpl-v4",
|
||||
"version": "1.6.419",
|
||||
"version": "1.6.420",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -14,7 +14,7 @@ import Footer from "../components/footer/Footer";
|
||||
// Thunks importieren
|
||||
import { fetchKueDataThunk } from "../redux/thunks/fetchKueDataThunk";
|
||||
import { fetchDigitalOutputsThunk } from "../redux/thunks/fetchDigitalOutputsThunk";
|
||||
import { fetchAnalogeEingaengeThunk } from "../redux/thunks/fetchAnalogeEingaengeThunk";
|
||||
import { fetchAnalogInputsThunk } from "../redux/thunks/fetchAnalogInputsThunk";
|
||||
import { fetchAnalogInputsHistoryThunk } from "../redux/thunks/fetchAnalogInputsHistoryThunk";
|
||||
import { fetchLast20MessagesThunk } from "../redux/thunks/fetchLast20MessagesThunk";
|
||||
import { fetchOpcUaSettingsThunk } from "../redux/thunks/fetchOpcUaSettingsThunk";
|
||||
@@ -50,8 +50,8 @@ function AppContent({ Component, pageProps }: AppProps) {
|
||||
dispatch(fetchDigitalOutputsThunk());
|
||||
} else if (pathname.includes("digitalInputs")) {
|
||||
dispatch(fetchDigitalOutputsThunk()); // 🟠 evtl. anpassen
|
||||
} else if (pathname.includes("analogeEingaenge")) {
|
||||
dispatch(fetchAnalogeEingaengeThunk());
|
||||
} else if (pathname.includes("analogInputs")) {
|
||||
dispatch(fetchAnalogInputsThunk());
|
||||
} else if (pathname.includes("analogHistory")) {
|
||||
dispatch(fetchAnalogInputsHistoryThunk());
|
||||
} else if (pathname.includes("dashboard")) {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
"use client"; ///pages/analogeEingaenge.tsx
|
||||
"use client"; ///pages/analogInputs.tsx
|
||||
import React, { useState, useEffect } from "react";
|
||||
import AnalogeEingaengeTabelle from "../components/main/analogeEingaenge/AnalogeEingaengeTable";
|
||||
import AnalogInputsChart from "../components/main/analogeEingaenge/AnalogInputsChart";
|
||||
import AnalogInputsSettingsModal from "../components/main/analogeEingaenge/AnalogInputsSettingsModal";
|
||||
import { fetchAnalogeEingaengeThunk } from "../redux/thunks/fetchAnalogeEingaengeThunk";
|
||||
import AnalogInputsTable from "../components/main/analogInputs/AnalogInputsTable";
|
||||
import AnalogInputsChart from "../components/main/analogInputs/AnalogInputsChart";
|
||||
import AnalogInputsSettingsModal from "../components/main/analogInputs/AnalogInputsSettingsModal";
|
||||
import { fetchAnalogInputsThunk } from "../redux/thunks/fetchAnalogInputsThunk";
|
||||
import { useAppDispatch } from "../redux/store";
|
||||
|
||||
function AnalogeEingaenge() {
|
||||
function AnalogInputs() {
|
||||
const [selectedId, setSelectedId] = useState<number | null>(null);
|
||||
const [selectedInput, setSelectedInput] = useState<any | null>(null);
|
||||
const [isSettingsModalOpen, setIsSettingsModalOpen] = useState(false);
|
||||
@@ -14,9 +14,9 @@ function AnalogeEingaenge() {
|
||||
|
||||
useEffect(() => {
|
||||
if (typeof window !== "undefined") {
|
||||
dispatch(fetchAnalogeEingaengeThunk());
|
||||
dispatch(fetchAnalogInputsThunk());
|
||||
const interval = setInterval(() => {
|
||||
dispatch(fetchAnalogeEingaengeThunk());
|
||||
dispatch(fetchAnalogInputsThunk());
|
||||
}, 10000);
|
||||
return () => clearInterval(interval);
|
||||
}
|
||||
@@ -30,7 +30,7 @@ function AnalogeEingaenge() {
|
||||
<h2 className="text-xl font-semibold mb-4 text-gray-700">
|
||||
Messwerteingänge
|
||||
</h2>
|
||||
<AnalogeEingaengeTabelle
|
||||
<AnalogInputsTable
|
||||
setSelectedId={setSelectedId}
|
||||
setSelectedInput={setSelectedInput}
|
||||
setIsSettingsModalOpen={setIsSettingsModalOpen}
|
||||
@@ -55,4 +55,4 @@ function AnalogeEingaenge() {
|
||||
);
|
||||
}
|
||||
|
||||
export default AnalogeEingaenge;
|
||||
export default AnalogInputs;
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
// /pages/api/cpl/analogeEingaengeAPIHandler.ts
|
||||
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import path from "path";
|
||||
import fs from "fs/promises";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
) {
|
||||
const filePath = path.join(
|
||||
process.cwd(),
|
||||
"apiMockData",
|
||||
"SERVICE",
|
||||
"analogeEingaengeMockData.js"
|
||||
);
|
||||
|
||||
try {
|
||||
const data = await fs.readFile(filePath, "utf-8");
|
||||
|
||||
res.setHeader("Content-Type", "text/javascript");
|
||||
res.status(200).send(data);
|
||||
} catch (error) {
|
||||
res.status(404).json({ error: "File not found" });
|
||||
}
|
||||
}
|
||||
63
pages/api/cpl/getAnalogInputsHandler.ts
Normal file
63
pages/api/cpl/getAnalogInputsHandler.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
// /pages/api/cpl/getAnalogInputsHandler.ts
|
||||
|
||||
import { NextApiRequest, NextApiResponse } from "next";
|
||||
import path from "path";
|
||||
import fs from "fs";
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
) {
|
||||
const mode = process.env.NEXT_PUBLIC_CPL_MODE;
|
||||
|
||||
if (mode === "json") {
|
||||
const filePath = path.join(
|
||||
process.cwd(),
|
||||
"mocks/api/SERVICE/analogInputsMockData.json"
|
||||
);
|
||||
const content = fs.readFileSync(filePath, "utf-8");
|
||||
const data = JSON.parse(content);
|
||||
return res.status(200).json(data);
|
||||
}
|
||||
|
||||
if (mode === "jsmock") {
|
||||
const filePath = path.join(
|
||||
process.cwd(),
|
||||
"mocks/device-cgi-simulator/SERVICE/analogInputsMockData.js"
|
||||
);
|
||||
const fileContent = fs.readFileSync(filePath, "utf-8");
|
||||
|
||||
function extractArray(name) {
|
||||
const match = fileContent.match(
|
||||
new RegExp(`var\\s+${name}\\s*=\\s*\\[([\\s\\S]*?)\\];`)
|
||||
);
|
||||
return match
|
||||
? match[1].split(",").map((s) => s.trim().replace(/^["']|["']$/g, ""))
|
||||
: [];
|
||||
}
|
||||
|
||||
const result = {
|
||||
win_analogInputsValues: extractArray("win_analogInputsValues").map(
|
||||
Number
|
||||
),
|
||||
win_analogInputsNames: extractArray("win_analogInputsNames"),
|
||||
win_analogInputsOffset: extractArray("win_analogInputsOffset").map(
|
||||
Number
|
||||
),
|
||||
win_analogInputsFactor: extractArray("win_analogInputsFactor").map(
|
||||
Number
|
||||
),
|
||||
win_analogInputsloggerIntervall: extractArray(
|
||||
"win_analogInputsloggerIntervall"
|
||||
).map(Number),
|
||||
win_analogInputsUnits: extractArray("win_analogInputsUnits"),
|
||||
win_analogInputsWeighting: extractArray("win_analogInputsWeighting").map(
|
||||
Number
|
||||
),
|
||||
};
|
||||
|
||||
return res.status(200).json(result);
|
||||
}
|
||||
|
||||
return res.status(400).json({ error: "Unsupported mode" });
|
||||
}
|
||||
@@ -15,7 +15,7 @@ export default async function handler(
|
||||
process.cwd(),
|
||||
"apiMockData",
|
||||
"SERVICE",
|
||||
"analogeEingaengeMockData.js"
|
||||
"analogInputsMockData.js"
|
||||
);
|
||||
|
||||
try {
|
||||
|
||||
@@ -26,7 +26,7 @@ const EinAusgaenge: React.FC = () => {
|
||||
const interval = setInterval(() => {
|
||||
dispatch(fetchDigitaleEingaengeThunk());
|
||||
dispatch(fetchDigitalOutputsThunk());
|
||||
}, 2000);
|
||||
}, 500);
|
||||
|
||||
return () => clearInterval(interval);
|
||||
}, [dispatch]);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// /public/CPL/SERVICE/ae.js
|
||||
// /public/CPL/SERVICE/analogInputs.js
|
||||
//CGI-Variablen
|
||||
var win_analogInputsValues = [<%=AAV01%>,<%=AAV02%>,<%=AAV03%>,<%=AAV04%>,<%=AAV05%>,<%=AAV06%>,<%=AAV07%>,<%=AAV08%>];
|
||||
var win_analogInputsNames=[<%=ACN01%>,<%=ACN02%>,<%=ACN03%>,<%=ACN04%>,<%=ACN05%>,<%=ACN06%>,<%=ACN07%>,<%=ACN08%>];
|
||||
97
redux/slices/analogInputsSlice.ts
Normal file
97
redux/slices/analogInputsSlice.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
// Redux Slice: redux/slices/analogInputsSlice.ts
|
||||
import { createSlice, PayloadAction, createAsyncThunk } from "@reduxjs/toolkit";
|
||||
|
||||
export interface AnalogInput {
|
||||
id: number | null;
|
||||
value: number | null;
|
||||
name: string;
|
||||
uW: boolean;
|
||||
uG: boolean;
|
||||
oW: boolean;
|
||||
oG: boolean;
|
||||
}
|
||||
|
||||
export interface AnalogInputsState {
|
||||
[key: string]: AnalogInput;
|
||||
}
|
||||
|
||||
// Standardwerte für Eingänge
|
||||
const defaultAnalogInput: AnalogInput = {
|
||||
id: null,
|
||||
value: null,
|
||||
name: "",
|
||||
uW: false,
|
||||
uG: false,
|
||||
oW: false,
|
||||
oG: false,
|
||||
};
|
||||
|
||||
// Initialer Zustand
|
||||
const initialState: AnalogInputsState = {
|
||||
win_analogInputs1: { ...defaultAnalogInput },
|
||||
win_analogInputs2: { ...defaultAnalogInput },
|
||||
win_analogInputs3: { ...defaultAnalogInput },
|
||||
win_analogInputs4: { ...defaultAnalogInput },
|
||||
win_analogInputs5: { ...defaultAnalogInput },
|
||||
win_analogInputs6: { ...defaultAnalogInput },
|
||||
win_analogInputs7: { ...defaultAnalogInput },
|
||||
win_analogInputs8: { ...defaultAnalogInput },
|
||||
};
|
||||
|
||||
// Dynamisch Mock-Daten aus `window` abrufen
|
||||
export const loadFromWindow = createAsyncThunk(
|
||||
"analogInputs/loadFromWindow",
|
||||
async (_, { dispatch }) => {
|
||||
const data: Partial<AnalogInputsState> = {};
|
||||
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
const key = `win_analogInputs${i}`;
|
||||
const value = (window as any)[key];
|
||||
|
||||
if (Array.isArray(value) && value.length === 7) {
|
||||
data[key] = {
|
||||
id: value[0],
|
||||
value: value[1],
|
||||
name: value[2],
|
||||
uW: value[3] === 1,
|
||||
uG: value[4] === 1,
|
||||
oW: value[5] === 1,
|
||||
oG: value[6] === 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
dispatch(setAnalogInputs(data)); // ✅ Redux direkt aktualisieren
|
||||
return data;
|
||||
}
|
||||
);
|
||||
|
||||
// Redux Slice
|
||||
const analogInputsSlice = createSlice({
|
||||
name: "analogInputsSlice",
|
||||
initialState,
|
||||
reducers: {
|
||||
setAnalogInput(
|
||||
state,
|
||||
action: PayloadAction<{ key: string; value: AnalogInput }>
|
||||
) {
|
||||
state[action.payload.key] = action.payload.value;
|
||||
},
|
||||
setAnalogInputs(state, action: PayloadAction<Partial<AnalogInputsState>>) {
|
||||
Object.entries(action.payload).forEach(([key, value]) => {
|
||||
if (value) {
|
||||
state[key] = value;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(loadFromWindow.fulfilled, (state, action) => {
|
||||
Object.assign(state, action.payload);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export const { setAnalogInput, setAnalogInputs } = analogInputsSlice.actions;
|
||||
|
||||
export default analogInputsSlice.reducer;
|
||||
@@ -1,101 +0,0 @@
|
||||
// Redux Slice: redux/slices/analogeEingaengeSlice.ts
|
||||
import { createSlice, PayloadAction, createAsyncThunk } from "@reduxjs/toolkit";
|
||||
|
||||
export interface AnalogerEingang {
|
||||
id: number | null;
|
||||
value: number | null;
|
||||
name: string;
|
||||
uW: boolean;
|
||||
uG: boolean;
|
||||
oW: boolean;
|
||||
oG: boolean;
|
||||
}
|
||||
|
||||
export interface AnalogeEingaengeState {
|
||||
[key: string]: AnalogerEingang;
|
||||
}
|
||||
|
||||
// Standardwerte für Eingänge
|
||||
const defaultAnalogerEingang: AnalogerEingang = {
|
||||
id: null,
|
||||
value: null,
|
||||
name: "",
|
||||
uW: false,
|
||||
uG: false,
|
||||
oW: false,
|
||||
oG: false,
|
||||
};
|
||||
|
||||
// Initialer Zustand
|
||||
const initialState: AnalogeEingaengeState = {
|
||||
win_analogeEingaenge1: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge2: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge3: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge4: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge5: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge6: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge7: { ...defaultAnalogerEingang },
|
||||
win_analogeEingaenge8: { ...defaultAnalogerEingang },
|
||||
};
|
||||
|
||||
// Dynamisch Mock-Daten aus `window` abrufen
|
||||
export const loadFromWindow = createAsyncThunk(
|
||||
"analogeEingaenge/loadFromWindow",
|
||||
async (_, { dispatch }) => {
|
||||
const data: Partial<AnalogeEingaengeState> = {};
|
||||
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
const key = `win_analogeEingaenge${i}`;
|
||||
const value = (window as any)[key];
|
||||
|
||||
if (Array.isArray(value) && value.length === 7) {
|
||||
data[key] = {
|
||||
id: value[0],
|
||||
value: value[1],
|
||||
name: value[2],
|
||||
uW: value[3] === 1,
|
||||
uG: value[4] === 1,
|
||||
oW: value[5] === 1,
|
||||
oG: value[6] === 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
dispatch(setAnalogeEingaenge(data)); // ✅ Redux direkt aktualisieren
|
||||
return data;
|
||||
}
|
||||
);
|
||||
|
||||
// Redux Slice
|
||||
const analogeEingaengeSlice = createSlice({
|
||||
name: "analogeEingaengeSlice",
|
||||
initialState,
|
||||
reducers: {
|
||||
setAnalogerEingang(
|
||||
state,
|
||||
action: PayloadAction<{ key: string; value: AnalogerEingang }>
|
||||
) {
|
||||
state[action.payload.key] = action.payload.value;
|
||||
},
|
||||
setAnalogeEingaenge(
|
||||
state,
|
||||
action: PayloadAction<Partial<AnalogeEingaengeState>>
|
||||
) {
|
||||
Object.entries(action.payload).forEach(([key, value]) => {
|
||||
if (value) {
|
||||
state[key] = value;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
extraReducers: (builder) => {
|
||||
builder.addCase(loadFromWindow.fulfilled, (state, action) => {
|
||||
Object.assign(state, action.payload);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
export const { setAnalogerEingang, setAnalogeEingaenge } =
|
||||
analogeEingaengeSlice.actions;
|
||||
|
||||
export default analogeEingaengeSlice.reducer;
|
||||
@@ -11,7 +11,7 @@ import opcuaSettingsReducer from "./slices/opcuaSettingsSlice";
|
||||
import digitalOutputsReducer from "./slices/digitalOutputsSlice";
|
||||
import brushReducer from "./slices/brushSlice";
|
||||
import tdrChartReducer from "./slices/tdrChartSlice";
|
||||
import analogeEingaengeReducer from "./slices/analogeEingaengeSlice";
|
||||
import analogInputsReducer from "./slices/analogInputsSlice";
|
||||
import digitalInputsReducer from "./slices/digitalInputsSlice";
|
||||
import tdrReferenceChartReducer from "./slices/tdrReferenceChartSlice";
|
||||
import loopChartReducer from "./slices/loopChartSlice";
|
||||
@@ -36,7 +36,7 @@ const store = configureStore({
|
||||
systemSettingsSlice: systemSettingsReducer,
|
||||
opcuaSettingsSlice: opcuaSettingsReducer,
|
||||
digitalOutputsSlice: digitalOutputsReducer,
|
||||
analogeEingaengeSlice: analogeEingaengeReducer,
|
||||
analogeInputsSlice: analogInputsReducer,
|
||||
brushSlice: brushReducer,
|
||||
tdrChartSlice: tdrChartReducer,
|
||||
tdrReferenceChartSlice: tdrReferenceChartReducer,
|
||||
|
||||
22
redux/thunks/fetchAnalogInputsThunk.ts
Normal file
22
redux/thunks/fetchAnalogInputsThunk.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
// /redux/thunks/fetchAnalogInputsThunk.ts
|
||||
import { createAsyncThunk } from "@reduxjs/toolkit";
|
||||
import { fetchAnalogInputsService } from "@/services/fetchAnalogInputsService";
|
||||
import { setAnalogInputs } from "@/redux/slices/analogInputsSlice";
|
||||
|
||||
/**
|
||||
* Holt die analogen Eingänge von der API und speichert sie in Redux.
|
||||
*/
|
||||
export const fetchAnalogInputsThunk = createAsyncThunk(
|
||||
"analogeInputs/fetchAnalogInputs",
|
||||
async (_, { dispatch }) => {
|
||||
if (typeof window === "undefined") return; // Server-Side Execution blockieren
|
||||
try {
|
||||
const data = await fetchAnalogInputsService();
|
||||
if (data) {
|
||||
dispatch(setAnalogInputs(data)); // ✅ Redux mit API-Daten füllen
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ Fehler beim Laden der analogen Eingänge:", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -1,22 +0,0 @@
|
||||
// /redux/thunks/fetchAnalogeEingaengeThunk.ts
|
||||
import { createAsyncThunk } from "@reduxjs/toolkit";
|
||||
import { fetchAnalogeEingaengeService } from "../../services/fetchAnalogeEingaengeService";
|
||||
import { setAnalogeEingaenge } from "../slices/analogeEingaengeSlice";
|
||||
|
||||
/**
|
||||
* Holt die analogen Eingänge von der API und speichert sie in Redux.
|
||||
*/
|
||||
export const fetchAnalogeEingaengeThunk = createAsyncThunk(
|
||||
"analogeEingaenge/fetchAnalogeEingaenge",
|
||||
async (_, { dispatch }) => {
|
||||
if (typeof window === "undefined") return; // Server-Side Execution blockieren
|
||||
try {
|
||||
const data = await fetchAnalogeEingaengeService();
|
||||
if (data) {
|
||||
dispatch(setAnalogeEingaenge(data)); // ✅ Redux mit API-Daten füllen
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("❌ Fehler beim Laden der analogen Eingänge:", error);
|
||||
}
|
||||
}
|
||||
);
|
||||
47
services/fetchAnalogInputsService.ts
Normal file
47
services/fetchAnalogInputsService.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
// services/fetchAnalogInputsService.ts
|
||||
|
||||
export const fetchAnalogInputsService = async () => {
|
||||
const mode = process.env.NEXT_PUBLIC_CPL_MODE;
|
||||
|
||||
if (mode === "production") {
|
||||
const scriptUrl = "/CPL?/CPL/SERVICE/analogInputs.js";
|
||||
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
const script = document.createElement("script");
|
||||
script.src = scriptUrl;
|
||||
script.async = true;
|
||||
script.onload = () => resolve();
|
||||
script.onerror = () => reject("❌ Fehler beim Laden der analogInputs.js");
|
||||
document.body.appendChild(script);
|
||||
});
|
||||
|
||||
const win = window as any;
|
||||
|
||||
return Array.from({ length: 8 }, (_, i) => ({
|
||||
id: i + 1,
|
||||
value: parseFloat(win.win_analogInputsValues[i]),
|
||||
label: win.win_analogInputsNames[i],
|
||||
unit: win.win_analogInputsUnits[i],
|
||||
offset: parseFloat(win.win_analogInputsOffset[i]),
|
||||
factor: parseFloat(win.win_analogInputsFactor[i]),
|
||||
interval: parseInt(win.win_analogInputsloggerIntervall[i]),
|
||||
weighting: parseInt(win.win_analogInputsWeighting[i]),
|
||||
}));
|
||||
} else {
|
||||
const res = await fetch("/api/cpl/getAnalogInputsHandler");
|
||||
if (!res.ok) throw new Error("❌ Fehler beim Laden der analogen Eingänge");
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
return data.win_analogInputsValues.map((value: number, i: number) => ({
|
||||
id: i + 1,
|
||||
value,
|
||||
label: data.win_analogInputsNames[i],
|
||||
unit: data.win_analogInputsUnits[i],
|
||||
offset: parseFloat(data.win_analogInputsOffset[i]),
|
||||
factor: parseFloat(data.win_analogInputsFactor[i]),
|
||||
interval: parseInt(data.win_analogInputsloggerIntervall[i]),
|
||||
weighting: parseInt(data.win_analogInputsWeighting[i]),
|
||||
}));
|
||||
}
|
||||
};
|
||||
@@ -1,55 +0,0 @@
|
||||
// services/fetchAnalogeEingaengeService.ts
|
||||
|
||||
export const fetchAnalogeEingaengeService = async (): Promise<Record<
|
||||
string,
|
||||
any
|
||||
> | null> => {
|
||||
try {
|
||||
if (typeof window === "undefined") return null;
|
||||
|
||||
const isDevelopment = process.env.NEXT_PUBLIC_NODE_ENV === "development";
|
||||
|
||||
const scriptSrc = isDevelopment
|
||||
? "/api/cpl/analogeEingaengeAPIHandler"
|
||||
: "/CPL?/CPL/SERVICE/ae.js";
|
||||
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
const script = document.createElement("script");
|
||||
script.src = scriptSrc;
|
||||
script.async = true;
|
||||
script.onload = () => resolve();
|
||||
script.onerror = () => reject(`❌ Error loading ${scriptSrc}`);
|
||||
document.body.appendChild(script);
|
||||
});
|
||||
|
||||
// Now read the real variables
|
||||
const values = (window as any).win_analogInputsValues || [];
|
||||
const names = (window as any).win_analogInputsNames || [];
|
||||
const units = (window as any).win_analogInputsUnits || [];
|
||||
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 || [];
|
||||
|
||||
const result: Record<string, any> = {};
|
||||
|
||||
for (let i = 0; i < values.length; i++) {
|
||||
result[`analogInput${i + 1}`] = {
|
||||
id: i + 1,
|
||||
value: values[i],
|
||||
name: names[i],
|
||||
unit: units[i],
|
||||
factor: factor[i],
|
||||
offset: offset[i],
|
||||
weighting: weighting[i],
|
||||
loggerInterval: loggerInterval[i],
|
||||
};
|
||||
}
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
console.error("❌ Error loading analog inputs:", error);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
@@ -21,8 +21,8 @@ export async function loadWindowVariables(): Promise<{
|
||||
scripts.push(isDev ? "digitaleEingaengeAPIHandler" : "de.js");
|
||||
} else if (pathname.includes("digitalOutputs")) {
|
||||
scripts.push(isDev ? "digitalOutputsAPIHandler" : "da.js");
|
||||
} else if (pathname.includes("analogeEingaenge")) {
|
||||
scripts.push(isDev ? "analogeEingaengeAPIHandler" : "ae.js");
|
||||
} else if (pathname.includes("analogInputs")) {
|
||||
scripts.push(isDev ? "getAnalogInputsHandler" : "analogInputs.js");
|
||||
} else if (pathname.includes("dashboard")) {
|
||||
scripts.push(
|
||||
isDev ? "last20MessagesAPIHandler" : "start.js",
|
||||
|
||||
Reference in New Issue
Block a user