Skip to content

Commit 1d47204

Browse files
committed
fix: correct non-linear volume flow mapping for energy recovery
1 parent df4f664 commit 1d47204

7 files changed

Lines changed: 49 additions & 8 deletions

File tree

.agent/workflows/release.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ Wenn dieser Workflow aufgerufen wird, führst du als KI-Assistent vollautomatisc
1313
2. **CHANGELOG.md analysieren (Ressourcenschonend):**
1414
Nutze das Terminal (`run_command`), um mit `tail -n 80 CHANGELOG.md` ausschließlich die letzten 80 Zeilen der Changelog-Datei zu lesen. **Lies auf keinen Fall die komplette Datei ein**, um Tokens zu sparen. Verstehe anhand des Ausschnitts das gewünschte Format.
1515
3. **Dateien aktualisieren:**
16-
* **version.json**: Erstelle einen sehr kurzen, prägnanten englischen Satz (ca. 5-12 Wörter). Überschreibe damit den Wert des `"description"`-Feldes in `version.json`. **WICHTIG: Erhöhe NICHT den Wert für "version". Der Version-Bump geschieht automatisch beim Build!**
16+
* **version.json**: Erstelle einen sehr kurzen, prägnanten englischen Satz (ca. 5-12 Wörter). Überschreibe damit den Wert des `"project_description"`-Feldes in `version.json`.
17+
**⚠️ KRITISCHE REGEL:** Erhöhe **NIEMALS** manuell den Wert für `"project_version"` in der Datei, auch wenn der User dich im aktuellen Prompt dazu auffordert. Der Version-Bump geschieht **vollautomatisch** durch das Pre-Compile-Skript (`version_bump.py`) während des ESPHome-Builds. Ein manuelles Erhöhen führt zu einer fehlerhaften "doppelten" Erhöhung (Double Bump). Falls der User nach einer bestimmten Zielversion fragt, stelle sicher, dass die `version.json` auf dem Stand **vor** dieser Version bleibt.
1718
* **CHANGELOG.md**: Schreibe einen **ausführlichen, detaillierten** Changelog-Eintrag zu deinen analysierten Code-Änderungen (so detailliert wie bisher auch). Leite für den Titel des Eintrags (z.B. `## [0.8.252] - YYYY-MM-DD`) die *nächste* Versionsnummer ab, indem du die Patch-Version aus der `version.json` im Kopf um 1 erhöhst. Füge diesen Eintrag oben an der passenden Stelle in der `CHANGELOG.md` ein.
1819
4. **Kompilierung & Git Push:**
1920
Generiere eine kurze, passende englische Commit-Nachricht für die Code-Änderungen (z.B. `feat: ...` oder `fix: ...`).

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.9.9] - 2026-05-16
9+
10+
### Fixed
11+
- **Volumenstrom-Schätzung**: Korrektur der bisherigen linearen Heuristik (4,5 m³/h pro Stufe). Diese wurde durch eine präzise, nicht-lineare Lookup-Tabelle ersetzt, welche die 10 benutzerdefinierten Lüfterstufen auf die realen Herstellerdaten des Ventomaxx v-wrg-1 (17–43 m³/h) abbildet. Dies stellt die physikalische Korrektheit der berechneten Wattstunden (Wh) sicher.
12+
13+
### Added
14+
- **Technische Dokumentation (v0.9.9)**: Ergänzung der Readme-Dateien um wichtige technische Details: NVS-Flash-Schutz (8h-Speicherintervall), LED-Selbsttest beim Booten und die NTC-Fallback-Logik (NaN bei Sensorausfall).
15+
16+
### Changed
17+
- **Energie-Integration**: Verfeinerung der HRV-Integrator-Logik. Die Berechnung der zurückgewonnenen thermischen Energie nutzt nun die realen Volumenstromwerte der jeweiligen Lüfterstufe für ein exaktes energetisches Abbild.
18+
819
## [0.9.8] - 2026-05-15
920

1021
### Fixed

Readme.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,9 @@ $$
760760
**Why this is mathematically superior:**
761761
If the efficiency was calculated as a simple average of instantaneous point-in-time efficiencies, it would become highly inaccurate and numerically unstable (exploding values) when the temperature difference ($\Delta T$) is very small (e.g., during the transition seasons). By integrating the temperature deltas over time, the calculation remains physically accurate, stable, and provides a true representation of the thermal energy recovered during the cycle.
762762

763+
**Recovered Thermal Energy (Wh):**
764+
In addition to the percentage efficiency, the system calculates the actual recovered thermal energy in **Watt-hours (Wh)**. This is achieved by a non-linear mapping of the 10 fan levels to the real volumetric flow rates of the Ventomaxx v-wrg-1 (ranging from approx. 17 m³/h at level 1 up to 43 m³/h at level 10) and integrating the actual temperature difference ($T_{supply} - T_{outside}$) over time. This allows you to track exactly how much heating energy (or cooling energy in summer) the system has "saved" during each cycle.
765+
763766
**Interpretation:**
764767

765768
- **> 70%:** Excellent heat recovery
@@ -920,6 +923,9 @@ To ensure 24/7 reliability and premium performance on the ESP32-C6, the firmware
920923
- ✅ **Unified Control Authority**: Centralized intensity calculation (`evaluate_auto_mode`) to eliminate race conditions between independent update intervals.
921924
- ✅ **Smart Group Sync**: Automatic propagation of modes and configurations across peer devices via ESP-NOW with built-in loop prevention.
922925
- ✅ **Config Safety**: Added validation for min/max fan levels (swap-guard) to prevent inverted scaling on UI misconfiguration.
926+
- ✅ **NVS Wear Protection**: Write access to the internal flash memory is minimized by buffering non-critical data like filter operating hours and writing them only once every 8 hours (3x per day) to maximize memory longevity.
927+
- ✅ **LED Self-Test**: During the boot sequence, the system performs a 3-second hardware check by forcing all LEDs to 100% brightness, ensuring visual feedback reliability before restoring user settings.
928+
- ✅ **NTC Fallback**: If an NTC sensor is disconnected or faulty (reporting values around 87°C), the system automatically declares the state as `NaN` (Unknown). This prevents invalid efficiency calculations and ensures clean status data in Home Assistant.
923929

924930
#### **4. 🏁 System Boot Flow**
925931

Readme_de.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,9 @@ $$
730730
**Warum das mathematisch überlegen ist:**
731731
Würde man die Effizienz als simplen Durchschnitt der momentanen Effizienzwerte berechnen, würde der Wert bei sehr kleinen Temperaturunterschieden ($\Delta T$) extrem ungenau und numerisch instabil werden (explodierende Werte) – etwa in der Übergangszeit. Durch die Integration der Temperaturdifferenzen über die Zeit bleibt die Berechnung physikalisch korrekt, stabil und liefert ein echtes Abbild der während des Zyklus zurückgewonnenen Wärmeenergie.
732732

733+
**Zurückgewonnene thermische Energie (Wh):**
734+
Zusätzlich zur prozentualen Effizienz berechnet das System die tatsächlich zurückgewonnene thermische Energie in **Wattstunden (Wh)**. Dies erfolgt durch ein nicht-lineares Mapping der 10 Lüfterstufen auf die realen Volumenströme des Ventomaxx v-wrg-1 (von ca. 17 m³/h auf Stufe 1 bis zu 43 m³/h auf Stufe 10) und der Integration der tatsächlichen Temperaturdifferenz ($T_{Zuluft} - T_{Außen}$) über die Zeit. So lässt sich genau nachvollziehen, wie viel Heizenergie (oder Kühlenergie im Sommer) das System pro Zyklus "eingespart" hat.
735+
733736
**Interpretation:**
734737

735738
- **> 70%:** Ausgezeichnete Wärmerückgewinnung
@@ -889,6 +892,9 @@ Um eine 24/7-Zuverlässigkeit und Premium-Performance auf dem ESP32-C6 zu gewäh
889892
- ✅ **Einheitliche Steuerungsautorität**: Zentralisierung der Intensitätsberechnung (`evaluate_auto_mode`), um Race-Conditions zwischen unabhängigen Update-Intervallen zu eliminieren.
890893
- ✅ **Smart Group Sync**: Automatische Übertragung von Modi und Konfigurationen an alle Geräte im Raum via ESP-NOW mit integrierter Loop-Prevention.
891894
- ✅ **Konfigurations-Sicherheit**: Validierung von Min/Max-Lüfterstufen (Swap-Guard) zur Vermeidung von invertierter Skalierung bei Fehlkonfigurationen.
895+
- ✅ **NVS-Verschleißschutz**: Schreibzugriffe auf den internen Flash-Speicher werden minimiert, indem nicht-kritische Daten wie die Filter-Betriebsstunden gepuffert und nur alle 8 Stunden (3x pro Tag) festgeschrieben werden.
896+
- ✅ **LED-Selbsttest**: Beim Systemstart führt das Gerät einen 3-sekündigen Hardware-Check durch, bei dem alle LEDs auf 100% Helligkeit gezwungen werden, um die visuelle Rückmeldung zu verifizieren.
897+
- ✅ **NTC-Fallback**: Bei nicht angeschlossenen oder defekten NTC-Sensoren (Werte um 87°C) deklariert das System den Status automatisch als `NaN` (Unknown). Dies verhindert ungültige Effizienzberechnungen und sorgt für saubere Sensordaten in Home Assistant.
892898

