{
  "config": {
    "step": {
      "account_choice": {
        "title": "Kies Account",
        "description": "Je kunt een ander huis van een bestaand Tibber-account toevoegen of een nieuw API-token invoeren voor een ander account.",
        "data": {
          "account_choice": "Account"
        },
        "submit": "Doorgaan →"
      },
      "new_token": {
        "title": "Voer API-Token In",
        "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).",
        "data": {
          "access_token": "API-toegangstoken"
        },
        "submit": "Token valideren"
      },
      "user": {
        "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).",
        "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 Price 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 [{tibber_url}]({tibber_url}).",
        "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.",
      "home_already_configured": "Dit huis is al geconfigureerd in een ander item. Elk huis kan slechts één keer worden geconfigureerd.",
      "no_active_subscription": "Dit huis heeft geen actief Tibber-contract. Alleen huizen met actieve elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.",
      "subscription_expired": "Het Tibber-contract voor dit huis is verlopen. Alleen huizen met actieve of toekomstige elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.",
      "future_subscription_warning": "Let op: Het Tibber-contract van dit huis is nog niet gestart. De functionaliteit kan beperkt zijn totdat het contract actief wordt."
    },
    "abort": {
      "already_configured": "Alle beschikbare Tibber-huizen zijn al geconfigureerd. Elk huis kan slechts één keer worden geconfigureerd.",
      "entry_not_found": "Tibber-configuratie-item niet gevonden.",
      "setup_complete": "Installatie voltooid! Je kunt extra opties voor Tibber Prices wijzigen in de integratie-opties na het sluiten van dit dialoogvenster.",
      "reauth_successful": "Herauthenticatie geslaagd. De integratie is bijgewerkt met het nieuwe toegangstoken."
    }
  },
  "common": {
    "step_progress": "{step_num} / {total_steps}",
    "override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit",
    "override_warning_and": "en",
    "override_field_label_best_price_min_period_length": "Minimale periodelengte",
    "override_field_label_best_price_max_level_gap_count": "Gaptolerantie",
    "override_field_label_best_price_flex": "Flexibiliteit",
    "override_field_label_best_price_min_distance_from_avg": "Minimale afstand",
    "override_field_label_enable_min_periods_best": "Minimum aantal bereiken",
    "override_field_label_min_periods_best": "Minimale periodes",
    "override_field_label_relaxation_attempts_best": "Ontspanningspogingen",
    "override_field_label_peak_price_min_period_length": "Minimale periodelengte",
    "override_field_label_peak_price_max_level_gap_count": "Gaptolerantie",
    "override_field_label_peak_price_flex": "Flexibiliteit",
    "override_field_label_peak_price_min_distance_from_avg": "Minimale afstand",
    "override_field_label_enable_min_periods_peak": "Minimum aantal bereiken",
    "override_field_label_min_periods_peak": "Minimale periodes",
    "override_field_label_relaxation_attempts_peak": "Ontspanningspogingen"
  },
  "config_subentries": {
    "home": {
      "entry_type": "Tijdreisweergave",
      "initiate_flow": {
        "user": "Tijdreisweergave Aanmaken"
      },
      "title": "Tijdreisweergave Aanmaken",
      "step": {
        "user": {
          "title": "Selecteer Configuratie-Item",
          "description": "Selecteer het configuratie-item waarvoor je een tijdreisweergave wilt aanmaken.\n\n**Tijdreisweergaven** laten je historische prijsgegevens zien alsof het de huidige tijd is. Dit is handig voor het testen van automatiseringen of het analyseren van prijspatronen uit het verleden.",
          "data": {
            "parent_entry_id": "Configuratie-Item"
          }
        },
        "time_offset": {
          "title": "Configureer Tijdverschuiving",
          "description": "Configureer hoe ver terug in de tijd deze weergave moet reizen.\n\n**Aanbevolen:** Gebruik **≥2 dagen** verschuiving om conflicten met \"gisteren\"-entiteiten te voorkomen die ook historische gegevens bieden.\n\n**Voorbeelden:**\n• **-7 dagen**: Bekijk prijzen van 7 dagen geleden\n• **-2 dagen, 3 uur**: Bekijk prijzen van 2 dagen en 3 uur geleden\n• **-14 dagen**: Bekijk prijzen van 2 weken geleden",
          "data": {
            "virtual_time_offset_days": "Dagen Terug",
            "time_offset": "Extra Tijdverschuiving"
          },
          "data_description": {
            "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.",
            "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund."
          }
        },
        "init": {
          "title": "Tijdverschuiving Opnieuw Configureren",
          "description": "Werk de tijdverschuiving voor deze tijdreisweergave bij.",
          "data": {
            "virtual_time_offset_days": "Dagen Terug",
            "time_offset": "Extra Tijdverschuiving"
          },
          "data_description": {
            "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.",
            "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund."
          }
        }
      },
      "error": {
        "no_time_offset": "Minimaal één tijdverschuivingswaarde moet negatief zijn (alleen historische gegevens)."
      },
      "abort": {
        "already_configured": "**Een tijdreisweergave met exact deze tijdverschuiving bestaat al.**\n\nKies een andere verschuiving.",
        "no_main_entries": "Geen hoofdconfiguratie-items gevonden. Voeg eerst een Tibber-huis toe.",
        "parent_entry_not_found": "Geselecteerd configuratie-item niet gevonden."
      }
    }
  },
  "options": {
    "step": {
      "init": {
        "menu_options": {
          "general_settings": "⚙️ Algemene Instellingen",
          "display_settings": "💱 Valuta Weergave",
          "current_interval_price_rating": "📊 Prijsbeoordeling",
          "price_level": "🏷️ Prijsniveau",
          "volatility": "💨 Prijsvolatiliteit",
          "best_price": "💚 Beste Prijs Periode",
          "peak_price": "🔴 Piekprijs Periode",
          "price_trend": "📈 Prijstrend",
          "chart_data_export": "📊 Grafiekdata Export Sensor",
          "reset_to_defaults": "🔄 Standaardwaarden Herstellen",
          "finish": "⬅️ Terug"
        }
      },
      "general_settings": {
        "title": "⚙️ Algemene Instellingen",
        "description": "**Configureer algemene instellingen voor Tibber Prijsinformatie & Beoordelingen.**\n\n---\n\n**Gebruiker:** {user_login}",
        "data": {
          "extended_descriptions": "Uitgebreide Beschrijvingen",
          "average_sensor_display": "Gemiddelde Sensor Weergave"
        },
        "data_description": {
          "extended_descriptions": "Bepaalt of entiteitsattributen gedetailleerde uitleg en gebruikstips bevatten.\n\n• Uitgeschakeld (standaard): Alleen korte beschrijving\n• Ingeschakeld: Gedetailleerde uitleg + praktische gebruiksvoorbeelden\n\nVoorbeeld:\nUitgeschakeld = 1 attribuut\nIngeschakeld = 2 extra attributen",
          "average_sensor_display": "Kies welke statistische maat weergegeven moet worden in de sensorstatus voor gemiddelde prijssensoren. De andere waarde wordt als attribuut getoond.\n\n• **Mediaan (standaard)**: Toont de 'typische' prijs, resistent tegen extreme pieken - best voor weergave en menselijke interpretatie\n• **Rekenkundig gemiddelde**: Toont het echte wiskundige gemiddelde inclusief alle prijzen - best wanneer je exacte kostenberekeningen nodig hebt\n\nVoor automatiseringen, gebruik het attribuut `price_mean` of `price_median` om toegang te krijgen tot beide waarden ongeacht deze instelling."
        },
        "submit": "↩ Opslaan & Terug"
      },
      "display_settings": {
        "title": "💱 Valuta Weergave-Instellingen",
        "description": "**Configureer hoe elektriciteitsprijzen worden weergegeven - in basisvaluta (€, kr) of subeenheid (ct, øre).**\n\n---",
        "data": {
          "currency_display_mode": "Weergavemodus"
        },
        "data_description": {
          "currency_display_mode": "Kies hoe prijzen worden weergegeven:\n\n• **Basisvaluta** (€/kWh, kr/kWh): Decimale waarden (bijv. 0,25 €/kWh) - verschillen zichtbaar vanaf 3e-4e decimaal\n• **Subeenheid Valuta** (ct/kWh, øre/kWh): Grotere waarden (bijv. 25,00 ct/kWh) - verschillen zichtbaar vanaf 1e decimaal\n\nStandaard hangt af van je valuta:\n• EUR → Subeenheid (cents) - Duitse/Nederlandse voorkeur\n• NOK/SEK/DKK → Basis (kronen) - Scandinavische voorkeur\n• USD/GBP → Basisvaluta\n\n**💡 Tip:** Bij selectie van Subeenheid Valuta kun je de extra \"Huidige Elektriciteitsprijs (Energie Dashboard)\" sensor inschakelen (standaard uitgeschakeld)."
        },
        "submit": "↩ Opslaan & Terug"
      },
      "current_interval_price_rating": {
        "title": "📊 Instellingen Prijsbeoordeling",
        "description": "**Configureer drempelwaarden en stabilisatie voor prijsbeoordelingsniveaus (laag/normaal/hoog) gebaseerd op vergelijking met het voortschrijdende 24-uurs gemiddelde.**{entity_warning}",
        "data": {
          "price_rating_threshold_low": "Lage Drempel",
          "price_rating_threshold_high": "Hoge Drempel",
          "price_rating_hysteresis": "Hysterese",
          "price_rating_gap_tolerance": "Gap Tolerantie"
        },
        "data_description": {
          "price_rating_threshold_low": "Percentage onder het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'laag' beoordelingsniveau. Voorbeeld: -10 betekent minimaal 10% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdvensters aan. Standaard: -10%",
          "price_rating_threshold_high": "Percentage boven het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'hoog' beoordelingsniveau. Voorbeeld: 10 betekent minimaal 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdvensters. Standaard: 10%",
          "price_rating_hysteresis": "Percentageband rond drempelwaarden om snelle toestandswijzigingen te voorkomen. Wanneer de beoordeling al LAAG is, moet de prijs boven (drempel + hysterese) stijgen om naar NORMAAL te wisselen. Evenzo vereist HOOG dat de prijs onder (drempel - hysterese) daalt om de toestand te verlaten. Dit zorgt voor stabiliteit bij automatiseringen die reageren op beoordelingswijzigingen. Stel in op 0 om uit te schakelen. Standaard: 2%",
          "price_rating_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'gladgestreken' kan worden als ze afwijken van omringende beoordelingen. Kleine geïsoleerde beoordelingswijzigingen worden samengevoegd met het dominante naburige blok. Dit zorgt voor stabiliteit bij automatiseringen door te voorkomen dat korte beoordelingspieken onnodige acties activeren. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'hoog'-intervallen gecorrigeerd wordt naar 'hoog'. Stel in op 0 om uit te schakelen. Standaard: 1"
        },
        "submit": "↩ Opslaan & Terug"
      },
      "best_price": {
        "title": "💚 Beste Prijs Periode Instellingen",
        "description": "**Configureer instellingen voor de Beste Prijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---",
        "sections": {
          "period_settings": {
            "name": "Periode Duur & Niveaus",
            "description": "Configureer hoe lang periodes moeten zijn en welke prijsniveaus moeten worden opgenomen.",
            "data": {
              "best_price_min_period_length": "Minimale Periode Lengte",
              "best_price_max_level": "Prijsniveau Filter",
              "best_price_max_level_gap_count": "Gat Tolerantie"
            },
            "data_description": {
              "best_price_min_period_length": "Minimale duur voor een periode om als 'beste prijs' te worden beschouwd. Langere periodes zijn praktischer voor apparaten zoals vaatwassers of warmtepompen. Beste prijs periodes vereisen minimaal 60 minuten (versus 30 minuten voor piekprijs waarschuwingen) omdat ze betekenisvolle tijdvensters voor verbruiksplanning moeten bieden, niet alleen korte kansen.",
              "best_price_max_level": "Toon alleen beste prijs periodes als ze intervallen bevatten met prijsniveaus ≤ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Goedkoop**' moet de periode minimaal één '**Zeer goedkoop**' of '**Goedkoop**' interval hebben. Dit zorgt ervoor dat 'beste prijs' periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer '**Alles**' om beste prijzen te tonen ongeacht hun absolute prijsniveau.",
              "best_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Goedkoop**' filter en gat telling 1, wordt een reeks '**Goedkoop**, **Goedkoop**, **Normaal**, **Goedkoop**' geaccepteerd (**Normaal** is één stap boven **Goedkoop**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)."
            }
          },
          "flexibility_settings": {
            "name": "Flexibiliteit & Drempelwaarden",
            "description": "Bepaal hoeveel prijzen kunnen afwijken en nog steeds als 'beste prijs' kwalificeren.",
            "data": {
              "best_price_flex": "Flexibiliteit",
              "best_price_min_distance_from_avg": "Minimale Afstand"
            },
            "data_description": {
              "best_price_flex": "Maximum boven de dagelijkse minimumprijs dat intervallen kunnen zijn en nog steeds als 'beste prijs' kwalificeren. Aanbevolen: 15-20 met relaxatie ingeschakeld (standaard), of 25-35 zonder relaxatie. Maximum: 50 (harde limiet voor betrouwbare periodedetectie).",
              "best_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant goedkoper zijn dan het dagelijkse gemiddelde, niet slechts marginaal eronder. Dit filtert ruis en voorkomt het markeren van licht-onder-gemiddelde periodes als 'beste prijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt goedkope periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% onder het dagelijkse gemiddelde moeten zijn."
            }
          },
          "relaxation_and_target_periods": {
            "name": "Relaxatie & Doelperiodes",
            "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.",
            "data": {
              "enable_min_periods_best": "Bereik Minimum Aantal",
              "min_periods_best": "Minimale Periodes",
              "relaxation_attempts_best": "Relaxatie Pogingen"
            },
            "data_description": {
              "enable_min_periods_best": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken, wat minder optimale tijdvensters als beste-prijs periodes kan bevatten.",
              "min_periods_best": "Minimaal aantal beste prijsperiodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1",
              "relaxation_attempts_best": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra periodes te vinden ten koste van langere verwerkingstijd."
            }
          },
          "extension_settings": {
            "name": "Uitbreiding aan perioderand",
            "description": "Breid gedetecteerde beste-prijsperioden eventueel uit aan beide randen om aangrenzende zeer goedkope intervallen op te nemen.",
            "data": {
              "best_price_extend_to_very_cheap": "Uitbreiden met zeer goedkope intervallen",
              "best_price_max_extension_intervals": "Maximale uitbreidingsintervallen",
              "best_price_geometric_flex": "Geometrische Flex Bonus",
              "best_price_segment_forcing": "W-vorm segmentverstrekking",
              "best_price_segment_min_periods": "Periodes per segment"
            },
            "data_description": {
              "best_price_extend_to_very_cheap": "Indien ingeschakeld, breiden gedetecteerde beste-prijsperioden zich uit aan de randen om aangrenzende intervallen met prijsniveau 'Zeer goedkoop' op te nemen. Dit vangt extreem goedkope intervallen op aan de randen van gedetecteerde perioden.",
              "best_price_max_extension_intervals": "Maximaal aantal extra intervallen per kant (linker en rechter rand). Elk interval is 15 minuten. Voorbeeld: 4 intervallen = maximaal 1 uur uitbreiding per rand. Standaard: 4",
              "best_price_geometric_flex": "Extra flex percentage voor intervallen die binnen een gedetecteerde prijsdal (V-vorm) vallen. Wanneer een dal-patroon wordt gedetecteerd voor de dag, krijgen intervallen binnen de dalzone deze extra tolerantie, waardoor de periodedetector ze eerder opneemt. 0 = uitgeschakeld. Standaard: 0",
              "best_price_segment_forcing": "Wanneer ingeschakeld worden dagen met een W-vormige prijscurve (twee dalen gescheiden door een centrale piek) gesplitst op de centrale piek. Periodedetectie wordt onafhankelijk uitgevoerd voor elke dalzijde, zodat elk dal het vereiste aantal perioden heeft.",
              "best_price_segment_min_periods": "Minimaal aantal beste-prijsperioden per dalzijde wanneer W-vorm segmentverstrekking is ingeschakeld. Elke zijde moet onafhankelijk minimaal dit aantal perioden opleveren. Standaard: 1"
            }
          }
        },
        "submit": "↩ Opslaan & Terug"
      },
      "peak_price": {
        "title": "🔴 Piekprijs Periode Instellingen",
        "description": "**Configureer instellingen voor de Piekprijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de hoogste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---",
        "sections": {
          "period_settings": {
            "name": "Periode Instellingen",
            "description": "Configureer periodeduur en prijsniveau beperkingen.",
            "data": {
              "peak_price_min_period_length": "Minimale Periode Lengte",
              "peak_price_min_level": "Prijsniveau Filter",
              "peak_price_max_level_gap_count": "Gat Tolerantie"
            },
            "data_description": {
              "peak_price_min_period_length": "Minimale duur voor een periode om als 'piekprijs' te worden beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (30 minuten minimum vs. 60 minuten voor beste prijs) omdat korte dure pieken de moeite waard zijn om voor te waarschuwen, zelfs als ze te kort zijn voor verbruiksplanning.",
              "peak_price_min_level": "Toon alleen piekprijs periodes als ze intervallen bevatten met prijsniveaus ≥ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Duur**' moet de periode minimaal één '**Duur**' of '**Zeer duur**' interval hebben. Dit zorgt ervoor dat 'piekprijs' periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer '**Alles**' om piekprijzen te tonen ongeacht hun absolute prijsniveau.",
              "peak_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Duur**' filter en gat telling 2, wordt een reeks '**Duur**, **Normaal**, **Normaal**, **Duur**' geaccepteerd (**Normaal** is één stap onder **Duur**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)."
            }
          },
          "flexibility_settings": {
            "name": "Flexibiliteit Instellingen",
            "description": "Configureer drempelwaarden voor prijsvergelijking en filtering.",
            "data": {
              "peak_price_flex": "Flexibiliteit",
              "peak_price_min_distance_from_avg": "Minimale Afstand"
            },
            "data_description": {
              "peak_price_flex": "Maximum onder de dagelijkse maximumprijs dat intervallen kunnen zijn en nog steeds als 'piekprijs' kwalificeren. Aanbevolen: -15 tot -20 met relaxatie ingeschakeld (standaard), of -25 tot -35 zonder relaxatie. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven afstand onder maximum aan.",
              "peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het dagelijkse gemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt het markeren van licht-boven-gemiddelde periodes als 'piekprijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het dagelijkse gemiddelde moeten zijn."
            }
          },
          "relaxation_and_target_periods": {
            "name": "Relaxatie & Doelperiodes",
            "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.",
            "data": {
              "enable_min_periods_peak": "Bereik Minimum Aantal",
              "min_periods_peak": "Minimale Periodes",
              "relaxation_attempts_peak": "Relaxatie Pogingen"
            },
            "data_description": {
              "enable_min_periods_peak": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om je te waarschuwen voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.",
              "min_periods_peak": "Minimaal aantal piekprijs periodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1",
              "relaxation_attempts_peak": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra piekperiodes te vinden ten koste van langere verwerkingstijd."
            }
          },
          "extension_settings": {
            "name": "Uitbreiding aan perioderand",
            "description": "Breid gedetecteerde piekprijsperioden eventueel uit aan beide randen om aangrenzende zeer dure intervallen op te nemen.",
            "data": {
              "peak_price_extend_to_very_expensive": "Uitbreiden met zeer dure intervallen",
              "peak_price_max_extension_intervals": "Maximale uitbreidingsintervallen",
              "peak_price_geometric_flex": "Geometrische Flex Bonus",
              "peak_price_segment_forcing": "M-vorm segmentverstrekking",
              "peak_price_segment_min_periods": "Periodes per segment"
            },
            "data_description": {
              "peak_price_extend_to_very_expensive": "Indien ingeschakeld, breiden gedetecteerde piekprijsperioden zich uit aan de randen om aangrenzende intervallen met prijsniveau 'Zeer duur' op te nemen. Dit vangt extreem dure intervallen op aan de randen van gedetecteerde perioden.",
              "peak_price_max_extension_intervals": "Maximaal aantal extra intervallen per kant (linker en rechter rand). Elk interval is 15 minuten. Voorbeeld: 4 intervallen = maximaal 1 uur uitbreiding per rand. Standaard: 4",
              "peak_price_geometric_flex": "Extra flex percentage voor intervallen die binnen een gedetecteerde prijspiek (Λ-vorm) vallen. Wanneer een piek-patroon wordt gedetecteerd voor de dag, krijgen intervallen binnen de piekzone deze extra tolerantie, waardoor de periodedetector ze eerder opneemt. 0 = uitgeschakeld. Standaard: 0",
              "peak_price_segment_forcing": "Wanneer ingeschakeld worden dagen met een M-vormige prijscurve (twee pieken gescheiden door een centrale dal) gesplitst op de centrale dal. Periodedetectie wordt onafhankelijk uitgevoerd voor elke piekzijde, zodat elke piek het vereiste aantal perioden heeft.",
              "peak_price_segment_min_periods": "Minimaal aantal piekprijsperioden per piekzijde wanneer M-vorm segmentverstrekking is ingeschakeld. Elke zijde moet onafhankelijk minimaal dit aantal perioden opleveren. Standaard: 1"
            }
          }
        },
        "submit": "↩ Opslaan & Terug"
      },
      "price_trend": {
        "title": "📈 Prijstrend Drempelwaarden",
        "description": "**Configureer drempelwaarden voor prijstrend sensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen sterk stijgen, stijgen, stabiel zijn, dalen of sterk dalen.**{entity_warning}",
        "data": {
          "price_trend_threshold_rising": "Stijgende Drempel",
          "price_trend_threshold_strongly_rising": "Sterk Stijgende Drempel",
          "price_trend_threshold_falling": "Dalende Drempel",
          "price_trend_threshold_strongly_falling": "Sterk Dalende Drempel",
          "price_trend_change_confirmation": "Trendverandering Bevestiging",
          "price_trend_min_price_change": "Min. Prijsverandering (Trend)",
          "price_trend_min_price_change_strongly": "Min. Prijsverandering (Sterke Trend)"
        },
        "data_description": {
          "price_trend_threshold_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'stijgende' trend. Voorbeeld: 3 betekent dat het gemiddelde minimaal 3% hoger is → prijzen zullen stijgen. Typische waarden: 3-10%. Standaard: 3%",
          "price_trend_threshold_strongly_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'sterk stijgende' trend. Moet hoger zijn dan stijgende drempel. Typische waarden: 6-20%. Standaard: 9%",
          "price_trend_threshold_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'dalende' trend. Voorbeeld: -3 betekent dat het gemiddelde minimaal 3% lager is → prijzen zullen dalen. Typische waarden: -3 tot -10%. Standaard: -3%",
          "price_trend_threshold_strongly_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'sterk dalende' trend. Moet lager (meer negatief) zijn dan dalende drempel. Typische waarden: -6 tot -20%. Standaard: -9%",
          "price_trend_change_confirmation": "Aantal opeenvolgende 15-minuten intervallen dat een nieuwe trendrichting moet bevestigen voordat een trendverandering wordt gemeld. Hogere waarden betekenen meer stabiliteit en minder valse veranderingen, lagere waarden betekenen snellere detectie. Bereik: 2 (30 min) tot 6 (90 min). Standaard: 3 (45 min)",
          "price_trend_min_price_change": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'stijgende' of 'dalende' trend. Voorkomt dat minimale prijswijzigingen trends veroorzaken bij lage prijsniveaus. Stel in op 0 om te deactiveren (pure percentagemodus). Standaard: 0,5",
          "price_trend_min_price_change_strongly": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'sterk stijgende' of 'sterk dalende' trend. Moet hoger zijn dan het reguliere trendminimum. Stel in op 0 om te deactiveren. Standaard: 1,5"
        },
        "submit": "↩ Opslaan & Terug"
      },
      "volatility": {
        "title": "💨 Prijsvolatiliteit Drempelwaarden",
        "description": "**Configureer drempelwaarden voor volatiliteitsclassificatie.** Volatiliteit meet relatieve prijsvariatie met de variëfficcïnt (CV = standaarddeviatie / gemiddelde × 100%). Deze drempelwaarden zijn percentagewaarden die werken over alle prijsniveaus.\n\nGebruikt door:\n• Volatiliteit sensoren (classificatie)\n• Trend sensoren (adaptieve drempelaanpassing: &lt;gematigd = gevoeliger, ≥hoog = minder gevoelig){entity_warning}",
        "data": {
          "volatility_threshold_moderate": "Gematigde Drempel",
          "volatility_threshold_high": "Hoge Drempel",
          "volatility_threshold_very_high": "Zeer Hoge Drempel"
        },
        "data_description": {
          "volatility_threshold_moderate": "Variëfficcïnt (CV) waarbij prijzen als 'gematigd volatiel' worden beschouwd. CV = (standaarddeviatie / gemiddelde) × 100%. Voorbeeld: 15 betekent prijsschommelingen van ±15% rond gemiddelde. Sensoren tonen deze classificatie, trend sensoren worden gevoeliger. Standaard: 15%",
          "volatility_threshold_high": "Variëfficcïnt (CV) waarbij prijzen als 'hoog volatiel' worden beschouwd. Voorbeeld: 30 betekent prijsschommelingen van ±30% rond gemiddelde. Grotere prijssprongen verwacht, trend sensoren worden minder gevoelig. Standaard: 30%",
          "volatility_threshold_very_high": "Variëfficcïnt (CV) waarbij prijzen als 'zeer hoog volatiel' worden beschouwd. Voorbeeld: 50 betekent extreme prijsschommelingen van ±50% rond gemiddelde. Op zulke dagen zijn sterke prijspieken waarschijnlijk. Standaard: 50%"
        },
        "submit": "↩ Opslaan & Terug"
      },
      "chart_data_export": {
        "title": "📊 Grafiekdata Export Sensor",
        "description": "De Grafiekdata Export Sensor biedt prijsgegevens als sensor attributen.\n\n⚠️ **Let op:** Deze sensor is een legacy functie voor compatibiliteit met oudere tools.\n\n**Aanbevolen voor nieuwe setups:** Gebruik de `tibber_prices.get_chartdata` **service direct** - het is flexibeler, efficïnter, en de moderne Home Assistant aanpak.\n\n**Wanneer deze sensor zinvol is:**\n\n✅ Je dashboardtool kan **alleen** attributen lezen (geen service calls)\n✅ Je hebt statische data nodig die automatisch update\n❌ **Niet voor automatiseringen:** Gebruik `tibber_prices.get_chartdata` daar direct - flexibeler en efficïnter!\n\n---\n\n{sensor_status_info}",
        "submit": "↩ Ok & Terug"
      },
      "reset_to_defaults": {
        "title": "🔄 Standaardwaarden Herstellen",
        "description": "⚠️ **Waarschuwing:** Dit zal **ALLE** instellingen naar fabrieksinstellingen terugzetten.\n\n**Wat wordt gereset:**\n• Alle prijsbeoordeling drempelwaarden\n• Alle volatiliteit drempelwaarden\n• Alle prijstrend drempelwaarden\n• Alle beste prijsperiode instellingen\n• Alle piekprijs periode instellingen\n• Weergave-instellingen\n• Algemene instellingen\n\n**Wat wordt NIET gereset:**\n• Je Tibber API-token\n• Geselecteerd huis\n• Valuta\n\n**💡 Tip:** Dit is handig als je opnieuw wilt beginnen na het experimenteren met instellingen.",
        "data": {
          "confirm_reset": "Ja, reset alles naar standaardwaarden"
        },
        "submit": "Nu Resetten"
      },
      "price_level": {
        "title": "🏷️ Prijsniveau-instellingen",
        "description": "**Configureer stabilisatie voor Tibbers prijsniveau-classificatie (zeer goedkoop/goedkoop/normaal/duur/zeer duur).**\n\nTibbers API levert een prijsniveau-veld voor elk interval. Deze instelling egaliseer korte fluctuaties om instabiliteit in automatiseringen te voorkomen.{entity_warning}",
        "data": {
          "price_level_gap_tolerance": "Gap-tolerantie"
        },
        "data_description": {
          "price_level_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'afgevlakt' kan worden als ze afwijken van omringende prijsniveaus. Kleine geïsoleerde niveauwijzigingen worden samengevoegd met het dominante aangrenzende blok. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'goedkoop'-intervallen wordt gecorrigeerd naar 'goedkoop'. Stel in op 0 om uit te schakelen. Standaard: 1"
        },
        "submit": "↩ Opslaan & terug"
      }
    },
    "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 logs voor details.",
      "cannot_connect": "Verbinding mislukt",
      "invalid_access_token": "Ongeldig toegangstoken",
      "different_home": "Het toegangstoken is niet geldig voor het huis-ID waarvoor deze integratie is geconfigureerd.",
      "invalid_period_length": "Periode lengte moet minimaal 15 minuten zijn (veelvouden van 15).",
      "invalid_flex": "Flexibiliteitspercentage moet tussen -50% en +50% zijn",
      "invalid_best_price_distance": "Afstandspercentage moet tussen -50% en 0% zijn (negatief = onder gemiddelde)",
      "invalid_peak_price_distance": "Afstandspercentage moet tussen 0% en 50% zijn (positief = boven gemiddelde)",
      "invalid_min_periods": "Minimaal aantal periodes moet tussen 1 en 10 zijn",
      "invalid_gap_count": "Gat telling moet tussen 0 en 8 zijn",
      "invalid_relaxation_attempts": "Relaxatie pogingen moeten tussen 1 en 12 zijn",
      "invalid_price_rating_low": "Lage prijsbeoordeling drempel moet tussen -50% en -5% zijn",
      "invalid_price_rating_high": "Hoge prijsbeoordeling drempel moet tussen 5% en 50% zijn",
      "invalid_price_rating_thresholds": "Lage drempel moet lager zijn dan hoge drempel",
      "invalid_volatility_threshold_moderate": "Gematigde volatiliteit drempel moet tussen 5% en 25% zijn",
      "invalid_volatility_threshold_high": "Hoge volatiliteit drempel moet tussen 20% en 40% zijn",
      "invalid_volatility_threshold_very_high": "Zeer hoge volatiliteit drempel moet tussen 35% en 80% zijn",
      "invalid_volatility_thresholds": "Drempelwaarden moeten in oplopende volgorde zijn: gematigd < hoog < zeer hoog",
      "invalid_price_trend_rising": "Stijgende trend drempel moet tussen 1% en 50% zijn",
      "invalid_price_trend_falling": "Dalende trend drempel moet tussen -50% en -1% zijn",
      "invalid_price_trend_strongly_rising": "Sterk stijgende trend drempel moet tussen 2% en 100% zijn",
      "invalid_price_trend_strongly_falling": "Sterk dalende trend drempel moet tussen -100% en -2% zijn",
      "invalid_trend_strongly_rising_less_than_rising": "Sterk stijgende drempel moet hoger zijn dan stijgende drempel",
      "invalid_trend_strongly_falling_greater_than_falling": "Sterk dalende drempel moet lager (meer negatief) zijn dan dalende drempel"
    },
    "abort": {
      "entry_not_found": "Tibber-configuratie-item niet gevonden.",
      "reset_cancelled": "Reset geannuleerd. Er zijn geen wijzigingen aangebracht in je configuratie.",
      "reset_successful": "✅ Alle instellingen zijn teruggezet naar fabrieksinstellingen. Je configuratie is nu als een nieuwe installatie.",
      "finished": "Configuratie voltooid."
    }
  },
  "entity": {
    "sensor": {
      "current_interval_price": {
        "name": "Huidige Elektriciteitsprijs"
      },
      "current_interval_price_base": {
        "name": "Huidige Elektriciteitsprijs (Energie Dashboard)"
      },
      "next_interval_price": {
        "name": "Volgende Elektriciteitsprijs"
      },
      "previous_interval_price": {
        "name": "Vorige Elektriciteitsprijs"
      },
      "current_hour_average_price": {
        "name": "⌀ Uurprijs Huidig"
      },
      "next_hour_average_price": {
        "name": "⌀ Uurprijs Volgend"
      },
      "current_interval_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 Uur Prijsniveau",
        "state": {
          "very_cheap": "Zeer Goedkoop",
          "cheap": "Goedkoop",
          "normal": "Normaal",
          "expensive": "Duur",
          "very_expensive": "Zeer Duur"
        }
      },
      "next_hour_price_level": {
        "name": "Volgend Uur Prijsniveau",
        "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": "⌀ Prijs Vandaag"
      },
      "lowest_price_tomorrow": {
        "name": "Laagste Prijs Morgen"
      },
      "highest_price_tomorrow": {
        "name": "Hoogste Prijs Morgen"
      },
      "average_price_tomorrow": {
        "name": "⌀ Prijs Morgen"
      },
      "yesterday_price_level": {
        "name": "Gisteren Prijsniveau",
        "state": {
          "very_cheap": "Zeer Goedkoop",
          "cheap": "Goedkoop",
          "normal": "Normaal",
          "expensive": "Duur",
          "very_expensive": "Zeer Duur"
        }
      },
      "today_price_level": {
        "name": "Vandaag Prijsniveau",
        "state": {
          "very_cheap": "Zeer Goedkoop",
          "cheap": "Goedkoop",
          "normal": "Normaal",
          "expensive": "Duur",
          "very_expensive": "Zeer Duur"
        }
      },
      "tomorrow_price_level": {
        "name": "Morgen Prijsniveau",
        "state": {
          "very_cheap": "Zeer Goedkoop",
          "cheap": "Goedkoop",
          "normal": "Normaal",
          "expensive": "Duur",
          "very_expensive": "Zeer Duur"
        }
      },
      "yesterday_price_rating": {
        "name": "Gisteren Prijsbeoordeling",
        "state": {
          "low": "Laag",
          "normal": "Normaal",
          "high": "Hoog"
        }
      },
      "today_price_rating": {
        "name": "Vandaag Prijsbeoordeling",
        "state": {
          "low": "Laag",
          "normal": "Normaal",
          "high": "Hoog"
        }
      },
      "tomorrow_price_rating": {
        "name": "Morgen Prijsbeoordeling",
        "state": {
          "low": "Laag",
          "normal": "Normaal",
          "high": "Hoog"
        }
      },
      "trailing_price_average": {
        "name": "⌀ Prijs Afgelopen 24u"
      },
      "leading_price_average": {
        "name": "⌀ Prijs Komende 24u"
      },
      "trailing_price_min": {
        "name": "Afgelopen 24u Minimumprijs"
      },
      "trailing_price_max": {
        "name": "Afgelopen 24u Maximumprijs"
      },
      "leading_price_min": {
        "name": "Komende 24u Minimumprijs"
      },
      "leading_price_max": {
        "name": "Komende 24u Maximumprijs"
      },
      "current_interval_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 Uur Prijsbeoordeling",
        "state": {
          "low": "Laag",
          "normal": "Normaal",
          "high": "Hoog"
        }
      },
      "next_hour_price_rating": {
        "name": "Volgend Uur Prijsbeoordeling",
        "state": {
          "low": "Laag",
          "normal": "Normaal",
          "high": "Hoog"
        }
      },
      "next_avg_1h": {
        "name": "⌀ Prijs Komende 1u"
      },
      "next_avg_2h": {
        "name": "⌀ Prijs Komende 2u"
      },
      "next_avg_3h": {
        "name": "⌀ Prijs Komende 3u"
      },
      "next_avg_4h": {
        "name": "⌀ Prijs Komende 4u"
      },
      "next_avg_5h": {
        "name": "⌀ Prijs Komende 5u"
      },
      "next_avg_6h": {
        "name": "⌀ Prijs Komende 6u"
      },
      "next_avg_8h": {
        "name": "⌀ Prijs Komende 8u"
      },
      "next_avg_12h": {
        "name": "⌀ Prijs Komende 12u"
      },
      "price_outlook_1h": {
        "name": "Prijsvooruitzicht (1u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_2h": {
        "name": "Prijsvooruitzicht (2u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_3h": {
        "name": "Prijsvooruitzicht (3u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_4h": {
        "name": "Prijsvooruitzicht (4u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_5h": {
        "name": "Prijsvooruitzicht (5u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_6h": {
        "name": "Prijsvooruitzicht (6u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_8h": {
        "name": "Prijsvooruitzicht (8u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_outlook_12h": {
        "name": "Prijsvooruitzicht (12u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_2h": {
        "name": "Prijstrajectorie (2u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_3h": {
        "name": "Prijstrajectorie (3u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_4h": {
        "name": "Prijstrajectorie (4u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_5h": {
        "name": "Prijstrajectorie (5u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_6h": {
        "name": "Prijstrajectorie (6u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_8h": {
        "name": "Prijstrajectorie (8u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "price_trajectory_12h": {
        "name": "Prijstrajectorie (12u)",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "current_price_trend": {
        "name": "Huidige Prijstrend",
        "state": {
          "strongly_rising": "Sterk stijgend",
          "rising": "Stijgend",
          "stable": "Stabiel",
          "falling": "Dalend",
          "strongly_falling": "Sterk dalend"
        }
      },
      "next_price_trend_change": {
        "name": "Volgende Prijstrend Wijziging"
      },
      "next_price_trend_change_in": {
        "name": "Volgende Prijstrend Wijziging over"
      },
      "daily_rating": {
        "name": "Dagelijkse Prijsbeoordeling"
      },
      "monthly_rating": {
        "name": "Maandelijkse Prijsbeoordeling"
      },
      "data_lifecycle_status": {
        "name": "Data Levenscyclus Status",
        "state": {
          "cached": "Gecachet",
          "fresh": "Vers",
          "refreshing": "Vernieuwen",
          "searching_tomorrow": "Morgen Zoeken",
          "turnover_pending": "Omslag In Behandeling",
          "error": "Fout"
        }
      },
      "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": "Komende 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"
        }
      },
      "best_price_end_time": {
        "name": "Beste Prijs Einde"
      },
      "best_price_period_duration": {
        "name": "Beste Prijs Duur"
      },
      "best_price_remaining_minutes": {
        "name": "Beste Prijs Resterende Tijd"
      },
      "best_price_progress": {
        "name": "Beste Prijs Voortgang"
      },
      "best_price_next_start_time": {
        "name": "Beste Prijs Start"
      },
      "best_price_next_in_minutes": {
        "name": "Beste Prijs Start Over"
      },
      "peak_price_end_time": {
        "name": "Piekprijs Einde"
      },
      "peak_price_period_duration": {
        "name": "Piekprijs Duur"
      },
      "peak_price_remaining_minutes": {
        "name": "Piekprijs Resterende Tijd"
      },
      "peak_price_progress": {
        "name": "Piekprijs Voortgang"
      },
      "peak_price_next_start_time": {
        "name": "Piekprijs Start"
      },
      "peak_price_next_in_minutes": {
        "name": "Piekprijs Start Over"
      },
      "home_type": {
        "name": "Huistype",
        "state": {
          "apartment": "Appartement",
          "rowhouse": "Rijtjeshuis",
          "house": "Huis",
          "cottage": "Huisje"
        }
      },
      "home_size": {
        "name": "Huisgrootte"
      },
      "main_fuse_size": {
        "name": "Hoofdzekering Grootte"
      },
      "number_of_residents": {
        "name": "Aantal Bewoners"
      },
      "primary_heating_source": {
        "name": "Primaire Verwarmingsbron",
        "state": {
          "air2air_heatpump": "Lucht-naar-Lucht Warmtepomp",
          "air2water_heatpump": "Lucht-naar-Water Warmtepomp",
          "boiler": "Boiler",
          "central_heating": "Centrale Verwarming",
          "district_heating": "Stadsverwarming",
          "district": "Stadsverwarming",
          "electric_boiler": "Elektrische Boiler",
          "electricity": "Elektriciteit",
          "floor": "Vloerverwarming",
          "gas": "Gas",
          "ground_heatpump": "Bodem Warmtepomp",
          "ground": "Bodem Warmtepomp",
          "oil": "Olie",
          "other": "Overig",
          "waste": "Restwarmte"
        }
      },
      "grid_company": {
        "name": "Netbedrijf"
      },
      "grid_area_code": {
        "name": "Netgebiedcode"
      },
      "price_area_code": {
        "name": "Prijsgebiedcode"
      },
      "consumption_ean": {
        "name": "Verbruik EAN"
      },
      "production_ean": {
        "name": "Productie EAN"
      },
      "energy_tax_type": {
        "name": "Energiebelasting Type"
      },
      "vat_type": {
        "name": "BTW Type"
      },
      "estimated_annual_consumption": {
        "name": "Geschat Jaarverbruik"
      },
      "subscription_status": {
        "name": "Abonnement Status",
        "state": {
          "running": "Actief",
          "ended": "Beëindigd",
          "pending": "In Afwachting",
          "unknown": "Onbekend"
        }
      },
      "day_pattern_yesterday": {
        "name": "Prijspatroon Gisteren",
        "state": {
          "valley": "Dal",
          "peak": "Piek",
          "double_dip": "Dubbele Dip",
          "duck_curve": "Eendcurve",
          "flat": "Vlak",
          "rising": "Stijgend",
          "falling": "Dalend",
          "mixed": "Gemengd"
        }
      },
      "day_pattern_today": {
        "name": "Prijspatroon Vandaag",
        "state": {
          "valley": "Dal",
          "peak": "Piek",
          "double_dip": "Dubbele Dip",
          "duck_curve": "Eendcurve",
          "flat": "Vlak",
          "rising": "Stijgend",
          "falling": "Dalend",
          "mixed": "Gemengd"
        }
      },
      "day_pattern_tomorrow": {
        "name": "Prijspatroon Morgen",
        "state": {
          "valley": "Dal",
          "peak": "Piek",
          "double_dip": "Dubbele Dip",
          "duck_curve": "Eendcurve",
          "flat": "Vlak",
          "rising": "Stijgend",
          "falling": "Dalend",
          "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": {
        "name": "Grafiekdata Export",
        "state": {
          "pending": "In Afwachting",
          "ready": "Gereed",
          "error": "Fout"
        }
      },
      "chart_metadata": {
        "name": "Grafiek Metadata",
        "state": {
          "pending": "In Afwachting",
          "ready": "Gereed",
          "error": "Fout"
        }
      },
      "current_interval_price_rank_today": {
        "name": "Huidige prijsrang (vandaag)"
      },
      "current_interval_price_rank_tomorrow": {
        "name": "Huidige prijsrang (morgen)"
      },
      "current_interval_price_rank_today_tomorrow": {
        "name": "Huidige prijsrang (vandaag+morgen)"
      },
      "next_interval_price_rank_today": {
        "name": "Volgende prijsrang (vandaag)"
      },
      "next_interval_price_rank_today_tomorrow": {
        "name": "Volgende prijsrang (vandaag+morgen)"
      },
      "previous_interval_price_rank_today": {
        "name": "Vorige prijsrang (vandaag)"
      },
      "previous_interval_price_rank_today_tomorrow": {
        "name": "Vorige prijsrang (vandaag+morgen)"
      },
      "current_hour_price_rank_today": {
        "name": "⌀ Uurlijkse prijsrang huidig (vandaag)"
      },
      "current_hour_price_rank_today_tomorrow": {
        "name": "⌀ Uurlijkse prijsrang huidig (vandaag+morgen)"
      },
      "next_hour_price_rank_today": {
        "name": "⌀ Uurlijkse prijsrang volgende (vandaag)"
      },
      "next_hour_price_rank_today_tomorrow": {
        "name": "⌀ Uurlijkse prijsrang volgende (vandaag+morgen)"
      }
    },
    "binary_sensor": {
      "peak_price_period": {
        "name": "Piekprijs Periode"
      },
      "best_price_period": {
        "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": {
        "name": "Tibber API Verbinding"
      },
      "tomorrow_data_available": {
        "name": "Morgen Gegevens Beschikbaar"
      },
      "has_ventilation_system": {
        "name": "Heeft Ventilatiesysteem"
      },
      "realtime_consumption_enabled": {
        "name": "Realtime Verbruik Ingeschakeld"
      }
    },
    "number": {
      "best_price_flex_override": {
        "name": "Beste prijs: Flexibiliteit"
      },
      "best_price_min_distance_override": {
        "name": "Beste prijs: Minimale afstand"
      },
      "best_price_min_period_length_override": {
        "name": "Beste prijs: Minimale periodelengte"
      },
      "best_price_min_periods_override": {
        "name": "Beste prijs: Minimum periodes"
      },
      "best_price_relaxation_attempts_override": {
        "name": "Beste prijs: Versoepeling pogingen"
      },
      "best_price_gap_count_override": {
        "name": "Beste prijs: Gap tolerantie"
      },
      "peak_price_flex_override": {
        "name": "Piekprijs: Flexibiliteit"
      },
      "peak_price_min_distance_override": {
        "name": "Piekprijs: Minimale afstand"
      },
      "peak_price_min_period_length_override": {
        "name": "Piekprijs: Minimale periodelengte"
      },
      "peak_price_min_periods_override": {
        "name": "Piekprijs: Minimum periodes"
      },
      "peak_price_relaxation_attempts_override": {
        "name": "Piekprijs: Versoepeling pogingen"
      },
      "peak_price_gap_count_override": {
        "name": "Piekprijs: Gap tolerantie"
      }
    },
    "switch": {
      "best_price_enable_relaxation_override": {
        "name": "Beste prijs: Minimum aantal bereiken"
      },
      "peak_price_enable_relaxation_override": {
        "name": "Piekprijs: Minimum aantal bereiken"
      }
    }
  },
  "issues": {
    "new_homes_available": {
      "title": "Nieuwe Tibber huizen gedetecteerd",
      "description": "We hebben {count} nieuw(e) huis/huizen gedetecteerd op je Tibber-account: {homes}. Je kunt ze toevoegen aan Home Assistant via de Tibber integratie configuratie."
    },
    "homes_removed": {
      "title": "Tibber huizen verwijderd",
      "description": "We hebben gedetecteerd dat {count} huis/huizen zijn verwijderd van je Tibber-account: {homes}. Controleer je Tibber integratie configuratie."
    },
    "tomorrow_data_missing": {
      "title": "Morgen prijsgegevens ontbreken voor {home_name}",
      "description": "Morgen elektriciteitsprijs gegevens zijn nog steeds niet beschikbaar na {warning_hour}:00. Dit is ongebruikelijk, omdat Tibber normaal gesproken morgen prijzen publiceert in de middag (rond 13:00-14:00 CET).\n\nMogelijke oorzaken:\n- Tibber heeft morgen prijzen nog niet gepubliceerd\n- Tijdelijke API-problemen\n- Je elektriciteitsleverancier heeft nog geen prijzen ingediend bij Tibber\n\nDit probleem lost zich automatisch op zodra morgen gegevens beschikbaar worden. Als dit na 20:00 aanhoudt, controleer dan de Tibber-app of neem contact op met Tibber support."
    },
    "rate_limit_exceeded": {
      "title": "API rate limiet overschreden voor {home_name}",
      "description": "De Tibber API heeft deze integratie beperkt na {error_count} opeenvolgende fouten. Dit betekent dat verzoeken te frequent worden gedaan.\n\nDe integratie zal automatisch opnieuw proberen met toenemende vertragingen. Dit probleem lost zich op zodra de rate limiet verloopt.\n\nAls dit meerdere uren aanhoudt, overweeg dan:\n- Te controleren of meerdere Home Assistant instanties hetzelfde API-token gebruiken\n- Te verifiëren dat geen andere applicaties intensief je Tibber API-token gebruiken\n- De update frequentie te verlagen als je deze hebt aangepast"
    },
    "home_not_found": {
      "title": "Huis {home_name} niet gevonden in Tibber-account",
      "description": "Het huis geconfigureerd in deze integratie (entry ID: {entry_id}) is niet langer beschikbaar in je Tibber-account. Dit gebeurt meestal wanneer:\n- Het huis is verwijderd uit je Tibber-account\n- Het huis is verplaatst naar een ander Tibber-account\n- Toegang tot dit huis is ingetrokken\n\nVerwijder dit integratie-item en voeg het opnieuw toe als het huis nog steeds gemonitord moet worden. Om dit item te verwijderen, ga naar Instellingen → Apparaten & Services → Tibber Prices en verwijder de {home_name} configuratie."
    },
    "entity_migration": {
      "title": "Tibber Prices: Actie vereist na update ({home_name})",
      "description": "Deze update bevat wijzigingen die automatisch zijn toegepast.\n\n**Hernoemde entiteiten ({count})**\n\nDe volgende entity-sleutels zijn hernoemd. Je bestaande entity-ID's en automatiseringen blijven intact:\n\n{entity_list}\n\n**Gewijzigde duur-sensorwaarden**\n\nAlle duur-sensoren (resterende tijd, start over, periodeduur, trendwijzigings-aftelling) rapporteren hun statuswaarde nu in **minuten** in plaats van uren. De weergave-eenheid in dashboards blijft standaard uren.\n\nAls je automatiseringen hebt met numerieke vergelijkingen op deze sensoren, werk dan je drempelwaarden bij:\n- Oud: `state < 0.25` (15 minuten als uren)\n- Nieuw: `state < 15` (15 minuten)\n\nSluit deze melding nadat je je automatiseringen hebt gecontroleerd."
    },
    "currency_display_mode_changed": {
      "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 Assistant’s 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, dashboards en statistieken hebt gecontroleerd."
    }
  },
  "exceptions": {
    "no_entries_found": {
      "message": "Geen Tibber Prices integratie-items gevonden. Stel de integratie eerst in."
    },
    "multiple_entries_no_entry_id": {
      "message": "Meerdere Tibber Prices items gevonden. Geef 'entry_id' op om het gewenste item te selecteren."
    },
    "invalid_entry_id": {
      "message": "Ongeldige of niet-beschikbare configuratie-item. Controleer de item-ID en zorg dat de integratie geladen is."
    },
    "missing_home_id": {
      "message": "Huis-ID niet gevonden in het configuratie-item. Configureer de integratie opnieuw."
    },
    "user_data_not_available": {
      "message": "Gebruikersgegevens zijn nog niet beschikbaar. Wacht tot de eerste gegevensupdate is voltooid."
    },
    "timezone_not_found": {
      "message": "Kon de tijdzone van het huis niet bepalen. Controleer de huisconfiguratie in je Tibber-account."
    },
    "end_before_start": {
      "message": "Het eindtijdstip ({search_end}) moet na het starttijdstip ({search_start}) liggen. Controleer je tijdparameters en eventuele day-offsets."
    },
    "price_fetch_failed": {
      "message": "Unable to fetch price data for the requested search range."
    },
    "invalid_search_scope": {
      "message": "Ongeldig zoekbereik. Geldige waarden zijn: today, tomorrow, remaining_today, next_24h, next_48h."
    },
    "scope_conflicts_with_range": {
      "message": "search_scope kan niet gecombineerd worden met expliciete bereikparameters: {params}. Gebruik search_scope OF expliciete start-/eindparameters."
    },
    "day_offset_requires_time": {
      "message": "{offset_param} vereist dat {time_param} ingesteld is. Dagoffset wijzigt alleen de datum van een expliciete tijdparameter."
    },
    "min_level_exceeds_max": {
      "message": "min_price_level {min_level} is hoger dan max_price_level {max_level}. Het minimumniveau moet gelijk aan of lager zijn dan het maximumniveau."
    },
    "power_profile_length_mismatch": {
      "message": "power_profile heeft {profile_length} items maar de duur vereist {interval_count} intervallen ({duration_minutes} minuten). Het power_profile moet precies één item per 15-minuten-interval hebben."
    },
    "level_and_rating_filter_conflict": {
      "message": "level_filter en rating_level_filter kunnen niet samen gebruikt worden. Gebruik slechts één filtertype per verzoek."
    },
    "insert_nulls_requires_filter": {
      "message": "insert_nulls-modus {mode} vereist een level_filter, rating_level_filter of period_filter om segmenten te definiëren. Zonder filter, gebruik insert_nulls: none."
    },
    "connect_segments_requires_segments_mode": {
      "message": "connect_segments vereist dat insert_nulls op 'segments' staat. Stel insert_nulls: segments in om segmentverbinding te gebruiken."
    },
    "array_fields_requires_array_format": {
      "message": "array_fields kan alleen gebruikt worden met output_format: array_of_arrays. Wijzig het uitvoerformaat of verwijder array_fields."
    },
    "invalid_array_fields": {
      "message": "De waarde {template} voor array_fields is ongeldig. Veldnamen moeten tussen accolades staan, bijv. '{start_time}, {price_per_kwh}, {level}'."
    },
    "min_segment_exceeds_duration": {
      "message": "min_segment_duration ({min_segment_minutes} min) mag de totale duur ({duration_minutes} min) niet overschrijden. Verklein min_segment_duration of vergroot duration."
    },
    "start_time_conflict": {
      "message": "search_start en search_start_time specificeren beide het starttijdstip — gebruik slechts één van beide. Kies search_start voor een exacte datum/tijd of search_start_time voor een tijdstip op de dag."
    },
    "end_time_conflict": {
      "message": "search_end en search_end_time specificeren beide het eindtijdstip — gebruik slechts één van beide. Kies search_end voor een exacte datum/tijd of search_end_time voor een tijdstip op de dag."
    },
    "insert_nulls_all_with_period_filter": {
      "message": "insert_nulls: all wordt niet ondersteund met period_filter. Gebruik insert_nulls: segments — dit voegt lege ruimtes in tussen afzonderlijke perioden in de grafiek."
    },
    "connect_segments_with_period_filter": {
      "message": "connect_segments kan niet worden gebruikt met period_filter. Perioden zijn al aaneengesloten — connect_segments heeft alleen effect met level_filter of rating_level_filter."
    },
    "duplicate_task_names": {
      "message": "Taaknamen moeten uniek zijn. Duplicaat: {names}. Geef elke taak een andere naam zodat de resultaten aan de juiste taak gekoppeld kunnen worden."
    },
    "tasks_exceed_search_window": {
      "message": "De totale taaktijd inclusief pauzes ({total_minutes} min) overschrijdt het zoekvenster ({window_minutes} min). Verklein de taakduur, verlaag gap_minutes of vergroot het zoekbereik."
    },
    "must_finish_by_conflicts_with_end": {
      "message": "must_finish_by kan niet worden gecombineerd met eindgrensparameters ({params}). Gebruik must_finish_by alleen — het stelt het zoekeinde automatisch in op de deadline."
    },
    "invalid_entity_reference": {
      "message": "'{reference}' is geen geldige entiteitsreferentie. Gebruik het formaat 'domain.entity_id' of 'domain.entity_id@attribuut'."
    },
    "entity_not_found": {
      "message": "Entiteit '{entity_id}' niet gevonden. Controleer of de entiteit bestaat en beschikbaar is."
    },
    "entity_attribute_not_found": {
      "message": "Entiteit '{entity_id}' heeft geen attribuut '{attribute}'."
    },
    "entity_state_unavailable": {
      "message": "Entiteit '{entity_id}' heeft status '{state}'. De entiteit moet een geldige statuswaarde hebben."
    },
    "entity_value_conversion_failed": {
      "message": "Kan waarde '{raw_value}' van '{entity_id}' ({attribute}) niet converteren naar {expected_type}. Controleer of de entiteit een compatibele waarde biedt."
    },
    "capacity_required_for_percent": {
      "message": "battery_capacity_kwh is required when current or target SoC is provided as a percentage."
    },
    "ambiguous_soc_input": {
      "message": "The field {field} was provided both as percent and as kWh. Use only one representation."
    },
    "already_at_target": {
      "message": "Current state of charge is already at or above the target. No charging schedule is needed."
    },
    "target_exceeds_capacity": {
      "message": "Target SoC ({target_soc_kwh} kWh) exceeds battery capacity ({capacity_kwh} kWh)."
    },
    "energy_unreachable": {
      "message": "The requested charging target cannot be reached within the available search window and charging constraints."
    },
    "missing_current_soc": {
      "message": "Provide either current_soc_percent or current_soc_kwh."
    },
    "missing_target_soc": {
      "message": "Provide either target_soc_percent or target_soc_kwh."
    },
    "missing_deadline_for_must_reach": {
      "message": "Provide must_reach_by or must_reach_by_event when using must_reach_soc_percent or must_reach_soc_kwh."
    },
    "missing_must_reach_soc": {
      "message": "Provide must_reach_soc_percent or must_reach_soc_kwh when using a must_reach deadline."
    },
    "invalid_must_reach_soc": {
      "message": "The minimum state of charge by deadline must be between current and target state of charge."
    },
    "power_strategy_conflict": {
      "message": "Use either min_charge_power_w or charge_power_steps_w, not both at the same time."
    },
    "grid_limit_too_low": {
      "message": "grid_import_limit_w is lower than the minimum required charging power."
    },
    "deadline_conflict": {
      "message": "Use either must_reach_by or must_reach_by_event, not both at the same time."
    },
    "deadline_event_not_available": {
      "message": "The selected deadline event is not available in the current coordinator data."
    },
    "deadline_outside_search_range": {
      "message": "The resolved deadline must be inside the selected search range."
    }
  },
  "services": {
    "get_price": {
      "name": "Prijsgegevens Ophalen",
      "description": "Haal prijsgegevens op voor een specifiek tijdsbereik met automatische routing. Ontwikkelings- en testservice voor de price_info_for_range API-functie. Gebruikt automatisch PRICE_INFO, PRICE_INFO_RANGE of beide op basis van de tijdsbereikgrens.",
      "fields": {
        "entry_id": {
          "name": "Entry ID",
          "description": "De configuratie entry ID voor de Tibber integratie."
        },
        "start_time": {
          "name": "Starttijd",
          "description": "Begin van het tijdsbereik (inclusief, tijdzonebewust)."
        },
        "end_time": {
          "name": "Eindtijd",
          "description": "Einde van het tijdsbereik (exclusief, tijdzonebewust)."
        }
      }
    },
    "get_apexcharts_yaml": {
      "name": "ApexCharts-kaart YAML ophalen",
      "description": "⚠️ BELANGRIJK: Deze service genereert een BASALE VOORBEELD-configuratie voor ApexCharts-kaart als startpunt. Het is GEEN complete oplossing voor alle ApexCharts-functies. Deze integratie is primair een GEGEVENSLEVERANCIER. De gegenereerde YAML demonstreert hoe je de `get_chartdata`-service gebruikt om prijsgegevens op te halen. Vanwege de gesegmenteerde aard van onze gegevens (verschillende tijdsperioden per serie) en het gebruik van Home Assistant's service-API in plaats van entiteitsattributen, zijn veel geavanceerde ApexCharts-functies (zoals in_header, bepaalde transformaties) niet compatibel of vereisen handmatige aanpassing. Je bent welkom om de gegenereerde YAML aan te passen voor jouw specifieke behoeften, maar begrijp alsjeblieft dat uitgebreide ApexCharts-configuratieondersteuning buiten het bereik van deze integratie valt. Bijdragen van de gemeenschap met verbeterde configuraties zijn altijd welkom - als je een betere setup vindt die werkt, deel het dan alsjeblieft zodat iedereen ervan kan profiteren! Voor directe gegevenstoegang om je eigen grafieken te bouwen, gebruik in plaats daarvan de `get_chartdata`-service.",
      "fields": {
        "entry_id": {
          "name": "Invoer-ID",
          "description": "Het configuratie-invoer-ID voor de Tibber-integratie."
        },
        "day": {
          "name": "Dag",
          "description": "Welke dag gevisualiseerd moet worden (standaard: Rollend venster). Vaste dagopties (Gisteren/Vandaag/Morgen) tonen 24u-vensters zonder extra afhankelijkheden. Dynamische opties vereisen config-template-card: Rollend venster creëert een vast 48u-venster dat automatisch wisselt tussen gisteren+vandaag en vandaag+morgen op basis van databeschikbaarheid. Rollend venster (Auto-Zoom) gedraagt zich hetzelfde maar zoomt bovendien automatisch in (2u terugkijken + resterende tijd tot middernacht, graph_span neemt elke 15 minuten af)."
        },
        "level_type": {
          "name": "Niveautype",
          "description": "Selecteer welke prijsniveauclassificatie gevisualiseerd moet worden: 'rating_level' (laag/normaal/hoog op basis van jouw geconfigureerde drempelwaarden) of 'level' (Tibber API-niveaus: zeer goedkoop/goedkoop/normaal/duur/zeer duur)."
        },
        "highlight_best_price": {
          "name": "Beste prijsperiodes markeren",
          "description": "Voeg een halfdo0rzichtige groene overlay toe om de beste prijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de optimale tijden voor energieverbruik te identificeren."
        },
        "highlight_peak_price": {
          "name": "Piekprijsperiodes markeren",
          "description": "Voeg een halfdoorzichtige rode overlay toe om de piekprijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de tijden te identificeren wanneer energie het duurst is."
        },
        "resolution": {
          "name": "Resolutie",
          "description": "Tijdresolutie voor de grafiekdata. 'interval' (standaard): Originele 15-minutenintervallen (96 punten per dag). 'hourly': Geaggregeerde uurwaarden met een rollend 60-minutenvenster (24 punten per dag) voor een overzichtelijkere grafiek."
        }
      }
    },
    "get_chartdata": {
      "name": "Grafiekdata Ophalen",
      "description": "Geeft prijsgegevens terug in een eenvoudig grafiekvriendelijk formaat compatibel met de Tibber Core-integratie outputstructuur. Perfect voor gebruik met populaire grafiekkaarten zoals ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card of de ingebouwde History Graph Card. Veldnamen en gegevensstructuur kunnen worden aangepast aan de vereisten van je grafiek.",
      "sections": {
        "general": {
          "name": "Algemeen",
          "description": "Basisopties voor het ophalen van grafiekgegevens."
        },
        "selection": {
          "name": "Selectie",
          "description": "Selecteer welke gegevens in de uitvoer moeten worden opgenomen."
        },
        "filters": {
          "name": "Filters",
          "description": "Filter gegevens op basis van prijsniveaus, prijsbeoordelingen of speciale periodes."
        },
        "transformation": {
          "name": "Gegevens transformeren",
          "description": "Transformeer de gegevensuitvoer voor betere grafiekcompatibiliteit."
        },
        "format": {
          "name": "Formaat",
          "description": "Pas het uitvoerformaat aan."
        },
        "arrays_of_arrays": {
          "name": "Geavanceerde uitvoerinstellingen: Array van arrays",
          "description": "Instellingen voor uitvoerformaat bij gebruik van array van arrays."
        },
        "arrays_of_objects": {
          "name": "Geavanceerde uitvoerinstellingen: Array van objecten",
          "description": "Instellingen voor uitvoerformaat bij gebruik van array van objecten."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "day": {
          "name": "Dag",
          "description": "Voor welke dag(en) moeten prijzen worden opgehaald. Je kunt meerdere dagen selecteren. Als niet opgegeven, wordt een rollend 2-daags venster geretourneerd: vandaag+morgen (wanneer morgengegevens beschikbaar zijn) of gisteren+vandaag (wanneer morgengegevens nog niet beschikbaar zijn). Dit zorgt voor een continue grafiekweergave zonder hiaten."
        },
        "resolution": {
          "name": "Resolutie",
          "description": "Tijdsresolutie voor de geretourneerde gegevens. Opties: 'interval' (standaard, 15-minuten intervallen, 96 datapunten per dag), 'hourly' (uurgemiddelden, 24 datapunten per dag)."
        },
        "output_format": {
          "name": "Uitvoerformaat",
          "description": "Uitvoerformaat voor de geretourneerde gegevens. Opties: 'array_of_objects' (standaard, array van objecten met aanpasbare veldnamen), 'array_of_arrays' (array van [tijdstempel, prijs]-arrays met afsluitend null-punt voor stepline-grafieken)."
        },
        "array_fields": {
          "name": "Array-velden",
          "description": "Definieer welke velden moeten worden opgenomen. Gebruik veldnamen tussen accolades, gescheiden door komma's. Beschikbare velden: start_time, price_per_kwh, level, rating_level, average. Velden worden automatisch ingeschakeld, zelfs als include_*-opties niet zijn ingesteld. Laat leeg voor standaard (alleen tijdstempel en prijs)."
        },
        "subunit_currency": {
          "name": "Subeenheid valuta",
          "description": "Retourneer prijzen in subeenheid valuta-eenheden (cent voor EUR, øre voor NOK/SEK) in plaats van basisvaluta-eenheden. Standaard uitgeschakeld."
        },
        "round_decimals": {
          "name": "Decimalen afronden",
          "description": "Aantal decimalen om prijzen op af te ronden (0-10). Indien niet opgegeven, wordt de standaardprecisie gebruikt (4 decimalen voor basisvaluta, 2 voor subeenheid valuta)."
        },
        "include_level": {
          "name": "Prijsniveau opnemen",
          "description": "Voeg het Tibber-prijsniveauveld (zeer goedkoop/goedkoop/normaal/duur/zeer duur) toe aan elk gegevenspunt."
        },
        "include_rating_level": {
          "name": "Prijsbeoordeling opnemen",
          "description": "Voeg het berekende prijsbeoordelingsveld (laag/normaal/hoog) toe op basis van jouw geconfigureerde drempels aan elk gegevenspunt."
        },
        "include_average": {
          "name": "Gemiddelde opnemen",
          "description": "Dagelijkse gemiddelde prijs opnemen in elk gegevenspunt ter vergelijking."
        },
        "include_energy": {
          "name": "Energieprijs opnemen",
          "description": "De kale energie-/spotprijs (exclusief belastingen en heffingen) opnemen in elk gegevenspunt. Dit is het 'energy'-veld uit de Tibber-API, handig voor teruglever-/salderingsberekeningen."
        },
        "include_tax": {
          "name": "Belasting opnemen",
          "description": "Het belastingdeel van de prijs opnemen in elk gegevenspunt. Dit is het 'tax'-veld uit de Tibber-API, dat heffingen, belastingen en netwerkkosten vertegenwoordigt."
        },
        "level_filter": {
          "name": "Prijsniveaufilter",
          "description": "Intervallen filteren om alleen specifieke Tibber-prijsniveaus op te nemen (zeer goedkoop/goedkoop/normaal/duur/zeer duur). Indien niet opgegeven, worden alle niveaus opgenomen."
        },
        "rating_level_filter": {
          "name": "Prijsbeoordeling Filter",
          "description": "Filter intervallen om alleen specifieke prijsbeoordelingen op te nemen (laag/normaal/hoog). Als dit niet is opgegeven, worden alle beoordelingen opgenomen."
        },
        "period_filter": {
          "name": "Periode Filter",
          "description": "Filter intervallen om alleen die binnen Beste prijs- of Piek prijs-perioden op te nemen. Opties: 'best_price' (alleen intervallen in Beste prijs-perioden), 'peak_price' (alleen intervallen in Piek prijs-perioden). Als niet opgegeven, worden alle intervallen opgenomen. Gebruikt vooraf berekende periodegegevens van binaire sensoren."
        },
        "insert_nulls": {
          "name": "NULL-waarden invoegen",
          "description": "Beheer het invoegen van NULL-waarden voor gefilterde gegevens. 'none' (standaard): Geen NULL-waarden, alleen overeenkomende intervallen. 'segments': Voeg NULL-punten toe bij segmentgrenzen voor schone gaten in grafieken (aanbevolen voor traplijngrafieken). 'all': Voeg NULL in voor alle tijdstempels waarbij het filter niet overeenkomt (handig voor continue tijdreeksvisualisatie)."
        },
        "connect_segments": {
          "name": "Segmenten verbinden",
          "description": "[ALLEEN MET 'NULL-waarden invoegen'] Indien ingeschakeld, worden verbindingspunten toegevoegd bij segmentgrenzen om verschillende prijsniveau-segmenten visueel te verbinden in traplijngrafieken. Wanneer de prijs DAALT, wordt een punt met de lagere prijs toegevoegd aan het einde van het huidige segment. Wanneer de prijs STIJGT, wordt een houdpunt toegevoegd vóór de gat. Dit creëert vloeiende visuele overgangen tussen segmenten in plaats van abrupte gaten."
        },
        "add_trailing_null": {
          "name": "Voeg afsluitend null-punt toe",
          "description": "Voeg een laatste datapunt met null-waarden (behalve tijdstempel) toe aan het einde. Sommige diagrambibliotheken hebben dit nodig om extrapolatie/interpolatie naar de rand van het viewport te voorkomen bij stepline-weergave. Laat uitgeschakeld tenzij je diagram dit vereist."
        },
        "start_time_field": {
          "name": "Starttijd-veldnaam",
          "description": "Aangepaste naam voor het starttijd-veld in de uitvoer. Standaard is 'start_time' als niet opgegeven."
        },
        "end_time_field": {
          "name": "Eindtijd-veldnaam",
          "description": "Aangepaste naam voor het eindtijd-veld in de uitvoer. Standaard is 'end_time' als niet opgegeven. Alleen gebruikt met period_filter."
        },
        "price_field": {
          "name": "Prijsveld-naam",
          "description": "Aangepaste naam voor het prijsveld in de uitvoer. Standaard is 'price_per_kwh'."
        },
        "level_field": {
          "name": "Prijsniveauveld-naam",
          "description": "Aangepaste naam voor het prijsniveauveld in de uitvoer. Standaard is 'level'. Alleen gebruikt wanneer include_level is ingeschakeld."
        },
        "rating_level_field": {
          "name": "Prijsbeoordelingsveld-naam",
          "description": "Aangepaste naam voor het prijsbeoordelingsveld in de uitvoer. Standaard is 'rating_level'. Alleen gebruikt wanneer include_rating_level is ingeschakeld."
        },
        "average_field": {
          "name": "Gemiddelde veld-naam",
          "description": "Aangepaste naam voor het gemiddelde veld in de uitvoer. Standaard is 'average'. Alleen gebruikt wanneer include_average is ingeschakeld."
        },
        "energy_field": {
          "name": "Energieprijs veld-naam",
          "description": "Aangepaste naam voor het energieprijsveld in de uitvoer. Standaard is 'energy_price'. Alleen gebruikt wanneer include_energy is ingeschakeld."
        },
        "tax_field": {
          "name": "Belasting veld-naam",
          "description": "Aangepaste naam voor het belastingveld in de uitvoer. Standaard is 'tax'. Alleen gebruikt wanneer include_tax is ingeschakeld."
        },
        "metadata": {
          "name": "Metadata",
          "description": "Beheer metadata-opname in het antwoord. 'include' (standaard): Retourneert zowel grafiekdata als metadata met prijsstatistieken, valuta-info, Y-as suggesties en tijdsbereik. 'only': Retourneert alleen metadata zonder grafiekdata te verwerken (snel, handig voor dynamische Y-as configuratie). 'none': Retourneert alleen grafiekdata zonder metadata."
        },
        "data_key": {
          "name": "Gegevenssleutel",
          "description": "Aangepaste naam voor de gegevenssleutel op het hoogste niveau in het antwoord. Standaard is 'data' als niet opgegeven."
        }
      }
    },
    "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."
        }
      }
    },
    "find_cheapest_block": {
      "name": "Goedkoopste blok vinden",
      "description": "Vindt het goedkoopste aaneengesloten tijdvenster van een bepaalde duur. Ontworpen voor apparaatplanning: vaatwasser, wasmachine, droger enz. Retourneert het goedkoopste venster met start-/eindtijden en prijsstatistieken.",
      "sections": {
        "search_range": {
          "name": "Aangepast zoekbereik",
          "description": "Definieer precieze start- en eindtijden voor het zoeken. Overschrijft het zoekbereik wanneer ingesteld."
        },
        "time_alternatives": {
          "name": "Geavanceerde tijdopties",
          "description": "Alternatieve manieren om het zoekbereik te definiëren met tijdstip en minuutverschuivingen."
        },
        "price_filter": {
          "name": "Prijsniveaufilter",
          "description": "Beperk het zoeken tot intervallen binnen het opgegeven Tibber-prijsniveaubereik."
        },
        "search_tuning": {
          "name": "Zoekalgoritme-fijnafstelling",
          "description": "Verfijn hoe het zoeken omgaat met uitschieters, minimale kwaliteitsdrempels en terugvalgedrag."
        },
        "cost_estimation": {
          "name": "Kostenraming",
          "description": "Geef een vermogensprofiel op voor nauwkeurige energiekostenramingen op basis van werkelijk verbruik."
        },
        "output": {
          "name": "Uitvoeropties",
          "description": "Uitvoerformaat regelen: vergelijkingsdetails en valuta-eenheid."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "duration": {
          "name": "Duur",
          "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur."
        },
        "search_start": {
          "name": "Zoekstart",
          "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven."
        },
        "search_end": {
          "name": "Zoekeinde",
          "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven."
        },
        "must_finish_by": {
          "name": "Moet klaar zijn voor",
          "description": "Deadline: het apparaat moet voor dit tijdstip klaar zijn. Het zoekbereik eindigt bij deze deadline — de service vindt het goedkoopste venster dat ervoor eindigt. Kan niet worden gecombineerd met Zoek einde, Zoek eindtijd of Zoek einde offset."
        },
        "search_start_time": {
          "name": "Zoekstart-tijd",
          "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld."
        },
        "search_start_day_offset": {
          "name": "Zoekstart dagoffset",
          "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd."
        },
        "search_end_time": {
          "name": "Zoekeinde-tijd",
          "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld."
        },
        "search_end_day_offset": {
          "name": "Zoekeinde dagoffset",
          "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd."
        },
        "search_start_offset_minutes": {
          "name": "Zoekstart-offset (minuten)",
          "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld."
        },
        "search_end_offset_minutes": {
          "name": "Zoekeinde-offset (minuten)",
          "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld."
        },
        "include_current_interval": {
          "name": "Huidig interval opnemen",
          "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat."
        },
        "use_base_unit": {
          "name": "Basisvaluta gebruiken",
          "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen."
        },
        "search_scope": {
          "name": "Zoekbereik (snelkoppeling)",
          "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu."
        },
        "max_price_level": {
          "name": "Maximaal prijsniveau",
          "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking."
        },
        "min_price_level": {
          "name": "Minimaal prijsniveau",
          "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen."
        },
        "include_comparison_details": {
          "name": "Vergelijkingsdetails meenemen",
          "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end."
        },
        "power_profile": {
          "name": "Vermogensprofiel",
          "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik."
        },
        "smooth_outliers": {
          "name": "Uitschieters gladstrijken",
          "description": "Prijsuitschieters gladstrijken vóór het zoeken. Uitschieters worden tijdelijk vervangen door het gemiddelde van hun buren, zodat een enkele piek of dip het resultaat niet domineert. Het antwoord toont altijd de originele (onafgevlakte) prijzen. Standaard: ingeschakeld."
        },
        "min_distance_from_avg": {
          "name": "Min. afstand van gemiddelde",
          "description": "Vereis dat het gevonden resultaat minstens dit percentage afwijkt van het gemiddelde van het zoekbereik. Voor goedkoopst: resultaat moet minstens X% onder het gemiddelde liggen. Voor duurste: minstens X% erboven. Als niet voldaan, wordt geen resultaat teruggegeven (reason: selection_above/below_distance_threshold). Leeg laten om te deactiveren."
        },
        "allow_relaxation": {
          "name": "Versoepeling toestaan",
          "description": "Filters geleidelijk versoepelen om een resultaat te garanderen. Fasen: 1) Afstandsdrempel verlagen/verwijderen 2) Prijsniveaufilters uitbreiden 3) Duur verkorten. Standaard: ingeschakeld."
        },
        "duration_flexibility_minutes": {
          "name": "Duurflexibiliteit",
          "description": "Maximale minuten waarmee de duur mag worden verkort bij versoepeling (0–120, stap 15). Leeg laten voor automatische berekening (~20% van de duur, max 60 min)."
        }
      }
    },
    "find_most_expensive_block": {
      "name": "Duurste blok vinden",
      "description": "Vindt het duurste aaneengesloten tijdvenster van een bepaalde duur. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert het duurste venster met start-/eindtijden en prijsstatistieken.",
      "sections": {
        "search_range": {
          "name": "Aangepast zoekbereik",
          "description": "Definieer precieze start- en eindtijden voor het zoeken. Overschrijft het zoekbereik wanneer ingesteld."
        },
        "time_alternatives": {
          "name": "Geavanceerde tijdopties",
          "description": "Alternatieve manieren om het zoekbereik te definiëren met tijdstip en minuutverschuivingen."
        },
        "price_filter": {
          "name": "Prijsniveaufilter",
          "description": "Beperk het zoeken tot intervallen binnen het opgegeven Tibber-prijsniveaubereik."
        },
        "search_tuning": {
          "name": "Zoekalgoritme-fijnafstelling",
          "description": "Verfijn hoe het zoeken omgaat met uitschieters, minimale kwaliteitsdrempels en terugvalgedrag."
        },
        "cost_estimation": {
          "name": "Kostenraming",
          "description": "Geef een vermogensprofiel op voor nauwkeurige energiekostenramingen op basis van werkelijk verbruik."
        },
        "output": {
          "name": "Uitvoeropties",
          "description": "Uitvoerformaat regelen: vergelijkingsdetails en valuta-eenheid."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "duration": {
          "name": "Duur",
          "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur."
        },
        "search_start": {
          "name": "Zoekstart",
          "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven."
        },
        "search_end": {
          "name": "Zoekeinde",
          "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven."
        },
        "must_finish_by": {
          "name": "Moet klaar zijn voor",
          "description": "Deadline: het apparaat moet voor dit tijdstip klaar zijn. Het zoekbereik eindigt bij deze deadline — de service vindt het duurste venster dat ervoor eindigt. Kan niet gecombineerd worden met Zoekeinde, Zoekeinde-tijdstip, Zoekeinde-verschuiving of Zoekbereik."
        },
        "search_start_time": {
          "name": "Zoekstart-tijd",
          "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld."
        },
        "search_start_day_offset": {
          "name": "Zoekstart dagoffset",
          "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd."
        },
        "search_end_time": {
          "name": "Zoekeinde-tijd",
          "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld."
        },
        "search_end_day_offset": {
          "name": "Zoekeinde dagoffset",
          "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd."
        },
        "search_start_offset_minutes": {
          "name": "Zoekstart-offset (minuten)",
          "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld."
        },
        "search_end_offset_minutes": {
          "name": "Zoekeinde-offset (minuten)",
          "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld."
        },
        "include_current_interval": {
          "name": "Huidig interval opnemen",
          "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat."
        },
        "use_base_unit": {
          "name": "Basisvaluta gebruiken",
          "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen."
        },
        "search_scope": {
          "name": "Zoekbereik (snelkoppeling)",
          "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu."
        },
        "max_price_level": {
          "name": "Maximaal prijsniveau",
          "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking."
        },
        "min_price_level": {
          "name": "Minimaal prijsniveau",
          "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen."
        },
        "include_comparison_details": {
          "name": "Vergelijkingsdetails meenemen",
          "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end."
        },
        "power_profile": {
          "name": "Vermogensprofiel",
          "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik."
        },
        "smooth_outliers": {
          "name": "Uitschieters gladstrijken",
          "description": "Prijsuitschieters gladstrijken vóór het zoeken. Uitschieters worden tijdelijk vervangen door het gemiddelde van hun buren, zodat een enkele piek of dip het resultaat niet domineert. Het antwoord toont altijd de originele (onafgevlakte) prijzen. Standaard: ingeschakeld."
        },
        "min_distance_from_avg": {
          "name": "Min. afstand van gemiddelde",
          "description": "Vereis dat het gevonden resultaat minstens dit percentage afwijkt van het gemiddelde van het zoekbereik. Voor goedkoopst: resultaat moet minstens X% onder het gemiddelde liggen. Voor duurste: minstens X% erboven. Als niet voldaan, wordt geen resultaat teruggegeven (reason: selection_above/below_distance_threshold). Leeg laten om te deactiveren."
        },
        "allow_relaxation": {
          "name": "Versoepeling toestaan",
          "description": "Filters geleidelijk versoepelen om een resultaat te garanderen. Fasen: 1) Afstandsdrempel verlagen/verwijderen 2) Prijsniveaufilters uitbreiden 3) Duur verkorten. Standaard: ingeschakeld."
        },
        "duration_flexibility_minutes": {
          "name": "Duurflexibiliteit",
          "description": "Maximale minuten waarmee de duur mag worden verkort bij versoepeling (0–120, stap 15). Leeg laten voor automatische berekening (~20% van de duur, max 60 min)."
        }
      }
    },
    "find_cheapest_hours": {
      "name": "Goedkoopste uren vinden",
      "description": "Vindt de goedkoopste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Ontworpen voor flexibele belastingen: batterijladen, elektrisch voertuig, warmwaterboiler. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.",
      "sections": {
        "search_range": {
          "name": "Aangepast zoekbereik",
          "description": "Definieer precieze start- en eindtijden voor het zoeken. Overschrijft het zoekbereik wanneer ingesteld."
        },
        "time_alternatives": {
          "name": "Geavanceerde tijdopties",
          "description": "Alternatieve manieren om het zoekbereik te definiëren met tijdstip en minuutverschuivingen."
        },
        "price_filter": {
          "name": "Prijsniveaufilter",
          "description": "Beperk het zoeken tot intervallen binnen het opgegeven Tibber-prijsniveaubereik."
        },
        "search_tuning": {
          "name": "Zoekalgoritme-fijnafstelling",
          "description": "Verfijn hoe het zoeken omgaat met uitschieters, minimale kwaliteitsdrempels en terugvalgedrag."
        },
        "cost_estimation": {
          "name": "Kostenraming",
          "description": "Geef een vermogensprofiel op voor nauwkeurige energiekostenramingen op basis van werkelijk verbruik."
        },
        "output": {
          "name": "Uitvoeropties",
          "description": "Uitvoerformaat regelen: vergelijkingsdetails en valuta-eenheid."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "duration": {
          "name": "Duur",
          "description": "Benodigde goedkope totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur."
        },
        "search_start": {
          "name": "Zoekstart",
          "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven."
        },
        "search_end": {
          "name": "Zoekeinde",
          "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven."
        },
        "must_finish_by": {
          "name": "Moet klaar zijn voor",
          "description": "Deadline: het apparaat moet voor dit tijdstip klaar zijn. Het zoekbereik eindigt bij deze deadline — de service vindt het goedkoopste venster dat ervoor eindigt. Kan niet worden gecombineerd met Zoek einde, Zoek eindtijd of Zoek einde offset."
        },
        "search_start_time": {
          "name": "Zoekstart-tijd",
          "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld."
        },
        "search_start_day_offset": {
          "name": "Zoekstart dagoffset",
          "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd."
        },
        "search_end_time": {
          "name": "Zoekeinde-tijd",
          "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld."
        },
        "search_end_day_offset": {
          "name": "Zoekeinde dagoffset",
          "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd."
        },
        "search_start_offset_minutes": {
          "name": "Zoekstart-offset (minuten)",
          "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld."
        },
        "search_end_offset_minutes": {
          "name": "Zoekeinde-offset (minuten)",
          "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld."
        },
        "include_current_interval": {
          "name": "Huidig interval opnemen",
          "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat."
        },
        "min_segment_duration": {
          "name": "Minimale segmentduur",
          "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur."
        },
        "use_base_unit": {
          "name": "Basisvaluta gebruiken",
          "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen."
        },
        "search_scope": {
          "name": "Zoekbereik (snelkoppeling)",
          "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu."
        },
        "max_price_level": {
          "name": "Maximaal prijsniveau",
          "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking."
        },
        "min_price_level": {
          "name": "Minimaal prijsniveau",
          "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen."
        },
        "include_comparison_details": {
          "name": "Vergelijkingsdetails meenemen",
          "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end."
        },
        "power_profile": {
          "name": "Vermogensprofiel",
          "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik."
        },
        "smooth_outliers": {
          "name": "Uitschieters gladstrijken",
          "description": "Prijsuitschieters gladstrijken vóór het zoeken. Uitschieters worden tijdelijk vervangen door het gemiddelde van hun buren, zodat een enkele piek of dip het resultaat niet domineert. Het antwoord toont altijd de originele (onafgevlakte) prijzen. Standaard: ingeschakeld."
        },
        "min_distance_from_avg": {
          "name": "Min. afstand van gemiddelde",
          "description": "Vereis dat het gevonden resultaat minstens dit percentage afwijkt van het gemiddelde van het zoekbereik. Voor goedkoopst: resultaat moet minstens X% onder het gemiddelde liggen. Voor duurste: minstens X% erboven. Als niet voldaan, wordt geen resultaat teruggegeven (reason: selection_above/below_distance_threshold). Leeg laten om te deactiveren."
        },
        "allow_relaxation": {
          "name": "Versoepeling toestaan",
          "description": "Filters geleidelijk versoepelen om een resultaat te garanderen. Fasen: 1) Afstandsdrempel verlagen/verwijderen 2) Prijsniveaufilters uitbreiden 3) Duur verkorten. Standaard: ingeschakeld."
        },
        "duration_flexibility_minutes": {
          "name": "Duurflexibiliteit",
          "description": "Maximale minuten waarmee de duur mag worden verkort bij versoepeling (0–120, stap 15). Leeg laten voor automatische berekening (~20% van de duur, max 60 min)."
        }
      }
    },
    "find_most_expensive_hours": {
      "name": "Duurste uren vinden",
      "description": "Vindt de duurste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.",
      "sections": {
        "search_range": {
          "name": "Aangepast zoekbereik",
          "description": "Definieer precieze start- en eindtijden voor het zoeken. Overschrijft het zoekbereik wanneer ingesteld."
        },
        "time_alternatives": {
          "name": "Geavanceerde tijdopties",
          "description": "Alternatieve manieren om het zoekbereik te definiëren met tijdstip en minuutverschuivingen."
        },
        "price_filter": {
          "name": "Prijsniveaufilter",
          "description": "Beperk het zoeken tot intervallen binnen het opgegeven Tibber-prijsniveaubereik."
        },
        "search_tuning": {
          "name": "Zoekalgoritme-fijnafstelling",
          "description": "Verfijn hoe het zoeken omgaat met uitschieters, minimale kwaliteitsdrempels en terugvalgedrag."
        },
        "cost_estimation": {
          "name": "Kostenraming",
          "description": "Geef een vermogensprofiel op voor nauwkeurige energiekostenramingen op basis van werkelijk verbruik."
        },
        "output": {
          "name": "Uitvoeropties",
          "description": "Uitvoerformaat regelen: vergelijkingsdetails en valuta-eenheid."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "duration": {
          "name": "Duur",
          "description": "Te vinden dure totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur."
        },
        "search_start": {
          "name": "Zoekstart",
          "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven."
        },
        "search_end": {
          "name": "Zoekeinde",
          "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven."
        },
        "must_finish_by": {
          "name": "Moet klaar zijn voor",
          "description": "Deadline: het apparaat moet voor dit tijdstip klaar zijn. Het zoekbereik eindigt bij deze deadline — de service vindt het duurste venster dat ervoor eindigt. Kan niet gecombineerd worden met Zoekeinde, Zoekeinde-tijdstip, Zoekeinde-verschuiving of Zoekbereik."
        },
        "search_start_time": {
          "name": "Zoekstart-tijd",
          "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld."
        },
        "search_start_day_offset": {
          "name": "Zoekstart dagoffset",
          "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd."
        },
        "search_end_time": {
          "name": "Zoekeinde-tijd",
          "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld."
        },
        "search_end_day_offset": {
          "name": "Zoekeinde dagoffset",
          "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd."
        },
        "search_start_offset_minutes": {
          "name": "Zoekstart-offset (minuten)",
          "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld."
        },
        "search_end_offset_minutes": {
          "name": "Zoekeinde-offset (minuten)",
          "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld."
        },
        "include_current_interval": {
          "name": "Huidig interval opnemen",
          "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat."
        },
        "min_segment_duration": {
          "name": "Minimale segmentduur",
          "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur."
        },
        "use_base_unit": {
          "name": "Basisvaluta gebruiken",
          "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen."
        },
        "search_scope": {
          "name": "Zoekbereik (snelkoppeling)",
          "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu."
        },
        "max_price_level": {
          "name": "Maximaal prijsniveau",
          "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking."
        },
        "min_price_level": {
          "name": "Minimaal prijsniveau",
          "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen."
        },
        "include_comparison_details": {
          "name": "Vergelijkingsdetails meenemen",
          "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end."
        },
        "power_profile": {
          "name": "Vermogensprofiel",
          "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik."
        },
        "smooth_outliers": {
          "name": "Uitschieters gladstrijken",
          "description": "Prijsuitschieters gladstrijken vóór het zoeken. Uitschieters worden tijdelijk vervangen door het gemiddelde van hun buren, zodat een enkele piek of dip het resultaat niet domineert. Het antwoord toont altijd de originele (onafgevlakte) prijzen. Standaard: ingeschakeld."
        },
        "min_distance_from_avg": {
          "name": "Min. afstand van gemiddelde",
          "description": "Vereis dat het gevonden resultaat minstens dit percentage afwijkt van het gemiddelde van het zoekbereik. Voor goedkoopst: resultaat moet minstens X% onder het gemiddelde liggen. Voor duurste: minstens X% erboven. Als niet voldaan, wordt geen resultaat teruggegeven (reason: selection_above/below_distance_threshold). Leeg laten om te deactiveren."
        },
        "allow_relaxation": {
          "name": "Versoepeling toestaan",
          "description": "Filters geleidelijk versoepelen om een resultaat te garanderen. Fasen: 1) Afstandsdrempel verlagen/verwijderen 2) Prijsniveaufilters uitbreiden 3) Duur verkorten. Standaard: ingeschakeld."
        },
        "duration_flexibility_minutes": {
          "name": "Duurflexibiliteit",
          "description": "Maximale minuten waarmee de duur mag worden verkort bij versoepeling (0–120, stap 15). Leeg laten voor automatische berekening (~20% van de duur, max 60 min)."
        }
      }
    },
    "find_cheapest_schedule": {
      "name": "Goedkoopste schema vinden",
      "description": "Plant meerdere apparaten optimaal zonder tijdoverlap. Elke taak krijgt het goedkoopste beschikbare aaneengesloten tijdvenster.",
      "sections": {
        "search_range": {
          "name": "Aangepast zoekbereik",
          "description": "Definieer precieze start- en eindtijden voor het zoeken. Overschrijft het zoekbereik wanneer ingesteld."
        },
        "time_alternatives": {
          "name": "Geavanceerde tijdopties",
          "description": "Alternatieve manieren om het zoekbereik te definiëren met tijdstip en minuutverschuivingen."
        },
        "price_filter": {
          "name": "Prijsniveaufilter",
          "description": "Beperk het zoeken tot intervallen binnen het opgegeven Tibber-prijsniveaubereik."
        },
        "search_tuning": {
          "name": "Zoekalgoritme-fijnafstelling",
          "description": "Verfijn hoe het zoeken omgaat met uitschieters, minimale kwaliteitsdrempels en terugvalgedrag."
        },
        "output": {
          "name": "Uitvoeropties",
          "description": "Uitvoerformaat regelen: vergelijkingsdetails en valuta-eenheid."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Item-ID",
          "description": "De config-item-ID voor de Tibber-integratie."
        },
        "tasks": {
          "name": "Taken",
          "description": "Lijst van in te plannen taken. Elke taak heeft name (tekst) en duration (hh:mm:ss). Optioneel power_profile (watt per 15-min-interval). Maximaal 4 taken."
        },
        "gap_minutes": {
          "name": "Tussenpose tussen taken (minuten)",
          "description": "Minimale tussenpose in minuten tussen opeenvolgende ingeplande taken. Afgerond omhoog tot 15 minuten. Standaard: 0 (geen tussenpose)."
        },
        "sequential": {
          "name": "Sequentiële volgorde",
          "description": "Plan taken in de volgorde waarin ze in de takenlijst staan. Elke taak start na het einde van de vorige (plus tussenpose). Gebruik dit voor afhankelijke apparaten zoals wasmachine → droger. Standaard: uitgeschakeld (taken worden gesorteerd op duur voor optimale verdeling)."
        },
        "search_scope": {
          "name": "Zoekbereik (snelkoppeling)",
          "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu."
        },
        "search_start": {
          "name": "Zoekstart",
          "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven."
        },
        "search_end": {
          "name": "Zoekeinde",
          "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven."
        },
        "must_finish_by": {
          "name": "Moet klaar zijn voor",
          "description": "Deadline: het apparaat moet voor dit tijdstip klaar zijn. Het zoekbereik eindigt bij deze deadline — de service vindt het goedkoopste venster dat ervoor eindigt. Kan niet worden gecombineerd met Zoek einde, Zoek eindtijd of Zoek einde offset."
        },
        "search_start_time": {
          "name": "Zoekstart-tijd",
          "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld."
        },
        "search_start_day_offset": {
          "name": "Zoekstart dagoffset",
          "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd."
        },
        "search_end_time": {
          "name": "Zoekeinde-tijd",
          "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld."
        },
        "search_end_day_offset": {
          "name": "Zoekeinde dagoffset",
          "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd."
        },
        "search_start_offset_minutes": {
          "name": "Zoekstart-offset (minuten)",
          "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld."
        },
        "search_end_offset_minutes": {
          "name": "Zoekeinde-offset (minuten)",
          "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld."
        },
        "max_price_level": {
          "name": "Maximaal prijsniveau",
          "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking."
        },
        "min_price_level": {
          "name": "Minimaal prijsniveau",
          "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen."
        },
        "include_comparison_details": {
          "name": "Vergelijkingsdetails opnemen",
          "description": "Voegt per taak extra price_comparison-details toe (comparison_price_min, comparison_price_max, comparison_window_end) om het gekozen venster te vergelijken met het tegenovergestelde extreme venster met dezelfde duur."
        },
        "use_base_unit": {
          "name": "Basisvaluta gebruiken",
          "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen."
        },
        "smooth_outliers": {
          "name": "Uitschieters gladstrijken",
          "description": "Prijsuitschieters gladstrijken vóór het zoeken. Uitschieters worden tijdelijk vervangen door het gemiddelde van hun buren, zodat een enkele piek of dip het resultaat niet domineert. Het antwoord toont altijd de originele (onafgevlakte) prijzen. Standaard: ingeschakeld."
        },
        "allow_relaxation": {
          "name": "Versoepeling toestaan",
          "description": "Filters geleidelijk versoepelen om een resultaat te garanderen. Fasen: 1) Afstandsdrempel verlagen/verwijderen 2) Prijsniveaufilters uitbreiden 3) Duur verkorten. Standaard: ingeschakeld."
        },
        "duration_flexibility_minutes": {
          "name": "Duurflexibiliteit",
          "description": "Maximale minuten waarmee de duur mag worden verkort bij versoepeling (0–120, stap 15). Leeg laten voor automatische berekening (~20% van de duur, max 60 min)."
        }
      }
    },
    "plan_charging": {
      "name": "Plan Charging",
      "description": "Creates a lowest-cost charging schedule from battery parameters instead of a fixed duration. Supports fixed, continuous, or stepped charging power, optional deadline-aware minimum SoC planning, and economic filtering for later discharge use cases. Returns a per-interval charging plan with power, energy, SoC progression, segment grouping, total cost, and profitability details. If no schedule is found, the response includes a stable reason code in the reason field (for example: already_at_target, no_data_in_range, no_intervals_matching_level_filter, no_intervals_after_economic_filter, energy_unreachable, energy_unreachable_by_deadline, selection_above_distance_threshold).",
      "sections": {
        "battery": {
          "name": "Battery Parameters",
          "description": "Describe the battery: usable capacity, current and target SoC, and charging efficiency. You can provide SoC in percent (requires capacity) or directly in kWh."
        },
        "charging": {
          "name": "Charging Strategy",
          "description": "Configure variable-power charging behavior, grid limits, and minimum run-time constraints."
        },
        "deadline": {
          "name": "Deadline Planning",
          "description": "Require a minimum state of charge by a specific moment (for example before a peak period). Set both the Minimum SoC by Deadline and when it must be reached — either as an absolute time (Must Reach By) or from a known event (Deadline Event)."
        },
        "search_range": {
          "name": "Custom Search Range",
          "description": "Define precise start and end times for the search. Overrides Search Scope when set."
        },
        "time_alternatives": {
          "name": "Advanced Time Options",
          "description": "Alternative ways to define the search range using time-of-day and minute offsets."
        },
        "price_filter": {
          "name": "Price Level Filter",
          "description": "Restrict search to intervals within the specified Tibber price level range."
        },
        "search_tuning": {
          "name": "Search Algorithm Tuning",
          "description": "Fine-tune how the search handles outliers, minimum quality thresholds, and fallback behavior."
        },
        "economics": {
          "name": "Economic Filters",
          "description": "Filter charging intervals by maximum cost or expected later discharge value."
        },
        "output": {
          "name": "Output Options",
          "description": "Control output format: comparison details and currency unit."
        }
      },
      "fields": {
        "entry_id": {
          "name": "Entry ID",
          "description": "The config entry ID for the Tibber integration."
        },
        "max_charge_power_w": {
          "name": "Maximum Charge Power",
          "description": "Maximum charging power in watts. This defines the upper bound for fixed, continuous, or stepped charging schedules."
        },
        "battery_capacity_kwh": {
          "name": "Battery Capacity",
          "description": "Usable battery capacity in kWh. Required when current or target SoC is provided as a percentage."
        },
        "current_soc_percent": {
          "name": "Current SoC (%)",
          "description": "Current battery state of charge in percent. Cannot be combined with Current SoC (kWh)."
        },
        "current_soc_kwh": {
          "name": "Current SoC (kWh)",
          "description": "Current battery state of charge in kWh. Cannot be combined with Current SoC (%)."
        },
        "target_soc_percent": {
          "name": "Target SoC (%)",
          "description": "Desired battery state of charge in percent. Cannot be combined with Target SoC (kWh)."
        },
        "target_soc_kwh": {
          "name": "Target SoC (kWh)",
          "description": "Desired battery state of charge in kWh. Cannot be combined with Target SoC (%)."
        },
        "charging_efficiency": {
          "name": "Charging Efficiency",
          "description": "Fraction of grid energy that is stored in the battery. Example: 0.92 means 8% charging losses."
        },
        "search_scope": {
          "name": "Search Scope",
          "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now."
        },
        "include_current_interval": {
          "name": "Include Current Interval",
          "description": "Include the currently running 15-minute interval in the search. When enabled, charging may begin in the current interval if it is part of the cheapest result."
        },
        "search_start": {
          "name": "Search Start",
          "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified."
        },
        "search_end": {
          "name": "Search End",
          "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified."
        },
        "must_finish_by": {
          "name": "Must Finish By",
          "description": "Deadline: charging must be finished by this time. The search range ends at this deadline — the service finds the cheapest intervals that complete before it. Cannot be combined with Search End, Search End Time, or Search End Offset."
        },
        "search_start_time": {
          "name": "Search Start Time",
          "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set."
        },
        "search_start_day_offset": {
          "name": "Search Start Day Offset",
          "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search Start Time."
        },
        "search_end_time": {
          "name": "Search End Time",
          "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set."
        },
        "search_end_day_offset": {
          "name": "Search End Day Offset",
          "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search End Time."
        },
        "search_start_offset_minutes": {
          "name": "Search Start Offset (minutes)",
          "description": "Alternative: start searching this many minutes from now. Positive = future, negative = past. Ignored if Search Start or Search Start Time is set."
        },
        "search_end_offset_minutes": {
          "name": "Search End Offset (minutes)",
          "description": "Alternative: stop searching this many minutes from now. Positive = future, negative = past. Ignored if Search End or Search End Time is set."
        },
        "max_price_level": {
          "name": "Maximum Price Level",
          "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction."
        },
        "min_price_level": {
          "name": "Minimum Price Level",
          "description": "Only consider intervals at or above this Tibber price level. Useful to exclude unrealistically cheap negative-price-only windows from mixed searches."
        },
        "include_comparison_details": {
          "name": "Include Comparison Details",
          "description": "Enrich the price_comparison result with additional fields: comparison_price_min and comparison_price_max."
        },
        "use_base_unit": {
          "name": "Use Base Currency Unit",
          "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations."
        },
        "smooth_outliers": {
          "name": "Smooth Outliers",
          "description": "Smooth price outliers before searching. Outlier intervals are temporarily replaced by the average of their neighbors, so a single spike or dip does not dominate the result. The response always shows the original (unsmoothed) prices. Default: enabled."
        },
        "min_distance_from_avg": {
          "name": "Min. Distance from Average",
          "description": "Require the selected charging intervals to be at least this percentage below the average price of the full search range. Leave empty to disable."
        },
        "allow_relaxation": {
          "name": "Allow relaxation",
          "description": "Progressively relax filters to guarantee a result when possible. Phases: 1) Reduce/remove distance threshold 2) Expand level filters 3) Reduce duration. Default: enabled."
        },
        "duration_flexibility_minutes": {
          "name": "Duration flexibility",
          "description": "Maximum minutes the automatically calculated charging duration may be shortened during relaxation (0–120, step 15). Leave empty for automatic calculation."
        },
        "must_reach_soc_percent": {
          "name": "Minimum SoC by Deadline (%)",
          "description": "Minimum battery state of charge that must be reached by the deadline. Cannot be combined with Minimum SoC by Deadline (kWh)."
        },
        "must_reach_soc_kwh": {
          "name": "Minimum SoC by Deadline (kWh)",
          "description": "Minimum battery state of charge that must be reached by the deadline. Cannot be combined with Minimum SoC by Deadline (%)."
        },
        "min_charge_power_w": {
          "name": "Minimum Charge Power",
          "description": "Enable continuous charging mode. The planner may reduce the last interval down to this minimum power instead of always using the maximum."
        },
        "charge_power_steps_w": {
          "name": "Charge Power Steps",
          "description": "Enable stepped charging mode. Provide the allowed power steps in watts as a list, for example [1380, 4140, 11000]. The planner picks the smallest step that still covers the remaining energy in the final interval. Mutually exclusive with Minimum Charge Power."
        },
        "grid_import_limit_w": {
          "name": "Grid Import Limit",
          "description": "Upper limit for charging power drawn from the grid in watts. Useful when the charger must share available power with other loads."
        },
        "must_reach_by": {
          "name": "Must Reach By",
          "description": "Absolute deadline for must_reach_soc_*. The planner first guarantees the minimum SoC before this moment, then continues with the remaining target if possible."
        },
        "must_reach_by_event": {
          "name": "Deadline Event",
          "description": "Alternative deadline derived from coordinator data. Use this instead of Must Reach By to plan around midnight, the next peak period, or the next best-price period end."
        },
        "discharging_efficiency": {
          "name": "Discharging Efficiency",
          "description": "Fraction of stored battery energy that is still usable when later discharged. Used for profitability calculations."
        },
        "expected_discharge_price": {
          "name": "Expected Discharge Price",
          "description": "Expected value of each discharged kWh. Intervals above the break-even price can be filtered when Reserve For Discharge is enabled."
        },
        "reserve_for_discharge": {
          "name": "Reserve For Discharge",
          "description": "Keep only intervals that are economically sensible for a later discharge based on expected discharge price and round-trip efficiency."
        },
        "max_cost_per_kwh": {
          "name": "Maximum Charge Price",
          "description": "Discard candidate intervals above this price per kWh before scheduling. Uses the selected price unit."
        },
        "min_charge_duration_minutes": {
          "name": "Minimum Charge Duration",
          "description": "Merge short isolated intervals into longer charging blocks where possible. Useful for chargers that should avoid very short runs."
        },
        "max_cycles_per_day": {
          "name": "Maximum Charge Cycles Per Day",
          "description": "Limit how many separate charging segments may be used per day. The planner keeps the cheapest segments within this limit."
        }
      }
    }
  },
  "selector": {
    "account_choice": {
      "options": {
        "new_token": "Nieuw Tibber account API-token toevoegen"
      }
    },
    "day": {
      "options": {
        "yesterday": "Gisteren",
        "today": "Vandaag",
        "tomorrow": "Morgen",
        "rolling_window": "Schuivend Venster",
        "rolling_window_autozoom": "Schuivend Venster (Auto-Zoom)"
      }
    },
    "resolution": {
      "options": {
        "interval": "Interval (15 min)",
        "hourly": "Per Uur"
      }
    },
    "output_format": {
      "options": {
        "array_of_objects": "Array van Objecten",
        "array_of_arrays": "Array van Arrays"
      }
    },
    "level_type": {
      "options": {
        "rating_level": "Beoordelingsniveau (laag/normaal/hoog)",
        "level": "Tibber Niveau (zeer goedkoop tot zeer duur)"
      }
    },
    "level_filter": {
      "options": {
        "very_cheap": "Zeer goedkoop",
        "cheap": "Goedkoop",
        "normal": "Normaal",
        "expensive": "Duur",
        "very_expensive": "Zeer duur"
      }
    },
    "rating_level_filter": {
      "options": {
        "low": "Laag",
        "normal": "Normaal",
        "high": "Hoog"
      }
    },
    "insert_nulls": {
      "options": {
        "none": "Geen",
        "segments": "Segmenten",
        "all": "Alles"
      }
    },
    "period_filter": {
      "options": {
        "best_price": "Beste Prijs Periodes",
        "peak_price": "Piekprijs Periodes"
      }
    },
    "metadata": {
      "options": {
        "include": "Inbegrepen (data + metadata)",
        "only": "Alleen metadata",
        "none": "Geen (alleen data)"
      }
    },
    "volatility": {
      "options": {
        "low": "Laag",
        "moderate": "Gematigd",
        "high": "Hoog",
        "very_high": "Zeer hoog"
      }
    },
    "current_interval_price_level": {
      "options": {
        "any": "Alles",
        "very_cheap": "Zeer goedkoop",
        "cheap": "Goedkoop",
        "normal": "Normaal",
        "expensive": "Duur",
        "very_expensive": "Zeer duur"
      }
    },
    "currency_display_mode": {
      "options": {
        "base": "Basisvaluta (€, kr)",
        "subunit": "Subeenheid Valuta (ct, øre)"
      }
    },
    "average_sensor_display": {
      "options": {
        "median": "Mediaan",
        "mean": "Rekenkundig Gemiddelde"
      }
    },
    "search_scope": {
      "options": {
        "today": "Vandaag",
        "tomorrow": "Morgen",
        "remaining_today": "Rest van vandaag",
        "next_24h": "Komende 24 uur",
        "next_48h": "Komende 48 uur"
      }
    },
    "charging_deadline_event": {
      "options": {
        "midnight": "Midnight",
        "next_peak_period": "Next Peak Period",
        "next_best_period_end": "End of Next Best-Price Period"
      }
    }
  }
}
