BUG-TRACKER Solar Forecast ML

Kurz nochmal eine Bestätigung von mir: Bei mir ist es exact so wie bei @pmcl.

Alles ist ebenfalls auf dem aktuellen Stand und auch das Problem schon seit längerer Zeit zu beobachten.

Nach Rechnung aus Produktions Start war heute Production Start um ~4:53 (um 5:00 wurden mir 7:18min angezeigt)

Um 5:05 sind die ersten 0,002kwh registriert worden.

Prognose heute ist heute um 4:55 auf 44,33kwh gesetzt worden.

Prognose rest ist heute um 5:00 von 0 auf 37,65 kwh gesetzt worden.

Stats zeigt für heute eine Prognose von 37,7kwh an.

Laut Log wurden erst die 44,33kwh geschrieben und dann kurz danach die 37,65kwh…

Grüße

Heatseeker

2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_morning_routine - INFO - ================================================================================
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_morning_routine - INFO -   ✓✓✓ MORNING ROUTINE SUCCESSFUL ✓✓✓
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_morning_routine - INFO -   Date: 2026-06-27 | Attempt: 1/3
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_morning_routine - INFO - ================================================================================
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_morning_routine - INFO - 
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.data.data_manager - DEBUG - Best hour forecast saved: hour=14, prediction=5.341 kWh, source=AI + Physics
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - INFO - Best hour saved: 14:00 (5.341 kWh)
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.data.data_manager - DEBUG - Skipping tomorrow forecast update - locked by morning routine
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - DEBUG - Tomorrow forecast saved: 35.45 kWh
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.data.data_manager - DEBUG - Skipping day_after_tomorrow forecast update - locked by morning routine
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - DEBUG - Day-after forecast saved: 35.74 kWh
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - INFO - 
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - INFO -   ✓✓✓ ALL MORNING TASKS COMPLETED SUCCESSFULLY! ✓✓✓
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.production.production_scheduled_tasks - INFO - 
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=1.7)
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=1.7)
2026-06-27 05:00:20 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=1.7)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=stable_good, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=2.8)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=2.8)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=2.8)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=stable_good, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=stable_good, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=stable_good, rain=0.4)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.3)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - DEBUG - Skipping hourly predictions for locked dates: 2026-06-26, 2026-06-27, 2026-06-28, 2026-06-29
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - DEBUG - Forecast strategy summary: hours=96, regime_bias_correction=8, regime_learning_available=96, regime_learning_shrinkage=85, regime_tfs_risk_cap=4, similar_weather_adjustment=15, similar_weather_underforecast_relaxation=15, static_regime_bias=8, tfs_adaptive_blend=48, tfs_policy_adjustment=4
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - INFO - Forecast complete: Today=44.33 kWh, Tomorrow=43.17 kWh, Day After=42.70 kWh, Method=AI + Physics
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - DEBUG - Forecast storage skipped for locked morning forecasts: today, tomorrow, day_after_tomorrow
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.data.data_manager - DEBUG - Saved forecast day: 44.33 kWh (source: fallback_open_meteo_startup_recovery)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.data.data_state_handler - DEBUG - Expected daily production saved: 44.33 kWh
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.coordinator - INFO - Recovery: expected_daily_production set to 44.33 kWh (open_meteo_startup_recovery)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_weather - INFO - Forecast using database: 72 hours across 3 days
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.sensors.sensor_data_collector - DEBUG - Collected external sensor data: {'temperature': None, 'humidity': None, 'wind_speed': None, 'rain': None, 'pressure': 1009.0, 'solar_radiation': None, 'lux': None}
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - DEBUG - Creating forecast (AI + Physics)...
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - DEBUG - Lag-Feature 'production_yesterday' = 42.32 kWh (from DB: 2026-06-26)
2026-06-27 05:00:21 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - INFO - TFS forecast: 62.13 kWh (score 0.55)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=mixed_uncertain, rain=2.6)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=2.6)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=2.6)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=1.9)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=1.9)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=1.9)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.5)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=0.5)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=0.5)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=low_sun_uncertain, rain=0.6)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.6)
2026-06-27 05:00:22 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - INFO - Similar weather underforecast signal suppressed due to rain-gating (regime=rain_overcast, rain=0.6)
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - DEBUG - Skipping hourly predictions for locked dates: 2026-06-27, 2026-06-28, 2026-06-29
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.forecast.forecast_rule_based_strategy - DEBUG - Forecast strategy summary: hours=72, bad_weather_cap=2, bad_weather_confidence=2, bad_weather_consensus_tfs_escape=2, regime_bias_correction=6, regime_learning_available=72, regime_learning_shrinkage=46, regime_tfs_risk_cap=4, similar_weather_adjustment=19, similar_weather_tfs_cap_relaxation=2, similar_weather_underforecast_relaxation=19, static_regime_bias=6, tfs_adaptive_blend=48, tfs_low_sun_envelope=1, tfs_policy_adjustment=8
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - INFO - Forecast complete: Today=37.79 kWh, Tomorrow=36.25 kWh, Day After=35.49 kWh, Method=AI + Physics
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.forecast.forecast_orchestrator - DEBUG - Forecast storage skipped for locked morning forecasts: today, tomorrow, day_after_tomorrow
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.core.core_coordinator_update_helpers - DEBUG - Forecast generated: today=37.79 kWh, tomorrow=36.25 kWh, method=AI + Physics, hourly_entries=72
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.production.production_history - DEBUG - Peak time calculation: Using stored hourly production data
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.core.core_coordinator_update_helpers - DEBUG - Skipping today forecast update - locked by morning routine
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.core.core_coordinator_update_helpers - DEBUG - Skipping tomorrow forecast update - locked by morning routine
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.core.core_coordinator_update_helpers - DEBUG - Skipping day_after_tomorrow forecast update - locked by morning routine
2026-06-27 05:00:23 - custom_components.solar_forecast_ml.core.core_coordinator_update_helpers - DEBUG - Forecasts saved to database (respecting locks)

Hallo @Heatseeker,

ich möchte es noch einmal ganz klar (und absolut konstruktiv) betonen: Das Log muss präzise gelesen werden. Es ist in erster Linie ein Diagnose-Log für Tester, Entwickler und das Debugging – und keine 1:1-Anzeige dessen, was am Ende als gelockter Forecast gespeichert wurde.

Dein Log zeigt allerdings ein Detail, das mir tatsächlich bei der Eingrenzung hilft! Wichtig ist hier die Unterscheidung zwischen einem Coordinator-Rechenlauf und dem tatsächlich gespeicherten Forecast:

  • Die Zeile Forecast complete bedeutet nur: Solar Forecast ML hat eine Prognose berechnet.
  • Direkt danach steht jedoch: Forecast storage skipped for locked morning forecasts.

Und genau das ist der entscheidende Punkt: Der berechnete Forecast wurde für die gelockten Morning-Forecasts nichtgespeichert. Der Lock greift hier also völlig korrekt. Das ist kein Beweis für einen fehlerhaften Forecast-Lock, sondern genau das erwartete Verhalten.

Das berühmte „Aber“

Ich habe beim Prüfen des Logs von @pmcl einen Edge-Case im Startup- und Recovery-Pfad gefunden. Unter bestimmten Timing-Bedingungen (z. B. direkt nach einem Home-Assistant-Neustart) kann ein Recovery-Wert in den internen Tagesprognose-State gelangen. Dadurch kann es vorkommen, dass ein Sensor bzw. ein Fallback-Wert kurzfristig nicht mehr eindeutig zum gelockten Morning-Forecast passt.

Das ist per se erst einmal kein Code-Fehler, sondern kann verschiedene Ursachen außerhalb der Integration haben. Dazu gehören unter anderem:

  • Home Assistant ist temporär ausgelastet.
  • Andere Integrationen brauchen beim Start zu lange.
  • Andere Integrationen blockieren im Hintergrund die Sensor-Plattform.
  • Das System läuft am Leistungslimit.

Fazit & Ausblick

  1. Der Locked Forecast selbst wird durch den normalen Coordinator-Lauf nicht überschrieben.
  2. Die Interpretation von Forecast complete als „erfolgreich gespeichert“ ist an dieser Stelle falsch.
  3. Es gibt jedoch einen durch externe Faktoren bedingten Edge-Case im Recovery-/Sensor-Fallback, den ich beheben werde.

