Files
CPLv4.0/docs/Architektur/CPL_DataHandling.md
ISA dbb38cc7d8 feat: Digitale Ausgänge vollständig implementiert (Lesen & Schreiben in allen Modi)
- Unterstützung für drei Modi implementiert: json, jsmock und production
- fetchDigitalOutputsService.ts erkennt NEXT_PUBLIC_CPL_MODE und lädt Daten je nach Umgebung
- API-Handler /api/cpl/updateDigitalOutputsHandler verarbeitet POST-Anfragen für json und jsmock
- In production wird Statusänderung per Redirect (window.location.href) an das CPL gesendet
- Redux-Slice für digitale Ausgänge vollständig angebunden
- UI (DigitalOutputsWidget.tsx) zeigt Status und ermöglicht das Umschalten
- Dokumentation als README_digitalOutputs_final.md mit UML-Diagrammen ergänzt
- CHANGELOG.md auf Version 1.6.417 aktualisiert
2025-06-19 09:01:49 +02:00

100 lines
3.2 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📦 Datenverarbeitung in CPL: JSON, jsmock, production
Dieses Dokument beschreibt die Architektur zur Verarbeitung von Digitalausgängen (DA) im CPL-System unter verschiedenen Modi.
## ✅ Unterstützte Modi
- `json` Entwicklung mit lokalen Mock-JSON-Dateien (editierbar)
- `jsmock` Simulation des Geräts mit einer JS-Datei, die `window`-Variablen setzt
- `production` Echte CPL-Hardware mit CGI-Platzhaltern (JS in HTML/JS-Dateien)
---
## 🧩 Datenfluss-Überblick (UML Diagramm)
```mermaid
flowchart TD
A[NEXT_PUBLIC_CPL_MODE] --> B{Modus}
B -->|json| C[API: fetchDigitalOutputsAPIHandler]
C --> D[JSON-Datei (editable)]
B -->|jsmock| E[fetchDigitalOutputsService()]
E --> F[<script> digitalOutputsMockData.js]
F --> G[window.win_da_state / bezeichnung]
B -->|production| H[fetchDigitalOutputsService()]
H --> I[<script> /CPL/digitalOutputs.js]
I --> J[window.win_da_state / bezeichnung]
D & G & J --> K[Redux Store / Slice]
K --> L[Redux Selector]
L --> M[UI: DigitalOutputsWidget.tsx]
```
---
## 🧠 Entscheidungshilfe
| Modus | Quelle | Vorteil | Änderbar |
| ------------ | ------------------------------------------ | ---------------------------- | -------------- |
| `json` | `/mocks/api/SERVICE/*.json` | Schnell editierbar & testbar | ✅ Ja |
| `jsmock` | `/mocks/device-cgi-simulator/SERVICE/*.js` | Realistische Simulation | ❌ Nur per API |
| `production` | `/public/CPL/*.js` | Reale Gerätedaten | ❌ Nein |
---
## 🔁 Aktualisierung der Daten
### json
-`POST /api/cpl/updateDigitalOutputsHandler`
- 📂 Schreibt direkt in JSON-Datei (z.B. `digitaleAusgaengeMockData.json`)
### jsmock
-`GET /api/fake-cpl/updateDigitalOutputsHandler?id=3&value=1`
- ✍️ Ändert `.js` Datei per Regex und überschreibt `win_da_state = [...]`
### production
- ❌ Gerät entscheidet nur lesender Zugriff über `<script>`
- ⚙️ Änderung über CGI-URL z.B. `/digitalOutputs.html?OUT3=1`
---
## 🧪 Tipps
- Verwende `setInterval()` bei `jsmock` oder `production`, um regelmäßig `<script>` neu zu laden
- Bei `json`: nutze Redux-Thunk + Service → API → JSON
- `fetchDigitalOutputsService.ts` kapselt alle Unterschiede sauber ab
---
## 📁 Verzeichnisse
```
/mocks/api/SERVICE/ # JSON-Dateien
/public/CPLmockData/SERVICE/ # jsmock-Skripte
/public/CPL/SERVICE/ # Geräteplatzhalter
/pages/api/fake-cpl/ # GET/UPDATE API für jsmock
/pages/api/cpl/ # JSON- und Gerätelogik
/store/digitalOutputs/ # Redux-Slice & Thunk
```
## 🧩 Redux-Flow Übersicht (Mermaid)
```mermaid
flowchart TD
A[Component: DigitalOutputsWidget] --> B[useEffect]
B --> C[dispatch fetchDigitalOutputsThunk]
C --> D[fetchDigitalOutputsService]
D --> E{Moduswahl}
E -->|json| F[API: /api/cpl/fetchDigitalOutputsAPIHandler]
E -->|jsmock| G[<script> digitalOutputsMockData.js]
E -->|production| H[<script> /CPL/digitalOutputs.js]
F & G & H --> I[Reducer: digitalOutputsSlice]
I --> J[useSelector] --> A
```