Initial commit: ThermIQ ASP1 documentation
All Markdown documentation files for the ThermIQ smart hybrid heating system. PDFs excluded via .gitignore — generated on demand. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
commit
ba6622bed7
12 changed files with 2279 additions and 0 deletions
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
node_modules/
|
||||||
|
.env
|
||||||
|
*.env
|
||||||
|
*.secret
|
||||||
|
*.key
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
.DS_Store
|
||||||
|
*.pdf
|
||||||
|
*.PDF
|
||||||
403
Angebot/Angebot_ThermIQ_ASP1.md
Normal file
403
Angebot/Angebot_ThermIQ_ASP1.md
Normal file
|
|
@ -0,0 +1,403 @@
|
||||||
|
# VERBINDLICHES ANGEBOT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Auftragnehmer
|
||||||
|
|
||||||
|
**[DEIN NAME / FIRMA]**
|
||||||
|
[Straße und Hausnummer]
|
||||||
|
[PLZ Ort]
|
||||||
|
Telefon: [Telefonnummer]
|
||||||
|
E-Mail: [E-Mail-Adresse]
|
||||||
|
USt-IdNr.: [DE XXXXXXXXX]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Auftraggeber
|
||||||
|
|
||||||
|
**[NAME DES AUFTRAGGEBERS]**
|
||||||
|
[Straße und Hausnummer]
|
||||||
|
[PLZ Ort]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
| Angebotsnummer | Datum | Gültig bis |
|
||||||
|
|---|---|---|
|
||||||
|
| AN-2026-ThermIQ-001 | 29.03.2026 | 29.06.2026 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Betreff
|
||||||
|
|
||||||
|
**Verbindliches Angebot: Planung, Lieferung, Installation und Inbetriebnahme des Automatisierungsschaltschranks ASP1 sowie SPS-Programmierung und Home-Assistant-Integration für das ThermIQ Hybridheizungssystem**
|
||||||
|
Standort: Walda, Deutschland
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Projektbeschreibung
|
||||||
|
|
||||||
|
Gegenstand dieses Angebots ist die vollständige Realisierung des Automatisierungsschaltschranks ASP1 für das ThermIQ-System am Standort Walda. Das System steuert und überwacht die kombinierte Nutzung von Abwärme aus Kryptomining-Maschinen (2× Antminer S19J), einer Wärmepumpe (Buderus WLW186i), eines Hybrid-Solar-Wechselrichters (Deye) sowie der zugehörigen Hydraulikkomponenten (Pumpen, Ventile, Rückkühler, Puffer- und Warmwasserspeicher).
|
||||||
|
|
||||||
|
Der Leistungsumfang umfasst:
|
||||||
|
- Planung und Dokumentation
|
||||||
|
- Aufbau und Verdrahtung des Schaltschranks ASP1
|
||||||
|
- Feldverkabelung (Pumpen, Ventile, Sicherheitsschaltung, Netzwerk)
|
||||||
|
- Inbetriebnahme und Funktionstest
|
||||||
|
- SPS-Programmierung (RevolutionPi, Node-RED, MQTT)
|
||||||
|
- Home Assistant Konfiguration (Monitoring-Dashboard, Phase 1)
|
||||||
|
- Erstellung der vollständigen Materialliste (Bestandteil dieses Angebots)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Leistungsbeschreibung und Stundenkalkulation
|
||||||
|
|
||||||
|
Stundensatz: **80,00 € / h (netto)**
|
||||||
|
|
||||||
|
### 2.1 Planung
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Schaltschrankplanung, Stromlaufpläne (AC/DC), Klemmenpläne | 8,0 h |
|
||||||
|
| Systemarchitektur, I/O-Mapping RevolutionPi, Dokumentation | 4,0 h |
|
||||||
|
| **Zwischensumme Planung** | **12,0 h** |
|
||||||
|
|
||||||
|
**Kosten Planung: 12,0 h × 80,00 € = 960,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.2 Schaltschrank-Installation
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Mechanischer Aufbau: Schrank, Hutschienen, Kabelkanäle, Beschriftung | 6,0 h |
|
||||||
|
| Verdrahtung AC-Teil: FI/LS Q0, LS-Schutzschalter, Schütze K10/K11, AC-Klemmen | 8,0 h |
|
||||||
|
| Verdrahtung DC-Teil: Netzteil, RevolutionPi (Core+DIO+AIO), Relais K2–K7, Sicherheitsrelais, DC-Klemmen | 6,0 h |
|
||||||
|
| **Zwischensumme Schaltschrank-Installation** | **20,0 h** |
|
||||||
|
|
||||||
|
**Kosten Schaltschrank-Installation: 20,0 h × 80,00 € = 1.600,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.3 Feldverkabelung
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Pumpen P3, P4, P5 (230 V AC + 0-10 V Steuerkabel abgeschirmt) | 4,0 h |
|
||||||
|
| Ventile RV1, RV2 (Belimo CQ230A, 230 V AC) | 3,0 h |
|
||||||
|
| Sicherheitsschaltung: Not-Aus 1 + 2, FLOW OK, TEMP MAX (NC-Kontakte) | 3,0 h |
|
||||||
|
| Netzwerkverkabelung (Ethernet, Fix-IP), Miner-Schukosteckdosen | 3,0 h |
|
||||||
|
| **Zwischensumme Feldverkabelung** | **13,0 h** |
|
||||||
|
|
||||||
|
**Kosten Feldverkabelung: 13,0 h × 80,00 € = 1.040,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.4 Inbetriebnahme
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Sicherheitskreis-Test (E-Stop, FLOW OK, TEMP MAX, Rückführkreis) | 4,0 h |
|
||||||
|
| RevolutionPi I/O-Test (alle DO, DI, AO 0-10 V, AI Sensoren) | 4,0 h |
|
||||||
|
| Kommunikationstest: MQTT (RevPi ↔ Site Server), gRPC Miner, RS485 Deye/Energiezähler | 4,0 h |
|
||||||
|
| Systemintegrations- und Funktionstest: Energiemanagement, Wärmeverteilung, Notabschaltung | 8,0 h |
|
||||||
|
| **Zwischensumme Inbetriebnahme** | **20,0 h** |
|
||||||
|
|
||||||
|
**Kosten Inbetriebnahme: 20,0 h × 80,00 € = 1.600,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.5 SPS-Programmierung (RevolutionPi / Node-RED)
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Node-RED Basis-Setup, MQTT-Broker-Konfiguration (Mosquitto), Topic-Struktur | 12,0 h |
|
||||||
|
| Steuerlogik: Energiemanagement (Solar, Batterie, Netz), Wärmeverteilung | 24,0 h |
|
||||||
|
| gRPC-Client Integration: Antminer S19J (Braiins OS), Power-Tuning | 12,0 h |
|
||||||
|
| RS485 Modbus RTU: Deye Hybrid-Wechselrichter (sunsynk), Energiezähler | 14,0 h |
|
||||||
|
| Sicherheitslogik, Fallback-Zustände, Alarmierung, Watchdog | 10,0 h |
|
||||||
|
| **Zwischensumme SPS-Programmierung** | **72,0 h** |
|
||||||
|
|
||||||
|
**Kosten SPS-Programmierung: 72,0 h × 80,00 € = 5.760,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.6 Home Assistant Konfiguration (Monitoring-Dashboard Phase 1)
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Installation und Grundkonfiguration Home Assistant auf Site Server | 2,0 h |
|
||||||
|
| MQTT-Integration: alle Sensoren, Schaltzustände, Leistungswerte | 4,0 h |
|
||||||
|
| Lovelace-Dashboard: Echtzeit-Visualisierung (Temperaturen, SOC, Miner-Status) | 2,0 h |
|
||||||
|
| **Zwischensumme Home Assistant** | **8,0 h** |
|
||||||
|
|
||||||
|
**Kosten Home Assistant: 8,0 h × 80,00 € = 640,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2.7 Materialliste Erstellung
|
||||||
|
|
||||||
|
| Tätigkeit | Stunden |
|
||||||
|
|---|---|
|
||||||
|
| Erstellung der vollständigen Materialliste, Stückliste, Mengenermittlung | 4,0 h |
|
||||||
|
| **Zwischensumme Materialliste** | **4,0 h** |
|
||||||
|
|
||||||
|
**Kosten Materialliste: 4,0 h × 80,00 € = 320,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Arbeitskostenübersicht
|
||||||
|
|
||||||
|
| Leistungspaket | Stunden | Nettobetrag |
|
||||||
|
|---|---|---|
|
||||||
|
| 2.1 Planung | 12,0 h | 960,00 € |
|
||||||
|
| 2.2 Schaltschrank-Installation | 20,0 h | 1.600,00 € |
|
||||||
|
| 2.3 Feldverkabelung | 13,0 h | 1.040,00 € |
|
||||||
|
| 2.4 Inbetriebnahme | 20,0 h | 1.600,00 € |
|
||||||
|
| 2.5 SPS-Programmierung | 72,0 h | 5.760,00 € |
|
||||||
|
| 2.6 Home Assistant Konfiguration | 8,0 h | 640,00 € |
|
||||||
|
| 2.7 Materialliste Erstellung | 4,0 h | 320,00 € |
|
||||||
|
| **Gesamt Arbeitsleistung** | **149,0 h** | **11.920,00 €** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Materialliste
|
||||||
|
|
||||||
|
Alle Preise sind Netto-Schätzpreise. Tatsächliche Einkaufspreise können geringfügig abweichen. Die Materialbeschaffung erfolgt durch den Auftragnehmer; Belege werden auf Wunsch vorgelegt.
|
||||||
|
|
||||||
|
### 3.1 Schaltschrank-Gehäuse und Montagematerial
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M01 | Stahlblechschaltschrank ca. 600×600×250 mm, IP54 (z.B. Rittal AE) | 1 St. | 280,00 € | 280,00 € |
|
||||||
|
| M02 | Montageplatte für M01 | 1 St. | 35,00 € | 35,00 € |
|
||||||
|
| M03 | Hutschienen 35 mm, 2 m (3 Stück) | 3 St. | 8,00 € | 24,00 € |
|
||||||
|
| M04 | Kabelkanal 40×60 mm, 2 m (4 Stück) | 4 St. | 12,00 € | 48,00 € |
|
||||||
|
| M05 | Aderendhülsen-Sortiment (0,5–6 mm²) | 1 Set | 18,00 € | 18,00 € |
|
||||||
|
| M06 | Kabelbinder-Set, Beschriftungsschilder, Kleinmaterial | 1 Pauschal | 35,00 € | 35,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.1: 440,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.2 AC-Schutzgeräte
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M07 | FI/LS-Kombination Q0, 3P+N, 32 A, 30 mA Typ A (z.B. Siemens 5SU1354-6KK32) | 1 St. | 140,00 € | 140,00 € |
|
||||||
|
| M08 | Leitungsschutzschalter LS-Miner 1, 1P, 16 A, Char. B (z.B. Siemens 5SY4116-7) | 1 St. | 28,00 € | 28,00 € |
|
||||||
|
| M09 | Leitungsschutzschalter LS-Miner 2, 1P, 16 A, Char. B | 1 St. | 28,00 € | 28,00 € |
|
||||||
|
| M10 | Leitungsschutzschalter LS-Pumpen, 1P, 10 A, Char. B | 1 St. | 22,00 € | 22,00 € |
|
||||||
|
| M11 | Leitungsschutzschalter LS-Ventile, 1P, 6 A, Char. B | 1 St. | 20,00 € | 20,00 € |
|
||||||
|
| M12 | Leitungsschutzschalter LS-Rückkühler, 1P, 10 A, Char. B | 1 St. | 22,00 € | 22,00 € |
|
||||||
|
| M13 | Leitungsschutzschalter LS-Netzteil/SPS, 1P, 6 A, Char. B | 1 St. | 20,00 € | 20,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.2: 280,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3 Schütze (Leistungsschütze Miner)
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M14 | Schütz K10 (Miner 1), 16 A, 24 V DC Spule (z.B. Siemens 3RT2016-1BB42) | 1 St. | 48,00 € | 48,00 € |
|
||||||
|
| M15 | Schütz K11 (Miner 2), 16 A, 24 V DC Spule | 1 St. | 48,00 € | 48,00 € |
|
||||||
|
| M16 | Hilfskontaktblock für K10/K11, 1 NO + 1 NC (je 1 Stück) | 2 St. | 12,00 € | 24,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.3: 120,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.4 Relaismodule K2–K7
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M17 | Relaismodul 24 V DC, 8 A, 230 V AC (z.B. Phoenix MC 24VDC/1/AC) inkl. Sockel, je Stück | 6 St. | 16,00 € | 96,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.4: 96,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5 Sicherheitsrelais
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M18 | Sicherheitsrelais zweikanalig mit Rückführkreis, 24 V DC (z.B. Pilz PNOZ s3 24VDC 2 n/o 1 n/c) | 1 St. | 280,00 € | 280,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.5: 280,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.6 RevolutionPi (SPS-System)
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M19 | RevPi Core 3+ (Linux-CPU-Modul, KUNBUS) | 1 St. | 199,00 € | 199,00 € |
|
||||||
|
| M20 | RevPi DIO (Digital I/O Modul) | 1 St. | 149,00 € | 149,00 € |
|
||||||
|
| M21 | RevPi AIO (Analog I/O Modul, 0-10 V, 4-20 mA) | 1 St. | 179,00 € | 179,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.6: 527,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.7 Netzwerk und Site Server
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M22 | 24 V DC Schaltnetzteil 5 A, DIN-Rail (z.B. Phoenix QUINT 24V/5A) | 1 St. | 130,00 € | 130,00 € |
|
||||||
|
| M23 | Industrial Ethernet Switch, 5-Port, unmanaged, DIN-Rail | 1 St. | 90,00 € | 90,00 € |
|
||||||
|
| M24 | Site Server Intel N100 Mini-PC (z.B. Beelink EQ12, 16 GB RAM, 500 GB SSD) | 1 St. | 185,00 € | 185,00 € |
|
||||||
|
| M25 | DIN-Rail-Adapter / Halterung für Mini-PC | 1 St. | 25,00 € | 25,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.7: 430,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.8 Klemmen und Verteiler
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M26 | Reihenklemmen 2,5 mm² PE/N-Klemmen (z.B. Phoenix PT 2,5-PE, 50 Stück) | 1 Set | 55,00 € | 55,00 € |
|
||||||
|
| M27 | Trennklemmen 24 V DC-Kreis, 2,5 mm² (z.B. Wago 2002-1201, 30 Stück) | 1 Set | 40,00 € | 40,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.8: 95,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.9 Kabel (Schrank-intern und Feldleitungen)
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M28 | H05VV-F 3×1,5 mm², Steuerkabel für Schrank-interne Verdrahtung, 20 m | 20 m | 2,00 €/m | 40,00 € |
|
||||||
|
| M29 | LiYCY 2×0,5 mm² abgeschirmt, 0-10 V Steuerkabel (Pumpen P4/P5), 20 m | 20 m | 2,20 €/m | 44,00 € |
|
||||||
|
| M30 | CAT6 Patchkabel, je 2 m (5 Stück) | 5 St. | 4,00 € | 20,00 € |
|
||||||
|
| M31 | NYM-J 3×1,5 mm², Feldleitung Pumpen/Ventile/Sensoren, 50 m | 50 m | 1,30 €/m | 65,00 € |
|
||||||
|
| M32 | NYM-J 3×2,5 mm², Feldleitung Miner-Schukosteckdosen, 20 m | 20 m | 2,20 €/m | 44,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.9: 213,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.10 Feldinstallation und Steckverbinder
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M33 | Schuko-Steckdosen CEE 7/3, Unterputz/Aufputz (für Miner, 4 Stück) | 4 St. | 8,00 € | 32,00 € |
|
||||||
|
| M34 | Wilo BMS Connect Module Art.-Nr. 4257834 (0-10 V Eingang für P4/P5) | 2 St. | 65,00 € | 130,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.10: 162,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.11 Sensorik und Bedienelemente
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M35 | Not-Aus-Schalter Ø22 mm, mit Halter und Kontaktblock NC (z.B. Eaton M22-PV) | 2 St. | 28,00 € | 56,00 € |
|
||||||
|
| M36 | Reset-Taster Ø22 mm, grün, NO-Kontaktblock (z.B. Eaton M22-D-G) | 1 St. | 15,00 € | 15,00 € |
|
||||||
|
| M37 | Durchflussschalter FLOW OK, Rohranschluss, NC-Kontakt | 1 St. | 85,00 € | 85,00 € |
|
||||||
|
| M38 | Temperaturbegrenzer TEMP MAX, Kapillar-Typ, NC-Kontakt (einstellbar) | 1 St. | 65,00 € | 65,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.11: 221,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.12 Sonstiges Installationsmaterial
|
||||||
|
|
||||||
|
| Pos. | Bezeichnung | Menge | Einzelpreis | Gesamtpreis |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| M39 | Leitungsmarkierer-Set, Schrumpfschlauch-Sortiment, Gewebeklebeband | 1 Pauschal | 40,00 € | 40,00 € |
|
||||||
|
| M40 | Befestigungsmaterial (Schrauben, Muttern, Unterlegscheiben, Distanzhülsen) | 1 Pauschal | 20,00 € | 20,00 € |
|
||||||
|
|
||||||
|
**Zwischensumme 3.12: 60,00 €**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Materialübersicht
|
||||||
|
|
||||||
|
| Gruppe | Zwischensumme |
|
||||||
|
|---|---|
|
||||||
|
| 3.1 Schaltschrank-Gehäuse und Montagematerial | 440,00 € |
|
||||||
|
| 3.2 AC-Schutzgeräte | 280,00 € |
|
||||||
|
| 3.3 Schütze (Miner) | 120,00 € |
|
||||||
|
| 3.4 Relaismodule K2–K7 | 96,00 € |
|
||||||
|
| 3.5 Sicherheitsrelais | 280,00 € |
|
||||||
|
| 3.6 RevolutionPi (SPS-System) | 527,00 € |
|
||||||
|
| 3.7 Netzwerk und Site Server | 430,00 € |
|
||||||
|
| 3.8 Klemmen und Verteiler | 95,00 € |
|
||||||
|
| 3.9 Kabel | 213,00 € |
|
||||||
|
| 3.10 Feldinstallation | 162,00 € |
|
||||||
|
| 3.11 Sensorik und Bedienelemente | 221,00 € |
|
||||||
|
| 3.12 Sonstiges Installationsmaterial | 60,00 € |
|
||||||
|
| **Gesamt Material (netto)** | **2.924,00 €** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Gesamtpreisübersicht
|
||||||
|
|
||||||
|
| Position | Nettobetrag |
|
||||||
|
|---|---|
|
||||||
|
| Arbeitsleistung gesamt (149,0 h × 80,00 €/h) | 11.920,00 € |
|
||||||
|
| Material gesamt (inkl. Beschaffungsaufwand) | 2.924,00 € |
|
||||||
|
| **Nettobetrag gesamt** | **14.844,00 €** |
|
||||||
|
| Umsatzsteuer 19 % | 2.820,36 € |
|
||||||
|
| **Rechnungsbetrag brutto** | **17.664,36 €** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Zahlungsbedingungen
|
||||||
|
|
||||||
|
- **30 % Anzahlung** bei Auftragserteilung: 5.299,31 € (brutto)
|
||||||
|
- **40 % Zwischenzahlung** nach Fertigstellung Schaltschrank und Übergabe an Baustelle: 7.065,74 € (brutto)
|
||||||
|
- **30 % Schlusszahlung** nach Inbetriebnahme und Abnahme: 5.299,31 € (brutto)
|
||||||
|
|
||||||
|
Zahlungsfrist: 14 Tage nach Rechnungsdatum, ohne Abzug.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Leistungsumfang und Abgrenzung
|
||||||
|
|
||||||
|
**Im Angebot enthalten:**
|
||||||
|
- Alle oben aufgeführten Leistungen gemäß Abschnitt 2
|
||||||
|
- Alle Materialien gemäß Materialliste Abschnitt 3
|
||||||
|
- Eine Einweisung des Betreibers vor Ort
|
||||||
|
|
||||||
|
**Nicht im Angebot enthalten (gesondert zu beauftragen):**
|
||||||
|
- Entwicklung einer individuellen Web-Applikation / Custom-Dashboard (Phase 2)
|
||||||
|
- Reise- und Übernachtungskosten (werden zum Selbstkostenpreis abgerechnet)
|
||||||
|
- Hydraulikarbeiten (Rohrleitungsbau, Befülllung Heizkreise)
|
||||||
|
- Elektrische Hausinstallation (Zuleitung zum Schaltschrank)
|
||||||
|
- Deye-Hybrid-Wechselrichter und Batteriesystem (gesonderte Lieferung)
|
||||||
|
- Antminer S19J und Netzteile (gesonderte Lieferung)
|
||||||
|
- Buderus Wärmepumpe WLW186i (gesonderte Lieferung)
|
||||||
|
- Pumpen P3, P4, P5 und Belimo-Ventile RV1/RV2 (gesonderte Lieferung)
|
||||||
|
- Pufferspeicher und Warmwasserspeicher
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Angebotsgültigkeit und Rechtliches
|
||||||
|
|
||||||
|
Dieses Angebot ist **verbindlich** und gilt bis zum **29. Juni 2026**. Nach Ablauf dieser Frist verliert das Angebot seine Gültigkeit; eine Beauftragung erfordert ein neues Angebot.
|
||||||
|
|
||||||
|
Die genannten Stunden sind Schätzwerte auf Basis der vorliegenden Planung. Etwaige Mehraufwände durch unvorhersehbare Umstände (z.B. bauliche Gegebenheiten vor Ort, nachträgliche Anforderungsänderungen) werden vorab mit dem Auftraggeber abgestimmt und gesondert beauftragt.
|
||||||
|
|
||||||
|
Materialpreise basieren auf aktuellen Marktpreisen (Stand März 2026) und können bei verzögerter Beauftragung geringfügig abweichen.
|
||||||
|
|
||||||
|
Es gelten die gesetzlichen Gewährleistungsfristen. Für Arbeit- und Montageleistungen gilt eine Gewährleistung von 2 Jahren ab Abnahme gemäß BGB § 634a.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Auftragserteilung
|
||||||
|
|
||||||
|
Mit Unterzeichnung dieses Dokuments durch den Auftraggeber gilt das Angebot als angenommen und der Auftrag als erteilt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Ort, Datum:** ______________________________
|
||||||
|
|
||||||
|
**Auftraggeber (Unterschrift):** ______________________________
|
||||||
|
|
||||||
|
**Auftragnehmer (Unterschrift):** ______________________________
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Erstellt am 29.03.2026 | ThermIQ Projekt ASP1 | Standort Walda*
|
||||||
240
CONTEXT.md
Normal file
240
CONTEXT.md
Normal file
|
|
@ -0,0 +1,240 @@
|
||||||
|
# ThermIQ — AI Context / Knowledge Base
|
||||||
|
|
||||||
|
This file is the master reference for any AI assistant working on ThermIQ.
|
||||||
|
Read this before asking questions or making any suggestions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What is ThermIQ?
|
||||||
|
|
||||||
|
ThermIQ (formerly Kryptoheat, project codename ASP1) is a smart hybrid heating system built for German residential homes. The core idea: **crypto miners produce enormous waste heat** — instead of dumping it, ThermIQ routes it into the building's heating system. A smart controller decides when to mine (based on solar/battery/grid economics), how much to mine, and how to distribute the resulting heat.
|
||||||
|
|
||||||
|
**First installation**: Walda, Germany (a private home with existing Buderus heat pump).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Team & Roles
|
||||||
|
|
||||||
|
- **Adrian** = software and automation expert + Schaltschrank (electrical cabinet) builder
|
||||||
|
- Other team members access shared docs via Nextcloud at `~/Nextcloud/Projekte/ThermIQ`
|
||||||
|
- Do NOT write to the Nextcloud folder without Adrian's explicit consent
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Hardware Stack
|
||||||
|
|
||||||
|
### Crypto Miners
|
||||||
|
- 2x **Antminer S19J** (Bitmain)
|
||||||
|
- Run **Braiins OS** (not stock firmware) — exposes gRPC API on port 50051
|
||||||
|
- Each miner: 2x Schuko plugs → through contactor K10/K11 → through LS breaker → AC bus
|
||||||
|
- Power ~3200 W each at full hash rate → ~14 A per miner per circuit
|
||||||
|
- API: `braiins.bos.v1.PerformanceService` — `GetTunerState`, power tuning
|
||||||
|
- Auth: Bearer token in gRPC metadata
|
||||||
|
|
||||||
|
### PLC: RevolutionPi
|
||||||
|
- KUNBUS **RevolutionPi** (Linux-based industrial PLC)
|
||||||
|
- Modules: **Core** (CPU + LAN) + **DIO** (digital I/O) + **AIO** (analog I/O)
|
||||||
|
- Runs MQTT client, connects to switch via Ethernet
|
||||||
|
- Programs RevPi in Python or using Node-RED via MQTT
|
||||||
|
- If RevPi crashes: miners MUST shut down (hardware-enforced by safety relay)
|
||||||
|
|
||||||
|
### Solar / Energy: Deye Hybrid Inverters
|
||||||
|
- **Deye hybrid inverter(s)** — model TBD
|
||||||
|
- DO NOT use Modbus TCP over LAN (native LAN interface is unreliable)
|
||||||
|
- Use **RS485 Modbus RTU** instead
|
||||||
|
- Library: **[sunsynk](https://github.com/kellerza/sunsynk)** on Raspberry Pi
|
||||||
|
- Data: solar production (W), battery SOC (%), grid power (W), load (W)
|
||||||
|
|
||||||
|
### Battery Storage
|
||||||
|
- Coupled to Deye inverter
|
||||||
|
- Capacity TBD
|
||||||
|
- SOC read via sunsynk/RS485
|
||||||
|
|
||||||
|
### Heat Pump: Buderus WLW186i
|
||||||
|
- **EVU input I1** = dry contact ONLY (potential-free)
|
||||||
|
- Controlled via relay **K7** (24 V DC coil, potential-free output)
|
||||||
|
- Close K7 = EVU Sperre = block heat pump
|
||||||
|
- Open K7 = heat pump free to run (default)
|
||||||
|
- RevPi DO → K7 coil → I1 contact
|
||||||
|
- CRITICAL: Never inject voltage into I1
|
||||||
|
|
||||||
|
### Pumps
|
||||||
|
- **P3**: simple circuit pump (miner cooling loop) — 230V AC, **relay on/off only** (no speed control), RevPi DO
|
||||||
|
- **P4**: **Wilo Stratos PICO plus** (Art.-No. 4244373) — 230V AC + **0-10V analog setpoint** via RevPi AIO AO1
|
||||||
|
- **P5**: **Wilo Stratos PICO plus** (Art.-No. 4244373) — 230V AC + **0-10V analog setpoint** via RevPi AIO AO2 (Glykol/solar loop)
|
||||||
|
- Only 2x AO required → **1x RevPi AIO module** is sufficient
|
||||||
|
- BMS Connect Module (Wilo Art. 4257834): optional retrofit for 0-10V / SSM / SBM
|
||||||
|
- ⚠️ NOTE: P5 connection to ASP1 is missing the dotted control line in Funktionsschema_Vorlage_Hydraulik.pdf — schema error, P5 IS controlled by ASP1
|
||||||
|
|
||||||
|
### Valves: Belimo
|
||||||
|
- **RV1**, **RV2**: Belimo C320Q-J (3-way valve body)
|
||||||
|
- Actuator: **CQ230A** (230V AC, spring return)
|
||||||
|
- Controlled via relay block K3/K4 (RV1) and K5/K6 (RV2)
|
||||||
|
- RevPi DO → relay → actuator
|
||||||
|
|
||||||
|
### Dry Cooler (Rückkühler)
|
||||||
|
- 230V AC fan motor
|
||||||
|
- Relay K2 (24V DC coil)
|
||||||
|
- RevPi DO → K2
|
||||||
|
- Optional fault feedback to RevPi DI
|
||||||
|
- Enabled only when cooling is needed AND pumps/oil are OK
|
||||||
|
|
||||||
|
### Thermal Storage
|
||||||
|
- **Pufferspeicher**: buffer tank (receives miner heat, supplies space heating)
|
||||||
|
- **Warmwasserspeicher**: domestic hot water tank
|
||||||
|
- Temperature sensors: PT1000 or 4-20 mA (exact type TBD)
|
||||||
|
|
||||||
|
### Smart Meter
|
||||||
|
- Grid metering — integration protocol TBD
|
||||||
|
|
||||||
|
### Energy Meters
|
||||||
|
- RS485 Modbus RTU
|
||||||
|
- Polled by Node-RED via USB RS485 adapter on Raspberry Pi
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Safety Architecture
|
||||||
|
|
||||||
|
**Golden rule: safety is purely hardware. Software is never in the safety chain.**
|
||||||
|
|
||||||
|
### Hardware Safety Chain
|
||||||
|
```
|
||||||
|
E-Stop 1 (NC) ──┐
|
||||||
|
E-Stop 2 (NC) ──┤
|
||||||
|
FLOW OK (NC) ──┤──→ Dual-channel safety relay (Rückführkreis) → K10, K11 coils
|
||||||
|
TEMP MAX (NC) ──┤
|
||||||
|
Reset (NO) ──┘
|
||||||
|
```
|
||||||
|
|
||||||
|
- Any NC contact opens = safety relay drops = K10/K11 de-energize = miners off
|
||||||
|
- Manual reset required after trip
|
||||||
|
- K10/K11 Hilfskontakt feeds back into relay Rückführkreis AND RevPi DI (monitoring only)
|
||||||
|
- RevPi gets "Safety OK" signal on DI — software awareness, not control
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Communication Architecture
|
||||||
|
|
||||||
|
| Protocol | Devices | Physical |
|
||||||
|
|----------|---------|----------|
|
||||||
|
| RS485 Modbus RTU | Deye inverter, energy meters | USB RS485 on RPi |
|
||||||
|
| MQTT | RevPi ↔ RPi (Node-RED/HA) | Wired Ethernet |
|
||||||
|
| gRPC (Braiins) | Miners | Wired Ethernet |
|
||||||
|
| 0-10 V analog | Pumps P3-P5 | Shielded cable from RevPi AIO |
|
||||||
|
| Dry contact | Heat pump EVU K7 | Cabinet wiring |
|
||||||
|
| Digital relay | Valves, cooler, contactors | Cabinet wiring |
|
||||||
|
|
||||||
|
### Network Rules
|
||||||
|
- Wired Ethernet ONLY for critical devices
|
||||||
|
- Fixed IPs for RevPi and MQTT broker
|
||||||
|
- NTP required
|
||||||
|
- Cloud = optional, read-only, never safety-critical
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Software Stack
|
||||||
|
|
||||||
|
| Layer | Software | Platform |
|
||||||
|
|-------|---------|----------|
|
||||||
|
| PLC logic | RevPi program (Python/IEC 61131) + MQTT | RevolutionPi |
|
||||||
|
| Modbus polling | Node-RED or sunsynk | Site Server (Intel N100) |
|
||||||
|
| Automation flows | Node-RED | Site Server (Intel N100) |
|
||||||
|
| Message bus | Mosquitto MQTT | Site Server (Intel N100) |
|
||||||
|
| Visualization | Home Assistant (Phase 1) → custom web app (Phase 2) | Site Server (Intel N100) |
|
||||||
|
| Miner API | gRPC client (client.js) | Node.js / Site Server |
|
||||||
|
| Inverter data | sunsynk Python library | Site Server (Intel N100) |
|
||||||
|
|
||||||
|
### Migration Strategy (Phase 1 → Phase 2)
|
||||||
|
|
||||||
|
Phase 1 (current): Home Assistant as dashboard + automation glue, runs on Intel N100 alongside Node-RED and Mosquitto.
|
||||||
|
|
||||||
|
Phase 2 (future): Replace HA with a custom web app (fleet dashboard, multi-site). All logic stays in Node-RED and MQTT — only the visualization layer changes. This is safe because:
|
||||||
|
- Node-RED is the single source of automation logic (not HA automations)
|
||||||
|
- MQTT is the single source of truth for all state
|
||||||
|
- HA is read-only consumer of MQTT topics in Phase 1 — no logic embedded in HA
|
||||||
|
|
||||||
|
**Rule for Phase 1 development:** Never put control logic inside HA automations. All logic lives in Node-RED. HA is a dashboard only.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Control Logic (Decision Engine)
|
||||||
|
|
||||||
|
### Energy Routing Decision
|
||||||
|
```
|
||||||
|
1. Check solar production (from Deye RS485)
|
||||||
|
2. Check battery SOC (from Deye RS485)
|
||||||
|
3. Check grid tariff / time-of-use pricing
|
||||||
|
4. Decision: should miners run? → control K10/K11 via safety relay enable
|
||||||
|
5. If miners run: monitor outlet temperature
|
||||||
|
6. Route miner heat to Pufferspeicher via pumps P3/P4
|
||||||
|
7. If Pufferspeicher too hot: open Rückkühler (K2)
|
||||||
|
8. If Pufferspeicher too cold: release heat pump (K7 open)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Thermal Priority
|
||||||
|
- Summer: miners → Rückkühler (reject excess heat outdoors)
|
||||||
|
- Winter: miners → Pufferspeicher → space heating
|
||||||
|
- Always: domestic hot water from Warmwasserspeicher via pump
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project File Structure (~/Projects/ThermIQ)
|
||||||
|
|
||||||
|
```
|
||||||
|
ThermIQ/
|
||||||
|
├── CONTEXT.md ← this file
|
||||||
|
├── README.md
|
||||||
|
├── .gitignore
|
||||||
|
├── docs/
|
||||||
|
│ ├── HARDWARE.md ← all components and specs
|
||||||
|
│ ├── ARCHITECTURE.md ← system topology and data flows
|
||||||
|
│ ├── SAFETY.md ← safety chain, non-negotiables
|
||||||
|
│ ├── COMMUNICATION.md ← RS485, MQTT, gRPC, network
|
||||||
|
│ └── SCHALTSCHRANK.md ← cabinet design, I/O mapping, commissioning
|
||||||
|
└── src/
|
||||||
|
├── miners/
|
||||||
|
│ ├── client.js ← Braiins gRPC client
|
||||||
|
│ └── README.md
|
||||||
|
└── nodered/
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Decisions & Constraints (from agents.md)
|
||||||
|
|
||||||
|
1. Deye inverters: use RS485, NOT LAN Modbus TCP
|
||||||
|
2. EVU input: dry contact only, NEVER inject voltage
|
||||||
|
3. Miners: always hard-disconnectable (hardware, not software)
|
||||||
|
4. Safety relay: dual-channel with Rückführkreis
|
||||||
|
5. RevPi crash = miners off (by design)
|
||||||
|
6. No WiFi for critical components
|
||||||
|
7. Cloud = optional, read-only
|
||||||
|
8. Local-first: system survives complete internet outage
|
||||||
|
9. Wired Ethernet, industrial switch, fixed IPs
|
||||||
|
10. Documentation: multiple small diagrams per subsystem (no monolithic schemas)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Open Questions / Future Work
|
||||||
|
|
||||||
|
- MQTT topic structure (structure defined above is provisional)
|
||||||
|
- Error handling and fallback state machine
|
||||||
|
- Thermal priority logic: miner vs. heat pump scheduling
|
||||||
|
- Seasonal operating modes (Winter/Summer/Spring/Autumn/Maintenance)
|
||||||
|
- Remote update strategy for RevPi and RPi
|
||||||
|
- Long-term energy statistics and logging
|
||||||
|
- Smart meter integration
|
||||||
|
- Exact sensor types for Pufferspeicher / Warmwasser (PT1000 vs 4-20mA)
|
||||||
|
- Battery capacity and type
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Source Files in Nextcloud (read-only for AI)
|
||||||
|
|
||||||
|
- `251107_GA_Unterlagen_Walda_Heizungstechnik/3_Schema/Topologie/KryptoheatTopologie.drawio` — 8-page topology diagram
|
||||||
|
- `251107_GA_Unterlagen_Walda_Heizungstechnik/3_Schema/Topologie/agents.md` — original AI agent memory
|
||||||
|
- `251107_GA_Unterlagen_Walda_Heizungstechnik/1_Anlagenbeschreibung/` — plant description docs (XLSX/PDF)
|
||||||
|
- `251107_GA_Unterlagen_Walda_Heizungstechnik/4_Datenblätter/` — component datasheets
|
||||||
|
- `251107_GA_Unterlagen_Walda_Heizungstechnik/5_Programmierung/Javascript/client.js` — gRPC client source
|
||||||
|
- `workspace/Node-red/` — Node-RED workspace (package.json: node-red 4.1.1)
|
||||||
59
README.md
Normal file
59
README.md
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
# ThermIQ
|
||||||
|
|
||||||
|
Smart hybrid heating system for German residential properties using crypto miner waste heat, solar PV, battery storage, and a heat pump — controlled by a RevolutionPi PLC.
|
||||||
|
|
||||||
|
## Concept
|
||||||
|
|
||||||
|
Crypto miners (Antminer S19J ASICs) generate significant waste heat. ThermIQ captures this heat and routes it into the building's heating circuit (Pufferspeicher / Warmwasserspeicher). A smart controller decides whether to source energy from the grid, solar panels, or battery storage — and coordinates the heat pump (Buderus WLW186i) as backup or supplement.
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
ThermIQ/
|
||||||
|
├── docs/
|
||||||
|
│ ├── HARDWARE.md # All hardware components with specs
|
||||||
|
│ ├── ARCHITECTURE.md # System architecture and topology
|
||||||
|
│ ├── SAFETY.md # Safety layer and non-negotiable constraints
|
||||||
|
│ ├── COMMUNICATION.md # RS485 Modbus, MQTT, gRPC, network topology
|
||||||
|
│ └── SCHALTSCHRANK.md # Electrical cabinet design and wiring
|
||||||
|
├── src/
|
||||||
|
│ ├── miners/ # Miner integration (Braiins gRPC API)
|
||||||
|
│ └── nodered/ # Node-RED flows
|
||||||
|
├── CONTEXT.md # Full AI context / knowledge base
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
| Layer | Technology |
|
||||||
|
|-------|-----------|
|
||||||
|
| PLC / Control | RevolutionPi (Core + DIO + AIO) |
|
||||||
|
| Automation | Node-RED (Modbus client, logic flows) |
|
||||||
|
| Message Bus | MQTT (Mosquitto) |
|
||||||
|
| Visualization | Home Assistant |
|
||||||
|
| Miner API | Braiins OS gRPC (port 50051) |
|
||||||
|
| Inverter | Deye via RS485 Modbus (sunsynk library) |
|
||||||
|
| Field Bus | RS485 Modbus (energy meters, inverters) |
|
||||||
|
| HW Safety | Dual-channel safety relay, hardware contactors |
|
||||||
|
|
||||||
|
## First Installation: Walda (ASP1)
|
||||||
|
|
||||||
|
- Site: Walda, Germany
|
||||||
|
- Miners: 2x Antminer S19J
|
||||||
|
- Inverters: Deye hybrid
|
||||||
|
- Heat pump: Buderus WLW186i
|
||||||
|
- Pumps: 3x Wilo Stratos PICO plus (P3, P4, P5)
|
||||||
|
- Valves: 2x Belimo C320Q-J (RV1, RV2)
|
||||||
|
|
||||||
|
## Key Principles
|
||||||
|
|
||||||
|
- Safety is purely hardware — never software-dependent
|
||||||
|
- Miners must always be hard-disconnectable via contactors
|
||||||
|
- Cloud is optional / read-only — never required for operation
|
||||||
|
- No WiFi for critical energy components
|
||||||
|
- Local-first architecture
|
||||||
|
|
||||||
|
## Related
|
||||||
|
|
||||||
|
- Shared team folder: `~/Nextcloud/Projekte/ThermIQ` (do not commit here)
|
||||||
|
- Prior Kryptoheat work: `~/Projects/Kryptoheat/`
|
||||||
115
docs/ARCHITECTURE.md
Normal file
115
docs/ARCHITECTURE.md
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
# ThermIQ — System Architecture
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
ThermIQ is a local-first hybrid energy and heating system. The architecture has three layers:
|
||||||
|
|
||||||
|
1. **Field layer** — physical hardware (miners, pumps, valves, sensors)
|
||||||
|
2. **Control layer** — RevolutionPi PLC + safety relay
|
||||||
|
3. **Supervision layer** — Raspberry Pi (Node-RED + Home Assistant + MQTT)
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ SUPERVISION LAYER │
|
||||||
|
│ Raspberry Pi: Node-RED | Home Assistant | Mosquitto MQTT │
|
||||||
|
└─────────────────────┬───────────────────────────────────────┘
|
||||||
|
│ MQTT (LAN)
|
||||||
|
┌─────────────────────▼───────────────────────────────────────┐
|
||||||
|
│ CONTROL LAYER │
|
||||||
|
│ RevolutionPi Core+DIO+AIO ←→ Safety Relay (HW) │
|
||||||
|
└──────┬──────────────────────────────────────┬───────────────┘
|
||||||
|
│ 0-10V / DO / DI │ Contactor coils
|
||||||
|
┌──────▼──────────────────────────────────────▼───────────────┐
|
||||||
|
│ FIELD LAYER │
|
||||||
|
│ Miners K10/K11 | Pumps P3-P5 | Valves RV1-RV2 │
|
||||||
|
│ Cooler K2 | Heat Pump K7 | Sensors | Energy Meters │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Energy Flow Decision Logic
|
||||||
|
|
||||||
|
```
|
||||||
|
Solar production > consumption?
|
||||||
|
→ YES: Run miners + charge battery
|
||||||
|
→ NO: Battery available?
|
||||||
|
→ YES: Run miners from battery
|
||||||
|
→ NO: Check grid tariff / time of day
|
||||||
|
→ Cheap: Run miners from grid
|
||||||
|
→ Expensive: Reduce/stop miners
|
||||||
|
|
||||||
|
Miner waste heat available?
|
||||||
|
→ YES: Route to Pufferspeicher via pumps
|
||||||
|
→ Need cooling? → Rückkühler ON
|
||||||
|
|
||||||
|
Pufferspeicher temperature sufficient?
|
||||||
|
→ YES: Heat pump OFF (EVU Sperre = block)
|
||||||
|
→ NO: Heat pump ON (EVU Sperre = release)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Network Topology
|
||||||
|
|
||||||
|
```
|
||||||
|
[Industrial Switch]
|
||||||
|
├── RevolutionPi (fixed IP, MQTT client)
|
||||||
|
├── Raspberry Pi (fixed IP)
|
||||||
|
│ ├── Mosquitto MQTT Broker
|
||||||
|
│ ├── Node-RED (Modbus client + automation)
|
||||||
|
│ └── Home Assistant (visualization + dashboards)
|
||||||
|
├── USB RS485 Gateway (energy meters, Deye inverter)
|
||||||
|
└── [Optional: cloud read-only APIs]
|
||||||
|
```
|
||||||
|
|
||||||
|
Fixed IPs required for RevPi and MQTT broker. NTP time sync required.
|
||||||
|
|
||||||
|
## MQTT Data Bus
|
||||||
|
|
||||||
|
All internal state flows through MQTT topics on Mosquitto broker (localhost on RPi).
|
||||||
|
|
||||||
|
Planned topic structure (TBD):
|
||||||
|
- `thermiq/miners/+/state`
|
||||||
|
- `thermiq/miners/+/power`
|
||||||
|
- `thermiq/pumps/+/setpoint`
|
||||||
|
- `thermiq/pumps/+/feedback`
|
||||||
|
- `thermiq/valves/+/state`
|
||||||
|
- `thermiq/inverter/+/power`
|
||||||
|
- `thermiq/inverter/+/soc`
|
||||||
|
- `thermiq/grid/power`
|
||||||
|
- `thermiq/temps/puffer`
|
||||||
|
- `thermiq/temps/warmwasser`
|
||||||
|
- `thermiq/safety/state`
|
||||||
|
|
||||||
|
## Control Philosophy
|
||||||
|
|
||||||
|
- **RevolutionPi** = logic engine and field I/O. Publishes/subscribes MQTT.
|
||||||
|
- **Node-RED** = Modbus polling (Deye RS485, energy meters), automation flows, MQTT bridge.
|
||||||
|
- **Home Assistant** = visualization only. Does not control field devices directly.
|
||||||
|
- **Safety relay** = hardware-only. Independent of all software. Miners cannot run without safety OK.
|
||||||
|
|
||||||
|
## Seasonal Modes (planned)
|
||||||
|
|
||||||
|
| Mode | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| Winter | Miners primary heat source; heat pump backup |
|
||||||
|
| Summer | Miners cooled via Rückkühler; heat pump off |
|
||||||
|
| Spring/Autumn | Hybrid, temperature-controlled transition |
|
||||||
|
| Maintenance | Manual override, miners off |
|
||||||
|
|
||||||
|
## Fallback / Fail-Safe Behavior
|
||||||
|
|
||||||
|
| Failure | Behavior |
|
||||||
|
|---------|----------|
|
||||||
|
| RevPi crash | Miners shut down (safety relay de-energizes contactors) |
|
||||||
|
| MQTT offline | Heat pump autonomous (EVU contact open = run) |
|
||||||
|
| Network loss | All field devices fail-safe (pumps at last setpoint or min) |
|
||||||
|
| Temperature MAX | Safety relay trips → miners off immediately |
|
||||||
|
| Flow loss | Safety relay trips → miners off immediately |
|
||||||
|
|
||||||
|
## Integration Points
|
||||||
|
|
||||||
|
| System | Protocol | Direction |
|
||||||
|
|--------|----------|-----------|
|
||||||
|
| Deye inverter | RS485 Modbus RTU | Read (power, SOC, grid) |
|
||||||
|
| Energy meters | RS485 Modbus RTU | Read (consumption) |
|
||||||
|
| Miners (Braiins OS) | gRPC over LAN | Read/Write (tuner, power) |
|
||||||
|
| RevPi | MQTT | Bidirectional |
|
||||||
|
| Smartmeter | (TBD) | Read |
|
||||||
108
docs/COMMUNICATION.md
Normal file
108
docs/COMMUNICATION.md
Normal file
|
|
@ -0,0 +1,108 @@
|
||||||
|
# ThermIQ — Communication Architecture
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
| Protocol | Usage | Physical |
|
||||||
|
|----------|-------|----------|
|
||||||
|
| RS485 Modbus RTU | Deye inverter, energy meters | RS485 bus, USB gateway |
|
||||||
|
| MQTT | Internal data bus | Ethernet/TCP |
|
||||||
|
| gRPC | Miner Braiins OS API | Ethernet/TCP |
|
||||||
|
| LAN/Ethernet | All IP devices | Wired, industrial switch |
|
||||||
|
|
||||||
|
## RS485 Modbus RTU
|
||||||
|
|
||||||
|
### Deye Hybrid Inverter
|
||||||
|
|
||||||
|
- **Protocol**: RS485 Modbus RTU (NOT Modbus TCP — LAN interface unreliable)
|
||||||
|
- **Library**: [sunsynk](https://github.com/kellerza/sunsynk) running on Raspberry Pi
|
||||||
|
- **Reference**: https://www.youtube.com/watch?v=u9df0YHfNtM
|
||||||
|
- **Data available**: Solar production, battery SOC, grid power, load consumption
|
||||||
|
- **Connection**: USB RS485 adapter → Raspberry Pi
|
||||||
|
|
||||||
|
### Energy Meters
|
||||||
|
|
||||||
|
- RS485 Modbus RTU
|
||||||
|
- Polled by Node-RED running on Raspberry Pi
|
||||||
|
- USB RS485 gateway on Raspberry Pi (or RevPi)
|
||||||
|
|
||||||
|
## MQTT
|
||||||
|
|
||||||
|
**Broker**: Mosquitto, running on Raspberry Pi, localhost
|
||||||
|
**Port**: 1883 (standard)
|
||||||
|
**Clients**:
|
||||||
|
- RevolutionPi: publishes field state, subscribes to setpoints
|
||||||
|
- Node-RED: publishes Modbus data, subscribes to RevPi state
|
||||||
|
- Home Assistant: subscribes to all topics (read-only visualization)
|
||||||
|
|
||||||
|
### Topic Structure (planned)
|
||||||
|
|
||||||
|
```
|
||||||
|
thermiq/
|
||||||
|
├── miners/
|
||||||
|
│ ├── 1/state # online | offline | error
|
||||||
|
│ ├── 1/power # watts
|
||||||
|
│ ├── 1/hashrate # TH/s
|
||||||
|
│ ├── 2/state
|
||||||
|
│ └── 2/power
|
||||||
|
├── pumps/
|
||||||
|
│ ├── p3/setpoint # 0.0–10.0 V
|
||||||
|
│ ├── p4/setpoint
|
||||||
|
│ └── p5/setpoint
|
||||||
|
├── valves/
|
||||||
|
│ ├── rv1/state # open | closed | moving
|
||||||
|
│ └── rv2/state
|
||||||
|
├── cooler/state # on | off
|
||||||
|
├── heatpump/
|
||||||
|
│ ├── evu_sperre # true | false
|
||||||
|
│ └── state # running | blocked | fault
|
||||||
|
├── inverter/
|
||||||
|
│ ├── solar_power # W
|
||||||
|
│ ├── battery_soc # %
|
||||||
|
│ ├── grid_power # W (negative = export)
|
||||||
|
│ └── load_power # W
|
||||||
|
├── temps/
|
||||||
|
│ ├── puffer # °C
|
||||||
|
│ ├── warmwasser # °C
|
||||||
|
│ └── miner_outlet # °C
|
||||||
|
└── safety/
|
||||||
|
├── state # ok | tripped
|
||||||
|
└── reason # flow | temp | estop | none
|
||||||
|
```
|
||||||
|
|
||||||
|
## Braiins OS gRPC API
|
||||||
|
|
||||||
|
**Server**: Antminer with Braiins OS, port 50051
|
||||||
|
**Service**: `braiins.bos.v1.PerformanceService`
|
||||||
|
**Auth**: Bearer token in metadata
|
||||||
|
**Key methods**:
|
||||||
|
- `GetTunerState` — current power tuning state
|
||||||
|
- Power scaling via tuner (reduce hash rate = reduce power = reduce heat)
|
||||||
|
|
||||||
|
**Reference implementation**: `src/miners/client.js`
|
||||||
|
|
||||||
|
### Integration Pattern
|
||||||
|
|
||||||
|
```
|
||||||
|
Node-RED → HTTP/gRPC call → Antminer → response
|
||||||
|
↓
|
||||||
|
MQTT publish → thermiq/miners/1/power
|
||||||
|
```
|
||||||
|
|
||||||
|
## Network Configuration
|
||||||
|
|
||||||
|
| Device | IP | Role |
|
||||||
|
|--------|-----|------|
|
||||||
|
| RevolutionPi | fixed (e.g. 192.168.0.10) | PLC, MQTT client |
|
||||||
|
| Raspberry Pi | fixed (e.g. 192.168.0.11) | MQTT broker, Node-RED, HA |
|
||||||
|
| Miner 1 | fixed (e.g. 192.168.0.101) | Braiins gRPC |
|
||||||
|
| Miner 2 | fixed (e.g. 192.168.0.102) | Braiins gRPC |
|
||||||
|
| Deye inverter | RS485 only | not on LAN |
|
||||||
|
|
||||||
|
- All wired Ethernet, no WiFi for critical devices
|
||||||
|
- NTP time synchronization required on RevPi and RPi
|
||||||
|
- VLAN optional but recommended for isolation
|
||||||
|
- Industrial managed switch preferred
|
||||||
|
|
||||||
|
## Deye RS485 Wiring Note
|
||||||
|
|
||||||
|
The Deye inverter's native Modbus TCP LAN interface is not trusted for production use. Use RS485 directly. Wire RS485 A/B to USB adapter on Raspberry Pi. Termination resistor at cable end if bus > 1 device.
|
||||||
119
docs/HARDWARE.md
Normal file
119
docs/HARDWARE.md
Normal file
|
|
@ -0,0 +1,119 @@
|
||||||
|
# ThermIQ — Hardware Reference
|
||||||
|
|
||||||
|
## Crypto Miners
|
||||||
|
|
||||||
|
| Item | Spec |
|
||||||
|
|------|------|
|
||||||
|
| Model | Antminer S19J (x2) |
|
||||||
|
| Power supply | 2x Schuko per miner |
|
||||||
|
| Power isolation | Individual LS breaker + contactor per miner |
|
||||||
|
| Contactors | K10 (Miner 1), K11 (Miner 2) |
|
||||||
|
| Feedback | Hilfskontakt per Schütz → RevPi DI |
|
||||||
|
| API | Braiins OS gRPC, port 50051 (`PerformanceService`) |
|
||||||
|
| Auth | Bearer token (`aWzKUJcmbyBMiTbo` — replace in production) |
|
||||||
|
| Network | Fixed IP, wired Ethernet only |
|
||||||
|
|
||||||
|
## Pumps
|
||||||
|
|
||||||
|
| ID | Model | Supply | Control | Notes |
|
||||||
|
|----|-------|--------|---------|-------|
|
||||||
|
| P3 | noname pump (miner cooling loop) | 230 V AC | **Relay on/off** via RevPi DO | No speed control — simple contactor |
|
||||||
|
| P4 | Wilo Stratos PICO plus Art.-No. 4244373 | 230 V AC | **0–10 V via RevPi AIO AO1** | Shielded cable |
|
||||||
|
| P5 | Wilo Stratos PICO plus Art.-No. 4244373 (Glykol) | 230 V AC | **0–10 V via RevPi AIO AO2** | Shielded cable; ⚠️ missing dotted line in Funktionsschema_Vorlage_Hydraulik.pdf |
|
||||||
|
|
||||||
|
**BMS Connect Module** (Wilo Art.-Nr. 4257834): retrofit module for BMS integration.
|
||||||
|
- 0–10 V analog input for setpoint
|
||||||
|
- SSM/SBM relay outputs (potential-free)
|
||||||
|
- Digital input (configurable: extern AUS / MIN / MAX)
|
||||||
|
- Max ambient: 60°C, SELV galvanically isolated
|
||||||
|
|
||||||
|
## Valves
|
||||||
|
|
||||||
|
| ID | Model | Actuator | Supply | Control |
|
||||||
|
|----|-------|----------|--------|---------|
|
||||||
|
| RV1 | Belimo C320Q-J | CQ230A | 230 V AC | Relay K3/K4 (AUF/ZU) |
|
||||||
|
| RV2 | Belimo C320Q-J | CQ230A | 230 V AC | Relay K5/K6 (AUF/ZU) |
|
||||||
|
|
||||||
|
Note: If only one control input per valve is used, relay block can be reduced.
|
||||||
|
Hand/0/Auto switches recommended for commissioning.
|
||||||
|
|
||||||
|
## Dry Cooler (Rückkühler)
|
||||||
|
|
||||||
|
| Item | Spec |
|
||||||
|
|------|------|
|
||||||
|
| Fan | 230 V AC |
|
||||||
|
| Relay | K2 (24 V DC coil, switches 230 V) |
|
||||||
|
| Control | RevPi DIO DO_RK |
|
||||||
|
| Feedback | Optional fault signal → RevPi DI |
|
||||||
|
| Interlock | Enable only when oil and pumps OK |
|
||||||
|
|
||||||
|
## Heat Pump
|
||||||
|
|
||||||
|
| Item | Spec |
|
||||||
|
|------|------|
|
||||||
|
| Model | Buderus WLW186i |
|
||||||
|
| EVU Input | I1 — dry contact ONLY |
|
||||||
|
| Relay | K7 (potential-free, 24 V DC coil) |
|
||||||
|
| Control | RevPi DIO DO_EVU_SPERRE |
|
||||||
|
| CRITICAL | Never inject voltage into EVU I1 — contact only |
|
||||||
|
|
||||||
|
## PLC: RevolutionPi
|
||||||
|
|
||||||
|
| Module | Function |
|
||||||
|
|--------|----------|
|
||||||
|
| Core | CPU, Ethernet, Linux |
|
||||||
|
| DIO | Digital I/O (relays, contactors, safety feedback) |
|
||||||
|
| AIO | Analog I/O (0–10 V pump setpoints, sensors) |
|
||||||
|
|
||||||
|
RevPi runs Linux, MQTT client, connects via LAN to industrial switch.
|
||||||
|
If RevPi crashes → miners must shut down (hardware safety ensures this).
|
||||||
|
|
||||||
|
## Inverters
|
||||||
|
|
||||||
|
| Item | Spec |
|
||||||
|
|------|------|
|
||||||
|
| Model | Deye hybrid inverter(s) |
|
||||||
|
| Interface | RS485 Modbus (NOT Modbus TCP over LAN — unreliable) |
|
||||||
|
| Library | [sunsynk](https://github.com/kellerza/sunsynk) for Raspberry Pi |
|
||||||
|
| Ref | YouTube: https://www.youtube.com/watch?v=u9df0YHfNtM |
|
||||||
|
|
||||||
|
## Energy Meters
|
||||||
|
|
||||||
|
- RS485 Modbus
|
||||||
|
- Connected via USB RS485 gateway on Raspberry Pi or RevPi
|
||||||
|
|
||||||
|
## Network Hardware
|
||||||
|
|
||||||
|
| Item | Spec |
|
||||||
|
|------|------|
|
||||||
|
| Switch | Industrial, wired Ethernet only |
|
||||||
|
| Site Server | Intel N100 Mini PC (e.g. Beelink EQ12) — Node-RED + Mosquitto + Home Assistant (Phase 1); DIN rail via adapter |
|
||||||
|
| RevPi | Fixed IP, MQTT client |
|
||||||
|
| NTP | Required for timestamps |
|
||||||
|
| WiFi | NOT used for any critical energy component |
|
||||||
|
|
||||||
|
## Power Distribution (Schaltschrank)
|
||||||
|
|
||||||
|
| Component | Notes |
|
||||||
|
|-----------|-------|
|
||||||
|
| Q0 | FI/LS (RCD + circuit breaker) for whole cabinet |
|
||||||
|
| 230 V AC bus | From Q0 |
|
||||||
|
| 24 V DC PSU | Fed from AC bus, supplies RevPi, relay coils, safety circuit |
|
||||||
|
| LS Miner 1/2 | Individual breakers before K10/K11 |
|
||||||
|
| LS Pumpen | Breaker for P3, P4, P5 |
|
||||||
|
| LS Ventile | Breaker for RV1, RV2 |
|
||||||
|
| LS RK | Breaker for Rückkühler fan |
|
||||||
|
|
||||||
|
## Storage Components
|
||||||
|
|
||||||
|
- **Pufferspeicher**: buffer tank for thermal energy
|
||||||
|
- **Warmwasserspeicher**: domestic hot water tank
|
||||||
|
- **Batteries**: coupled to Deye inverter for energy storage
|
||||||
|
- **Smartmeter**: grid metering
|
||||||
|
|
||||||
|
## Sensors
|
||||||
|
|
||||||
|
- Flow sensor (FLOW OK — NC contact to safety relay)
|
||||||
|
- Temperature sensor (TEMP MAX — NC contact to safety relay)
|
||||||
|
- Emergency stop buttons (E-Stop 1, E-Stop 2 — NC)
|
||||||
|
- Reset button (NO)
|
||||||
944
docs/PFLICHTENHEFT_SOFTWARE.md
Normal file
944
docs/PFLICHTENHEFT_SOFTWARE.md
Normal file
|
|
@ -0,0 +1,944 @@
|
||||||
|
# Pflichtenheft — ThermIQ ASP1 Software
|
||||||
|
## SPS-Programmierung (RevolutionPi) & Node-RED Automatisierung
|
||||||
|
|
||||||
|
**Projekt:** ThermIQ Hybridheizungssystem
|
||||||
|
|
||||||
|
**Standort:** Walda, Deutschland
|
||||||
|
|
||||||
|
**Dokument:** Pflichtenheft Software — Phase 1
|
||||||
|
|
||||||
|
**Version:** 2.0
|
||||||
|
|
||||||
|
**Stand:** 2026-05
|
||||||
|
|
||||||
|
**Autor:** Adrian
|
||||||
|
|
||||||
|
**Norm:** DIN 69901-5, VDI 2221
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inhaltsverzeichnis
|
||||||
|
|
||||||
|
1. [Einleitung und Zweck](#1-einleitung-und-zweck)
|
||||||
|
2. [Zielbestimmungen](#2-zielbestimmungen)
|
||||||
|
3. [Anforderungskatalog](#3-anforderungskatalog)
|
||||||
|
4. [Systemübersicht](#4-systemübersicht)
|
||||||
|
5. [Plattformen und Laufzeitumgebungen](#5-plattformen-und-laufzeitumgebungen)
|
||||||
|
6. [MQTT-Datenbus](#6-mqtt-datenbus)
|
||||||
|
7. [RevolutionPi SPS-Programm](#7-revolutionpi-sps-programm)
|
||||||
|
8. [Node-RED Automatisierung](#8-node-red-automatisierung)
|
||||||
|
9. [Betriebsmodi](#9-betriebsmodi)
|
||||||
|
10. [Energiemanagement-Logik](#10-energiemanagement-logik)
|
||||||
|
11. [Wärmemanagement-Logik](#11-wärmemanagement-logik)
|
||||||
|
12. [Miner-Steuerung (gRPC)](#12-miner-steuerung-grpc)
|
||||||
|
13. [Sicherheitslogik (Software-Ebene)](#13-sicherheitslogik-software-ebene)
|
||||||
|
14. [Fallback- und Fehlerverhalten](#14-fallback--und-fehlerverhalten)
|
||||||
|
15. [Watchdog und Systemüberwachung](#15-watchdog-und-systemüberwachung)
|
||||||
|
16. [Abnahme- und Testkriterien](#16-abnahme--und-testkriterien)
|
||||||
|
17. [Offene Punkte](#17-offene-punkte)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Einleitung und Zweck
|
||||||
|
|
||||||
|
Dieses Pflichtenheft beschreibt die Softwareanforderungen für den Automatisierungsschaltschrank ASP1 des ThermIQ-Systems. Es definiert die zu erbringenden Leistungen für:
|
||||||
|
|
||||||
|
- die **SPS-Programmierung** auf dem RevolutionPi (Python/Node-RED via MQTT)
|
||||||
|
- die **Node-RED Automatisierungslogik** auf dem Site Server (Intel N100)
|
||||||
|
|
||||||
|
Home Assistant (Phase-1-Dashboard) ist in diesem Dokument **nicht** enthalten und wird separat spezifiziert.
|
||||||
|
|
||||||
|
### Abgrenzung
|
||||||
|
|
||||||
|
| In Scope | Out of Scope |
|
||||||
|
|----------|-------------|
|
||||||
|
| RevPi I/O-Steuerung (DO, DI, AO, AI) | Home Assistant Konfiguration |
|
||||||
|
| MQTT-Kommunikation RevPi ↔ Site Server | Cloud-Anbindung |
|
||||||
|
| Node-RED Modbus-Polling (Deye, Energiezähler) | Hydraulikplanung |
|
||||||
|
| Node-RED gRPC Miner-Integration | Netzwerk-Infrastruktur (Switch, IP-Vergabe) |
|
||||||
|
| Energie- und Wärmemanagement-Logik | Elektrische Hausinstallation |
|
||||||
|
| Watchdog und Alarmierung | Buderus-interne Konfiguration |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Zielbestimmungen
|
||||||
|
|
||||||
|
### 2.1 Musskriterien
|
||||||
|
|
||||||
|
Die folgenden Ziele sind zwingend zu erfüllen. Das System gilt ohne diese als nicht abnahmefähig.
|
||||||
|
|
||||||
|
1. Das System muss die Kryptominer (Antminer S19J) über Kontaktoren sicher ein- und ausschalten können.
|
||||||
|
2. Das System muss die Abwärme der Miner nutzbar in den Pufferspeicher einspeisen.
|
||||||
|
3. Das System muss den Betrieb der Miner auf verfügbare Solar- und Batterieenergie optimieren.
|
||||||
|
4. Das System muss die Wärmepumpe (Buderus) über EVU-Sperre steuern können.
|
||||||
|
5. Das System muss im Fall eines Sicherheitsereignisses (E-Stop, Durchflussfehler, Hardware-Übertemperatur) die Miner über die Hardware-Sicherheitskette sofort und unabhängig von der Software abschalten.
|
||||||
|
6. Das System muss nach einem Stromausfall und Netzwiederkehr ohne manuellen Eingriff den Betrieb selbstständig wieder aufnehmen.
|
||||||
|
7. Das System muss alle Betriebszustände, Temperaturen und Alarme über MQTT für externe Systeme zugänglich machen.
|
||||||
|
|
||||||
|
### 2.2 Wunschkriterien
|
||||||
|
|
||||||
|
Die folgenden Ziele sind wünschenswert und sollen in späteren Phasen realisiert werden.
|
||||||
|
|
||||||
|
1. Integration eines dynamischen Stromtarifs (z. B. Tibber API) zur weiteren Kostenoptimierung (Phase 2).
|
||||||
|
2. Automatischer Modus-Wechsel (Winter/Sommer) basierend auf Außentemperatursensor (optional).
|
||||||
|
3. Logging aller Messwerte in einer Zeitreihendatenbank (z. B. InfluxDB) für Energiebilanz-Analysen (Phase 2).
|
||||||
|
4. Push-Benachrichtigungen (Telegram, E-Mail) bei kritischen Alarmen (Phase 2).
|
||||||
|
5. Webbasiertes Monitoring-Dashboard über Home Assistant.
|
||||||
|
6. Erweiterung auf zusätzliche Miner-Einheiten ohne Programmieraufwand.
|
||||||
|
|
||||||
|
### 2.3 Abgrenzungskriterien
|
||||||
|
|
||||||
|
Die folgenden Punkte sind explizit **nicht** Bestandteil dieses Pflichtenhefts:
|
||||||
|
|
||||||
|
1. Home Assistant Konfiguration, Dashboards und Automatisierungen.
|
||||||
|
2. Hydraulische Planung und Ausführung der Wärmesysteme.
|
||||||
|
3. Netzwerk-Infrastruktur (Switch, Verkabelung, IP-Vergabe).
|
||||||
|
4. Elektrische Hausinstallation (Zähler, Unterverteilung, Absicherung).
|
||||||
|
5. Buderus-interne Konfiguration (Heizkurven, Hydraulikweichen).
|
||||||
|
6. Cloud-Anbindung oder Remote-Zugriff (Phase 1).
|
||||||
|
7. Physische Installation und Inbetriebnahme des Schaltschranks.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Anforderungskatalog
|
||||||
|
|
||||||
|
### Leseanleitung
|
||||||
|
|
||||||
|
Jede Anforderung trägt eine eindeutige Kennung und eine Verbindlichkeit:
|
||||||
|
|
||||||
|
| Verbindlichkeit | Bedeutung |
|
||||||
|
|----------------|-----------|
|
||||||
|
| **MUSS** | Zwingend erforderlich. Nichterfüllung = Abnahmehindernis. |
|
||||||
|
| **SOLL** | Stark empfohlen. Abweichung nur mit Begründung. |
|
||||||
|
| **KANN** | Optional. Umsetzung wenn möglich und sinnvoll. |
|
||||||
|
|
||||||
|
Kategorien: **FA** = Funktionale Anforderung · **NFA** = Nicht-funktionale Anforderung · **SA** = Sicherheitsanforderung · **SI** = Schnittstellenanforderung · **RB** = Randbedingung
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.1 Funktionale Anforderungen (FA)
|
||||||
|
|
||||||
|
#### RevolutionPi / SPS
|
||||||
|
|
||||||
|
| ID | Verbindlichkeit | Anforderung |
|
||||||
|
|----|----------------|-------------|
|
||||||
|
| FA-001 | MUSS | Der RevPi muss alle physischen I/Os (DO, DI, AO, AI) gemäß dem I/O-Mapping in Abschnitt 7 verwalten. |
|
||||||
|
| FA-002 | MUSS | Der RevPi muss alle I/O-Zustände und Messwerte gemäß den Publish-Intervallen in Abschnitt 7.5 via MQTT publizieren. |
|
||||||
|
| FA-003 | MUSS | Der RevPi muss Steuerbefehle von Node-RED via MQTT empfangen und ohne Verzögerung (< 500 ms) auf die entsprechenden Ausgänge schalten. |
|
||||||
|
| FA-004 | MUSS | Der RevPi muss die Analogeingänge AI1 (Pufferspeicher) und AI2 (Warmwasserspeicher) auslesen, in °C umrechnen und auf Plausibilität prüfen. Werte außerhalb −10…+95 °C müssen als Fehler publiziert werden. |
|
||||||
|
| FA-005 | MUSS | Der RevPi muss den Sicherheitsrelais-Zustand (DI_SAFETY_OK) überwachen und bei Pegeländerung sofort auf `thermiq/safety/state` publizieren. |
|
||||||
|
| FA-006 | MUSS | Das RevPi-Programm muss K3 (RV1 auf) und K4 (RV1 zu) verriegeln: beide Ausgänge dürfen niemals gleichzeitig aktiv sein. |
|
||||||
|
| FA-007 | MUSS | Das RevPi-Programm muss K5 (RV2 auf) und K6 (RV2 zu) verriegeln: beide Ausgänge dürfen niemals gleichzeitig aktiv sein. |
|
||||||
|
| FA-008 | MUSS | Der RevPi muss einen sekündlichen Heartbeat (Unix-Timestamp) auf `thermiq/system/revpi/heartbeat` publizieren. |
|
||||||
|
| FA-009 | MUSS | Der RevPi muss nach Verbindungsverlust zum MQTT-Broker alle 10 Sekunden einen Reconnect versuchen und nach 60 Sekunden ohne Verbindung in den definierten Sicher-Zustand (Abschnitt 14.1) wechseln. |
|
||||||
|
|
||||||
|
#### Node-RED Automatisierung
|
||||||
|
|
||||||
|
| ID | Verbindlichkeit | Anforderung |
|
||||||
|
|----|----------------|-------------|
|
||||||
|
| FA-010 | MUSS | Node-RED muss Deye-Wechselrichter-Daten (solar_power, battery_soc, grid_power, load_power) via RS485/Modbus mit einem Intervall von ≤ 10 s pollen und auf MQTT publizieren. |
|
||||||
|
| FA-011 | MUSS | Node-RED muss Miner-Status und Ist-Leistung via Braiins OS gRPC (braiins.bos.v1) alle ≤ 30 s abfragen und Ergebnisse auf MQTT publizieren. |
|
||||||
|
| FA-012 | MUSS | Node-RED muss die Energiemanagement-Logik gemäß Abschnitt 10 ausführen und Miner-Leistungssetpoints auf MQTT publizieren. |
|
||||||
|
| FA-013 | MUSS | Node-RED muss die Wärmemanagement-Logik gemäß Abschnitt 11 ausführen und Steuerbefehle für Pumpen, Ventile, Rückkühler und EVU-Sperre auf MQTT publizieren. |
|
||||||
|
| FA-014 | MUSS | Node-RED muss vier Betriebsmodi verwalten: `winter`, `summer`, `transition`, `maintenance`. Der aktive Modus muss auf `thermiq/mode/current` (retained) publiziert werden. |
|
||||||
|
| FA-015 | MUSS | Node-RED muss bei Safety-Trip (`safety/state = "tripped"`) alle Miner-Leistungssetpoints auf 0 setzen, Pumpen auf Minimum-Setpoint stellen und den Alarm-Flow auslösen. |
|
||||||
|
| FA-016 | MUSS | Node-RED muss Alarme bei allen in Abschnitt 8.10 definierten Fehlerbedingungen auslösen und auf `thermiq/alarms/+` publizieren. |
|
||||||
|
| FA-017 | MUSS | Node-RED muss Fallback-Setpoints senden, wenn der RevPi-Heartbeat mehr als 30 Sekunden ausbleibt. |
|
||||||
|
| FA-018 | SOLL | Node-RED soll Leistungsänderungen an den Minern als Rampe (max. `miner_ramp_step` pro `miner_ramp_interval`) durchführen, um Lastsprünge zu vermeiden. |
|
||||||
|
| FA-019 | MUSS | Das Energiemanagement muss Mindest-Laufzeit (`min_run_time`) und Mindest-Stillstandszeit (`min_off_time`) für Miner einhalten. |
|
||||||
|
| FA-020 | SOLL | Node-RED soll Energiezähler-Daten via RS485/Modbus pollen und auf `thermiq/grid/meter` publizieren. |
|
||||||
|
| FA-021 | MUSS | Node-RED muss einen sekündlichen Heartbeat (Unix-Timestamp) auf `thermiq/system/nodered/heartbeat` publizieren. |
|
||||||
|
| FA-022 | MUSS | Im Betriebsmodus `maintenance` muss jede automatische Steuerlogik deaktiviert sein. Manuelle Befehle via MQTT bleiben möglich. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.2 Nicht-funktionale Anforderungen (NFA)
|
||||||
|
|
||||||
|
| ID | Verbindlichkeit | Anforderung |
|
||||||
|
|----|----------------|-------------|
|
||||||
|
| NFA-001 | MUSS | Das gesamte System muss nach einem Stromausfall und vollständiger Netzwiederkehr ohne manuellen Eingriff selbstständig anlaufen. Alle Dienste (RevPi Python, Node-RED, sunsynk, Mosquitto) müssen als Systemd-Services mit `Restart=always` und `WantedBy=multi-user.target` konfiguriert sein. |
|
||||||
|
| NFA-002 | MUSS | Das RevPi-Programm muss nach Watchdog-Auslösung oder Absturz innerhalb von ≤ 60 Sekunden wieder betriebsbereit sein. |
|
||||||
|
| NFA-003 | MUSS | Node-RED muss nach Neustart innerhalb von ≤ 60 Sekunden alle Flows aktiv haben und auf MQTT kommunizieren. |
|
||||||
|
| NFA-004 | MUSS | Die Reaktionszeit der Software auf einen Safety-Trip (von Empfang des MQTT-Topics bis zur Ausgabe aller Fallback-Setpoints) darf 2 Sekunden nicht überschreiten. |
|
||||||
|
| NFA-005 | MUSS | Alle konfigurierbaren Parameter (Schwellwerte, Sollwerte, Intervalle) müssen ohne Code-Änderung anpassbar sein — ausschließlich über Node-RED Context, Config-Flow oder `config.py`. |
|
||||||
|
| NFA-006 | SOLL | Der Quellcode des RevPi-Programms soll ausreichend kommentiert sein, um von einem mit Python vertrauten Dritten gewartet werden zu können. |
|
||||||
|
| NFA-007 | MUSS | Alle Zugangsdaten (Bearer-Token für Miner, MQTT-Passwörter) müssen in Umgebungsvariablen (`ENV`) gespeichert werden. Hardcodierung im Quellcode oder in Node-RED Flows ist unzulässig. |
|
||||||
|
| NFA-008 | MUSS | Alle Systemkomponenten (RevPi, Site Server) müssen per NTP zeitsynchronisiert sein. Eine Abweichung > 5 Sekunden zwischen RevPi und Site Server ist unzulässig. |
|
||||||
|
| NFA-009 | SOLL | Das System soll eine Betriebsverfügbarkeit von ≥ 99 % (maximal ≤ 87,6 Stunden ungeplanter Ausfall pro Jahr) anstreben. |
|
||||||
|
| NFA-010 | SOLL | Alle MQTT-Nachrichten sollen UTF-8-kodierte JSON- oder Plaintext-Payloads verwenden. Binäre oder proprietäre Formate sind unzulässig. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3 Sicherheitsanforderungen (SA)
|
||||||
|
|
||||||
|
| ID | Verbindlichkeit | Anforderung |
|
||||||
|
|----|----------------|-------------|
|
||||||
|
| SA-001 | MUSS | Die Hardware-Sicherheitskette (Sicherheitsrelais, E-Stop, FLOW OK, TEMP MAX) muss vollständig unabhängig von der Software arbeiten. Die Software darf die Hardware-Sicherheitskette weder überbrücken noch deaktivieren. |
|
||||||
|
| SA-002 | MUSS | Ein Safety-Reset darf ausschließlich durch manuellen Eingriff am Schaltschrank erfolgen. Ein Software-Reset des Sicherheitszustands ist unzulässig. |
|
||||||
|
| SA-003 | MUSS | Das System muss bei einer Puffer-Temperatur > 80 °C (Softwaregrenze) die Miner-Leistungssetpoints auf 0 setzen und den Rückkühler einschalten, unabhängig vom aktuellen Energiebedarf. |
|
||||||
|
| SA-004 | MUSS | Das System muss bei einer Warmwasser-Temperatur > 68 °C die EVU-Sperre aufheben (Wärmepumpe sperren), um Überhitzung zu verhindern. |
|
||||||
|
| SA-005 | MUSS | Bei Ausfall des Deye-RS485-Pollings (kein Update > 60 s) muss das Energiemanagement in den konservativen Fallback-Modus wechseln: Miner werden abgeschaltet. |
|
||||||
|
| SA-006 | MUSS | gRPC-Steuerbefehle an Miner dürfen nur gesendet werden, wenn `thermiq/safety/state = "ok"`. |
|
||||||
|
| SA-007 | MUSS | Bei Plausibilitätsfehler eines Temperatursensors (Wert außerhalb −10…+95 °C) muss das System einen Alarm auslösen und in den sicheren Fallback-Zustand wechseln. Die betroffene Regelkreis-Automatik muss deaktiviert werden bis zur manuellen Quittierung. |
|
||||||
|
| SA-008 | MUSS | Die Ventil-Verriegelung (K3/K4, K5/K6) muss sowohl auf Software-Ebene (RevPi-Programm) als auch als Hardware-Empfehlung im Schaltplan dokumentiert sein. |
|
||||||
|
| SA-009 | SOLL | Das System soll Kontaktor-Feedback (DI_K10_FB, DI_K11_FB) auf Übereinstimmung mit dem Sollzustand prüfen. Bei Diskrepanz (Soll ≠ Ist > 2 s) soll ein Alarm ausgelöst werden. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.4 Schnittstellenanforderungen (SI)
|
||||||
|
|
||||||
|
| ID | Verbindlichkeit | Anforderung |
|
||||||
|
|----|----------------|-------------|
|
||||||
|
| SI-001 | MUSS | Alle internen Kommunikationen zwischen RevPi und Site Server müssen über den Mosquitto MQTT-Broker auf dem Site Server (TCP Port 1883) laufen. |
|
||||||
|
| SI-002 | MUSS | Die MQTT-Topic-Struktur muss exakt der in Abschnitt 6 definierten Spezifikation entsprechen. Eigenmächtige Abweichungen von Topicnamen oder Payloadformaten sind unzulässig. |
|
||||||
|
| SI-003 | MUSS | Die Deye-Integration muss entweder via sunsynk Python-Bibliothek (systemd-Service) oder via direktem Modbus RTU über USB-RS485-Adapter erfolgen. |
|
||||||
|
| SI-004 | MUSS | Die Miner-Integration muss die Braiins OS gRPC API (`braiins.bos.v1.PerformanceService`) auf Port 50051 verwenden. |
|
||||||
|
| SI-005 | SOLL | Das System soll mit Home Assistant als externer Steuerungsschicht über MQTT kompatibel sein. Setpoints (`setpoints/+`) und Modus (`mode/current`) müssen via MQTT schreibbar sein. |
|
||||||
|
| SI-006 | MUSS | Kritische Netzwerkteilnehmer (RevPi, Site Server, Miner) müssen ausschließlich über kabelgebundenes Ethernet kommunizieren. WLAN ist für diese Geräte unzulässig. |
|
||||||
|
| SI-007 | MUSS | RevPi und Site Server müssen feste IP-Adressen haben. DHCP für kritische Geräte ist unzulässig. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5 Randbedingungen (RB)
|
||||||
|
|
||||||
|
Randbedingungen sind vorgegebene Rahmenbedingungen, die nicht Gegenstand der Entwicklung sind, aber die Realisierung maßgeblich beeinflussen.
|
||||||
|
|
||||||
|
| ID | Randbedingung |
|
||||||
|
|----|--------------|
|
||||||
|
| RB-001 | Der RevPi läuft auf KUNBUS RevPi Core 3+ mit DIO- und AIO-Modulen unter Raspberry Pi OS (RevPi-Variante). |
|
||||||
|
| RB-002 | Der Site Server ist ein Intel N100 Mini-PC (16 GB RAM, 500 GB SSD) mit Ubuntu Server. |
|
||||||
|
| RB-003 | Die Miner sind Antminer S19J Pro mit Braiins OS und aktivierter gRPC API. |
|
||||||
|
| RB-004 | Der Wechselrichter ist ein Deye Hybrid-Inverter mit RS485-Schnittstelle und Modbus-RTU-Protokoll. |
|
||||||
|
| RB-005 | Die Programmiersprache für das RevPi-Programm ist Python 3 mit `paho-mqtt` und `revpimodio`. |
|
||||||
|
| RB-006 | Die Automatisierungsplattform ist Node-RED 4.x als Docker-Container oder systemd-Service auf dem Site Server. |
|
||||||
|
| RB-007 | Der MQTT-Broker ist Mosquitto auf dem Site Server, lokal erreichbar. Keine externe Cloud-Verbindung in Phase 1. |
|
||||||
|
| RB-008 | Die Wärmepumpe ist ein Buderus-Gerät mit EVU-Sperr-Eingang (potenzialfreier Kontakt). |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Systemübersicht
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────────────────────────────────────┐
|
||||||
|
│ 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) │
|
||||||
|
└────────────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Plattformen und Laufzeitumgebungen
|
||||||
|
|
||||||
|
### 5.1 RevolutionPi (Control Layer)
|
||||||
|
|
||||||
|
| Eigenschaft | Wert |
|
||||||
|
|-------------|------|
|
||||||
|
| Hardware | KUNBUS RevPi Core 3+ + DIO + AIO |
|
||||||
|
| OS | Raspberry Pi OS (RevPi Variante) |
|
||||||
|
| Sprache | Python 3 |
|
||||||
|
| MQTT-Bibliothek | paho-mqtt |
|
||||||
|
| Betrieb | Systemd-Service, Autostart |
|
||||||
|
| IP | Fixed (z.B. 192.168.0.10) |
|
||||||
|
|
||||||
|
### 5.2 Site Server (Supervision Layer)
|
||||||
|
|
||||||
|
| Eigenschaft | Wert |
|
||||||
|
|-------------|------|
|
||||||
|
| Hardware | Intel N100 Mini-PC, 16 GB RAM, 500 GB SSD |
|
||||||
|
| OS | Linux (Ubuntu Server oder ähnlich) |
|
||||||
|
| MQTT Broker | Mosquitto, Port 1883, lokal |
|
||||||
|
| Automation | Node-RED 4.x |
|
||||||
|
| Inverter-Polling | sunsynk (Python), systemd-Service |
|
||||||
|
| IP | Fixed (z.B. 192.168.0.11) |
|
||||||
|
|
||||||
|
### 5.3 Netzwerk
|
||||||
|
|
||||||
|
- Ausschließlich kabelgebundenes Ethernet, kein WLAN für kritische Geräte
|
||||||
|
- NTP-Zeitsynchronisation auf RevPi und Site Server verpflichtend
|
||||||
|
- Feste IPs für RevPi, Site Server, Miner 1, Miner 2
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. MQTT-Datenbus
|
||||||
|
|
||||||
|
Mosquitto läuft auf dem Site Server. Alle Komponenten kommunizieren über diesen Broker.
|
||||||
|
|
||||||
|
### 6.1 Topic-Struktur
|
||||||
|
|
||||||
|
```
|
||||||
|
thermiq/
|
||||||
|
├── miners/
|
||||||
|
│ ├── 1/state # "online" | "offline" | "error"
|
||||||
|
│ ├── 1/power # Watt (float)
|
||||||
|
│ ├── 1/hashrate # TH/s (float)
|
||||||
|
│ ├── 2/state
|
||||||
|
│ └── 2/power
|
||||||
|
├── pumps/
|
||||||
|
│ ├── p3/setpoint # 0.0–10.0 (V, als float)
|
||||||
|
│ ├── p4/setpoint
|
||||||
|
│ └── p5/setpoint
|
||||||
|
├── valves/
|
||||||
|
│ ├── rv1/state # "open" | "closed"
|
||||||
|
│ └── rv2/state
|
||||||
|
├── cooler/
|
||||||
|
│ └── state # "on" | "off"
|
||||||
|
├── heatpump/
|
||||||
|
│ ├── evu_sperre # "true" | "false"
|
||||||
|
│ └── state # "running" | "blocked" | "fault"
|
||||||
|
├── inverter/
|
||||||
|
│ ├── solar_power # W
|
||||||
|
│ ├── battery_soc # % (0–100)
|
||||||
|
│ ├── grid_power # W (negativ = Einspeisung)
|
||||||
|
│ └── load_power # W
|
||||||
|
├── temps/
|
||||||
|
│ ├── puffer # °C (float)
|
||||||
|
│ ├── warmwasser # °C (float)
|
||||||
|
│ └── miner_outlet # °C (float, optional)
|
||||||
|
├── safety/
|
||||||
|
│ ├── state # "ok" | "tripped"
|
||||||
|
│ └── reason # "flow" | "temp" | "estop" | "none"
|
||||||
|
├── setpoints/
|
||||||
|
│ ├── puffer_target # °C (Sollwert Pufferspeicher, schreibbar)
|
||||||
|
│ └── warmwasser_target # °C (Sollwert Warmwasser, schreibbar)
|
||||||
|
├── mode/
|
||||||
|
│ └── current # "winter" | "summer" | "transition" | "maintenance"
|
||||||
|
└── system/
|
||||||
|
├── revpi/heartbeat # Unix-Timestamp (sekündlich)
|
||||||
|
└── nodered/heartbeat # Unix-Timestamp (sekündlich)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 Publish/Subscribe-Zuordnung
|
||||||
|
|
||||||
|
| Topic-Bereich | Publisher | Subscriber |
|
||||||
|
|---------------|-----------|-----------|
|
||||||
|
| `miners/+/state`, `miners/+/power` | Node-RED (gRPC) | RevPi, HA |
|
||||||
|
| `pumps/+/setpoint` | Node-RED | RevPi |
|
||||||
|
| `valves/+/state` | Node-RED | RevPi |
|
||||||
|
| `cooler/state` | Node-RED | RevPi |
|
||||||
|
| `heatpump/evu_sperre` | Node-RED | RevPi |
|
||||||
|
| `inverter/+` | Node-RED (sunsynk) | Node-RED |
|
||||||
|
| `temps/+` | RevPi (AI) | Node-RED, HA |
|
||||||
|
| `safety/+` | RevPi (DI) | Node-RED, HA |
|
||||||
|
| `setpoints/+` | (HA in Phase 1) | Node-RED |
|
||||||
|
| `mode/current` | Node-RED | alle |
|
||||||
|
| `system/+/heartbeat` | RevPi / Node-RED | gegenseitig |
|
||||||
|
|
||||||
|
### 6.3 QoS und Retained
|
||||||
|
|
||||||
|
- Setpoints und Modus: **QoS 1, retained=true** (überleben Neustart)
|
||||||
|
- Messwerte / Zustände: **QoS 0** (kein retained, hohe Frequenz)
|
||||||
|
- Safety-State: **QoS 1, retained=true**
|
||||||
|
- Heartbeats: **QoS 0**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. RevolutionPi SPS-Programm
|
||||||
|
|
||||||
|
### 7.1 Aufgaben
|
||||||
|
|
||||||
|
Der RevPi ist für folgende Aufgaben zuständig:
|
||||||
|
|
||||||
|
1. Alle physischen I/O-Operationen (DO, DI, AO, AI)
|
||||||
|
2. Lesen der Temperatursensoren (AI1 Puffer, AI2 Warmwasser)
|
||||||
|
3. Lesen der Sicherheitsrückmeldung (DI_SAFETY_OK)
|
||||||
|
4. Lesen der Schützkontakt-Feedback (DI_K10_FB, DI_K11_FB)
|
||||||
|
5. Schalten von Relais und Analogausgängen laut MQTT-Befehle
|
||||||
|
6. Publizieren aller I/O-Zustände und Messwerte via MQTT
|
||||||
|
7. Heartbeat an `thermiq/system/revpi/heartbeat`
|
||||||
|
|
||||||
|
### 7.2 I/O-Mapping
|
||||||
|
|
||||||
|
#### Digitale Ausgänge (DO)
|
||||||
|
|
||||||
|
| DO-Pin | MQTT-Topic (subscribe) | Funktion | Ziel |
|
||||||
|
|--------|------------------------|----------|------|
|
||||||
|
| DO_K2 | `thermiq/cooler/state` | Rückkühler ein/aus | K2-Spule |
|
||||||
|
| DO_K3 | `thermiq/valves/rv1/state` (AUF) | RV1 öffnen | K3-Spule |
|
||||||
|
| DO_K4 | `thermiq/valves/rv1/state` (ZU) | RV1 schließen | K4-Spule |
|
||||||
|
| DO_K5 | `thermiq/valves/rv2/state` (AUF) | RV2 öffnen | K5-Spule |
|
||||||
|
| DO_K6 | `thermiq/valves/rv2/state` (ZU) | RV2 schließen | K6-Spule |
|
||||||
|
| DO_EVU | `thermiq/heatpump/evu_sperre` | EVU-Sperre WP | K7-Spule |
|
||||||
|
|
||||||
|
**Ventillogik (RV1, RV2):** K3 und K4 dürfen niemals gleichzeitig aktiv sein (Verriegelung im Programm). Gleiches gilt für K5/K6.
|
||||||
|
|
||||||
|
#### Analoge Ausgänge (AO)
|
||||||
|
|
||||||
|
| AO-Pin | MQTT-Topic (subscribe) | Funktion | Bereich |
|
||||||
|
|--------|------------------------|----------|---------|
|
||||||
|
| AO1 | `thermiq/pumps/p3/setpoint` | Pumpe P3 Drehzahl | 0–10 V |
|
||||||
|
| AO2 | `thermiq/pumps/p4/setpoint` | Pumpe P4 Drehzahl | 0–10 V |
|
||||||
|
| AO3 | `thermiq/pumps/p5/setpoint` | Pumpe P5 Drehzahl | 0–10 V |
|
||||||
|
|
||||||
|
- Wert 0.0 → 0 V (Pumpe minimal/aus)
|
||||||
|
- Wert 10.0 → 10 V (Pumpe maximal)
|
||||||
|
- Wert wird als Float im MQTT-Payload übertragen
|
||||||
|
|
||||||
|
#### Digitale Eingänge (DI)
|
||||||
|
|
||||||
|
| DI-Pin | MQTT-Topic (publish) | Signal | Quelle |
|
||||||
|
|--------|----------------------|--------|--------|
|
||||||
|
| DI_SAFETY_OK | `thermiq/safety/state` | Sicherheitsrelais-Ausgang | Sicherheitsrelais |
|
||||||
|
| DI_K10_FB | intern + `thermiq/miners/1/contactor` | K10 Hilfskontakt | K10 |
|
||||||
|
| DI_K11_FB | intern + `thermiq/miners/2/contactor` | K11 Hilfskontakt | K11 |
|
||||||
|
| DI_RK_FAULT | `thermiq/cooler/fault` | Rückkühler-Fehler | optional |
|
||||||
|
|
||||||
|
#### Analoge Eingänge (AI)
|
||||||
|
|
||||||
|
| AI-Pin | MQTT-Topic (publish) | Signal | Bereich |
|
||||||
|
|--------|----------------------|--------|---------|
|
||||||
|
| AI1 | `thermiq/temps/puffer` | Temperatur Pufferspeicher | TBD (4-20 mA oder 0-10 V) |
|
||||||
|
| AI2 | `thermiq/temps/warmwasser` | Temperatur Warmwasserspeicher | TBD |
|
||||||
|
|
||||||
|
- Rohwert wird in °C umgerechnet (Kalibrierformel TBD nach Sensortyp)
|
||||||
|
- Plausibilitätsprüfung: Wert außerhalb -10…+95 °C → Fehler publizieren
|
||||||
|
|
||||||
|
### 7.3 Programmstruktur (Python)
|
||||||
|
|
||||||
|
```
|
||||||
|
revpi_main.py
|
||||||
|
├── config.py # IP, Topics, Schwellwerte, Kalibrierung
|
||||||
|
├── io_driver.py # RevPi I/O Abstraktionsschicht (revpimodio)
|
||||||
|
├── mqtt_client.py # MQTT publish/subscribe Handler
|
||||||
|
├── safety_monitor.py # DI_SAFETY_OK Überwachung, Zustandsautomat
|
||||||
|
├── output_controller.py # Annahme und Ausführung von MQTT-Befehlen
|
||||||
|
├── sensor_reader.py # AI-Auslesen, Umrechnung, Plausibilität
|
||||||
|
└── heartbeat.py # Sekündlicher Heartbeat-Publisher
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.4 Zustandsautomat RevPi
|
||||||
|
|
||||||
|
```
|
||||||
|
INIT
|
||||||
|
└──► MQTT_CONNECT (warte auf Broker)
|
||||||
|
└──► RUNNING (Normal-Betrieb)
|
||||||
|
├──► SAFETY_TRIPPED (Sicherheitsrelais ausgelöst)
|
||||||
|
│ └──► RUNNING (nach Reset-Signal)
|
||||||
|
└──► MQTT_LOST (Verbindung verloren)
|
||||||
|
└──► RUNNING (nach Reconnect)
|
||||||
|
```
|
||||||
|
|
||||||
|
Im Zustand `SAFETY_TRIPPED`:
|
||||||
|
- Alle AO auf 0 V (Pumpen Minimum)
|
||||||
|
- Alle DO_Rückkühler, DO_EVU_SPERRE auf definierten Fallback-Wert (siehe Abschnitt 14)
|
||||||
|
- Keine Ventil-Schaltbefehle mehr ausführen
|
||||||
|
|
||||||
|
### 7.5 Publish-Intervalle
|
||||||
|
|
||||||
|
| Topic | Intervall |
|
||||||
|
|-------|-----------|
|
||||||
|
| `temps/puffer`, `temps/warmwasser` | 5 Sekunden |
|
||||||
|
| `safety/state` | Bei Zustandsänderung + alle 30 Sekunden |
|
||||||
|
| `system/revpi/heartbeat` | 1 Sekunde |
|
||||||
|
| Alle DI-Zustände | Bei Zustandsänderung + alle 60 Sekunden |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Node-RED Automatisierung
|
||||||
|
|
||||||
|
### 8.1 Aufgaben
|
||||||
|
|
||||||
|
Node-RED läuft auf dem Site Server und ist für folgende Aufgaben zuständig:
|
||||||
|
|
||||||
|
1. **Modbus-Polling** Deye Hybrid-Wechselrichter (RS485, sunsynk)
|
||||||
|
2. **Modbus-Polling** Energiezähler (RS485)
|
||||||
|
3. **gRPC-Client** für Antminer S19J (Braiins OS)
|
||||||
|
4. **Energiemanagement-Logik** (Entscheidung: Miner ein/aus, Leistungstuning)
|
||||||
|
5. **Wärmemanagement-Logik** (Pumpensteuerung, Ventile, Rückkühler, EVU-Sperre)
|
||||||
|
6. **Betriebsmodus-Verwaltung** (Winter / Sommer / Übergang / Wartung)
|
||||||
|
7. **Alarmierung** (bei Fehler, Timeout, Grenzwertüberschreitung)
|
||||||
|
8. **Heartbeat** an `thermiq/system/nodered/heartbeat`
|
||||||
|
|
||||||
|
### 8.2 Flow-Struktur
|
||||||
|
|
||||||
|
```
|
||||||
|
Flows/
|
||||||
|
├── 00_System # Heartbeat, MQTT-Verbindung, Systemstatus
|
||||||
|
├── 01_Deye_RS485 # sunsynk Polling, MQTT-Publish Inverter-Daten
|
||||||
|
├── 02_Energymeter # Energiezähler Modbus Polling
|
||||||
|
├── 03_Miner_gRPC # Braiins gRPC Client, Miner-Status, Leistungstuning
|
||||||
|
├── 04_EnergyMgmt # Energiemanagement-Entscheidungslogik
|
||||||
|
├── 05_HeatMgmt # Wärmemanagement (Pumpen, Ventile, Rückkühler, WP)
|
||||||
|
├── 06_Modes # Betriebsmodus-Automat
|
||||||
|
├── 07_Safety # Safety-State Überwachung, Reaktion
|
||||||
|
└── 08_Alarms # Alarmierungslogik, Logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.3 Flow 01 — Deye RS485 (sunsynk)
|
||||||
|
|
||||||
|
- sunsynk läuft als separater Python-Systemd-Service
|
||||||
|
- Publiziert Deye-Daten auf MQTT: `thermiq/inverter/+`
|
||||||
|
- Node-RED abonniert diese Topics und nutzt sie in den Entscheidungsflows
|
||||||
|
- Polling-Intervall: **10 Sekunden**
|
||||||
|
- Datenfelder:
|
||||||
|
- `solar_power` — PV-Erzeugung in W
|
||||||
|
- `battery_soc` — Batterieladezustand in %
|
||||||
|
- `grid_power` — Netzbezug/-einspeisung in W (negativ = Einspeisung)
|
||||||
|
- `load_power` — Hausverbrauch in W
|
||||||
|
|
||||||
|
Alternativ: Node-RED Modbus-RTU-Node direkt auf RS485 (falls sunsynk-Integration entfällt).
|
||||||
|
|
||||||
|
### 8.4 Flow 02 — Energiezähler
|
||||||
|
|
||||||
|
- Modbus RTU via USB RS485 Adapter
|
||||||
|
- Polling-Intervall: **10 Sekunden**
|
||||||
|
- Publish auf `thermiq/grid/meter` (Detail-Topics TBD nach Zählertyp)
|
||||||
|
|
||||||
|
### 8.5 Flow 03 — Miner gRPC
|
||||||
|
|
||||||
|
- Braiins OS gRPC-Server auf jedem Miner, Port **50051**
|
||||||
|
- Service: `braiins.bos.v1.PerformanceService`
|
||||||
|
- Authentifizierung: Bearer-Token in gRPC-Metadata
|
||||||
|
- **Polling-Intervall:** 30 Sekunden (Status-Abfrage)
|
||||||
|
- **Steuerbefehle:** bei Änderung der Ziel-Leistung
|
||||||
|
|
||||||
|
#### Funktionen
|
||||||
|
|
||||||
|
| Funktion | gRPC-Methode | MQTT-Trigger |
|
||||||
|
|----------|-------------|-------------|
|
||||||
|
| Miner-Status abfragen | `GetTunerState` | zyklisch 30 s |
|
||||||
|
| Leistung setzen | `SetPowerTarget` oder Tuner-API | `thermiq/miners/+/power_setpoint` |
|
||||||
|
| Miner-Power publizieren | — | publish `thermiq/miners/+/power` |
|
||||||
|
|
||||||
|
#### Miner Ein/Aus
|
||||||
|
|
||||||
|
- "Aus" = Kontaktor K10/K11 öffnen (Hardware-Sicherheitskreis) — **nicht** via gRPC
|
||||||
|
- gRPC steuert ausschließlich die **Leistung** (Power-Tuning, 0–100 %)
|
||||||
|
- Kontaktor wird über RevPi DO gesteuert (via MQTT)
|
||||||
|
|
||||||
|
> **Wichtig:** gRPC-Befehle werden nur gesendet, wenn `thermiq/safety/state = "ok"`.
|
||||||
|
|
||||||
|
### 8.6 Flow 04 — Energiemanagement
|
||||||
|
|
||||||
|
Entscheidungslogik, die sekündlich (oder bei Datenevent) ausgeführt wird:
|
||||||
|
|
||||||
|
```
|
||||||
|
Eingänge:
|
||||||
|
- solar_power (W)
|
||||||
|
- battery_soc (%)
|
||||||
|
- grid_power (W)
|
||||||
|
- load_power (W)
|
||||||
|
- mode/current
|
||||||
|
- temps/puffer (°C)
|
||||||
|
- safety/state
|
||||||
|
|
||||||
|
Entscheidungsbaum:
|
||||||
|
IF mode == "maintenance" → Miner AUS, keine Automatik
|
||||||
|
IF safety/state != "ok" → Miner AUS (bereits durch HW)
|
||||||
|
|
||||||
|
IF solar_power > (load_power + Schwellwert_solar):
|
||||||
|
→ Miner EIN, Leistung = 100%
|
||||||
|
|
||||||
|
ELSE IF battery_soc >= Schwellwert_soc_hoch:
|
||||||
|
→ Miner EIN, Leistung abhängig von SOC
|
||||||
|
|
||||||
|
ELSE IF grid_tariff == "cheap" AND zeitfenster_günstig():
|
||||||
|
→ Miner EIN, Leistung = konfigurierbar
|
||||||
|
|
||||||
|
ELSE IF battery_soc <= Schwellwert_soc_niedrig:
|
||||||
|
→ Miner AUS
|
||||||
|
|
||||||
|
ELSE:
|
||||||
|
→ Miner AUS (Standard-Fallback)
|
||||||
|
|
||||||
|
Ausgänge (via MQTT):
|
||||||
|
- thermiq/miners/1/power_setpoint
|
||||||
|
- thermiq/miners/2/power_setpoint
|
||||||
|
```
|
||||||
|
|
||||||
|
**Konfigurierbare Schwellwerte (in Node-RED Context oder Config-Flow):**
|
||||||
|
|
||||||
|
| Parameter | Default | Beschreibung |
|
||||||
|
|-----------|---------|-------------|
|
||||||
|
| `solar_excess_threshold` | 500 W | Überschuss-PV ab dem Miner laufen |
|
||||||
|
| `soc_high` | 80 % | SOC ab dem Miner aus Batterie laufen |
|
||||||
|
| `soc_low` | 20 % | SOC unter dem Miner gestoppt werden |
|
||||||
|
| `miner_ramp_step` | 10 % | Leistungsänderung pro Schritt |
|
||||||
|
| `miner_ramp_interval` | 60 s | Mindestabstand zwischen Leistungsänderungen |
|
||||||
|
|
||||||
|
### 8.7 Flow 05 — Wärmemanagement
|
||||||
|
|
||||||
|
```
|
||||||
|
Eingänge:
|
||||||
|
- temps/puffer (°C)
|
||||||
|
- temps/warmwasser (°C)
|
||||||
|
- miners/+/state (laufen Miner?)
|
||||||
|
- setpoints/puffer_target (°C)
|
||||||
|
- setpoints/warmwasser_target (°C)
|
||||||
|
- mode/current
|
||||||
|
|
||||||
|
Steuerausgaben (via MQTT → RevPi):
|
||||||
|
- pumps/p3/setpoint (Miner-Kühlkreis)
|
||||||
|
- pumps/p4/setpoint (Pufferspeicher-Kreis)
|
||||||
|
- pumps/p5/setpoint (Solar/Glykol-Kreis)
|
||||||
|
- valves/rv1/state (Wärmeverteilung)
|
||||||
|
- valves/rv2/state (Wärmeverteilung)
|
||||||
|
- cooler/state (Rückkühler)
|
||||||
|
- heatpump/evu_sperre (WP freigeben/sperren)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Wärmerouting-Logik
|
||||||
|
|
||||||
|
```
|
||||||
|
IF Miner laufen:
|
||||||
|
P3 EIN (Miner-Kühlkreis aktiv)
|
||||||
|
P4 EIN (Wärme Richtung Pufferspeicher)
|
||||||
|
|
||||||
|
IF temps/puffer >= puffer_target:
|
||||||
|
WP sperren (EVU_SPERRE = true / K7 geschlossen)
|
||||||
|
IF temp_miner_outlet > Schwellwert_rückkühlung:
|
||||||
|
Rückkühler EIN (K2)
|
||||||
|
ELSE:
|
||||||
|
Rückkühler AUS
|
||||||
|
ELSE:
|
||||||
|
WP freigeben (EVU_SPERRE = false / K7 offen)
|
||||||
|
Rückkühler AUS
|
||||||
|
|
||||||
|
ELSE (Miner AUS):
|
||||||
|
P3 AUS
|
||||||
|
IF temps/puffer < puffer_target:
|
||||||
|
WP freigeben (EVU_SPERRE = false)
|
||||||
|
ELSE:
|
||||||
|
WP sperren (EVU_SPERRE = true)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Pumpendrehzahl-Regelung:** Einfache proportionale Regelung (P-Regler) oder feste Stufen (konfigurierbar). Hysterese bei Schaltgrenzen verpflichtend (min. 2 K Hysterese).
|
||||||
|
|
||||||
|
### 8.8 Flow 06 — Betriebsmodus
|
||||||
|
|
||||||
|
Manuell oder zeitgesteuert schaltbar.
|
||||||
|
|
||||||
|
| Modus | Beschreibung | Automatik |
|
||||||
|
|-------|-------------|-----------|
|
||||||
|
| `winter` | Miner-Wärme primär für Heizung | ja |
|
||||||
|
| `summer` | Miner-Wärme über Rückkühler ablösen | ja |
|
||||||
|
| `transition` | Hybrid, temperaturgesteuert | ja |
|
||||||
|
| `maintenance` | Alles manuell, keine Automatik | nein |
|
||||||
|
|
||||||
|
- Modus-Wechsel publiziert auf `thermiq/mode/current` (retained)
|
||||||
|
- Kein automatischer Modus-Wechsel ohne explizite Freigabe (konfigurierbar)
|
||||||
|
|
||||||
|
### 8.9 Flow 07 — Safety-Reaktion
|
||||||
|
|
||||||
|
- Abonniert `thermiq/safety/state`
|
||||||
|
- Bei `"tripped"`:
|
||||||
|
- Alle Miner-Leistungssetpoints auf 0
|
||||||
|
- Pumpen auf Minimum-Setpoint (konfigurierbar, z.B. 2 V für Grundzirkulation)
|
||||||
|
- Rückkühler AUS
|
||||||
|
- EVU-Sperre aufheben (WP darf laufen, übernimmt Heizung)
|
||||||
|
- Alarm-Flow auslösen
|
||||||
|
|
||||||
|
> Safety-Hardware handelt unabhängig und schneller. Dieser Flow ist die Softwarereaktions-Ebene.
|
||||||
|
|
||||||
|
### 8.10 Flow 08 — Alarmierung
|
||||||
|
|
||||||
|
Alarm-Bedingungen:
|
||||||
|
|
||||||
|
| Alarm | Bedingung | Schweregrad |
|
||||||
|
|-------|-----------|-------------|
|
||||||
|
| Safety Trip | `safety/state = "tripped"` | KRITISCH |
|
||||||
|
| RevPi Heartbeat Timeout | kein Heartbeat > 30 s | KRITISCH |
|
||||||
|
| Miner offline | `miners/+/state = "offline"` > 5 min | WARNUNG |
|
||||||
|
| Temperatur-Sensor Fehler | Wert außerhalb Plausibilitätsbereich | WARNUNG |
|
||||||
|
| Deye Polling Timeout | kein Inverter-Update > 60 s | WARNUNG |
|
||||||
|
| Puffer Temperatur kritisch | temp > 85 °C | KRITISCH |
|
||||||
|
|
||||||
|
Alarmausgabe (Phase 1): MQTT-Topic `thermiq/alarms/+` + Node-RED Dashboard-Eintrag.
|
||||||
|
Erweiterung (Phase 2): Push-Benachrichtigung, E-Mail (optional).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Betriebsmodi
|
||||||
|
|
||||||
|
### 9.1 Winter-Modus
|
||||||
|
|
||||||
|
- Miner laufen vorrangig bei Solar-Überschuss oder günstigem Netzstrom
|
||||||
|
- Miner-Wärme → Pufferspeicher
|
||||||
|
- WP ist Backup-Wärmequelle (freigegeben wenn Puffer zu kalt)
|
||||||
|
- Rückkühler nur bei Puffer-Überhitzung
|
||||||
|
|
||||||
|
### 9.2 Sommer-Modus
|
||||||
|
|
||||||
|
- Miner laufen bei Solar-Überschuss (Mining-Optimierung)
|
||||||
|
- Miner-Wärme → Rückkühler (Wärme nach außen ablösen)
|
||||||
|
- WP gesperrt (nicht nötig)
|
||||||
|
- Warmwasserbereitung weiterhin aktiv
|
||||||
|
|
||||||
|
### 9.3 Übergangs-Modus
|
||||||
|
|
||||||
|
- Hybrid-Entscheidung basierend auf Außentemperatur (sofern Sensor vorhanden) oder Datum
|
||||||
|
- Puffer-Sollwert temperaturabhängig angepasst
|
||||||
|
|
||||||
|
### 9.4 Wartungs-Modus
|
||||||
|
|
||||||
|
- Alle Automatikfunktionen deaktiviert
|
||||||
|
- Manuelle Steuerung über MQTT-Topics möglich (z.B. via HA oder MQTT-Client)
|
||||||
|
- Keine automatischen Eingriffe
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Energiemanagement-Logik
|
||||||
|
|
||||||
|
### 10.1 Entscheidungspriorität (absteigend)
|
||||||
|
|
||||||
|
1. Sicherheitszustand (Safety OK?)
|
||||||
|
2. Betriebsmodus (Wartung → kein Automat)
|
||||||
|
3. Thermische Grenze (Puffer voll → Miner-Leistung reduzieren oder stoppen)
|
||||||
|
4. Solare Verfügbarkeit
|
||||||
|
5. Batterie-SOC
|
||||||
|
6. Netz-Tarif / Zeitfenster
|
||||||
|
|
||||||
|
### 10.2 Leistungsrampe
|
||||||
|
|
||||||
|
- Keine sprunghaften Leistungsänderungen
|
||||||
|
- Rampe: max. `miner_ramp_step` % pro `miner_ramp_interval` Sekunden
|
||||||
|
- Gilt für Hochfahren und Runterfahren
|
||||||
|
|
||||||
|
### 10.3 Mindest-Laufzeit / Sperrzeit
|
||||||
|
|
||||||
|
| Parameter | Default | Beschreibung |
|
||||||
|
|-----------|---------|-------------|
|
||||||
|
| `min_run_time` | 300 s | Miner läuft mindestens diese Zeit |
|
||||||
|
| `min_off_time` | 120 s | Miner bleibt mindestens diese Zeit aus |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Wärmemanagement-Logik
|
||||||
|
|
||||||
|
### 11.1 Temperaturgrenzen
|
||||||
|
|
||||||
|
| Sensor | Min (Alarm) | Sollwert (Default) | Max (Alarm) |
|
||||||
|
|--------|------------|-------------------|-------------|
|
||||||
|
| Pufferspeicher | 10 °C | 55 °C (konfigurierbar) | 85 °C |
|
||||||
|
| Warmwasserspeicher | 40 °C | 60 °C (konfigurierbar) | 70 °C |
|
||||||
|
|
||||||
|
### 11.2 Hysterese
|
||||||
|
|
||||||
|
Alle Schaltgrenzen haben eine Hysterese von **2 K** (konfigurierbar), um Flackern zu verhindern.
|
||||||
|
|
||||||
|
Beispiel Puffer:
|
||||||
|
- Einschalten WP: temp < (puffer_target - 2)
|
||||||
|
- Ausschalten WP: temp >= puffer_target
|
||||||
|
|
||||||
|
### 11.3 Pumpensteuerung
|
||||||
|
|
||||||
|
- P3 (Miner-Kühlkreis): **Ein/Aus** (keine Drehzahlregelung, DO reicht — AO0 = aus, AO_max = ein)
|
||||||
|
- P4 (Puffer-Kreis): **Drehzahlgeregelt** via AO2 (0–10 V), proportional zur Temperaturdifferenz
|
||||||
|
- P5 (Solar/Glykol-Kreis): **Drehzahlgeregelt** via AO3 (0–10 V)
|
||||||
|
|
||||||
|
### 11.4 Ventilsteuerung
|
||||||
|
|
||||||
|
- RV1 und RV2: **Schaltventile** (AUF/ZU, keine Zwischenstellung)
|
||||||
|
- Verriegelung: K3 und K4 niemals gleichzeitig aktiv (Programm + Hardware-Empfehlung)
|
||||||
|
- Fahrzeit beachten: nach Schaltbefehl min. 150 s warten bis Endlage (Belimo CQ230A typisch 120 s)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Miner-Steuerung (gRPC)
|
||||||
|
|
||||||
|
### 12.1 Verbindungsmanagement
|
||||||
|
|
||||||
|
- gRPC-Client baut Verbindung zu jedem Miner beim Start auf
|
||||||
|
- Reconnect-Logik: bei Verbindungsverlust alle 30 Sekunden Wiederverbindungsversuch
|
||||||
|
- Timeout pro gRPC-Call: 10 Sekunden
|
||||||
|
- Miner-Status `offline` nach 3 fehlgeschlagenen Polls
|
||||||
|
|
||||||
|
### 12.2 Power-Tuning
|
||||||
|
|
||||||
|
- Leistungsbereich: 0–100 % des Miner-Maximums
|
||||||
|
- Setpoint wird vom Energiemanagement-Flow gesetzt
|
||||||
|
- gRPC-Befehl nur senden wenn Differenz zum aktuellen Wert > 5 % (Totband)
|
||||||
|
- Bei Miner `offline`: kein gRPC-Befehl senden, Status `error` publizieren
|
||||||
|
|
||||||
|
### 12.3 Token-Verwaltung
|
||||||
|
|
||||||
|
- Bearer-Token in Node-RED Environment-Variable gespeichert (nicht im Flow hardcodiert)
|
||||||
|
- Konfiguration: `MINER1_TOKEN`, `MINER2_TOKEN`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. Sicherheitslogik (Software-Ebene)
|
||||||
|
|
||||||
|
> **Die Hardware-Sicherheitskette (Sicherheitsrelais, E-Stop, FLOW OK, TEMP MAX) ist vollständig hardware-unabhängig von der Software und hat IMMER Vorrang.**
|
||||||
|
|
||||||
|
Die Software-Ebene ergänzt folgende Schutzfunktionen:
|
||||||
|
|
||||||
|
| Schutzfunktion | Beschreibung | Reaktion |
|
||||||
|
|---------------|-------------|---------|
|
||||||
|
| Puffer-Überhitzung (Software) | `temps/puffer > 80 °C` | Miner-Leistung auf 0, Rückkühler EIN |
|
||||||
|
| Warmwasser-Überhitzung | `temps/warmwasser > 68 °C` | EVU-Sperre AUS (WP blockiert) |
|
||||||
|
| Sensor-Ausfall | Plausibilitätsfehler AI | Sicherer Fallback-Zustand, Alarm |
|
||||||
|
| RevPi Heartbeat-Timeout | kein Heartbeat > 30 s | Node-RED stellt alle Setpoints auf Fallback |
|
||||||
|
| Gleichzeitige Ventil-Befehle | K3 + K4 gleichzeitig | Verriegelung im RevPi-Code |
|
||||||
|
| EVU-Kontakt-Check | K7-Ausgang überwacht | Kein Spannungsnachweis auf I1 möglich (informativ) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Fallback- und Fehlerverhalten
|
||||||
|
|
||||||
|
### 14.1 MQTT-Verbindungsverlust (RevPi)
|
||||||
|
|
||||||
|
- RevPi verliert MQTT-Verbindung → alle letzten Befehle bleiben aktiv (kein Ändern mehr)
|
||||||
|
- Reconnect alle 10 Sekunden
|
||||||
|
- Nach 60 Sekunden ohne MQTT → RevPi fährt in definierten Sicher-Zustand:
|
||||||
|
- AO Pumpen: Grundlast-Setpoint (z.B. 3 V, konfigurierbar)
|
||||||
|
- DO Rückkühler: AUS
|
||||||
|
- DO EVU-Sperre: AUS (WP darf laufen — Heizung bleibt sicher)
|
||||||
|
- Ventile: letzte Position beibehalten
|
||||||
|
|
||||||
|
### 14.2 Node-RED Absturz
|
||||||
|
|
||||||
|
- MQTT Retained Topics bleiben aktiv → RevPi führt letzten bekannten Zustand aus
|
||||||
|
- Miner laufen weiter (Kontaktoren bleiben geschlossen solange Safety OK)
|
||||||
|
- Wärmepumpe reguliert sich autonom (EVU-Kontakt offen = WP läuft)
|
||||||
|
|
||||||
|
### 14.3 Deye RS485 Polling-Ausfall
|
||||||
|
|
||||||
|
- `solar_power`, `battery_soc` nicht mehr verfügbar
|
||||||
|
- Energiemanagement schaltet in Fallback-Modus: Miner AUS (konservativ)
|
||||||
|
- Alarm-Flow auslösen
|
||||||
|
|
||||||
|
### 14.4 Miner offline (gRPC)
|
||||||
|
|
||||||
|
- Status `offline` publizieren
|
||||||
|
- Leistungssteuerung via gRPC eingestellt
|
||||||
|
- Kontaktoren bleiben in letztem Zustand (keine automatische Abschaltung durch Software)
|
||||||
|
- Alarm-Flow auslösen
|
||||||
|
|
||||||
|
### 14.5 Sicherheitsrelais ausgelöst
|
||||||
|
|
||||||
|
- Hardware schaltet K10/K11 ab (Miner stromlos)
|
||||||
|
- RevPi erkennt DI_SAFETY_OK = LOW → publiziert `thermiq/safety/state = "tripped"`
|
||||||
|
- Node-RED Safety-Flow (Flow 07) reagiert (siehe 8.9)
|
||||||
|
- Kein automatischer Reset — manueller Reset am Schaltschrank erforderlich
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 15. Watchdog und Systemüberwachung
|
||||||
|
|
||||||
|
### 15.1 RevPi Watchdog
|
||||||
|
|
||||||
|
- Hardware-Watchdog des RevPi aktivieren (Systemd-Watchdog oder RevPi-intern)
|
||||||
|
- Wenn Programm hängt → Watchdog löst Neustart aus
|
||||||
|
- Nach Neustart: Autostart via Systemd, MQTT-Reconnect
|
||||||
|
|
||||||
|
### 15.2 Gegenseitige Heartbeat-Überwachung
|
||||||
|
|
||||||
|
- RevPi sendet sekündlich: `thermiq/system/revpi/heartbeat` (Unix-Timestamp)
|
||||||
|
- Node-RED sendet sekündlich: `thermiq/system/nodered/heartbeat`
|
||||||
|
- Timeout-Erkennung:
|
||||||
|
- RevPi überwacht Node-RED Heartbeat → bei Ausfall: Sicher-Zustand (14.2)
|
||||||
|
- Node-RED überwacht RevPi Heartbeat → bei Ausfall: Alarm, Fallback-Flow
|
||||||
|
|
||||||
|
### 15.3 Datums- und Zeitprüfung
|
||||||
|
|
||||||
|
- NTP-Synchronisation verpflichtend
|
||||||
|
- Systemzeit-Sprünge > 60 s auslösen Warnung im Alarm-Flow
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 16. Abnahme- und Testkriterien
|
||||||
|
|
||||||
|
### 16.1 RevPi I/O-Tests
|
||||||
|
|
||||||
|
| Test | Erwartetes Ergebnis |
|
||||||
|
|------|---------------------|
|
||||||
|
| MQTT-Befehl `pumps/p4/setpoint = 5.0` | AO2 misst 5 V ± 0,2 V |
|
||||||
|
| MQTT-Befehl `pumps/p4/setpoint = 0.0` | AO2 misst 0 V |
|
||||||
|
| MQTT-Befehl `pumps/p4/setpoint = 10.0` | AO2 misst 10 V |
|
||||||
|
| MQTT-Befehl `valves/rv1/state = open` | K3 zieht an, K4 bleibt offen |
|
||||||
|
| MQTT-Befehl `valves/rv1/state = closed` | K4 zieht an, K3 fällt ab |
|
||||||
|
| K3 und K4 gleichzeitig: Softwareverriegelung | K4 wird blockiert, Alarm |
|
||||||
|
| MQTT-Befehl `cooler/state = on` | DO_K2 = HIGH, K2 zieht an |
|
||||||
|
| MQTT-Befehl `heatpump/evu_sperre = true` | DO_EVU = HIGH, K7 zieht an |
|
||||||
|
| DI_SAFETY_OK = LOW | `safety/state = "tripped"` publiziert |
|
||||||
|
| AI1 Puffersensor 4 mA (0 °C) | `temps/puffer` publiziert 0 °C ± 1 K |
|
||||||
|
| AI1 Puffersensor 20 mA (100 °C) | `temps/puffer` publiziert 100 °C ± 1 K |
|
||||||
|
|
||||||
|
### 16.2 Node-RED Integrationstests
|
||||||
|
|
||||||
|
| Test | Erwartetes Ergebnis |
|
||||||
|
|------|---------------------|
|
||||||
|
| Deye RS485 erreichbar | `inverter/solar_power` aktualisiert alle ≤ 15 s |
|
||||||
|
| Deye offline | Alarm nach 60 s, Energiemanagement Fallback |
|
||||||
|
| Miner 1 gRPC erreichbar | `miners/1/state = "online"` |
|
||||||
|
| Miner 1 gRPC Timeout | `miners/1/state = "offline"`, Alarm |
|
||||||
|
| Energiemanagement: solar_power = 4000 W, soc = 50 % | Miner EIN, 100 % Leistung |
|
||||||
|
| Energiemanagement: solar_power = 0 W, soc = 15 % | Miner AUS |
|
||||||
|
| Wärmemanagement: temps/puffer = 60 °C, target = 55 °C | EVU_SPERRE = true |
|
||||||
|
| Wärmemanagement: temps/puffer = 40 °C, target = 55 °C | EVU_SPERRE = false |
|
||||||
|
| RevPi Heartbeat-Ausfall > 30 s | Alarm, Fallback-Setpoints gesendet |
|
||||||
|
| Safety Trip | Pumpen Minimum, Rückkühler AUS, EVU_SPERRE AUS |
|
||||||
|
|
||||||
|
### 16.3 Systemtest (End-to-End)
|
||||||
|
|
||||||
|
| Test | Kriterium |
|
||||||
|
|------|-----------|
|
||||||
|
| Miner anlaufen bei Solar-Überschuss | Binnen 5 min nach Schwellwert-Erreichen |
|
||||||
|
| Miner stoppen bei Batterie-Unterspannung | Binnen 2 min nach Schwellwert-Unterschreitung |
|
||||||
|
| WP blockiert bei warmem Puffer | EVU-Sperre gesetzt, WP läuft nicht |
|
||||||
|
| WP freigegeben bei kaltem Puffer | EVU-Sperre aufgehoben, WP kann anlaufen |
|
||||||
|
| E-Stop auslösen | K10/K11 sofort offen, `safety/state = "tripped"` |
|
||||||
|
| Kompletter Site-Server-Neustart | Alle Dienste nach ≤ 60 s wieder aktiv |
|
||||||
|
|
||||||
|
### 16.4 Anforderungsabdeckung (Traceability)
|
||||||
|
|
||||||
|
Die folgende Matrix verknüpft die formalen Anforderungen mit den Testfällen:
|
||||||
|
|
||||||
|
| Anforderung | Abgedeckt durch Test |
|
||||||
|
|-------------|---------------------|
|
||||||
|
| FA-001 bis FA-009 | Abschnitt 16.1 (RevPi I/O-Tests) |
|
||||||
|
| FA-010, FA-020 | 16.2 — Deye RS485 erreichbar / Polling |
|
||||||
|
| FA-011 | 16.2 — Miner gRPC erreichbar |
|
||||||
|
| FA-012, FA-019 | 16.2 — Energiemanagement-Tests |
|
||||||
|
| FA-013 | 16.2 — Wärmemanagement-Tests |
|
||||||
|
| FA-015, FA-016, FA-017 | 16.2 — Safety Trip, Heartbeat-Ausfall |
|
||||||
|
| SA-001, SA-002 | 16.3 — E-Stop auslösen |
|
||||||
|
| SA-003 | 16.2 — Wärmemanagement: Puffer > 80 °C |
|
||||||
|
| NFA-001, NFA-002, NFA-003 | 16.3 — Kompletter Neustart |
|
||||||
|
| NFA-004 | 16.2 — Safety Trip (Reaktionszeit messen) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 17. Offene Punkte
|
||||||
|
|
||||||
|
| # | Thema | Status |
|
||||||
|
|---|-------|--------|
|
||||||
|
| 1 | Sensortyp Pufferspeicher (PT1000 vs. 4-20 mA) — beeinflusst AI-Kalibrierung | **offen** |
|
||||||
|
| 2 | Sensortyp Warmwasserspeicher | **offen** |
|
||||||
|
| 3 | Deye Modbus-Register-Map (sunsynk vs. direkte Modbus-Abfrage) | **offen** |
|
||||||
|
| 4 | Netz-Tarif-Integration (dynamischer Strompreis, API TBD) | **Phase 2** |
|
||||||
|
| 5 | Smart Meter Protokoll und Integration | **offen** |
|
||||||
|
| 6 | Batterie-Kapazität und -Typ (Auswirkung auf SOC-Schwellwerte) | **offen** |
|
||||||
|
| 7 | Außentemperatursensor (für Übergangs-Modus automatisch) | **optional** |
|
||||||
|
| 8 | gRPC-Token-Rotations-Strategie (Miner Braiins OS) | **offen** |
|
||||||
|
| 9 | Node-RED Environment-Variables Setup Dokumentation | **offen** |
|
||||||
|
| 10 | Logging-Strategie (Influx DB, CSV, oder nur MQTT?) | **Phase 2** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Pflichtenheft ThermIQ ASP1 Software — v2.0 — 2026-05*
|
||||||
88
docs/SAFETY.md
Normal file
88
docs/SAFETY.md
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# ThermIQ — Safety Architecture
|
||||||
|
|
||||||
|
## Non-Negotiable Constraints
|
||||||
|
|
||||||
|
These constraints are architectural. They must NEVER be relaxed:
|
||||||
|
|
||||||
|
1. **Miners must always be hard-disconnectable via contactors** — K10 (Miner 1) and K11 (Miner 2) are power contactors. Software can only energize/de-energize them if the safety relay allows it. The safety relay acts first.
|
||||||
|
|
||||||
|
2. **Safety logic must never rely on software or network** — The dual-channel safety relay operates entirely in hardware. If all of: RevPi, Node-RED, Home Assistant, MQTT go offline — the safety relay still functions.
|
||||||
|
|
||||||
|
3. **EVU input of Buderus is dry contact only** — Relay K7 is potential-free. It MUST NOT inject any voltage into the Buderus WLW186i EVU input I1. Only open/close the contact.
|
||||||
|
|
||||||
|
4. **No WiFi for critical energy components** — All control runs over wired Ethernet.
|
||||||
|
|
||||||
|
5. **Cloud never required for operation** — Cloud APIs are optional and read-only. The system must operate indefinitely without internet.
|
||||||
|
|
||||||
|
6. **If RevPi crashes → miners must shut down** — The safety relay is wired so that loss of RevPi heartbeat de-energizes contactor coils.
|
||||||
|
|
||||||
|
## Safety Circuit (Hardware)
|
||||||
|
|
||||||
|
```
|
||||||
|
[E-Stop 1 — NC] ──┐
|
||||||
|
[E-Stop 2 — NC] ──┤
|
||||||
|
[FLOW OK — NC] ──┤──→ Dual-channel Safety Relay (with feedback loop)
|
||||||
|
[TEMP MAX — NC] ──┤ │
|
||||||
|
[Reset — NO] ──┘ ┌────┴────────────────┐
|
||||||
|
↓ ↓
|
||||||
|
[K10 coil] [K11 coil]
|
||||||
|
(Miner 1) (Miner 2)
|
||||||
|
↓
|
||||||
|
[RevPi DI — Safety OK feedback]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Dual-channel safety relay with Rückführkreis (feedback loop)**:
|
||||||
|
- Both channels must be healthy
|
||||||
|
- Feedback contacts of K10/K11 are wired back into the relay
|
||||||
|
- Manual reset required after trip
|
||||||
|
- Safety OK signal fed back to RevPi DI for software awareness
|
||||||
|
|
||||||
|
## Safety Input Signals
|
||||||
|
|
||||||
|
| Signal | Type | Condition | Action on Fault |
|
||||||
|
|--------|------|-----------|-----------------|
|
||||||
|
| E-Stop 1 | NC | Opened = pressed | Miners off |
|
||||||
|
| E-Stop 2 | NC | Opened = pressed | Miners off |
|
||||||
|
| FLOW OK | NC | Opened = no flow | Miners off |
|
||||||
|
| TEMP MAX | NC | Opened = over-temp | Miners off |
|
||||||
|
| Reset | NO | Momentary close = reset | Re-enables safety |
|
||||||
|
|
||||||
|
## Contactor Logic
|
||||||
|
|
||||||
|
```
|
||||||
|
Power path: AC bus → LS breaker → K10/K11 contactor → Miner plugs
|
||||||
|
|
||||||
|
K10/K11 coil: ONLY energized when safety relay output is OK
|
||||||
|
K10/K11 Hilfskontakt: feedback → RevPi DI (software monitoring only)
|
||||||
|
```
|
||||||
|
|
||||||
|
Both Schuko plugs of each miner must be routed through the respective contactor.
|
||||||
|
|
||||||
|
## Heat Pump EVU Logic
|
||||||
|
|
||||||
|
```
|
||||||
|
RevPi DO_EVU_SPERRE → K7 relay (potential-free) → Buderus I1
|
||||||
|
|
||||||
|
K7 closed = EVU Sperre active = heat pump blocked
|
||||||
|
K7 open = EVU Sperre inactive = heat pump free to run
|
||||||
|
```
|
||||||
|
|
||||||
|
Logic: When Pufferspeicher is hot enough, block the heat pump to save energy.
|
||||||
|
Default state (RevPi off): K7 open → heat pump autonomous.
|
||||||
|
|
||||||
|
## Fault States and Recovery
|
||||||
|
|
||||||
|
| Fault | Detection | Recovery |
|
||||||
|
|-------|-----------|----------|
|
||||||
|
| Safety trip | Safety relay drops + RevPi DI goes low | Fix cause, manual reset button |
|
||||||
|
| Flow loss | FLOW OK contact opens | Restore flow, reset |
|
||||||
|
| Over-temperature | TEMP MAX contact opens | Cool system, reset |
|
||||||
|
| E-Stop | NC contact opens | Release E-Stop, reset |
|
||||||
|
| RevPi crash | Safety relay heartbeat lost (if wired) | RevPi reboot, system re-initializes |
|
||||||
|
|
||||||
|
## Wiring Notes
|
||||||
|
|
||||||
|
- Safety circuit wiring: use screened cable where possible
|
||||||
|
- NC contacts preferred for fail-safe behavior (open = fault)
|
||||||
|
- Contactor feedback contacts must be wired for complete Rückführkreis
|
||||||
|
- 24 V DC safety circuit — do not mix with 230 V circuits
|
||||||
116
docs/SCHALTSCHRANK.md
Normal file
116
docs/SCHALTSCHRANK.md
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
# ThermIQ — Schaltschrank (Electrical Cabinet) ASP1
|
||||||
|
|
||||||
|
Adrian is responsible for the Schaltschrank design and build. This document tracks decisions, component list, wiring notes, and open items.
|
||||||
|
|
||||||
|
## Cabinet Designation: ASP1
|
||||||
|
|
||||||
|
First installation: Walda, Germany.
|
||||||
|
|
||||||
|
## AC Power Distribution
|
||||||
|
|
||||||
|
```
|
||||||
|
Grid 230V/400V
|
||||||
|
└── Q0: FI/LS (RCD + MCB) — main protection
|
||||||
|
└── 230 V AC busbar
|
||||||
|
├── LS Miner 1 → K10 (contactor) → Miner 1 (2x Schuko)
|
||||||
|
├── LS Miner 2 → K11 (contactor) → Miner 2 (2x Schuko)
|
||||||
|
├── LS Pumpen → P3, P4, P5 (Wilo Stratos PICO plus)
|
||||||
|
├── LS Ventile → Relay block K3-K6 → RV1, RV2 (Belimo CQ230A)
|
||||||
|
├── LS RK → K2 → Rückkühler fan
|
||||||
|
└── LS PSU → 24 V DC PSU
|
||||||
|
```
|
||||||
|
|
||||||
|
## 24 V DC Distribution
|
||||||
|
|
||||||
|
```
|
||||||
|
24 V DC PSU
|
||||||
|
├── RevolutionPi (Core + DIO + AIO)
|
||||||
|
├── Safety relay (coil supply + input circuit)
|
||||||
|
├── Relay coils: K2, K3, K4, K5, K6, K7
|
||||||
|
└── Fuses per branch
|
||||||
|
```
|
||||||
|
|
||||||
|
## Relay / Contactor Summary
|
||||||
|
|
||||||
|
| ID | Type | Coil | Load | Function |
|
||||||
|
|----|------|------|------|----------|
|
||||||
|
| K2 | Relay | 24 V DC | 230 V AC | Rückkühler fan |
|
||||||
|
| K3 | Relay | 24 V DC | 230 V AC | RV1 AUF |
|
||||||
|
| K4 | Relay | 24 V DC | 230 V AC | RV1 ZU |
|
||||||
|
| K5 | Relay | 24 V DC | 230 V AC | RV2 AUF |
|
||||||
|
| K6 | Relay | 24 V DC | 230 V AC | RV2 ZU |
|
||||||
|
| K7 | Relay | 24 V DC | potential-free | Heat pump EVU I1 |
|
||||||
|
| K10 | Contactor | safety output | 230 V AC | Miner 1 power |
|
||||||
|
| K11 | Contactor | safety output | 230 V AC | Miner 2 power |
|
||||||
|
|
||||||
|
## RevolutionPi I/O Mapping
|
||||||
|
|
||||||
|
### Digital Outputs (DO)
|
||||||
|
|
||||||
|
| DO | Function | Load |
|
||||||
|
|----|----------|------|
|
||||||
|
| DO_K2 | Rückkühler fan relay | K2 coil |
|
||||||
|
| DO_K3 | RV1 AUF | K3 coil |
|
||||||
|
| DO_K4 | RV1 ZU | K4 coil |
|
||||||
|
| DO_K5 | RV2 AUF | K5 coil |
|
||||||
|
| DO_K6 | RV2 ZU | K6 coil |
|
||||||
|
| DO_EVU_SPERRE | Heat pump block | K7 coil |
|
||||||
|
|
||||||
|
### Digital Inputs (DI)
|
||||||
|
|
||||||
|
| DI | Signal | Source |
|
||||||
|
|----|--------|--------|
|
||||||
|
| DI_SAFETY_OK | Safety relay output | Safety relay |
|
||||||
|
| DI_K10_FB | K10 feedback | K10 Hilfskontakt |
|
||||||
|
| DI_K11_FB | K11 feedback | K11 Hilfskontakt |
|
||||||
|
| DI_RK_FAULT | Rückkühler fault | Optional |
|
||||||
|
|
||||||
|
### Analog Outputs (AO)
|
||||||
|
|
||||||
|
| AO | Function | Range | Target |
|
||||||
|
|----|----------|-------|--------|
|
||||||
|
| AO1 | P3 setpoint | 0–10 V | Wilo PICO BMS module |
|
||||||
|
| AO2 | P4 setpoint | 0–10 V | Wilo PICO BMS module |
|
||||||
|
| AO3 | P5 setpoint | 0–10 V | Wilo PICO BMS module |
|
||||||
|
|
||||||
|
### Analog Inputs (AI)
|
||||||
|
|
||||||
|
| AI | Signal | Range | Notes |
|
||||||
|
|----|--------|-------|-------|
|
||||||
|
| AI1 | Temperature Pufferspeicher | (TBD) | 4-20 mA or 0-10 V |
|
||||||
|
| AI2 | Temperature Warmwasser | (TBD) | |
|
||||||
|
|
||||||
|
## Wiring Notes
|
||||||
|
|
||||||
|
- **0–10 V pump cables**: use shielded cable, shield connected to PE at cabinet end only
|
||||||
|
- **Safety circuit**: NC contacts in series for E-Stop, FLOW OK, TEMP MAX
|
||||||
|
- **Contactor feedback**: Hilfskontakt (NC) in series in safety relay feedback loop
|
||||||
|
- **EVU relay K7**: potential-free — verify no voltage is applied to Buderus I1
|
||||||
|
- **Miner Schuko**: both plugs of each miner routed through its contactor
|
||||||
|
- **PE**: all metal enclosures to PE
|
||||||
|
|
||||||
|
## Commissioning Checklist
|
||||||
|
|
||||||
|
- [ ] Verify Q0 FI/LS trips correctly
|
||||||
|
- [ ] Verify safety relay trips on E-Stop 1
|
||||||
|
- [ ] Verify safety relay trips on E-Stop 2
|
||||||
|
- [ ] Verify safety relay trips on FLOW OK open
|
||||||
|
- [ ] Verify safety relay trips on TEMP MAX open
|
||||||
|
- [ ] Verify K10 and K11 de-energize on safety trip
|
||||||
|
- [ ] Verify K7 does not inject voltage into Buderus I1
|
||||||
|
- [ ] Verify RevPi AO1-AO3 reach correct voltages (0, 5, 10 V)
|
||||||
|
- [ ] Verify P3, P4, P5 respond to 0-10 V setpoint
|
||||||
|
- [ ] Verify RV1 opens/closes via K3/K4
|
||||||
|
- [ ] Verify RV2 opens/closes via K5/K6
|
||||||
|
- [ ] Test miner power-up via gRPC API
|
||||||
|
- [ ] Verify Deye RS485 data readable from RPi
|
||||||
|
|
||||||
|
## Open Items / Decisions Pending
|
||||||
|
|
||||||
|
- [ ] Exact current ratings for Miner 1/2 Schuko circuits (S19J ~3200 W = ~14 A each)
|
||||||
|
- [ ] Confirm Pufferspeicher / Warmwasserspeicher sensor types (PT1000 / 4-20mA)
|
||||||
|
- [ ] Confirm RevPi AIO module exact model (AIO hat or separate module)
|
||||||
|
- [ ] Decide if Hand/0/Auto switches needed on valve circuit
|
||||||
|
- [ ] Confirm Rückkühler motor protection (motor starter vs. MCB)
|
||||||
|
- [ ] Smart meter integration protocol
|
||||||
|
- [ ] Battery connection to Deye (type, capacity)
|
||||||
40
src/miners/README.md
Normal file
40
src/miners/README.md
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
# Miners — Braiins OS gRPC Integration
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Antminer S19J units run Braiins OS which exposes a gRPC API for performance control.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
## client.js
|
||||||
|
|
||||||
|
Calls `PerformanceService.GetTunerState` on the miner's gRPC server.
|
||||||
|
|
||||||
|
**Configuration** (edit client.js):
|
||||||
|
- `GRPC_SERVER`: miner IP:port (default port 50051)
|
||||||
|
- `AUTH_TOKEN`: Braiins OS API token
|
||||||
|
|
||||||
|
## Proto file
|
||||||
|
|
||||||
|
The `performance.proto` file must be present alongside client.js.
|
||||||
|
Source: Braiins OS API repository / documentation.
|
||||||
|
|
||||||
|
## Key gRPC Methods
|
||||||
|
|
||||||
|
| Method | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| `GetTunerState` | Get current power tuning state |
|
||||||
|
| (others TBD) | Power limit, hash rate, etc. |
|
||||||
|
|
||||||
|
## Integration with Node-RED
|
||||||
|
|
||||||
|
Node-RED can call this via `exec` node or a custom gRPC node.
|
||||||
|
Publish results to MQTT: `thermiq/miners/1/power`, etc.
|
||||||
|
|
||||||
|
## Security Note
|
||||||
|
|
||||||
|
Do not commit real AUTH_TOKEN to git. Store in `.env` or Node-RED credentials.
|
||||||
37
src/nodered/README.md
Normal file
37
src/nodered/README.md
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Node-RED Flows
|
||||||
|
|
||||||
|
Node-RED runs on Raspberry Pi and handles:
|
||||||
|
|
||||||
|
1. **Modbus polling** — Deye RS485 inverter data (via sunsynk or modbus nodes)
|
||||||
|
2. **Energy meter polling** — RS485 Modbus RTU
|
||||||
|
3. **MQTT bridge** — publish all field data to Mosquitto
|
||||||
|
4. **Automation logic** — decision flows for miner/heat pump coordination
|
||||||
|
5. **Miner gRPC bridge** — call Braiins API, publish to MQTT
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On Raspberry Pi
|
||||||
|
cd ~/Projects/ThermIQ/src/nodered
|
||||||
|
npm install # installs node-red
|
||||||
|
npx node-red
|
||||||
|
```
|
||||||
|
|
||||||
|
## Required Node-RED Modules
|
||||||
|
|
||||||
|
- `node-red-contrib-modbus` — RS485 Modbus RTU
|
||||||
|
- `node-red-contrib-mqtt-broker` or use external Mosquitto
|
||||||
|
- `@grpc/grpc-js` + `@grpc/proto-loader` — for Braiins gRPC calls
|
||||||
|
|
||||||
|
## Flow Files
|
||||||
|
|
||||||
|
Place exported `.json` flow files here.
|
||||||
|
|
||||||
|
## sunsynk (Deye RS485)
|
||||||
|
|
||||||
|
Alternative to custom Modbus: use sunsynk library directly in Python, publish to MQTT.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install sunsynk
|
||||||
|
# Configure in sunsynk config.yaml
|
||||||
|
```
|
||||||
Loading…
Reference in a new issue