Wie geht es weiter? Ich werde den Code im kommenden Update so absichern, dass Recovery-Werte bei einem vorhandenen gelockten Morning-Forecast nicht mehr in die Tagesprognose-Anzeige durchrutschen können. Damit bleiben Prognose (heute) und Prognose (heute Rest) auch nach verzögerten oder ungünstig getakteten Home-Assistant-Starts absolut konsistent. Das ist die technisch sauberere und robustere Lösung.

Ich würde dich und @pmcl bitten, das Verhalten nach dem Update zu beobachten und mir Feedback zu geben.

Ich kann den Fix allerdings erst umsetzen, wenn ich wieder voll einsatzbereit bin – ich vermute gegen Ende kommender Woche.
Ich informiere euch beide dann direkt. Bei der Gelegenheit werde ich auch die Log-Ausgaben anpassen und schärfer abgrenzen, damit sie weniger Raum für Fehlinterpretationen bieten. (Das Ausdünnen der Logs wurde ohnehin schon öfter gewünscht; ich bin da bei großen Umbauten nur immer in einem gewissen Zwiespalt. Sorry für die Verwirrung, ich gelobe Besserung!).

Vielen Dank @Heatseeker und @pmcl, dass ihr mich darauf aufmerksam gemacht habt und so hartnäckig am Ball geblieben seid! Das Thema steht fest auf meiner To-do-Liste.

PS: Ich habe den Text von meiner Lokal KI “kürzen und straffen lassen” :slight_smile: Daher die Korrektur.. war selbst mir zu wirr und lang :slight_smile: :slight_smile: Ich bitte um Nachsicht :slight_smile: 42 Grad fordern ihren Tribut :slight_smile:

Nachtrag… wenn ihr beiden es möchtet, kann ich euch ein ZIP bereitstellen zum Testen.. !

Danke, dass du dir das angeschaut hast!

Das mit dem locked morning forecast war mir auch aufgefallen, weshalb ich diesen Ausschnitt gewählt hatte.

Kurze Zwischenfrage: Du sagst, dass das Problem nach eine HA-Neustart dazu kommen kann. Wann erfolgte dann denn der HA-Neustart? Also kurz vor der Morning rountine starte ich in der Regel nicht neu. Wenn überhaupt mach ich einen neustart Abends, aber da habe ich aktuelle noch nciht darauf geachtet ob ich am Tag vor dem Problem mal neue gestartet habe.

Bzgl des Testens, kann ich das gerne machen. Musst nur dazu schreiben, wie ich diese Version installiert bekomme. Ich werde jedoch auch frühestens erst am Montag dazu kommen, da ich das ganze Wochenende noch auf Lehrgang bin (tolles Wetter dafür…)

Grüße

Heatseeker

Die Frage habe ich mir auch öfters gestellt und habe mir letztens dazu eine kleine Automation gemacht, die den Neustart in einen Helfer schreibt. Vielleicht hilft es ja dem ein oder anderen:
Automation:

alias: Neustart protokollieren
description: ""
triggers:
  - event: start
    trigger: homeassistant
actions:
  - target:
      entity_id: input_datetime.letzter_ha_neustart
    data:
      datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
    action: input_datetime.set_datetime

Das ganze dann mit einem history-graph angezeigt und ich kann Probleme viel schneller eingrenzen:

type: history-graph
grid_options:
  columns: full
  rows: auto
entities:
  - entity: sensor.solar_forecast_ml_end_of_day_duration
    name: EOD
  - entity: sensor.sfml_update_version_info
    name: SFML Vers.
  - entity: sensor.ha_core_installed_version
    name: HA Core
  - entity: sensor.home_assistant_operating_system_version
    name: HAOS
  - entity: sensor.home_assistant_host_os_agent_version
    name: Agent
  - entity: input_datetime.letzter_ha_neustart
    name: HA Neustart
hours_to_show: 72

Das sieht dann so aus:


Man erkennt auch in den schwarzen Strichen der Sensoren wann ein Neustart erfolgte, aber so finde ich das besser lesbar.

