From bb8b3456478c897c541ea9469d3b52e5f783b0d8 Mon Sep 17 00:00:00 2001 From: ISA Date: Fri, 11 Jul 2025 08:23:15 +0200 Subject: [PATCH] fix: Messwertlinie (m) im DIA0-Modus in DetailModal sichtbar gemacht --- .env.development | 2 +- .env.production | 2 +- CHANGELOG.md | 8 ++ .../LoopMeasurementChart.tsx | 2 +- components/main/system/DetailModal.tsx | 21 +++-- package-lock.json | 4 +- package.json | 2 +- redux/slices/systemChartSlice.ts | 48 +++++++++++ redux/store.ts | 2 + redux/thunks/getLoopChartDataThunk.ts | 2 +- redux/thunks/getSystemChartDataThunk.ts | 35 ++++++++ redux/thunks/thunks.zip | Bin 8257 -> 0 bytes services/fetchSystemChartDataService.ts | 81 ++++++++++++++++++ 13 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 redux/slices/systemChartSlice.ts create mode 100644 redux/thunks/getSystemChartDataThunk.ts delete mode 100644 redux/thunks/thunks.zip create mode 100644 services/fetchSystemChartDataService.ts diff --git a/.env.development b/.env.development index 3bbb89a..21fc9e9 100644 --- a/.env.development +++ b/.env.development @@ -6,6 +6,6 @@ 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.586 +NEXT_PUBLIC_APP_VERSION=1.6.587 NEXT_PUBLIC_CPL_MODE=json # json (Entwicklungsumgebung) oder jsSimulatedProd (CPL ->CGI-Interface-Simulator) oder production (CPL-> CGI-Interface Platzhalter) diff --git a/.env.production b/.env.production index aff8ef5..0d04beb 100644 --- a/.env.production +++ b/.env.production @@ -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.586 +NEXT_PUBLIC_APP_VERSION=1.6.587 NEXT_PUBLIC_CPL_MODE=production \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 96502a3..848d453 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## [1.6.587] – 2025-07-11 + +- fix: Anzeige der Messwertlinie (m) im DIA0-Modus in DetailModal korrigiert + +- Unterscheidung zwischen Durchschnitt (g) und Einzelwert (m) je nach Modus eingebaut +- Fehler behoben, bei dem im DIA0-Modus keine blaue Linie angezeigt wurde + +--- ## [1.6.586] – 2025-07-11 - feat: DetailModal um Min/Max/Durchschnitt ergänzt diff --git a/components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx b/components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx index b7c8498..5923af5 100644 --- a/components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx +++ b/components/main/kabelueberwachung/kue705FO/Charts/LoopMeasurementChart/LoopMeasurementChart.tsx @@ -31,7 +31,7 @@ ChartJS.register( Legend, Filler ); -import { getColor } from "../../../../../../utils/colors"; +import { getColor } from "@/utils/colors"; import { PulseLoader } from "react-spinners"; type LoopMeasurementEntry = { diff --git a/components/main/system/DetailModal.tsx b/components/main/system/DetailModal.tsx index b2df6f1..4ac5d19 100644 --- a/components/main/system/DetailModal.tsx +++ b/components/main/system/DetailModal.tsx @@ -36,10 +36,12 @@ ChartJS.register( ); type ReduxDataEntry = { - t: string; - i: number; - a?: number; - g?: number; + //Alle DIA0 t,m,i,a , DIA1 und DIA2 t,i,a,g + t: string; // Zeitstempel + i: number; // Minimum + a: number; // Maximum + g?: number; // Durchschnitt (optional, falls vorhanden) + m?: number; // aktueller Messwert (optional, falls vorhanden) }; const chartOptions = { @@ -120,7 +122,7 @@ export const DetailModal = ({ datasets: [], }); - const reduxData: ReduxDataEntry[] = useSelector((state: RootState) => { + const reduxData = useSelector((state: RootState) => { switch (selectedKey) { case "+5V": return state.systemspannung5Vplus[zeitraum]; @@ -137,7 +139,7 @@ export const DetailModal = ({ default: return []; } - }); + }) as ReduxDataEntry[]; const isFullScreen = useSelector( (state: RootState) => state.kabelueberwachungChartSlice.isFullScreen @@ -192,8 +194,11 @@ export const DetailModal = ({ tension: 0.1, }, { - label: "Durchschnitt", - data: sortedData.map((p) => ({ x: new Date(p.t), y: p.g })), + label: zeitraum === "DIA0" ? "Messwert" : "Durchschnitt", + data: sortedData.map((p) => ({ + x: new Date(p.t), + y: zeitraum === "DIA0" ? p.m : p.g, + })), borderColor: "rgba(59,130,246,1)", backgroundColor: "rgba(59,130,246,0.3)", borderWidth: 2, diff --git a/package-lock.json b/package-lock.json index 718a62b..c66983b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cpl-v4", - "version": "1.6.586", + "version": "1.6.587", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cpl-v4", - "version": "1.6.586", + "version": "1.6.587", "dependencies": { "@fontsource/roboto": "^5.1.0", "@headlessui/react": "^2.2.4", diff --git a/package.json b/package.json index abd6b0f..3416a62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cpl-v4", - "version": "1.6.586", + "version": "1.6.587", "private": true, "scripts": { "dev": "next dev", diff --git a/redux/slices/systemChartSlice.ts b/redux/slices/systemChartSlice.ts new file mode 100644 index 0000000..ac97862 --- /dev/null +++ b/redux/slices/systemChartSlice.ts @@ -0,0 +1,48 @@ +// /redux/slices/systemChartSlice.ts +import { createSlice } from "@reduxjs/toolkit"; +import { getSystemChartDataThunk } from "@/redux/thunks/getSystemChartDataThunk"; + +interface ChartData { + [mode: string]: { + [type: number]: any; + }; +} + +interface SystemChartState { + data: ChartData; + loading: boolean; + error: string | null; +} + +const initialState: SystemChartState = { + data: {}, + loading: false, + error: null, +}; + +const systemChartSlice = createSlice({ + name: "systemChartSlice", + initialState, + reducers: {}, + extraReducers: (builder) => { + builder + .addCase(getSystemChartDataThunk.pending, (state) => { + state.loading = true; + state.error = null; + }) + .addCase(getSystemChartDataThunk.fulfilled, (state, action) => { + state.loading = false; + const { mode, type } = action.meta.arg; + if (!state.data[mode]) { + state.data[mode] = {}; + } + state.data[mode][type] = action.payload; + }) + .addCase(getSystemChartDataThunk.rejected, (state, action) => { + state.loading = false; + state.error = action.payload as string; + }); + }, +}); + +export default systemChartSlice.reducer; diff --git a/redux/store.ts b/redux/store.ts index c2d1ddf..b363214 100644 --- a/redux/store.ts +++ b/redux/store.ts @@ -38,6 +38,7 @@ import temperaturAdWandlerReducer from "./slices/temperaturAdWandlerSlice"; import temperaturProzessorReducer from "./slices/temperaturProzessorSlice"; import { combineReducers } from "@reduxjs/toolkit"; import { useDispatch, useSelector, TypedUseSelectorHook } from "react-redux"; +import systemChartReducer from "./slices/systemChartSlice"; //--------------------------------------- // 🧠 Nur diese Slices werden persistiert @@ -91,6 +92,7 @@ const rootReducer = combineReducers({ firmwareUpdate: firmwareUpdateReducer, confirmModal: confirmModalReducer, firmwareProgress: firmwareProgressReducer, + systemChartSlice: systemChartReducer, }); const persistedReducer = persistReducer(persistConfig, rootReducer); diff --git a/redux/thunks/getLoopChartDataThunk.ts b/redux/thunks/getLoopChartDataThunk.ts index 16dd3f7..4eb6a1b 100644 --- a/redux/thunks/getLoopChartDataThunk.ts +++ b/redux/thunks/getLoopChartDataThunk.ts @@ -1,6 +1,6 @@ // /redux/thunks/getLoopChartDataThunk.ts import { createAsyncThunk } from "@reduxjs/toolkit"; -import { fetchLoopChartData } from "../../services/fetchLoopChartDataService"; +import { fetchLoopChartData } from "@/services/fetchLoopChartDataService"; interface FetchLoopChartDataParams { mode: "DIA0" | "DIA1" | "DIA2"; diff --git a/redux/thunks/getSystemChartDataThunk.ts b/redux/thunks/getSystemChartDataThunk.ts new file mode 100644 index 0000000..0662f92 --- /dev/null +++ b/redux/thunks/getSystemChartDataThunk.ts @@ -0,0 +1,35 @@ +// /redux/thunks/getSystemChartDataThunk.ts +import { createAsyncThunk } from "@reduxjs/toolkit"; +import { fetchSystemChartData } from "@/services/fetchSystemChartDataService"; + +interface FetchSystemChartDataParams { + mode: "DIA0" | "DIA1" | "DIA2"; + type: number; + slotNumber: number; + vonDatum: string; + bisDatum: string; +} + +export const getSystemChartDataThunk = createAsyncThunk( + "systemChart/fetchSystemChartData", + async (params: FetchSystemChartDataParams, { rejectWithValue }) => { + try { + const data = await fetchSystemChartData( + params.mode, + params.type, + params.slotNumber, + params.vonDatum, + params.bisDatum + ); + + if (!data) { + return rejectWithValue("Keine Daten erhalten"); + } + + return data; + } catch (error: any) { + console.error("❌ Fehler in getSystemChartDataThunk:", error); + return rejectWithValue(error.message || "Unbekannter Fehler"); + } + } +); diff --git a/redux/thunks/thunks.zip b/redux/thunks/thunks.zip deleted file mode 100644 index 7755cc8b2123359e39257ae8086c21add171ce5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8257 zcmb7JbzGDC+ol^NhQMe6r9(QTQ#vFjHE`r$)R6AZ(IB9pfPkW?fJ~4hC5?1SNXR)f zf^@vYqaHY)R}a5EpVc3`uV>fY*H=d!6AOTbhq~n5b3tfl9!zLVXf_ZJYdbk-FcfC1 z=IjFZa96c=_kg*18`!~}9eF+6;a-Gj=vb#e`u1|mfEW$ew3*aytN)4}t^&0kJh8)} zk)Kp)2j`@5I*qt~Ote5KyYJZnD81x*H08J+b^LfH>xp?sVwDhe7=z$WH&TxP&|f6Z z$pO6WQ_0rbJZ3fTnYi5(707Q+_xeMAZfqipJ|i7rj;vsQ&)93j9kc3p>1M=jW-_j8 zX<|lc%E|ML!*tWpyZv_iG|3C4w*!j17l2OaWGWuZ%wr~eukx6e7C8feDrorTv^btG z@%)M0RHvvWv@^F0=DSokVs7=beXxWRK4!usb$-kh7c9a);<`cD<@aVo#=a`2Q=_kZ zWx{#|11Kq4(6qdZ(^ECd2OT(37q#2GSKC5gzem&-dz43BMrl?3_~8|;tBY)O6PG8a zbkuS2EURr_HH*JL@NCp=?p(eSG2da_W(m7O7_mSV2HCVAMlZOogN3I7Gb?&U0jSV8WqePQ*;nQ_5eC0#DPea!K>|jreb&ZhO#G8 zO-oNNH3t}si5H?+m*p+UB2ppr1#ub3y71IIqv^9(nz z^?#DxDvmKl-is}C(deVfPmdc&UTuRasa=a{W8F!Ne=KrB>Y)s4<1v^JJCI3B;~`AM z+Bi1%?D@pR7$1Qd=klabK~xd%I$z*hqAE~uO8xQ@M*K{n`^N2wS(uNU4%m^uGA3p=&hC!+J%Op&cvC_{N1n?mrGFuC6WUL zT+3lIK9LXE5nfaV_)1c3maW3dm2y~Nf{_ey-B`8>drqSX(dr3rIQyVu3ZZUjHZZ6d zPu6{h7{O71cf#tH|KYzrA=NtDgHqOCh)DEaD&_r2QV zy>MEPn#D9`H1R6+;}KhnN}r{D2^y9!aAlCd3Bkz;%E`ER4+=8oqft)Z|E<$$|K)UT zxW{R(UDV@FiJGV+1BC5hOnmy3MpQp`t-7MepK7HJ&%}N}EWOv)SwAELsic*WGO%wS z9W6)LA-HL;e6!lTd%cSG%@MFbw96$G;LQFyVrz9Yz*ujkL-t6P+MklyHfK~}O{yNh zLNun6;@CrCk-uT61{07-wiBJ4JC81;OQdLczqxrkC(tV0+GUDc3$u;ojh9QbffVnN>m+Gh zh>FWbS$qklA0(s*I6dOH-EH7L9{*B>XVA=@Ex!)w<*-4ok*Z0mZ@zxj4KCx_Pc{29?8tFTFRT`11ey zV}{#8%fl?x+by7fcD3Ueq?MX&v;M(rZ;#-V#=5}!ujWxSw*HpJpJAy1cK5i>uL*H? z2irm}9+n6JM^x<(zZ-he_(?6oGVNJ?p_xRbJ|TT9f-fF;o8XOm3i;ubW1B0GBDlzR z&EMy)UdYzSmP*_BOYxPd#4Uh^>3e%`fb@#ZKe0Pj&@%HX@_Qk)e`oke6d6 zE6LU?4zR-QS~_20?f0 zi+LI^dru}5k@p(}^*-jvcQ(0g`^-&_cWApx%$XqmPW5YKrP)g;PRW0p>cAhNsR4tz zDA8{m#0tqy^l-j%|cfBV!Sv8s2=!{?-3u*VqJwkHkMc;FGyQ}#zn@D>xfouMF+#b#x zakmwZZMKIOep#m&EMJ7>db!$01Y#Y7v~vAoYm~8n*CM%K^@S=QXQPwmM^VIrd)&RG ztJf8(mjRP%$%WxNM>m4{;$B>unQ`!9pJu^QadKHMLGwbou)X0_QDp`bHogY$@f}%J zSU+!?*hA7riCP1i~sj%4OKf znGX}}+%<7MW{oAtPXN1&WzJUgza$0^E{|BWqs=`r7?(&Ka|rsp)pYyg(w( zc!&1Kl|U)CnMhcAnjA2CgV)5(3DK|JgsQjA1{9UQ~84ubn*0;d=5DyPjzyHq^ z6Z#Pkx^m79{G_!k^OweR$nl%?5|s>;ij92oOnpkYZ8>=B6PAg?4e1VI>z?u1LvhK0 z2sh&otDRalG@(-uVAWmI-nUA=(({LUS6a`Rr}HE=EtUWXrB$w!Og?4oXjR5Ua#S+! zVt^48TFd76Q{kB0@sqNL)0LAvEM>8k1zrQ-uZ0VCReICW_aRS@p|X75_IPHac4(GK zha>8c=qG+7%?xS$2gwD7w(E+Bk24jBV!KiMlt0-REQaOo8M%5e~mxLp3O@XzC zyHk7vlpE;cZSPBAmz;p1#>fYUK~hh!hsAl-j>B`S|5_H5>U*RGdvim9Y5Fh! z-2NKfyqL??-7BX2B z#0KI9akhpiz}-9{^4|JTn8$y0ogYcJ7n0i#Lc(Tz$!-N|zeVSpmdJh| zJ~HT|na931IihxA5Ioo4-7Wemotza+Ns^px`PzJ_^^FNQKFn}dA@9Z{UziEMnK`+R2NYGRoGyUWZl{XGk^+QJeM^P=)y_}z2Rg?$;0o10U#4Ch-MCqa~ zF;_G;(yWBTinVC!{9G`)EI79g*HMiBx~>20NBZ9G9uTLCCd-e(7>hwazL>JJEC%L<`jUa&v^S+shFOoP6j%NhU97{Op(JCwA#t zGS5rt0SbX_;p^F-BDc*;GQV_gJ%SSn+C|1}#1_fnQeL*pUCG}iDrZrvs*+qiCwMR z1Ot)Z0+vFraeWL$Vc$6l^Q^MZtr!2I&=3aoFn~C@{4P|9ut|RI7ETB`$1qe&Un4w@ ztk=goD(j^m z9thBM2XLfW2-P_kWzli*Gvk^BG8g7;9!`+n9_B4EAdv;VYL5o2tV@?)zfA$drf-ot z%r;e&4DyPnw{EdVcobu8WbJ1n^Ob$E_pwMm^kCB$r6X-tHuj6UY)YCzLK(}8m;_i>qi0jH|vKFvJZV^7v~b#ostw;!fnu3X4#GFz9oS1 z{f@slQ69nmtw-q5zKa?Lih4iCFL`gZJHJbT)AjmCwT2_QPMz|tTB|oPC*AaW%sF$7 zj?=jZw>VlfhT}!Aj{-=^ThO_d+B5kIE2s?@wQY5^$_FtSteCq@+{>k)bTfg)EJT9H zsgmc9z-1zG9iz=j&eGfhTRP-7-%H-*pD%7eqa4La9w*!RjCK2bUx^ubmIYDW+Y+4#+G(v%4P6Latw7@Ka}SNdO;Lxu{>3OQ|O)F&wrW`%K9Z zI!L@F7lPE;D^}^yS`=K_G}dlQ*Vi*bn1@;7n5L|}v&2nQOz&Hva0s2IF_KQiDP7|W zfum==x)pbQISksOPWiHN_9E<)Bbh0$h|~ ze?+}=h%9Nu8f$H1tG(Lt7qs_9MMaS!PAOJn)~|x)48Z~&I&AN6Pd()uGQ(1W`h+ZZ zo}5g{$e{(luO7orHFPk;!PiUeehC!_G#{bTDqN~g=oAgVI-*dZOWNHIQtF~3LHv0I zckS5=lQeWnrKlNMJI(qpVR%KMuRICi0Hc|V8a0{EX&$`N9a*o)a zHYR-DkgNiSi*?wDbHP5h!jL3EDy{(!2s9OJVbGQaXUqdS+95Uu+IYEH0+xM5YF+Hp z>y-YPlMRyudGU#yWxBewT@pN-@$-9P(rYt~odeS^Odf1G0i16WzM%Y4I=E-v3DdGn zyN*7zD0WY`E0ehwjwvp2yid=QdELNXc)6+eS}H+3)&%u6gP^^uWDe0Wz5yLxf2v4F zJm;%rHeyB}5M0CG_09c7!2~E}1AIs9)gxbfj(}$G02a2ha-*uhA&+bO860 zb3E5Bkdn!LTa3)#bjd-`C%$KSVQR17f{m2Z^0E@;gspzUx%nuA^aiY&7kU%a5uRr! zA=_0^BMXs2C}>P zLHY7NuRw&tg~C@>jO>K5fClv<<|4^R!*r5%`E7PG5e9TcgUq5o^Pocb!cww9{+V9t zlvR5g@20UoZ<*^HC8#f8#xncj7@?z?u~eyD9}hNOMsCw+M^+*QC)KAMLpAm%Klk}+ z69ftq+w3rfFOj?(Hl_2dyOh&hv-?IWxTdfAWfy->47st&y}U>$H5bqV`;G}tyBhxR z@I-eBhI)Q^)a>Nl@yzthr$}AyvEyBASkJI5d`Bg@SSR?}4i~Qxn^C|6#f=JFT2|YE zMmrM^q2{h0)erjxzS%XHLBpG`ZQEjKW1sF-+zBgHM1n)bn>OaC6*G+JcA8%#+EKOK z=S?c+EY1G&e$@`HTgn@&-l+#ufsHi#MuXzQgwFu=+nb`9;ZsyY4S;u4b58h6ftV7c z*2Bh(#Ca9FjP*x3Pm5F8!-okQ?phqi#S=2`Xwu0%XEtVM->;vbHF_0xBy$>trbrua zCREK{Kq<(-t|dPw?QgY2@1J@5bcMcXIQnawp(a40fJ<{E4chpryJ&3IkQ;JFRV`pT zh-=E2lHrgi+uaAbMH7rX)EzJDWYqAJ%NH*tXHQmr8?-$pe2}1T(>7`(9(FY^*G>@< z7|&&ipsJ&hj(PVm=SKQ8TANs=d{nqp3OY5seHVLUAJ!AE63*Twqf--iJIyBrNq)XeeqM zAUV*@o0MBwP5U9F(kEYD#JeA!8lbdli0{Lk$`+fr<|(5)uu~iAOArZxWtqPg3sCL5 zVJl|&sMjTktPVuaM4A6wSamRQ2j9z)m{nXO&`-gd^)MziQy(yG9eRB?YdIsjF#>a} zVk}Hpnoe{o+{nLGFcIrcq*Y>MQoO!^_S@FLL~DTF9%W+M2xYOBYeqNvEtX5;l%qgL zNP*d-QqDWQID_qoP69E4ctHyO2!H@Gg^LZJik4hcr}v<;$|}D#>95RsryZ{?X|_vJ z5;Km^qy;9l`S`9LbhGk&rF_m`Tiu$dQT2ouRH%J&?D4{y1{RkhE}m!t97wzbS_{Xh zS+&OPRZdB9AEI0vysZhTd0?x3ax#M**B} z@c&MNv)j^nM<`tS4sfxZ_5b+;r-^)aL!dwBh(Xey_Aj`B{Q~0b_)2jOLXP}9#D6Rv zzc74uBB4HK7#DEX@PEw0zp#F`@176Q_{-<4{}ZUcopF8vbGDYBcK|l3c%P})7ij4} VA+S+Z1`UlAby1)`Q3FrE{U10;I-vjn diff --git a/services/fetchSystemChartDataService.ts b/services/fetchSystemChartDataService.ts new file mode 100644 index 0000000..163b156 --- /dev/null +++ b/services/fetchSystemChartDataService.ts @@ -0,0 +1,81 @@ +// /services/fetchSystemChartDataService.ts +/** + * hier ist nur noch ein Test, wenn nicht gebraucht, kann die Datei gelöscht werden. + */ +const getApiUrl = ( + mode: "DIA0" | "DIA1" | "DIA2", + type: number, + slotNumber: number, + vonDatum: string, + bisDatum: string +) => { + if (!slotNumber) { + console.error("⚠️ Slot-Nummer nicht gesetzt!"); + return ""; + } + // type: 3 → Isolationswiderstand + // type: 4 → Schleifenwiderstand + const typeFolder = + type === 3 + ? "isolationswiderstand" + : type === 4 + ? "schleifenwiderstand" + : "unbekannterTyp"; + + return process.env.NEXT_PUBLIC_NODE_ENV === "development" + ? `/api/cpl/slotDataAPIHandler?slot=${slotNumber}&messart=${typeFolder}&dia=${mode}&vonDatum=${vonDatum}&bisDatum=${bisDatum}` + : `${window.location.origin}/CPL?seite.ACP&${mode}=${formatDate( + vonDatum + )};${formatDate(bisDatum)};${slotNumber};${type};`; +}; + +/** + * Wandelt ein Datum von "YYYY-MM-DD" zu "YYYY;MM;DD" um (für die API-URL). + */ +const formatDate = (dateString: string) => { + const dateParts = dateString.split("-"); + return `${dateParts[0]};${dateParts[1]};${dateParts[2]}`; +}; + +/** + * Holt die Messwerte vom Embedded-System oder einer JSON-Datei. + */ +export const fetchSystemChartData = async ( + mode: "DIA0" | "DIA1" | "DIA2", + type: number, + slotNumber: number, + vonDatum: string, + bisDatum: string +) => { + try { + const apiUrl = getApiUrl(mode, type, slotNumber, vonDatum, bisDatum); + if (!apiUrl) { + throw new Error( + "❌ Keine gültige API-URL! in /services/fetchSystemChartData.ts" + ); + } + + console.log( + `📡 Fetching data from in /services/fetchSystemChartData.ts: ${apiUrl}` + ); + const response = await fetch(apiUrl); + + if (!response.ok) { + throw new Error(`❌ Fehler: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + console.log( + "✅ Daten erfolgreich geladen in /services/fetchSystemChartData.ts:", + data + ); + + return data; + } catch (error) { + console.error( + "❌ Fehler beim Laden der Schleifenmesskurvendaten in /services/fetchSystemChartData.ts:", + error + ); + return null; + } +};