mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
Complete terminology migration from confusing "major/minor" to clearer
"base/subunit" currency naming throughout entire codebase, translations,
documentation, tests, and services.
BREAKING CHANGES:
1. **Service API Parameters Renamed**:
- `get_chartdata`: `minor_currency` → `subunit_currency`
- `get_apexcharts_yaml`: Updated service_data references from
`minor_currency: true` to `subunit_currency: true`
- All automations/scripts using these parameters MUST be updated
2. **Configuration Option Key Changed**:
- Config entry option: Display mode setting now uses new terminology
- Internal key: `currency_display_mode` values remain "base"/"subunit"
- User-facing labels updated in all 5 languages (de, en, nb, nl, sv)
3. **Sensor Entity Key Renamed**:
- `current_interval_price_major` → `current_interval_price_base`
- Entity ID changes: `sensor.tibber_home_current_interval_price_major`
→ `sensor.tibber_home_current_interval_price_base`
- Energy Dashboard configurations MUST update entity references
4. **Function Signatures Changed**:
- `format_price_unit_major()` → `format_price_unit_base()`
- `format_price_unit_minor()` → `format_price_unit_subunit()`
- `get_price_value()`: Parameter `in_euro` deprecated in favor of
`config_entry` (backward compatible for now)
5. **Translation Keys Renamed**:
- All language files: Sensor translation key
`current_interval_price_major` → `current_interval_price_base`
- Service parameter descriptions updated in all languages
- Selector options updated: Display mode dropdown values
Changes by Category:
**Core Code (Python)**:
- const.py: Renamed all format_price_unit_*() functions, updated docstrings
- entity_utils/helpers.py: Updated get_price_value() with config-driven
conversion and backward-compatible in_euro parameter
- sensor/__init__.py: Added display mode filtering for base currency sensor
- sensor/core.py:
* Implemented suggested_display_precision property for dynamic decimal places
* Updated native_unit_of_measurement to use get_display_unit_string()
* Updated all price conversion calls to use config_entry parameter
- sensor/definitions.py: Renamed entity key and updated all
suggested_display_precision values (2 decimals for most sensors)
- sensor/calculators/*.py: Updated all price conversion calls (8 calculators)
- sensor/helpers.py: Updated aggregate_price_data() signature with config_entry
- sensor/attributes/future.py: Updated future price attributes conversion
**Services**:
- services/chartdata.py: Renamed parameter minor_currency → subunit_currency
throughout (53 occurrences), updated metadata calculation
- services/apexcharts.py: Updated service_data references in generated YAML
- services/formatters.py: Renamed parameter use_minor_currency →
use_subunit_currency in aggregate_hourly_exact() and get_period_data()
- sensor/chart_metadata.py: Updated default parameter name
**Translations (5 Languages)**:
- All /translations/*.json:
* Added new config step "display_settings" with comprehensive explanations
* Renamed current_interval_price_major → current_interval_price_base
* Updated service parameter descriptions (subunit_currency)
* Added selector.currency_display_mode.options with translated labels
- All /custom_translations/*.json:
* Renamed sensor description keys
* Updated chart_metadata usage_tips references
**Documentation**:
- docs/user/docs/actions.md: Updated parameter table and feature list
- docs/user/versioned_docs/version-v0.21.0/actions.md: Backported changes
**Tests**:
- Updated 7 test files with renamed parameters and conversion logic:
* test_connect_segments.py: Renamed minor/major to subunit/base
* test_period_data_format.py: Updated period price conversion tests
* test_avg_none_fallback.py: Fixed tuple unpacking for new return format
* test_best_price_e2e.py: Added config_entry parameter to all calls
* test_cache_validity.py: Fixed cache data structure (price_info key)
* test_coordinator_shutdown.py: Added repair_manager mock
* test_midnight_turnover.py: Added config_entry parameter
* test_peak_price_e2e.py: Added config_entry parameter, fixed price_avg → price_mean
* test_percentage_calculations.py: Added config_entry mock
**Coordinator/Period Calculation**:
- coordinator/periods.py: Added config_entry parameter to
calculate_periods_with_relaxation() calls (2 locations)
Migration Guide:
1. **Update Service Calls in Automations/Scripts**:
\`\`\`yaml
# Before:
service: tibber_prices.get_chartdata
data:
minor_currency: true
# After:
service: tibber_prices.get_chartdata
data:
subunit_currency: true
\`\`\`
2. **Update Energy Dashboard Configuration**:
- Settings → Dashboards → Energy
- Replace sensor entity:
`sensor.tibber_home_current_interval_price_major` →
`sensor.tibber_home_current_interval_price_base`
3. **Review Integration Configuration**:
- Settings → Devices & Services → Tibber Prices → Configure
- New "Currency Display Settings" step added
- Default mode depends on currency (EUR → subunit, Scandinavian → base)
Rationale:
The "major/minor" terminology was confusing and didn't clearly communicate:
- **Major** → Unclear if this means "primary" or "large value"
- **Minor** → Easily confused with "less important" rather than "smaller unit"
New terminology is precise and self-explanatory:
- **Base currency** → Standard ISO currency (€, kr, $, £)
- **Subunit currency** → Fractional unit (ct, øre, ¢, p)
This aligns with:
- International terminology (ISO 4217 standard)
- Banking/financial industry conventions
- User expectations from payment processing systems
Impact: Aligns currency terminology with international standards. Users must
update service calls, automations, and Energy Dashboard configuration after
upgrade.
Refs: User feedback session (December 2025) identified terminology confusion
1149 lines
66 KiB
JSON
1149 lines
66 KiB
JSON
{
|
||
"config": {
|
||
"step": {
|
||
"account_choice": {
|
||
"title": "Kies account",
|
||
"description": "Je kunt een ander huis van een bestaande 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 https://developer.tibber.com.",
|
||
"data": {
|
||
"access_token": "API-toegangstoken"
|
||
},
|
||
"submit": "Token valideren"
|
||
},
|
||
"user": {
|
||
"description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek https://developer.tibber.com.",
|
||
"data": {
|
||
"access_token": "API-toegangstoken"
|
||
},
|
||
"submit": "Token valideren"
|
||
},
|
||
"select_home": {
|
||
"description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.",
|
||
"data": {
|
||
"home_id": "Huis"
|
||
},
|
||
"title": "Kies een huis",
|
||
"submit": "Huis selecteren"
|
||
},
|
||
"finish": {
|
||
"description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.",
|
||
"data": {
|
||
"home_id": "Huis-ID"
|
||
},
|
||
"title": "Kies een huis",
|
||
"submit": "Huis selecteren"
|
||
},
|
||
"reauth_confirm": {
|
||
"title": "Tibber Prijs-integratie opnieuw authenticeren",
|
||
"description": "Het toegangstoken voor Tibber is niet langer geldig. Voer een nieuw API-toegangstoken in om deze integratie te blijven gebruiken.\n\nOm een nieuw API-toegangstoken te genereren, bezoek https://developer.tibber.com.",
|
||
"data": {
|
||
"access_token": "API-toegangstoken"
|
||
},
|
||
"submit": "Token bijwerken"
|
||
}
|
||
},
|
||
"error": {
|
||
"auth": "Het Tibber-toegangstoken is ongeldig.",
|
||
"connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.",
|
||
"unknown": "Onverwachte fout",
|
||
"cannot_connect": "Verbinding mislukt",
|
||
"invalid_access_token": "Ongeldig toegangstoken",
|
||
"missing_homes": "Het nieuwe toegangstoken heeft geen toegang tot alle geconfigureerde huizen. Gebruik een toegangstoken dat toegang heeft tot dezelfde Tibber-huizen.",
|
||
"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 voor dit huis is nog niet begonnen. De functionaliteit kan beperkt zijn totdat het contract actief wordt.",
|
||
"invalid_yaml_syntax": "Ongeldige YAML-syntaxis. Controleer inspringingen, dubbele punten en speciale tekens.",
|
||
"invalid_yaml_structure": "YAML moet een woordenboek/object zijn (sleutel: waarde-paren), geen lijst of platte tekst.",
|
||
"service_call_failed": "Service-aanroep validatie mislukt: {error_detail}",
|
||
"missing_entry_id": "Entry ID is vereist maar niet opgegeven.",
|
||
"invalid_entry_id": "Ongeldige entry ID of entry niet gevonden.",
|
||
"missing_home_id": "Huis-ID ontbreekt in de configuratie.",
|
||
"user_data_not_available": "Gebruikersgegevens niet beschikbaar. Vernieuw eerst de gebruikersgegevens.",
|
||
"price_fetch_failed": "Prijsgegevens ophalen mislukt. Controleer de logs voor details."
|
||
},
|
||
"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 deze dialoog.",
|
||
"reauth_successful": "Herauthenticatie geslaagd. De integratie is bijgewerkt met het nieuwe toegangstoken."
|
||
}
|
||
},
|
||
"common": {
|
||
"step_progress": "{step_num} / {total_steps}"
|
||
},
|
||
"config_subentries": {
|
||
"home": {
|
||
"entry_type": "Tijdreisweergave",
|
||
"initiate_flow": {
|
||
"user": "Tijdreisweergave maken"
|
||
},
|
||
"title": "Tijdreisweergave maken",
|
||
"step": {
|
||
"user": {
|
||
"title": "Configuratie-item selecteren",
|
||
"description": "Selecteer het configuratie-item waarvoor je een tijdreisweergave wilt maken.\n\n**Tijdreisweergaves** stellen je in staat om historische prijsgegevens te zien alsof het de huidige tijd is. Dit is handig voor het testen van automatiseringen of het analyseren van eerdere prijspatronen.",
|
||
"data": {
|
||
"parent_entry_id": "Configuratie-item"
|
||
}
|
||
},
|
||
"time_offset": {
|
||
"title": "Tijdverschuiving configureren",
|
||
"description": "Configureer hoe ver terug in de tijd deze weergave moet reizen.\n\n**Aanbevolen:** Gebruik **≥2 dagen** verschuiving om conflicten met \"yesterday\"-entiteiten te vermijden die ook historische gegevens bieden.\n\n**Voorbeelden:**\n• **-7 dagen**: Toon prijzen van 7 dagen geleden\n• **-2 dagen, 3 uur**: Toon prijzen van 2 dagen en 3 uur geleden\n• **-14 dagen**: Toon 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. Schuifregelaar bereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"yesterday\"-entiteiten te vermijden.",
|
||
"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. Schuifregelaar bereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"yesterday\"-entiteiten te vermijden.",
|
||
"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": "Ten minste één tijdverschuivingswaarde moet negatief zijn (alleen historische gegevens)."
|
||
},
|
||
"abort": {
|
||
"already_configured": "**Een tijdreis-weergave met deze exacte 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": {
|
||
"title": "⚙️ Algemene instellingen",
|
||
"description": "_{step_progress}_\n\n**Configureer algemene instellingen voor Tibber-prijsinformatie en -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 wordt weergegeven in de sensorstatus voor gemiddelde prijssensoren. De andere waarde wordt weergegeven als attribuut. Mediaan is resistenter tegen extreme waarden, terwijl het rekenkundig gemiddelde het traditionele gemiddelde vertegenwoordigt. Standaard: Mediaan"
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"display_settings": {
|
||
"title": "💱 Valuta-weergave-instellingen",
|
||
"description": "_{step_progress}_\n\n**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): Decimaalwaarden (bijv. 0,25 €/kWh) - verschillen zichtbaar vanaf 3e-4e decimaal\n• **Subeenheid** (ct/kWh, øre/kWh): Grotere waarden (bijv. 25,00 ct/kWh) - verschillen al zichtbaar vanaf 1e decimaal\n\nStandaard hangt af van jouw valuta:\n• EUR → Subeenheid (cent) - Duitse/Nederlandse voorkeur\n• NOK/SEK/DKK → Basisvaluta (kronen) - Scandinavische voorkeur\n• USD/GBP → Basisvaluta\n\n**💡 Tip:** Bij keuze van subeenheid kun je de extra sensor \"Huidige elektriciteitsprijs (Energie-dashboard)\" activeren (standaard uitgeschakeld)."
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"current_interval_price_rating": {
|
||
"title": "📊 Prijsbeoordelingsdrempels",
|
||
"description": "_{step_progress}_\n\n**Configureer drempels voor prijsbeoordelingsniveaus (laag/normaal/hoog) op basis van vergelijking met het lopende 24-uurs gemiddelde.**\n\n---",
|
||
"sections": {
|
||
"price_rating_thresholds": {
|
||
"name": "Prijsbeoordelingsdrempels",
|
||
"description": "Definieer prijsbeoordelingsniveaus.",
|
||
"data": {
|
||
"price_rating_threshold_low": "Lage drempel",
|
||
"price_rating_threshold_high": "Hoge drempel"
|
||
},
|
||
"data_description": {
|
||
"price_rating_threshold_low": "Percentage onder het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'laag' te kwalificeren. Voorbeeld: 5 betekent minstens 5% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdsvensters aan. Standaard: 5%",
|
||
"price_rating_threshold_high": "Percentage boven het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'hoog' te kwalificeren. Voorbeeld: 10 betekent minstens 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdsvensters. Standaard: 10%"
|
||
}
|
||
}
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"best_price": {
|
||
"title": "💚 Beste Prijs Periode Instellingen",
|
||
"description": "_{step_progress}_\n\nConfigureer instellingen voor de **Beste Prijs Periode** binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.\n\n---",
|
||
"sections": {
|
||
"period_settings": {
|
||
"name": "Periode-instellingen",
|
||
"description": "Configureer periodelengte en prijsniveaubeperkingen.",
|
||
"data": {
|
||
"best_price_min_period_length": "Minimale periodelengte",
|
||
"best_price_max_level": "Prijsniveaufilter",
|
||
"best_price_max_level_gap_count": "Gaptolerantie"
|
||
},
|
||
"data_description": {
|
||
"best_price_min_period_length": "Minimale duur voordat een periode als 'beste prijs' wordt 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: selecteren van '**Goedkoop**' betekent dat de periode minstens één '**Zeer goedkoop**' of '**Goedkoop**' interval moet hebben. Dit zorgt ervoor dat 'beste prijs'-periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer '**Alle**' om beste prijzen te tonen ongeacht hun absolute prijsniveau.",
|
||
"best_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met '**Goedkoop**' filter en gaptelling 1 wordt de reeks '**Goedkoop**, **Goedkoop**, **Normaal**, **Goedkoop**' geaccepteerd (**Normaal** is één stap boven **Goedkoop**). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. **Let op:** Gaptolerantie vereist periodes ≥90 minuten (6 intervallen) om afwijkingen effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)."
|
||
}
|
||
},
|
||
"flexibility_settings": {
|
||
"name": "Flexibiliteitsinstellingen",
|
||
"description": "Configureer prijsvergelijkingsdrempels en filtering.",
|
||
"data": {
|
||
"best_price_flex": "Flexibiliteit",
|
||
"best_price_min_distance_from_avg": "Minimale afstand"
|
||
},
|
||
"data_description": {
|
||
"best_price_flex": "Maximaal boven de dagelijkse minimumprijs waarbij intervallen nog kwalificeren als 'beste prijs'. Aanbevolen: 15-20 met versoepeling geactiveerd (standaard), of 25-35 zonder versoepeling. Maximum: 50 (harde limiet voor betrouwbare periodedetectie).",
|
||
"best_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant goedkoper zijn dan het daggemiddelde, niet slechts marginaal eronder. Dit filtert ruis en voorkomt dat licht-onder-gemiddelde periodes op dagen met vlakke prijzen als 'beste prijs' worden gemarkeerd. Hogere waarden = striktere filtering (alleen echt goedkope periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% onder het daggemiddelde moeten liggen."
|
||
}
|
||
},
|
||
"relaxation_and_target_periods": {
|
||
"name": "Versoepeling & Doelperiodes",
|
||
"description": "Configureer automatische filterversoepeling en doelperiodetellingen. Activeer 'Minimum aantal bereiken' om versoepeling te activeren.",
|
||
"data": {
|
||
"enable_min_periods_best": "Minimum aantal bereiken",
|
||
"min_periods_best": "Minimum periodes",
|
||
"relaxation_attempts_best": "Versoepeling pogingen"
|
||
},
|
||
"data_description": {
|
||
"enable_min_periods_best": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken, wat minder optimale tijdvensters kan omvatten als beste-prijs periodes.",
|
||
"min_periods_best": "Minimum aantal beste prijs periodes om per dag na te streven. Filters worden stap voor stap versoepeld om deze telling te bereiken. Alleen actief wanneer 'Minimum aantal bereiken' is ingeschakeld. Standaard: 1",
|
||
"relaxation_attempts_best": "Hoeveel flexniveaus (pogingen) te proberen voordat wordt opgegeven. Elke poging voert alle filtercombinaties uit op het nieuwe flexniveau. Meer pogingen vergroten de kans op het vinden van extra periodes ten koste van langere verwerkingstijd."
|
||
}
|
||
}
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"peak_price": {
|
||
"title": "🔴 Piekprijs Periode Instellingen",
|
||
"description": "_{step_progress}_\n\nConfigureer instellingen voor de **Piekprijs Periode** binaire sensor. Deze sensor is actief tijdens periodes met de hoogste elektriciteitsprijzen.\n\n---",
|
||
"sections": {
|
||
"period_settings": {
|
||
"name": "Periode-instellingen",
|
||
"description": "Configureer periodelengte en prijsniveaubeperkingen.",
|
||
"data": {
|
||
"peak_price_min_period_length": "Minimale periodelengte",
|
||
"peak_price_min_level": "Prijsniveaufilter",
|
||
"peak_price_max_level_gap_count": "Gaptolerantie"
|
||
},
|
||
"data_description": {
|
||
"peak_price_min_period_length": "Minimale duur voordat een periode als 'piekprijs' wordt beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (minimaal 30 minuten versus 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: selecteren van '**Duur**' betekent dat de periode minstens één '**Duur**' of '**Zeer duur**' interval moet hebben. Dit zorgt ervoor dat 'piekprijs'-periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer '**Alle**' om piekprijzen te tonen ongeacht hun absolute prijsniveau.",
|
||
"peak_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met '**Duur**' filter en gaptelling 1 wordt de reeks '**Duur**, **Duur**, **Normaal**, **Duur**' geaccepteerd (**Normaal** is één stap onder **Duur**). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. **Let op:** Gaptolerantie vereist periodes ≥90 minuten (6 intervallen) om afwijkingen effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)."
|
||
}
|
||
},
|
||
"flexibility_settings": {
|
||
"name": "Flexibiliteitsinstellingen",
|
||
"description": "Configureer prijsvergelijkingscriteria en filtering.",
|
||
"data": {
|
||
"peak_price_flex": "Flexibiliteit",
|
||
"peak_price_min_distance_from_avg": "Minimale afstand"
|
||
},
|
||
"data_description": {
|
||
"peak_price_flex": "Maximaal onder de dagelijkse maximumprijs waarbij intervallen nog kwalificeren als 'piekprijs'. Aanbeveling: -15 tot -20 met versoepeling geactiveerd (standaard), of -25 tot -35 zonder versoepeling. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven de afstand onder het maximum aan.",
|
||
"peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het daggemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt dat licht-boven-gemiddelde periodes op dagen met vlakke prijzen als 'piekprijs' worden gemarkeerd. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het daggemiddelde moeten liggen."
|
||
}
|
||
},
|
||
"relaxation_and_target_periods": {
|
||
"name": "Ontspanning en doelperiodes",
|
||
"description": "Configureer automatische filterontspanning en doelperiode-aantallen. Schakel 'Probeer minimum aantal periodes te bereiken' in om ontspanning te activeren.",
|
||
"data": {
|
||
"enable_min_periods_peak": "Probeer minimum aantal periodes te bereiken",
|
||
"min_periods_peak": "Minimum aantal periodes",
|
||
"relaxation_attempts_peak": "Aantal ontspanningspogingen"
|
||
},
|
||
"data_description": {
|
||
"enable_min_periods_peak": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je wordt gewaarschuwd voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.",
|
||
"min_periods_peak": "Minimum aantal piekprijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1",
|
||
"relaxation_attempts_peak": "Hoeveel keer de ontspanningslogica filters opnieuw mag proberen. Gebruik meer pogingen wanneer de piekperiodes moeilijk te vinden zijn door vlakke of zeer grillige dagen. Elke extra poging kost wat extra verwerkingstijd maar vergroot de kans dat periodes worden gevonden."
|
||
}
|
||
}
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"price_trend": {
|
||
"title": "📈 Prijstrenddrempels",
|
||
"description": "_{step_progress}_\n\n**Configureer drempels voor prijstrendsensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen stijgen, dalen of stabiel zijn.**\n\n---",
|
||
"sections": {
|
||
"price_trend_thresholds": {
|
||
"name": "Prijstrenddrempels",
|
||
"description": "Definieer prijstrendniveaus.",
|
||
"data": {
|
||
"price_trend_threshold_rising": "Stijgende drempel",
|
||
"price_trend_threshold_falling": "Dalende drempel"
|
||
},
|
||
"data_description": {
|
||
"price_trend_threshold_rising": "Percentage voor gemiddelde prijsstijging per uur die de trend kwalificeert als 'stijgend'. Voorbeeld: 5 betekent minstens 5% stijging per uur. Sensoren met deze trend geven aan dat prijzen snel zullen stijgen. Standaard: 5%",
|
||
"price_trend_threshold_falling": "Percentage voor gemiddelde prijsdaling per uur die de trend kwalificeert als 'dalend'. Voorbeeld: -5 betekent minstens 5% daling per uur. Sensoren met deze trend geven aan dat prijzen snel zullen dalen. Standaard: -5%"
|
||
}
|
||
}
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"volatility": {
|
||
"title": "💨 Volatiliteit Drempels",
|
||
"description": "_{step_progress}_\n\n**Configureer drempels voor volatiliteitsclassificatie. Volatiliteit meet relatieve prijsvariatie met behulp van de variatiecoëfficiënt (VC = standaarddeviatie / gemiddelde × 100%). Deze drempels zijn percentagewaarden die werken over alle prijsniveaus.**\n\nGebruikt door:\n• Volatiliteitssensoren (classificatie)\n• Trendsensoren (adaptieve drempelaanpassing: <matig = gevoeliger, ≥hoog = minder gevoelig)\n\n---",
|
||
"sections": {
|
||
"volatility_thresholds": {
|
||
"name": "Volatiliteitdrempels",
|
||
"description": "Definieer volatiliteitsclassificatieniveaus.",
|
||
"data": {
|
||
"volatility_threshold_moderate": "Matige drempel",
|
||
"volatility_threshold_high": "Hoge drempel",
|
||
"volatility_threshold_very_high": "Zeer hoge drempel"
|
||
},
|
||
"data_description": {
|
||
"volatility_threshold_moderate": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'matig' te classificeren. Voorbeeld: 10 betekent standaardafwijking ≥ 10% van gemiddelde. Dit wijst op verhoogde prijsinstabiliteit. Standaard: 10%",
|
||
"volatility_threshold_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'hoog' te classificeren. Voorbeeld: 20 betekent standaardafwijking ≥ 20% van gemiddelde. Dit wijst op aanzienlijke prijsschommelingen. Standaard: 20%",
|
||
"volatility_threshold_very_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'zeer hoog' te classificeren. Voorbeeld: 30 betekent standaardafwijking ≥ 30% van gemiddelde. Dit wijst op extreme prijsinstabiliteit. Standaard: 30%"
|
||
}
|
||
}
|
||
},
|
||
"submit": "Doorgaan →"
|
||
},
|
||
"chart_data_export": {
|
||
"title": "📊 Grafiek-data-export Sensor",
|
||
"description": "_{step_progress}_\n\nDe Grafiek-data-export sensor biedt prijsgegevens als sensorattributen.\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** - deze is flexibeler, efficiënter en de moderne Home Assistant-aanpak.\n\n**Wanneer deze sensor zinvol is:**\n\n✅ Je dashboardtool kan **alleen** attributen lezen (geen service-aanroepen)\n✅ Je hebt statische data nodig die automatisch bijwerkt\n❌ **Niet voor automatiseringen:** Gebruik `tibber_prices.get_chartdata` daar direct - flexibeler en efficiënter!\n\n---\n\n**Activeer de sensor:**\n\n1. Open **Instellingen → Apparaten en diensten → Tibber Prices**\n2. Selecteer je thuis → Vind **'Grafiekgegevensexport'** (Diagnostiek-sectie)\n3. **Activeer de sensor** (standaard uitgeschakeld)\n\n**Configuratie (optioneel):**\n\nStandaardinstellingen werken direct (vandaag+morgen, 15-minuten intervallen, alleen prijzen).\n\nVoor aanpassing, voeg toe aan **`configuration.yaml`**:\n\n```yaml\ntibber_prices:\n chart_export:\n day:\n - today\n - tomorrow\n include_level: true\n include_rating_level: true\n```\n\n**Alle parameters:** Zie `tibber_prices.get_chartdata` servicedocumentatie",
|
||
"submit": "Voltooien ✓"
|
||
}
|
||
},
|
||
"error": {
|
||
"auth": "Het Tibber-toegangstoken is ongeldig.",
|
||
"connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.",
|
||
"unknown": "Er is een onverwachte fout opgetreden. Controleer de logboeken voor details.",
|
||
"cannot_connect": "Verbinding mislukt",
|
||
"invalid_access_token": "Ongeldig toegangstoken",
|
||
"different_home": "Het toegangstoken is niet geldig voor de huis-ID waarvoor deze integratie is geconfigureerd.",
|
||
"invalid_flex": "Flexibiliteitspercentage moet tussen -50% en +50% liggen",
|
||
"invalid_best_price_distance": "Afstandspercentage moet tussen -50% en 0% liggen (negatief = onder gemiddelde)",
|
||
"invalid_peak_price_distance": "Afstandspercentage moet tussen 0% en 50% liggen (positief = boven gemiddelde)",
|
||
"invalid_min_periods": "Minimum aantal perioden moet tussen 1 en 10 liggen",
|
||
"invalid_period_length": "De periodelengte moet minimaal 15 minuten zijn (veelvouden van 15).",
|
||
"invalid_gap_count": "Gaptolerantie moet tussen 0 en 8 liggen",
|
||
"invalid_relaxation_attempts": "Versoepelingspogingen moeten tussen 1 en 12 liggen",
|
||
"invalid_price_rating_low": "Lage prijsbeoordelingsdrempel moet tussen -50% en -5% liggen",
|
||
"invalid_price_rating_high": "Hoge prijsbeoordelingsdrempel moet tussen 5% en 50% liggen",
|
||
"invalid_price_rating_thresholds": "Lage drempel moet lager zijn dan hoge drempel",
|
||
"invalid_volatility_threshold_moderate": "Gematigde volatiliteitsdrempel moet tussen 5% en 25% liggen",
|
||
"invalid_volatility_threshold_high": "Hoge volatiliteitsdrempel moet tussen 20% en 40% liggen",
|
||
"invalid_volatility_threshold_very_high": "Zeer hoge volatiliteitsdrempel moet tussen 35% en 80% liggen",
|
||
"invalid_volatility_thresholds": "Drempels moeten in oplopende volgorde zijn: gematigd < hoog < zeer hoog",
|
||
"invalid_price_trend_rising": "Stijgende trenddrempel moet tussen 1% en 50% liggen",
|
||
"invalid_price_trend_falling": "Dalende trenddrempel moet tussen -50% en -1% liggen"
|
||
},
|
||
"abort": {
|
||
"entry_not_found": "Tibber-configuratie-item niet gevonden."
|
||
}
|
||
},
|
||
"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 uurprijsniveau",
|
||
"state": {
|
||
"very_cheap": "Zeer goedkoop",
|
||
"cheap": "Goedkoop",
|
||
"normal": "Normaal",
|
||
"expensive": "Duur",
|
||
"very_expensive": "Zeer duur"
|
||
}
|
||
},
|
||
"next_hour_price_level": {
|
||
"name": "Volgend uurprijsniveau",
|
||
"state": {
|
||
"very_cheap": "Zeer goedkoop",
|
||
"cheap": "Goedkoop",
|
||
"normal": "Normaal",
|
||
"expensive": "Duur",
|
||
"very_expensive": "Zeer duur"
|
||
}
|
||
},
|
||
"lowest_price_today": {
|
||
"name": "Laagste prijs vandaag"
|
||
},
|
||
"highest_price_today": {
|
||
"name": "Hoogste prijs vandaag"
|
||
},
|
||
"average_price_today": {
|
||
"name": "⌀ 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": "Prijsniveau gisteren",
|
||
"state": {
|
||
"very_cheap": "Zeer goedkoop",
|
||
"cheap": "Goedkoop",
|
||
"normal": "Normaal",
|
||
"expensive": "Duur",
|
||
"very_expensive": "Zeer duur"
|
||
}
|
||
},
|
||
"today_price_level": {
|
||
"name": "Prijsniveau vandaag",
|
||
"state": {
|
||
"very_cheap": "Zeer goedkoop",
|
||
"cheap": "Goedkoop",
|
||
"normal": "Normaal",
|
||
"expensive": "Duur",
|
||
"very_expensive": "Zeer duur"
|
||
}
|
||
},
|
||
"tomorrow_price_level": {
|
||
"name": "Prijsniveau morgen",
|
||
"state": {
|
||
"very_cheap": "Zeer goedkoop",
|
||
"cheap": "Goedkoop",
|
||
"normal": "Normaal",
|
||
"expensive": "Duur",
|
||
"very_expensive": "Zeer duur"
|
||
}
|
||
},
|
||
"yesterday_price_rating": {
|
||
"name": "Prijsbeoordeling gisteren",
|
||
"state": {
|
||
"low": "Laag",
|
||
"normal": "Normaal",
|
||
"high": "Hoog"
|
||
}
|
||
},
|
||
"today_price_rating": {
|
||
"name": "Prijsbeoordeling vandaag",
|
||
"state": {
|
||
"low": "Laag",
|
||
"normal": "Normaal",
|
||
"high": "Hoog"
|
||
}
|
||
},
|
||
"tomorrow_price_rating": {
|
||
"name": "Prijsbeoordeling morgen",
|
||
"state": {
|
||
"low": "Laag",
|
||
"normal": "Normaal",
|
||
"high": "Hoog"
|
||
}
|
||
},
|
||
"trailing_price_average": {
|
||
"name": "⌀ Prijs voortschrijdend 24u"
|
||
},
|
||
"leading_price_average": {
|
||
"name": "⌀ Prijs vooruitlopend 24u"
|
||
},
|
||
"trailing_price_min": {
|
||
"name": "24u-minimumprijs voortschrijdend"
|
||
},
|
||
"trailing_price_max": {
|
||
"name": "24u-maximumprijs voortschrijdend"
|
||
},
|
||
"leading_price_min": {
|
||
"name": "24u-minimumprijs vooruitlopend"
|
||
},
|
||
"leading_price_max": {
|
||
"name": "24u-maximumprijs vooruitlopend"
|
||
},
|
||
"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 uurprijsbeoordeling",
|
||
"state": {
|
||
"low": "Laag",
|
||
"normal": "Normaal",
|
||
"high": "Hoog"
|
||
}
|
||
},
|
||
"next_hour_price_rating": {
|
||
"name": "Volgend uurprijsbeoordeling",
|
||
"state": {
|
||
"low": "Laag",
|
||
"normal": "Normaal",
|
||
"high": "Hoog"
|
||
}
|
||
},
|
||
"next_avg_1h": {
|
||
"name": "⌀ Prijs volgende 1u"
|
||
},
|
||
"next_avg_2h": {
|
||
"name": "⌀ Prijs volgende 2u"
|
||
},
|
||
"next_avg_3h": {
|
||
"name": "⌀ Prijs volgende 3u"
|
||
},
|
||
"next_avg_4h": {
|
||
"name": "⌀ Prijs volgende 4u"
|
||
},
|
||
"next_avg_5h": {
|
||
"name": "⌀ Prijs volgende 5u"
|
||
},
|
||
"next_avg_6h": {
|
||
"name": "⌀ Prijs volgende 6u"
|
||
},
|
||
"next_avg_8h": {
|
||
"name": "⌀ Prijs volgende 8u"
|
||
},
|
||
"next_avg_12h": {
|
||
"name": "⌀ Prijs volgende 12u"
|
||
},
|
||
"price_trend_1h": {
|
||
"name": "Prijstrend (1u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_2h": {
|
||
"name": "Prijstrend (2u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_3h": {
|
||
"name": "Prijstrend (3u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_4h": {
|
||
"name": "Prijstrend (4u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_5h": {
|
||
"name": "Prijstrend (5u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_6h": {
|
||
"name": "Prijstrend (6u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_8h": {
|
||
"name": "Prijstrend (8u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"price_trend_12h": {
|
||
"name": "Prijstrend (12u)",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"current_price_trend": {
|
||
"name": "Huidige prijstrend",
|
||
"state": {
|
||
"rising": "Stijgend",
|
||
"falling": "Dalend",
|
||
"stable": "Stabiel"
|
||
}
|
||
},
|
||
"next_price_trend_change": {
|
||
"name": "Volgende trendwijziging"
|
||
},
|
||
"daily_rating": {
|
||
"name": "Dagelijkse prijsbeoordeling"
|
||
},
|
||
"monthly_rating": {
|
||
"name": "Maandelijkse prijsbeoordeling"
|
||
},
|
||
"today_volatility": {
|
||
"name": "Volatiliteit vandaag",
|
||
"state": {
|
||
"low": "Laag",
|
||
"moderate": "Gematigd",
|
||
"high": "Hoog",
|
||
"very_high": "Zeer Hoog"
|
||
}
|
||
},
|
||
"tomorrow_volatility": {
|
||
"name": "Volatiliteit morgen",
|
||
"state": {
|
||
"low": "Laag",
|
||
"moderate": "Gematigd",
|
||
"high": "Hoog",
|
||
"very_high": "Zeer Hoog"
|
||
}
|
||
},
|
||
"next_24h_volatility": {
|
||
"name": "Volatiliteit volgende 24u",
|
||
"state": {
|
||
"low": "Laag",
|
||
"moderate": "Gematigd",
|
||
"high": "Hoog",
|
||
"very_high": "Zeer Hoog"
|
||
}
|
||
},
|
||
"today_tomorrow_volatility": {
|
||
"name": "Volatiliteit vandaag+morgen",
|
||
"state": {
|
||
"low": "Laag",
|
||
"moderate": "Gematigd",
|
||
"high": "Hoog",
|
||
"very_high": "Zeer Hoog"
|
||
}
|
||
},
|
||
"best_price_end_time": {
|
||
"name": "Beste prijs eindigt"
|
||
},
|
||
"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 eindigt"
|
||
},
|
||
"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": "Woningtype",
|
||
"state": {
|
||
"apartment": "Appartement",
|
||
"rowhouse": "Rijtjeshuis",
|
||
"house": "Huis",
|
||
"cottage": "Vakantiehuis"
|
||
}
|
||
},
|
||
"home_size": {
|
||
"name": "Woonoppervlakte"
|
||
},
|
||
"main_fuse_size": {
|
||
"name": "Hoofdzekering"
|
||
},
|
||
"number_of_residents": {
|
||
"name": "Aantal bewoners"
|
||
},
|
||
"primary_heating_source": {
|
||
"name": "Primaire warmtebron",
|
||
"state": {
|
||
"air2air_heatpump": "Lucht-lucht-warmtepomp",
|
||
"air2water_heatpump": "Lucht-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": "Bodemwarmtepomp",
|
||
"ground": "Bodemwarmtepomp",
|
||
"oil": "Olie",
|
||
"other": "Anders",
|
||
"waste": "Restwarmte"
|
||
}
|
||
},
|
||
"grid_company": {
|
||
"name": "Netbeheerder"
|
||
},
|
||
"grid_area_code": {
|
||
"name": "Netgebiedcode"
|
||
},
|
||
"price_area_code": {
|
||
"name": "Prijszonecode"
|
||
},
|
||
"consumption_ean": {
|
||
"name": "Verbruiks-EAN"
|
||
},
|
||
"production_ean": {
|
||
"name": "Productie-EAN"
|
||
},
|
||
"energy_tax_type": {
|
||
"name": "Energiebelastingtype"
|
||
},
|
||
"vat_type": {
|
||
"name": "BTW-type"
|
||
},
|
||
"estimated_annual_consumption": {
|
||
"name": "Geschat jaarverbruik"
|
||
},
|
||
"subscription_status": {
|
||
"name": "Abonnementsstatus",
|
||
"state": {
|
||
"running": "Actief",
|
||
"ended": "Beëindigd",
|
||
"pending": "In afwachting",
|
||
"unknown": "Onbekend"
|
||
}
|
||
},
|
||
"chart_data_export": {
|
||
"name": "Grafiek Data Export",
|
||
"state": {
|
||
"pending": "In afwachting",
|
||
"ready": "Klaar",
|
||
"error": "Fout"
|
||
}
|
||
},
|
||
"chart_metadata": {
|
||
"name": "Grafiekmetadata",
|
||
"state": {
|
||
"pending": "In afwachting",
|
||
"ready": "Klaar",
|
||
"error": "Fout"
|
||
}
|
||
},
|
||
"data_lifecycle_status": {
|
||
"name": "Datalevenscyclus-status",
|
||
"state": {
|
||
"cached": "In cache",
|
||
"fresh": "Vers",
|
||
"refreshing": "Vernieuwen",
|
||
"searching_tomorrow": "Zoekt morgengegevens",
|
||
"turnover_pending": "Middernachtwissel in behandeling",
|
||
"error": "Fout"
|
||
}
|
||
}
|
||
},
|
||
"binary_sensor": {
|
||
"peak_price_period": {
|
||
"name": "Piekprijs-periode"
|
||
},
|
||
"best_price_period": {
|
||
"name": "Beste prijs-periode"
|
||
},
|
||
"connection": {
|
||
"name": "Tibber API-verbinding"
|
||
},
|
||
"tomorrow_data_available": {
|
||
"name": "Gegevens van morgen beschikbaar"
|
||
},
|
||
"has_ventilation_system": {
|
||
"name": "Heeft ventilatiesysteem"
|
||
},
|
||
"realtime_consumption_enabled": {
|
||
"name": "Realtime verbruik ingeschakeld"
|
||
}
|
||
}
|
||
},
|
||
"issues": {
|
||
"new_homes_available": {
|
||
"title": "Nieuwe Tibber-huizen gedetecteerd",
|
||
"description": "We hebben {count} nieuw(e) huis/huizen op je Tibber-account gedetecteerd: {homes}. Je kunt ze toevoegen aan Home Assistant via de Tibber-integratieconfiguratie."
|
||
},
|
||
"homes_removed": {
|
||
"title": "Tibber-huizen verwijderd",
|
||
"description": "We hebben gedetecteerd dat {count} huis/huizen zijn verwijderd van je Tibber-account: {homes}. Controleer je Tibber-integratieconfiguratie."
|
||
},
|
||
"tomorrow_data_missing": {
|
||
"title": "Prijsgegevens voor morgen ontbreken voor {home_name}",
|
||
"description": "De elektriciteitsprijsgegevens voor morgen zijn nog steeds niet beschikbaar na {warning_hour}:00 uur. Dit is ongebruikelijk, aangezien Tibber doorgaans de prijzen voor morgen in de middag publiceert (rond 13:00-14:00 CET).\n\nMogelijke oorzaken:\n- Tibber heeft de prijzen voor morgen nog niet gepubliceerd\n- Tijdelijke API-problemen\n- Je elektriciteitsleverancier heeft nog geen prijzen aan Tibber ingediend\n\nDit probleem wordt automatisch opgelost zodra de gegevens voor morgen beschikbaar zijn. Als dit na 20:00 uur aanhoudt, controleer dan de Tibber-app of neem contact op met Tibber-ondersteuning."
|
||
},
|
||
"rate_limit_exceeded": {
|
||
"title": "API-snelheidslimiet overschreden voor {home_name}",
|
||
"description": "De Tibber-API heeft deze integratie beperkt na {error_count} opeenvolgende fouten. Dit betekent dat verzoeken te vaak worden gedaan.\n\nDe integratie zal automatisch opnieuw proberen met toenemende vertragingen. Dit probleem wordt opgelost zodra de snelheidslimiet verloopt.\n\nAls dit meerdere uren aanhoudt, overweeg dan:\n- Controleren of meerdere Home Assistant-instanties hetzelfde API-token gebruiken\n- Verifiëren dat geen andere applicaties je Tibber-API-token intensief gebruiken\n- De updatefrequentie verminderen 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 deze integratie-entry en voeg deze opnieuw toe als het huis nog steeds moet worden gemonitord. Om deze entry te verwijderen, ga naar Instellingen → Apparaten & Diensten → Tibber Prices en verwijder de {home_name}-configuratie."
|
||
}
|
||
},
|
||
"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."
|
||
}
|
||
}
|
||
},
|
||
"get_chartdata": {
|
||
"name": "Haal grafiekgegevens op",
|
||
"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."
|
||
},
|
||
"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."
|
||
},
|
||
"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."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"selector": {
|
||
"account_choice": {
|
||
"options": {
|
||
"new_token": "Nieuw Tibber-account toevoegen met API-token"
|
||
}
|
||
},
|
||
"day": {
|
||
"options": {
|
||
"yesterday": "Gisteren",
|
||
"today": "Vandaag",
|
||
"tomorrow": "Morgen",
|
||
"rolling_window": "Rollend venster",
|
||
"rolling_window_autozoom": "Rollend 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": "Alle"
|
||
}
|
||
},
|
||
"period_filter": {
|
||
"options": {
|
||
"best_price": "Beste prijsperioden",
|
||
"peak_price": "Piek prijsperioden"
|
||
}
|
||
},
|
||
"metadata": {
|
||
"options": {
|
||
"include": "Opnemen (data + metadata)",
|
||
"only": "Alleen metadata",
|
||
"none": "Geen (alleen data)"
|
||
}
|
||
},
|
||
"volatility": {
|
||
"options": {
|
||
"low": "Laag",
|
||
"moderate": "Matig",
|
||
"high": "Hoog",
|
||
"very_high": "Zeer hoog"
|
||
}
|
||
},
|
||
"current_interval_price_level": {
|
||
"options": {
|
||
"any": "Alle",
|
||
"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"
|
||
}
|
||
}
|
||
},
|
||
"title": "Tibber Prijsinformatie & Beoordelingen"
|
||
}
|