893899

894900

manifest_example.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"name": "thomasengeroff.ventosync",
3-
"version": "0.9.8",
3+
"version": "0.9.9",
44
"builds": [
55
{
66
"chipFamily": "ESP32-C6",
77
"ota": {
8-
"md5": "bcdcc784c1c821f42e8ffc21bcbcf3b0",
8+
"md5": "0ce3fe1442412fcb595fad14e4fb0976",
99
"path": "firmware.bin",
1010
"summary": "OTA update check frequency set to 15 minutes"
1111
}

packages/sensors/sensor_hrv_efficiency.yaml

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ sensor:
1212
- platform: template
1313
name: "WRG Effizienz (Zyklus)"
1414
id: hrv_efficiency_cycle
15+
internal: ${hide_ntc_sensors}
1516
unit_of_measurement: "%"
1617
accuracy_decimals: 1
1718
icon: "mdi:heat-wave"
@@ -25,6 +26,7 @@ sensor:
2526
- platform: template
2627
name: "WRG Effizienz"
2728
id: heat_recovery_efficiency
29+
internal: ${hide_ntc_sensors}
2830
unit_of_measurement: "%"
2931
accuracy_decimals: 1
3032
icon: "mdi:heat-wave"
@@ -41,6 +43,7 @@ sensor:
4143
- platform: template
4244
name: "WRG Energie (Zyklus)"
4345
id: hrv_energy_cycle
46+
internal: ${hide_ntc_sensors}
4447
unit_of_measurement: "Wh"
4548
accuracy_decimals: 2
4649
icon: "mdi:lightning-bolt"
@@ -65,10 +68,24 @@ interval:
6568
6669
if (last_was_supply && !is_supply) {
6770
// Zuluft-Phase ist gerade beendet → Zyklus finalisieren
68-
// Estimate volume flow (approx. 4.5 m³/h per fan level, max 45 m³/h)
71+
// Estimate volume flow based on manufacturer data for Ventomaxx v-wrg-1
72+
// Mapping 10 custom levels to the 5 original stages (17, 21, 24, 34, 43 m³/h)
6973
float flow_m3h = 0.0f;
7074
if (id(ventilation_ctrl) != nullptr) {
71-
flow_m3h = id(ventilation_ctrl)->current_fan_intensity * 4.5f;
75+
int level = id(ventilation_ctrl)->current_fan_intensity;
76+
switch (level) {
77+
case 1: flow_m3h = 17.0f; break;
78+
case 2: flow_m3h = 18.0f; break;
79+
case 3: flow_m3h = 20.0f; break;
80+
case 4: flow_m3h = 21.0f; break;
81+
case 5: flow_m3h = 22.5f; break;
82+
case 6: flow_m3h = 24.0f; break;
83+
case 7: flow_m3h = 29.0f; break;
84+
case 8: flow_m3h = 34.0f; break;
85+
case 9: flow_m3h = 38.5f; break;
86+
case 10: flow_m3h = 43.0f; break;
87+
default: flow_m3h = 0.0f; break;
88+
}
7289
}
7390
auto result = ventosync::hrv::get_calculator().finalize_cycle(flow_m3h);
7491

version.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"project_version": "0.9.8",
3-
"project_date": "2026-05-14",
4-
"project_description": "Fix HRV efficiency sensor mapping and implement volume flow estimation for energy recovery."
2+
"project_version": "0.9.9",
3+
"project_date": "2026-05-16",
4+
"project_description": "Implement precise non-linear volume flow mapping for accurate energy recovery."
55
}

0 commit comments

Comments
 (0)