hass.tibber_prices/custom_components/tibber_prices/translations/sv.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": "Konfigurera Tibber Prisinformation & Betyg.\n\nFör att generera en API-åtkomsttoken, besök https://developer.tibber.com.",
"data": {
"access_token": "API-åtkomsttoken"
},
"submit": "Validera token"
},
"select_home": {
"description": "Välj ett hem för att hämta prisinformation och betyg.",
"data": {
"home_id": "Hem"
},
"title": "Välj ett hem",
"submit": "Välj hem"
},
"finish": {
"description": "Välj ett hem för att hämta prisinformation och betyg.",
"data": {
"home_id": "Hem-ID"
},
"title": "Välj ett hem",
"submit": "Välj hem"
},
"reauth_confirm": {
"title": "Autentisera Tibber Prisintegrationen igen",
"description": "Åtkomsttoken för Tibber är inte längre giltig. Vänligen ange en ny API-åtkomsttoken för att fortsätta använda denna integration.\n\nFör att generera en ny API-åtkomsttoken, besök https://developer.tibber.com.",
"data": {
"access_token": "API-åtkomsttoken"
},
"submit": "Uppdatera token"
}
},
"error": {
"auth": "Tibber-åtkomsttoken är ogiltig.",
"connection": "Kunde inte ansluta till Tibber. Vänligen kontrollera din internetanslutning.",
"unknown": "Oväntat fel",
"cannot_connect": "Kunde inte ansluta",
"invalid_access_token": "Ogiltig åtkomsttoken",
"missing_homes": "Den nya åtkomsttoken har inte åtkomst till alla konfigurerade hem. Vänligen använd en åtkomsttoken som har åtkomst till samma Tibber-hem."
},
"abort": {
"already_configured": "Integrationen är redan konfigurerad",
"entry_not_found": "Tibber-konfigurationspost hittades inte.",
"setup_complete": "Konfiguration klar! Du kan ändra ytterligare alternativ för Tibber-priser i integrationens alternativ efter att ha stängt denna dialog.",
"reauth_successful": "Omautentisering lyckades. Integrationen har uppdaterats med den nya åtkomsttoken."
}
},
"common": {
"step_progress": "Steg {step_num} av {total_steps}"
},
"config_subentries": {
"home": {
"initiate_flow": {
"user": "Lägg till Tibber-hem"
},
"title": "Lägg till Tibber-hem",
"step": {
"user": {
"title": "Lägg till Tibber-hem",
"description": "Välj ett hem att lägga till i din Tibber-integration.\n\n**Obs:** Efter att ha lagt till detta hem kan du lägga till ytterligare hem från integrationens kontextmeny genom att välja \"Lägg till Tibber-hem\".",
"data": {
"home_id": "Hem"
}
}
},
"error": {
"api_error": "Kunde inte hämta hem från Tibber API"
},
"abort": {
"no_parent_entry": "Överordnad post hittades inte",
"no_access_token": "Ingen åtkomsttoken tillgänglig",
"home_not_found": "Valt hem hittades inte",
"api_error": "Kunde inte hämta hem från Tibber API",
"no_available_homes": "Inga ytterligare hem tillgängliga att lägga till. Alla hem från ditt Tibber-konto har redan lagts till."
}
}
},
"options": {
"step": {
"init": {
"title": "Allmänna inställningar",
"description": "{step_progress}\n\nKonfigurera allmänna inställningar för Tibber Prisinformation & Betyg.\n\nAnvändare: {user_login}",
"data": {
"extended_descriptions": "Visa utökade beskrivningar i entitetsattribut"
},
"submit": "Nästa till steg 2"
},
"current_interval_price_rating": {
"title": "Prisvärderingströsklar",
"description": "{step_progress}\n\nKonfigurera trösklar för prisvärderingsnivåer (låg/normal/hög) baserat på jämförelse med rullande 24-timmars genomsnitt.",
"data": {
"price_rating_threshold_low": "Låg värderingströskel (% under rullande genomsnitt)",
"price_rating_threshold_high": "Hög värderingströskel (% över rullande genomsnitt)"
},
"submit": "Nästa till steg 3"
},
"best_price": {
"title": "Inställningar för bästa prisperiod",
"description": "{step_progress}\n\nKonfigurera inställningar för Bästa Prisperiod binärsensor. Denna sensor är aktiv under perioder med de lägsta elpriserna.",
"data": {
"best_price_min_period_length": "Minsta periodlängd",
"best_price_flex": "Flexibilitet: Maximalt % över minimumpris",
"best_price_min_distance_from_avg": "Minimiavstånd: Krävd % under dagligt genomsnitt",
"best_price_max_level": "Prisnivåfilter (Valfritt)",
"best_price_max_level_gap_count": "Gaptolerens för nivåfilter",
"enable_min_periods_best": "Försök uppnå minsta antal perioder",
"min_periods_best": "Minsta antal perioder",
"relaxation_step_best": "Avslappningssteg",
"relaxation_attempts_best": "Antal avslappningsförsök"
},
"data_description": {
"best_price_max_level": "Visa endast bästa prisperioder om de innehåller intervall med prisnivåer ≤ valt värde. Till exempel: att välja 'Billigt' betyder att perioden måste ha minst ett 'MYCKET_BILLIGT' eller 'BILLIGT' intervall. Detta säkerställer att 'bästa pris'-perioder inte bara är relativt billiga för dagen, utan faktiskt billiga i absoluta tal. Välj 'Alla' för att visa bästa priser oavsett deras absoluta prisnivå.",
"enable_min_periods_best": "När aktiverad kommer filtren att gradvis luckras upp om inte tillräckligt många perioder hittas. Detta försöker uppnå det önskade minsta antalet perioder för att säkerställa att du har möjligheter att dra nytta av låga priser även på dagar med ovanliga prismönster.",
"min_periods_best": "Minsta antal bästa prisperioder att sträva efter per dag. Filtren kommer att luckras upp steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Försök uppnå minsta antal perioder' är aktiverad. Standard: 1",
"relaxation_step_best": "Procentandel av den ursprungliga flexibilitetströskeln att lägga till per avslappningssteg. Till exempel: med 15% flexibilitet och 25% stegstorlek kommer filtren att prova 15%, 18,75%, 22,5%, osv. Högre värden innebär snabbare avslappning men mindre precision.",
"relaxation_attempts_best": "Hur många gånger avslappningslogiken får försöka hitta nya kombinationer av flex och filter. Öka detta om dagarna är extrema och du behöver fler försök för att nå minimikravet. Varje extra försök tar lite mer tid men ökar chansen att hitta perioder.",
"best_price_max_level_gap_count": "Maximalt antal på varandra följande intervaller som får avvika med exakt ett nivåsteg från det erforderliga nivået. Till exempel: med 'Billigt' filter och gapantal 1 accepteras sekvensen 'BILLIGT, BILLIGT, NORMALT, BILLIGT' (NORMALT är ett steg över BILLIGT). Detta förhindrar att perioder delas upp av tillfälliga nivåavvikelser. Standard: 0 (strikt filtrering, ingen tolerans)."
},
"submit": "Nästa till steg 5"
},
"peak_price": {
"title": "Inställningar för topprisperiod",
"description": "{step_progress}\n\nKonfigurera inställningar för Topprisperiod binärsensor. Denna sensor är aktiv under perioder med de högsta elpriserna.",
"data": {
"peak_price_min_period_length": "Minsta periodlängd",
"peak_price_flex": "Flexibilitet: Maximalt % under maximumpris (negativt värde)",
"peak_price_min_distance_from_avg": "Minimiavstånd: Krävd % över dagligt genomsnitt",
"peak_price_min_level": "Prisnivåfilter (Valfritt)",
"peak_price_max_level_gap_count": "Gaptolerens för nivåfilter",
"enable_min_periods_peak": "Försök uppnå minsta antal perioder",
"min_periods_peak": "Minsta antal perioder",
"relaxation_step_peak": "Avslappningssteg",
"relaxation_attempts_peak": "Antal avslappningsförsök"
},
"data_description": {
"peak_price_min_level": "Visa endast topprisperioder om de innehåller intervall med prisnivåer ≥ valt värde. Till exempel måste perioden om du väljer 'Dyr' ha minst ett 'DYR' eller 'MYCKET_DYR' intervall. Detta säkerställer att 'toppris'-perioder inte bara är relativt dyra för dagen, utan faktiskt dyra i absoluta termer (inte bara 'lite dyrare än genomsnittet på en billig dag').",
"enable_min_periods_peak": "När aktiverad kommer filtren att gradvis luckras upp om inte tillräckligt många perioder hittas. Detta försöker uppnå det önskade minsta antalet perioder för att säkerställa att du blir varnad för dyra perioder även på dagar med ovanliga prismönster.",
"min_periods_peak": "Minsta antal topprisperioder att sträva efter per dag. Filtren kommer att luckras upp steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Försök uppnå minsta antal perioder' är aktiverad. Standard: 1",
"relaxation_step_peak": "Procentandel av den ursprungliga flexibilitetströskeln att lägga till per avslappningssteg. Till exempel: med -15% flexibilitet och 25% stegstorlek kommer filtren att prova -15%, -18,75%, -22,5%, osv. Högre värden innebär snabbare avslappning men mindre precision.",
"relaxation_attempts_peak": "Hur många gånger avslappningslogiken får försöka hitta nya kombinationer av flex och filter. Öka detta när topperioderna är svåra att hitta på grund av platta eller mycket volatila dagar. Fler försök ger större chans att hitta perioder men kräver lite mer beräkningstid.",
"peak_price_max_level_gap_count": "Maximalt antal på varandra följande intervaller som får avvika med exakt ett nivåsteg från det erforderliga nivået. Till exempel: med 'Dyrt' filter och gapantal 2 accepteras sekvensen 'DYRT, NORMALT, NORMALT, DYRT' (NORMALT är ett steg under DYRT). Detta förhindrar att perioder delas upp av tillfälliga nivåavvikelser. Standard: 0 (strikt filtrering, ingen tolerans)."
},
"submit": "Nästa till steg 6"
},
"price_trend": {
"title": "Pristrendtrösklar",
"description": "{step_progress}\n\nKonfigurera trösklar för pristrendsensorer. Dessa sensorer jämför det aktuella priset med genomsnittet av de nästa N timmarna för att avgöra om priserna stiger, faller eller är stabila.",
"data": {
"price_trend_threshold_rising": "Stigande tröskel (% över aktuellt pris)",
"price_trend_threshold_falling": "Fallande tröskel (% under aktuellt pris, negativt värde)"
},
"submit": "Slutför konfigurationen"
},
"volatility": {
"title": "Prisvolatilitet Trösklar",
"description": "{step_progress}\n\nKonfigurera trösklar för volatilitetsklassificering. Volatilitet mäter relativa prisvariationer med hjälp av variationskoefficienten (VK = standardavvikelse / medelvärde × 100%). Dessa trösklar är procentvärden som fungerar på alla prisnivåer och används av volatilitetssensorer och periodfilter.",
"data": {
"volatility_threshold_moderate": "Måttlig tröskel (VK ≥ denna %, t.ex. 15)",
"volatility_threshold_high": "Hög tröskel (VK ≥ denna %, t.ex. 30)",
"volatility_threshold_very_high": "Mycket hög tröskel (VK ≥ detta %, t.ex. 50)"
},
"submit": "Nästa till steg 4"
}
},
"error": {
"auth": "Tibber-åtkomsttoken är ogiltig.",
"connection": "Kunde inte ansluta till Tibber. Vänligen kontrollera din internetanslutning.",
"unknown": "Ett oväntat fel inträffade. Vänligen kontrollera loggarna för detaljer.",
"cannot_connect": "Kunde inte ansluta",
"invalid_access_token": "Ogiltig åtkomsttoken",
"different_home": "Åtkomsttoken är inte giltig för hem-ID:t som denna integration är konfigurerad för."
},
"abort": {
"entry_not_found": "Tibber-konfigurationspost hittades inte."
}
},
"entity": {
"sensor": {
"current_interval_price": {
"name": "Nuvarande elpris"
},
"next_interval_price": {
"name": "Nästa pris"
},
"previous_interval_price": {
"name": "Föregående elpris"
},
"current_hour_average_price": {
"name": "Nuvarande timgenomsnitt pris"
},
"next_hour_average_price": {
"name": "Nästa timgenomsnitt pris"
},
"current_interval_price_level": {
"name": "Nuvarande prisnivå",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normal",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"next_interval_price_level": {
"name": "Nästa prisnivå",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normal",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"previous_interval_price_level": {
"name": "Föregående prisnivå",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normal",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"current_hour_price_level": {
"name": "Nuvarande timprisnivå",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normal",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"next_hour_price_level": {
"name": "Nästa timprisnivå",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normal",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"lowest_price_today": {
"name": "Dagens lägsta pris"
},
"highest_price_today": {
"name": "Dagens högsta pris"
},
"average_price_today": {
"name": "Dagens genomsnittspris"
},
"lowest_price_tomorrow": {
"name": "Morgondagens lägsta pris"
},
"highest_price_tomorrow": {
"name": "Morgondagens högsta pris"
},
"average_price_tomorrow": {
"name": "Morgondagens genomsnittspris"
},
"yesterday_price_level": {
"name": "Prisnivå igår",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normalt",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"today_price_level": {
"name": "Prisnivå idag",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normalt",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"tomorrow_price_level": {
"name": "Prisnivå imorgon",
"state": {
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normalt",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
},
"yesterday_price_rating": {
"name": "Prisvärdering igår",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"today_price_rating": {
"name": "Prisvärdering idag",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"tomorrow_price_rating": {
"name": "Prisvärdering imorgon",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"trailing_price_average": {
"name": "Rullande 24t genomsnittspris"
},
"leading_price_average": {
"name": "Framåtblickande 24t genomsnittspris"
},
"trailing_price_min": {
"name": "Rullande 24t minimumpris"
},
"trailing_price_max": {
"name": "Rullande 24t maximumpris"
},
"leading_price_min": {
"name": "Framåtblickande 24t minimumpris"
},
"leading_price_max": {
"name": "Framåtblickande 24t maximumpris"
},
"current_interval_price_rating": {
"name": "Nuvarande prisvärdering",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"next_interval_price_rating": {
"name": "Nästa prisvärdering",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"previous_interval_price_rating": {
"name": "Föregående prisvärdering",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"current_hour_price_rating": {
"name": "Nuvarande timpris värdering",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"next_hour_price_rating": {
"name": "Nästa timpris värdering",
"state": {
"low": "Låg",
"normal": "Normal",
"high": "Hög"
}
},
"next_avg_1h": {
"name": "Nästa 1t genomsnittspris"
},
"next_avg_2h": {
"name": "Nästa 2t genomsnittspris"
},
"next_avg_3h": {
"name": "Nästa 3t genomsnittspris"
},
"next_avg_4h": {
"name": "Nästa 4t genomsnittspris"
},
"next_avg_5h": {
"name": "Nästa 5t genomsnittspris"
},
"next_avg_6h": {
"name": "Nästa 6t genomsnittspris"
},
"next_avg_8h": {
"name": "Nästa 8t genomsnittspris"
},
"next_avg_12h": {
"name": "Nästa 12t genomsnittspris"
},
"price_trend_1h": {
"name": "Pristrend (1t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_2h": {
"name": "Pristrend (2t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_3h": {
"name": "Pristrend (3t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_4h": {
"name": "Pristrend (4t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_5h": {
"name": "Pristrend (5t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_6h": {
"name": "Pristrend (6t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_8h": {
"name": "Pristrend (8t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"price_trend_12h": {
"name": "Pristrend (12t)",
"state": {
"rising": "Stigande",
"falling": "Fallande",
"stable": "Stabil"
}
},
"daily_rating": {
"name": "Daglig prisvärdering"
},
"monthly_rating": {
"name": "Månatlig prisvärdering"
},
"data_timestamp": {
"name": "Prisdata Utgångsdatum"
},
"today_volatility": {
"name": "Dagens Prisvolatilitet",
"state": {
"low": "Låg",
"moderate": "Måttlig",
"high": "Hög",
"very_high": "Mycket Hög"
}
},
"tomorrow_volatility": {
"name": "Morgondagens Prisvolatilitet",
"state": {
"low": "Låg",
"moderate": "Måttlig",
"high": "Hög",
"very_high": "Mycket Hög"
}
},
"next_24h_volatility": {
"name": "Nästa 24t Prisvolatilitet",
"state": {
"low": "Låg",
"moderate": "Måttlig",
"high": "Hög",
"very_high": "Mycket Hög"
}
},
"today_tomorrow_volatility": {
"name": "Idag+Imorgon Prisvolatilitet",
"state": {
"low": "Låg",
"moderate": "Måttlig",
"high": "Hög",
"very_high": "Mycket Hög"
}
},
"price_forecast": {
"name": "Prisprognos"
}
},
"binary_sensor": {
"peak_price_period": {
"name": "Topprisperiod"
},
"best_price_period": {
"name": "Bästa prisperiod"
},
"connection": {
"name": "Tibber API-anslutning"
},
"tomorrow_data_available": {
"name": "Morgondagens data tillgänglig"
}
}
},
"issues": {
"new_homes_available": {
"title": "Nya Tibber-hem upptäckta",
"description": "Vi upptäckte {count} nytt/nya hem på ditt Tibber-konto: {homes}. Du kan lägga till dem i Home Assistant via Tibber-integrationskonfigurationen."
},
"homes_removed": {
"title": "Tibber-hem borttagna",
"description": "Vi upptäckte att {count} hem har tagits bort från ditt Tibber-konto: {homes}. Vänligen granska din Tibber-integrationskonfiguration."
}
},
"services": {
"refresh_user_data": {
"name": "Uppdatera användardata",
"description": "Tvingar en uppdatering av användardata (hem, profilinformation) från Tibber API. Detta kan vara användbart efter att ha gjort ändringar i ditt Tibber-konto eller vid felsökning av anslutningsproblem.",
"fields": {
"entry_id": {
"name": "Post-ID",
"description": "Konfigurationspost-ID för Tibber-integrationen."
}
}
}
},
"selector": {
"volatility": {
"options": {
"low": "Låg",
"moderate": "Måttlig",
"high": "Hög",
"very_high": "Mycket hög"
}
},
"current_interval_price_level": {
"options": {
"any": "Alla",
"very_cheap": "Mycket billigt",
"cheap": "Billigt",
"normal": "Normalt",
"expensive": "Dyrt",
"very_expensive": "Mycket dyrt"
}
}
},
"title": "Tibber Prisinformation & Betyg"
}