hass.tibber_prices/custom_components/tibber_prices/translations/nb.json
Julian Pawlowski 22165d038d feat(sensors): add timestamp attributes and enhance icon system
Added timestamp attributes to all sensors and enhanced the dynamic icon
system for comprehensive price sensor coverage with rolling hour support.

TIMESTAMP ATTRIBUTES:

Core Changes:
- sensor/attributes.py:
  * Enhanced add_average_price_attributes() to track extreme intervals
    for min/max sensors and add appropriate timestamps
  * Added _update_extreme_interval() helper to reduce complexity
  * Extended add_volatility_type_attributes() with timestamp logic for
    all 4 volatility types (today/tomorrow/today_tomorrow/next_24h)
  * Fixed current_interval_price timestamp assignment (use interval_data)

Timestamp Logic:
- Interval-based sensors: Use startsAt of specific 15-minute interval
- Min/Max sensors: Use startsAt of interval with extreme price
- Average sensors: Use startsAt of first interval in window
- Volatility sensors: Use midnight (00:00) for calendar day sensors,
  current time for rolling 24h window
- Daily sensors: Already used fallback to midnight (verified)

ICON SYSTEM ENHANCEMENTS:

Major Extensions:
- entity_utils/icons.py:
  * Created get_rolling_hour_price_level_for_icon() implementing
    5-interval window aggregation matching sensor calculation logic
  * Extended get_price_sensor_icon() coverage from 1 to 4 sensors:
    - current_interval_price (existing)
    - next_interval_price (NEW - dynamic instead of static)
    - current_hour_average_price (NEW - uses rolling hour aggregation)
    - next_hour_average_price (NEW - uses rolling hour aggregation)
  * Added imports for aggregate_level_data and find_rolling_hour_center_index

Documentation:
- sensor/definitions.py:
  * Updated 30+ sensor descriptions with detailed icon behavior comments
  * Changed next_interval_price from static to dynamic icon
  * Documented dynamic vs static icons for all sensor types
  * Added clear icon mapping source documentation

SENSOR KEY RENAMING:

Renamed for clarity (current_hour_average → current_hour_average_price):
- sensor/core.py: Updated value getters and cached data lookup
- sensor/definitions.py: Updated entity descriptions
- sensor/attributes.py: Updated key references in attribute builders
- coordinator.py: Updated TIME_SENSITIVE_ENTITY_KEYS set
- const.py: Updated comment documentation

Translation Updates:
- custom_translations/*.json (5 files): Updated sensor keys
- translations/*.json (5 files): Updated sensor keys

Impact:
- All sensors now have timestamp attribute showing applicable time/interval
- Icon system provides richer visual feedback for more sensor types
- Consistent sensor naming improves code readability
- Users get temporal context for all sensor values
- Dynamic icons adapt to price conditions across more sensors
2025-11-15 15:31:43 +00:00

572 lines
26 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"config": {
"step": {
"user": {
"description": "Sett opp Tibber Prisinformasjon & Vurderinger.\n\nFor å generere et API-tilgangstoken, besøk https://developer.tibber.com.",
"data": {
"access_token": "API-tilgangstoken"
},
"submit": "Valider token"
},
"select_home": {
"description": "Velg et hjem for å hente prisinformasjon og vurderinger.",
"data": {
"home_id": "Hjem"
},
"title": "Velg et hjem",
"submit": "Velg hjem"
},
"finish": {
"description": "Velg et hjem for å hente prisinformasjon og vurderinger.",
"data": {
"home_id": "Hjem-ID"
},
"title": "Velg et hjem",
"submit": "Velg hjem"
},
"reauth_confirm": {
"title": "Autentiser Tibber Prisintegrasjonen på nytt",
"description": "Tilgangstokenet for Tibber er ikke lenger gyldig. Vennligst oppgi et nytt API-tilgangstoken for å fortsette å bruke denne integrasjonen.\n\nFor å generere et nytt API-tilgangstoken, besøk https://developer.tibber.com.",
"data": {
"access_token": "API-tilgangstoken"
},
"submit": "Oppdater token"
}
},
"error": {
"auth": "Tibber-tilgangstokenet er ugyldig.",
"connection": "Kunne ikke koble til Tibber. Vennligst sjekk internettforbindelsen din.",
"unknown": "Uventet feil",
"cannot_connect": "Kunne ikke koble til",
"invalid_access_token": "Ugyldig tilgangstoken",
"missing_homes": "Det nye tilgangstokenet har ikke tilgang til alle konfigurerte hjem. Vennligst bruk et tilgangstoken som har tilgang til de samme Tibber-hjemmene."
},
"abort": {
"already_configured": "Integrasjonen er allerede konfigurert",
"entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet.",
"setup_complete": "Oppsett fullført! Du kan endre flere innstillinger for Tibber-priser i integrasjonens alternativer etter å ha lukket denne dialogen.",
"reauth_successful": "Autentisering vellykket. Integrasjonen er oppdatert med det nye tilgangstokenet."
}
},
"common": {
"step_progress": "Trinn {step_num} av {total_steps}"
},
"config_subentries": {
"home": {
"initiate_flow": {
"user": "Legg til Tibber-hjem"
},
"title": "Legg til Tibber-hjem",
"step": {
"user": {
"title": "Legg til Tibber-hjem",
"description": "Velg et hjem å legge til i din Tibber-integrasjon.\n\n**Merk:** Etter å ha lagt til dette hjemmet, kan du legge til flere hjem fra integrasjonens kontekstmeny ved å velge \"Legg til Tibber-hjem\".",
"data": {
"home_id": "Hjem"
}
}
},
"error": {
"api_error": "Kunne ikke hente hjem fra Tibber API"
},
"abort": {
"no_parent_entry": "Overordnet oppføring ikke funnet",
"no_access_token": "Ingen tilgangstoken tilgjengelig",
"home_not_found": "Valgt hjem ikke funnet",
"api_error": "Kunne ikke hente hjem fra Tibber API",
"no_available_homes": "Ingen flere hjem tilgjengelig for å legge til. Alle hjem fra din Tibber-konto er allerede lagt til."
}
}
},
"options": {
"step": {
"init": {
"title": "Generelle innstillinger",
"description": "{step_progress}\n\nKonfigurer generelle innstillinger for Tibber Prisinformasjon & Vurderinger.\n\nBruker: {user_login}",
"data": {
"extended_descriptions": "Vis utvidede beskrivelser i entitetsattributter"
},
"submit": "Neste til steg 2"
},
"current_interval_price_rating": {
"title": "Prisvurderingsterskler",
"description": "{step_progress}\n\nKonfigurer terskler for prisvurderingsnivåer (lav/normal/høy) basert på sammenligning med 24-timers glidende gjennomsnitt.",
"data": {
"price_rating_threshold_low": "Lav vurderingsterskel (% under glidende gjennomsnitt)",
"price_rating_threshold_high": "Høy vurderingsterskel (% over glidende gjennomsnitt)"
},
"submit": "Neste til steg 3"
},
"best_price": {
"title": "Innstillinger for beste prisperiode",
"description": "{step_progress}\n\nKonfigurer innstillinger for binærsensoren Beste prisperiode. Denne sensoren er aktiv i perioder med de laveste strømprisene.",
"data": {
"best_price_min_period_length": "Minimum periodelengde",
"best_price_flex": "Fleksibilitet: Maksimum % over minimumspris",
"best_price_min_distance_from_avg": "Minimumsavstand: Påkrevd % under daglig gjennomsnitt",
"best_price_max_level": "Prisnivåfilter (valgfritt)",
"best_price_max_level_gap_count": "Gaptoleranse for nivåfilter",
"enable_min_periods_best": "Prøv å oppnå minimum antall perioder",
"min_periods_best": "Minimum antall perioder",
"relaxation_step_best": "Avslappingstrinn",
"relaxation_attempts_best": "Antall forsøk (fleksnivåer)"
},
"data_description": {
"best_price_max_level": "Vis kun beste prisperioder hvis de inneholder intervaller med prisnivåer ≤ valgt verdi. For eksempel: å velge 'Billig' betyr at perioden må ha minst ett 'VELDIG_BILLIG' eller 'BILLIG' intervall. Dette sikrer at 'beste pris'-perioder ikke bare er relativt billige for dagen, men faktisk billige i absolutte tall. Velg 'Alle' for å vise beste priser uavhengig av deres absolutte prisnivå.",
"enable_min_periods_best": "Når aktivert vil filtrene gradvis bli lempeligere hvis det ikke blir funnet nok perioder. Dette forsøker å nå ønsket minimum antall perioder, noe som kan føre til at mindre optimale tidsrom blir markert som beste-pris-perioder.",
"min_periods_best": "Minimum antall beste-pris-perioder å sikte mot per dag. Filtre vil bli lempet trinn for trinn for å prøve å oppnå dette antallet. Kun aktiv når 'Prøv å oppnå minimum antall perioder' er aktivert. Standard: 1",
"relaxation_step_best": "Prosentandel av den opprinnelige fleksibilitetsterskealen som legges til per avslappingstrinn. For eksempel: med 15% fleksibilitet og 25% trinnstørrelse vil filtrene prøve 15%, 18,75%, 22,5%, osv. Høyere verdier betyr raskere avslapping men mindre presisjon.",
"relaxation_attempts_best": "Hvor mange fleksnivåer (forsøk) som testes før vi gir opp. Hvert forsøk kjører alle filterkombinasjoner på det nye fleksnivået. Flere forsøk øker sjansen for ekstra perioder, men tar litt lengre tid.",
"best_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig ett nivåtrinn fra det nødvendige nivået. For eksempel: med 'Billig' filter og gapantall 1, aksepteres sekvensen 'BILLIG, BILLIG, NORMAL, BILLIG' (NORMAL er ett trinn over BILLIG). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. Standard: 0 (streng filtrering, ingen toleranse)."
},
"submit": "Neste til steg 5"
},
"peak_price": {
"title": "Innstillinger for topprisperiode",
"description": "{step_progress}\n\nKonfigurer innstillinger for binærsensoren Topprisperiode. Denne sensoren er aktiv i perioder med de høyeste strømprisene.",
"data": {
"peak_price_min_period_length": "Minimum periodelengde",
"peak_price_flex": "Fleksibilitet: Maksimum % under maksimumspris (negativ verdi)",
"peak_price_min_distance_from_avg": "Minimumsavstand: Påkrevd % over daglig gjennomsnitt",
"peak_price_min_level": "Prisnivåfilter (valgfritt)",
"peak_price_max_level_gap_count": "Gaptoleranse for nivåfilter",
"enable_min_periods_peak": "Prøv å oppnå minimum antall perioder",
"min_periods_peak": "Minimum antall perioder",
"relaxation_step_peak": "Avslappingstrinn",
"relaxation_attempts_peak": "Antall forsøk (fleksnivåer)"
},
"data_description": {
"peak_price_min_level": "Vis kun topprisperioder hvis de inneholder intervaller med prisnivåer ≥ valgt verdi. For eksempel: å velge 'Dyr' betyr at perioden må ha minst ett 'DYR' eller 'VELDIG_DYR' intervall. Dette sikrer at 'topppris'-perioder ikke bare er relativt dyre for dagen, men faktisk dyre i absolutte tall. Velg 'Alle' for å vise topppriser uavhengig av deres absolutte prisnivå.",
"enable_min_periods_peak": "Når aktivert vil filtrene gradvis bli lempeligere hvis det ikke blir funnet nok perioder. Dette forsøker å nå ønsket minimum antall perioder for å sikre at du blir advart om dyre perioder selv på dager med uvanlige prismønstre.",
"min_periods_peak": "Minimum antall topp-pris-perioder å sikte mot per dag. Filtre vil bli lempet trinn for trinn for å prøve å oppnå dette antallet. Kun aktiv når 'Prøv å oppnå minimum antall perioder' er aktivert. Standard: 1",
"relaxation_step_peak": "Prosentandel av den opprinnelige fleksibilitetsterskealen som legges til per avslappingstrinn. For eksempel: med -15% fleksibilitet og 25% trinnstørrelse vil filtrene prøve -15%, -18,75%, -22,5%, osv. Høyere verdier betyr raskere avslapping men mindre presisjon.",
"relaxation_attempts_peak": "Hvor mange fleksnivåer (forsøk) som testes før vi gir opp. Hvert forsøk kjører alle filterkombinasjoner på det nye fleksnivået. Flere forsøk øker sjansen for ekstra toppprisperioder, men tar litt lengre tid.",
"peak_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig ett nivåtrinn fra det nødvendige nivået. For eksempel: med 'Dyr' filter og gapantall 2, aksepteres sekvensen 'DYR, NORMAL, NORMAL, DYR' (NORMAL er ett trinn under DYR). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. Standard: 0 (streng filtrering, ingen toleranse)."
},
"submit": "Neste til steg 6"
},
"price_trend": {
"title": "Pristrendterskler",
"description": "{step_progress}\n\nKonfigurer terskler for pristrendsensorer. Disse sensorene sammenligner nåværende pris med gjennomsnittet av de neste N timene for å bestemme om prisene stiger, faller eller er stabile.",
"data": {
"price_trend_threshold_rising": "Stigende terskel (% over nåværende pris)",
"price_trend_threshold_falling": "Fallende terskel (% under nåværende pris, negativ verdi)"
},
"submit": "Fullfør konfigurasjon"
},
"volatility": {
"title": "Prisvolatilitet Terskler",
"description": "{step_progress}\n\nKonfigurer terskler for volatilitetsklassifisering. Volatilitet måler relative prisvariasjoner ved hjelp av variasjonskoeffisienten (VK = standardavvik / gjennomsnitt × 100%). Disse tersklene er prosentverdier som fungerer på alle prisnivåer og brukes av volatilitetssensorer og periodefiltre.",
"data": {
"volatility_threshold_moderate": "Moderat terskel (VK ≥ denne %, f.eks. 15)",
"volatility_threshold_high": "Høy terskel (VK ≥ denne %, f.eks. 30)",
"volatility_threshold_very_high": "Veldig høy terskel (VK ≥ denne %, f.eks. 50)"
},
"submit": "Neste til steg 4"
}
},
"error": {
"auth": "Tibber-tilgangstokenet er ugyldig.",
"connection": "Kunne ikke koble til Tibber. Vennligst sjekk internettforbindelsen din.",
"unknown": "En uventet feil oppstod. Vennligst sjekk loggene for detaljer.",
"cannot_connect": "Kunne ikke koble til",
"invalid_access_token": "Ugyldig tilgangstoken",
"different_home": "Tilgangstokenet er ikke gyldig for hjem-ID-en denne integrasjonen er konfigurert for."
},
"abort": {
"entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet."
}
},
"entity": {
"sensor": {
"current_interval_price": {
"name": "Nåværende strømpris"
},
"next_interval_price": {
"name": "Neste pris"
},
"previous_interval_price": {
"name": "Forrige strømpris"
},
"current_hour_average_price": {
"name": "Nåværende timepris gjennomsnitt"
},
"next_hour_average_price": {
"name": "Neste timepris gjennomsnitt"
},
"current_interval_price_level": {
"name": "Nåværende prisnivå",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"next_interval_price_level": {
"name": "Neste prisnivå",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"previous_interval_price_level": {
"name": "Forrige prisnivå",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"current_hour_price_level": {
"name": "Nåværende timepris nivå",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"next_hour_price_level": {
"name": "Neste timepris nivå",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"lowest_price_today": {
"name": "Dagens laveste pris"
},
"highest_price_today": {
"name": "Dagens høyeste pris"
},
"average_price_today": {
"name": "Dagens gjennomsnittspris"
},
"lowest_price_tomorrow": {
"name": "Morgendagens laveste pris"
},
"highest_price_tomorrow": {
"name": "Morgendagens høyeste pris"
},
"average_price_tomorrow": {
"name": "Morgendagens gjennomsnittspris"
},
"yesterday_price_level": {
"name": "Prisnivå i går",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"today_price_level": {
"name": "Prisnivå i dag",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"tomorrow_price_level": {
"name": "Prisnivå i morgen",
"state": {
"very_cheap": "Veldig billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Veldig dyr"
}
},
"yesterday_price_rating": {
"name": "Prisvurdering i går",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"today_price_rating": {
"name": "Prisvurdering i dag",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"tomorrow_price_rating": {
"name": "Prisvurdering i morgen",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"trailing_price_average": {
"name": "Glidende 24t gjennomsnittspris"
},
"leading_price_average": {
"name": "Fremtidig 24t gjennomsnittspris"
},
"trailing_price_min": {
"name": "Glidende 24t minimumspris"
},
"trailing_price_max": {
"name": "Glidende 24t maksimumspris"
},
"leading_price_min": {
"name": "Fremtidig 24t minimumspris"
},
"leading_price_max": {
"name": "Fremtidig 24t maksimumspris"
},
"current_interval_price_rating": {
"name": "Nåværende prisvurdering",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"next_interval_price_rating": {
"name": "Neste prisvurdering",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"previous_interval_price_rating": {
"name": "Forrige prisvurdering",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"current_hour_price_rating": {
"name": "Nåværende timepris vurdering",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"next_hour_price_rating": {
"name": "Neste timepris vurdering",
"state": {
"low": "Lav",
"normal": "Normal",
"high": "Høy"
}
},
"next_avg_1h": {
"name": "Neste 1t gjennomsnittspris"
},
"next_avg_2h": {
"name": "Neste 2t gjennomsnittspris"
},
"next_avg_3h": {
"name": "Neste 3t gjennomsnittspris"
},
"next_avg_4h": {
"name": "Neste 4t gjennomsnittspris"
},
"next_avg_5h": {
"name": "Neste 5t gjennomsnittspris"
},
"next_avg_6h": {
"name": "Neste 6t gjennomsnittspris"
},
"next_avg_8h": {
"name": "Neste 8t gjennomsnittspris"
},
"next_avg_12h": {
"name": "Neste 12t gjennomsnittspris"
},
"price_trend_1h": {
"name": "Pristrend (1t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_2h": {
"name": "Pristrend (2t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_3h": {
"name": "Pristrend (3t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_4h": {
"name": "Pristrend (4t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_5h": {
"name": "Pristrend (5t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_6h": {
"name": "Pristrend (6t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_8h": {
"name": "Pristrend (8t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"price_trend_12h": {
"name": "Pristrend (12t)",
"state": {
"rising": "Stigende",
"falling": "Fallende",
"stable": "Stabil"
}
},
"daily_rating": {
"name": "Daglig prisvurdering"
},
"monthly_rating": {
"name": "Månedlig prisvurdering"
},
"data_timestamp": {
"name": "Prisdata Utløp"
},
"today_volatility": {
"name": "Dagens Prisvolatilitet",
"state": {
"low": "Lav",
"moderate": "Moderat",
"high": "Høy",
"very_high": "Svært Høy"
}
},
"tomorrow_volatility": {
"name": "Morgendagens Prisvolatilitet",
"state": {
"low": "Lav",
"moderate": "Moderat",
"high": "Høy",
"very_high": "Svært Høy"
}
},
"next_24h_volatility": {
"name": "Neste 24t Prisvolatilitet",
"state": {
"low": "Lav",
"moderate": "Moderat",
"high": "Høy",
"very_high": "Svært Høy"
}
},
"today_tomorrow_volatility": {
"name": "I dag+I morgen Prisvolatilitet",
"state": {
"low": "Lav",
"moderate": "Moderat",
"high": "Høy",
"very_high": "Svært Høy"
}
},
"price_forecast": {
"name": "Prisprognose"
}
},
"binary_sensor": {
"peak_price_period": {
"name": "Topprisperiode"
},
"best_price_period": {
"name": "Beste prisperiode"
},
"connection": {
"name": "Tibber API-tilkobling"
},
"tomorrow_data_available": {
"name": "Morgendagens data tilgjengelig"
}
}
},
"issues": {
"new_homes_available": {
"title": "Nye Tibber-hjem oppdaget",
"description": "Vi oppdaget {count} nytt/nye hjem på din Tibber-konto: {homes}. Du kan legge dem til i Home Assistant gjennom Tibber-integrasjonskonfigurasjonen."
},
"homes_removed": {
"title": "Tibber-hjem fjernet",
"description": "Vi oppdaget at {count} hjem har blitt fjernet fra din Tibber-konto: {homes}. Vennligst gjennomgå din Tibber-integrasjonskonfigurasjon."
}
},
"services": {
"refresh_user_data": {
"name": "Oppdater brukerdata",
"description": "Tvinger en oppdatering av brukerdataene (hjem, profilinformasjon) fra Tibber API. Dette kan være nyttig etter å ha gjort endringer i Tibber-kontoen din eller ved feilsøking av tilkoblingsproblemer.",
"fields": {
"entry_id": {
"name": "Oppførings-ID",
"description": "Konfig-oppførings-ID for Tibber-integrasjonen."
}
}
}
},
"selector": {
"volatility": {
"options": {
"low": "Lav",
"moderate": "Moderat",
"high": "Høy",
"very_high": "Svært høy"
}
},
"current_interval_price_level": {
"options": {
"any": "Alle",
"very_cheap": "Svært billig",
"cheap": "Billig",
"normal": "Normal",
"expensive": "Dyr",
"very_expensive": "Svært dyr"
}
}
},
"title": "Tibber Prisinformasjon & Vurderinger"
}