meremaid diagrams hinzugefügt
This commit is contained in:
parent
df53a2c6a2
commit
b792e7da2d
1 changed files with 148 additions and 30 deletions
|
|
@ -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 & 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,6 +695,7 @@ 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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue