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.
|
||||
|
||||
```
|
||||
┌────────────────────────────────────────────────────────────────────┐
|
||||
│ SUPERVISION LAYER (Intel N100 Site Server) │
|
||||
│ │
|
||||
│ ┌─────────────┐ ┌───────────────┐ ┌────────────────────┐ │
|
||||
│ │ Mosquitto │ │ Node-RED │ │ sunsynk (Python) │ │
|
||||
│ │ MQTT Broker│◄──│ Automation │◄──│ RS485 Deye │ │
|
||||
│ └──────┬──────┘ └───────┬───────┘ └────────────────────┘ │
|
||||
│ │ │ │
|
||||
│ │ ┌──────▼──────┐ │
|
||||
│ │ │ gRPC Client │ │
|
||||
│ │ │ (Miners) │ │
|
||||
│ │ └─────────────┘ │
|
||||
└──────────┼─────────────────────────────────────────────────────────┘
|
||||
│ MQTT (Wired LAN, TCP 1883)
|
||||
┌──────────▼─────────────────────────────────────────────────────────┐
|
||||
│ CONTROL LAYER │
|
||||
│ │
|
||||
│ RevolutionPi (Core + DIO + AIO) ←──► Safety Relay (HW) │
|
||||
│ - Python MQTT Client (Dual-channel) │
|
||||
│ - I/O-Treiber │
|
||||
└──────┬───────────────────────────────────────────┬────────────────┘
|
||||
│ DO / AO │ Schützspulen K10/K11
|
||||
┌──────▼───────────────────────────────────────────▼────────────────┐
|
||||
│ FIELD LAYER │
|
||||
│ Miner 1/2 (K10/K11) | P3/P4/P5 (Pumpen) | RV1/RV2 (Ventile) │
|
||||
│ K2 (Rückkühler) | K7 (WP EVU) | Sensoren (AI) │
|
||||
└────────────────────────────────────────────────────────────────────┘
|
||||
```mermaid
|
||||
---
|
||||
config:
|
||||
layout: dagre
|
||||
theme: neo
|
||||
---
|
||||
flowchart TB
|
||||
subgraph SUP["SUPERVISION LAYER — Intel N100 Site Server"]
|
||||
NRD["Node-RED Automation<br>sunsynk RS485 · gRPC Miners"]
|
||||
MOS["Mosquitto MQTT Broker"]
|
||||
end
|
||||
subgraph CTRL["CONTROL LAYER"]
|
||||
REV["RevolutionPi Core+DIO+AIO<br>Python MQTT · I/O-Treiber"]
|
||||
end
|
||||
subgraph FIELD["FIELD LAYER"]
|
||||
AKT["Miner 1/2 · K10/K11<br>Rückkühler K2 · WP EVU K7"]
|
||||
IO["Pumpen P3/P4/P5<br>Ventile RV1/RV2 · Sensoren AI"]
|
||||
end
|
||||
NRD -- pub/sub --> MOS
|
||||
NRD -- gRPC --> AKT
|
||||
MOS -- MQTT TCP 1883 --> REV
|
||||
REV L_REV_IO_0@-- DO / AO --> IO
|
||||
|
||||
style NRD fill:#fff,stroke:#FFD600,color:#1e293b
|
||||
style MOS fill:#fff,stroke:#FFD600,color:#1e293b
|
||||
style REV fill:#fff,stroke:#00C853,color:#1e293b
|
||||
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.
|
||||
|
|
@ -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.
|
||||
|
||||
```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/
|
||||
├── miners/
|
||||
|
|
@ -395,6 +442,7 @@ thermiq/
|
|||
├── revpi/heartbeat # Unix-Timestamp (sekündlich)
|
||||
└── nodered/heartbeat # Unix-Timestamp (sekündlich)
|
||||
```
|
||||
-->
|
||||
|
||||
### 6.2 Publish/Subscribe-Zuordnung
|
||||
|
||||
|
|
@ -508,6 +556,22 @@ Der RevPi ist für folgende Aufgaben zuständig:
|
|||
|
||||
### 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
|
||||
├── config.py # IP, Topics, Schwellwerte, Kalibrierung
|
||||
|
|
@ -518,9 +582,31 @@ revpi_main.py
|
|||
├── sensor_reader.py # AI-Auslesen, Umrechnung, Plausibilität
|
||||
└── heartbeat.py # Sekündlicher Heartbeat-Publisher
|
||||
```
|
||||
|
||||
-->
|
||||
### 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
|
||||
└──► MQTT_CONNECT (warte auf Broker)
|
||||
|
|
@ -530,6 +616,7 @@ INIT
|
|||
└──► MQTT_LOST (Verbindung verloren)
|
||||
└──► RUNNING (nach Reconnect)
|
||||
```
|
||||
-->
|
||||
|
||||
Im Zustand `SAFETY_TRIPPED`:
|
||||
- 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
|
||||
|
||||
```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/
|
||||
├── 00_System # Heartbeat, MQTT-Verbindung, Systemstatus
|
||||
|
|
@ -578,6 +695,7 @@ Flows/
|
|||
├── 07_Safety # Safety-State Überwachung, Reaktion
|
||||
└── 08_Alarms # Alarmierungslogik, Logging
|
||||
```
|
||||
-->
|
||||
|
||||
### 8.3 Flow 01 — Deye RS485 (sunsynk)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue