hass.tibber_prices/custom_components/tibber_prices/translations/nl.json
Julian Pawlowski 383b495545
Feature/adaptive defaults (#22)
* feat(period-calc): adaptive defaults + remove volatility filter

Major improvements to period calculation with smarter defaults and
simplified configuration:

**Adaptive Defaults:**
- ENABLE_MIN_PERIODS: true (was false) - Always try to find periods
- MIN_PERIODS target: 2 periods/day (ensures coverage)
- BEST_PRICE_MAX_LEVEL: "cheap" (was "any") - Prefer genuinely cheap
- PEAK_PRICE_MIN_LEVEL: "expensive" (was "any") - Prefer genuinely expensive
- GAP_TOLERANCE: 1 (was 0) - Allow 1-level deviations in sequences
- MIN_DISTANCE_FROM_AVG: 5% (was 2%) - Ensure significance
- PEAK_PRICE_MIN_PERIOD_LENGTH: 30min (was 60min) - More responsive
- PEAK_PRICE_FLEX: -20% (was -15%) - Better peak detection

**Volatility Filter Removal:**
- Removed CONF_BEST_PRICE_MIN_VOLATILITY from const.py
- Removed CONF_PEAK_PRICE_MIN_VOLATILITY from const.py
- Removed volatility filter UI controls from config_flow.py
- Removed filter_periods_by_volatility() calls from coordinator.py
- Updated all 5 translations (de, en, nb, nl, sv)

**Period Calculation Logic:**
- Level filter now integrated into _build_periods() (applied during
  interval qualification, not as post-filter)
- Gap tolerance implemented via _check_level_with_gap_tolerance()
- Short periods (<1.5h) use strict filtering (no gap tolerance)
- Relaxation now passes level_filter + gap_count directly to
  PeriodConfig
- show_periods check skipped when relaxation enabled (relaxation
  tries "any" as fallback)

**Documentation:**
- Complete rewrite of docs/user/period-calculation.md:
  * Visual examples with timelines
  * Step-by-step explanation of 4-step process
  * Configuration scenarios (5 common use cases)
  * Troubleshooting section with specific fixes
  * Advanced topics (per-day independence, early stop, etc.)
- Updated README.md: "volatility" → "distance from average"

Impact: Periods now reliably appear on most days with meaningful
quality filters. Users get warned about expensive periods and notified
about cheap opportunities without manual tuning. Relaxation ensures
coverage while keeping filters as strict as possible.

Breaking change: Volatility filter removed (was never a critical
feature, often confused users). Existing configs continue to work
(removed keys are simply ignored).

* feat(periods): modularize period_utils and add statistical outlier filtering

Refactored monolithic period_utils.py (1800 lines) into focused modules
for better maintainability and added advanced outlier filtering with
smart impact tracking.

Modular structure:
- types.py: Type definitions and constants (89 lines)
- level_filtering.py: Level filtering with gap tolerance (121 lines)
- period_building.py: Period construction from intervals (238 lines)
- period_statistics.py: Statistics and summaries (318 lines)
- period_merging.py: Overlap resolution (382 lines)
- relaxation.py: Per-day relaxation strategy (547 lines)
- core.py: Main API orchestration (251 lines)
- outlier_filtering.py: Statistical spike detection (294 lines)
- __init__.py: Public API exports (62 lines)

New statistical outlier filtering:
- Linear regression for trend-based spike detection
- 2 standard deviation confidence intervals (95%)
- Symmetry checking to preserve legitimate price shifts
- Enhanced zigzag detection with relative volatility (catches clusters)
- Replaces simple average smoothing with trend-based predictions

Smart impact tracking:
- Tests if original price would have passed criteria
- Only counts smoothed intervals that actually changed period formation
- Tracks level gap tolerance usage separately
- Both attributes only appear when > 0 (clean UI)

New period attributes:
- period_interval_smoothed_count: Intervals kept via outlier smoothing
- period_interval_level_gap_count: Intervals kept via gap tolerance

Impact: Statistical outlier filtering prevents isolated price spikes from
breaking continuous periods while preserving data integrity. All statistics
use original prices. Smart tracking shows only meaningful interventions,
making it clear when tolerance mechanisms actually influenced results.

Backwards compatible: All public APIs re-exported from period_utils package.

* Update docs/user/period-calculation.md

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update custom_components/tibber_prices/const.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update custom_components/tibber_prices/coordinator.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update custom_components/tibber_prices/const.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* docs(periods): fix corrupted period-calculation.md and add outlier filtering documentation

Completely rewrote period-calculation.md after severe corruption (massive text
duplication throughout the file made it 2489 lines).

Changes:
- Fixed formatting: Removed all duplicate text and headers
- Reduced file size: 2594 lines down to 516 lines (clean, readable structure)
- Added section 5: "Statistical Outlier Filtering (NEW)" explaining:
  - Linear regression-based spike detection (95% confidence intervals)
  - Symmetry checking to preserve legitimate price shifts
  - Enhanced zigzag detection with relative volatility
  - Data integrity guarantees (original prices always used)
  - New period attributes: period_interval_smoothed_count
- Added troubleshooting: "Price spikes breaking periods" section
- Added technical details: Algorithm constants and implementation notes

Impact: Users can now understand how outlier filtering prevents isolated
price spikes from breaking continuous periods. Documentation is readable
again with no duplicate content.

* fix(const): improve clarity in comments regarding period lengths for price alerts

* docs(periods): improve formatting and clarity in period-calculation.md

* Initial plan

* refactor: convert flexibility_pct to ratio once at function entry

Co-authored-by: jpawlowski <75446+jpawlowski@users.noreply.github.com>

* Update custom_components/tibber_prices/const.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update custom_components/tibber_prices/period_utils/period_building.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update custom_components/tibber_prices/period_utils/relaxation.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

---------

Co-authored-by: Julian Pawlowski <jpawlowski@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2025-11-13 23:51:29 +01:00

514 lines
24 KiB
JSON

{
"config": {
"step": {
"user": {
"description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek https://developer.tibber.com.",
"data": {
"access_token": "API-toegangstoken"
},
"submit": "Token valideren"
},
"select_home": {
"description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.",
"data": {
"home_id": "Huis"
},
"title": "Kies een huis",
"submit": "Huis selecteren"
},
"finish": {
"description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.",
"data": {
"home_id": "Huis-ID"
},
"title": "Kies een huis",
"submit": "Huis selecteren"
},
"reauth_confirm": {
"title": "Tibber Prijs-integratie opnieuw authenticeren",
"description": "Het toegangstoken voor Tibber is niet langer geldig. Voer een nieuw API-toegangstoken in om deze integratie te blijven gebruiken.\n\nOm een nieuw API-toegangstoken te genereren, bezoek https://developer.tibber.com.",
"data": {
"access_token": "API-toegangstoken"
},
"submit": "Token bijwerken"
}
},
"error": {
"auth": "Het Tibber-toegangstoken is ongeldig.",
"connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.",
"unknown": "Onverwachte fout",
"cannot_connect": "Verbinding mislukt",
"invalid_access_token": "Ongeldig toegangstoken",
"missing_homes": "Het nieuwe toegangstoken heeft geen toegang tot alle geconfigureerde huizen. Gebruik een toegangstoken dat toegang heeft tot dezelfde Tibber-huizen."
},
"abort": {
"already_configured": "Integratie is al geconfigureerd",
"entry_not_found": "Tibber-configuratie-item niet gevonden.",
"setup_complete": "Installatie voltooid! Je kunt aanvullende opties voor Tibber-prijzen wijzigen in de integratie-opties na het sluiten van dit dialoogvenster.",
"reauth_successful": "Herauthenticatie succesvol. De integratie is bijgewerkt met het nieuwe toegangstoken."
}
},
"common": {
"step_progress": "Stap {step_num} van {total_steps}"
},
"config_subentries": {
"home": {
"initiate_flow": {
"user": "Tibber-huis toevoegen"
},
"title": "Tibber-huis toevoegen",
"step": {
"user": {
"title": "Tibber-huis toevoegen",
"description": "Selecteer een huis om toe te voegen aan je Tibber-integratie.\n\n**Opmerking:** Na het toevoegen van dit huis kun je extra huizen toevoegen via het contextmenu van de integratie door \"Tibber-huis toevoegen\" te selecteren.",
"data": {
"home_id": "Huis"
}
}
},
"error": {
"api_error": "Ophalen van huizen van Tibber API mislukt"
},
"abort": {
"no_parent_entry": "Bovenliggend item niet gevonden",
"no_access_token": "Geen toegangstoken beschikbaar",
"home_not_found": "Geselecteerd huis niet gevonden",
"api_error": "Ophalen van huizen van Tibber API mislukt",
"no_available_homes": "Geen extra huizen beschikbaar om toe te voegen. Alle huizen van je Tibber-account zijn al toegevoegd."
}
}
},
"options": {
"step": {
"init": {
"title": "Algemene instellingen",
"description": "{step_progress}\n\nConfigureer algemene instellingen voor Tibber Prijsinformatie & Beoordelingen.\n\nGebruiker: {user_login}",
"data": {
"extended_descriptions": "Uitgebreide beschrijvingen tonen in entiteitsattributen"
},
"submit": "Volgende naar stap 2"
},
"price_rating": {
"title": "Prijsbeoordelingsdrempels",
"description": "{step_progress}\n\nConfigureer drempels voor prijsbeoordelingsniveaus (laag/normaal/hoog) op basis van vergelijking met het voortschrijdend 24-uurs gemiddelde.",
"data": {
"price_rating_threshold_low": "Lage beoordelingsdrempel (% onder voortschrijdend gemiddelde)",
"price_rating_threshold_high": "Hoge beoordelingsdrempel (% boven voortschrijdend gemiddelde)"
},
"submit": "Volgende naar stap 3"
},
"best_price": {
"title": "Instellingen beste prijsperiode",
"description": "{step_progress}\n\nConfigureer instellingen voor de Beste Prijsperiode binaire sensor. Deze sensor is actief tijdens perioden met de laagste elektriciteitsprijzen.",
"data": {
"best_price_min_period_length": "Minimale periode lengte",
"best_price_flex": "Flexibiliteit: Maximaal % boven minimumprijs",
"best_price_min_distance_from_avg": "Minimale afstand: Vereist % onder dagelijks gemiddelde",
"best_price_max_level": "Prijsniveaufilter (Optioneel)",
"best_price_max_level_gap_count": "Gaptolerantie voor niveaufilter",
"enable_min_periods_best": "Probeer minimum aantal periodes te bereiken",
"min_periods_best": "Minimum aantal periodes",
"relaxation_step_best": "Ontspanningsstap"
},
"data_description": {
"best_price_max_level": "Toon alleen beste prijsperiodes als ze intervallen bevatten met prijsniveaus ≤ geselecteerde waarde. Bijvoorbeeld: selecteren van 'Goedkoop' betekent dat de periode minstens één 'ZEER_GOEDKOOP' of 'GOEDKOOP' interval moet hebben. Dit zorgt ervoor dat 'beste prijs'-periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer 'Alle' om beste prijzen te tonen ongeacht hun absolute prijsniveau.",
"enable_min_periods_best": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je kansen hebt om van lage prijzen te profiteren, zelfs op dagen met ongebruikelijke prijspatronen.",
"min_periods_best": "Minimum aantal beste prijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1",
"relaxation_step_best": "Percentage van de oorspronkelijke flexibiliteitsdrempel om toe te voegen per ontspanningsstap. Bijvoorbeeld: met 15% flexibiliteit en 25% stapgrootte zullen de filters 15%, 18,75%, 22,5%, enz. proberen. Hogere waarden betekenen snellere ontspanning maar minder precisie.",
"best_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met 'Goedkoop' filter en gaptelling 1 wordt de reeks 'GOEDKOOP, GOEDKOOP, NORMAAL, GOEDKOOP' geaccepteerd (NORMAAL is één stap boven GOEDKOOP). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. Standaard: 0 (strikte filtering, geen tolerantie)."
},
"submit": "Volgende naar stap 5"
},
"peak_price": {
"title": "Instellingen piekprijsperiode",
"description": "{step_progress}\n\nConfigureer instellingen voor de Piekprijsperiode binaire sensor. Deze sensor is actief tijdens perioden met de hoogste elektriciteitsprijzen.",
"data": {
"peak_price_min_period_length": "Minimale periode lengte",
"peak_price_flex": "Flexibiliteit: Maximaal % onder maximumprijs (negatieve waarde)",
"peak_price_min_distance_from_avg": "Minimale afstand: Vereist % boven dagelijks gemiddelde",
"peak_price_min_level": "Prijsniveaufilter (Optioneel)",
"peak_price_max_level_gap_count": "Gaptolerantie voor niveaufilter",
"enable_min_periods_peak": "Probeer minimum aantal periodes te bereiken",
"min_periods_peak": "Minimum aantal periodes",
"relaxation_step_peak": "Ontspanningsstap"
},
"data_description": {
"peak_price_min_level": "Toon alleen piekprijsperiodes als ze intervallen bevatten met prijsniveaus ≥ geselecteerde waarde. Bijvoorbeeld: selecteren van 'Duur' betekent dat de periode minstens één 'DUUR' of 'ZEER_DUUR' interval moet hebben. Dit zorgt ervoor dat 'piekprijs'-periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer 'Alle' om piekprijzen te tonen ongeacht hun absolute prijsniveau.",
"enable_min_periods_peak": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je wordt gewaarschuwd voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.",
"min_periods_peak": "Minimum aantal piekprijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1",
"relaxation_step_peak": "Percentage van de oorspronkelijke flexibiliteitsdrempel om toe te voegen per ontspanningsstap. Bijvoorbeeld: met -15% flexibiliteit en 25% stapgrootte zullen de filters -15%, -18,75%, -22,5%, enz. proberen. Hogere waarden betekenen snellere ontspanning maar minder precisie.",
"peak_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met 'Duur' filter en gaptelling 2 wordt de reeks 'DUUR, NORMAAL, NORMAAL, DUUR' geaccepteerd (NORMAAL is één stap onder DUUR). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. Standaard: 0 (strikte filtering, geen tolerantie)."
},
"submit": "Volgende naar stap 6"
},
"price_trend": {
"title": "Prijstrenddrempels",
"description": "{step_progress}\n\nConfigureer drempels voor prijstrendsensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen stijgen, dalen of stabiel zijn.",
"data": {
"price_trend_threshold_rising": "Stijgende drempel (% boven huidige prijs)",
"price_trend_threshold_falling": "Dalende drempel (% onder huidige prijs, negatieve waarde)"
},
"submit": "Configuratie voltooien"
},
"volatility": {
"title": "Prijsvolatiliteit Drempels",
"description": "{step_progress}\n\nConfigureer drempels voor volatiliteitsclassificatie. Volatiliteit meet prijsschommelingen (spreiding tussen min/max) in kleinste valuta-eenheid (ct/øre). Deze drempels worden gebruikt door volatiliteitssensoren en periodefilters.",
"data": {
"volatility_threshold_moderate": "Matige drempel (ct/øre, spreiding ≥ deze waarde)",
"volatility_threshold_high": "Hoge drempel (ct/øre, spreiding ≥ deze waarde)",
"volatility_threshold_very_high": "Zeer hoge drempel (ct/øre, spreiding ≥ deze waarde)"
},
"submit": "Volgende naar stap 4"
}
},
"error": {
"auth": "Het Tibber-toegangstoken is ongeldig.",
"connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.",
"unknown": "Er is een onverwachte fout opgetreden. Controleer de logboeken voor details.",
"cannot_connect": "Verbinding mislukt",
"invalid_access_token": "Ongeldig toegangstoken",
"different_home": "Het toegangstoken is niet geldig voor de huis-ID waarvoor deze integratie is geconfigureerd."
},
"abort": {
"entry_not_found": "Tibber-configuratie-item niet gevonden."
}
},
"entity": {
"sensor": {
"current_price": {
"name": "Huidige elektriciteitsprijs"
},
"next_interval_price": {
"name": "Volgende prijs"
},
"previous_interval_price": {
"name": "Vorige elektriciteitsprijs"
},
"current_hour_average": {
"name": "Huidig uurgemiddelde prijs"
},
"next_hour_average": {
"name": "Volgend uurgemiddelde prijs"
},
"price_level": {
"name": "Huidig prijsniveau",
"state": {
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
},
"next_interval_price_level": {
"name": "Volgend prijsniveau",
"state": {
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
},
"previous_interval_price_level": {
"name": "Vorig prijsniveau",
"state": {
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
},
"current_hour_price_level": {
"name": "Huidig uurprijsniveau",
"state": {
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
},
"next_hour_price_level": {
"name": "Volgend uurprijsniveau",
"state": {
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
},
"lowest_price_today": {
"name": "Laagste prijs vandaag"
},
"highest_price_today": {
"name": "Hoogste prijs vandaag"
},
"average_price_today": {
"name": "Gemiddelde prijs vandaag"
},
"lowest_price_tomorrow": {
"name": "Laagste prijs morgen"
},
"highest_price_tomorrow": {
"name": "Hoogste prijs morgen"
},
"average_price_tomorrow": {
"name": "Gemiddelde prijs morgen"
},
"trailing_price_average": {
"name": "Voortschrijdend 24u gemiddelde prijs"
},
"leading_price_average": {
"name": "Vooruitlopend 24u gemiddelde prijs"
},
"trailing_price_min": {
"name": "Voortschrijdend 24u minimumprijs"
},
"trailing_price_max": {
"name": "Voortschrijdend 24u maximumprijs"
},
"leading_price_min": {
"name": "Vooruitlopend 24u minimumprijs"
},
"leading_price_max": {
"name": "Vooruitlopend 24u maximumprijs"
},
"price_rating": {
"name": "Huidige prijsbeoordeling",
"state": {
"low": "Laag",
"normal": "Normaal",
"high": "Hoog"
}
},
"next_interval_price_rating": {
"name": "Volgende prijsbeoordeling",
"state": {
"low": "Laag",
"normal": "Normaal",
"high": "Hoog"
}
},
"previous_interval_price_rating": {
"name": "Vorige prijsbeoordeling",
"state": {
"low": "Laag",
"normal": "Normaal",
"high": "Hoog"
}
},
"current_hour_price_rating": {
"name": "Huidig uurprijs beoordeling",
"state": {
"low": "Laag",
"normal": "Normaal",
"high": "Hoog"
}
},
"next_hour_price_rating": {
"name": "Volgend uurprijs beoordeling",
"state": {
"low": "Laag",
"normal": "Normaal",
"high": "Hoog"
}
},
"next_avg_1h": {
"name": "Volgende 1u gemiddelde prijs"
},
"next_avg_2h": {
"name": "Volgende 2u gemiddelde prijs"
},
"next_avg_3h": {
"name": "Volgende 3u gemiddelde prijs"
},
"next_avg_4h": {
"name": "Volgende 4u gemiddelde prijs"
},
"next_avg_5h": {
"name": "Volgende 5u gemiddelde prijs"
},
"next_avg_6h": {
"name": "Volgende 6u gemiddelde prijs"
},
"next_avg_8h": {
"name": "Volgende 8u gemiddelde prijs"
},
"next_avg_12h": {
"name": "Volgende 12u gemiddelde prijs"
},
"price_trend_1h": {
"name": "Prijstrend (1u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_2h": {
"name": "Prijstrend (2u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_3h": {
"name": "Prijstrend (3u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_4h": {
"name": "Prijstrend (4u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_5h": {
"name": "Prijstrend (5u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_6h": {
"name": "Prijstrend (6u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_8h": {
"name": "Prijstrend (8u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"price_trend_12h": {
"name": "Prijstrend (12u)",
"state": {
"rising": "Stijgend",
"falling": "Dalend",
"stable": "Stabiel"
}
},
"daily_rating": {
"name": "Dagelijkse prijsbeoordeling"
},
"monthly_rating": {
"name": "Maandelijkse prijsbeoordeling"
},
"data_timestamp": {
"name": "Prijsgegevens Vervaldatum"
},
"today_volatility": {
"name": "Vandaag Prijsvolatiliteit",
"state": {
"low": "Laag",
"moderate": "Gematigd",
"high": "Hoog",
"very_high": "Zeer Hoog"
}
},
"tomorrow_volatility": {
"name": "Morgen Prijsvolatiliteit",
"state": {
"low": "Laag",
"moderate": "Gematigd",
"high": "Hoog",
"very_high": "Zeer Hoog"
}
},
"next_24h_volatility": {
"name": "Volgende 24u Prijsvolatiliteit",
"state": {
"low": "Laag",
"moderate": "Gematigd",
"high": "Hoog",
"very_high": "Zeer Hoog"
}
},
"today_tomorrow_volatility": {
"name": "Vandaag+Morgen Prijsvolatiliteit",
"state": {
"low": "Laag",
"moderate": "Gematigd",
"high": "Hoog",
"very_high": "Zeer Hoog"
}
},
"price_forecast": {
"name": "Prijsprognose"
}
},
"binary_sensor": {
"peak_price_period": {
"name": "Piekprijsperiode"
},
"best_price_period": {
"name": "Beste prijsperiode"
},
"connection": {
"name": "Tibber API-verbinding"
},
"tomorrow_data_available": {
"name": "Gegevens van morgen beschikbaar"
}
}
},
"issues": {
"new_homes_available": {
"title": "Nieuwe Tibber-huizen gedetecteerd",
"description": "We hebben {count} nieuw(e) huis/huizen op je Tibber-account gedetecteerd: {homes}. Je kunt ze toevoegen aan Home Assistant via de Tibber-integratieconfiguratie."
},
"homes_removed": {
"title": "Tibber-huizen verwijderd",
"description": "We hebben gedetecteerd dat {count} huis/huizen zijn verwijderd van je Tibber-account: {homes}. Controleer je Tibber-integratieconfiguratie."
}
},
"services": {
"refresh_user_data": {
"name": "Gebruikersgegevens vernieuwen",
"description": "Forceert een vernieuwing van de gebruikersgegevens (huizen, profielinformatie) van de Tibber API. Dit kan handig zijn na het maken van wijzigingen in je Tibber-account of bij het oplossen van verbindingsproblemen.",
"fields": {
"entry_id": {
"name": "Item-ID",
"description": "De config-item-ID voor de Tibber-integratie."
}
}
}
},
"selector": {
"volatility": {
"options": {
"low": "Laag",
"moderate": "Matig",
"high": "Hoog",
"very_high": "Zeer hoog"
}
},
"price_level": {
"options": {
"any": "Alle",
"very_cheap": "Zeer goedkoop",
"cheap": "Goedkoop",
"normal": "Normaal",
"expensive": "Duur",
"very_expensive": "Zeer duur"
}
}
},
"title": "Tibber Prijsinformatie & Beoordelingen"
}