Sehr gut – das ist ein klarer Fortschritt 👍
Ich gehe wieder systematisch vor: Vergleich → Interpretation → gezielte Optimierungsschritte.
1️⃣ Direktvergleich: alt vs. neu (harte Fakten)
Metrik Alt Neu Bewertung
Architektur 80–40–20 64–32 ✅ deutlich besser
Aktivierung GAUSSIAN ELLIOT_SYMMETRIC ✅ großer Gewinn
Learning Rate 0.05 0.005 ✅ kritisch wichtig
Training MSE 0.0211 0.0030 🚀 massiv besser
Validation MSE 0.0133 0.0097 ✅ besser
Bias 2556 Wh 630 Wh 🔥 −75 %
Slope −0.0 0.5 🔥 Modell ,,lebt"
MAPE 43.6 % 24.0 % 🚀 halbiert
R² −0.08 0.23 ✅ Struktur gelernt
➡️ Das Modell hat jetzt erstmals reale Prognosefähigkeit.
Kein Vergleich zum alten Lauf.
2️⃣ Was das neue Ergebnis bedeutet
🧠 Modellverhalten
Slope = 0.5
→ Verbrauchsänderungen werden erkannt
→ aber noch gedämpft
Bias = 630 Wh
→ noch systematische Überschätzung / Unterschätzung
→ aber jetzt im kontrollierbaren Bereich
R² = 0.23
→ Modell erklärt ~23 % der Varianz
→ typisch für erste brauchbare WP-Modelle
📉 Fehlerbild
MAE 574 Wh / RMSE 726 Wh
→ Absolut nur leicht besser
→ Relative Fehler sinken deutlich → stabileres Verhalten
MAPE 24 %
→ jetzt praxisnah
→ deutet auf deutlich bessere Niedriglast-Prognosen hin
🧪 Training & Generalisierung
Bestes Modell bei Epoche 638
Validation StdDev: 0.000414 (sehr niedrig!)
BitFail = 0
➡️ Sehr stabiles Training, kaum Overfitting
➡️ Eher leichtes Underfitting als Overfitting
3️⃣ Wo das Modell noch bremst (wichtig!)
❗ Hauptlimitierer #1: Output-Normierung
Du nutzt immer noch:
Hausverbrauch Min=0 / Max=7598 Wh
⚠️ Für Wärmepumpe allein ist das:
zu breit
zu unspezifisch
Ursache für:
Bias ≠ 0
Slope < 1
R² < 0.4
❗ Hauptlimitierer #2: Momentum = 0.2
Das ist sehr niedrig für:
INCREMENTAL
2 Hidden Layers
zeitlich korrelierte Daten
➡️ Das Modell reagiert zu vorsichtig.
4️⃣ Konkrete Feintuning-Empfehlungen (jetzt entscheidend)
🔧 Schritt 1 – Output korrekt skalieren (höchster Hebel)
Empfohlen (falls möglich):
WP-Verbrauch:
Mean = 0
Std = 1 (oder Max = realer WP-Maxwert, z. B. 3500–4500 Wh)
👉 Erwarteter Effekt:
Bias → <300 Wh
Slope → 0.7–0.9
R² → +0.15 bis +0.25
🔧 Schritt 2 – Momentum erhöhen
Von:
0.2 → 0.6 oder 0.7
👉 Effekt:
schnelleres Lernen von Lastwechseln
bessere Abbildung von Takten & Abtauung
🔧 Schritt 3 – BitFail-Limit verschärfen
Von:
0.35 → 0.25
👉 Effekt:
sauberes Early Stopping
weniger ,,flaches Mittelwertlernen"
🔧 Schritt 4 – Epochen begrenzen
Du brauchst keine 15.000 mehr.
Max Epochs: 3000
Early Stop: 200–300
5️⃣ Optionale, aber wirkungsvolle Erweiterungen
🕒 Zeitliche Entkopplung
Wenn möglich:
separates Flag: Tag/Nacht
oder Außentemp < 3°C
➡️ WP-Verhalten ändert sich stark → R² +0.1 typisch
🧹 Feature-Reduktion (112 → ~60)
Typische Kandidaten zum Entfernen:
doppelte PV-Lags
alte Verbrauchsfenster > 24h
hoch korrelierte Sensoren
➡️ Weniger Rauschen → besserer Slope
6️⃣ Fazit (ehrlich)
🔹 Das Modell ist jetzt brauchbar
🔹 Kein Zufallsoutput mehr
🔹 Richtung stimmt klar
Mit Output-Normierung + höherem Momentum bist du sehr wahrscheinlich im Bereich:
R²: 0.45–0.6
MAPE: <20 %
Bias <300 Wh
Wenn du willst, machen wir als Nächstes:
🎯 eine letzte ,,Best-of"-Konfiguration
🔍 Fehleranalyse nach Betriebsmodus
📉 Bias-Korrektur ohne Retraining
letztes KI-Training: 17.01.2026 09:47:41 / Laufzeit in Sekunden: 2120
KI Abfragestatus: ok
letzte KI-Ergebnis Generierungsdauer: 73.02 ms
Verbrauchernummer Wärmepumpe: 08
=== Modellparameter ===
Normierungsgrenzen: PV=16071 Wh, Hausverbrauch: Min=0 Wh / Max=7598 Wh
Trainingsdaten: 7116 Datensätze (Training=5692, Validierung=1424)
Architektur: Inputs=112, Hidden Layers=64-32, Outputs=1
Hyperparameter: Learning Rate=0.005, Momentum=0.2, BitFail-Limit=0.35
Aktivierungen: Hidden=ELLIOT_SYMMETRIC, Steilheit=1.0, Output=LINEAR
Trainingsalgorithmus: INCREMENTAL, Registry Version=v1_heatpump_active_pv
Zufallsgenerator: Mode=1, Periode=20
=== Trainingsmetriken ===
bestes Modell bei Epoche: 638 (von max. 15000)
Training MSE: 0.002967
Validation MSE: 0.009663
Validation MSE Average: 0.011386
Validation MSE Standard Deviation: 0.000414
Validation Bit_Fail: 0
Model Bias: 630 Wh
Model Slope: 0.5
Trainingsbewertung: Retrain
=== Fehlermaße der Prognosen ===
MAE: 574.52 Wh
MedAE: 433.62 Wh
RMSE: 726.49 Wh
RMSE relative: 31 %
RMSE Rating: good
MAPE: 24.03 %
MdAPE: 21.43 %
R²: 0.23
ALTER TABLE history
REORGANIZE PARTITION p7 INTO (
PARTITION p7 VALUES LESS THAN (UNIX_TIMESTAMP('2026-01-01 00:00:00')),
PARTITION p8 VALUES LESS THAN (MAXVALUE)
);ALTER TABLE history
REORGANIZE PARTITION p8 INTO (
PARTITION p8 VALUES LESS THAN (UNIX_TIMESTAMP('2027-01-01 00:00:00')),
PARTITION p9 VALUES LESS THAN (MAXVALUE)
);Zitathttp://<soundcorkip>:8000/marge/streaming/sourceprovidersOK, liefert eine XML-Datei, allerdings ohne sauberen CONTENT-TYPE:
Zitat<sourceProviders>
<sourceprovider id="1">
<createdOn>2012-09-19T12:43:00.000+00:00</createdOn>
<name>PANDORA</name>
<updatedOn>2012-09-19T12:43:00.000+00:00</updatedOn>
</sourceprovider>
...
</sourceprovider>
Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/provider_settingsOK, liefert eine XML-Datei, allerdings ebenfalls ohne sauberen CONTENT-TYPE:
Zitat<providerSettings>Warum allerdings da steht ELIGIBLE_FOR_TRIAL, ist mir undurchsichtig...
<providerSetting>
<boseId><xxxxx></boseId>
<keyName>ELIGIBLE_FOR_TRIAL</keyName>
<value>true</value>
<providerId>14</providerId>
</providerSetting>
</providerSettings>
Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/full==> Liefert einen "Internal Server Error"
Zitathttp://<soundcorkip>:8000/marge/streaming/account/<xxxx>/device/<yyyy>/presets==> Liefert einen "Internal Server Error"
ZitatFastAPI Starting production server 🚀
Searching for package file structure from directories with __init__.py files
2026-01-17 10:44:01,274 [soundcork.datastore] INFO: Initiating Datastore
Importing from /root/soundcork
module 📁 soundcork
├── 🐍 __init__.py
└── 🐍 main.py
code Importing the FastAPI app object from the module with the following code:
from soundcork.main import app
app Using import string: soundcork.main:app
server Server started at http://0.0.0.0:8000
server Documentation at http://0.0.0.0:8000/docs
Logs:
INFO Started server process [586898]
2026-01-17 10:44:01,451 [uvicorn.error] INFO: Started server process [586898]
INFO Waiting for application startup.
2026-01-17 10:44:01,453 [uvicorn.error] INFO: Waiting for application startup.
2026-01-17 10:44:01,455 [soundcork.main] INFO: Starting up soundcork
... Hier diverse Fehlermeldungen von IP-Adressen, die keine BOSE-Boxen sind ...
2026-01-17 10:44:08,674 [soundcork.datastore] INFO: Discovering upnp devices on the network
2026-01-17 10:44:08,675 [soundcork.datastore] INFO: Discovered Bose devices:
- SoundtouchOG
- SoundTouchEG
- SoundTouchDG2
- SoundTouchDG1
2026-01-17 10:44:08,675 [soundcork.main] INFO: done starting up server
INFO Application startup complete.
2026-01-17 10:44:08,675 [uvicorn.error] INFO: Application startup complete.
INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
2026-01-17 10:44:08,680 [uvicorn.error] INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO 192.168.0.105:54420 - "GET /marge/streaming/sourceproviders HTTP/1.1" 200
INFO 192.168.0.105:54422 - "GET /marge/streaming/account/<xxxx>/full HTTP/1.1" 500
ERROR Exception in ASGI application
Traceback (most recent call last):
File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 986, in run
result = context.run(func, *args)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/soundcork/main.py", line 176, in account_full
xml = account_full_xml(account, datastore)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/soundcork/marge.py", line 338, in account_full_xml
for device_id in next(walk(account_dir))[1]:
^^^^^^^^^^^^^^^^^^^^^^^
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/root/soundcork/.venv/lib/python3.12/site-packages/uvicorn/protocols/http/httptools_impl.py", line 416, in run_asgi
result = await app( # type: ignore[func-returns-value]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
return await self.app(scope, receive, send)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/applications.py", line 1134, in __call__
await super().__call__(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__
await self.middleware_stack(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 186, in __call__
raise exc
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/errors.py", line 164, in __call__
await self.app(scope, receive, _send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 63, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
raise exc
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/middleware/asyncexitstack.py", line 18, in __call__
await self.app(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 716, in __call__
await self.middleware_stack(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 736, in app
await route.handle(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/routing.py", line 290, in handle
await self.app(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 124, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
raise exc
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
await app(scope, receive, sender)
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 110, in app
response = await f(request)
^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 390, in app
raw_response = await run_endpoint_function(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/fastapi/routing.py", line 291, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/starlette/concurrency.py", line 38, in run_in_threadpool
return await anyio.to_thread.run_sync(func)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/to_thread.py", line 63, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/root/soundcork/.venv/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2502, in run_sync_in_worker_thread
return await future
^^^^^^^^^^^^
RuntimeError: coroutine raised StopIteration
...
Informationen zum neuronalen Netz der Verbrauchsvorhersage
letztes KI-Training: 15.01.2026 19:35:42 / Laufzeit in Sekunden: 11487
KI Abfragestatus: ok
letzte KI-Ergebnis Generierungsdauer: 122.81 ms
Verbrauchernummer Wärmepumpe: -
=== Modellparameter ===
Normierungsgrenzen: PV=11990 Wh, Hausverbrauch: Min=0 Wh / Max=6468 Wh
Trainingsdaten: 8248 Datensätze (Training=6598, Validierung=1650)
Architektur: Inputs=65, Hidden Layers=80-40-20, Outputs=1
Hyperparameter: Learning Rate=0.005, Momentum=0.7, BitFail-Limit=0.35
Aktivierungen: Hidden=GAUSSIAN, Steilheit=0.9, Output=LINEAR
Trainingsalgorithmus: RPROP, Registry Version=v1_common_active_pv
Zufallsgenerator: Mode=2, Periode=10
=== Trainingsmetriken ===
bestes Modell bei Epoche: 79 (von max. 15000)
Training MSE: 0.001186
Validation MSE: 0.003050
Validation MSE Average: 0.007575
Validation MSE Standard Deviation: 0.000026
Validation Bit_Fail: 2
Model Bias: 109 Wh
Model Slope: 0.9
Trainingsbewertung: Retrain
=== Fehlermaße der Prognosen ===
MAE: 178.02 Wh
MedAE: 54.68 Wh
RMSE: 237.72 Wh
RMSE relative: 57 %
RMSE Rating: very bad
MAPE: 22.68 %
MdAPE: 13.25 %
R²: 0.76
=== Drift-Kennzahlen ===
Drift Score: 1.81
Drift RMSE relative: 160.86
Drift Bias: 254.77
Drift Slope: 0.502
Drift Bewertung: none
MQTT2_Ext:systa-bridge/monitor/temperatureSetFlowCircuit2:.* { "value":111}
MQTT2_Ext:systa-bridge/monitor/temperatureSetHotWater:.* { "value":62.6}
MQTT2_Ext:systa-bridge/monitor/temperatureSetRoomCircuit1:.* { "value":1}
usw... Ca 50 Werte (momentan nur Zahlenwerte)
readingList
MQTT2_Ext:systa-bridge/monitor/timestamp:.* {json2nameValue($EVENT,"timestamp",$JSONMAP)}
Ergibt schon mal
Zitat von: Tueftler1983 am 15 Januar 2026, 21:36:04Hallo ich nochmal
Ich habe jetzt die Version 2.7.2 installiert, diese wird auch als aktuellste angezeigt
ABER
In der aktuell installierten Version wird noch version 2.0.1 angezeigt.
Wo bekommt der die Infos über die aktuelle Version her??