meremaid diagrams hinzugefügt

This commit is contained in:
Adrian Bretschneider 2026-05-11 14:14:02 +02:00
parent df53a2c6a2
commit b792e7da2d

View file

@ -250,34 +250,39 @@ Dieser Abschnitt listet vorgegebene Rahmenbedingungen, die nicht Gegenstand der
Dieser Abschnitt beschreibt die Systemarchitektur auf drei Ebenen (Supervision, Control, Field) und die Kommunikationswege zwischen den Komponenten. Er dient als Orientierung für alle weiteren Kapitel. Dieser Abschnitt beschreibt die Systemarchitektur auf drei Ebenen (Supervision, Control, Field) und die Kommunikationswege zwischen den Komponenten. Er dient als Orientierung für alle weiteren Kapitel.
``` ```mermaid
┌────────────────────────────────────────────────────────────────────┐ ---
│ SUPERVISION LAYER (Intel N100 Site Server) │ config:
│ │ layout: dagre
│ ┌─────────────┐ ┌───────────────┐ ┌────────────────────┐ │ theme: neo
│ │ Mosquitto │ │ Node-RED │ │ sunsynk (Python) │ │ ---
│ │ MQTT Broker│◄──│ Automation │◄──│ RS485 Deye │ │ flowchart TB
│ └──────┬──────┘ └───────┬───────┘ └────────────────────┘ │ subgraph SUP["SUPERVISION LAYER — Intel N100 Site Server"]
│ │ │ │ NRD["Node-RED Automation<br>sunsynk RS485 · gRPC Miners"]
│ │ ┌──────▼──────┐ │ MOS["Mosquitto MQTT Broker"]
│ │ │ gRPC Client │ │ end
│ │ │ (Miners) │ │ subgraph CTRL["CONTROL LAYER"]
│ │ └─────────────┘ │ REV["RevolutionPi Core+DIO+AIO<br>Python MQTT · I/O-Treiber"]
└──────────┼─────────────────────────────────────────────────────────┘ end
│ MQTT (Wired LAN, TCP 1883) subgraph FIELD["FIELD LAYER"]
┌──────────▼─────────────────────────────────────────────────────────┐ AKT["Miner 1/2 · K10/K11<br>Rückkühler K2 · WP EVU K7"]
│ CONTROL LAYER │ IO["Pumpen P3/P4/P5<br>Ventile RV1/RV2 · Sensoren AI"]
│ │ end
│ RevolutionPi (Core + DIO + AIO) ←──► Safety Relay (HW) │ NRD -- pub/sub --> MOS
│ - Python MQTT Client (Dual-channel) │ NRD -- gRPC --> AKT
│ - I/O-Treiber │ MOS -- MQTT TCP 1883 --> REV
└──────┬───────────────────────────────────────────┬────────────────┘ REV L_REV_IO_0@-- DO / AO --> IO
│ DO / AO │ Schützspulen K10/K11
┌──────▼───────────────────────────────────────────▼────────────────┐ style NRD fill:#fff,stroke:#FFD600,color:#1e293b
│ FIELD LAYER │ style MOS fill:#fff,stroke:#FFD600,color:#1e293b
│ Miner 1/2 (K10/K11) | P3/P4/P5 (Pumpen) | RV1/RV2 (Ventile) │ style REV fill:#fff,stroke:#00C853,color:#1e293b
│ K2 (Rückkühler) | K7 (WP EVU) | Sensoren (AI) │ style AKT fill:#fff,stroke:#6366f1,color:#1e293b
└────────────────────────────────────────────────────────────────────┘ style IO fill:#fff,stroke:#6366f1,color:#1e293b
style SUP fill:#FFF9C4,stroke:#FFD600,color:#1e293b
style CTRL fill:#C8E6C9,stroke:#00C853,color:#1e293b
style FIELD fill:#eef2ff,stroke:#6366f1,color:#1e293b
L_REV_IO_0@{ curve: linear }
``` ```
**Grundregel:** Node-RED ist die einzige Quelle für Automatisierungslogik. Der RevPi führt nur aus, was ihm via MQTT befohlen wird, und meldet seinen I/O-Zustand zurück. **Grundregel:** Node-RED ist die einzige Quelle für Automatisierungslogik. Der RevPi führt nur aus, was ihm via MQTT befohlen wird, und meldet seinen I/O-Zustand zurück.
@ -330,6 +335,48 @@ Mosquitto läuft auf dem Site Server. Alle Komponenten kommunizieren über diese
Dieser Abschnitt definiert die vollständige MQTT-Topic-Hierarchie. Die Struktur ist verbindlich — eigenmächtige Abweichungen sind unzulässig (SI-002). Topics ohne explizite Angabe sind lesend (publish-only); als „schreibbar" markierte Topics können von externen Systemen (Node-RED, Home Assistant) beschrieben werden. Dieser Abschnitt definiert die vollständige MQTT-Topic-Hierarchie. Die Struktur ist verbindlich — eigenmächtige Abweichungen sind unzulässig (SI-002). Topics ohne explizite Angabe sind lesend (publish-only); als „schreibbar" markierte Topics können von externen Systemen (Node-RED, Home Assistant) beschrieben werden.
```mermaid
---
config:
layout: elk
theme: mc
look: neo
---
flowchart LR
thermiq["thermiq/"] --> miners["miners/"] & pumps["pumps/"] & valves["valves/"] & cooler["cooler/state (W)"] & hp["heatpump/"] & inverter["inverter/"] & temps["temps/"] & safety["safety/"] & setpoints["setpoints/"] & mode["mode/current (W)"] & system["system/"]
miners --> m1["1/"] & m2["2/"]
m1 --> m1_props["state<br>power<br>hashrate<br>temp<br>power_setpoint (W)<br>contactor"]
m2 --> m2_props["state<br>power<br>hashrate<br>temp<br>power_setpoint (W)<br>contactor"]
pumps --> p3["p3/state"] & p4["p4/setpoint (V)"] & p5["p5/setpoint (V)"]
valves --> rv1["rv1/state (W)"] & rv2["rv2/state (W)"]
hp --> hp_props["evu_sperre (W)<br>state"]
inverter --> inv_p["solar_power<br>pv1_power<br>pv2_power<br>battery_soc<br>battery_power<br>battery_voltage<br>battery_current<br>battery_temp<br>grid_power<br>grid_voltage<br>grid_freq<br>load_power<br>inv_temp"] & inv_e["day_pv_energy<br>day_load_energy<br>day_grid_import<br>day_grid_export"]
temps --> t_props["puffer<br>warmwasser<br>aussen<br>miner1 (alias)<br>miner2 (alias)"]
safety --> s_props["state<br>reason"]
setpoints --> sp_props["puffer_target (W)<br>warmwasser_target (W)<br>miner1_power_target (W)<br>miner2_power_target (W)"]
system --> sys_props["revpi/heartbeat<br>nodered/heartbeat"]
style thermiq stroke:#AA00FF,fill:#E1BEE7
style miners stroke:#00C853,fill:#C8E6C9
style pumps stroke:#00C853,fill:#C8E6C9
style valves stroke:#00C853,fill:#C8E6C9
style cooler stroke:#00C853,fill:#C8E6C9
style hp stroke:#00C853,fill:#C8E6C9
style inverter stroke:#00C853,fill:#C8E6C9
style temps stroke:#00C853,fill:#C8E6C9
style safety stroke:#00C853,fill:#C8E6C9
style setpoints stroke:#00C853,fill:#C8E6C9
style mode stroke:#00C853,fill:#C8E6C9
style system stroke:#00C853,fill:#C8E6C9
style m1_props text-align:left
style m2_props text-align:left
style inv_p text-align:left
style inv_e text-align:left
style t_props text-align:left
style sp_props text-align:left
```
<!--
``` ```
thermiq/ thermiq/
├── miners/ ├── miners/
@ -395,6 +442,7 @@ thermiq/
├── revpi/heartbeat # Unix-Timestamp (sekündlich) ├── revpi/heartbeat # Unix-Timestamp (sekündlich)
└── nodered/heartbeat # Unix-Timestamp (sekündlich) └── nodered/heartbeat # Unix-Timestamp (sekündlich)
``` ```
-->
### 6.2 Publish/Subscribe-Zuordnung ### 6.2 Publish/Subscribe-Zuordnung
@ -508,6 +556,22 @@ Der RevPi ist für folgende Aufgaben zuständig:
### 7.3 Programmstruktur (Python) ### 7.3 Programmstruktur (Python)
```mermaid
---
config:
layout: elk
theme: mc
---
flowchart LR
main["revpi_main.py (Core Logic)"] --> config["config.py<br>(Parameters &amp; Calibration)"] & io["io_driver.py<br>(RevPiModIO Layer)"] & mqtt["mqtt_client.py<br>(Pub/Sub Handler)"] & safety["safety_monitor.py<br>(DI/State Machine)"] & control["output_controller.py<br>(Command Execution)"] & sensor["sensor_reader.py<br>(Analog Conversion)"] & hb["heartbeat.py<br>(Status Pulse)"]
style main fill:#E1BEE7,stroke:#AA00FF,stroke-width:2px
style config fill:#ffffff
style io fill:#ffffff
style safety fill:#ffffff
```
<!--
``` ```
revpi_main.py revpi_main.py
├── config.py # IP, Topics, Schwellwerte, Kalibrierung ├── config.py # IP, Topics, Schwellwerte, Kalibrierung
@ -518,9 +582,31 @@ revpi_main.py
├── sensor_reader.py # AI-Auslesen, Umrechnung, Plausibilität ├── sensor_reader.py # AI-Auslesen, Umrechnung, Plausibilität
└── heartbeat.py # Sekündlicher Heartbeat-Publisher └── heartbeat.py # Sekündlicher Heartbeat-Publisher
``` ```
-->
### 7.4 Zustandsautomat RevPi ### 7.4 Zustandsautomat RevPi
```mermaid
---
config:
layout: elk
theme: mc
---
stateDiagram
direction TB
state RUNNING {
direction TB
[*] --> Normal_Operation
[*] Normal_Operation
}
[*] --> INIT
INIT --> MQTT_CONNECT:Startup
MQTT_CONNECT --> RUNNING:Broker Connected
RUNNING --> SAFETY_TRIPPED:DI_SAFETY_OK == False
SAFETY_TRIPPED --> RUNNING:Reset Signal / OK
RUNNING --> MQTT_LOST:Connection Dropped
MQTT_LOST --> RUNNING:Reconnect Successful
```
<!--
``` ```
INIT INIT
└──► MQTT_CONNECT (warte auf Broker) └──► MQTT_CONNECT (warte auf Broker)
@ -530,6 +616,7 @@ INIT
└──► MQTT_LOST (Verbindung verloren) └──► MQTT_LOST (Verbindung verloren)
└──► RUNNING (nach Reconnect) └──► RUNNING (nach Reconnect)
``` ```
-->
Im Zustand `SAFETY_TRIPPED`: Im Zustand `SAFETY_TRIPPED`:
- Alle AO auf 0 V (Pumpen Minimum) - Alle AO auf 0 V (Pumpen Minimum)
@ -566,6 +653,36 @@ Node-RED läuft auf dem Site Server und ist für folgende Aufgaben zuständig:
### 8.2 Flow-Struktur ### 8.2 Flow-Struktur
```mermaid
---
config:
theme: mc
---
flowchart TB
subgraph Flows["Flows/ (Node-RED Architecture)"]
F0["00_System<br># Heartbeat, MQTT-Verbindung, Systemstatus"]
F1["01_Deye_RS485<br># sunsynk Polling, MQTT-Publish Inverter-Daten"]
F2["02_Energymeter<br># Energiezähler Modbus Polling"]
F3["03_Miner_gRPC<br># Braiins gRPC Client, Miner-Status, Leistungstuning"]
F4["04_EnergyMgmt<br># Energiemanagement-Entscheidungslogik"]
F5["05_HeatMgmt<br># Wärmemanagement (Pumpen, Ventile, Rückkühler, WP)"]
F6["06_Modes<br># Betriebsmodus-Automat"]
F7["07_Safety<br># Safety-State Überwachung, Reaktion"]
F8["08_Alarms<br># Alarmierungslogik, Logging"]
end
style F0 text-align:left
style F1 text-align:left
style F2 text-align:left
style F3 text-align:left
style F4 text-align:left
style F5 text-align:left
style F6 text-align:left
style F7 text-align:left
style F8 text-align:left
style Flows fill:#E1BEE7,stroke:#AA00FF,stroke-width:2px
```
<!--
``` ```
Flows/ Flows/
├── 00_System # Heartbeat, MQTT-Verbindung, Systemstatus ├── 00_System # Heartbeat, MQTT-Verbindung, Systemstatus
@ -578,7 +695,8 @@ Flows/
├── 07_Safety # Safety-State Überwachung, Reaktion ├── 07_Safety # Safety-State Überwachung, Reaktion
└── 08_Alarms # Alarmierungslogik, Logging └── 08_Alarms # Alarmierungslogik, Logging
``` ```
-->
### 8.3 Flow 01 — Deye RS485 (sunsynk) ### 8.3 Flow 01 — Deye RS485 (sunsynk)
- sunsynk läuft als separater Python-Systemd-Service - sunsynk läuft als separater Python-Systemd-Service