From b792e7da2ddca21a193df3b77a01f3476bce4663 Mon Sep 17 00:00:00 2001 From: Adrian Bretsch Date: Mon, 11 May 2026 14:14:02 +0200 Subject: [PATCH] =?UTF-8?q?meremaid=20diagrams=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PFLICHTENHEFT_SOFTWARE.md | 178 +++++++++++++++++++++++++++------ 1 file changed, 148 insertions(+), 30 deletions(-) diff --git a/docs/PFLICHTENHEFT_SOFTWARE.md b/docs/PFLICHTENHEFT_SOFTWARE.md index bfb58fa..0e26ca1 100644 --- a/docs/PFLICHTENHEFT_SOFTWARE.md +++ b/docs/PFLICHTENHEFT_SOFTWARE.md @@ -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
sunsynk RS485 · gRPC Miners"] + MOS["Mosquitto MQTT Broker"] + end + subgraph CTRL["CONTROL LAYER"] + REV["RevolutionPi Core+DIO+AIO
Python MQTT · I/O-Treiber"] + end + subgraph FIELD["FIELD LAYER"] + AKT["Miner 1/2 · K10/K11
Rückkühler K2 · WP EVU K7"] + IO["Pumpen P3/P4/P5
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
power
hashrate
temp
power_setpoint (W)
contactor"] + m2 --> m2_props["state
power
hashrate
temp
power_setpoint (W)
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)
state"] + inverter --> inv_p["solar_power
pv1_power
pv2_power
battery_soc
battery_power
battery_voltage
battery_current
battery_temp
grid_power
grid_voltage
grid_freq
load_power
inv_temp"] & inv_e["day_pv_energy
day_load_energy
day_grid_import
day_grid_export"] + temps --> t_props["puffer
warmwasser
aussen
miner1 (alias)
miner2 (alias)"] + safety --> s_props["state
reason"] + setpoints --> sp_props["puffer_target (W)
warmwasser_target (W)
miner1_power_target (W)
miner2_power_target (W)"] + system --> sys_props["revpi/heartbeat
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 + +``` + ### 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
(Parameters & Calibration)"] & io["io_driver.py
(RevPiModIO Layer)"] & mqtt["mqtt_client.py
(Pub/Sub Handler)"] & safety["safety_monitor.py
(DI/State Machine)"] & control["output_controller.py
(Command Execution)"] & sensor["sensor_reader.py
(Analog Conversion)"] & hb["heartbeat.py
(Status Pulse)"] + + style main fill:#E1BEE7,stroke:#AA00FF,stroke-width:2px + style config fill:#ffffff + style io fill:#ffffff + style safety fill:#ffffff +``` + + ### 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 +``` + 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
# Heartbeat, MQTT-Verbindung, Systemstatus"] + F1["01_Deye_RS485
# sunsynk Polling, MQTT-Publish Inverter-Daten"] + F2["02_Energymeter
# Energiezähler Modbus Polling"] + F3["03_Miner_gRPC
# Braiins gRPC Client, Miner-Status, Leistungstuning"] + F4["04_EnergyMgmt
# Energiemanagement-Entscheidungslogik"] + F5["05_HeatMgmt
# Wärmemanagement (Pumpen, Ventile, Rückkühler, WP)"] + F6["06_Modes
# Betriebsmodus-Automat"] + F7["07_Safety
# Safety-State Überwachung, Reaktion"] + F8["08_Alarms
# 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 +``` + + ### 8.3 Flow 01 — Deye RS485 (sunsynk) - sunsynk läuft als separater Python-Systemd-Service