Bitte hier keine Diskussion darüber, wir befinden uns hier im Bug-Tracker-Thread!

Gruß Ralf

Nachtrag: Ich habe für die Anzeige noch zwei weitere Templatesensoren erstellt gehabt, die von der Anzeige benötigt werden:
HA Core Installed Version:

{{ state_attr('update.home_assistant_core_update', 'installed_version') }}

SFML Update Version Info:

{{ state_attr("update.solar_forecast_ml_update", "installed_version") }}

Sorry, habe ich übersehen.

5 „Gefällt mir“

Hallo, den Timezone-Workaround habe ich direkt entfernt. Nochmals vielen Dank für deine Erläuterung dazu in deiner ersten Antwort.

Habe die solar_forecast.db aus dem Unterverzeichnis entfernt und HA neu gestartet, um Solar Forecast zu resetten und alle Daten neu sammeln zu lassen.

Zwei Fehler habe ich in den Logs gefunden bzgl. Netzwerkauflösung bei Anfragen durch Solar Forecast:

> Logger: custom_components.solar_forecast_ml.data.data_weather_expert_blender
> Quelle: runner.py:289 
> Integration: Solar Forecast ML ([Dokumentation](https://github.com/Zara-Toorox/ha-solar-forecast-ml), [Probleme](https://github.com/Zara-Toorox/ha-solar-forecast-ml/issues)) 
> Erstmals aufgetreten: 12:50:49 (2 Vorkommnisse) 
> Zuletzt protokolliert: 12:51:51
>
>  WttrIn fetch error: Cannot connect to host wttr.in:443 ssl:default \[Timeout while contacting DNS servers\]

und

> Dieser Fehler stammt von einer benutzerdefinierten Integration
>
> Logger: custom_components.smartthinq_sensors
> Quelle: helpers/update_coordinator.py:201
> Integration: SmartThinQ LGE Sensors (Dokumentation, Probleme)
> Erstmals aufgetreten: 12:53:24 (11 Vorkommnisse)
> Zuletzt protokolliert: 12:58:34
>
> Unexpected error updating listener 140731888629824 for smartthinq_sensors-LG-WW-WP
> Traceback (most recent call last):
> File “/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py”, line 201, in async_update_listeners
> update_callback()
> \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~^^
> File “/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py”, line 663, in \_handle_coordinator_update
> self.async_write_ha_state()
> \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~^^
> File “/usr/src/homeassistant/homeassistant/helpers/entity.py”, line 1058, in async_write_ha_state
> self.\_async_write_ha_state()
> \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~^^
> File “/usr/src/homeassistant/homeassistant/helpers/entity.py”, line 1208, in \_async_write_ha_state
> ) = self.\__async_calculate_state()
> \~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~^^
> File “/usr/src/homeassistant/homeassistant/helpers/entity.py”, line 1116, in \__async_calculate_state
> if state_attributes := self.state_attributes:
> ^^^^^^^^^^^^^^^^^^^^^
> File “/usr/src/homeassistant/homeassistant/components/water_heater/**init**.py”, line 222, in state_attributes
> ATTR_CURRENT_TEMPERATURE: show_temp(
> \~\~\~\~\~\~\~\~\~^
> self.hass,
> ^^^^^^^^^^
> …<2 lines>…
> self.precision,
> ^^^^^^^^^^^^^^^
> ),
> ^
> File “/usr/src/homeassistant/homeassistant/helpers/temperature.py”, line 23, in display_temp
> raise TypeError(f"Temperature is not a number: {temperature}")
> TypeError: Temperature is not a number: -

Ich vermute, die Fehler kommen bzgl. Anfragen an Forecast.Solar, welches ich ohne API Key konfiguriert habe und die daher limitiert sind.

Ich halte dich auf dem Laufenden, wenn ich Bugs sehe bzw. wenn die neuen Daten erfolgreich erfasst werden.

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: (Neues Update & Features - Hier in der Community 🫶)

1 „Gefällt mir“

Hallo Tom,
auch von mir vielen Dank. Ich könnte auch morgen gern ein ZIP zum testen bekommen und einspielen. Oder als Beta über den Kanal, wie du magst.