refactor: digitale Ausgänge über eigenen Service und Redux Thunk laden

- neue Datei fetchDigitalOutputs.ts liest win_da_state und win_da_bezeichnung aus window
- fetchDigitalOutputsThunk.ts verwendet den Service und befüllt Redux Slice
- entfernt alte Logik aus loadWindowVariables.ts
- verbessert Performance und Struktur, lädt Ausgänge nur bei Bedarf
This commit is contained in:
ISA
2025-03-26 12:11:59 +01:00
parent 8a4764a372
commit db67ba0709
5 changed files with 50 additions and 70 deletions

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.166"; const webVersion = "1.6.167";
export default webVersion; export default webVersion;

View File

@@ -12,6 +12,7 @@ import { useDispatch } from "react-redux";
import { AppDispatch } from "../redux/store"; import { AppDispatch } from "../redux/store";
import { setDigitalOutputs } from "../redux/slices/digitalOutputsSlice"; import { setDigitalOutputs } from "../redux/slices/digitalOutputsSlice";
import { fetchDigitaleEingaengeThunk } from "../redux/thunks/fetchDigitaleEingaengeThunk"; import { fetchDigitaleEingaengeThunk } from "../redux/thunks/fetchDigitaleEingaengeThunk";
import { fetchDigitalOutputsThunk } from "../redux/thunks/fetchDigitalOutputsThunk";
const EinAusgaenge: React.FC = () => { const EinAusgaenge: React.FC = () => {
const dispatch = useDispatch<AppDispatch>(); const dispatch = useDispatch<AppDispatch>();
const { digitalOutputs, isLoading: isLoadingOutputs } = useDigitalOutputs(); const { digitalOutputs, isLoading: isLoadingOutputs } = useDigitalOutputs();
@@ -74,6 +75,15 @@ const EinAusgaenge: React.FC = () => {
return () => clearInterval(interval); return () => clearInterval(interval);
} }
}, [dispatch]); }, [dispatch]);
//---------------------------------------------------------
useEffect(() => {
dispatch(fetchDigitalOutputsThunk());
const interval = setInterval(() => {
dispatch(fetchDigitalOutputsThunk());
}, 10000);
return () => clearInterval(interval);
}, [dispatch]);
//--------------------------------------------------------- //---------------------------------------------------------
return ( return (

View File

@@ -0,0 +1,13 @@
// ✅ Thunk: /redux/thunks/fetchDigitalOutputsThunk.ts
import { createAsyncThunk } from "@reduxjs/toolkit";
import { fetchDigitalOutputs } from "../../services/fetchDigitalOutputs";
import { setDigitalOutputs } from "../slices/digitalOutputsSlice";
export const fetchDigitalOutputsThunk = createAsyncThunk(
"digitalOutputs/fetch",
async (_, { dispatch }) => {
const outputs = await fetchDigitalOutputs();
dispatch(setDigitalOutputs(outputs));
}
);

View File

@@ -0,0 +1,26 @@
// ✅ Service: /services/fetchDigitalOutputs.ts
export const fetchDigitalOutputs = async () => {
const win = window as any;
const state = win.win_da_state;
const labels = win.win_da_bezeichnung;
if (
Array.isArray(state) &&
Array.isArray(labels) &&
state.length === labels.length
) {
return state.map((status: number, index: number) => ({
id: index + 1,
label: labels[index] || `Ausgang ${index + 1}`,
status: status === 1,
}));
} else {
console.warn("⚠️ Digitale Ausgänge unvollständig oder inkonsistent:", {
state,
labels,
});
return [];
}
};

View File

@@ -1,52 +1,14 @@
// /utils/loadWindowVariables.ts // /utils/loadWindowVariables.ts
import store from "../redux/store";
import { setSystemSettings } from "../redux/slices/systemSettingsSlice";
import {
toggleOpcUaServer,
setOpcUaEncryption,
setOpcUaZustand,
setOpcUaActiveClientCount,
setOpcUaNodesetName,
addOpcUaUser,
removeOpcUaUser,
} from "../redux/slices/opcuaSettingsSlice";
import { setDigitalOutputs } from "../redux/slices/digitalOutputsSlice";
// ✅ Interface für `window`-Objekt zur TypeScript-Sicherheit // ✅ Interface für `window`-Objekt zur TypeScript-Sicherheit
interface CustomWindow extends Window { interface CustomWindow extends Window {
[key: string]: any; [key: string]: any;
} }
// ✅ Interface für System-Einstellungen im Redux-Store
interface SystemSettings {
deviceName: string;
mac1: string;
ip: string;
subnet: string;
gateway: string;
cplInternalTimestamp: string;
ntp1: string;
ntp2: string;
ntp3: string;
ntpTimezone: string;
ntpActive: boolean;
}
// ✅ Interface für OPC-UA Einstellungen im Redux-Store
interface OpcUaSettings {
isEnabled: boolean;
encryption: string;
opcUaZustand: string;
opcUaActiveClientCount: number;
opcUaNodesetName: string;
users: { id: number; username: string; password: string }[];
}
// ✅ Hauptfunktion zum Laden von `window`-Variablen // ✅ Hauptfunktion zum Laden von `window`-Variablen
export async function loadWindowVariables(): Promise<Record<string, any>> { export async function loadWindowVariables(): Promise<Record<string, any>> {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const requiredVars: string[] = [ const requiredVars: string[] = [
"win_de_state",
"win_counter", "win_counter",
"win_flutter", "win_flutter",
"win_kueOnline", "win_kueOnline",
@@ -73,8 +35,6 @@ export async function loadWindowVariables(): Promise<Record<string, any>> {
"win_kueOverflow", "win_kueOverflow",
"win_tdrLast", "win_tdrLast",
"win_appVersion", "win_appVersion",
"win_da_state",
"win_da_bezeichnung",
]; ];
const scripts: string[] = [ const scripts: string[] = [
@@ -132,32 +92,3 @@ export async function loadWindowVariables(): Promise<Record<string, any>> {
}); });
}); });
} }
// ✅ Funktion zum Speichern der digitalen Ausgänge in Redux
const loadAndStoreDigitalOutputs = (win: CustomWindow) => {
console.log("Prüfe digitale Ausgänge in window:");
console.log("win_da_state:", win.win_da_state);
console.log("win_da_bezeichnung:", win.win_da_bezeichnung);
if (
Array.isArray(win.win_da_state) &&
Array.isArray(win.win_da_bezeichnung) &&
win.win_da_state.length === win.win_da_bezeichnung.length
) {
const digitalOutputs = win.win_da_state.map(
(status: number, index: number) => ({
id: index + 1,
label: win.win_da_bezeichnung[index] || `Ausgang ${index + 1}`,
status: status === 1, // Status in Boolean umwandeln
})
);
console.log("Dispatching digitalOutputs:", digitalOutputs);
store.dispatch(setDigitalOutputs(digitalOutputs));
} else {
console.warn("Digitale Ausgänge konnten nicht geladen werden:", {
da_state: win.win_da_state,
da_bezeichnung: win.win_da_bezeichnung,
});
}
};