fix(repairs): reliably show statistics-review issue on every HA restart

We have no way to programmatically detect whether the Recorder statistics
have been fixed. Dismissing the Repairs notification does not mean the
problem is resolved, only that the user has seen it.

Revert to delete + create on every async_setup_entry when the flag is set.
This guarantees the issue is visible after every restart until the user
explicitly acknowledges completion by re-saving the display settings in
the options flow.

Remove the dismissed_version auto-clear logic that was treating dismissal
as acknowledgement (it was not).

Update all 5 translation files: replace "Dismiss this notice" with
instructions to re-save display settings as the only way to permanently
close the notification.

Released-Bug: no
This commit is contained in:
Julian Pawlowski 2026-04-15 09:56:24 +00:00
parent e6ec54d8c5
commit 09edcdb9a3
6 changed files with 287 additions and 20 deletions

View file

@ -215,26 +215,18 @@ def _get_access_token(hass: HomeAssistant, entry: ConfigEntry) -> str:
def _check_statistics_review_repair(hass: HomeAssistant, entry: TibberPricesConfigEntry) -> None: def _check_statistics_review_repair(hass: HomeAssistant, entry: TibberPricesConfigEntry) -> None:
"""Ensure the statistics-review repair issue is visible when the flag is set. """Re-create the statistics-review repair issue on every setup when the flag is set.
Uses async_get_or_create so that a user-dismissed issue stays dismissed across restarts. Uses delete + create to guarantee visibility after HA restarts regardless of prior dismissal.
The flag is cleared automatically when the issue has been dismissed (detected on next setup), We have no way to detect whether the Recorder statistics have actually been fixed, so the
or when the user re-saves the currency display settings in the options flow. flag can only be cleared by an explicit user action: re-saving the currency display settings
The options flow uses delete + create whenever the mode changes again, which forces the in the options flow (with the same mode = "I have reviewed everything").
issue back into view for the new change regardless of prior dismissal. Dismissing the HA Repairs notification alone does NOT count as acknowledgement.
""" """
if not entry.data.get(DATA_STATISTICS_REVIEW_REQUIRED): if not entry.data.get(DATA_STATISTICS_REVIEW_REQUIRED):
return return
issue_id = f"currency_display_mode_changed_{entry.entry_id}" issue_id = f"currency_display_mode_changed_{entry.entry_id}"
ir.async_delete_issue(hass, DOMAIN, issue_id)
# If the issue was dismissed by the user, clear the flag and don't recreate it.
issue_registry = ir.async_get(hass)
existing = issue_registry.async_get_issue(DOMAIN, issue_id)
if existing is not None and existing.dismissed_version is not None:
new_data = {k: v for k, v in entry.data.items() if k != DATA_STATISTICS_REVIEW_REQUIRED}
hass.config_entries.async_update_entry(entry, data=new_data)
return
ir.async_create_issue( ir.async_create_issue(
hass, hass,
DOMAIN, DOMAIN,

View file

@ -1012,6 +1012,52 @@
"mixed": "Gemischt" "mixed": "Gemischt"
} }
}, },
"current_price_phase": {
"name": "Aktuelle Preisphase",
"state": {
"rising": "Steigend",
"falling": "Fallend",
"flat": "Flach"
}
},
"next_price_phase": {
"name": "Nächste Preisphase",
"state": {
"rising": "Steigend",
"falling": "Fallend",
"flat": "Flach"
}
},
"current_price_phase_end_time": {
"name": "Current Phase End Time"
},
"current_price_phase_remaining_minutes": {
"name": "Current Phase Remaining"
},
"current_price_phase_duration": {
"name": "Current Phase Duration"
},
"current_price_phase_progress": {
"name": "Current Phase Progress"
},
"next_rising_phase_start_time": {
"name": "Next Rising Phase Start"
},
"next_falling_phase_start_time": {
"name": "Next Falling Phase Start"
},
"next_flat_phase_start_time": {
"name": "Next Flat Phase Start"
},
"next_rising_phase_in_minutes": {
"name": "Time to Next Rising Phase"
},
"next_falling_phase_in_minutes": {
"name": "Time to Next Falling Phase"
},
"next_flat_phase_in_minutes": {
"name": "Time to Next Flat Phase"
},
"chart_data_export": { "chart_data_export": {
"name": "Diagramm-Datenexport", "name": "Diagramm-Datenexport",
"state": { "state": {
@ -1069,6 +1115,15 @@
"best_price_period": { "best_price_period": {
"name": "Bestpreis-Zeitraum" "name": "Bestpreis-Zeitraum"
}, },
"in_rising_price_phase": {
"name": "In Rising Price Phase"
},
"in_falling_price_phase": {
"name": "In Falling Price Phase"
},
"in_flat_price_phase": {
"name": "In Flat Price Phase"
},
"connection": { "connection": {
"name": "Tibber-API-Verbindung" "name": "Tibber-API-Verbindung"
}, },
@ -1156,7 +1211,7 @@
}, },
"currency_display_mode_changed": { "currency_display_mode_changed": {
"title": "Währungsanzeigeeinheit für {home_name} geändert", "title": "Währungsanzeigeeinheit für {home_name} geändert",
"description": "Du hast den Währungsanzeigemodus für **{home_name}** geändert. Alle Preissensor-Werte und -Attribute verwenden jetzt die neue Einheit (z.B. 25,34 ct → 0,2534 € oder umgekehrt).\n\nDer Recorder von Home Assistant zeigt separat einen Dialog **„Die Einheit hat sich geändert“** für betroffene Sensoren — das kann einige Minuten dauern oder bis zum nächsten Statistik-Durchlauf (Warnungen im Log erscheinen früher). Wähle dann **Alle alten Statistikdaten löschen** für einen sauberen Neustart. Wähle nicht „Einheit aktualisieren ohne Konvertierung“: das benennt die alten Zahlen nur um, ohne die Werte anzupassen, und macht die historischen Daten inhaltlich falsch.\n\n**Manuell prüfen:**\n\n1. **Automationen & Templates:** Aktualisiere alle Automationen und Template-Sensoren mit numerischen Preis-Schwellwerten.\n2. **Dashboard-Karten:** Aktualisiere alle Karten mit fest codierten Schwellwerten oder Einheitenbezeichnungen.\n\nSchließe diesen Hinweis, nachdem du deine Automationen und Dashboards überprüft hast." "description": "Du hast den Währungsanzeigemodus für **{home_name}** geändert. Alle Preissensor-Werte und -Attribute verwenden jetzt die neue Einheit (z.B. 25,34 ct → 0,2534 € oder umgekehrt).\n\nDer Recorder von Home Assistant zeigt separat einen Dialog **„Die Einheit hat sich geändert“** für betroffene Sensoren — das kann einige Minuten dauern oder bis zum nächsten Statistik-Durchlauf (Warnungen im Log erscheinen früher). Wähle dann **Alle alten Statistikdaten löschen** für einen sauberen Neustart. Wähle nicht „Einheit aktualisieren ohne Konvertierung“: das benennt die alten Zahlen nur um, ohne die Werte anzupassen, und macht die historischen Daten inhaltlich falsch.\n\n**Manuell prüfen:**\n\n1. **Automationen & Templates:** Aktualisiere alle Automationen und Template-Sensoren mit numerischen Preis-Schwellwerten.\n2. **Dashboard-Karten:** Aktualisiere alle Karten mit fest codierten Schwellwerten oder Einheitenbezeichnungen.\n\nSobald du deine Automationen, Dashboards und Statistiken überprüft hast, gehe zu **Einstellungen → Integrationen → Tibber → Konfigurieren → Anzeigeeinstellungen** und speichere (auch ohne Änderungen). Nur so kannst du diese Meldung dauerhaft schließen."
} }
}, },
"exceptions": { "exceptions": {

View file

@ -1012,6 +1012,52 @@
"mixed": "Mixed" "mixed": "Mixed"
} }
}, },
"current_price_phase": {
"name": "Current Price Phase",
"state": {
"rising": "Rising",
"falling": "Falling",
"flat": "Flat"
}
},
"next_price_phase": {
"name": "Next Price Phase",
"state": {
"rising": "Rising",
"falling": "Falling",
"flat": "Flat"
}
},
"current_price_phase_end_time": {
"name": "Current Phase End Time"
},
"current_price_phase_remaining_minutes": {
"name": "Current Phase Remaining"
},
"current_price_phase_duration": {
"name": "Current Phase Duration"
},
"current_price_phase_progress": {
"name": "Current Phase Progress"
},
"next_rising_phase_start_time": {
"name": "Next Rising Phase Start"
},
"next_falling_phase_start_time": {
"name": "Next Falling Phase Start"
},
"next_flat_phase_start_time": {
"name": "Next Flat Phase Start"
},
"next_rising_phase_in_minutes": {
"name": "Time to Next Rising Phase"
},
"next_falling_phase_in_minutes": {
"name": "Time to Next Falling Phase"
},
"next_flat_phase_in_minutes": {
"name": "Time to Next Flat Phase"
},
"chart_data_export": { "chart_data_export": {
"name": "Chart Data Export", "name": "Chart Data Export",
"state": { "state": {
@ -1069,6 +1115,15 @@
"best_price_period": { "best_price_period": {
"name": "Best Price Period" "name": "Best Price Period"
}, },
"in_rising_price_phase": {
"name": "In Rising Price Phase"
},
"in_falling_price_phase": {
"name": "In Falling Price Phase"
},
"in_flat_price_phase": {
"name": "In Flat Price Phase"
},
"connection": { "connection": {
"name": "Tibber API Connection" "name": "Tibber API Connection"
}, },
@ -1156,7 +1211,7 @@
}, },
"currency_display_mode_changed": { "currency_display_mode_changed": {
"title": "Currency display unit changed for {home_name}", "title": "Currency display unit changed for {home_name}",
"description": "You changed the currency display mode for **{home_name}**. All price sensor values and attributes now use the new unit (e.g. 25.34 ct → 0.2534 € or vice versa).\n\nHome Assistants Recorder will separately show a **“The unit has changed”** dialog for affected sensors — this may take a few minutes or until the next statistics run (log warnings appear earlier). When it appears, choose **Delete all old statistic data** to start fresh. Do not choose “Update the unit without converting”: that re-labels the old numbers without adjusting their values, making the historic data factually incorrect.\n\n**Review manually:**\n\n1. **Automations & Templates:** Update all automations and template sensors that use numeric price thresholds.\n2. **Dashboard Cards:** Update any cards with hardcoded thresholds or unit labels.\n\nDismiss this notice after reviewing your automations and dashboards." "description": "You changed the currency display mode for **{home_name}**. All price sensor values and attributes now use the new unit (e.g. 25.34 ct → 0.2534 € or vice versa).\n\nHome Assistants Recorder will separately show a **“The unit has changed”** dialog for affected sensors — this may take a few minutes or until the next statistics run (log warnings appear earlier). When it appears, choose **Delete all old statistic data** to start fresh. Do not choose “Update the unit without converting”: that re-labels the old numbers without adjusting their values, making the historic data factually incorrect.\n\n**Review manually:**\n\n1. **Automations & Templates:** Update all automations and template sensors that use numeric price thresholds.\n2. **Dashboard Cards:** Update any cards with hardcoded thresholds or unit labels.\n\nOnce you have reviewed your automations, dashboards, and statistics, go to **Settings → Integrations → Tibber → Configure → Display Settings** and save (without any changes if you like). This is the only way to permanently close this notification."
} }
}, },
"exceptions": { "exceptions": {

View file

@ -1012,6 +1012,52 @@
"mixed": "Blandet" "mixed": "Blandet"
} }
}, },
"current_price_phase": {
"name": "Gjeldende Prisfase",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"flat": "Flat"
}
},
"next_price_phase": {
"name": "Neste Prisfase",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"flat": "Flat"
}
},
"current_price_phase_end_time": {
"name": "Current Phase End Time"
},
"current_price_phase_remaining_minutes": {
"name": "Current Phase Remaining"
},
"current_price_phase_duration": {
"name": "Current Phase Duration"
},
"current_price_phase_progress": {
"name": "Current Phase Progress"
},
"next_rising_phase_start_time": {
"name": "Next Rising Phase Start"
},
"next_falling_phase_start_time": {
"name": "Next Falling Phase Start"
},
"next_flat_phase_start_time": {
"name": "Next Flat Phase Start"
},
"next_rising_phase_in_minutes": {
"name": "Time to Next Rising Phase"
},
"next_falling_phase_in_minutes": {
"name": "Time to Next Falling Phase"
},
"next_flat_phase_in_minutes": {
"name": "Time to Next Flat Phase"
},
"chart_data_export": { "chart_data_export": {
"name": "Diagramdataeksport", "name": "Diagramdataeksport",
"state": { "state": {
@ -1069,6 +1115,15 @@
"best_price_period": { "best_price_period": {
"name": "Lavpris-periode" "name": "Lavpris-periode"
}, },
"in_rising_price_phase": {
"name": "In Rising Price Phase"
},
"in_falling_price_phase": {
"name": "In Falling Price Phase"
},
"in_flat_price_phase": {
"name": "In Flat Price Phase"
},
"connection": { "connection": {
"name": "Tibber API-tilkobling" "name": "Tibber API-tilkobling"
}, },
@ -1156,7 +1211,7 @@
}, },
"currency_display_mode_changed": { "currency_display_mode_changed": {
"title": "Valutavisningsenhet endret for {home_name}", "title": "Valutavisningsenhet endret for {home_name}",
"description": "Du endret valutavisningsmodusen for **{home_name}**. Alle prissensorverdier og -attributter bruker nå den nye enheten (f.eks. 25,34 øre → 0,2534 kr eller omvendt).\n\nHome Assistants Recorder viser separat en **„Enheten har endret seg“**-dialog for berørte sensorer — dette kan ta noen minutter eller til neste statistikkjøring (advarsler i loggen dukker opp tidligere). Når den vises, velg **Slett alle gamle statistikkdata** for en ren start. Ikke velg „Oppdater enheten uten konvertering“: det beholder de gamle tallene med ny enhet uten å justere verdiene, og gjør de historiske dataene faktisk feil.\n\n**Gjennomgå manuelt:**\n\n1. **Automatiseringer & maler:** Oppdater alle automatiseringer og malsensorer som bruker numeriske pristerskler.\n2. **Dashboard-kort:** Oppdater kort med hardkodede terskelverdier eller enhetsetiketter.\n\nAvvis dette varselet etter å ha gjennomgått automatiseringene og dashboardene dine." "description": "Du endret valutavisningsmodusen for **{home_name}**. Alle prissensorverdier og -attributter bruker nå den nye enheten (f.eks. 25,34 øre → 0,2534 kr eller omvendt).\n\nHome Assistants Recorder viser separat en **„Enheten har endret seg“**-dialog for berørte sensorer — dette kan ta noen minutter eller til neste statistikkjøring (advarsler i loggen dukker opp tidligere). Når den vises, velg **Slett alle gamle statistikkdata** for en ren start. Ikke velg „Oppdater enheten uten konvertering“: det beholder de gamle tallene med ny enhet uten å justere verdiene, og gjør de historiske dataene faktisk feil.\n\n**Gjennomgå manuelt:**\n\n1. **Automatiseringer & maler:** Oppdater alle automatiseringer og malsensorer som bruker numeriske pristerskler.\n2. **Dashboard-kort:** Oppdater kort med hardkodede terskelverdier eller enhetsetiketter.\n\nNår du har gjennomgått automatiseringer, dashboards og statistikk, gå til **Innstillinger → Integrasjoner → Tibber → Konfigurer → Visningsinnstillinger** og lagre (uten endringer om ønskelig). Dette er den eneste måten å lukke denne meldingen permanent."
} }
}, },
"exceptions": { "exceptions": {

View file

@ -1012,6 +1012,52 @@
"mixed": "Gemengd" "mixed": "Gemengd"
} }
}, },
"current_price_phase": {
"name": "Huidige Prijsfase",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"flat": "Vlak"
}
},
"next_price_phase": {
"name": "Volgende Prijsfase",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"flat": "Vlak"
}
},
"current_price_phase_end_time": {
"name": "Current Phase End Time"
},
"current_price_phase_remaining_minutes": {
"name": "Current Phase Remaining"
},
"current_price_phase_duration": {
"name": "Current Phase Duration"
},
"current_price_phase_progress": {
"name": "Current Phase Progress"
},
"next_rising_phase_start_time": {
"name": "Next Rising Phase Start"
},
"next_falling_phase_start_time": {
"name": "Next Falling Phase Start"
},
"next_flat_phase_start_time": {
"name": "Next Flat Phase Start"
},
"next_rising_phase_in_minutes": {
"name": "Time to Next Rising Phase"
},
"next_falling_phase_in_minutes": {
"name": "Time to Next Falling Phase"
},
"next_flat_phase_in_minutes": {
"name": "Time to Next Flat Phase"
},
"chart_data_export": { "chart_data_export": {
"name": "Grafiekdata Export", "name": "Grafiekdata Export",
"state": { "state": {
@ -1069,6 +1115,15 @@
"best_price_period": { "best_price_period": {
"name": "Beste Prijs Periode" "name": "Beste Prijs Periode"
}, },
"in_rising_price_phase": {
"name": "In Rising Price Phase"
},
"in_falling_price_phase": {
"name": "In Falling Price Phase"
},
"in_flat_price_phase": {
"name": "In Flat Price Phase"
},
"connection": { "connection": {
"name": "Tibber API Verbinding" "name": "Tibber API Verbinding"
}, },
@ -1156,7 +1211,7 @@
}, },
"currency_display_mode_changed": { "currency_display_mode_changed": {
"title": "Valutaweergave-eenheid gewijzigd voor {home_name}", "title": "Valutaweergave-eenheid gewijzigd voor {home_name}",
"description": "Je hebt de valutaweergavemodus voor **{home_name}** gewijzigd. Alle prijssensorwaarden en -attributen gebruiken nu de nieuwe eenheid (bijv. 25,34 ct → 0,2534 € of andersom).\n\nHome Assistants Recorder toont afzonderlijk een **„De eenheid is gewijzigd“**-dialoogvenster voor getroffen sensoren — dit kan enkele minuten duren of tot de volgende statistiekenrun (logwaarschuwingen verschijnen eerder). Kies dan **Alle oude statistiekgegevens verwijderen** voor een schone start. Kies niet „Eenheid bijwerken zonder conversie“: dat hernoemt de oude getallen zonder de waarden aan te passen, waardoor de historische gegevens inhoudelijk onjuist worden.\n\n**Handmatig controleren:**\n\n1. **Automatiseringen & templates:** Werk alle automatiseringen en template-sensoren bij die numerieke prijsdrempels gebruiken.\n2. **Dashboard-kaarten:** Werk kaarten bij met hardgecodeerde drempelwaarden of eenheidslabels.\n\nSluit deze melding nadat je je automatiseringen en dashboards hebt gecontroleerd." "description": "Je hebt de valutaweergavemodus voor **{home_name}** gewijzigd. Alle prijssensorwaarden en -attributen gebruiken nu de nieuwe eenheid (bijv. 25,34 ct → 0,2534 € of andersom).\n\nHome Assistants Recorder toont afzonderlijk een **„De eenheid is gewijzigd“**-dialoogvenster voor getroffen sensoren — dit kan enkele minuten duren of tot de volgende statistiekenrun (logwaarschuwingen verschijnen eerder). Kies dan **Alle oude statistiekgegevens verwijderen** voor een schone start. Kies niet „Eenheid bijwerken zonder conversie“: dat hernoemt de oude getallen zonder de waarden aan te passen, waardoor de historische gegevens inhoudelijk onjuist worden.\n\n**Handmatig controleren:**\n\n1. **Automatiseringen & templates:** Werk alle automatiseringen en template-sensoren bij die numerieke prijsdrempels gebruiken.\n2. **Dashboard-kaarten:** Werk kaarten bij met hardgecodeerde drempelwaarden of eenheidslabels.\n\nZodra je je automatiseringen, dashboards en statistieken hebt gecontroleerd, ga naar **Instellingen → Integraties → Tibber → Configureren → Weergave-instellingen** en sla op (zonder wijzigingen indien gewenst). Dit is de enige manier om deze melding permanent te sluiten."
} }
}, },
"exceptions": { "exceptions": {

View file

@ -1012,6 +1012,52 @@
"mixed": "Blandad" "mixed": "Blandad"
} }
}, },
"current_price_phase": {
"name": "Aktuell Prisfas",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"flat": "Flat"
}
},
"next_price_phase": {
"name": "Nästa Prisfas",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"flat": "Flat"
}
},
"current_price_phase_end_time": {
"name": "Current Phase End Time"
},
"current_price_phase_remaining_minutes": {
"name": "Current Phase Remaining"
},
"current_price_phase_duration": {
"name": "Current Phase Duration"
},
"current_price_phase_progress": {
"name": "Current Phase Progress"
},
"next_rising_phase_start_time": {
"name": "Next Rising Phase Start"
},
"next_falling_phase_start_time": {
"name": "Next Falling Phase Start"
},
"next_flat_phase_start_time": {
"name": "Next Flat Phase Start"
},
"next_rising_phase_in_minutes": {
"name": "Time to Next Rising Phase"
},
"next_falling_phase_in_minutes": {
"name": "Time to Next Falling Phase"
},
"next_flat_phase_in_minutes": {
"name": "Time to Next Flat Phase"
},
"chart_data_export": { "chart_data_export": {
"name": "Diagramdataexport", "name": "Diagramdataexport",
"state": { "state": {
@ -1069,6 +1115,15 @@
"best_price_period": { "best_price_period": {
"name": "Bästa Prisperiod" "name": "Bästa Prisperiod"
}, },
"in_rising_price_phase": {
"name": "In Rising Price Phase"
},
"in_falling_price_phase": {
"name": "In Falling Price Phase"
},
"in_flat_price_phase": {
"name": "In Flat Price Phase"
},
"connection": { "connection": {
"name": "Tibber API-anslutning" "name": "Tibber API-anslutning"
}, },
@ -1156,7 +1211,7 @@
}, },
"currency_display_mode_changed": { "currency_display_mode_changed": {
"title": "Valutavisningsenhet ändrad för {home_name}", "title": "Valutavisningsenhet ändrad för {home_name}",
"description": "Du ändrade valutavisningsläget för **{home_name}**. Alla prissensorvärden och -attribut använder nu den nya enheten (t.ex. 25,34 öre → 0,2534 kr eller tvärtom).\n\nHome Assistants Recorder visar separat en **„Enheten har ändrats“**-dialog för berörda sensorer — det kan ta några minuter eller till nästa statistikkörning (loggvarningar dyker upp tidigare). När den visas, välj **Ta bort alla gamla statistikdata** för en ren start. Välj inte „Uppdatera enheten utan konvertering“: det behåller de gamla talen med ny enhet utan att justera värdena, vilket gör historiska data faktiskt felaktiga.\n\n**Granska manuellt:**\n\n1. **Automatiseringar & mallar:** Uppdatera alla automatiseringar och mallsensorer som använder numeriska priströsklar.\n2. **Dashboard-kort:** Uppdatera kort med hårdkodade tröskelvärden eller enhetsetiketter.\n\nStäng detta meddelande efter att du har granskat dina automatiseringar och dashboards." "description": "Du ändrade valutavisningsläget för **{home_name}**. Alla prissensorvärden och -attribut använder nu den nya enheten (t.ex. 25,34 öre → 0,2534 kr eller tvärtom).\n\nHome Assistants Recorder visar separat en **„Enheten har ändrats“**-dialog för berörda sensorer — det kan ta några minuter eller till nästa statistikkörning (loggvarningar dyker upp tidigare). När den visas, välj **Ta bort alla gamla statistikdata** för en ren start. Välj inte „Uppdatera enheten utan konvertering“: det behåller de gamla talen med ny enhet utan att justera värdena, vilket gör historiska data faktiskt felaktiga.\n\n**Granska manuellt:**\n\n1. **Automatiseringar & mallar:** Uppdatera alla automatiseringar och mallsensorer som använder numeriska priströsklar.\n2. **Dashboard-kort:** Uppdatera kort med hårdkodade tröskelvärden eller enhetsetiketter.\n\nNär du har granskat dina automatiseringar, instrumentpaneler och statistik, gå till **Inställningar → Integrationer → Tibber → Konfigurera → Visningsinställningar** och spara (utan ändringar om du vill). Det är det enda sättet att permanent stänga det här meddelandet."
} }
}, },
"exceptions": { "exceptions": {