diff --git a/custom_components/tibber_prices/config_flow_handlers/schemas.py b/custom_components/tibber_prices/config_flow_handlers/schemas.py index 0617022..1cdf012 100644 --- a/custom_components/tibber_prices/config_flow_handlers/schemas.py +++ b/custom_components/tibber_prices/config_flow_handlers/schemas.py @@ -12,7 +12,9 @@ import voluptuous as vol from custom_components.tibber_prices.const import ( BEST_PRICE_MAX_LEVEL_OPTIONS, CONF_AVERAGE_SENSOR_DISPLAY, + CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP, CONF_BEST_PRICE_FLEX, + CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS, CONF_BEST_PRICE_MAX_LEVEL, CONF_BEST_PRICE_MAX_LEVEL_GAP_COUNT, CONF_BEST_PRICE_MIN_DISTANCE_FROM_AVG, @@ -23,7 +25,9 @@ from custom_components.tibber_prices.const import ( CONF_EXTENDED_DESCRIPTIONS, CONF_MIN_PERIODS_BEST, CONF_MIN_PERIODS_PEAK, + CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, CONF_PEAK_PRICE_FLEX, + CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS, CONF_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, CONF_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, CONF_PEAK_PRICE_MIN_LEVEL, @@ -49,7 +53,9 @@ from custom_components.tibber_prices.const import ( CONF_VOLATILITY_THRESHOLD_MODERATE, CONF_VOLATILITY_THRESHOLD_VERY_HIGH, DEFAULT_AVERAGE_SENSOR_DISPLAY, + DEFAULT_BEST_PRICE_EXTEND_TO_VERY_CHEAP, DEFAULT_BEST_PRICE_FLEX, + DEFAULT_BEST_PRICE_MAX_EXTENSION_INTERVALS, DEFAULT_BEST_PRICE_MAX_LEVEL, DEFAULT_BEST_PRICE_MAX_LEVEL_GAP_COUNT, DEFAULT_BEST_PRICE_MIN_DISTANCE_FROM_AVG, @@ -59,7 +65,9 @@ from custom_components.tibber_prices.const import ( DEFAULT_EXTENDED_DESCRIPTIONS, DEFAULT_MIN_PERIODS_BEST, DEFAULT_MIN_PERIODS_PEAK, + DEFAULT_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, DEFAULT_PEAK_PRICE_FLEX, + DEFAULT_PEAK_PRICE_MAX_EXTENSION_INTERVALS, DEFAULT_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, DEFAULT_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, DEFAULT_PEAK_PRICE_MIN_LEVEL, @@ -86,6 +94,7 @@ from custom_components.tibber_prices.const import ( DEFAULT_VOLATILITY_THRESHOLD_VERY_HIGH, DISPLAY_MODE_BASE, DISPLAY_MODE_SUBUNIT, + MAX_EXTENSION_INTERVALS, MAX_GAP_COUNT, MAX_MIN_PERIOD_LENGTH, MAX_MIN_PERIODS, @@ -618,6 +627,7 @@ def get_best_price_schema( period_settings = options.get("period_settings", {}) flexibility_settings = options.get("flexibility_settings", {}) relaxation_settings = options.get("relaxation_and_target_periods", {}) + extension_settings = options.get("extension_settings", {}) # Get current values for override display min_period_length = int( @@ -633,6 +643,12 @@ def get_best_price_schema( enable_min_periods = relaxation_settings.get(CONF_ENABLE_MIN_PERIODS_BEST, DEFAULT_ENABLE_MIN_PERIODS_BEST) min_periods = int(relaxation_settings.get(CONF_MIN_PERIODS_BEST, DEFAULT_MIN_PERIODS_BEST)) relaxation_attempts = int(relaxation_settings.get(CONF_RELAXATION_ATTEMPTS_BEST, DEFAULT_RELAXATION_ATTEMPTS_BEST)) + extend_to_very_cheap = bool( + extension_settings.get(CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP, DEFAULT_BEST_PRICE_EXTEND_TO_VERY_CHEAP) + ) + max_extension_intervals_best = int( + extension_settings.get(CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS, DEFAULT_BEST_PRICE_MAX_EXTENSION_INTERVALS) + ) # Build section schemas with optional override warnings period_warning = get_section_override_warning("best_price", "period_settings", overrides, translations) or {} @@ -754,6 +770,28 @@ def get_best_price_schema( vol.Schema(relaxation_fields), {"collapsed": True}, ), + vol.Required("extension_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP, + default=extend_to_very_cheap, + ): BooleanSelector(selector.BooleanSelectorConfig()), + vol.Optional( + CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS, + default=max_extension_intervals_best, + ): NumberSelector( + NumberSelectorConfig( + min=1, + max=MAX_EXTENSION_INTERVALS, + step=1, + mode=NumberSelectorMode.SLIDER, + ) + ), + } + ), + {"collapsed": True}, + ), } ) @@ -779,6 +817,7 @@ def get_peak_price_schema( period_settings = options.get("period_settings", {}) flexibility_settings = options.get("flexibility_settings", {}) relaxation_settings = options.get("relaxation_and_target_periods", {}) + extension_settings = options.get("extension_settings", {}) # Get current values for override display min_period_length = int( @@ -794,6 +833,12 @@ def get_peak_price_schema( enable_min_periods = relaxation_settings.get(CONF_ENABLE_MIN_PERIODS_PEAK, DEFAULT_ENABLE_MIN_PERIODS_PEAK) min_periods = int(relaxation_settings.get(CONF_MIN_PERIODS_PEAK, DEFAULT_MIN_PERIODS_PEAK)) relaxation_attempts = int(relaxation_settings.get(CONF_RELAXATION_ATTEMPTS_PEAK, DEFAULT_RELAXATION_ATTEMPTS_PEAK)) + extend_to_very_expensive = bool( + extension_settings.get(CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, DEFAULT_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE) + ) + max_extension_intervals_peak = int( + extension_settings.get(CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS, DEFAULT_PEAK_PRICE_MAX_EXTENSION_INTERVALS) + ) # Build section schemas with optional override warnings period_warning = get_section_override_warning("peak_price", "period_settings", overrides, translations) or {} @@ -915,6 +960,28 @@ def get_peak_price_schema( vol.Schema(relaxation_fields), {"collapsed": True}, ), + vol.Required("extension_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, + default=extend_to_very_expensive, + ): BooleanSelector(selector.BooleanSelectorConfig()), + vol.Optional( + CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS, + default=max_extension_intervals_peak, + ): NumberSelector( + NumberSelectorConfig( + min=1, + max=MAX_EXTENSION_INTERVALS, + step=1, + mode=NumberSelectorMode.SLIDER, + ) + ), + } + ), + {"collapsed": True}, + ), } ) diff --git a/custom_components/tibber_prices/const.py b/custom_components/tibber_prices/const.py index aa97462..97468d5 100644 --- a/custom_components/tibber_prices/const.py +++ b/custom_components/tibber_prices/const.py @@ -68,6 +68,10 @@ CONF_RELAXATION_ATTEMPTS_BEST = "relaxation_attempts_best" CONF_ENABLE_MIN_PERIODS_PEAK = "enable_min_periods_peak" CONF_MIN_PERIODS_PEAK = "min_periods_peak" CONF_RELAXATION_ATTEMPTS_PEAK = "relaxation_attempts_peak" +CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP = "best_price_extend_to_very_cheap" +CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS = "best_price_max_extension_intervals" +CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE = "peak_price_extend_to_very_expensive" +CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS = "peak_price_max_extension_intervals" ATTRIBUTION = "Data provided by Tibber" @@ -131,6 +135,10 @@ DEFAULT_RELAXATION_ATTEMPTS_BEST = 11 # Default: 11 steps allows escalation fro DEFAULT_ENABLE_MIN_PERIODS_PEAK = True # Default: minimum periods feature enabled for peak price DEFAULT_MIN_PERIODS_PEAK = 2 # Default: require at least 2 peak price periods (when enabled) DEFAULT_RELAXATION_ATTEMPTS_PEAK = 11 # Default: 11 steps allows escalation from 20% to 50% (3% increment per step) +DEFAULT_BEST_PRICE_EXTEND_TO_VERY_CHEAP = False # Default: disabled (opt-in feature) +DEFAULT_BEST_PRICE_MAX_EXTENSION_INTERVALS = 4 # Default: up to 4 intervals (1 hour) per side +DEFAULT_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE = False # Default: disabled (opt-in feature) +DEFAULT_PEAK_PRICE_MAX_EXTENSION_INTERVALS = 4 # Default: up to 4 intervals (1 hour) per side # Validation limits (used in GUI schemas and server-side validation) # These ensure consistency between frontend and backend validation @@ -139,6 +147,7 @@ MAX_DISTANCE_PERCENTAGE = 50 # Maximum distance from average percentage (GUI sl MAX_GAP_COUNT = 8 # Maximum gap count for level filtering (GUI slider limit) MAX_MIN_PERIODS = 10 # Maximum number of minimum periods per day (GUI slider limit) MAX_RELAXATION_ATTEMPTS = 12 # Maximum relaxation attempts (GUI slider limit) +MAX_EXTENSION_INTERVALS = 12 # Maximum extension intervals per side (GUI slider limit = 3 hours) MIN_PERIOD_LENGTH = 15 # Minimum period length in minutes (1 quarter hour) MAX_MIN_PERIOD_LENGTH = 180 # Maximum for minimum period length setting (3 hours - realistic for required minimum) @@ -407,6 +416,13 @@ def get_default_options(currency_code: str | None) -> dict[str, Any]: CONF_MIN_PERIODS_PEAK: DEFAULT_MIN_PERIODS_PEAK, CONF_RELAXATION_ATTEMPTS_PEAK: DEFAULT_RELAXATION_ATTEMPTS_PEAK, }, + # Nested section: Extension settings (shared by best/peak price) + "extension_settings": { + CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP: DEFAULT_BEST_PRICE_EXTEND_TO_VERY_CHEAP, + CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS: DEFAULT_BEST_PRICE_MAX_EXTENSION_INTERVALS, + CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE: DEFAULT_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, + CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS: DEFAULT_PEAK_PRICE_MAX_EXTENSION_INTERVALS, + }, } diff --git a/custom_components/tibber_prices/coordinator/period_handlers/__init__.py b/custom_components/tibber_prices/coordinator/period_handlers/__init__.py index 4ca5b34..4b30037 100644 --- a/custom_components/tibber_prices/coordinator/period_handlers/__init__.py +++ b/custom_components/tibber_prices/coordinator/period_handlers/__init__.py @@ -28,6 +28,9 @@ from .outlier_filtering import filter_price_outliers # Re-export relaxation from .relaxation import calculate_periods_with_relaxation +# Re-export shape extension +from .shape_extension import extend_periods_for_shape + # Re-export constants and types from .types import ( ALL_DAY_PATTERNS, @@ -80,5 +83,6 @@ __all__ = [ "calculate_periods", "calculate_periods_with_relaxation", "detect_day_patterns", + "extend_periods_for_shape", "filter_price_outliers", ] diff --git a/custom_components/tibber_prices/coordinator/period_handlers/core.py b/custom_components/tibber_prices/coordinator/period_handlers/core.py index caaa365..54bc83f 100644 --- a/custom_components/tibber_prices/coordinator/period_handlers/core.py +++ b/custom_components/tibber_prices/coordinator/period_handlers/core.py @@ -25,6 +25,7 @@ from .period_building import ( from .period_statistics import ( extract_period_summaries, ) +from .shape_extension import extend_periods_for_shape from .types import TibberPricesThresholdConfig # Flex limits to prevent degenerate behavior (see docs/development/period-calculation-theory.md) @@ -209,6 +210,20 @@ def calculate_periods( time=time, ) + # Step 7.5: Extend periods into adjacent VERY_CHEAP / VERY_EXPENSIVE intervals + # This is an opt-in feature (disabled by default) that adds contiguous + # extreme-level intervals on each side of an already-found period. + if config.extend_to_extreme and config.max_extension_intervals > 0: + period_summaries = extend_periods_for_shape( + period_summaries, + all_prices_sorted, + price_context, + reverse_sort=reverse_sort, + max_extension_intervals=config.max_extension_intervals, + thresholds=thresholds, + time=time, + ) + # Step 8: Cross-day extension for late-night periods # If a best-price period ends near midnight and tomorrow has continued low prices, # extend the period across midnight to give users the full cheap window diff --git a/custom_components/tibber_prices/coordinator/period_handlers/shape_extension.py b/custom_components/tibber_prices/coordinator/period_handlers/shape_extension.py new file mode 100644 index 0000000..b15c09b --- /dev/null +++ b/custom_components/tibber_prices/coordinator/period_handlers/shape_extension.py @@ -0,0 +1,258 @@ +""" +Shape-based period extension: extend periods into adjacent VERY_CHEAP/VERY_EXPENSIVE intervals. + +After periods are identified by the core algorithm, this module optionally extends +each period's boundaries to include any directly-adjacent intervals that carry the +most extreme price level relevant to the period type: + +- Best price periods → extend into VERY_CHEAP neighbouring intervals +- Peak price periods → extend into VERY_EXPENSIVE neighbouring intervals + +Extension is purely additive and opt-in (disabled by default). It does not affect +the core period-finding logic; periods that would not normally be found are not +created by this step. +""" + +from __future__ import annotations + +import statistics +from datetime import timedelta +from typing import TYPE_CHECKING, Any + +from custom_components.tibber_prices.const import ( + PRICE_LEVEL_VERY_CHEAP, + PRICE_LEVEL_VERY_EXPENSIVE, +) +from custom_components.tibber_prices.utils.price import ( + aggregate_period_levels, + aggregate_period_ratings, +) + +from .period_statistics import ( + calculate_aggregated_rating_difference, + calculate_period_price_diff, + calculate_period_price_statistics, +) + +if TYPE_CHECKING: + from datetime import datetime + + from custom_components.tibber_prices.coordinator.time_service import TibberPricesTimeService + + from .types import TibberPricesThresholdConfig + +_INTERVAL_DURATION = timedelta(minutes=15) + + +def extend_periods_for_shape( # noqa: PLR0913 - Extension requires all context params + periods: list[dict[str, Any]], + all_prices: list[dict[str, Any]], + price_context: dict[str, Any], + *, + reverse_sort: bool, + max_extension_intervals: int, + thresholds: TibberPricesThresholdConfig, + time: TibberPricesTimeService, +) -> list[dict[str, Any]]: + """ + Extend each period into adjacent VERY_CHEAP or VERY_EXPENSIVE intervals. + + For best price periods (reverse_sort=False): extend into VERY_CHEAP neighbours. + For peak price periods (reverse_sort=True): extend into VERY_EXPENSIVE neighbours. + + Only intervals that are directly contiguous with the period and carry the + target level are added. At most *max_extension_intervals* are consumed on + each side independently. Period statistics are fully recalculated after + any extension. + + Args: + periods: Period summary dicts from ``extract_period_summaries``. + all_prices: All enriched price intervals (yesterday + today + tomorrow). + price_context: Dict with ``ref_prices`` and ``avg_prices`` per calendar day. + reverse_sort: ``True`` for peak price, ``False`` for best price. + max_extension_intervals: Maximum extra intervals that may be added per side. + thresholds: Threshold configuration for level / rating aggregation. + time: Time-service instance used to resolve ``startsAt`` timestamps. + + Returns: + Updated list of period dicts, potentially with extended boundaries and + recalculated statistics. Unmodified periods are returned as-is. + + """ + if not periods or max_extension_intervals <= 0: + return periods + + target_level = PRICE_LEVEL_VERY_EXPENSIVE if reverse_sort else PRICE_LEVEL_VERY_CHEAP + + # Build a lookup dict: local datetime → full interval dict + interval_index: dict[datetime, dict[str, Any]] = {} + for iv in all_prices: + t = time.get_interval_time(iv) + if t is not None: + interval_index[t] = iv + + return [ + _extend_period_edges( + period, + interval_index, + target_level=target_level, + max_intervals=max_extension_intervals, + thresholds=thresholds, + price_context=price_context, + ) + for period in periods + ] + + +# ── private helpers ──────────────────────────────────────────────────────────── + + +def _extend_period_edges( # noqa: PLR0913, PLR0912, PLR0915 - Period edge extension requires many args, branches, and statements + period: dict[str, Any], + interval_index: dict[datetime, dict[str, Any]], + *, + target_level: str, + max_intervals: int, + thresholds: TibberPricesThresholdConfig, + price_context: dict[str, Any], +) -> dict[str, Any]: + """ + Consume adjacent target-level intervals on both edges of a period. + + The original period dict is never mutated; a new dict is returned. + If no extension is possible, the original dict is returned unchanged. + + Args: + period: Period summary dict with ``start`` and ``end`` datetime keys. + interval_index: Lookup map of ``{starts_at_datetime: interval_dict}``. + target_level: ``"VERY_CHEAP"`` or ``"VERY_EXPENSIVE"``. + max_intervals: Maximum intervals that may be added on each side. + thresholds: Threshold config for aggregation helpers. + price_context: Reference prices / averages per calendar day. + + Returns: + Extended (or original) period summary dict. + + """ + start: datetime = period["start"] + end: datetime = period["end"] + # ``end`` is the exclusive boundary: the last included interval starts at + # ``end - _INTERVAL_DURATION``. + + # ── walk LEFT (earlier than period start) ───────────────────────────────── + left_additions: list[dict[str, Any]] = [] + cursor = start - _INTERVAL_DURATION + for _ in range(max_intervals): + iv = interval_index.get(cursor) + if iv is None or iv.get("level") != target_level: + break + left_additions.insert(0, iv) + cursor -= _INTERVAL_DURATION + + # ── walk RIGHT (later than period end) ──────────────────────────────────── + right_additions: list[dict[str, Any]] = [] + cursor = end # first interval AFTER the period + for _ in range(max_intervals): + iv = interval_index.get(cursor) + if iv is None or iv.get("level") != target_level: + break + right_additions.append(iv) + cursor += _INTERVAL_DURATION + + total_added = len(left_additions) + len(right_additions) + if total_added == 0: + return period + + # ── rebuild full interval list for the extended period ──────────────────── + original_intervals = _collect_original_intervals(start, end, interval_index) + all_period_intervals = left_additions + original_intervals + right_additions + + # ── recalculate boundaries ──────────────────────────────────────────────── + new_start = start - _INTERVAL_DURATION * len(left_additions) + new_end = end + _INTERVAL_DURATION * len(right_additions) + new_duration_minutes = int((new_end - new_start).total_seconds() // 60) + new_interval_count = len(all_period_intervals) + + # ── recalculate price statistics ────────────────────────────────────────── + price_stats = calculate_period_price_statistics(all_period_intervals) + period_price_diff, period_price_diff_pct = calculate_period_price_diff( + price_stats["price_mean"], new_start, price_context + ) + rating_diff_pct = calculate_aggregated_rating_difference(all_period_intervals) + + # ── recalculate level / rating aggregates ───────────────────────────────── + new_level = aggregate_period_levels(all_period_intervals) + new_rating: str | None = None + if thresholds.threshold_low is not None and thresholds.threshold_high is not None: + new_rating, _ = aggregate_period_ratings( + all_period_intervals, + thresholds.threshold_low, + thresholds.threshold_high, + ) + + # ── recalculate volatility (coefficient of variation) ──────────────────── + prices_for_vol = [float(p["total"]) for p in all_period_intervals if "total" in p] + cv_pct: float | None = None + if len(prices_for_vol) >= 2: # noqa: PLR2004 + mean_p = statistics.mean(prices_for_vol) + if mean_p > 0: + cv_pct = round(statistics.stdev(prices_for_vol) / mean_p * 100, 1) + + # ── assemble updated period dict (keep structural fields, update statistics) ─ + reverse_sort = target_level == PRICE_LEVEL_VERY_EXPENSIVE + updated: dict[str, Any] = { + **period, + # Time fields + "start": new_start, + "end": new_end, + "duration_minutes": new_duration_minutes, + # Core decision attributes + "level": new_level, + "rating_level": new_rating, + "rating_difference_%": rating_diff_pct, + # Price statistics + "price_mean": price_stats["price_mean"], + "price_median": price_stats["price_median"], + "price_min": price_stats["price_min"], + "price_max": price_stats["price_max"], + "price_spread": price_stats["price_spread"], + "price_coefficient_variation_%": cv_pct, + # Detail + "period_interval_count": new_interval_count, + # Extension metadata + "extension_intervals_added": total_added, + } + + # Refresh period price diff (replaces old value from base period) + if reverse_sort: + updated.pop("period_price_diff_from_daily_min", None) + updated.pop("period_price_diff_from_daily_min_%", None) + if period_price_diff is not None: + updated["period_price_diff_from_daily_max"] = period_price_diff + if period_price_diff_pct is not None: + updated["period_price_diff_from_daily_max_%"] = period_price_diff_pct + else: + updated.pop("period_price_diff_from_daily_max", None) + updated.pop("period_price_diff_from_daily_max_%", None) + if period_price_diff is not None: + updated["period_price_diff_from_daily_min"] = period_price_diff + if period_price_diff_pct is not None: + updated["period_price_diff_from_daily_min_%"] = period_price_diff_pct + + return updated + + +def _collect_original_intervals( + start: datetime, + end: datetime, + interval_index: dict[datetime, dict[str, Any]], +) -> list[dict[str, Any]]: + """Reconstruct the ordered interval list for an existing period from the index.""" + result: list[dict[str, Any]] = [] + cursor = start + while cursor < end: + iv = interval_index.get(cursor) + if iv is not None: + result.append(iv) + cursor += _INTERVAL_DURATION + return result diff --git a/custom_components/tibber_prices/coordinator/period_handlers/types.py b/custom_components/tibber_prices/coordinator/period_handlers/types.py index 362a1e7..649153a 100644 --- a/custom_components/tibber_prices/coordinator/period_handlers/types.py +++ b/custom_components/tibber_prices/coordinator/period_handlers/types.py @@ -56,6 +56,8 @@ class TibberPricesPeriodConfig(NamedTuple): threshold_volatility_very_high: float = DEFAULT_VOLATILITY_THRESHOLD_VERY_HIGH level_filter: str | None = None # "any", "cheap", "expensive", etc. or None gap_count: int = 0 # Number of allowed consecutive deviating intervals + extend_to_extreme: bool = False # Extend periods into adjacent VERY_CHEAP/VERY_EXPENSIVE intervals + max_extension_intervals: int = 0 # Max intervals this extension may add per side (0 = disabled) class TibberPricesPeriodData(NamedTuple): diff --git a/custom_components/tibber_prices/coordinator/periods.py b/custom_components/tibber_prices/coordinator/periods.py index 7b781ba..416873d 100644 --- a/custom_components/tibber_prices/coordinator/periods.py +++ b/custom_components/tibber_prices/coordinator/periods.py @@ -225,6 +225,41 @@ class TibberPricesPeriodCalculator: "min_period_length": int(min_period_length), } + # Extension settings (stored in 'extension_settings' nested section) + if reverse_sort: + extend_to_extreme = bool( + self._get_option( + _const.CONF_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, + "extension_settings", + _const.DEFAULT_PEAK_PRICE_EXTEND_TO_VERY_EXPENSIVE, + ) + ) + max_extension_intervals = int( + self._get_option( + _const.CONF_PEAK_PRICE_MAX_EXTENSION_INTERVALS, + "extension_settings", + _const.DEFAULT_PEAK_PRICE_MAX_EXTENSION_INTERVALS, + ) + ) + else: + extend_to_extreme = bool( + self._get_option( + _const.CONF_BEST_PRICE_EXTEND_TO_VERY_CHEAP, + "extension_settings", + _const.DEFAULT_BEST_PRICE_EXTEND_TO_VERY_CHEAP, + ) + ) + max_extension_intervals = int( + self._get_option( + _const.CONF_BEST_PRICE_MAX_EXTENSION_INTERVALS, + "extension_settings", + _const.DEFAULT_BEST_PRICE_MAX_EXTENSION_INTERVALS, + ) + ) + + config["extend_to_extreme"] = extend_to_extreme + config["max_extension_intervals"] = max_extension_intervals + # Cache the result self._config_cache[cache_key] = config self._config_cache_valid = True @@ -702,6 +737,8 @@ class TibberPricesPeriodCalculator: threshold_volatility_very_high=threshold_volatility_very_high, level_filter=max_level_best, gap_count=gap_count_best, + extend_to_extreme=best_config["extend_to_extreme"], + max_extension_intervals=best_config["max_extension_intervals"], ) best_periods = calculate_periods_with_relaxation( all_prices, @@ -783,6 +820,8 @@ class TibberPricesPeriodCalculator: threshold_volatility_very_high=threshold_volatility_very_high, level_filter=min_level_peak, gap_count=gap_count_peak, + extend_to_extreme=peak_config["extend_to_extreme"], + max_extension_intervals=peak_config["max_extension_intervals"], ) peak_periods = calculate_periods_with_relaxation( all_prices, diff --git a/custom_components/tibber_prices/translations/de.json b/custom_components/tibber_prices/translations/de.json index a7cbb4c..99c13d7 100644 --- a/custom_components/tibber_prices/translations/de.json +++ b/custom_components/tibber_prices/translations/de.json @@ -1,1931 +1,1955 @@ { - "config": { - "step": { - "account_choice": { - "title": "Konto wählen", - "description": "Du kannst ein weiteres Zuhause aus einem bestehenden Tibber-Konto hinzufügen oder einen neuen API-Token für ein anderes Konto eingeben.", - "data": { - "account_choice": "Konto" - }, - "submit": "Weiter →" - }, - "new_token": { - "title": "API-Token eingeben", - "description": "Richte Tibber Preisinformationen & Bewertungen ein.\n\nUm einen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-Zugriffstoken" - }, - "submit": "Token validieren" - }, - "user": { - "description": "Richte Tibber Preisinformationen & Bewertungen ein.\n\nUm einen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-Zugriffstoken" - }, - "submit": "Token validieren" - }, - "select_home": { - "description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.", - "data": { - "home_id": "Zuhause" - }, - "title": "Wähle ein Zuhause", - "submit": "Zuhause auswählen" - }, - "finish": { - "description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.", - "data": { - "home_id": "Home ID" - }, - "title": "Wähle ein Zuhause", - "submit": "Zuhause auswählen" - }, - "reauth_confirm": { - "title": "Tibber Preis-Integration erneut authentifizieren", - "description": "Der Zugriffstoken für Tibber ist nicht mehr gültig. Bitte gib einen neuen API-Zugriffstoken ein, um diese Integration weiter zu nutzen.\n\nUm einen neuen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-Zugriffstoken" - }, - "submit": "Token aktualisieren" - } + "config": { + "step": { + "account_choice": { + "title": "Konto wählen", + "description": "Du kannst ein weiteres Zuhause aus einem bestehenden Tibber-Konto hinzufügen oder einen neuen API-Token für ein anderes Konto eingeben.", + "data": { + "account_choice": "Konto" }, - "error": { - "auth": "Der Tibber Zugangstoken ist ungültig.", - "connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.", - "unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.", - "cannot_connect": "Verbindung fehlgeschlagen", - "invalid_access_token": "Ungültiges Zugriffstoken", - "missing_homes": "Der neue Zugriffstoken hat keinen Zugriff auf alle konfigurierten Zuhause. Bitte verwende einen Zugriffstoken, der Zugriff auf die gleichen Tibber-Zuhause hat.", - "home_already_configured": "Dieses Zuhause ist bereits in einem anderen Eintrag konfiguriert. Jedes Zuhause kann nur einmal konfiguriert werden.", - "no_active_subscription": "Dieses Zuhause hat keinen aktiven Tibber-Vertrag. Nur Häuser mit aktivem Stromvertrag können zu Home Assistant hinzugefügt werden.", - "subscription_expired": "Der Tibber-Vertrag für dieses Zuhause ist abgelaufen. Nur Häuser mit aktivem oder zukünftigem Stromvertrag können zu Home Assistant hinzugefügt werden.", - "future_subscription_warning": "Hinweis: Der Tibber-Vertrag für dieses Zuhause hat noch nicht begonnen. Die Funktionalität ist möglicherweise eingeschränkt, bis der Vertrag aktiv wird." + "submit": "Weiter →" + }, + "new_token": { + "title": "API-Token eingeben", + "description": "Richte Tibber Preisinformationen & Bewertungen ein.\n\nUm einen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-Zugriffstoken" }, - "abort": { - "already_configured": "Alle verfügbaren Tibber-Zuhause sind bereits konfiguriert. Jedes Zuhause kann nur einmal konfiguriert werden.", - "entry_not_found": "Tibber-Konfigurationseintrag nicht gefunden.", - "setup_complete": "Einrichtung abgeschlossen! Du kannst zusätzliche Optionen für Tibber Prices in den Integrationsoptionen nach Schließen dieses Dialogs ändern.", - "reauth_successful": "Neuauthentifizierung erfolgreich. Die Integration wurde mit dem neuen Zugriffstoken aktualisiert." + "submit": "Token validieren" + }, + "user": { + "description": "Richte Tibber Preisinformationen & Bewertungen ein.\n\nUm einen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-Zugriffstoken" + }, + "submit": "Token validieren" + }, + "select_home": { + "description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.", + "data": { + "home_id": "Zuhause" + }, + "title": "Wähle ein Zuhause", + "submit": "Zuhause auswählen" + }, + "finish": { + "description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.", + "data": { + "home_id": "Home ID" + }, + "title": "Wähle ein Zuhause", + "submit": "Zuhause auswählen" + }, + "reauth_confirm": { + "title": "Tibber Preis-Integration erneut authentifizieren", + "description": "Der Zugriffstoken für Tibber ist nicht mehr gültig. Bitte gib einen neuen API-Zugriffstoken ein, um diese Integration weiter zu nutzen.\n\nUm einen neuen API-Zugriffstoken zu generieren, besuche [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-Zugriffstoken" + }, + "submit": "Token aktualisieren" + } + }, + "error": { + "auth": "Der Tibber Zugangstoken ist ungültig.", + "connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.", + "unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.", + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_access_token": "Ungültiges Zugriffstoken", + "missing_homes": "Der neue Zugriffstoken hat keinen Zugriff auf alle konfigurierten Zuhause. Bitte verwende einen Zugriffstoken, der Zugriff auf die gleichen Tibber-Zuhause hat.", + "home_already_configured": "Dieses Zuhause ist bereits in einem anderen Eintrag konfiguriert. Jedes Zuhause kann nur einmal konfiguriert werden.", + "no_active_subscription": "Dieses Zuhause hat keinen aktiven Tibber-Vertrag. Nur Häuser mit aktivem Stromvertrag können zu Home Assistant hinzugefügt werden.", + "subscription_expired": "Der Tibber-Vertrag für dieses Zuhause ist abgelaufen. Nur Häuser mit aktivem oder zukünftigem Stromvertrag können zu Home Assistant hinzugefügt werden.", + "future_subscription_warning": "Hinweis: Der Tibber-Vertrag für dieses Zuhause hat noch nicht begonnen. Die Funktionalität ist möglicherweise eingeschränkt, bis der Vertrag aktiv wird." + }, + "abort": { + "already_configured": "Alle verfügbaren Tibber-Zuhause sind bereits konfiguriert. Jedes Zuhause kann nur einmal konfiguriert werden.", + "entry_not_found": "Tibber-Konfigurationseintrag nicht gefunden.", + "setup_complete": "Einrichtung abgeschlossen! Du kannst zusätzliche Optionen für Tibber Prices in den Integrationsoptionen nach Schließen dieses Dialogs ändern.", + "reauth_successful": "Neuauthentifizierung erfolgreich. Die Integration wurde mit dem neuen Zugriffstoken aktualisiert." + } + }, + "common": { + "step_progress": "{step_num} / {total_steps}", + "override_warning_template": "⚠️ {fields} wird durch Konfigurations-Entität gesteuert", + "override_warning_and": "und", + "override_field_label_best_price_min_period_length": "Mindestperiodenlänge", + "override_field_label_best_price_max_level_gap_count": "Lückentoleranz", + "override_field_label_best_price_flex": "Flexibilität", + "override_field_label_best_price_min_distance_from_avg": "Mindestabstand", + "override_field_label_enable_min_periods_best": "Mindestzahl erreichen", + "override_field_label_min_periods_best": "Mindestperioden", + "override_field_label_relaxation_attempts_best": "Lockerungsversuche", + "override_field_label_peak_price_min_period_length": "Mindestperiodenlänge", + "override_field_label_peak_price_max_level_gap_count": "Lückentoleranz", + "override_field_label_peak_price_flex": "Flexibilität", + "override_field_label_peak_price_min_distance_from_avg": "Mindestabstand", + "override_field_label_enable_min_periods_peak": "Mindestzahl erreichen", + "override_field_label_min_periods_peak": "Mindestperioden", + "override_field_label_relaxation_attempts_peak": "Lockerungsversuche" + }, + "config_subentries": { + "home": { + "entry_type": "Zeitreise-Ansicht", + "initiate_flow": { + "user": "Zeitreise-Ansicht erstellen" + }, + "title": "Zeitreise-Ansicht erstellen", + "step": { + "user": { + "title": "Konfigurationseintrag auswählen", + "description": "Wähle den Konfigurationseintrag aus, für den du eine Zeitreise-Ansicht erstellen möchtest.\n\n**Zeitreise-Ansichten** ermöglichen es dir, historische Preisdaten so anzuzeigen, als wären sie die aktuellen Daten. Dies ist nützlich zum Testen von Automatisierungen oder zur Analyse vergangener Preismuster.", + "data": { + "parent_entry_id": "Konfigurationseintrag" + } + }, + "time_offset": { + "title": "Zeitversatz konfigurieren", + "description": "Konfiguriere, wie weit zurück in der Zeit diese Ansicht reisen soll.\n\n**Empfohlen:** Verwende **≥2 Tage** Versatz, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden, die ebenfalls historische Daten bereitstellen.\n\n**Beispiele:**\n• **-7 Tage**: Zeigt Preise von vor 7 Tagen\n• **-2 Tage, 3 Stunden**: Zeigt Preise von vor 2 Tagen und 3 Stunden\n• **-14 Tage**: Zeigt Preise von vor 2 Wochen", + "data": { + "virtual_time_offset_days": "Tage zurück", + "time_offset": "Zusätzlicher Zeitversatz" + }, + "data_description": { + "virtual_time_offset_days": "Wie viele Tage in die Vergangenheit reisen. Slider-Bereich: 0 bis 374 Tage (≈1 Jahr). Empfohlen: ≥2 Tage, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden.", + "time_offset": "Optionale Feinabstimmung: Füge Stunden und/oder Minuten zum Tagesversatz hinzu. Die Zeit wird automatisch subtrahiert (weiter zurück reisen). Hinweis: Sekunden werden ignoriert - nur minutengenaue Präzision wird unterstützt." + } + }, + "init": { + "title": "Zeitversatz neu konfigurieren", + "description": "Aktualisiere den Zeitversatz für diese Zeitreise-Ansicht.", + "data": { + "virtual_time_offset_days": "Tage zurück", + "time_offset": "Zusätzlicher Zeitversatz" + }, + "data_description": { + "virtual_time_offset_days": "Wie viele Tage in die Vergangenheit reisen. Slider-Bereich: 0 bis 374 Tage (≈1 Jahr). Empfohlen: ≥2 Tage, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden.", + "time_offset": "Optionale Feinabstimmung: Füge Stunden und/oder Minuten zum Tagesversatz hinzu. Die Zeit wird automatisch subtrahiert (weiter zurück reisen). Hinweis: Sekunden werden ignoriert - nur minutengenaue Präzision wird unterstützt." + } } - }, - "common": { - "step_progress": "{step_num} / {total_steps}", - "override_warning_template": "⚠️ {fields} wird durch Konfigurations-Entität gesteuert", - "override_warning_and": "und", - "override_field_label_best_price_min_period_length": "Mindestperiodenlänge", - "override_field_label_best_price_max_level_gap_count": "Lückentoleranz", - "override_field_label_best_price_flex": "Flexibilität", - "override_field_label_best_price_min_distance_from_avg": "Mindestabstand", - "override_field_label_enable_min_periods_best": "Mindestzahl erreichen", - "override_field_label_min_periods_best": "Mindestperioden", - "override_field_label_relaxation_attempts_best": "Lockerungsversuche", - "override_field_label_peak_price_min_period_length": "Mindestperiodenlänge", - "override_field_label_peak_price_max_level_gap_count": "Lückentoleranz", - "override_field_label_peak_price_flex": "Flexibilität", - "override_field_label_peak_price_min_distance_from_avg": "Mindestabstand", - "override_field_label_enable_min_periods_peak": "Mindestzahl erreichen", - "override_field_label_min_periods_peak": "Mindestperioden", - "override_field_label_relaxation_attempts_peak": "Lockerungsversuche" - }, - "config_subentries": { - "home": { - "entry_type": "Zeitreise-Ansicht", - "initiate_flow": { - "user": "Zeitreise-Ansicht erstellen" - }, - "title": "Zeitreise-Ansicht erstellen", - "step": { - "user": { - "title": "Konfigurationseintrag auswählen", - "description": "Wähle den Konfigurationseintrag aus, für den du eine Zeitreise-Ansicht erstellen möchtest.\n\n**Zeitreise-Ansichten** ermöglichen es dir, historische Preisdaten so anzuzeigen, als wären sie die aktuellen Daten. Dies ist nützlich zum Testen von Automatisierungen oder zur Analyse vergangener Preismuster.", - "data": { - "parent_entry_id": "Konfigurationseintrag" - } - }, - "time_offset": { - "title": "Zeitversatz konfigurieren", - "description": "Konfiguriere, wie weit zurück in der Zeit diese Ansicht reisen soll.\n\n**Empfohlen:** Verwende **≥2 Tage** Versatz, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden, die ebenfalls historische Daten bereitstellen.\n\n**Beispiele:**\n• **-7 Tage**: Zeigt Preise von vor 7 Tagen\n• **-2 Tage, 3 Stunden**: Zeigt Preise von vor 2 Tagen und 3 Stunden\n• **-14 Tage**: Zeigt Preise von vor 2 Wochen", - "data": { - "virtual_time_offset_days": "Tage zurück", - "time_offset": "Zusätzlicher Zeitversatz" - }, - "data_description": { - "virtual_time_offset_days": "Wie viele Tage in die Vergangenheit reisen. Slider-Bereich: 0 bis 374 Tage (≈1 Jahr). Empfohlen: ≥2 Tage, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden.", - "time_offset": "Optionale Feinabstimmung: Füge Stunden und/oder Minuten zum Tagesversatz hinzu. Die Zeit wird automatisch subtrahiert (weiter zurück reisen). Hinweis: Sekunden werden ignoriert - nur minutengenaue Präzision wird unterstützt." - } - }, - "init": { - "title": "Zeitversatz neu konfigurieren", - "description": "Aktualisiere den Zeitversatz für diese Zeitreise-Ansicht.", - "data": { - "virtual_time_offset_days": "Tage zurück", - "time_offset": "Zusätzlicher Zeitversatz" - }, - "data_description": { - "virtual_time_offset_days": "Wie viele Tage in die Vergangenheit reisen. Slider-Bereich: 0 bis 374 Tage (≈1 Jahr). Empfohlen: ≥2 Tage, um Konflikte mit \"yesterday\"-Entitäten zu vermeiden.", - "time_offset": "Optionale Feinabstimmung: Füge Stunden und/oder Minuten zum Tagesversatz hinzu. Die Zeit wird automatisch subtrahiert (weiter zurück reisen). Hinweis: Sekunden werden ignoriert - nur minutengenaue Präzision wird unterstützt." - } - } - }, - "error": { - "no_time_offset": "Mindestens ein Zeitversatzwert muss negativ sein (nur historische Daten)." - }, - "abort": { - "already_configured": "**Eine Zeitreise-Ansicht mit diesem exakten Zeitversatz existiert bereits.**\n\nBitte wähle einen anderen Versatz.", - "no_main_entries": "Keine Hauptkonfigurationseinträge gefunden. Füge zuerst ein Tibber-Zuhause hinzu.", - "parent_entry_not_found": "Ausgewählter Konfigurationseintrag nicht gefunden." - } + }, + "error": { + "no_time_offset": "Mindestens ein Zeitversatzwert muss negativ sein (nur historische Daten)." + }, + "abort": { + "already_configured": "**Eine Zeitreise-Ansicht mit diesem exakten Zeitversatz existiert bereits.**\n\nBitte wähle einen anderen Versatz.", + "no_main_entries": "Keine Hauptkonfigurationseinträge gefunden. Füge zuerst ein Tibber-Zuhause hinzu.", + "parent_entry_not_found": "Ausgewählter Konfigurationseintrag nicht gefunden." + } + } + }, + "options": { + "step": { + "init": { + "menu_options": { + "general_settings": "⚙️ Allgemeine Einstellungen", + "display_settings": "💱 Währungsanzeige", + "current_interval_price_rating": "📊 Preisbewertung", + "price_level": "🏷️ Preisniveau", + "volatility": "💨 Preis-Volatilität", + "best_price": "💚 Bestpreis", + "peak_price": "🔴 Spitzenpreis", + "price_trend": "📈 Preistrend", + "chart_data_export": "📊 Diagrammdaten-Export", + "reset_to_defaults": "🔄 Auf Werkseinstellungen zurücksetzen", + "finish": "⬅️ Zurück" } - }, - "options": { - "step": { - "init": { - "menu_options": { - "general_settings": "⚙️ Allgemeine Einstellungen", - "display_settings": "💱 Währungsanzeige", - "current_interval_price_rating": "📊 Preisbewertung", - "price_level": "🏷️ Preisniveau", - "volatility": "💨 Preis-Volatilität", - "best_price": "💚 Bestpreis", - "peak_price": "🔴 Spitzenpreis", - "price_trend": "📈 Preistrend", - "chart_data_export": "📊 Diagrammdaten-Export", - "reset_to_defaults": "🔄 Auf Werkseinstellungen zurücksetzen", - "finish": "⬅️ Zurück" - } + }, + "general_settings": { + "title": "⚙️ Allgemeine Einstellungen", + "description": "**Konfiguriere allgemeine Einstellungen für Tibber-Preisinformationen und -bewertungen.**\n\n---\n\n**Benutzer:** {user_login}", + "data": { + "extended_descriptions": "Erweiterte Beschreibungen", + "average_sensor_display": "Durchschnittsensor-Anzeige" + }, + "data_description": { + "extended_descriptions": "Steuert, ob Entitätsattribute ausführliche Erklärungen und Nutzungstipps enthalten.\n\n• Deaktiviert (Standard): Nur kurze Beschreibung\n• Aktiviert: Ausführliche Erklärung + praktische Nutzungsbeispiele\n\nBeispiel:\nDeaktiviert = 1 Attribut\nAktiviert = 2 zusätzliche Attribute", + "average_sensor_display": "Wähle aus, welcher statistische Wert im Sensorstatus für Durchschnitts-Preissensoren angezeigt wird. Der andere Wert wird als Attribut angezeigt.\n\n• **Median (Standard)**: Zeigt den 'typischen' Preis, resistent gegen Extremwerte - ideal für Anzeige und menschliche Interpretation\n• **Arithmetisches Mittel**: Zeigt den echten mathematischen Durchschnitt inkl. aller Preise - ideal für exakte Kostenberechnungen\n\nFür Automatisierungen nutze das Attribut `price_mean` oder `price_median`, um unabhängig von dieser Einstellung auf beide Werte zuzugreifen." + }, + "submit": "↩ Speichern & Zurück" + }, + "display_settings": { + "title": "💱 Währungsanzeige-Einstellungen", + "description": "**Konfiguriere, wie Strompreise angezeigt werden - in Basiswährung (€, kr) oder Unterwährungseinheit (ct, øre).**\n\n---", + "data": { + "currency_display_mode": "Anzeigemodus" + }, + "data_description": { + "currency_display_mode": "Wähle, wie Preise angezeigt werden:\n\n• **Basiswährung** (€/kWh, kr/kWh): Dezimalwerte (z.B. 0,25 €/kWh) - Unterschiede sichtbar ab 3.-4. Nachkommastelle\n• **Unterwährungseinheit** (ct/kWh, øre/kWh): Größere Werte (z.B. 25,00 ct/kWh) - Unterschiede bereits ab 1. Nachkommastelle sichtbar\n\nStandard abhängig von deiner Währung:\n• EUR → Unterwährungseinheit (Cent) - deutsche/niederländische Präferenz\n• NOK/SEK/DKK → Basiswährung (Kronen) - skandinavische Präferenz\n• USD/GBP → Basiswährung\n\n**💡 Tipp:** Bei Auswahl von Unterwährungseinheit kannst du den zusätzlichen Sensor \"Aktueller Strompreis (Energie-Dashboard)\" aktivieren (standardmäßig deaktiviert)." + }, + "submit": "↩ Speichern & Zurück" + }, + "current_interval_price_rating": { + "title": "📊 Preisbewertungs-Einstellungen", + "description": "**Konfiguriere Schwellenwerte und Stabilisierung für Preisbewertungsstufen (niedrig/normal/hoch) basierend auf dem Vergleich mit dem nachlaufenden 24-Stunden-Durchschnitt.**{entity_warning}", + "data": { + "price_rating_threshold_low": "Niedrig-Schwelle", + "price_rating_threshold_high": "Hoch-Schwelle", + "price_rating_hysteresis": "Hysterese", + "price_rating_gap_tolerance": "Lücken-Toleranz" + }, + "data_description": { + "price_rating_threshold_low": "Prozentwert, um wie viel der aktuelle Preis unter dem nachlaufenden 24-Stunden-Durchschnitt liegen muss, damit er als 'niedrig' bewertet wird. Beispiel: -10 bedeutet mindestens 10% unter Durchschnitt. Sensoren mit dieser Bewertung zeigen günstige Zeitfenster an. Standard: -10%", + "price_rating_threshold_high": "Prozentwert, um wie viel der aktuelle Preis über dem nachlaufenden 24-Stunden-Durchschnitt liegen muss, damit er als 'hoch' bewertet wird. Beispiel: 10 bedeutet mindestens 10% über Durchschnitt. Sensoren mit dieser Bewertung warnen vor teuren Zeitfenstern. Standard: 10%", + "price_rating_hysteresis": "Prozentband um die Schwellenwerte zur Vermeidung schneller Zustandswechsel. Wenn die Bewertung bereits NIEDRIG ist, muss der Preis über (Schwelle + Hysterese) steigen, um zu NORMAL zu wechseln. Ebenso muss bei HOCH der Preis unter (Schwelle - Hysterese) fallen, um den Zustand zu verlassen. Dies sorgt für Stabilität bei Automationen, die auf Bewertungsänderungen reagieren. Auf 0 setzen zum Deaktivieren. Standard: 2%", + "price_rating_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie sich von den umgebenden Bewertungen unterscheiden. Kleine isolierte Bewertungsänderungen werden in den dominanten Nachbarblock integriert. Dies sorgt für Stabilität bei Automationen, indem kurze Bewertungsspitzen keine unnötigen Aktionen auslösen. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall umgeben von 'hoch'-Intervallen zu 'hoch' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1" + }, + "submit": "↩ Speichern & Zurück" + }, + "best_price": { + "title": "💚 Bestpreis-Zeitraum Einstellungen", + "description": "**Konfiguration für den Bestpreis-Zeitraum mit den niedrigsten Strompreisen.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Zeitraumdauer & Preisniveaus", + "description": "Lege fest, wie lange Zeiträume sein sollen und welche Preisniveaus einbezogen werden.", + "data": { + "best_price_min_period_length": "Minimale Zeitraumlänge", + "best_price_max_level": "Preisniveau-Filter", + "best_price_max_level_gap_count": "Lückentoleranz" }, - "general_settings": { - "title": "⚙️ Allgemeine Einstellungen", - "description": "**Konfiguriere allgemeine Einstellungen für Tibber-Preisinformationen und -bewertungen.**\n\n---\n\n**Benutzer:** {user_login}", - "data": { - "extended_descriptions": "Erweiterte Beschreibungen", - "average_sensor_display": "Durchschnittsensor-Anzeige" - }, - "data_description": { - "extended_descriptions": "Steuert, ob Entitätsattribute ausführliche Erklärungen und Nutzungstipps enthalten.\n\n• Deaktiviert (Standard): Nur kurze Beschreibung\n• Aktiviert: Ausführliche Erklärung + praktische Nutzungsbeispiele\n\nBeispiel:\nDeaktiviert = 1 Attribut\nAktiviert = 2 zusätzliche Attribute", - "average_sensor_display": "Wähle aus, welcher statistische Wert im Sensorstatus für Durchschnitts-Preissensoren angezeigt wird. Der andere Wert wird als Attribut angezeigt.\n\n• **Median (Standard)**: Zeigt den 'typischen' Preis, resistent gegen Extremwerte - ideal für Anzeige und menschliche Interpretation\n• **Arithmetisches Mittel**: Zeigt den echten mathematischen Durchschnitt inkl. aller Preise - ideal für exakte Kostenberechnungen\n\nFür Automatisierungen nutze das Attribut `price_mean` oder `price_median`, um unabhängig von dieser Einstellung auf beide Werte zuzugreifen." - }, - "submit": "↩ Speichern & Zurück" - }, - "display_settings": { - "title": "💱 Währungsanzeige-Einstellungen", - "description": "**Konfiguriere, wie Strompreise angezeigt werden - in Basiswährung (€, kr) oder Unterwährungseinheit (ct, øre).**\n\n---", - "data": { - "currency_display_mode": "Anzeigemodus" - }, - "data_description": { - "currency_display_mode": "Wähle, wie Preise angezeigt werden:\n\n• **Basiswährung** (€/kWh, kr/kWh): Dezimalwerte (z.B. 0,25 €/kWh) - Unterschiede sichtbar ab 3.-4. Nachkommastelle\n• **Unterwährungseinheit** (ct/kWh, øre/kWh): Größere Werte (z.B. 25,00 ct/kWh) - Unterschiede bereits ab 1. Nachkommastelle sichtbar\n\nStandard abhängig von deiner Währung:\n• EUR → Unterwährungseinheit (Cent) - deutsche/niederländische Präferenz\n• NOK/SEK/DKK → Basiswährung (Kronen) - skandinavische Präferenz\n• USD/GBP → Basiswährung\n\n**💡 Tipp:** Bei Auswahl von Unterwährungseinheit kannst du den zusätzlichen Sensor \"Aktueller Strompreis (Energie-Dashboard)\" aktivieren (standardmäßig deaktiviert)." - }, - "submit": "↩ Speichern & Zurück" - }, - "current_interval_price_rating": { - "title": "📊 Preisbewertungs-Einstellungen", - "description": "**Konfiguriere Schwellenwerte und Stabilisierung für Preisbewertungsstufen (niedrig/normal/hoch) basierend auf dem Vergleich mit dem nachlaufenden 24-Stunden-Durchschnitt.**{entity_warning}", - "data": { - "price_rating_threshold_low": "Niedrig-Schwelle", - "price_rating_threshold_high": "Hoch-Schwelle", - "price_rating_hysteresis": "Hysterese", - "price_rating_gap_tolerance": "Lücken-Toleranz" - }, - "data_description": { - "price_rating_threshold_low": "Prozentwert, um wie viel der aktuelle Preis unter dem nachlaufenden 24-Stunden-Durchschnitt liegen muss, damit er als 'niedrig' bewertet wird. Beispiel: -10 bedeutet mindestens 10% unter Durchschnitt. Sensoren mit dieser Bewertung zeigen günstige Zeitfenster an. Standard: -10%", - "price_rating_threshold_high": "Prozentwert, um wie viel der aktuelle Preis über dem nachlaufenden 24-Stunden-Durchschnitt liegen muss, damit er als 'hoch' bewertet wird. Beispiel: 10 bedeutet mindestens 10% über Durchschnitt. Sensoren mit dieser Bewertung warnen vor teuren Zeitfenstern. Standard: 10%", - "price_rating_hysteresis": "Prozentband um die Schwellenwerte zur Vermeidung schneller Zustandswechsel. Wenn die Bewertung bereits NIEDRIG ist, muss der Preis über (Schwelle + Hysterese) steigen, um zu NORMAL zu wechseln. Ebenso muss bei HOCH der Preis unter (Schwelle - Hysterese) fallen, um den Zustand zu verlassen. Dies sorgt für Stabilität bei Automationen, die auf Bewertungsänderungen reagieren. Auf 0 setzen zum Deaktivieren. Standard: 2%", - "price_rating_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie sich von den umgebenden Bewertungen unterscheiden. Kleine isolierte Bewertungsänderungen werden in den dominanten Nachbarblock integriert. Dies sorgt für Stabilität bei Automationen, indem kurze Bewertungsspitzen keine unnötigen Aktionen auslösen. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall umgeben von 'hoch'-Intervallen zu 'hoch' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1" - }, - "submit": "↩ Speichern & Zurück" - }, - "best_price": { - "title": "💚 Bestpreis-Zeitraum Einstellungen", - "description": "**Konfiguration für den Bestpreis-Zeitraum mit den niedrigsten Strompreisen.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Zeitraumdauer & Preisniveaus", - "description": "Lege fest, wie lange Zeiträume sein sollen und welche Preisniveaus einbezogen werden.", - "data": { - "best_price_min_period_length": "Minimale Zeitraumlänge", - "best_price_max_level": "Preisniveau-Filter", - "best_price_max_level_gap_count": "Lückentoleranz" - }, - "data_description": { - "best_price_min_period_length": "Mindestdauer für einen Zeitraum um als 'Bestpreis' zu gelten. Längere Zeiträume sind praktischer für Geräte wie Geschirrspüler oder Wärmepumpen. Bestpreis-Zeiträume benötigen mindestens 60 Minuten (vs. 30 Minuten für Spitzenlast-Warnungen), da sie aussagekräftige Zeitfenster für die Verbrauchsplanung bieten sollten.", - "best_price_max_level": "Nur Bestpreis-Zeiträume anzeigen, wenn sie Intervalle mit Preisniveaus ≤ dem ausgewählten Wert enthalten. Beispiel: Auswahl '**Günstig**' bedeutet, der Zeitraum muss mindestens ein '**Sehr günstig**' oder '**Günstig**' Intervall enthalten. Dies stellt sicher, dass 'Bestpreis'-Zeiträume nicht nur relativ billig für den Tag sind, sondern auch absolut günstig. Wähle '**Alle**' um Bestpreise unabhängig vom absoluten Preisniveau anzuzeigen.", - "best_price_max_level_gap_count": "Maximale Anzahl aufeinanderfolgender Intervalle, die um genau eine Preisstufe vom erforderlichen Niveau abweichen dürfen. Beispiel: Mit '**Günstig**'-Filter und Lückenzähler 1 wird eine Sequenz '**Günstig**, **Günstig**, **Normal**, **Günstig**' akzeptiert (**Normal** ist eine Stufe über **Günstig**). Dies verhindert, dass Zeiträume durch gelegentliche Niveauabweichungen aufgeteilt werden. **Hinweis:** Lückentoleranz erfordert Zeiträume ≥90 Minuten (6 Intervalle), um Ausreißer effektiv zu erkennen. Standard: 0 (strikte Filterung, keine Toleranz)." - } - }, - "flexibility_settings": { - "name": "Flexibilität & Schwellenwerte", - "description": "Kontrolliere, wie sehr Preise abweichen dürfen und dennoch als 'Bestpreis' gelten.", - "data": { - "best_price_flex": "Flexibilität", - "best_price_min_distance_from_avg": "Mindestabstand" - }, - "data_description": { - "best_price_flex": "Maximale Menge über dem Tagesminimumpreis, um noch als 'Bestpreis' zu gelten. Empfohlen: 15-20% mit Lockerung aktiviert (Standard), oder 25-35% ohne Lockerung. Maximum: 50% (Hartgrenze für zuverlässige Zeitraumerkennung).", - "best_price_min_distance_from_avg": "Stellt sicher, dass Zeiträume erheblich günstiger als der Tagesdurchschnitt sind, nicht nur marginal darunter. Dies filtert Rauschen heraus und verhindert, dass leicht unterdurchschnittliche Zeiträume an flachen Preistagen als 'Bestpreis' markiert werden. Höhere Werte = strengere Filterung (nur wirklich billige Zeiträume gelten). Standard: 5 bedeutet Zeiträume müssen mindestens 5% unter dem Tagesdurchschnitt liegen." - } - }, - "relaxation_and_target_periods": { - "name": "Lockerung & Zielanzahl Zeiträume", - "description": "Konfiguriere automatische Filterlockerung und Zielanzahl von Zeiträumen. Aktiviere 'Mindestanzahl anstreben' um die Lockerung zu aktivieren.", - "data": { - "enable_min_periods_best": "Mindestanzahl anstreben", - "min_periods_best": "Mindestanzahl Zeiträume", - "relaxation_attempts_best": "Lockerungsversuche" - }, - "data_description": { - "enable_min_periods_best": "Bei Aktivierung werden Filter schrittweise gelockert, wenn nicht genug Zeiträume gefunden werden. Dies versucht, die gewünschte Mindestanzahl von Zeiträumen zu erreichen, was weniger optimale Zeitfenster als Bestpreis-Zeiträume einschließen kann.", - "min_periods_best": "Mindestanzahl von Bestpreis-Zeiträumen pro Tag, die angestrebt werden sollen. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv wenn 'Mindestanzahl anstreben' aktiviert ist. Standard: 1", - "relaxation_attempts_best": "Wie viele Flexibilitätsstufen (Versuche) zu versuchen sind, bevor aufgegeben wird. Jeder Versuch führt alle Filterkombinationen auf der neuen Flexibilitätsstufe aus. Mehr Versuche erhöhen die Chance, zusätzliche Zeiträume zu finden, kosten aber mehr Verarbeitungszeit." - } - } - }, - "submit": "↩ Speichern & Zurück" - }, - "peak_price": { - "title": "🔴 Spitzenpreis-Zeitraum Einstellungen", - "description": "**Konfiguration für den Spitzenpreis-Zeitraum mit den höchsten Strompreisen.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Zeitraum-Einstellungen", - "description": "Konfiguriere Zeitraumlänge und Preisniveau-Einschränkungen.", - "data": { - "peak_price_min_period_length": "Minimale Zeitraumlänge", - "peak_price_min_level": "Preisniveau-Filter", - "peak_price_max_level_gap_count": "Lückentoleranz" - }, - "data_description": { - "peak_price_min_period_length": "Minimale Dauer, damit ein Zeitraum als 'Spitzenpreis' gilt. Spitzenpreis-Warnungen sind für kürzere Zeiträume zulässig (mindestens 30 Minuten im Vergleich zu 60 Minuten für Bestpreis), da kurze teure Spitzen eine Warnung wert sind, auch wenn sie für die Verbrauchsplanung zu kurz sind.", - "peak_price_min_level": "Zeigt Spitzenpreis-Zeiträume nur an, wenn sie Intervalle mit Preisniveaus ≥ dem gewählten Wert enthalten. Beispiel: Wahl von '**Teuer**' bedeutet, dass der Zeitraum mindestens ein '**Teuer**' oder '**Sehr teuer**' Intervall haben muss. Dies stellt sicher, dass Spitzenpreis-Zeiträume nicht nur relativ teuer für den Tag sind, sondern tatsächlich teuer in absoluten Zahlen. Wähle '**Beliebig**' um Spitzenpreise unabhängig vom absoluten Preisniveau anzuzeigen.", - "peak_price_max_level_gap_count": "Maximale Anzahl aufeinanderfolgender Intervalle, die exakt um eine Niveaustufe vom geforderten Level abweichen dürfen. Beispiel: Bei Filter '**Teuer**' und Lückentoleranz 2 wird die Sequenz '**Teuer**, **Normal**, **Normal**, **Teuer**' akzeptiert (**Normal** ist eine Stufe unter **Teuer**). Dies verhindert, dass Zeiträume durch gelegentliche Niveau-Abweichungen aufgespalten werden. **Hinweis:** Lückentoleranz erfordert Zeiträume ≥90 Minuten (6 Intervalle), um Ausreißer effektiv zu erkennen. Standard: 0 (strenge Filterung, keine Toleranz)." - } - }, - "flexibility_settings": { - "name": "Flexibilitäts-Einstellungen", - "description": "Konfiguriere Preisvergleich-Schwellenwerte und Filterung.", - "data": { - "peak_price_flex": "Flexibilität", - "peak_price_min_distance_from_avg": "Mindestabstand" - }, - "data_description": { - "peak_price_flex": "Maximal unter dem täglichen Höchstpreis, bei dem Intervalle noch als 'Spitzenpreis' qualifizieren. Empfehlung: -15 bis -20 mit aktivierter Lockerung (Standard), oder -25 bis -35 ohne Lockerung. Maximum: -50 (harte Grenze für zuverlässige Zeitraumerkennung). Hinweis: Negative Werte zeigen den Abstand unter dem Maximum an.", - "peak_price_min_distance_from_avg": "Stellt sicher, dass Zeiträume signifikant teurer als der Tagesdurchschnitt sind, nicht nur geringfügig darüber. Dies filtert Rauschen und verhindert, dass leicht überdurchschnittliche Zeiträume an Tagen mit flachen Preisen als 'Spitzenpreis' markiert werden. Höhere Werte = strengere Filterung (nur wirklich teure Zeiträume qualifizieren). Standard: 5 bedeutet, Zeiträume müssen mindestens 5% über dem Tagesdurchschnitt liegen." - } - }, - "relaxation_and_target_periods": { - "name": "Lockerung & Zielzeiträume", - "description": "Konfiguriere automatische Filter-Lockerung und Zielzeiträume. Aktiviere 'Mindestanzahl anstreben' um Lockerung zu aktivieren.", - "data": { - "enable_min_periods_peak": "Mindestanzahl anstreben", - "min_periods_peak": "Mindestanzahl Zeiträume", - "relaxation_attempts_peak": "Lockerungsversuche" - }, - "data_description": { - "enable_min_periods_peak": "Wenn aktiviert, werden Filter schrittweise gelockert, falls nicht genug Zeiträume gefunden wurden. Dies versucht die gewünschte Mindestanzahl zu erreichen, um sicherzustellen, dass du auch an Tagen mit ungewöhnlichen Preismustern vor teuren Zeiträumen gewarnt wirst.", - "min_periods_peak": "Mindestanzahl an Spitzenpreis-Zeiträumen, die pro Tag angestrebt werden. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv, wenn 'Mindestanzahl Zeiträume anstreben' aktiviert ist. Standard: 1", - "relaxation_attempts_peak": "Wie viele Flex-Stufen (Versuche) nacheinander ausprobiert werden, bevor aufgegeben wird. Jeder Versuch testet alle Filterkombinationen auf der neuen Flex-Stufe. Mehr Versuche erhöhen die Chance auf zusätzliche Spitzenpreis-Zeiträume, benötigen aber etwas mehr Rechenzeit." - } - } - }, - "submit": "↩ Speichern & Zurück" - }, - "price_trend": { - "title": "📈 Preistrend-Schwellenwerte", - "description": "**Konfiguriere Schwellenwerte für Preistrend-Sensoren.** Diese Sensoren vergleichen den aktuellen Preis mit dem Durchschnitt der nächsten N Stunden, um festzustellen, ob die Preise steigen, fallen oder stabil sind.\n\n**5-Stufen-Skala:** Nutzt stark_fallend (-2), fallend (-1), stabil (0), steigend (+1), stark_steigend (+2) für Automations-Vergleiche über das trend_value Attribut.{entity_warning}", - "data": { - "price_trend_threshold_rising": "Steigend-Schwelle", - "price_trend_threshold_strongly_rising": "Stark steigend-Schwelle", - "price_trend_threshold_falling": "Fallend-Schwelle", - "price_trend_threshold_strongly_falling": "Stark fallend-Schwelle", - "price_trend_change_confirmation": "Trendwechsel-Bestätigung", - "price_trend_min_price_change": "Mind. Preisänderung (Trend)", - "price_trend_min_price_change_strongly": "Mind. Preisänderung (Starker Trend)" - }, - "data_description": { - "price_trend_threshold_rising": "Prozentwert, um wie viel der Durchschnitt der nächsten N Stunden über dem aktuellen Preis liegen muss, damit der Trend als 'steigend' gilt. Beispiel: 3 bedeutet Durchschnitt ist mindestens 3% höher → Preise werden steigen. Typische Werte: 3-10%. Standard: 3%", - "price_trend_threshold_strongly_rising": "Prozentwert für 'stark steigend'-Trend. Muss höher sein als die steigend-Schwelle. Beispiel: 9 bedeutet Durchschnitt ist mindestens 9% höher → Preise werden deutlich steigen. Typische Werte: 6-20%. Standard: 9%", - "price_trend_threshold_falling": "Prozentwert (negativ), um wie viel der Durchschnitt der nächsten N Stunden unter dem aktuellen Preis liegen muss, damit der Trend als 'fallend' gilt. Beispiel: -3 bedeutet Durchschnitt ist mindestens 3% niedriger → Preise werden fallen. Typische Werte: -3 bis -10%. Standard: -3%", - "price_trend_threshold_strongly_falling": "Prozentwert (negativ) für 'stark fallend'-Trend. Muss niedriger (negativer) sein als die fallend-Schwelle. Beispiel: -9 bedeutet Durchschnitt ist mindestens 9% niedriger → Preise werden deutlich fallen. Typische Werte: -6 bis -20%. Standard: -9%", - "price_trend_change_confirmation": "Anzahl aufeinanderfolgender 15-Minuten-Intervalle, die eine neue Trendrichtung bestätigen müssen, bevor ein Trendwechsel gemeldet wird. Höhere Werte bedeuten mehr Stabilität und weniger Fehlsignale, niedrigere Werte bedeuten schnellere Erkennung. Bereich: 2 (30 min) bis 6 (90 min). Standard: 3 (45 min)", - "price_trend_min_price_change": "Mindest-Preisdifferenz (in ct/øre), die für einen 'steigend'- oder 'fallend'-Trend erforderlich ist. Verhindert, dass minimale Preisänderungen bei niedrigem Preisniveau Trends auslösen. Auf 0 setzen zum Deaktivieren (reiner Prozentmodus). Standard: 0,5", - "price_trend_min_price_change_strongly": "Mindest-Preisdifferenz (in ct/øre), die für einen 'stark steigend'- oder 'stark fallend'-Trend erforderlich ist. Sollte höher als das reguläre Trend-Minimum sein. Auf 0 setzen zum Deaktivieren. Standard: 1,5" - }, - "submit": "↩ Speichern & Zurück" - }, - "volatility": { - "title": "💨 Volatilität Schwellenwerte", - "description": "**Konfiguriere Schwellenwerte für die Volatilitätsklassifizierung.** Volatilität misst relative Preisschwankungen anhand des Variationskoeffizienten (VK = Standardabweichung / Durchschnitt × 100%). Diese Schwellenwerte sind Prozentwerte, die für alle Preisniveaus funktionieren.\n\nVerwendet von:\n• Volatilitätssensoren (Klassifizierung)\n• Trend-Sensoren (adaptive Schwellenanpassung: <moderat = empfindlicher, ≥hoch = weniger empfindlich){entity_warning}", - "data": { - "volatility_threshold_moderate": "Moderat-Schwelle", - "volatility_threshold_high": "Hoch-Schwelle", - "volatility_threshold_very_high": "Sehr hoch-Schwelle" - }, - "data_description": { - "volatility_threshold_moderate": "Variationskoeffizient (VK) ab dem Preise als 'moderat volatil' gelten. VK = (Standardabweichung / Durchschnitt) × 100%. Beispiel: 15 bedeutet Preisschwankungen von ±15% um den Durchschnitt. Sensoren zeigen diese Klassifizierung an, Trend-Sensoren werden empfindlicher. Standard: 15%", - "volatility_threshold_high": "Variationskoeffizient (VK) ab dem Preise als 'hoch volatil' gelten. Beispiel: 30 bedeutet Preisschwankungen von ±30% um den Durchschnitt. Größere Preissprünge erwartet, Trend-Sensoren werden weniger empfindlich. Standard: 30%", - "volatility_threshold_very_high": "Variationskoeffizient (VK) ab dem Preise als 'sehr hoch volatil' gelten. Beispiel: 50 bedeutet extreme Preisschwankungen von ±50% um den Durchschnitt. An solchen Tagen sind starke Preisspitzen wahrscheinlich. Standard: 50%" - }, - "submit": "↩ Speichern & Zurück" - }, - "chart_data_export": { - "title": "📊 Chart Data Export Sensor", - "description": "Der Chart Data Export Sensor stellt Preisdaten als Sensor-Attribute zur Verfügung.\n\n⚠️ **Hinweis:** Dieser Sensor ist ein Legacy-Feature für Kompatibilität mit älteren Tools.\n\n**Für neue Setups empfohlen:** Nutze den `tibber_prices.get_chartdata` **Service direkt** - er ist flexibler, effizienter und der moderne Home Assistant-Ansatz.\n\n**Wann dieser Sensor sinnvoll ist:**\n\n✅ Dein Dashboard-Tool kann **nur** Attribute lesen (keine Service-Aufrufe)\n✅ Du brauchst statische Daten, die automatisch aktualisiert werden\n❌ **Nicht für Automationen:** Nutze dort direkt `tibber_prices.get_chartdata` - flexibler und effizienter!\n\n---\n\n{sensor_status_info}", - "submit": "↩ Ok & Zurück" - }, - "reset_to_defaults": { - "title": "🔄 Auf Werkseinstellungen zurücksetzen", - "description": "⚠️ **Warnung:** Dies setzt **ALLE** Einstellungen auf Werkseinstellungen zurück.\n\n**Was wird zurückgesetzt:**\n• Alle Preisbewertungs-Schwellwerte\n• Alle Volatilitäts-Schwellwerte\n• Alle Preistrend-Schwellwerte\n• Alle Einstellungen für Best-Price-Perioden\n• Alle Einstellungen für Peak-Price-Perioden\n• Anzeigeeinstellungen\n• Allgemeine Einstellungen\n\n**Was wird NICHT zurückgesetzt:**\n• Dein Tibber API-Token\n• Ausgewähltes Zuhause\n• Währung\n\n**💡 Tipp:** Nützlich, wenn du nach dem Experimentieren mit Einstellungen neu beginnen möchtest.", - "data": { - "confirm_reset": "Ja, alles auf Werkseinstellungen zurücksetzen" - }, - "submit": "Jetzt zurücksetzen" - }, - "price_level": { - "title": "🏷️ Preisniveau-Einstellungen (von Tibber API)", - "description": "**Konfiguriere die Stabilisierung für Tibbers Preisniveau-Klassifizierung (sehr günstig/günstig/normal/teuer/sehr teuer).**\n\nTibbers API liefert ein Preisniveau-Feld für jedes Intervall. Diese Einstellung glättet kurze Schwankungen, um Instabilität in Automatisierungen zu verhindern.{entity_warning}", - "data": { - "price_level_gap_tolerance": "Gap-Toleranz" - }, - "data_description": { - "price_level_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie von umgebenden Preisniveaus abweichen. Kleine isolierte Niveauänderungen werden mit dem dominanten Nachbarblock zusammengeführt. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall, umgeben von 'günstig'-Intervallen, zu 'günstig' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1" - }, - "submit": "↩ Speichern & Zurück" + "data_description": { + "best_price_min_period_length": "Mindestdauer für einen Zeitraum um als 'Bestpreis' zu gelten. Längere Zeiträume sind praktischer für Geräte wie Geschirrspüler oder Wärmepumpen. Bestpreis-Zeiträume benötigen mindestens 60 Minuten (vs. 30 Minuten für Spitzenlast-Warnungen), da sie aussagekräftige Zeitfenster für die Verbrauchsplanung bieten sollten.", + "best_price_max_level": "Nur Bestpreis-Zeiträume anzeigen, wenn sie Intervalle mit Preisniveaus ≤ dem ausgewählten Wert enthalten. Beispiel: Auswahl '**Günstig**' bedeutet, der Zeitraum muss mindestens ein '**Sehr günstig**' oder '**Günstig**' Intervall enthalten. Dies stellt sicher, dass 'Bestpreis'-Zeiträume nicht nur relativ billig für den Tag sind, sondern auch absolut günstig. Wähle '**Alle**' um Bestpreise unabhängig vom absoluten Preisniveau anzuzeigen.", + "best_price_max_level_gap_count": "Maximale Anzahl aufeinanderfolgender Intervalle, die um genau eine Preisstufe vom erforderlichen Niveau abweichen dürfen. Beispiel: Mit '**Günstig**'-Filter und Lückenzähler 1 wird eine Sequenz '**Günstig**, **Günstig**, **Normal**, **Günstig**' akzeptiert (**Normal** ist eine Stufe über **Günstig**). Dies verhindert, dass Zeiträume durch gelegentliche Niveauabweichungen aufgeteilt werden. **Hinweis:** Lückentoleranz erfordert Zeiträume ≥90 Minuten (6 Intervalle), um Ausreißer effektiv zu erkennen. Standard: 0 (strikte Filterung, keine Toleranz)." } + }, + "flexibility_settings": { + "name": "Flexibilität & Schwellenwerte", + "description": "Kontrolliere, wie sehr Preise abweichen dürfen und dennoch als 'Bestpreis' gelten.", + "data": { + "best_price_flex": "Flexibilität", + "best_price_min_distance_from_avg": "Mindestabstand" + }, + "data_description": { + "best_price_flex": "Maximale Menge über dem Tagesminimumpreis, um noch als 'Bestpreis' zu gelten. Empfohlen: 15-20% mit Lockerung aktiviert (Standard), oder 25-35% ohne Lockerung. Maximum: 50% (Hartgrenze für zuverlässige Zeitraumerkennung).", + "best_price_min_distance_from_avg": "Stellt sicher, dass Zeiträume erheblich günstiger als der Tagesdurchschnitt sind, nicht nur marginal darunter. Dies filtert Rauschen heraus und verhindert, dass leicht unterdurchschnittliche Zeiträume an flachen Preistagen als 'Bestpreis' markiert werden. Höhere Werte = strengere Filterung (nur wirklich billige Zeiträume gelten). Standard: 5 bedeutet Zeiträume müssen mindestens 5% unter dem Tagesdurchschnitt liegen." + } + }, + "relaxation_and_target_periods": { + "name": "Lockerung & Zielanzahl Zeiträume", + "description": "Konfiguriere automatische Filterlockerung und Zielanzahl von Zeiträumen. Aktiviere 'Mindestanzahl anstreben' um die Lockerung zu aktivieren.", + "data": { + "enable_min_periods_best": "Mindestanzahl anstreben", + "min_periods_best": "Mindestanzahl Zeiträume", + "relaxation_attempts_best": "Lockerungsversuche" + }, + "data_description": { + "enable_min_periods_best": "Bei Aktivierung werden Filter schrittweise gelockert, wenn nicht genug Zeiträume gefunden werden. Dies versucht, die gewünschte Mindestanzahl von Zeiträumen zu erreichen, was weniger optimale Zeitfenster als Bestpreis-Zeiträume einschließen kann.", + "min_periods_best": "Mindestanzahl von Bestpreis-Zeiträumen pro Tag, die angestrebt werden sollen. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv wenn 'Mindestanzahl anstreben' aktiviert ist. Standard: 1", + "relaxation_attempts_best": "Wie viele Flexibilitätsstufen (Versuche) zu versuchen sind, bevor aufgegeben wird. Jeder Versuch führt alle Filterkombinationen auf der neuen Flexibilitätsstufe aus. Mehr Versuche erhöhen die Chance, zusätzliche Zeiträume zu finden, kosten aber mehr Verarbeitungszeit." + } + }, + "extension_settings": { + "name": "Periodenrand-Erweiterung", + "description": "Erkannte Bestpreisperioden optional an beiden Rändern erweitern, um angrenzende sehr günstige Intervalle aufzunehmen.", + "data": { + "best_price_extend_to_very_cheap": "Auf sehr günstige Intervalle erweitern", + "best_price_max_extension_intervals": "Maximale Erweiterungsintervalle" + }, + "data_description": { + "best_price_extend_to_very_cheap": "Wenn aktiviert, erweitern sich erkannte Bestpreisperioden nach außen, um angrenzende Intervalle mit dem Preisniveau 'Sehr günstig' aufzunehmen. So werden extrem günstige Intervalle an den Rändern erkannter Perioden besser erfasst.", + "best_price_max_extension_intervals": "Maximale Anzahl zusätzlicher Intervalle pro Seite (linker und rechter Rand). Jedes Intervall dauert 15 Minuten. Beispiel: 4 Intervalle = bis zu 1 Stunde Erweiterung pro Rand. Standard: 4" + } + } }, - "error": { - "auth": "Der Tibber Zugangstoken ist ungültig.", - "connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.", - "unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.", - "cannot_connect": "Verbindung fehlgeschlagen", - "invalid_access_token": "Ungültiges Zugriffstoken", - "different_home": "Der Zugriffstoken ist nicht gültig für die Home ID, für die diese Integration konfiguriert ist.", - "invalid_flex": "Flexibilitätsprozentsatz muss zwischen -50% und +50% liegen", - "invalid_best_price_distance": "Distanzprozentsatz muss zwischen -50% und 0% liegen (negativ = unter Durchschnitt)", - "invalid_peak_price_distance": "Distanzprozentsatz muss zwischen 0% und 50% liegen (positiv = über Durchschnitt)", - "invalid_min_periods": "Mindestanzahl der Zeiträume muss zwischen 1 und 10 liegen", - "invalid_period_length": "Die Periodenlänge muss mindestens 15 Minuten betragen (Vielfache von 15).", - "invalid_gap_count": "Lückentoleranz muss zwischen 0 und 8 liegen", - "invalid_relaxation_attempts": "Lockerungsversuche müssen zwischen 1 und 12 liegen", - "invalid_price_rating_low": "Untere Preis-Bewertungsschwelle muss zwischen -50% und -5% liegen", - "invalid_price_rating_high": "Obere Preis-Bewertungsschwelle muss zwischen 5% und 50% liegen", - "invalid_price_rating_thresholds": "Untere Schwelle muss kleiner als obere Schwelle sein", - "invalid_volatility_threshold_moderate": "Moderate Volatilitätsschwelle muss zwischen 5% und 25% liegen", - "invalid_volatility_threshold_high": "Hohe Volatilitätsschwelle muss zwischen 20% und 40% liegen", - "invalid_volatility_threshold_very_high": "Sehr hohe Volatilitätsschwelle muss zwischen 35% und 80% liegen", - "invalid_volatility_thresholds": "Schwellenwerte müssen aufsteigend sein: moderat < hoch < sehr hoch", - "invalid_price_trend_rising": "Steigender Trendschwellenwert muss zwischen 1% und 50% liegen", - "invalid_price_trend_falling": "Fallender Trendschwellenwert muss zwischen -50% und -1% liegen", - "invalid_price_trend_strongly_rising": "Stark steigender Trendschwellenwert muss zwischen 2% und 100% liegen", - "invalid_price_trend_strongly_falling": "Stark fallender Trendschwellenwert muss zwischen -100% und -2% liegen", - "invalid_trend_strongly_rising_less_than_rising": "Stark steigend-Schwelle muss größer als steigend-Schwelle sein", - "invalid_trend_strongly_falling_greater_than_falling": "Stark fallend-Schwelle muss kleiner (negativer) als fallend-Schwelle sein" + "submit": "↩ Speichern & Zurück" + }, + "peak_price": { + "title": "🔴 Spitzenpreis-Zeitraum Einstellungen", + "description": "**Konfiguration für den Spitzenpreis-Zeitraum mit den höchsten Strompreisen.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Zeitraum-Einstellungen", + "description": "Konfiguriere Zeitraumlänge und Preisniveau-Einschränkungen.", + "data": { + "peak_price_min_period_length": "Minimale Zeitraumlänge", + "peak_price_min_level": "Preisniveau-Filter", + "peak_price_max_level_gap_count": "Lückentoleranz" + }, + "data_description": { + "peak_price_min_period_length": "Minimale Dauer, damit ein Zeitraum als 'Spitzenpreis' gilt. Spitzenpreis-Warnungen sind für kürzere Zeiträume zulässig (mindestens 30 Minuten im Vergleich zu 60 Minuten für Bestpreis), da kurze teure Spitzen eine Warnung wert sind, auch wenn sie für die Verbrauchsplanung zu kurz sind.", + "peak_price_min_level": "Zeigt Spitzenpreis-Zeiträume nur an, wenn sie Intervalle mit Preisniveaus ≥ dem gewählten Wert enthalten. Beispiel: Wahl von '**Teuer**' bedeutet, dass der Zeitraum mindestens ein '**Teuer**' oder '**Sehr teuer**' Intervall haben muss. Dies stellt sicher, dass Spitzenpreis-Zeiträume nicht nur relativ teuer für den Tag sind, sondern tatsächlich teuer in absoluten Zahlen. Wähle '**Beliebig**' um Spitzenpreise unabhängig vom absoluten Preisniveau anzuzeigen.", + "peak_price_max_level_gap_count": "Maximale Anzahl aufeinanderfolgender Intervalle, die exakt um eine Niveaustufe vom geforderten Level abweichen dürfen. Beispiel: Bei Filter '**Teuer**' und Lückentoleranz 2 wird die Sequenz '**Teuer**, **Normal**, **Normal**, **Teuer**' akzeptiert (**Normal** ist eine Stufe unter **Teuer**). Dies verhindert, dass Zeiträume durch gelegentliche Niveau-Abweichungen aufgespalten werden. **Hinweis:** Lückentoleranz erfordert Zeiträume ≥90 Minuten (6 Intervalle), um Ausreißer effektiv zu erkennen. Standard: 0 (strenge Filterung, keine Toleranz)." + } + }, + "flexibility_settings": { + "name": "Flexibilitäts-Einstellungen", + "description": "Konfiguriere Preisvergleich-Schwellenwerte und Filterung.", + "data": { + "peak_price_flex": "Flexibilität", + "peak_price_min_distance_from_avg": "Mindestabstand" + }, + "data_description": { + "peak_price_flex": "Maximal unter dem täglichen Höchstpreis, bei dem Intervalle noch als 'Spitzenpreis' qualifizieren. Empfehlung: -15 bis -20 mit aktivierter Lockerung (Standard), oder -25 bis -35 ohne Lockerung. Maximum: -50 (harte Grenze für zuverlässige Zeitraumerkennung). Hinweis: Negative Werte zeigen den Abstand unter dem Maximum an.", + "peak_price_min_distance_from_avg": "Stellt sicher, dass Zeiträume signifikant teurer als der Tagesdurchschnitt sind, nicht nur geringfügig darüber. Dies filtert Rauschen und verhindert, dass leicht überdurchschnittliche Zeiträume an Tagen mit flachen Preisen als 'Spitzenpreis' markiert werden. Höhere Werte = strengere Filterung (nur wirklich teure Zeiträume qualifizieren). Standard: 5 bedeutet, Zeiträume müssen mindestens 5% über dem Tagesdurchschnitt liegen." + } + }, + "relaxation_and_target_periods": { + "name": "Lockerung & Zielzeiträume", + "description": "Konfiguriere automatische Filter-Lockerung und Zielzeiträume. Aktiviere 'Mindestanzahl anstreben' um Lockerung zu aktivieren.", + "data": { + "enable_min_periods_peak": "Mindestanzahl anstreben", + "min_periods_peak": "Mindestanzahl Zeiträume", + "relaxation_attempts_peak": "Lockerungsversuche" + }, + "data_description": { + "enable_min_periods_peak": "Wenn aktiviert, werden Filter schrittweise gelockert, falls nicht genug Zeiträume gefunden wurden. Dies versucht die gewünschte Mindestanzahl zu erreichen, um sicherzustellen, dass du auch an Tagen mit ungewöhnlichen Preismustern vor teuren Zeiträumen gewarnt wirst.", + "min_periods_peak": "Mindestanzahl an Spitzenpreis-Zeiträumen, die pro Tag angestrebt werden. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv, wenn 'Mindestanzahl Zeiträume anstreben' aktiviert ist. Standard: 1", + "relaxation_attempts_peak": "Wie viele Flex-Stufen (Versuche) nacheinander ausprobiert werden, bevor aufgegeben wird. Jeder Versuch testet alle Filterkombinationen auf der neuen Flex-Stufe. Mehr Versuche erhöhen die Chance auf zusätzliche Spitzenpreis-Zeiträume, benötigen aber etwas mehr Rechenzeit." + } + }, + "extension_settings": { + "name": "Periodenrand-Erweiterung", + "description": "Erkannte Spitzenpreisperioden optional an beiden Rändern erweitern, um angrenzende sehr teure Intervalle aufzunehmen.", + "data": { + "peak_price_extend_to_very_expensive": "Auf sehr teure Intervalle erweitern", + "peak_price_max_extension_intervals": "Maximale Erweiterungsintervalle" + }, + "data_description": { + "peak_price_extend_to_very_expensive": "Wenn aktiviert, erweitern sich erkannte Spitzenpreisperioden nach außen, um angrenzende Intervalle mit dem Preisniveau 'Sehr teuer' aufzunehmen. So werden extrem teure Intervalle an den Rändern erkannter Perioden besser erfasst.", + "peak_price_max_extension_intervals": "Maximale Anzahl zusätzlicher Intervalle pro Seite (linker und rechter Rand). Jedes Intervall dauert 15 Minuten. Beispiel: 4 Intervalle = bis zu 1 Stunde Erweiterung pro Rand. Standard: 4" + } + } }, - "abort": { - "entry_not_found": "Tibber Konfigurationseintrag nicht gefunden.", - "reset_cancelled": "Zurücksetzen abgebrochen. Es wurden keine Änderungen an deiner Konfiguration vorgenommen.", - "reset_successful": "✅ Alle Einstellungen wurden auf Werkseinstellungen zurückgesetzt. Deine Konfiguration ist jetzt wie bei einer frischen Installation.", - "finished": "Konfiguration abgeschlossen." + "submit": "↩ Speichern & Zurück" + }, + "price_trend": { + "title": "📈 Preistrend-Schwellenwerte", + "description": "**Konfiguriere Schwellenwerte für Preistrend-Sensoren.** Diese Sensoren vergleichen den aktuellen Preis mit dem Durchschnitt der nächsten N Stunden, um festzustellen, ob die Preise steigen, fallen oder stabil sind.\n\n**5-Stufen-Skala:** Nutzt stark_fallend (-2), fallend (-1), stabil (0), steigend (+1), stark_steigend (+2) für Automations-Vergleiche über das trend_value Attribut.{entity_warning}", + "data": { + "price_trend_threshold_rising": "Steigend-Schwelle", + "price_trend_threshold_strongly_rising": "Stark steigend-Schwelle", + "price_trend_threshold_falling": "Fallend-Schwelle", + "price_trend_threshold_strongly_falling": "Stark fallend-Schwelle", + "price_trend_change_confirmation": "Trendwechsel-Bestätigung", + "price_trend_min_price_change": "Mind. Preisänderung (Trend)", + "price_trend_min_price_change_strongly": "Mind. Preisänderung (Starker Trend)" + }, + "data_description": { + "price_trend_threshold_rising": "Prozentwert, um wie viel der Durchschnitt der nächsten N Stunden über dem aktuellen Preis liegen muss, damit der Trend als 'steigend' gilt. Beispiel: 3 bedeutet Durchschnitt ist mindestens 3% höher → Preise werden steigen. Typische Werte: 3-10%. Standard: 3%", + "price_trend_threshold_strongly_rising": "Prozentwert für 'stark steigend'-Trend. Muss höher sein als die steigend-Schwelle. Beispiel: 9 bedeutet Durchschnitt ist mindestens 9% höher → Preise werden deutlich steigen. Typische Werte: 6-20%. Standard: 9%", + "price_trend_threshold_falling": "Prozentwert (negativ), um wie viel der Durchschnitt der nächsten N Stunden unter dem aktuellen Preis liegen muss, damit der Trend als 'fallend' gilt. Beispiel: -3 bedeutet Durchschnitt ist mindestens 3% niedriger → Preise werden fallen. Typische Werte: -3 bis -10%. Standard: -3%", + "price_trend_threshold_strongly_falling": "Prozentwert (negativ) für 'stark fallend'-Trend. Muss niedriger (negativer) sein als die fallend-Schwelle. Beispiel: -9 bedeutet Durchschnitt ist mindestens 9% niedriger → Preise werden deutlich fallen. Typische Werte: -6 bis -20%. Standard: -9%", + "price_trend_change_confirmation": "Anzahl aufeinanderfolgender 15-Minuten-Intervalle, die eine neue Trendrichtung bestätigen müssen, bevor ein Trendwechsel gemeldet wird. Höhere Werte bedeuten mehr Stabilität und weniger Fehlsignale, niedrigere Werte bedeuten schnellere Erkennung. Bereich: 2 (30 min) bis 6 (90 min). Standard: 3 (45 min)", + "price_trend_min_price_change": "Mindest-Preisdifferenz (in ct/øre), die für einen 'steigend'- oder 'fallend'-Trend erforderlich ist. Verhindert, dass minimale Preisänderungen bei niedrigem Preisniveau Trends auslösen. Auf 0 setzen zum Deaktivieren (reiner Prozentmodus). Standard: 0,5", + "price_trend_min_price_change_strongly": "Mindest-Preisdifferenz (in ct/øre), die für einen 'stark steigend'- oder 'stark fallend'-Trend erforderlich ist. Sollte höher als das reguläre Trend-Minimum sein. Auf 0 setzen zum Deaktivieren. Standard: 1,5" + }, + "submit": "↩ Speichern & Zurück" + }, + "volatility": { + "title": "💨 Volatilität Schwellenwerte", + "description": "**Konfiguriere Schwellenwerte für die Volatilitätsklassifizierung.** Volatilität misst relative Preisschwankungen anhand des Variationskoeffizienten (VK = Standardabweichung / Durchschnitt × 100%). Diese Schwellenwerte sind Prozentwerte, die für alle Preisniveaus funktionieren.\n\nVerwendet von:\n• Volatilitätssensoren (Klassifizierung)\n• Trend-Sensoren (adaptive Schwellenanpassung: <moderat = empfindlicher, ≥hoch = weniger empfindlich){entity_warning}", + "data": { + "volatility_threshold_moderate": "Moderat-Schwelle", + "volatility_threshold_high": "Hoch-Schwelle", + "volatility_threshold_very_high": "Sehr hoch-Schwelle" + }, + "data_description": { + "volatility_threshold_moderate": "Variationskoeffizient (VK) ab dem Preise als 'moderat volatil' gelten. VK = (Standardabweichung / Durchschnitt) × 100%. Beispiel: 15 bedeutet Preisschwankungen von ±15% um den Durchschnitt. Sensoren zeigen diese Klassifizierung an, Trend-Sensoren werden empfindlicher. Standard: 15%", + "volatility_threshold_high": "Variationskoeffizient (VK) ab dem Preise als 'hoch volatil' gelten. Beispiel: 30 bedeutet Preisschwankungen von ±30% um den Durchschnitt. Größere Preissprünge erwartet, Trend-Sensoren werden weniger empfindlich. Standard: 30%", + "volatility_threshold_very_high": "Variationskoeffizient (VK) ab dem Preise als 'sehr hoch volatil' gelten. Beispiel: 50 bedeutet extreme Preisschwankungen von ±50% um den Durchschnitt. An solchen Tagen sind starke Preisspitzen wahrscheinlich. Standard: 50%" + }, + "submit": "↩ Speichern & Zurück" + }, + "chart_data_export": { + "title": "📊 Chart Data Export Sensor", + "description": "Der Chart Data Export Sensor stellt Preisdaten als Sensor-Attribute zur Verfügung.\n\n⚠️ **Hinweis:** Dieser Sensor ist ein Legacy-Feature für Kompatibilität mit älteren Tools.\n\n**Für neue Setups empfohlen:** Nutze den `tibber_prices.get_chartdata` **Service direkt** - er ist flexibler, effizienter und der moderne Home Assistant-Ansatz.\n\n**Wann dieser Sensor sinnvoll ist:**\n\n✅ Dein Dashboard-Tool kann **nur** Attribute lesen (keine Service-Aufrufe)\n✅ Du brauchst statische Daten, die automatisch aktualisiert werden\n❌ **Nicht für Automationen:** Nutze dort direkt `tibber_prices.get_chartdata` - flexibler und effizienter!\n\n---\n\n{sensor_status_info}", + "submit": "↩ Ok & Zurück" + }, + "reset_to_defaults": { + "title": "🔄 Auf Werkseinstellungen zurücksetzen", + "description": "⚠️ **Warnung:** Dies setzt **ALLE** Einstellungen auf Werkseinstellungen zurück.\n\n**Was wird zurückgesetzt:**\n• Alle Preisbewertungs-Schwellwerte\n• Alle Volatilitäts-Schwellwerte\n• Alle Preistrend-Schwellwerte\n• Alle Einstellungen für Best-Price-Perioden\n• Alle Einstellungen für Peak-Price-Perioden\n• Anzeigeeinstellungen\n• Allgemeine Einstellungen\n\n**Was wird NICHT zurückgesetzt:**\n• Dein Tibber API-Token\n• Ausgewähltes Zuhause\n• Währung\n\n**💡 Tipp:** Nützlich, wenn du nach dem Experimentieren mit Einstellungen neu beginnen möchtest.", + "data": { + "confirm_reset": "Ja, alles auf Werkseinstellungen zurücksetzen" + }, + "submit": "Jetzt zurücksetzen" + }, + "price_level": { + "title": "🏷️ Preisniveau-Einstellungen (von Tibber API)", + "description": "**Konfiguriere die Stabilisierung für Tibbers Preisniveau-Klassifizierung (sehr günstig/günstig/normal/teuer/sehr teuer).**\n\nTibbers API liefert ein Preisniveau-Feld für jedes Intervall. Diese Einstellung glättet kurze Schwankungen, um Instabilität in Automatisierungen zu verhindern.{entity_warning}", + "data": { + "price_level_gap_tolerance": "Gap-Toleranz" + }, + "data_description": { + "price_level_gap_tolerance": "Maximale Anzahl aufeinanderfolgender Intervalle, die 'geglättet' werden können, wenn sie von umgebenden Preisniveaus abweichen. Kleine isolierte Niveauänderungen werden mit dem dominanten Nachbarblock zusammengeführt. Beispiel: 1 bedeutet, dass ein einzelnes 'normal'-Intervall, umgeben von 'günstig'-Intervallen, zu 'günstig' korrigiert wird. Auf 0 setzen zum Deaktivieren. Standard: 1" + }, + "submit": "↩ Speichern & Zurück" + } + }, + "error": { + "auth": "Der Tibber Zugangstoken ist ungültig.", + "connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.", + "unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.", + "cannot_connect": "Verbindung fehlgeschlagen", + "invalid_access_token": "Ungültiges Zugriffstoken", + "different_home": "Der Zugriffstoken ist nicht gültig für die Home ID, für die diese Integration konfiguriert ist.", + "invalid_flex": "Flexibilitätsprozentsatz muss zwischen -50% und +50% liegen", + "invalid_best_price_distance": "Distanzprozentsatz muss zwischen -50% und 0% liegen (negativ = unter Durchschnitt)", + "invalid_peak_price_distance": "Distanzprozentsatz muss zwischen 0% und 50% liegen (positiv = über Durchschnitt)", + "invalid_min_periods": "Mindestanzahl der Zeiträume muss zwischen 1 und 10 liegen", + "invalid_period_length": "Die Periodenlänge muss mindestens 15 Minuten betragen (Vielfache von 15).", + "invalid_gap_count": "Lückentoleranz muss zwischen 0 und 8 liegen", + "invalid_relaxation_attempts": "Lockerungsversuche müssen zwischen 1 und 12 liegen", + "invalid_price_rating_low": "Untere Preis-Bewertungsschwelle muss zwischen -50% und -5% liegen", + "invalid_price_rating_high": "Obere Preis-Bewertungsschwelle muss zwischen 5% und 50% liegen", + "invalid_price_rating_thresholds": "Untere Schwelle muss kleiner als obere Schwelle sein", + "invalid_volatility_threshold_moderate": "Moderate Volatilitätsschwelle muss zwischen 5% und 25% liegen", + "invalid_volatility_threshold_high": "Hohe Volatilitätsschwelle muss zwischen 20% und 40% liegen", + "invalid_volatility_threshold_very_high": "Sehr hohe Volatilitätsschwelle muss zwischen 35% und 80% liegen", + "invalid_volatility_thresholds": "Schwellenwerte müssen aufsteigend sein: moderat < hoch < sehr hoch", + "invalid_price_trend_rising": "Steigender Trendschwellenwert muss zwischen 1% und 50% liegen", + "invalid_price_trend_falling": "Fallender Trendschwellenwert muss zwischen -50% und -1% liegen", + "invalid_price_trend_strongly_rising": "Stark steigender Trendschwellenwert muss zwischen 2% und 100% liegen", + "invalid_price_trend_strongly_falling": "Stark fallender Trendschwellenwert muss zwischen -100% und -2% liegen", + "invalid_trend_strongly_rising_less_than_rising": "Stark steigend-Schwelle muss größer als steigend-Schwelle sein", + "invalid_trend_strongly_falling_greater_than_falling": "Stark fallend-Schwelle muss kleiner (negativer) als fallend-Schwelle sein" + }, + "abort": { + "entry_not_found": "Tibber Konfigurationseintrag nicht gefunden.", + "reset_cancelled": "Zurücksetzen abgebrochen. Es wurden keine Änderungen an deiner Konfiguration vorgenommen.", + "reset_successful": "✅ Alle Einstellungen wurden auf Werkseinstellungen zurückgesetzt. Deine Konfiguration ist jetzt wie bei einer frischen Installation.", + "finished": "Konfiguration abgeschlossen." + } + }, + "entity": { + "sensor": { + "current_interval_price": { + "name": "Aktueller Strompreis" + }, + "current_interval_price_base": { + "name": "Aktueller Strompreis (Energie-Dashboard)" + }, + "next_interval_price": { + "name": "Nächster Strompreis" + }, + "previous_interval_price": { + "name": "Vorheriger Strompreis" + }, + "current_hour_average_price": { + "name": "⌀ Stunden-Preis aktuell" + }, + "next_hour_average_price": { + "name": "⌀ Stunden-Preis nächste Stunde" + }, + "current_interval_price_level": { + "name": "Aktuelles Preisniveau", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" } - }, - "entity": { - "sensor": { - "current_interval_price": { - "name": "Aktueller Strompreis" - }, - "current_interval_price_base": { - "name": "Aktueller Strompreis (Energie-Dashboard)" - }, - "next_interval_price": { - "name": "Nächster Strompreis" - }, - "previous_interval_price": { - "name": "Vorheriger Strompreis" - }, - "current_hour_average_price": { - "name": "⌀ Stunden-Preis aktuell" - }, - "next_hour_average_price": { - "name": "⌀ Stunden-Preis nächste Stunde" - }, - "current_interval_price_level": { - "name": "Aktuelles Preisniveau", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "next_interval_price_level": { - "name": "Nächstes Preisniveau", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "previous_interval_price_level": { - "name": "Vorheriges Preisniveau", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "current_hour_price_level": { - "name": "Aktuelles Stunden-Preisniveau", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "next_hour_price_level": { - "name": "Nächstes Stunden-Preisniveau", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "lowest_price_today": { - "name": "Mindestpreis heute" - }, - "highest_price_today": { - "name": "Höchstpreis heute" - }, - "average_price_today": { - "name": "⌀ Preis heute" - }, - "lowest_price_tomorrow": { - "name": "Mindestpreis morgen" - }, - "highest_price_tomorrow": { - "name": "Höchstpreis morgen" - }, - "average_price_tomorrow": { - "name": "⌀ Preis morgen" - }, - "yesterday_price_level": { - "name": "Preisniveau gestern", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "today_price_level": { - "name": "Preisniveau heute", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "tomorrow_price_level": { - "name": "Preisniveau morgen", - "state": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } - }, - "yesterday_price_rating": { - "name": "Preisbewertung gestern", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "today_price_rating": { - "name": "Preisbewertung heute", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "tomorrow_price_rating": { - "name": "Preisbewertung morgen", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "trailing_price_average": { - "name": "⌀ Preis nachlaufend 24h" - }, - "leading_price_average": { - "name": "⌀ Preis vorlaufend 24h" - }, - "trailing_price_min": { - "name": "24h-Mindestpreis nachlaufend" - }, - "trailing_price_max": { - "name": "24h-Höchstpreis nachlaufend" - }, - "leading_price_min": { - "name": "24h-Mindestpreis vorlaufend" - }, - "leading_price_max": { - "name": "24h-Höchstpreis vorlaufend" - }, - "current_interval_price_rating": { - "name": "Aktuelle Preisbewertung", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "next_interval_price_rating": { - "name": "Nächste Preisbewertung", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "previous_interval_price_rating": { - "name": "Vorherige Preisbewertung", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "current_hour_price_rating": { - "name": "Aktuelle Stunden-Preisbewertung", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "next_hour_price_rating": { - "name": "Nächste Stunden-Preisbewertung", - "state": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "next_avg_1h": { - "name": "⌀ Preis nächste 1h" - }, - "next_avg_2h": { - "name": "⌀ Preis nächste 2h" - }, - "next_avg_3h": { - "name": "⌀ Preis nächste 3h" - }, - "next_avg_4h": { - "name": "⌀ Preis nächste 4h" - }, - "next_avg_5h": { - "name": "⌀ Preis nächste 5h" - }, - "next_avg_6h": { - "name": "⌀ Preis nächste 6h" - }, - "next_avg_8h": { - "name": "⌀ Preis nächste 8h" - }, - "next_avg_12h": { - "name": "⌀ Preis nächste 12h" - }, - "price_outlook_1h": { - "name": "Preisausblick (1h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_2h": { - "name": "Preisausblick (2h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_3h": { - "name": "Preisausblick (3h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_4h": { - "name": "Preisausblick (4h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_5h": { - "name": "Preisausblick (5h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_6h": { - "name": "Preisausblick (6h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_8h": { - "name": "Preisausblick (8h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_outlook_12h": { - "name": "Preisausblick (12h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_2h": { - "name": "Preisverlauf (2h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_3h": { - "name": "Preisverlauf (3h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_4h": { - "name": "Preisverlauf (4h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_5h": { - "name": "Preisverlauf (5h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_6h": { - "name": "Preisverlauf (6h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_8h": { - "name": "Preisverlauf (8h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "price_trajectory_12h": { - "name": "Preisverlauf (12h)", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "current_price_trend": { - "name": "Aktueller Preistrend", - "state": { - "strongly_rising": "Stark steigend", - "rising": "Steigend", - "stable": "Stabil", - "falling": "Fallend", - "strongly_falling": "Stark fallend" - } - }, - "next_price_trend_change": { - "name": "Nächste Trendänderung" - }, - "next_price_trend_change_in": { - "name": "Nächste Trendänderung in" - }, - "daily_rating": { - "name": "Tägliche Preisbewertung" - }, - "monthly_rating": { - "name": "Monatliche Preisbewertung" - }, - "data_lifecycle_status": { - "name": "Datenlebenszyklus-Status", - "state": { - "cached": "Zwischengespeichert", - "fresh": "Frisch", - "refreshing": "Aktualisiere", - "searching_tomorrow": "Suche Morgendaten", - "turnover_pending": "Mitternachtswechsel steht bevor", - "error": "Fehler" - } - }, - "today_volatility": { - "name": "Volatilität heute", - "state": { - "low": "Niedrig", - "moderate": "Moderat", - "high": "Hoch", - "very_high": "Sehr hoch" - } - }, - "tomorrow_volatility": { - "name": "Volatilität morgen", - "state": { - "low": "Niedrig", - "moderate": "Moderat", - "high": "Hoch", - "very_high": "Sehr hoch" - } - }, - "next_24h_volatility": { - "name": "Volatilität der nächsten 24h", - "state": { - "low": "Niedrig", - "moderate": "Moderat", - "high": "Hoch", - "very_high": "Sehr hoch" - } - }, - "today_tomorrow_volatility": { - "name": "Volatilität heute+morgen", - "state": { - "low": "Niedrig", - "moderate": "Moderat", - "high": "Hoch", - "very_high": "Sehr hoch" - } - }, - "best_price_end_time": { - "name": "Bestpreis endet" - }, - "best_price_period_duration": { - "name": "Bestpreis Dauer" - }, - "best_price_remaining_minutes": { - "name": "Bestpreis verbleibend" - }, - "best_price_progress": { - "name": "Bestpreis Fortschritt" - }, - "best_price_next_start_time": { - "name": "Bestpreis startet" - }, - "best_price_next_in_minutes": { - "name": "Bestpreis startet in" - }, - "peak_price_end_time": { - "name": "Spitzenpreis endet" - }, - "peak_price_period_duration": { - "name": "Spitzenpreis Dauer" - }, - "peak_price_remaining_minutes": { - "name": "Spitzenpreis verbleibend" - }, - "peak_price_progress": { - "name": "Spitzenpreis Fortschritt" - }, - "peak_price_next_start_time": { - "name": "Spitzenpreis startet" - }, - "peak_price_next_in_minutes": { - "name": "Spitzenpreis startet in" - }, - "home_type": { - "name": "Wohnungstyp", - "state": { - "apartment": "Wohnung", - "rowhouse": "Reihenhaus", - "house": "Haus", - "cottage": "Ferienhaus" - } - }, - "home_size": { - "name": "Wohnfläche" - }, - "main_fuse_size": { - "name": "Hauptsicherung" - }, - "number_of_residents": { - "name": "Anzahl Bewohner" - }, - "primary_heating_source": { - "name": "Primäre Heizquelle", - "state": { - "air2air_heatpump": "Luft-Luft-Wärmepumpe", - "air2water_heatpump": "Luft-Wasser-Wärmepumpe", - "boiler": "Boiler", - "central_heating": "Zentralheizung", - "district_heating": "Fernwärme", - "district": "Fernwärme", - "electric_boiler": "Elektroboiler", - "electricity": "Elektroheizung", - "floor": "Fußbodenheizung", - "gas": "Gas", - "ground_heatpump": "Erdwärmepumpe", - "ground": "Erdwärmepumpe", - "oil": "Öl", - "other": "Sonstige", - "waste": "Abwärme" - } - }, - "grid_company": { - "name": "Netzbetreiber" - }, - "grid_area_code": { - "name": "Netzgebietscode" - }, - "price_area_code": { - "name": "Preiszonencode" - }, - "consumption_ean": { - "name": "Verbrauchs-EAN" - }, - "production_ean": { - "name": "Erzeugungs-EAN" - }, - "energy_tax_type": { - "name": "Energiesteuertyp" - }, - "vat_type": { - "name": "Mehrwertsteuertyp" - }, - "estimated_annual_consumption": { - "name": "Geschätzter Jahresverbrauch" - }, - "subscription_status": { - "name": "Abonnementstatus", - "state": { - "running": "Aktiv", - "ended": "Beendet", - "pending": "Ausstehend", - "unknown": "Unbekannt" - } - }, - "day_pattern_yesterday": { - "name": "Preismuster Gestern", - "state": { - "valley": "Tal", - "peak": "Gipfel", - "double_valley": "Doppeltal", - "double_peak": "Doppelgipfel", - "flat": "Flach", - "rising": "Steigend", - "falling": "Fallend", - "mixed": "Gemischt" - } - }, - "day_pattern_today": { - "name": "Preismuster Heute", - "state": { - "valley": "Tal", - "peak": "Gipfel", - "double_valley": "Doppeltal", - "double_peak": "Doppelgipfel", - "flat": "Flach", - "rising": "Steigend", - "falling": "Fallend", - "mixed": "Gemischt" - } - }, - "day_pattern_tomorrow": { - "name": "Preismuster Morgen", - "state": { - "valley": "Tal", - "peak": "Gipfel", - "double_valley": "Doppeltal", - "double_peak": "Doppelgipfel", - "flat": "Flach", - "rising": "Steigend", - "falling": "Fallend", - "mixed": "Gemischt" - } - }, - "chart_data_export": { - "name": "Diagramm-Datenexport", - "state": { - "pending": "Ausstehend", - "ready": "Bereit", - "error": "Fehler" - } - }, - "chart_metadata": { - "name": "Diagramm-Metadaten", - "state": { - "pending": "Ausstehend", - "ready": "Bereit", - "error": "Fehler" - } - } - }, - "binary_sensor": { - "peak_price_period": { - "name": "Spitzenpreis-Zeitraum" - }, - "best_price_period": { - "name": "Bestpreis-Zeitraum" - }, - "connection": { - "name": "Tibber-API-Verbindung" - }, - "tomorrow_data_available": { - "name": "Morgige Daten verfügbar" - }, - "has_ventilation_system": { - "name": "Hat Lüftungsanlage" - }, - "realtime_consumption_enabled": { - "name": "Echtzeitverbrauch aktiviert" - } - }, - "number": { - "best_price_flex_override": { - "name": "Bestpreis: Flexibilität" - }, - "best_price_min_distance_override": { - "name": "Bestpreis: Mindestabstand" - }, - "best_price_min_period_length_override": { - "name": "Bestpreis: Mindestperiodenlänge" - }, - "best_price_min_periods_override": { - "name": "Bestpreis: Mindestperioden" - }, - "best_price_relaxation_attempts_override": { - "name": "Bestpreis: Lockerungsversuche" - }, - "best_price_gap_count_override": { - "name": "Bestpreis: Lückentoleranz" - }, - "peak_price_flex_override": { - "name": "Spitzenpreis: Flexibilität" - }, - "peak_price_min_distance_override": { - "name": "Spitzenpreis: Mindestabstand" - }, - "peak_price_min_period_length_override": { - "name": "Spitzenpreis: Mindestperiodenlänge" - }, - "peak_price_min_periods_override": { - "name": "Spitzenpreis: Mindestperioden" - }, - "peak_price_relaxation_attempts_override": { - "name": "Spitzenpreis: Lockerungsversuche" - }, - "peak_price_gap_count_override": { - "name": "Spitzenpreis: Lückentoleranz" - } - }, - "switch": { - "best_price_enable_relaxation_override": { - "name": "Bestpreis: Mindestanzahl erreichen" - }, - "peak_price_enable_relaxation_override": { - "name": "Spitzenpreis: Mindestanzahl erreichen" - } + }, + "next_interval_price_level": { + "name": "Nächstes Preisniveau", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" } - }, - "issues": { - "new_homes_available": { - "title": "Neue Tibber-Häuser erkannt", - "description": "Wir haben {count} neue(s) Zuhause in deinem Tibber-Konto erkannt: {homes}. Du kannst diese über die Tibber-Integration in Home Assistant hinzufügen." - }, - "homes_removed": { - "title": "Tibber-Häuser entfernt", - "description": "Wir haben erkannt, dass {count} Zuhause aus deinem Tibber-Konto entfernt wurde(n): {homes}. Bitte überprüfe deine Tibber-Integrationskonfiguration." - }, - "tomorrow_data_missing": { - "title": "Preisdaten für morgen fehlen für {home_name}", - "description": "Die Strompreisdaten für morgen sind nach {warning_hour}:00 Uhr immer noch nicht verfügbar. Das ist ungewöhnlich, da Tibber normalerweise die Preise für morgen am Nachmittag veröffentlicht (ca. 13:00-14:00 Uhr MEZ).\n\nMögliche Ursachen:\n- Tibber hat die Preise für morgen noch nicht veröffentlicht\n- Temporäre API-Probleme\n- Dein Stromanbieter hat die Preise noch nicht an Tibber übermittelt\n\nDieses Problem löst sich automatisch, sobald die Daten für morgen verfügbar sind. Falls dies nach 20:00 Uhr weiterhin besteht, prüfe bitte die Tibber-App oder kontaktiere den Tibber-Support." - }, - "rate_limit_exceeded": { - "title": "API-Ratenlimit erreicht für {home_name}", - "description": "Die Tibber-API hat diese Integration nach {error_count} aufeinanderfolgenden Fehlern ratenlimitiert. Das bedeutet, dass Anfragen zu häufig gestellt werden.\n\nDie Integration wird automatisch mit zunehmenden Verzögerungen erneut versuchen. Dieses Problem löst sich, sobald das Ratenlimit abläuft.\n\nFalls dies mehrere Stunden anhält, überprüfe:\n- Ob mehrere Home Assistant Instanzen denselben API-Token verwenden\n- Ob andere Anwendungen deinen Tibber-API-Token stark nutzen\n- Die Update-Frequenz reduzieren, falls du sie angepasst hast" - }, - "home_not_found": { - "title": "Zuhause {home_name} nicht im Tibber-Konto gefunden", - "description": "Das in dieser Integration konfigurierte Zuhause (Eintrag-ID: {entry_id}) ist nicht mehr in deinem Tibber-Konto verfügbar. Dies passiert normalerweise, wenn:\n- Das Zuhause aus deinem Tibber-Konto gelöscht wurde\n- Das Zuhause zu einem anderen Tibber-Konto verschoben wurde\n- Der Zugriff auf dieses Zuhause widerrufen wurde\n\nBitte entferne diesen Integrationseintrag und füge ihn erneut hinzu, falls das Zuhause weiterhin überwacht werden soll. Um diesen Eintrag zu entfernen, gehe zu Einstellungen → Geräte & Dienste → Tibber Prices und lösche die Konfiguration {home_name}." - }, - "entity_migration": { - "title": "Tibber Prices: Aktion nach Update erforderlich ({home_name})", - "description": "Dieses Update enthält Breaking Changes, die automatisch angewendet wurden.\n\n**Umbenannte Entitäten ({count})**\n\nDie folgenden Entity-Keys wurden umbenannt. Deine bestehenden Entity-IDs und Automationen bleiben erhalten:\n\n{entity_list}\n\n**Geänderte Dauer-Sensorwerte**\n\nAlle Dauer-Sensoren (verbleibende Zeit, startet in, Periodendauer, Trendänderungs-Countdown) geben ihren Zustandswert jetzt in **Minuten** statt Stunden an. Die Anzeigeeinheit in Dashboards bleibt standardmäßig Stunden.\n\nWenn du Automationen mit numerischen Vergleichen auf diesen Sensoren hast, aktualisiere deine Schwellwerte:\n- Alt: `state < 0.25` (15 Minuten als Stunden)\n- Neu: `state < 15` (15 Minuten)\n\nSchließe diesen Hinweis, nachdem du deine Automationen überprüft hast." + }, + "previous_interval_price_level": { + "name": "Vorheriges Preisniveau", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" } - }, - "exceptions": { - "no_entries_found": { - "message": "Keine Tibber Prices Integrationseinträge gefunden. Bitte richte die Integration zuerst ein." - }, - "multiple_entries_no_entry_id": { - "message": "Mehrere Tibber Prices Einträge gefunden. Bitte gib 'entry_id' an, um den gewünschten Eintrag auszuwählen." - }, - "invalid_entry_id": { - "message": "Ungültige oder nicht verfügbare Konfigurations-Entry. Bitte überprüfe die Entry-ID und stelle sicher, dass die Integration geladen ist." - }, - "missing_home_id": { - "message": "Home-ID nicht im Konfigurationseintrag gefunden. Bitte konfiguriere die Integration neu." - }, - "user_data_not_available": { - "message": "Benutzerdaten sind noch nicht verfügbar. Bitte warte, bis das erste Datenupdate abgeschlossen ist." - }, - "timezone_not_found": { - "message": "Zeitzone des Zuhauses konnte nicht ermittelt werden. Bitte überprüfe die Konfiguration in deinem Tibber-Konto." - }, - "end_before_start": { - "message": "Endzeit muss nach der Startzeit liegen." - }, - "price_fetch_failed": { - "message": "Preisdaten konnten nicht von der Tibber-API abgerufen werden. Bitte versuche es später erneut." - }, - "invalid_search_scope": { - "message": "Ungültiger Suchbereich. Gültige Werte sind: today, tomorrow, remaining_today, next_24h, next_48h." - }, - "scope_conflicts_with_range": { - "message": "search_scope kann nicht mit expliziten Bereichsparametern kombiniert werden: {params}. Verwende entweder search_scope ODER explizite Start-/Endparameter." - }, - "day_offset_requires_time": { - "message": "{offset_param} erfordert, dass {time_param} gesetzt ist. Der Tagesoffset ändert nur das Datum eines expliziten Zeitparameters." - }, - "min_level_exceeds_max": { - "message": "min_price_level '{min_level}' ist höher als max_price_level '{max_level}'. Das Mindestlevel muss gleich oder niedriger als das Maximallevel sein." - }, - "power_profile_length_mismatch": { - "message": "power_profile hat {profile_length} Einträge, aber die Dauer erfordert {interval_count} Intervalle ({duration_minutes} Minuten). Das power_profile muss genau einen Eintrag pro 15-Minuten-Intervall haben." - }, - "level_and_rating_filter_conflict": { - "message": "level_filter und rating_level_filter können nicht gleichzeitig verwendet werden. Verwende nur einen Filtertyp pro Anfrage." - }, - "insert_nulls_requires_filter": { - "message": "insert_nulls-Modus '{mode}' erfordert einen level_filter oder rating_level_filter zur Segmentdefinition. Ohne Filter verwende insert_nulls: none." - }, - "connect_segments_requires_segments_mode": { - "message": "connect_segments erfordert, dass insert_nulls auf 'segments' gesetzt ist. Setze insert_nulls: segments, um Segmentverbindung zu nutzen." - }, - "array_fields_requires_array_format": { - "message": "array_fields kann nur mit output_format: array_of_arrays verwendet werden. Ändere das Ausgabeformat oder entferne array_fields." - }, - "invalid_array_fields": { - "message": "Ungültige array_fields-Vorlage. Verwende Feldnamen in geschweiften Klammern, z.B. '{start_time}, {price_per_kwh}, {level}'." + }, + "current_hour_price_level": { + "name": "Aktuelles Stunden-Preisniveau", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" } - }, - "services": { - "get_price": { - "name": "Preisdaten abrufen", - "description": "Preisdaten für einen bestimmten Zeitraum mit automatischem Routing abrufen. Entwicklungs- und Test-Service für die price_info_for_range API-Funktion. Verwendet automatisch PRICE_INFO, PRICE_INFO_RANGE oder beide basierend auf der Zeitraumgrenze.", - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurations-Eintrag-ID für die Tibber-Integration." - }, - "start_time": { - "name": "Startzeit", - "description": "Start des Zeitraums (inklusive, zeitzonenbewusst)." - }, - "end_time": { - "name": "Endzeit", - "description": "Ende des Zeitraums (exklusive, zeitzonenbewusst)." - } - } - }, - "get_apexcharts_yaml": { - "name": "ApexCharts-Karten-YAML abrufen", - "description": "⚠️ WICHTIG: Dieser Service generiert eine GRUNDLEGENDE BEISPIEL-Konfiguration für die ApexCharts-Karte als Startpunkt. Es ist KEINE vollständige Lösung für alle ApexCharts-Funktionen. Diese Integration ist primär ein DATENLIEFERANT. Das generierte YAML zeigt, wie du den `get_chartdata`-Service zum Abrufen von Preisdaten nutzt. Aufgrund der segmentierten Natur unserer Daten (verschiedene Zeitabschnitte pro Serie) und der Nutzung von Home Assistants Service-API statt Entity-Attributen sind viele erweiterte ApexCharts-Funktionen (wie in_header, bestimmte Transformationen) nicht kompatibel oder erfordern manuelle Anpassung. Du darfst das generierte YAML gerne für deine spezifischen Bedürfnisse anpassen, aber bitte verstehe, dass umfassender ApexCharts-Konfigurations-Support außerhalb des Umfangs dieser Integration liegt. Community-Beiträge mit verbesserten Konfigurationen sind immer willkommen - wenn du ein besseres Setup findest, das funktioniert, teile es bitte, damit alle davon profitieren können! Für direkten Datenzugriff zum Erstellen eigener Diagramme nutze stattdessen den `get_chartdata`-Service.", - "fields": { - "entry_id": { - "name": "Eintrags-ID", - "description": "Die Konfigurationseintrags-ID für die Tibber-Integration." - }, - "day": { - "name": "Tag", - "description": "Welcher Tag visualisiert werden soll (Standard: Rollierendes Fenster). Feste Tag-Optionen (Gestern/Heute/Morgen) zeigen 24h-Fenster ohne zusätzliche Abhängigkeiten. Dynamische Optionen benötigen config-template-card: Rollierendes Fenster zeigt ein festes 48h-Fenster, das automatisch zwischen gestern+heute und heute+morgen wechselt basierend auf Datenverfügbarkeit. Rollierendes Fenster (Auto-Zoom) verhält sich gleich, zoomt aber zusätzlich automatisch rein (2h Rückblick + verbleibende Zeit bis Mitternacht, graph_span verringert sich alle 15 Minuten)." - }, - "level_type": { - "name": "Stufen-Typ", - "description": "Wähle, welche Preisstufen-Klassifizierung visualisiert werden soll: 'rating_level' (niedrig/normal/hoch basierend auf deinen konfigurierten Schwellenwerten) oder 'level' (Tibber-API-Stufen: sehr günstig/günstig/normal/teuer/sehr teuer)." - }, - "highlight_best_price": { - "name": "Bestpreis-Zeiträume hervorheben", - "description": "Füge eine halbtransparente grüne Überlagerung hinzu, um die Bestpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der optimalen Zeiten für den Energieverbrauch." - }, - "highlight_peak_price": { - "name": "Spitzenpreis-Zeiträume hervorheben", - "description": "Füge eine halbtransparente rote Überlagerung hinzu, um die Spitzenpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der Zeiten, in denen Energie am teuersten ist." - }, - "resolution": { - "name": "Auflösung", - "description": "Zeitauflösung für die Diagrammdaten. 'interval' (Standard): Originale 15-Minuten-Intervalle (96 Punkte pro Tag). 'hourly': Aggregierte Stundenwerte mit einem rollierenden 60-Minuten-Fenster (24 Punkte pro Tag) für ein übersichtlicheres Diagramm." - } - } - }, - "get_chartdata": { - "name": "Diagrammdaten abrufen", - "description": "Gibt Preisdaten in einem einfachen, diagrammfreundlichen Format kompatibel mit der Tibber Core Integration zurück. Perfekt für beliebte Diagramm-Karten wie ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card oder die eingebaute History Graph Card. Feldnamen und Datenstruktur können an die Anforderungen deines Diagramms angepasst werden.", - "sections": { - "general": { - "name": "Allgemein", - "description": "Basisoptionen für das Abrufen von Diagrammdaten." - }, - "selection": { - "name": "Auswahl", - "description": "Wähle aus, welche Daten in die Ausgabe aufgenommen werden sollen." - }, - "filters": { - "name": "Filter", - "description": "Filtere Daten basierend auf Preisniveaus, Preisbewertungen oder speziellen Zeiträumen." - }, - "transformation": { - "name": "Daten transformieren", - "description": "Transformiere die Datenausgabe für bessere Diagrammkompatibilität." - }, - "format": { - "name": "Format", - "description": "Passe das Ausgabeformat an." - }, - "arrays_of_arrays": { - "name": "Erweiterte Ausgabeeinstellungen: Array von Arrays", - "description": "Einstellungen für das Ausgabeformat bei Verwendung eines Arrays von Arrays." - }, - "arrays_of_objects": { - "name": "Erweiterte Ausgabeeinstellungen: Array von Objekten", - "description": "Einstellungen für das Ausgabeformat bei Verwendung eines Arrays von Objekten." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "day": { - "name": "Tag", - "description": "Für welche(n) Tag(e) sollen Preise abgerufen werden. Du kannst mehrere Tage auswählen. Falls nicht angegeben, wird ein rollierendes 2-Tages-Fenster zurückgegeben: heute+morgen (wenn Morgendaten verfügbar) oder gestern+heute (wenn Morgendaten noch nicht verfügbar). Dies ermöglicht eine kontinuierliche Diagrammanzeige ohne Lücken." - }, - "resolution": { - "name": "Auflösung", - "description": "Zeitauflösung für die zurückgegebenen Daten. Optionen: 'interval' (Standard, 15-Minuten-Intervalle, 96 Datenpunkte pro Tag), 'hourly' (stündliche Durchschnitte, 24 Datenpunkte pro Tag)." - }, - "output_format": { - "name": "Ausgabeformat", - "description": "Ausgabeformat für die zurückgegebenen Daten. Optionen: 'array_of_objects' (Standard, Array von Objekten mit anpassbaren Feldnamen), 'array_of_arrays' (Array von [Zeitstempel, Preis]-Arrays mit abschließendem Null-Punkt für Stepline-Charts)." - }, - "array_fields": { - "name": "Array-Felder", - "description": "Definiere, welche Felder im array_of_arrays-Format enthalten sein sollen. Verwende Feldnamen in geschweiften Klammern, getrennt durch Kommas. Verfügbare Felder: start_time, price_per_kwh, level, rating_level, average. Felder werden automatisch aktiviert, auch wenn include_*-Optionen nicht gesetzt sind. Leer lassen für Standard (nur Zeitstempel und Preis)." - }, - "subunit_currency": { - "name": "Unterwährungseinheit", - "description": "Gibt Preise in Unterwährungseinheiten zurück (Cent für EUR, Øre für NOK/SEK) statt in Basiswährungseinheiten. Standardmäßig deaktiviert." - }, - "round_decimals": { - "name": "Dezimalstellen runden", - "description": "Anzahl der Dezimalstellen, auf die Preise gerundet werden sollen (0-10). Falls nicht angegeben, wird die Standardgenauigkeit verwendet (4 Dezimalstellen für Basiswährung, 2 für Unterwährungseinheit)." - }, - "include_level": { - "name": "Preisniveau einschließen", - "description": "Fügt das Tibber-Preisniveau (sehr günstig/günstig/normal/teuer/sehr teuer) zu jedem Datenpunkt hinzu." - }, - "include_rating_level": { - "name": "Preisbewertung einschließen", - "description": "Fügt die berechnete Preisbewertung (niedrig/normal/hoch) basierend auf deinen konfigurierten Schwellwerten zu jedem Datenpunkt hinzu." - }, - "include_average": { - "name": "Durchschnitt einschließen", - "description": "Den Tagesdurchschnittspreis in jedem Datenpunkt zum Vergleich einschließen." - }, - "include_energy": { - "name": "Energiepreis einschließen", - "description": "Den reinen Energie-/Spotpreis (ohne Steuern und Gebühren) in jedem Datenpunkt einschließen. Dies ist das 'energy'-Feld aus der Tibber-API, nützlich für Einspeisungs-/Salderungsberechnungen." - }, - "include_tax": { - "name": "Steueranteil einschließen", - "description": "Den Steueranteil des Preises in jedem Datenpunkt einschließen. Dies ist das 'tax'-Feld aus der Tibber-API, das Gebühren, Steuern und Netzentgelte darstellt." - }, - "level_filter": { - "name": "Preisniveau-Filter", - "description": "Intervalle filtern, um nur bestimmte Tibber-Preisniveaus einzuschließen (sehr günstig/günstig/normal/teuer/sehr teuer). Falls nicht angegeben, werden alle Niveaus eingeschlossen." - }, - "rating_level_filter": { - "name": "Preisbewertungs-Filter", - "description": "Intervalle filtern, um nur bestimmte Preisbewertungen einzuschließen (niedrig/normal/hoch). Falls nicht angegeben, werden alle Bewertungen eingeschlossen." - }, - "period_filter": { - "name": "Perioden-Filter", - "description": "Intervalle filtern, um nur solche innerhalb von Bestepreis- oder Spitzenpreis-Zeiträumen einzuschließen. Optionen: 'best_price' (nur Intervalle in Beste-Preis-Perioden), 'peak_price' (nur Intervalle in Spitzen-Preis-Perioden). Falls nicht angegeben, werden alle Intervalle eingeschlossen. Verwendet vorberechnete Periodendaten von Binär-Sensoren." - }, - "insert_nulls": { - "name": "NULL-Werte einfügen", - "description": "Steuert das Einfügen von NULL-Werten für gefilterte Daten. 'none' (Standard): Keine NULL-Werte, nur passende Intervalle. 'segments': NULL-Punkte an Segmentgrenzen für saubere Lücken in Diagrammen hinzufügen (empfohlen für Stufenliniendiagramme). 'all': NULL für alle Zeitstempel einfügen, bei denen der Filter nicht übereinstimmt (nützlich für kontinuierliche Zeitreihenvisualisierung)." - }, - "connect_segments": { - "name": "Segmente verbinden", - "description": "[NUR BEI 'NULL-Werte einfügen'] Wenn aktiviert, werden an Segmentgrenzen Verbindungspunkte hinzugefügt, um verschiedene Preisstufen-Segmente in Stufenliniendiagrammen visuell zu verbinden. Bei fallendem Preis wird ein Punkt mit dem niedrigeren Preis am Ende des aktuellen Segments hinzugefügt. Bei steigendem Preis wird ein Haltepunkt vor der Lücke hinzugefügt. Dies erzeugt sanfte visuelle Übergänge zwischen Segmenten anstelle von abrupten Lücken." - }, - "add_trailing_null": { - "name": "Abschließenden Null-Punkt hinzufügen", - "description": "Füge einen finalen Datenpunkt mit Nullwerten (außer Zeitstempel) am Ende hinzu. Einige Diagrammbibliotheken benötigen dies, um Extrapolation/Interpolation zum Viewport-Rand bei Verwendung von Stufendarstellung zu verhindern. Deaktiviert lassen, es sei denn, dein Diagramm benötigt es." - }, - "start_time_field": { - "name": "Startzeit-Feldname", - "description": "Benutzerdefinierter Name für das Startzeit-Feld in der Ausgabe. Standardmäßig 'start_time', wenn nicht angegeben." - }, - "end_time_field": { - "name": "Endzeit-Feldname", - "description": "Benutzerdefinierter Name für das Endzeit-Feld in der Ausgabe. Standardmäßig 'end_time', wenn nicht angegeben. Nur verwendet mit period_filter." - }, - "price_field": { - "name": "Preis-Feldname", - "description": "Benutzerdefinierter Name für das Preis-Feld in der Ausgabe. Standard ist 'price_per_kwh', falls nicht angegeben." - }, - "level_field": { - "name": "Preisniveau-Feldname", - "description": "Benutzerdefinierter Name für das Preisniveau-Feld in der Ausgabe. Standard ist 'level', falls nicht angegeben. Wird nur verwendet, wenn include_level aktiviert ist." - }, - "rating_level_field": { - "name": "Preisbewertung-Feldname", - "description": "Benutzerdefinierter Name für das Preisbewertungs-Feld in der Ausgabe. Standard ist 'rating_level', falls nicht angegeben. Wird nur verwendet, wenn include_rating_level aktiviert ist." - }, - "average_field": { - "name": "Durchschnitts-Feldname", - "description": "Benutzerdefinierter Name für das Durchschnitts-Feld in der Ausgabe. Standard ist 'average', falls nicht angegeben. Wird nur verwendet, wenn include_average aktiviert ist." - }, - "energy_field": { - "name": "Energiepreis-Feldname", - "description": "Benutzerdefinierter Name für das Energiepreis-Feld in der Ausgabe. Standard ist 'energy_price', falls nicht angegeben. Wird nur verwendet, wenn include_energy aktiviert ist." - }, - "tax_field": { - "name": "Steuer-Feldname", - "description": "Benutzerdefinierter Name für das Steuer-Feld in der Ausgabe. Standard ist 'tax', falls nicht angegeben. Wird nur verwendet, wenn include_tax aktiviert ist." - }, - "metadata": { - "name": "Metadaten", - "description": "Steuerung der Metadaten-Einbindung in der Antwort. 'include' (Standard): Gibt Chart-Daten und Metadaten mit Preisstatistiken, Währungsinformationen, Y-Achsen-Vorschlägen und Zeitbereich zurück. 'only': Gibt nur Metadaten zurück ohne Chart-Daten zu verarbeiten (schnell, nützlich für dynamische Y-Achsen-Konfiguration). 'none': Gibt nur Chart-Daten ohne Metadaten zurück." - }, - "data_key": { - "name": "Daten-Schlüssel", - "description": "Benutzerdefinierter Name für den obersten Datenschlüssel in der Antwort. Standard ist 'data', falls nicht angegeben." - } - } - }, - "refresh_user_data": { - "name": "Benutzerdaten aktualisieren", - "description": "Erzwingt eine Aktualisierung der Benutzerdaten (Häuser, Profilinformationen) aus der Tibber API. Dies kann nützlich sein, nachdem Änderungen an deinem Tibber-Konto vorgenommen wurden oder bei der Fehlerbehebung von Verbindungsproblemen.", - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - } - } - }, - "find_cheapest_block": { - "name": "Günstigsten Block finden", - "description": "Findet das günstigste zusammenhängende Zeitfenster einer bestimmten Dauer. Gedacht für Geräteplanung: Spülmaschine, Waschmaschine, Trockner usw. Gibt das günstigste Fenster mit Start-/Endzeiten und Preisstatistiken zurück.", - "sections": { - "search_range": { - "name": "Suchbereich", - "description": "Zeitfenster fuer die Suche festlegen." - }, - "time_alternatives": { - "name": "Alternative Zeitbereich-Optionen", - "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." - }, - "price_filter": { - "name": "Preisstufen-Filter", - "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." - }, - "output": { - "name": "Ausgabeoptionen", - "description": "Kostenabschaetzung und Vergleichsausgabe steuern." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "duration": { - "name": "Dauer", - "description": "Länge des gewünschten zusammenhängenden Fensters. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 12 Stunden." - }, - "search_start": { - "name": "Suchbeginn", - "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." - }, - "search_end": { - "name": "Suchende", - "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." - }, - "search_start_time": { - "name": "Suchbeginn-Uhrzeit", - "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." - }, - "search_start_day_offset": { - "name": "Suchbeginn Tages-Versatz", - "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." - }, - "search_end_time": { - "name": "Suchende-Uhrzeit", - "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." - }, - "search_end_day_offset": { - "name": "Suchende Tages-Versatz", - "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." - }, - "search_start_offset_minutes": { - "name": "Suchbeginn-Versatz (Minuten)", - "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." - }, - "search_end_offset_minutes": { - "name": "Suchende-Versatz (Minuten)", - "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." - }, - "include_current_interval": { - "name": "Aktuelles Intervall einbeziehen", - "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." - }, - "use_base_unit": { - "name": "Basiswährung verwenden", - "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." - }, - "search_scope": { - "name": "Suchbereich (Shortcut)", - "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." - }, - "max_price_level": { - "name": "Maximale Preisstufe", - "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." - }, - "min_price_level": { - "name": "Minimale Preisstufe", - "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." - }, - "include_comparison_details": { - "name": "Vergleichsdetails einschliessen", - "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." - }, - "power_profile": { - "name": "Leistungsprofil", - "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." - } - } - }, - "find_most_expensive_block": { - "name": "Teuersten Block finden", - "description": "Findet das teuerste zusammenhängende Zeitfenster einer bestimmten Dauer. Nützlich zur Erkennung von Spitzenpreiszeiträumen, die vermieden werden sollten. Gibt das teuerste Fenster mit Start-/Endzeiten und Preisstatistiken zurück.", - "sections": { - "search_range": { - "name": "Suchbereich", - "description": "Zeitfenster fuer die Suche festlegen." - }, - "time_alternatives": { - "name": "Alternative Zeitbereich-Optionen", - "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." - }, - "price_filter": { - "name": "Preisstufen-Filter", - "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." - }, - "output": { - "name": "Ausgabeoptionen", - "description": "Kostenabschaetzung und Vergleichsausgabe steuern." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "duration": { - "name": "Dauer", - "description": "Länge des gewünschten zusammenhängenden Fensters. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 12 Stunden." - }, - "search_start": { - "name": "Suchbeginn", - "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." - }, - "search_end": { - "name": "Suchende", - "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." - }, - "search_start_time": { - "name": "Suchbeginn-Uhrzeit", - "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." - }, - "search_start_day_offset": { - "name": "Suchbeginn Tages-Versatz", - "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." - }, - "search_end_time": { - "name": "Suchende-Uhrzeit", - "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." - }, - "search_end_day_offset": { - "name": "Suchende Tages-Versatz", - "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." - }, - "search_start_offset_minutes": { - "name": "Suchbeginn-Versatz (Minuten)", - "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." - }, - "search_end_offset_minutes": { - "name": "Suchende-Versatz (Minuten)", - "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." - }, - "include_current_interval": { - "name": "Aktuelles Intervall einbeziehen", - "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." - }, - "use_base_unit": { - "name": "Basiswährung verwenden", - "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." - }, - "search_scope": { - "name": "Suchbereich (Shortcut)", - "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." - }, - "max_price_level": { - "name": "Maximale Preisstufe", - "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." - }, - "min_price_level": { - "name": "Minimale Preisstufe", - "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." - }, - "include_comparison_details": { - "name": "Vergleichsdetails einschliessen", - "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." - }, - "power_profile": { - "name": "Leistungsprofil", - "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." - } - } - }, - "find_cheapest_hours": { - "name": "Günstigste Stunden finden", - "description": "Findet die günstigsten Intervalle für eine bestimmte Gesamtdauer, nicht unbedingt zusammenhängend. Gedacht für flexible Lasten: Batterieladung, E-Auto, Warmwasserspeicher. Gibt einen Zeitplan mit Intervallen gruppiert in zusammenhängende Segmente zurück.", - "sections": { - "search_range": { - "name": "Suchbereich", - "description": "Zeitfenster fuer die Suche festlegen." - }, - "time_alternatives": { - "name": "Alternative Zeitbereich-Optionen", - "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." - }, - "price_filter": { - "name": "Preisstufen-Filter", - "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." - }, - "output": { - "name": "Ausgabeoptionen", - "description": "Kostenabschaetzung und Vergleichsausgabe steuern." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "duration": { - "name": "Dauer", - "description": "Benötigte günstige Gesamtzeit. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 24 Stunden." - }, - "search_start": { - "name": "Suchbeginn", - "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." - }, - "search_end": { - "name": "Suchende", - "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." - }, - "search_start_time": { - "name": "Suchbeginn-Uhrzeit", - "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." - }, - "search_start_day_offset": { - "name": "Suchbeginn Tages-Versatz", - "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." - }, - "search_end_time": { - "name": "Suchende-Uhrzeit", - "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." - }, - "search_end_day_offset": { - "name": "Suchende Tages-Versatz", - "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." - }, - "search_start_offset_minutes": { - "name": "Suchbeginn-Versatz (Minuten)", - "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." - }, - "search_end_offset_minutes": { - "name": "Suchende-Versatz (Minuten)", - "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." - }, - "include_current_interval": { - "name": "Aktuelles Intervall einbeziehen", - "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." - }, - "min_segment_duration": { - "name": "Minimale Segmentdauer", - "description": "Minimale zusammenhängende Laufzeit. Verhindert schnelles Ein-/Ausschalten bei Geräten mit Mindestlaufzeiten. Wird automatisch auf die nächste Viertelstunde aufgerundet. Standard: 15 Minuten. Maximum: 4 Stunden." - }, - "use_base_unit": { - "name": "Basiswährung verwenden", - "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." - }, - "search_scope": { - "name": "Suchbereich (Shortcut)", - "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." - }, - "max_price_level": { - "name": "Maximale Preisstufe", - "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." - }, - "min_price_level": { - "name": "Minimale Preisstufe", - "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." - }, - "include_comparison_details": { - "name": "Vergleichsdetails einschliessen", - "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." - }, - "power_profile": { - "name": "Leistungsprofil", - "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." - } - } - }, - "find_most_expensive_hours": { - "name": "Teuerste Stunden finden", - "description": "Findet die teuersten Intervalle für eine bestimmte Gesamtdauer, nicht unbedingt zusammenhängend. Nützlich zur Erkennung von Spitzenpreiszeiträumen, die vermieden werden sollten. Gibt einen Zeitplan mit Intervallen gruppiert in zusammenhängende Segmente zurück.", - "sections": { - "search_range": { - "name": "Suchbereich", - "description": "Zeitfenster fuer die Suche festlegen." - }, - "time_alternatives": { - "name": "Alternative Zeitbereich-Optionen", - "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." - }, - "price_filter": { - "name": "Preisstufen-Filter", - "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." - }, - "output": { - "name": "Ausgabeoptionen", - "description": "Kostenabschaetzung und Vergleichsausgabe steuern." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "duration": { - "name": "Dauer", - "description": "Zu findende teure Gesamtzeit. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 24 Stunden." - }, - "search_start": { - "name": "Suchbeginn", - "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." - }, - "search_end": { - "name": "Suchende", - "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." - }, - "search_start_time": { - "name": "Suchbeginn-Uhrzeit", - "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." - }, - "search_start_day_offset": { - "name": "Suchbeginn Tages-Versatz", - "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." - }, - "search_end_time": { - "name": "Suchende-Uhrzeit", - "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." - }, - "search_end_day_offset": { - "name": "Suchende Tages-Versatz", - "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." - }, - "search_start_offset_minutes": { - "name": "Suchbeginn-Versatz (Minuten)", - "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." - }, - "search_end_offset_minutes": { - "name": "Suchende-Versatz (Minuten)", - "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." - }, - "include_current_interval": { - "name": "Aktuelles Intervall einbeziehen", - "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." - }, - "min_segment_duration": { - "name": "Minimale Segmentdauer", - "description": "Minimale zusammenhängende Laufzeit. Verhindert schnelles Ein-/Ausschalten bei Geräten mit Mindestlaufzeiten. Wird automatisch auf die nächste Viertelstunde aufgerundet. Standard: 15 Minuten. Maximum: 4 Stunden." - }, - "use_base_unit": { - "name": "Basiswährung verwenden", - "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." - }, - "search_scope": { - "name": "Suchbereich (Shortcut)", - "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." - }, - "max_price_level": { - "name": "Maximale Preisstufe", - "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." - }, - "min_price_level": { - "name": "Minimale Preisstufe", - "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." - }, - "include_comparison_details": { - "name": "Vergleichsdetails einschliessen", - "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." - }, - "power_profile": { - "name": "Leistungsprofil", - "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." - } - } - }, - "find_cheapest_schedule": { - "name": "Guenstigstes Programm planen", - "description": "Plant mehrere Geraete optimal ohne Zeitueberschneidung. Jede Aufgabe erhaelt das guenstigste verfuegbare zusammenhaengende Zeitfenster.", - "sections": { - "scheduling_options": { - "name": "Planungsoptionen", - "description": "Aufgaben und Puffer zwischen den Geraeteaufzeiten konfigurieren." - }, - "search_range": { - "name": "Suchbereich", - "description": "Zeitfenster fuer die Suche festlegen." - }, - "time_alternatives": { - "name": "Alternative Zeitbereich-Optionen", - "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." - }, - "price_filter": { - "name": "Preisstufen-Filter", - "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." - }, - "output": { - "name": "Ausgabeoptionen", - "description": "Kostenabschaetzung und Vergleichsausgabe steuern." - } - }, - "fields": { - "entry_id": { - "name": "Eintrag-ID", - "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." - }, - "tasks": { - "name": "Aufgaben", - "description": "Liste der zu planenden Aufgaben. Jede Aufgabe benoetigt name (Text) und duration (hh:mm:ss). Optional: power_profile (Watt pro 15-min-Intervall). Maximal 4 Aufgaben." - }, - "gap_minutes": { - "name": "Pause zwischen Aufgaben (Minuten)", - "description": "Mindestpause in Minuten zwischen aufeinanderfolgenden Aufgaben. Wird auf 15 Minuten aufgerundet. Standard: 0 (keine Pause)." - }, - "search_scope": { - "name": "Suchbereich (Shortcut)", - "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." - }, - "search_start": { - "name": "Suchbeginn", - "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." - }, - "search_end": { - "name": "Suchende", - "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." - }, - "search_start_time": { - "name": "Suchbeginn-Uhrzeit", - "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." - }, - "search_start_day_offset": { - "name": "Suchbeginn Tages-Versatz", - "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." - }, - "search_end_time": { - "name": "Suchende-Uhrzeit", - "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." - }, - "search_end_day_offset": { - "name": "Suchende Tages-Versatz", - "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." - }, - "search_start_offset_minutes": { - "name": "Suchbeginn-Versatz (Minuten)", - "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." - }, - "search_end_offset_minutes": { - "name": "Suchende-Versatz (Minuten)", - "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." - }, - "include_current_interval": { - "name": "Aktuelles Intervall einbeziehen", - "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." - }, - "max_price_level": { - "name": "Maximale Preisstufe", - "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." - }, - "min_price_level": { - "name": "Minimale Preisstufe", - "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." - }, - "use_base_unit": { - "name": "Basiswährung verwenden", - "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." - } - } + }, + "next_hour_price_level": { + "name": "Nächstes Stunden-Preisniveau", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" } + }, + "lowest_price_today": { + "name": "Mindestpreis heute" + }, + "highest_price_today": { + "name": "Höchstpreis heute" + }, + "average_price_today": { + "name": "⌀ Preis heute" + }, + "lowest_price_tomorrow": { + "name": "Mindestpreis morgen" + }, + "highest_price_tomorrow": { + "name": "Höchstpreis morgen" + }, + "average_price_tomorrow": { + "name": "⌀ Preis morgen" + }, + "yesterday_price_level": { + "name": "Preisniveau gestern", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" + } + }, + "today_price_level": { + "name": "Preisniveau heute", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" + } + }, + "tomorrow_price_level": { + "name": "Preisniveau morgen", + "state": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" + } + }, + "yesterday_price_rating": { + "name": "Preisbewertung gestern", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "today_price_rating": { + "name": "Preisbewertung heute", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "tomorrow_price_rating": { + "name": "Preisbewertung morgen", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "trailing_price_average": { + "name": "⌀ Preis nachlaufend 24h" + }, + "leading_price_average": { + "name": "⌀ Preis vorlaufend 24h" + }, + "trailing_price_min": { + "name": "24h-Mindestpreis nachlaufend" + }, + "trailing_price_max": { + "name": "24h-Höchstpreis nachlaufend" + }, + "leading_price_min": { + "name": "24h-Mindestpreis vorlaufend" + }, + "leading_price_max": { + "name": "24h-Höchstpreis vorlaufend" + }, + "current_interval_price_rating": { + "name": "Aktuelle Preisbewertung", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "next_interval_price_rating": { + "name": "Nächste Preisbewertung", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "previous_interval_price_rating": { + "name": "Vorherige Preisbewertung", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "current_hour_price_rating": { + "name": "Aktuelle Stunden-Preisbewertung", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "next_hour_price_rating": { + "name": "Nächste Stunden-Preisbewertung", + "state": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "next_avg_1h": { + "name": "⌀ Preis nächste 1h" + }, + "next_avg_2h": { + "name": "⌀ Preis nächste 2h" + }, + "next_avg_3h": { + "name": "⌀ Preis nächste 3h" + }, + "next_avg_4h": { + "name": "⌀ Preis nächste 4h" + }, + "next_avg_5h": { + "name": "⌀ Preis nächste 5h" + }, + "next_avg_6h": { + "name": "⌀ Preis nächste 6h" + }, + "next_avg_8h": { + "name": "⌀ Preis nächste 8h" + }, + "next_avg_12h": { + "name": "⌀ Preis nächste 12h" + }, + "price_outlook_1h": { + "name": "Preisausblick (1h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_2h": { + "name": "Preisausblick (2h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_3h": { + "name": "Preisausblick (3h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_4h": { + "name": "Preisausblick (4h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_5h": { + "name": "Preisausblick (5h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_6h": { + "name": "Preisausblick (6h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_8h": { + "name": "Preisausblick (8h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_outlook_12h": { + "name": "Preisausblick (12h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_2h": { + "name": "Preisverlauf (2h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_3h": { + "name": "Preisverlauf (3h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_4h": { + "name": "Preisverlauf (4h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_5h": { + "name": "Preisverlauf (5h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_6h": { + "name": "Preisverlauf (6h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_8h": { + "name": "Preisverlauf (8h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "price_trajectory_12h": { + "name": "Preisverlauf (12h)", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "current_price_trend": { + "name": "Aktueller Preistrend", + "state": { + "strongly_rising": "Stark steigend", + "rising": "Steigend", + "stable": "Stabil", + "falling": "Fallend", + "strongly_falling": "Stark fallend" + } + }, + "next_price_trend_change": { + "name": "Nächste Trendänderung" + }, + "next_price_trend_change_in": { + "name": "Nächste Trendänderung in" + }, + "daily_rating": { + "name": "Tägliche Preisbewertung" + }, + "monthly_rating": { + "name": "Monatliche Preisbewertung" + }, + "data_lifecycle_status": { + "name": "Datenlebenszyklus-Status", + "state": { + "cached": "Zwischengespeichert", + "fresh": "Frisch", + "refreshing": "Aktualisiere", + "searching_tomorrow": "Suche Morgendaten", + "turnover_pending": "Mitternachtswechsel steht bevor", + "error": "Fehler" + } + }, + "today_volatility": { + "name": "Volatilität heute", + "state": { + "low": "Niedrig", + "moderate": "Moderat", + "high": "Hoch", + "very_high": "Sehr hoch" + } + }, + "tomorrow_volatility": { + "name": "Volatilität morgen", + "state": { + "low": "Niedrig", + "moderate": "Moderat", + "high": "Hoch", + "very_high": "Sehr hoch" + } + }, + "next_24h_volatility": { + "name": "Volatilität der nächsten 24h", + "state": { + "low": "Niedrig", + "moderate": "Moderat", + "high": "Hoch", + "very_high": "Sehr hoch" + } + }, + "today_tomorrow_volatility": { + "name": "Volatilität heute+morgen", + "state": { + "low": "Niedrig", + "moderate": "Moderat", + "high": "Hoch", + "very_high": "Sehr hoch" + } + }, + "best_price_end_time": { + "name": "Bestpreis endet" + }, + "best_price_period_duration": { + "name": "Bestpreis Dauer" + }, + "best_price_remaining_minutes": { + "name": "Bestpreis verbleibend" + }, + "best_price_progress": { + "name": "Bestpreis Fortschritt" + }, + "best_price_next_start_time": { + "name": "Bestpreis startet" + }, + "best_price_next_in_minutes": { + "name": "Bestpreis startet in" + }, + "peak_price_end_time": { + "name": "Spitzenpreis endet" + }, + "peak_price_period_duration": { + "name": "Spitzenpreis Dauer" + }, + "peak_price_remaining_minutes": { + "name": "Spitzenpreis verbleibend" + }, + "peak_price_progress": { + "name": "Spitzenpreis Fortschritt" + }, + "peak_price_next_start_time": { + "name": "Spitzenpreis startet" + }, + "peak_price_next_in_minutes": { + "name": "Spitzenpreis startet in" + }, + "home_type": { + "name": "Wohnungstyp", + "state": { + "apartment": "Wohnung", + "rowhouse": "Reihenhaus", + "house": "Haus", + "cottage": "Ferienhaus" + } + }, + "home_size": { + "name": "Wohnfläche" + }, + "main_fuse_size": { + "name": "Hauptsicherung" + }, + "number_of_residents": { + "name": "Anzahl Bewohner" + }, + "primary_heating_source": { + "name": "Primäre Heizquelle", + "state": { + "air2air_heatpump": "Luft-Luft-Wärmepumpe", + "air2water_heatpump": "Luft-Wasser-Wärmepumpe", + "boiler": "Boiler", + "central_heating": "Zentralheizung", + "district_heating": "Fernwärme", + "district": "Fernwärme", + "electric_boiler": "Elektroboiler", + "electricity": "Elektroheizung", + "floor": "Fußbodenheizung", + "gas": "Gas", + "ground_heatpump": "Erdwärmepumpe", + "ground": "Erdwärmepumpe", + "oil": "Öl", + "other": "Sonstige", + "waste": "Abwärme" + } + }, + "grid_company": { + "name": "Netzbetreiber" + }, + "grid_area_code": { + "name": "Netzgebietscode" + }, + "price_area_code": { + "name": "Preiszonencode" + }, + "consumption_ean": { + "name": "Verbrauchs-EAN" + }, + "production_ean": { + "name": "Erzeugungs-EAN" + }, + "energy_tax_type": { + "name": "Energiesteuertyp" + }, + "vat_type": { + "name": "Mehrwertsteuertyp" + }, + "estimated_annual_consumption": { + "name": "Geschätzter Jahresverbrauch" + }, + "subscription_status": { + "name": "Abonnementstatus", + "state": { + "running": "Aktiv", + "ended": "Beendet", + "pending": "Ausstehend", + "unknown": "Unbekannt" + } + }, + "day_pattern_yesterday": { + "name": "Preismuster Gestern", + "state": { + "valley": "Tal", + "peak": "Gipfel", + "double_valley": "Doppeltal", + "double_peak": "Doppelgipfel", + "flat": "Flach", + "rising": "Steigend", + "falling": "Fallend", + "mixed": "Gemischt" + } + }, + "day_pattern_today": { + "name": "Preismuster Heute", + "state": { + "valley": "Tal", + "peak": "Gipfel", + "double_valley": "Doppeltal", + "double_peak": "Doppelgipfel", + "flat": "Flach", + "rising": "Steigend", + "falling": "Fallend", + "mixed": "Gemischt" + } + }, + "day_pattern_tomorrow": { + "name": "Preismuster Morgen", + "state": { + "valley": "Tal", + "peak": "Gipfel", + "double_valley": "Doppeltal", + "double_peak": "Doppelgipfel", + "flat": "Flach", + "rising": "Steigend", + "falling": "Fallend", + "mixed": "Gemischt" + } + }, + "chart_data_export": { + "name": "Diagramm-Datenexport", + "state": { + "pending": "Ausstehend", + "ready": "Bereit", + "error": "Fehler" + } + }, + "chart_metadata": { + "name": "Diagramm-Metadaten", + "state": { + "pending": "Ausstehend", + "ready": "Bereit", + "error": "Fehler" + } + } }, - "selector": { - "account_choice": { - "options": { - "new_token": "Neues Tibber-Konto per API-Token hinzufügen" - } + "binary_sensor": { + "peak_price_period": { + "name": "Spitzenpreis-Zeitraum" + }, + "best_price_period": { + "name": "Bestpreis-Zeitraum" + }, + "connection": { + "name": "Tibber-API-Verbindung" + }, + "tomorrow_data_available": { + "name": "Morgige Daten verfügbar" + }, + "has_ventilation_system": { + "name": "Hat Lüftungsanlage" + }, + "realtime_consumption_enabled": { + "name": "Echtzeitverbrauch aktiviert" + } + }, + "number": { + "best_price_flex_override": { + "name": "Bestpreis: Flexibilität" + }, + "best_price_min_distance_override": { + "name": "Bestpreis: Mindestabstand" + }, + "best_price_min_period_length_override": { + "name": "Bestpreis: Mindestperiodenlänge" + }, + "best_price_min_periods_override": { + "name": "Bestpreis: Mindestperioden" + }, + "best_price_relaxation_attempts_override": { + "name": "Bestpreis: Lockerungsversuche" + }, + "best_price_gap_count_override": { + "name": "Bestpreis: Lückentoleranz" + }, + "peak_price_flex_override": { + "name": "Spitzenpreis: Flexibilität" + }, + "peak_price_min_distance_override": { + "name": "Spitzenpreis: Mindestabstand" + }, + "peak_price_min_period_length_override": { + "name": "Spitzenpreis: Mindestperiodenlänge" + }, + "peak_price_min_periods_override": { + "name": "Spitzenpreis: Mindestperioden" + }, + "peak_price_relaxation_attempts_override": { + "name": "Spitzenpreis: Lockerungsversuche" + }, + "peak_price_gap_count_override": { + "name": "Spitzenpreis: Lückentoleranz" + } + }, + "switch": { + "best_price_enable_relaxation_override": { + "name": "Bestpreis: Mindestanzahl erreichen" + }, + "peak_price_enable_relaxation_override": { + "name": "Spitzenpreis: Mindestanzahl erreichen" + } + } + }, + "issues": { + "new_homes_available": { + "title": "Neue Tibber-Häuser erkannt", + "description": "Wir haben {count} neue(s) Zuhause in deinem Tibber-Konto erkannt: {homes}. Du kannst diese über die Tibber-Integration in Home Assistant hinzufügen." + }, + "homes_removed": { + "title": "Tibber-Häuser entfernt", + "description": "Wir haben erkannt, dass {count} Zuhause aus deinem Tibber-Konto entfernt wurde(n): {homes}. Bitte überprüfe deine Tibber-Integrationskonfiguration." + }, + "tomorrow_data_missing": { + "title": "Preisdaten für morgen fehlen für {home_name}", + "description": "Die Strompreisdaten für morgen sind nach {warning_hour}:00 Uhr immer noch nicht verfügbar. Das ist ungewöhnlich, da Tibber normalerweise die Preise für morgen am Nachmittag veröffentlicht (ca. 13:00-14:00 Uhr MEZ).\n\nMögliche Ursachen:\n- Tibber hat die Preise für morgen noch nicht veröffentlicht\n- Temporäre API-Probleme\n- Dein Stromanbieter hat die Preise noch nicht an Tibber übermittelt\n\nDieses Problem löst sich automatisch, sobald die Daten für morgen verfügbar sind. Falls dies nach 20:00 Uhr weiterhin besteht, prüfe bitte die Tibber-App oder kontaktiere den Tibber-Support." + }, + "rate_limit_exceeded": { + "title": "API-Ratenlimit erreicht für {home_name}", + "description": "Die Tibber-API hat diese Integration nach {error_count} aufeinanderfolgenden Fehlern ratenlimitiert. Das bedeutet, dass Anfragen zu häufig gestellt werden.\n\nDie Integration wird automatisch mit zunehmenden Verzögerungen erneut versuchen. Dieses Problem löst sich, sobald das Ratenlimit abläuft.\n\nFalls dies mehrere Stunden anhält, überprüfe:\n- Ob mehrere Home Assistant Instanzen denselben API-Token verwenden\n- Ob andere Anwendungen deinen Tibber-API-Token stark nutzen\n- Die Update-Frequenz reduzieren, falls du sie angepasst hast" + }, + "home_not_found": { + "title": "Zuhause {home_name} nicht im Tibber-Konto gefunden", + "description": "Das in dieser Integration konfigurierte Zuhause (Eintrag-ID: {entry_id}) ist nicht mehr in deinem Tibber-Konto verfügbar. Dies passiert normalerweise, wenn:\n- Das Zuhause aus deinem Tibber-Konto gelöscht wurde\n- Das Zuhause zu einem anderen Tibber-Konto verschoben wurde\n- Der Zugriff auf dieses Zuhause widerrufen wurde\n\nBitte entferne diesen Integrationseintrag und füge ihn erneut hinzu, falls das Zuhause weiterhin überwacht werden soll. Um diesen Eintrag zu entfernen, gehe zu Einstellungen → Geräte & Dienste → Tibber Prices und lösche die Konfiguration {home_name}." + }, + "entity_migration": { + "title": "Tibber Prices: Aktion nach Update erforderlich ({home_name})", + "description": "Dieses Update enthält Breaking Changes, die automatisch angewendet wurden.\n\n**Umbenannte Entitäten ({count})**\n\nDie folgenden Entity-Keys wurden umbenannt. Deine bestehenden Entity-IDs und Automationen bleiben erhalten:\n\n{entity_list}\n\n**Geänderte Dauer-Sensorwerte**\n\nAlle Dauer-Sensoren (verbleibende Zeit, startet in, Periodendauer, Trendänderungs-Countdown) geben ihren Zustandswert jetzt in **Minuten** statt Stunden an. Die Anzeigeeinheit in Dashboards bleibt standardmäßig Stunden.\n\nWenn du Automationen mit numerischen Vergleichen auf diesen Sensoren hast, aktualisiere deine Schwellwerte:\n- Alt: `state < 0.25` (15 Minuten als Stunden)\n- Neu: `state < 15` (15 Minuten)\n\nSchließe diesen Hinweis, nachdem du deine Automationen überprüft hast." + } + }, + "exceptions": { + "no_entries_found": { + "message": "Keine Tibber Prices Integrationseinträge gefunden. Bitte richte die Integration zuerst ein." + }, + "multiple_entries_no_entry_id": { + "message": "Mehrere Tibber Prices Einträge gefunden. Bitte gib 'entry_id' an, um den gewünschten Eintrag auszuwählen." + }, + "invalid_entry_id": { + "message": "Ungültige oder nicht verfügbare Konfigurations-Entry. Bitte überprüfe die Entry-ID und stelle sicher, dass die Integration geladen ist." + }, + "missing_home_id": { + "message": "Home-ID nicht im Konfigurationseintrag gefunden. Bitte konfiguriere die Integration neu." + }, + "user_data_not_available": { + "message": "Benutzerdaten sind noch nicht verfügbar. Bitte warte, bis das erste Datenupdate abgeschlossen ist." + }, + "timezone_not_found": { + "message": "Zeitzone des Zuhauses konnte nicht ermittelt werden. Bitte überprüfe die Konfiguration in deinem Tibber-Konto." + }, + "end_before_start": { + "message": "Endzeit muss nach der Startzeit liegen." + }, + "price_fetch_failed": { + "message": "Preisdaten konnten nicht von der Tibber-API abgerufen werden. Bitte versuche es später erneut." + }, + "invalid_search_scope": { + "message": "Ungültiger Suchbereich. Gültige Werte sind: today, tomorrow, remaining_today, next_24h, next_48h." + }, + "scope_conflicts_with_range": { + "message": "search_scope kann nicht mit expliziten Bereichsparametern kombiniert werden: {params}. Verwende entweder search_scope ODER explizite Start-/Endparameter." + }, + "day_offset_requires_time": { + "message": "{offset_param} erfordert, dass {time_param} gesetzt ist. Der Tagesoffset ändert nur das Datum eines expliziten Zeitparameters." + }, + "min_level_exceeds_max": { + "message": "min_price_level '{min_level}' ist höher als max_price_level '{max_level}'. Das Mindestlevel muss gleich oder niedriger als das Maximallevel sein." + }, + "power_profile_length_mismatch": { + "message": "power_profile hat {profile_length} Einträge, aber die Dauer erfordert {interval_count} Intervalle ({duration_minutes} Minuten). Das power_profile muss genau einen Eintrag pro 15-Minuten-Intervall haben." + }, + "level_and_rating_filter_conflict": { + "message": "level_filter und rating_level_filter können nicht gleichzeitig verwendet werden. Verwende nur einen Filtertyp pro Anfrage." + }, + "insert_nulls_requires_filter": { + "message": "insert_nulls-Modus '{mode}' erfordert einen level_filter oder rating_level_filter zur Segmentdefinition. Ohne Filter verwende insert_nulls: none." + }, + "connect_segments_requires_segments_mode": { + "message": "connect_segments erfordert, dass insert_nulls auf 'segments' gesetzt ist. Setze insert_nulls: segments, um Segmentverbindung zu nutzen." + }, + "array_fields_requires_array_format": { + "message": "array_fields kann nur mit output_format: array_of_arrays verwendet werden. Ändere das Ausgabeformat oder entferne array_fields." + }, + "invalid_array_fields": { + "message": "Ungültige array_fields-Vorlage. Verwende Feldnamen in geschweiften Klammern, z.B. '{start_time}, {price_per_kwh}, {level}'." + } + }, + "services": { + "get_price": { + "name": "Preisdaten abrufen", + "description": "Preisdaten für einen bestimmten Zeitraum mit automatischem Routing abrufen. Entwicklungs- und Test-Service für die price_info_for_range API-Funktion. Verwendet automatisch PRICE_INFO, PRICE_INFO_RANGE oder beide basierend auf der Zeitraumgrenze.", + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurations-Eintrag-ID für die Tibber-Integration." + }, + "start_time": { + "name": "Startzeit", + "description": "Start des Zeitraums (inklusive, zeitzonenbewusst)." + }, + "end_time": { + "name": "Endzeit", + "description": "Ende des Zeitraums (exklusive, zeitzonenbewusst)." + } + } + }, + "get_apexcharts_yaml": { + "name": "ApexCharts-Karten-YAML abrufen", + "description": "⚠️ WICHTIG: Dieser Service generiert eine GRUNDLEGENDE BEISPIEL-Konfiguration für die ApexCharts-Karte als Startpunkt. Es ist KEINE vollständige Lösung für alle ApexCharts-Funktionen. Diese Integration ist primär ein DATENLIEFERANT. Das generierte YAML zeigt, wie du den `get_chartdata`-Service zum Abrufen von Preisdaten nutzt. Aufgrund der segmentierten Natur unserer Daten (verschiedene Zeitabschnitte pro Serie) und der Nutzung von Home Assistants Service-API statt Entity-Attributen sind viele erweiterte ApexCharts-Funktionen (wie in_header, bestimmte Transformationen) nicht kompatibel oder erfordern manuelle Anpassung. Du darfst das generierte YAML gerne für deine spezifischen Bedürfnisse anpassen, aber bitte verstehe, dass umfassender ApexCharts-Konfigurations-Support außerhalb des Umfangs dieser Integration liegt. Community-Beiträge mit verbesserten Konfigurationen sind immer willkommen - wenn du ein besseres Setup findest, das funktioniert, teile es bitte, damit alle davon profitieren können! Für direkten Datenzugriff zum Erstellen eigener Diagramme nutze stattdessen den `get_chartdata`-Service.", + "fields": { + "entry_id": { + "name": "Eintrags-ID", + "description": "Die Konfigurationseintrags-ID für die Tibber-Integration." }, "day": { - "options": { - "yesterday": "Gestern", - "today": "Heute", - "tomorrow": "Morgen", - "rolling_window": "Rollierendes Fenster", - "rolling_window_autozoom": "Rollierendes Fenster (Auto-Zoom)" - } - }, - "resolution": { - "options": { - "interval": "Intervall (15 Min)", - "hourly": "Stündlich" - } - }, - "output_format": { - "options": { - "array_of_objects": "Array aus Objekten", - "array_of_arrays": "Array aus Arrays" - } + "name": "Tag", + "description": "Welcher Tag visualisiert werden soll (Standard: Rollierendes Fenster). Feste Tag-Optionen (Gestern/Heute/Morgen) zeigen 24h-Fenster ohne zusätzliche Abhängigkeiten. Dynamische Optionen benötigen config-template-card: Rollierendes Fenster zeigt ein festes 48h-Fenster, das automatisch zwischen gestern+heute und heute+morgen wechselt basierend auf Datenverfügbarkeit. Rollierendes Fenster (Auto-Zoom) verhält sich gleich, zoomt aber zusätzlich automatisch rein (2h Rückblick + verbleibende Zeit bis Mitternacht, graph_span verringert sich alle 15 Minuten)." }, "level_type": { - "options": { - "rating_level": "Preisbewertung (niedrig/normal/hoch)", - "level": "Preisniveau (sehr günstig bis sehr teuer)" - } + "name": "Stufen-Typ", + "description": "Wähle, welche Preisstufen-Klassifizierung visualisiert werden soll: 'rating_level' (niedrig/normal/hoch basierend auf deinen konfigurierten Schwellenwerten) oder 'level' (Tibber-API-Stufen: sehr günstig/günstig/normal/teuer/sehr teuer)." + }, + "highlight_best_price": { + "name": "Bestpreis-Zeiträume hervorheben", + "description": "Füge eine halbtransparente grüne Überlagerung hinzu, um die Bestpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der optimalen Zeiten für den Energieverbrauch." + }, + "highlight_peak_price": { + "name": "Spitzenpreis-Zeiträume hervorheben", + "description": "Füge eine halbtransparente rote Überlagerung hinzu, um die Spitzenpreis-Zeiträume im Diagramm hervorzuheben. Dies erleichtert die visuelle Identifizierung der Zeiten, in denen Energie am teuersten ist." + }, + "resolution": { + "name": "Auflösung", + "description": "Zeitauflösung für die Diagrammdaten. 'interval' (Standard): Originale 15-Minuten-Intervalle (96 Punkte pro Tag). 'hourly': Aggregierte Stundenwerte mit einem rollierenden 60-Minuten-Fenster (24 Punkte pro Tag) für ein übersichtlicheres Diagramm." + } + } + }, + "get_chartdata": { + "name": "Diagrammdaten abrufen", + "description": "Gibt Preisdaten in einem einfachen, diagrammfreundlichen Format kompatibel mit der Tibber Core Integration zurück. Perfekt für beliebte Diagramm-Karten wie ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card oder die eingebaute History Graph Card. Feldnamen und Datenstruktur können an die Anforderungen deines Diagramms angepasst werden.", + "sections": { + "general": { + "name": "Allgemein", + "description": "Basisoptionen für das Abrufen von Diagrammdaten." + }, + "selection": { + "name": "Auswahl", + "description": "Wähle aus, welche Daten in die Ausgabe aufgenommen werden sollen." + }, + "filters": { + "name": "Filter", + "description": "Filtere Daten basierend auf Preisniveaus, Preisbewertungen oder speziellen Zeiträumen." + }, + "transformation": { + "name": "Daten transformieren", + "description": "Transformiere die Datenausgabe für bessere Diagrammkompatibilität." + }, + "format": { + "name": "Format", + "description": "Passe das Ausgabeformat an." + }, + "arrays_of_arrays": { + "name": "Erweiterte Ausgabeeinstellungen: Array von Arrays", + "description": "Einstellungen für das Ausgabeformat bei Verwendung eines Arrays von Arrays." + }, + "arrays_of_objects": { + "name": "Erweiterte Ausgabeeinstellungen: Array von Objekten", + "description": "Einstellungen für das Ausgabeformat bei Verwendung eines Arrays von Objekten." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "day": { + "name": "Tag", + "description": "Für welche(n) Tag(e) sollen Preise abgerufen werden. Du kannst mehrere Tage auswählen. Falls nicht angegeben, wird ein rollierendes 2-Tages-Fenster zurückgegeben: heute+morgen (wenn Morgendaten verfügbar) oder gestern+heute (wenn Morgendaten noch nicht verfügbar). Dies ermöglicht eine kontinuierliche Diagrammanzeige ohne Lücken." + }, + "resolution": { + "name": "Auflösung", + "description": "Zeitauflösung für die zurückgegebenen Daten. Optionen: 'interval' (Standard, 15-Minuten-Intervalle, 96 Datenpunkte pro Tag), 'hourly' (stündliche Durchschnitte, 24 Datenpunkte pro Tag)." + }, + "output_format": { + "name": "Ausgabeformat", + "description": "Ausgabeformat für die zurückgegebenen Daten. Optionen: 'array_of_objects' (Standard, Array von Objekten mit anpassbaren Feldnamen), 'array_of_arrays' (Array von [Zeitstempel, Preis]-Arrays mit abschließendem Null-Punkt für Stepline-Charts)." + }, + "array_fields": { + "name": "Array-Felder", + "description": "Definiere, welche Felder im array_of_arrays-Format enthalten sein sollen. Verwende Feldnamen in geschweiften Klammern, getrennt durch Kommas. Verfügbare Felder: start_time, price_per_kwh, level, rating_level, average. Felder werden automatisch aktiviert, auch wenn include_*-Optionen nicht gesetzt sind. Leer lassen für Standard (nur Zeitstempel und Preis)." + }, + "subunit_currency": { + "name": "Unterwährungseinheit", + "description": "Gibt Preise in Unterwährungseinheiten zurück (Cent für EUR, Øre für NOK/SEK) statt in Basiswährungseinheiten. Standardmäßig deaktiviert." + }, + "round_decimals": { + "name": "Dezimalstellen runden", + "description": "Anzahl der Dezimalstellen, auf die Preise gerundet werden sollen (0-10). Falls nicht angegeben, wird die Standardgenauigkeit verwendet (4 Dezimalstellen für Basiswährung, 2 für Unterwährungseinheit)." + }, + "include_level": { + "name": "Preisniveau einschließen", + "description": "Fügt das Tibber-Preisniveau (sehr günstig/günstig/normal/teuer/sehr teuer) zu jedem Datenpunkt hinzu." + }, + "include_rating_level": { + "name": "Preisbewertung einschließen", + "description": "Fügt die berechnete Preisbewertung (niedrig/normal/hoch) basierend auf deinen konfigurierten Schwellwerten zu jedem Datenpunkt hinzu." + }, + "include_average": { + "name": "Durchschnitt einschließen", + "description": "Den Tagesdurchschnittspreis in jedem Datenpunkt zum Vergleich einschließen." + }, + "include_energy": { + "name": "Energiepreis einschließen", + "description": "Den reinen Energie-/Spotpreis (ohne Steuern und Gebühren) in jedem Datenpunkt einschließen. Dies ist das 'energy'-Feld aus der Tibber-API, nützlich für Einspeisungs-/Salderungsberechnungen." + }, + "include_tax": { + "name": "Steueranteil einschließen", + "description": "Den Steueranteil des Preises in jedem Datenpunkt einschließen. Dies ist das 'tax'-Feld aus der Tibber-API, das Gebühren, Steuern und Netzentgelte darstellt." }, "level_filter": { - "options": { - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } + "name": "Preisniveau-Filter", + "description": "Intervalle filtern, um nur bestimmte Tibber-Preisniveaus einzuschließen (sehr günstig/günstig/normal/teuer/sehr teuer). Falls nicht angegeben, werden alle Niveaus eingeschlossen." }, "rating_level_filter": { - "options": { - "low": "Niedrig", - "normal": "Normal", - "high": "Hoch" - } - }, - "insert_nulls": { - "options": { - "none": "Keine", - "segments": "Segmente", - "all": "Alle" - } + "name": "Preisbewertungs-Filter", + "description": "Intervalle filtern, um nur bestimmte Preisbewertungen einzuschließen (niedrig/normal/hoch). Falls nicht angegeben, werden alle Bewertungen eingeschlossen." }, "period_filter": { - "options": { - "best_price": "Bestpreis-Zeiträume", - "peak_price": "Spitzenpreis-Zeiträume" - } + "name": "Perioden-Filter", + "description": "Intervalle filtern, um nur solche innerhalb von Bestepreis- oder Spitzenpreis-Zeiträumen einzuschließen. Optionen: 'best_price' (nur Intervalle in Beste-Preis-Perioden), 'peak_price' (nur Intervalle in Spitzen-Preis-Perioden). Falls nicht angegeben, werden alle Intervalle eingeschlossen. Verwendet vorberechnete Periodendaten von Binär-Sensoren." + }, + "insert_nulls": { + "name": "NULL-Werte einfügen", + "description": "Steuert das Einfügen von NULL-Werten für gefilterte Daten. 'none' (Standard): Keine NULL-Werte, nur passende Intervalle. 'segments': NULL-Punkte an Segmentgrenzen für saubere Lücken in Diagrammen hinzufügen (empfohlen für Stufenliniendiagramme). 'all': NULL für alle Zeitstempel einfügen, bei denen der Filter nicht übereinstimmt (nützlich für kontinuierliche Zeitreihenvisualisierung)." + }, + "connect_segments": { + "name": "Segmente verbinden", + "description": "[NUR BEI 'NULL-Werte einfügen'] Wenn aktiviert, werden an Segmentgrenzen Verbindungspunkte hinzugefügt, um verschiedene Preisstufen-Segmente in Stufenliniendiagrammen visuell zu verbinden. Bei fallendem Preis wird ein Punkt mit dem niedrigeren Preis am Ende des aktuellen Segments hinzugefügt. Bei steigendem Preis wird ein Haltepunkt vor der Lücke hinzugefügt. Dies erzeugt sanfte visuelle Übergänge zwischen Segmenten anstelle von abrupten Lücken." + }, + "add_trailing_null": { + "name": "Abschließenden Null-Punkt hinzufügen", + "description": "Füge einen finalen Datenpunkt mit Nullwerten (außer Zeitstempel) am Ende hinzu. Einige Diagrammbibliotheken benötigen dies, um Extrapolation/Interpolation zum Viewport-Rand bei Verwendung von Stufendarstellung zu verhindern. Deaktiviert lassen, es sei denn, dein Diagramm benötigt es." + }, + "start_time_field": { + "name": "Startzeit-Feldname", + "description": "Benutzerdefinierter Name für das Startzeit-Feld in der Ausgabe. Standardmäßig 'start_time', wenn nicht angegeben." + }, + "end_time_field": { + "name": "Endzeit-Feldname", + "description": "Benutzerdefinierter Name für das Endzeit-Feld in der Ausgabe. Standardmäßig 'end_time', wenn nicht angegeben. Nur verwendet mit period_filter." + }, + "price_field": { + "name": "Preis-Feldname", + "description": "Benutzerdefinierter Name für das Preis-Feld in der Ausgabe. Standard ist 'price_per_kwh', falls nicht angegeben." + }, + "level_field": { + "name": "Preisniveau-Feldname", + "description": "Benutzerdefinierter Name für das Preisniveau-Feld in der Ausgabe. Standard ist 'level', falls nicht angegeben. Wird nur verwendet, wenn include_level aktiviert ist." + }, + "rating_level_field": { + "name": "Preisbewertung-Feldname", + "description": "Benutzerdefinierter Name für das Preisbewertungs-Feld in der Ausgabe. Standard ist 'rating_level', falls nicht angegeben. Wird nur verwendet, wenn include_rating_level aktiviert ist." + }, + "average_field": { + "name": "Durchschnitts-Feldname", + "description": "Benutzerdefinierter Name für das Durchschnitts-Feld in der Ausgabe. Standard ist 'average', falls nicht angegeben. Wird nur verwendet, wenn include_average aktiviert ist." + }, + "energy_field": { + "name": "Energiepreis-Feldname", + "description": "Benutzerdefinierter Name für das Energiepreis-Feld in der Ausgabe. Standard ist 'energy_price', falls nicht angegeben. Wird nur verwendet, wenn include_energy aktiviert ist." + }, + "tax_field": { + "name": "Steuer-Feldname", + "description": "Benutzerdefinierter Name für das Steuer-Feld in der Ausgabe. Standard ist 'tax', falls nicht angegeben. Wird nur verwendet, wenn include_tax aktiviert ist." }, "metadata": { - "options": { - "include": "Einbeziehen (Daten + Metadaten)", - "only": "Nur Metadaten", - "none": "Keine (nur Daten)" - } + "name": "Metadaten", + "description": "Steuerung der Metadaten-Einbindung in der Antwort. 'include' (Standard): Gibt Chart-Daten und Metadaten mit Preisstatistiken, Währungsinformationen, Y-Achsen-Vorschlägen und Zeitbereich zurück. 'only': Gibt nur Metadaten zurück ohne Chart-Daten zu verarbeiten (schnell, nützlich für dynamische Y-Achsen-Konfiguration). 'none': Gibt nur Chart-Daten ohne Metadaten zurück." }, - "volatility": { - "options": { - "low": "Niedrig", - "moderate": "Moderat", - "high": "Hoch", - "very_high": "Sehr hoch" - } + "data_key": { + "name": "Daten-Schlüssel", + "description": "Benutzerdefinierter Name für den obersten Datenschlüssel in der Antwort. Standard ist 'data', falls nicht angegeben." + } + } + }, + "refresh_user_data": { + "name": "Benutzerdaten aktualisieren", + "description": "Erzwingt eine Aktualisierung der Benutzerdaten (Häuser, Profilinformationen) aus der Tibber API. Dies kann nützlich sein, nachdem Änderungen an deinem Tibber-Konto vorgenommen wurden oder bei der Fehlerbehebung von Verbindungsproblemen.", + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + } + } + }, + "find_cheapest_block": { + "name": "Günstigsten Block finden", + "description": "Findet das günstigste zusammenhängende Zeitfenster einer bestimmten Dauer. Gedacht für Geräteplanung: Spülmaschine, Waschmaschine, Trockner usw. Gibt das günstigste Fenster mit Start-/Endzeiten und Preisstatistiken zurück.", + "sections": { + "search_range": { + "name": "Suchbereich", + "description": "Zeitfenster fuer die Suche festlegen." }, - "current_interval_price_level": { - "options": { - "any": "Beliebig", - "very_cheap": "Sehr günstig", - "cheap": "Günstig", - "normal": "Normal", - "expensive": "Teuer", - "very_expensive": "Sehr teuer" - } + "time_alternatives": { + "name": "Alternative Zeitbereich-Optionen", + "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." }, - "currency_display_mode": { - "options": { - "base": "Basiswährung (€, kr)", - "subunit": "Unterwährungseinheit (ct, øre)" - } + "price_filter": { + "name": "Preisstufen-Filter", + "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." }, - "average_sensor_display": { - "options": { - "median": "Median", - "mean": "Arithmetisches Mittel" - } + "output": { + "name": "Ausgabeoptionen", + "description": "Kostenabschaetzung und Vergleichsausgabe steuern." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "duration": { + "name": "Dauer", + "description": "Länge des gewünschten zusammenhängenden Fensters. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 12 Stunden." + }, + "search_start": { + "name": "Suchbeginn", + "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." + }, + "search_end": { + "name": "Suchende", + "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." + }, + "search_start_time": { + "name": "Suchbeginn-Uhrzeit", + "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." + }, + "search_start_day_offset": { + "name": "Suchbeginn Tages-Versatz", + "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." + }, + "search_end_time": { + "name": "Suchende-Uhrzeit", + "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." + }, + "search_end_day_offset": { + "name": "Suchende Tages-Versatz", + "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." + }, + "search_start_offset_minutes": { + "name": "Suchbeginn-Versatz (Minuten)", + "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." + }, + "search_end_offset_minutes": { + "name": "Suchende-Versatz (Minuten)", + "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." + }, + "include_current_interval": { + "name": "Aktuelles Intervall einbeziehen", + "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." + }, + "use_base_unit": { + "name": "Basiswährung verwenden", + "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." }, "search_scope": { - "options": { - "today": "Heute", - "tomorrow": "Morgen", - "remaining_today": "Rest heute", - "next_24h": "Naechste 24 Stunden", - "next_48h": "Naechste 48 Stunden" - } + "name": "Suchbereich (Shortcut)", + "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." + }, + "max_price_level": { + "name": "Maximale Preisstufe", + "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." + }, + "min_price_level": { + "name": "Minimale Preisstufe", + "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." + }, + "include_comparison_details": { + "name": "Vergleichsdetails einschliessen", + "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." + }, + "power_profile": { + "name": "Leistungsprofil", + "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." } + } }, - "title": "Tibber Preisinformationen & Bewertungen" + "find_most_expensive_block": { + "name": "Teuersten Block finden", + "description": "Findet das teuerste zusammenhängende Zeitfenster einer bestimmten Dauer. Nützlich zur Erkennung von Spitzenpreiszeiträumen, die vermieden werden sollten. Gibt das teuerste Fenster mit Start-/Endzeiten und Preisstatistiken zurück.", + "sections": { + "search_range": { + "name": "Suchbereich", + "description": "Zeitfenster fuer die Suche festlegen." + }, + "time_alternatives": { + "name": "Alternative Zeitbereich-Optionen", + "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." + }, + "price_filter": { + "name": "Preisstufen-Filter", + "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." + }, + "output": { + "name": "Ausgabeoptionen", + "description": "Kostenabschaetzung und Vergleichsausgabe steuern." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "duration": { + "name": "Dauer", + "description": "Länge des gewünschten zusammenhängenden Fensters. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 12 Stunden." + }, + "search_start": { + "name": "Suchbeginn", + "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." + }, + "search_end": { + "name": "Suchende", + "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." + }, + "search_start_time": { + "name": "Suchbeginn-Uhrzeit", + "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." + }, + "search_start_day_offset": { + "name": "Suchbeginn Tages-Versatz", + "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." + }, + "search_end_time": { + "name": "Suchende-Uhrzeit", + "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." + }, + "search_end_day_offset": { + "name": "Suchende Tages-Versatz", + "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." + }, + "search_start_offset_minutes": { + "name": "Suchbeginn-Versatz (Minuten)", + "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." + }, + "search_end_offset_minutes": { + "name": "Suchende-Versatz (Minuten)", + "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." + }, + "include_current_interval": { + "name": "Aktuelles Intervall einbeziehen", + "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." + }, + "use_base_unit": { + "name": "Basiswährung verwenden", + "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." + }, + "search_scope": { + "name": "Suchbereich (Shortcut)", + "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." + }, + "max_price_level": { + "name": "Maximale Preisstufe", + "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." + }, + "min_price_level": { + "name": "Minimale Preisstufe", + "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." + }, + "include_comparison_details": { + "name": "Vergleichsdetails einschliessen", + "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." + }, + "power_profile": { + "name": "Leistungsprofil", + "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." + } + } + }, + "find_cheapest_hours": { + "name": "Günstigste Stunden finden", + "description": "Findet die günstigsten Intervalle für eine bestimmte Gesamtdauer, nicht unbedingt zusammenhängend. Gedacht für flexible Lasten: Batterieladung, E-Auto, Warmwasserspeicher. Gibt einen Zeitplan mit Intervallen gruppiert in zusammenhängende Segmente zurück.", + "sections": { + "search_range": { + "name": "Suchbereich", + "description": "Zeitfenster fuer die Suche festlegen." + }, + "time_alternatives": { + "name": "Alternative Zeitbereich-Optionen", + "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." + }, + "price_filter": { + "name": "Preisstufen-Filter", + "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." + }, + "output": { + "name": "Ausgabeoptionen", + "description": "Kostenabschaetzung und Vergleichsausgabe steuern." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "duration": { + "name": "Dauer", + "description": "Benötigte günstige Gesamtzeit. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 24 Stunden." + }, + "search_start": { + "name": "Suchbeginn", + "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." + }, + "search_end": { + "name": "Suchende", + "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." + }, + "search_start_time": { + "name": "Suchbeginn-Uhrzeit", + "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." + }, + "search_start_day_offset": { + "name": "Suchbeginn Tages-Versatz", + "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." + }, + "search_end_time": { + "name": "Suchende-Uhrzeit", + "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." + }, + "search_end_day_offset": { + "name": "Suchende Tages-Versatz", + "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." + }, + "search_start_offset_minutes": { + "name": "Suchbeginn-Versatz (Minuten)", + "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." + }, + "search_end_offset_minutes": { + "name": "Suchende-Versatz (Minuten)", + "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." + }, + "include_current_interval": { + "name": "Aktuelles Intervall einbeziehen", + "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." + }, + "min_segment_duration": { + "name": "Minimale Segmentdauer", + "description": "Minimale zusammenhängende Laufzeit. Verhindert schnelles Ein-/Ausschalten bei Geräten mit Mindestlaufzeiten. Wird automatisch auf die nächste Viertelstunde aufgerundet. Standard: 15 Minuten. Maximum: 4 Stunden." + }, + "use_base_unit": { + "name": "Basiswährung verwenden", + "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." + }, + "search_scope": { + "name": "Suchbereich (Shortcut)", + "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." + }, + "max_price_level": { + "name": "Maximale Preisstufe", + "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." + }, + "min_price_level": { + "name": "Minimale Preisstufe", + "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." + }, + "include_comparison_details": { + "name": "Vergleichsdetails einschliessen", + "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." + }, + "power_profile": { + "name": "Leistungsprofil", + "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." + } + } + }, + "find_most_expensive_hours": { + "name": "Teuerste Stunden finden", + "description": "Findet die teuersten Intervalle für eine bestimmte Gesamtdauer, nicht unbedingt zusammenhängend. Nützlich zur Erkennung von Spitzenpreiszeiträumen, die vermieden werden sollten. Gibt einen Zeitplan mit Intervallen gruppiert in zusammenhängende Segmente zurück.", + "sections": { + "search_range": { + "name": "Suchbereich", + "description": "Zeitfenster fuer die Suche festlegen." + }, + "time_alternatives": { + "name": "Alternative Zeitbereich-Optionen", + "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." + }, + "price_filter": { + "name": "Preisstufen-Filter", + "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." + }, + "output": { + "name": "Ausgabeoptionen", + "description": "Kostenabschaetzung und Vergleichsausgabe steuern." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "duration": { + "name": "Dauer", + "description": "Zu findende teure Gesamtzeit. Wird automatisch auf die nächste Viertelstunde aufgerundet. Maximum: 24 Stunden." + }, + "search_start": { + "name": "Suchbeginn", + "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." + }, + "search_end": { + "name": "Suchende", + "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." + }, + "search_start_time": { + "name": "Suchbeginn-Uhrzeit", + "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." + }, + "search_start_day_offset": { + "name": "Suchbeginn Tages-Versatz", + "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." + }, + "search_end_time": { + "name": "Suchende-Uhrzeit", + "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." + }, + "search_end_day_offset": { + "name": "Suchende Tages-Versatz", + "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." + }, + "search_start_offset_minutes": { + "name": "Suchbeginn-Versatz (Minuten)", + "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." + }, + "search_end_offset_minutes": { + "name": "Suchende-Versatz (Minuten)", + "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." + }, + "include_current_interval": { + "name": "Aktuelles Intervall einbeziehen", + "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." + }, + "min_segment_duration": { + "name": "Minimale Segmentdauer", + "description": "Minimale zusammenhängende Laufzeit. Verhindert schnelles Ein-/Ausschalten bei Geräten mit Mindestlaufzeiten. Wird automatisch auf die nächste Viertelstunde aufgerundet. Standard: 15 Minuten. Maximum: 4 Stunden." + }, + "use_base_unit": { + "name": "Basiswährung verwenden", + "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." + }, + "search_scope": { + "name": "Suchbereich (Shortcut)", + "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." + }, + "max_price_level": { + "name": "Maximale Preisstufe", + "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." + }, + "min_price_level": { + "name": "Minimale Preisstufe", + "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." + }, + "include_comparison_details": { + "name": "Vergleichsdetails einschliessen", + "description": "Das price_comparison-Ergebnis um zusaetzliche Felder ergaenzen: comparison_price_min, comparison_price_max und (nur Block) comparison_window_end." + }, + "power_profile": { + "name": "Leistungsprofil", + "description": "Variable Leistungsaufnahme in Watt pro 15-Minuten-Intervall. Wenn gesetzt, gibt estimated_total_cost den tatsaechlichen Verbrauch statt einer festen 1-kW-Last an." + } + } + }, + "find_cheapest_schedule": { + "name": "Guenstigstes Programm planen", + "description": "Plant mehrere Geraete optimal ohne Zeitueberschneidung. Jede Aufgabe erhaelt das guenstigste verfuegbare zusammenhaengende Zeitfenster.", + "sections": { + "scheduling_options": { + "name": "Planungsoptionen", + "description": "Aufgaben und Puffer zwischen den Geraeteaufzeiten konfigurieren." + }, + "search_range": { + "name": "Suchbereich", + "description": "Zeitfenster fuer die Suche festlegen." + }, + "time_alternatives": { + "name": "Alternative Zeitbereich-Optionen", + "description": "Alternative Moeglichkeiten zum Festlegen des Suchbereichs ueber Tageszeit und Offsets." + }, + "price_filter": { + "name": "Preisstufen-Filter", + "description": "Suche auf Intervalle innerhalb des angegebenen Preisstufen-Bereichs einschraenken." + }, + "output": { + "name": "Ausgabeoptionen", + "description": "Kostenabschaetzung und Vergleichsausgabe steuern." + } + }, + "fields": { + "entry_id": { + "name": "Eintrag-ID", + "description": "Die Konfigurationseintrag-ID für die Tibber-Integration." + }, + "tasks": { + "name": "Aufgaben", + "description": "Liste der zu planenden Aufgaben. Jede Aufgabe benoetigt name (Text) und duration (hh:mm:ss). Optional: power_profile (Watt pro 15-min-Intervall). Maximal 4 Aufgaben." + }, + "gap_minutes": { + "name": "Pause zwischen Aufgaben (Minuten)", + "description": "Mindestpause in Minuten zwischen aufeinanderfolgenden Aufgaben. Wird auf 15 Minuten aufgerundet. Standard: 0 (keine Pause)." + }, + "search_scope": { + "name": "Suchbereich (Shortcut)", + "description": "Kurzwahl fuer haeufige Suchbereiche. Ueberschreibt alle anderen Zeitbereich-Optionen. today/tomorrow = ganzer Kalendertag, remaining_today = jetzt bis Mitternacht, next_24h/next_48h = rollierendes Fenster ab jetzt." + }, + "search_start": { + "name": "Suchbeginn", + "description": "Beginn des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Startoptionen. Standardmäßig jetzt, wenn nicht angegeben." + }, + "search_end": { + "name": "Suchende", + "description": "Ende des Suchbereichs als exaktes Datum und Uhrzeit. Höchste Priorität — überschreibt alle anderen Endoptionen. Standardmäßig Ende von morgen, wenn nicht angegeben." + }, + "search_start_time": { + "name": "Suchbeginn-Uhrzeit", + "description": "Alternative: Suche ab dieser Uhrzeit starten. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchbeginn (Datum/Uhrzeit) gesetzt ist." + }, + "search_start_day_offset": { + "name": "Suchbeginn Tages-Versatz", + "description": "Tages-Versatz für Suchbeginn-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchbeginn-Uhrzeit verwendet." + }, + "search_end_time": { + "name": "Suchende-Uhrzeit", + "description": "Alternative: Suche bis zu dieser Uhrzeit. Mit Tages-Versatz kombinieren. Wird ignoriert, wenn Suchende (Datum/Uhrzeit) gesetzt ist." + }, + "search_end_day_offset": { + "name": "Suchende Tages-Versatz", + "description": "Tages-Versatz für Suchende-Uhrzeit. -7 bis 2: -1 = gestern, 0 = heute, 1 = morgen. Negative Werte suchen in der Vergangenheit. Nur mit Suchende-Uhrzeit verwendet." + }, + "search_start_offset_minutes": { + "name": "Suchbeginn-Versatz (Minuten)", + "description": "Alternative: Suche startet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (60 = in 1 Stunde), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchbeginn oder Suchbeginn-Uhrzeit gesetzt ist." + }, + "search_end_offset_minutes": { + "name": "Suchende-Versatz (Minuten)", + "description": "Alternative: Suche endet in dieser Anzahl Minuten ab jetzt. Positiv = Zukunft (480 = in 8 Stunden), negativ = Vergangenheit (-60 = vor 1 Stunde). Wird ignoriert, wenn Suchende oder Suchende-Uhrzeit gesetzt ist." + }, + "include_current_interval": { + "name": "Aktuelles Intervall einbeziehen", + "description": "Das aktuell laufende 15-Minuten-Intervall in die Suche einbeziehen. Wenn aktiviert (Standard), beginnt die Suche am Anfang des aktuellen Intervalls, sodass es Teil des Ergebnisses sein kann." + }, + "max_price_level": { + "name": "Maximale Preisstufe", + "description": "Nur Intervalle bis zu dieser Tibber-Preisstufe beruecksichtigen. very_cheap = restriktivste, very_expensive = keine Einschraenkung." + }, + "min_price_level": { + "name": "Minimale Preisstufe", + "description": "Nur Intervalle ab dieser Tibber-Preisstufe beruecksichtigen. Nuetzlich fuer find_most_expensive, um wirklich teure Intervalle zu fokussieren." + }, + "use_base_unit": { + "name": "Basiswährung verwenden", + "description": "Preise in Basiswährung (EUR, NOK) statt der konfigurierten Anzeigeeinheit (ct, øre) erzwingen. Nützlich für Berechnungen." + } + } + } + }, + "selector": { + "account_choice": { + "options": { + "new_token": "Neues Tibber-Konto per API-Token hinzufügen" + } + }, + "day": { + "options": { + "yesterday": "Gestern", + "today": "Heute", + "tomorrow": "Morgen", + "rolling_window": "Rollierendes Fenster", + "rolling_window_autozoom": "Rollierendes Fenster (Auto-Zoom)" + } + }, + "resolution": { + "options": { + "interval": "Intervall (15 Min)", + "hourly": "Stündlich" + } + }, + "output_format": { + "options": { + "array_of_objects": "Array aus Objekten", + "array_of_arrays": "Array aus Arrays" + } + }, + "level_type": { + "options": { + "rating_level": "Preisbewertung (niedrig/normal/hoch)", + "level": "Preisniveau (sehr günstig bis sehr teuer)" + } + }, + "level_filter": { + "options": { + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" + } + }, + "rating_level_filter": { + "options": { + "low": "Niedrig", + "normal": "Normal", + "high": "Hoch" + } + }, + "insert_nulls": { + "options": { + "none": "Keine", + "segments": "Segmente", + "all": "Alle" + } + }, + "period_filter": { + "options": { + "best_price": "Bestpreis-Zeiträume", + "peak_price": "Spitzenpreis-Zeiträume" + } + }, + "metadata": { + "options": { + "include": "Einbeziehen (Daten + Metadaten)", + "only": "Nur Metadaten", + "none": "Keine (nur Daten)" + } + }, + "volatility": { + "options": { + "low": "Niedrig", + "moderate": "Moderat", + "high": "Hoch", + "very_high": "Sehr hoch" + } + }, + "current_interval_price_level": { + "options": { + "any": "Beliebig", + "very_cheap": "Sehr günstig", + "cheap": "Günstig", + "normal": "Normal", + "expensive": "Teuer", + "very_expensive": "Sehr teuer" + } + }, + "currency_display_mode": { + "options": { + "base": "Basiswährung (€, kr)", + "subunit": "Unterwährungseinheit (ct, øre)" + } + }, + "average_sensor_display": { + "options": { + "median": "Median", + "mean": "Arithmetisches Mittel" + } + }, + "search_scope": { + "options": { + "today": "Heute", + "tomorrow": "Morgen", + "remaining_today": "Rest heute", + "next_24h": "Naechste 24 Stunden", + "next_48h": "Naechste 48 Stunden" + } + } + }, + "title": "Tibber Preisinformationen & Bewertungen" } diff --git a/custom_components/tibber_prices/translations/en.json b/custom_components/tibber_prices/translations/en.json index 1ea607c..e846aff 100644 --- a/custom_components/tibber_prices/translations/en.json +++ b/custom_components/tibber_prices/translations/en.json @@ -1,1941 +1,1965 @@ { - "config": { - "step": { - "account_choice": { - "title": "Choose Account", - "description": "You can add another home of an existing Tibber account or enter a new API token for a different account.", - "data": { - "account_choice": "Account" - }, - "submit": "Continue →" - }, - "new_token": { - "title": "Enter API Token", - "description": "Set up Tibber Price Information & Ratings.\n\nTo generate an API access token, visit [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API access token" - }, - "submit": "Validate Token" - }, - "user": { - "description": "Set up Tibber Price Information & Ratings.\n\nTo generate an API access token, visit [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API access token" - }, - "submit": "Validate Token" - }, - "select_home": { - "description": "Select a home to fetch price information and ratings.", - "data": { - "home_id": "Home" - }, - "title": "Pick a Home", - "submit": "Select Home" - }, - "finish": { - "description": "Select a home to fetch price information and ratings.", - "data": { - "home_id": "Home ID" - }, - "title": "Pick a home", - "submit": "Select Home" - }, - "reauth_confirm": { - "title": "Reauthenticate Tibber Price Integration", - "description": "The access token for Tibber is no longer valid. Please enter a new API access token to continue using this integration.\n\nTo generate a new API access token, visit [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API access token" - }, - "submit": "Update Token" - } + "config": { + "step": { + "account_choice": { + "title": "Choose Account", + "description": "You can add another home of an existing Tibber account or enter a new API token for a different account.", + "data": { + "account_choice": "Account" }, - "error": { - "auth": "The Tibber Access Token is invalid.", - "connection": "Unable to connect to Tibber. Please check your internet connection.", - "unknown": "Unexpected error", - "cannot_connect": "Failed to connect", - "invalid_access_token": "Invalid access token", - "missing_homes": "The new access token does not have access to all configured homes. Please use an access token that has access to the same Tibber homes.", - "home_already_configured": "This home is already configured in another entry. Each home can only be configured once.", - "no_active_subscription": "This home does not have an active Tibber contract. Only homes with active electricity contracts can be added to Home Assistant.", - "subscription_expired": "The Tibber contract for this home has expired. Only homes with active or future electricity contracts can be added to Home Assistant.", - "future_subscription_warning": "Note: This home's Tibber contract has not started yet. Functionality may be limited until the contract becomes active." + "submit": "Continue →" + }, + "new_token": { + "title": "Enter API Token", + "description": "Set up Tibber Price Information & Ratings.\n\nTo generate an API access token, visit [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API access token" }, - "abort": { - "already_configured": "All available Tibber homes are already configured. Each home can only be configured once.", - "entry_not_found": "Tibber configuration entry not found.", - "setup_complete": "Setup complete! You can change additional options for Tibber Prices in the integration's options after closing this dialog.", - "reauth_successful": "Reauthentication successful. The integration has been updated with the new access token." + "submit": "Validate Token" + }, + "user": { + "description": "Set up Tibber Price Information & Ratings.\n\nTo generate an API access token, visit [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API access token" + }, + "submit": "Validate Token" + }, + "select_home": { + "description": "Select a home to fetch price information and ratings.", + "data": { + "home_id": "Home" + }, + "title": "Pick a Home", + "submit": "Select Home" + }, + "finish": { + "description": "Select a home to fetch price information and ratings.", + "data": { + "home_id": "Home ID" + }, + "title": "Pick a home", + "submit": "Select Home" + }, + "reauth_confirm": { + "title": "Reauthenticate Tibber Price Integration", + "description": "The access token for Tibber is no longer valid. Please enter a new API access token to continue using this integration.\n\nTo generate a new API access token, visit [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API access token" + }, + "submit": "Update Token" + } + }, + "error": { + "auth": "The Tibber Access Token is invalid.", + "connection": "Unable to connect to Tibber. Please check your internet connection.", + "unknown": "Unexpected error", + "cannot_connect": "Failed to connect", + "invalid_access_token": "Invalid access token", + "missing_homes": "The new access token does not have access to all configured homes. Please use an access token that has access to the same Tibber homes.", + "home_already_configured": "This home is already configured in another entry. Each home can only be configured once.", + "no_active_subscription": "This home does not have an active Tibber contract. Only homes with active electricity contracts can be added to Home Assistant.", + "subscription_expired": "The Tibber contract for this home has expired. Only homes with active or future electricity contracts can be added to Home Assistant.", + "future_subscription_warning": "Note: This home's Tibber contract has not started yet. Functionality may be limited until the contract becomes active." + }, + "abort": { + "already_configured": "All available Tibber homes are already configured. Each home can only be configured once.", + "entry_not_found": "Tibber configuration entry not found.", + "setup_complete": "Setup complete! You can change additional options for Tibber Prices in the integration's options after closing this dialog.", + "reauth_successful": "Reauthentication successful. The integration has been updated with the new access token." + } + }, + "common": { + "step_progress": "{step_num} / {total_steps}", + "override_warning_template": "⚠️ {fields} controlled by config entity", + "override_warning_and": "and", + "override_field_label_best_price_min_period_length": "Minimum Period Length", + "override_field_label_best_price_max_level_gap_count": "Gap Tolerance", + "override_field_label_best_price_flex": "Flexibility", + "override_field_label_best_price_min_distance_from_avg": "Minimum Distance", + "override_field_label_enable_min_periods_best": "Achieve Minimum Count", + "override_field_label_min_periods_best": "Minimum Periods", + "override_field_label_relaxation_attempts_best": "Relaxation Attempts", + "override_field_label_peak_price_min_period_length": "Minimum Period Length", + "override_field_label_peak_price_max_level_gap_count": "Gap Tolerance", + "override_field_label_peak_price_flex": "Flexibility", + "override_field_label_peak_price_min_distance_from_avg": "Minimum Distance", + "override_field_label_enable_min_periods_peak": "Achieve Minimum Count", + "override_field_label_min_periods_peak": "Minimum Periods", + "override_field_label_relaxation_attempts_peak": "Relaxation Attempts" + }, + "config_subentries": { + "home": { + "entry_type": "Time-Travel View", + "initiate_flow": { + "user": "Create Time-Travel View" + }, + "title": "Create Time-Travel View", + "step": { + "user": { + "title": "Select Configuration Entry", + "description": "Select the configuration entry for which you want to create a time-travel view.\n\n**Time-travel views** allow you to see historical price data as if it were the current time. This is useful for testing automations or analyzing past price patterns.", + "data": { + "parent_entry_id": "Configuration Entry" + } + }, + "time_offset": { + "title": "Configure Time Offset", + "description": "Configure how far back in time this view should travel.\n\n**Recommended:** Use **≥2 days** offset to avoid conflicts with \"yesterday\" entities that also provide historical data.\n\n**Examples:**\n• **-7 days**: View prices from 7 days ago\n• **-2 days, 3 hours**: View prices from 2 days and 3 hours ago\n• **-14 days**: View prices from 2 weeks ago", + "data": { + "virtual_time_offset_days": "Days Back", + "time_offset": "Additional Time Offset" + }, + "data_description": { + "virtual_time_offset_days": "How many days to travel back in time. Slider range: 0 to 374 days (≈1 year). Recommended: ≥2 days to avoid conflicts with \"yesterday\" entities.", + "time_offset": "Optional fine-tuning: Add hours and/or minutes to the day offset. The time will be automatically subtracted (travel back further). Note: Seconds are ignored - only minute-level precision is supported." + } + }, + "init": { + "title": "Reconfigure Time Offset", + "description": "Update the time offset for this time-travel view.", + "data": { + "virtual_time_offset_days": "Days Back", + "time_offset": "Additional Time Offset" + }, + "data_description": { + "virtual_time_offset_days": "How many days to travel back in time. Slider range: 0 to 374 days (≈1 year). Recommended: ≥2 days to avoid conflicts with \"yesterday\" entities.", + "time_offset": "Optional fine-tuning: Add hours and/or minutes to the day offset. The time will be automatically subtracted (travel back further). Note: Seconds are ignored - only minute-level precision is supported." + } } - }, - "common": { - "step_progress": "{step_num} / {total_steps}", - "override_warning_template": "⚠️ {fields} controlled by config entity", - "override_warning_and": "and", - "override_field_label_best_price_min_period_length": "Minimum Period Length", - "override_field_label_best_price_max_level_gap_count": "Gap Tolerance", - "override_field_label_best_price_flex": "Flexibility", - "override_field_label_best_price_min_distance_from_avg": "Minimum Distance", - "override_field_label_enable_min_periods_best": "Achieve Minimum Count", - "override_field_label_min_periods_best": "Minimum Periods", - "override_field_label_relaxation_attempts_best": "Relaxation Attempts", - "override_field_label_peak_price_min_period_length": "Minimum Period Length", - "override_field_label_peak_price_max_level_gap_count": "Gap Tolerance", - "override_field_label_peak_price_flex": "Flexibility", - "override_field_label_peak_price_min_distance_from_avg": "Minimum Distance", - "override_field_label_enable_min_periods_peak": "Achieve Minimum Count", - "override_field_label_min_periods_peak": "Minimum Periods", - "override_field_label_relaxation_attempts_peak": "Relaxation Attempts" - }, - "config_subentries": { - "home": { - "entry_type": "Time-Travel View", - "initiate_flow": { - "user": "Create Time-Travel View" - }, - "title": "Create Time-Travel View", - "step": { - "user": { - "title": "Select Configuration Entry", - "description": "Select the configuration entry for which you want to create a time-travel view.\n\n**Time-travel views** allow you to see historical price data as if it were the current time. This is useful for testing automations or analyzing past price patterns.", - "data": { - "parent_entry_id": "Configuration Entry" - } - }, - "time_offset": { - "title": "Configure Time Offset", - "description": "Configure how far back in time this view should travel.\n\n**Recommended:** Use **≥2 days** offset to avoid conflicts with \"yesterday\" entities that also provide historical data.\n\n**Examples:**\n• **-7 days**: View prices from 7 days ago\n• **-2 days, 3 hours**: View prices from 2 days and 3 hours ago\n• **-14 days**: View prices from 2 weeks ago", - "data": { - "virtual_time_offset_days": "Days Back", - "time_offset": "Additional Time Offset" - }, - "data_description": { - "virtual_time_offset_days": "How many days to travel back in time. Slider range: 0 to 374 days (≈1 year). Recommended: ≥2 days to avoid conflicts with \"yesterday\" entities.", - "time_offset": "Optional fine-tuning: Add hours and/or minutes to the day offset. The time will be automatically subtracted (travel back further). Note: Seconds are ignored - only minute-level precision is supported." - } - }, - "init": { - "title": "Reconfigure Time Offset", - "description": "Update the time offset for this time-travel view.", - "data": { - "virtual_time_offset_days": "Days Back", - "time_offset": "Additional Time Offset" - }, - "data_description": { - "virtual_time_offset_days": "How many days to travel back in time. Slider range: 0 to 374 days (≈1 year). Recommended: ≥2 days to avoid conflicts with \"yesterday\" entities.", - "time_offset": "Optional fine-tuning: Add hours and/or minutes to the day offset. The time will be automatically subtracted (travel back further). Note: Seconds are ignored - only minute-level precision is supported." - } - } - }, - "error": { - "no_time_offset": "At least one time offset value must be negative (historical data only)." - }, - "abort": { - "already_configured": "**A time-travel view with this exact time offset already exists.**\n\nPlease choose a different offset.", - "no_main_entries": "No main configuration entries found. Please add a Tibber home first.", - "parent_entry_not_found": "Selected configuration entry not found." - } + }, + "error": { + "no_time_offset": "At least one time offset value must be negative (historical data only)." + }, + "abort": { + "already_configured": "**A time-travel view with this exact time offset already exists.**\n\nPlease choose a different offset.", + "no_main_entries": "No main configuration entries found. Please add a Tibber home first.", + "parent_entry_not_found": "Selected configuration entry not found." + } + } + }, + "options": { + "step": { + "init": { + "menu_options": { + "general_settings": "⚙️ General Settings", + "display_settings": "💱 Currency Display", + "current_interval_price_rating": "📊 Price Rating", + "price_level": "🏷️ Price Level", + "volatility": "💨 Price Volatility", + "best_price": "💚 Best Price Period", + "peak_price": "🔴 Peak Price Period", + "price_trend": "📈 Price Trend", + "chart_data_export": "📊 Chart Data Export Sensor", + "reset_to_defaults": "🔄 Reset to Defaults", + "finish": "⬅️ Back" } - }, - "options": { - "step": { - "init": { - "menu_options": { - "general_settings": "⚙️ General Settings", - "display_settings": "💱 Currency Display", - "current_interval_price_rating": "📊 Price Rating", - "price_level": "🏷️ Price Level", - "volatility": "💨 Price Volatility", - "best_price": "💚 Best Price Period", - "peak_price": "🔴 Peak Price Period", - "price_trend": "📈 Price Trend", - "chart_data_export": "📊 Chart Data Export Sensor", - "reset_to_defaults": "🔄 Reset to Defaults", - "finish": "⬅️ Back" - } + }, + "general_settings": { + "title": "⚙️ General Settings", + "description": "**Configure general settings for Tibber Price Information & Ratings.**\n\n---\n\n**User:** {user_login}", + "data": { + "extended_descriptions": "Extended Descriptions", + "average_sensor_display": "Average Sensor Display" + }, + "data_description": { + "extended_descriptions": "Controls whether entity attributes include detailed explanations and usage tips.\n\n• Disabled (default): Brief description only\n• Enabled: Detailed explanation + practical usage examples\n\nExample:\nDisabled = 1 attribute\nEnabled = 2 additional attributes", + "average_sensor_display": "Choose which statistical measure to display in the sensor state for average price sensors. The other value will be shown as an attribute.\n\n• **Median (default)**: Shows the 'typical' price, resistant to extreme spikes - best for display and human interpretation\n• **Arithmetic Mean**: Shows the true mathematical average including all prices - best when you need exact cost calculations\n\nFor automations, use the attribute `price_mean` or `price_median` to access both values regardless of this setting." + }, + "submit": "↩ Save & Back" + }, + "display_settings": { + "title": "💱 Currency Display Settings", + "description": "**Configure how electricity prices are displayed - in base currency (€, kr) or subunit (ct, øre).**\n\n---", + "data": { + "currency_display_mode": "Display Mode" + }, + "data_description": { + "currency_display_mode": "Choose how prices are displayed:\n\n• **Base Currency** (€/kWh, kr/kWh): Decimal values (e.g., 0.25 €/kWh) - differences visible from 3rd-4th decimal place\n• **Subunit Currency** (ct/kWh, øre/kWh): Larger values (e.g., 25.00 ct/kWh) - differences visible from 1st decimal place\n\nDefault depends on your currency:\n• EUR → Subunit (cents) - German/Dutch preference\n• NOK/SEK/DKK → Base (kroner) - Scandinavian preference\n• USD/GBP → Base currency\n\n**💡 Tip:** When selecting Subunit Currency, you can enable the additional \"Current Electricity Price (Energy Dashboard)\" sensor (disabled by default)." + }, + "submit": "↩ Save & Back" + }, + "current_interval_price_rating": { + "title": "📊 Price Rating Settings", + "description": "**Configure thresholds and stabilization for price rating levels (low/normal/high) based on comparison with trailing 24-hour average.**{entity_warning}", + "data": { + "price_rating_threshold_low": "Low Threshold", + "price_rating_threshold_high": "High Threshold", + "price_rating_hysteresis": "Hysteresis", + "price_rating_gap_tolerance": "Gap Tolerance" + }, + "data_description": { + "price_rating_threshold_low": "Percentage below the trailing 24-hour average that the current price must be to qualify as 'low' rating. Example: -10 means at least 10% below average. Sensors with this rating indicate favorable time windows. Default: -10%", + "price_rating_threshold_high": "Percentage above the trailing 24-hour average that the current price must be to qualify as 'high' rating. Example: 10 means at least 10% above average. Sensors with this rating warn about expensive time windows. Default: 10%", + "price_rating_hysteresis": "Percentage band around thresholds to prevent rapid state changes. When the rating is already LOW, the price must rise above (threshold + hysteresis) to switch to NORMAL. Similarly, HIGH requires the price to fall below (threshold - hysteresis) to leave. This provides stability for automations that react to rating changes. Set to 0 to disable. Default: 2%", + "price_rating_gap_tolerance": "Maximum number of consecutive intervals that can be 'smoothed out' if they differ from surrounding ratings. Small isolated rating changes are merged into the dominant neighboring block. This provides stability for automations by preventing brief rating spikes from triggering unnecessary actions. Example: 1 means a single 'normal' interval surrounded by 'high' intervals gets corrected to 'high'. Set to 0 to disable. Default: 1" + }, + "submit": "↩ Save & Back" + }, + "price_level": { + "title": "🏷️ Price Level Settings", + "description": "**Configure stabilization for Tibber's price level classification (very cheap/cheap/normal/expensive/very expensive).**\n\nTibber's API provides a price level field for each interval. This setting smooths out brief fluctuations to prevent automation instability.{entity_warning}", + "data": { + "price_level_gap_tolerance": "Gap Tolerance" + }, + "data_description": { + "price_level_gap_tolerance": "Maximum number of consecutive intervals that can be 'smoothed out' if they differ from surrounding price levels. Small isolated level changes are merged into the dominant neighboring block. Example: 1 means a single 'normal' interval surrounded by 'cheap' intervals gets corrected to 'cheap'. Set to 0 to disable. Default: 1" + }, + "submit": "↩ Save & Back" + }, + "best_price": { + "title": "💚 Best Price Period Settings", + "description": "**Configure settings for the Best Price Period binary sensor. This sensor is active during periods with the lowest electricity prices.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Period Duration & Levels", + "description": "Configure how long periods should be and which price levels to include.", + "data": { + "best_price_min_period_length": "Minimum Period Length", + "best_price_max_level": "Price Level Filter", + "best_price_max_level_gap_count": "Gap Tolerance" }, - "general_settings": { - "title": "⚙️ General Settings", - "description": "**Configure general settings for Tibber Price Information & Ratings.**\n\n---\n\n**User:** {user_login}", - "data": { - "extended_descriptions": "Extended Descriptions", - "average_sensor_display": "Average Sensor Display" - }, - "data_description": { - "extended_descriptions": "Controls whether entity attributes include detailed explanations and usage tips.\n\n• Disabled (default): Brief description only\n• Enabled: Detailed explanation + practical usage examples\n\nExample:\nDisabled = 1 attribute\nEnabled = 2 additional attributes", - "average_sensor_display": "Choose which statistical measure to display in the sensor state for average price sensors. The other value will be shown as an attribute.\n\n• **Median (default)**: Shows the 'typical' price, resistant to extreme spikes - best for display and human interpretation\n• **Arithmetic Mean**: Shows the true mathematical average including all prices - best when you need exact cost calculations\n\nFor automations, use the attribute `price_mean` or `price_median` to access both values regardless of this setting." - }, - "submit": "↩ Save & Back" - }, - "display_settings": { - "title": "💱 Currency Display Settings", - "description": "**Configure how electricity prices are displayed - in base currency (€, kr) or subunit (ct, øre).**\n\n---", - "data": { - "currency_display_mode": "Display Mode" - }, - "data_description": { - "currency_display_mode": "Choose how prices are displayed:\n\n• **Base Currency** (€/kWh, kr/kWh): Decimal values (e.g., 0.25 €/kWh) - differences visible from 3rd-4th decimal place\n• **Subunit Currency** (ct/kWh, øre/kWh): Larger values (e.g., 25.00 ct/kWh) - differences visible from 1st decimal place\n\nDefault depends on your currency:\n• EUR → Subunit (cents) - German/Dutch preference\n• NOK/SEK/DKK → Base (kroner) - Scandinavian preference\n• USD/GBP → Base currency\n\n**💡 Tip:** When selecting Subunit Currency, you can enable the additional \"Current Electricity Price (Energy Dashboard)\" sensor (disabled by default)." - }, - "submit": "↩ Save & Back" - }, - "current_interval_price_rating": { - "title": "📊 Price Rating Settings", - "description": "**Configure thresholds and stabilization for price rating levels (low/normal/high) based on comparison with trailing 24-hour average.**{entity_warning}", - "data": { - "price_rating_threshold_low": "Low Threshold", - "price_rating_threshold_high": "High Threshold", - "price_rating_hysteresis": "Hysteresis", - "price_rating_gap_tolerance": "Gap Tolerance" - }, - "data_description": { - "price_rating_threshold_low": "Percentage below the trailing 24-hour average that the current price must be to qualify as 'low' rating. Example: -10 means at least 10% below average. Sensors with this rating indicate favorable time windows. Default: -10%", - "price_rating_threshold_high": "Percentage above the trailing 24-hour average that the current price must be to qualify as 'high' rating. Example: 10 means at least 10% above average. Sensors with this rating warn about expensive time windows. Default: 10%", - "price_rating_hysteresis": "Percentage band around thresholds to prevent rapid state changes. When the rating is already LOW, the price must rise above (threshold + hysteresis) to switch to NORMAL. Similarly, HIGH requires the price to fall below (threshold - hysteresis) to leave. This provides stability for automations that react to rating changes. Set to 0 to disable. Default: 2%", - "price_rating_gap_tolerance": "Maximum number of consecutive intervals that can be 'smoothed out' if they differ from surrounding ratings. Small isolated rating changes are merged into the dominant neighboring block. This provides stability for automations by preventing brief rating spikes from triggering unnecessary actions. Example: 1 means a single 'normal' interval surrounded by 'high' intervals gets corrected to 'high'. Set to 0 to disable. Default: 1" - }, - "submit": "↩ Save & Back" - }, - "price_level": { - "title": "🏷️ Price Level Settings", - "description": "**Configure stabilization for Tibber's price level classification (very cheap/cheap/normal/expensive/very expensive).**\n\nTibber's API provides a price level field for each interval. This setting smooths out brief fluctuations to prevent automation instability.{entity_warning}", - "data": { - "price_level_gap_tolerance": "Gap Tolerance" - }, - "data_description": { - "price_level_gap_tolerance": "Maximum number of consecutive intervals that can be 'smoothed out' if they differ from surrounding price levels. Small isolated level changes are merged into the dominant neighboring block. Example: 1 means a single 'normal' interval surrounded by 'cheap' intervals gets corrected to 'cheap'. Set to 0 to disable. Default: 1" - }, - "submit": "↩ Save & Back" - }, - "best_price": { - "title": "💚 Best Price Period Settings", - "description": "**Configure settings for the Best Price Period binary sensor. This sensor is active during periods with the lowest electricity prices.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Period Duration & Levels", - "description": "Configure how long periods should be and which price levels to include.", - "data": { - "best_price_min_period_length": "Minimum Period Length", - "best_price_max_level": "Price Level Filter", - "best_price_max_level_gap_count": "Gap Tolerance" - }, - "data_description": { - "best_price_min_period_length": "Minimum duration for a period to be considered as 'best price'. Longer periods are more practical for running appliances like dishwashers or heat pumps. Best price periods require 60 minutes minimum (vs. 30 minutes for peak price warnings) because they should provide meaningful time windows for consumption planning, not just brief opportunities.", - "best_price_max_level": "Only show best price periods if they contain intervals with price levels ≤ selected value. For example, selecting '**Cheap**' means the period must have at least one '**Very cheap**' or '**Cheap**' interval. This ensures 'best price' periods are not just relatively cheap for the day, but actually cheap in absolute terms. Select '**Any**' to show best prices regardless of their absolute price level.", - "best_price_max_level_gap_count": "Maximum number of consecutive intervals allowed that deviate by exactly one level step from the required level. For example: with '**Cheap**' filter and gap count 1, a sequence '**Cheap**, **Cheap**, **Normal**, **Cheap**' is accepted (**Normal** is one step above **Cheap**). This prevents periods from being split by occasional level deviations. **Note:** Gap tolerance requires periods ≥90 minutes (6 intervals) to detect outliers effectively. Default: 0 (strict filtering, no tolerance)." - } - }, - "flexibility_settings": { - "name": "Flexibility & Thresholds", - "description": "Control how much prices can deviate and still qualify as 'best price'.", - "data": { - "best_price_flex": "Flexibility", - "best_price_min_distance_from_avg": "Minimum Distance" - }, - "data_description": { - "best_price_flex": "Maximum above the daily minimum price that intervals can be and still qualify as 'best price'. Recommended: 15-20 with relaxation enabled (default), or 25-35 without relaxation. Maximum: 50 (hard cap for reliable period detection).", - "best_price_min_distance_from_avg": "Ensures periods are significantly cheaper than the daily average, not just marginally below it. This filters out noise and prevents marking slightly-below-average periods as 'best price' on days with flat prices. Higher values = stricter filtering (only truly cheap periods qualify). Default: 5 means periods must be at least 5% below the daily average." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxation & Target Periods", - "description": "Configure automatic filter relaxation and target period counts. Enable 'Achieve Minimum Count' to activate relaxation.", - "data": { - "enable_min_periods_best": "Achieve Minimum Count", - "min_periods_best": "Minimum Periods", - "relaxation_attempts_best": "Relaxation Attempts" - }, - "data_description": { - "enable_min_periods_best": "When enabled, filters will be gradually relaxed if not enough periods are found. This attempts to reach the desired minimum number of periods, which may include less optimal time windows as best-price periods.", - "min_periods_best": "Minimum number of best price periods to aim for per day. Filters will be relaxed step-by-step to try achieving this count. Only active when 'Achieve Minimum Count' is enabled. Default: 1", - "relaxation_attempts_best": "How many flex levels (attempts) to try before giving up. Each attempt runs all filter combinations at the new flex level. More attempts increase the chance of finding additional periods at the cost of longer processing time." - } - } - }, - "submit": "↩ Save & Back" - }, - "peak_price": { - "title": "🔴 Peak Price Period Settings", - "description": "**Configure settings for the Peak Price Period binary sensor. This sensor is active during periods with the highest electricity prices.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Period Settings", - "description": "Configure period duration and price level constraints.", - "data": { - "peak_price_min_period_length": "Minimum Period Length", - "peak_price_min_level": "Price Level Filter", - "peak_price_max_level_gap_count": "Gap Tolerance" - }, - "data_description": { - "peak_price_min_period_length": "Minimum duration for a period to be considered as 'peak price'. Peak price warnings are allowed for shorter periods (30 minutes minimum vs. 60 minutes for best price) because brief expensive spikes are worth alerting about, even if they're too short for consumption planning.", - "peak_price_min_level": "Only show peak price periods if they contain intervals with price levels ≥ selected value. For example, selecting '**Expensive**' means the period must have at least one '**Expensive**' or '**Very expensive**' interval. This ensures 'peak price' periods are not just relatively expensive for the day, but actually expensive in absolute terms. Select '**Any**' to show peak prices regardless of their absolute price level.", - "peak_price_max_level_gap_count": "Maximum number of consecutive intervals allowed that deviate by exactly one level step from the required level. For example: with '**Expensive**' filter and gap count 2, a sequence '**Expensive**, **Normal**, **Normal**, **Expensive**' is accepted (**Normal** is one step below **Expensive**). This prevents periods from being split by occasional level deviations. **Note:** Gap tolerance requires periods ≥90 minutes (6 intervals) to detect outliers effectively. Default: 0 (strict filtering, no tolerance)." - } - }, - "flexibility_settings": { - "name": "Flexibility Settings", - "description": "Configure price comparison thresholds and filtering.", - "data": { - "peak_price_flex": "Flexibility", - "peak_price_min_distance_from_avg": "Minimum Distance" - }, - "data_description": { - "peak_price_flex": "Maximum below the daily maximum price that intervals can be and still qualify as 'peak price'. Recommended: -15 to -20 with relaxation enabled (default), or -25 to -35 without relaxation. Maximum: -50 (hard cap for reliable period detection). Note: Negative values indicate distance below maximum.", - "peak_price_min_distance_from_avg": "Ensures periods are significantly more expensive than the daily average, not just marginally above it. This filters out noise and prevents marking slightly-above-average periods as 'peak price' on days with flat prices. Higher values = stricter filtering (only truly expensive periods qualify). Default: 5 means periods must be at least 5% above the daily average." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxation & Target Periods", - "description": "Configure automatic filter relaxation and target period counts. Enable 'Achieve Minimum Count' to activate relaxation.", - "data": { - "enable_min_periods_peak": "Achieve Minimum Count", - "min_periods_peak": "Minimum Periods", - "relaxation_attempts_peak": "Relaxation Attempts" - }, - "data_description": { - "enable_min_periods_peak": "When enabled, filters will be gradually relaxed if not enough periods are found. This attempts to reach the desired minimum number of periods to ensure you're warned about expensive periods even on days with unusual price patterns.", - "min_periods_peak": "Minimum number of peak price periods to aim for per day. Filters will be relaxed step-by-step to try achieving this count. Only active when 'Achieve Minimum Count' is enabled. Default: 1", - "relaxation_attempts_peak": "How many flex levels (attempts) to try before giving up. Each attempt runs all filter combinations at the new flex level. More attempts increase the chance of finding additional peak periods at the cost of longer processing time." - } - } - }, - "submit": "↩ Save & Back" - }, - "price_trend": { - "title": "📈 Price Trend Thresholds", - "description": "**Configure thresholds for price trend sensors.** These sensors compare current price with the average of the next N hours to determine if prices are rising, falling, or stable.\n\n**5-Level Scale:** Uses strongly_falling (-2), falling (-1), stable (0), rising (+1), strongly_rising (+2) for automation comparisons via trend_value attribute.{entity_warning}", - "data": { - "price_trend_threshold_rising": "Rising Threshold", - "price_trend_threshold_strongly_rising": "Strongly Rising Threshold", - "price_trend_threshold_falling": "Falling Threshold", - "price_trend_threshold_strongly_falling": "Strongly Falling Threshold", - "price_trend_change_confirmation": "Trend Change Confirmation", - "price_trend_min_price_change": "Min. Price Change (Trend)", - "price_trend_min_price_change_strongly": "Min. Price Change (Strong Trend)" - }, - "data_description": { - "price_trend_threshold_rising": "Percentage that the average of the next N hours must be above the current price to qualify as 'rising' trend. Example: 3 means average is at least 3% higher → prices will rise. Typical values: 3-10%. Default: 3%", - "price_trend_threshold_strongly_rising": "Percentage for 'strongly rising' trend. Must be higher than rising threshold. Example: 9 means average is at least 9% higher → prices will rise significantly. Typical values: 6-20%. Default: 9%", - "price_trend_threshold_falling": "Percentage (negative) that the average of the next N hours must be below the current price to qualify as 'falling' trend. Example: -3 means average is at least 3% lower → prices will fall. Typical values: -3 to -10%. Default: -3%", - "price_trend_threshold_strongly_falling": "Percentage (negative) for 'strongly falling' trend. Must be lower (more negative) than falling threshold. Example: -9 means average is at least 9% lower → prices will fall significantly. Typical values: -6 to -20%. Default: -9%", - "price_trend_change_confirmation": "Number of consecutive 15-minute intervals that must confirm a new trend direction before reporting a trend change. Higher values mean more stability and fewer false changes, lower values mean faster detection. Range: 2 (30 min) to 6 (90 min). Default: 3 (45 min)", - "price_trend_min_price_change": "Minimum absolute price difference (in ct/øre) required for a 'rising' or 'falling' trend. Prevents tiny price changes from triggering trends at low price levels. Set to 0 to disable (pure percentage mode). Default: 0.5", - "price_trend_min_price_change_strongly": "Minimum absolute price difference (in ct/øre) required for a 'strongly rising' or 'strongly falling' trend. Should be higher than the regular trend minimum. Set to 0 to disable. Default: 1.5" - }, - "submit": "↩ Save & Back" - }, - "volatility": { - "title": "💨 Price Volatility Thresholds", - "description": "**Configure thresholds for volatility classification.** Volatility measures relative price variation using the coefficient of variation (CV = standard deviation / mean × 100%). These thresholds are percentage values that work across all price levels.\n\nUsed by:\n• Volatility sensors (classification)\n• Trend sensors (adaptive threshold adjustment: <moderate = more sensitive, ≥high = less sensitive){entity_warning}", - "data": { - "volatility_threshold_moderate": "Moderate Threshold", - "volatility_threshold_high": "High Threshold", - "volatility_threshold_very_high": "Very High Threshold" - }, - "data_description": { - "volatility_threshold_moderate": "Coefficient of Variation (CV) at which prices are considered 'moderately volatile'. CV = (standard deviation / mean) × 100%. Example: 15 means price fluctuations of ±15% around average. Sensors show this classification, trend sensors become more sensitive. Default: 15%", - "volatility_threshold_high": "Coefficient of Variation (CV) at which prices are considered 'highly volatile'. Example: 30 means price fluctuations of ±30% around average. Larger price jumps expected, trend sensors become less sensitive. Default: 30%", - "volatility_threshold_very_high": "Coefficient of Variation (CV) at which prices are considered 'very highly volatile'. Example: 50 means extreme price fluctuations of ±50% around average. On such days, strong price spikes are likely. Default: 50%" - }, - "submit": "↩ Save & Back" - }, - "chart_data_export": { - "title": "📊 Chart Data Export Sensor", - "description": "The Chart Data Export Sensor provides price data as sensor attributes.\n\n⚠️ **Note:** This sensor is a legacy feature for compatibility with older tools.\n\n**Recommended for new setups:** Use the `tibber_prices.get_chartdata` **service directly** - it's more flexible, efficient, and the modern Home Assistant approach.\n\n**When this sensor makes sense:**\n\n✅ Your dashboard tool can **only** read attributes (no service calls)\n✅ You need static data that updates automatically\n❌ **Not for automations:** Use `tibber_prices.get_chartdata` directly there - more flexible and efficient!\n\n---\n\n{sensor_status_info}", - "submit": "↩ Ok & Back" - }, - "reset_to_defaults": { - "title": "🔄 Reset to Defaults", - "description": "⚠️ **Warning:** This will reset **ALL** settings to factory defaults.\n\n**What will be reset:**\n• All price rating thresholds\n• All volatility thresholds\n• All price trend thresholds\n• All best price period settings\n• All peak price period settings\n• Display settings\n• General settings\n\n**What will NOT be reset:**\n• Your Tibber API token\n• Selected home\n• Currency\n\n**💡 Tip:** This is useful if you want to start fresh after experimenting with settings.", - "data": { - "confirm_reset": "Yes, reset everything to defaults" - }, - "submit": "Reset Now" + "data_description": { + "best_price_min_period_length": "Minimum duration for a period to be considered as 'best price'. Longer periods are more practical for running appliances like dishwashers or heat pumps. Best price periods require 60 minutes minimum (vs. 30 minutes for peak price warnings) because they should provide meaningful time windows for consumption planning, not just brief opportunities.", + "best_price_max_level": "Only show best price periods if they contain intervals with price levels ≤ selected value. For example, selecting '**Cheap**' means the period must have at least one '**Very cheap**' or '**Cheap**' interval. This ensures 'best price' periods are not just relatively cheap for the day, but actually cheap in absolute terms. Select '**Any**' to show best prices regardless of their absolute price level.", + "best_price_max_level_gap_count": "Maximum number of consecutive intervals allowed that deviate by exactly one level step from the required level. For example: with '**Cheap**' filter and gap count 1, a sequence '**Cheap**, **Cheap**, **Normal**, **Cheap**' is accepted (**Normal** is one step above **Cheap**). This prevents periods from being split by occasional level deviations. **Note:** Gap tolerance requires periods ≥90 minutes (6 intervals) to detect outliers effectively. Default: 0 (strict filtering, no tolerance)." } + }, + "flexibility_settings": { + "name": "Flexibility & Thresholds", + "description": "Control how much prices can deviate and still qualify as 'best price'.", + "data": { + "best_price_flex": "Flexibility", + "best_price_min_distance_from_avg": "Minimum Distance" + }, + "data_description": { + "best_price_flex": "Maximum above the daily minimum price that intervals can be and still qualify as 'best price'. Recommended: 15-20 with relaxation enabled (default), or 25-35 without relaxation. Maximum: 50 (hard cap for reliable period detection).", + "best_price_min_distance_from_avg": "Ensures periods are significantly cheaper than the daily average, not just marginally below it. This filters out noise and prevents marking slightly-below-average periods as 'best price' on days with flat prices. Higher values = stricter filtering (only truly cheap periods qualify). Default: 5 means periods must be at least 5% below the daily average." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxation & Target Periods", + "description": "Configure automatic filter relaxation and target period counts. Enable 'Achieve Minimum Count' to activate relaxation.", + "data": { + "enable_min_periods_best": "Achieve Minimum Count", + "min_periods_best": "Minimum Periods", + "relaxation_attempts_best": "Relaxation Attempts" + }, + "data_description": { + "enable_min_periods_best": "When enabled, filters will be gradually relaxed if not enough periods are found. This attempts to reach the desired minimum number of periods, which may include less optimal time windows as best-price periods.", + "min_periods_best": "Minimum number of best price periods to aim for per day. Filters will be relaxed step-by-step to try achieving this count. Only active when 'Achieve Minimum Count' is enabled. Default: 1", + "relaxation_attempts_best": "How many flex levels (attempts) to try before giving up. Each attempt runs all filter combinations at the new flex level. More attempts increase the chance of finding additional periods at the cost of longer processing time." + } + }, + "extension_settings": { + "name": "Period Edge Extension", + "description": "Optionally extend detected best price periods at both edges to absorb adjacent very cheap intervals.", + "data": { + "best_price_extend_to_very_cheap": "Extend to Very Cheap Intervals", + "best_price_max_extension_intervals": "Maximum Extension Intervals" + }, + "data_description": { + "best_price_extend_to_very_cheap": "When enabled, detected best price periods expand outward to absorb adjacent intervals with a 'Very cheap' price level. This widens low-price windows to better capture extremely cheap intervals at the edges of detected periods.", + "best_price_max_extension_intervals": "Maximum number of additional intervals to absorb per side (left and right edge). Each interval is 15 minutes. Example: 4 intervals = up to 1 hour extension per edge. Default: 4" + } + } }, - "error": { - "auth": "The Tibber Access Token is invalid.", - "connection": "Unable to connect to Tibber. Please check your internet connection.", - "unknown": "An unexpected error occurred. Please check the logs for details.", - "cannot_connect": "Failed to connect", - "invalid_access_token": "Invalid access token", - "different_home": "The access token is not valid for the home ID this integration is configured for.", - "invalid_period_length": "Period length must be at least 15 minutes (multiples of 15).", - "invalid_flex": "Flexibility percentage must be between -50% and +50%", - "invalid_best_price_distance": "Distance percentage must be between -50% and 0% (negative = below average)", - "invalid_peak_price_distance": "Distance percentage must be between 0% and 50% (positive = above average)", - "invalid_min_periods": "Minimum periods count must be between 1 and 10", - "invalid_gap_count": "Gap count must be between 0 and 8", - "invalid_relaxation_attempts": "Relaxation attempts must be between 1 and 12", - "invalid_price_rating_low": "Low price rating threshold must be between -50% and -5%", - "invalid_price_rating_high": "High price rating threshold must be between 5% and 50%", - "invalid_price_rating_thresholds": "Low threshold must be less than high threshold", - "invalid_volatility_threshold_moderate": "Moderate volatility threshold must be between 5% and 25%", - "invalid_volatility_threshold_high": "High volatility threshold must be between 20% and 40%", - "invalid_volatility_threshold_very_high": "Very high volatility threshold must be between 35% and 80%", - "invalid_volatility_thresholds": "Thresholds must be in ascending order: moderate < high < very high", - "invalid_price_trend_rising": "Rising trend threshold must be between 1% and 50%", - "invalid_price_trend_falling": "Falling trend threshold must be between -50% and -1%", - "invalid_price_trend_strongly_rising": "Strongly rising trend threshold must be between 2% and 100%", - "invalid_price_trend_strongly_falling": "Strongly falling trend threshold must be between -100% and -2%", - "invalid_trend_strongly_rising_less_than_rising": "Strongly rising threshold must be greater than rising threshold", - "invalid_trend_strongly_falling_greater_than_falling": "Strongly falling threshold must be less (more negative) than falling threshold" + "submit": "↩ Save & Back" + }, + "peak_price": { + "title": "🔴 Peak Price Period Settings", + "description": "**Configure settings for the Peak Price Period binary sensor. This sensor is active during periods with the highest electricity prices.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Period Settings", + "description": "Configure period duration and price level constraints.", + "data": { + "peak_price_min_period_length": "Minimum Period Length", + "peak_price_min_level": "Price Level Filter", + "peak_price_max_level_gap_count": "Gap Tolerance" + }, + "data_description": { + "peak_price_min_period_length": "Minimum duration for a period to be considered as 'peak price'. Peak price warnings are allowed for shorter periods (30 minutes minimum vs. 60 minutes for best price) because brief expensive spikes are worth alerting about, even if they're too short for consumption planning.", + "peak_price_min_level": "Only show peak price periods if they contain intervals with price levels ≥ selected value. For example, selecting '**Expensive**' means the period must have at least one '**Expensive**' or '**Very expensive**' interval. This ensures 'peak price' periods are not just relatively expensive for the day, but actually expensive in absolute terms. Select '**Any**' to show peak prices regardless of their absolute price level.", + "peak_price_max_level_gap_count": "Maximum number of consecutive intervals allowed that deviate by exactly one level step from the required level. For example: with '**Expensive**' filter and gap count 2, a sequence '**Expensive**, **Normal**, **Normal**, **Expensive**' is accepted (**Normal** is one step below **Expensive**). This prevents periods from being split by occasional level deviations. **Note:** Gap tolerance requires periods ≥90 minutes (6 intervals) to detect outliers effectively. Default: 0 (strict filtering, no tolerance)." + } + }, + "flexibility_settings": { + "name": "Flexibility Settings", + "description": "Configure price comparison thresholds and filtering.", + "data": { + "peak_price_flex": "Flexibility", + "peak_price_min_distance_from_avg": "Minimum Distance" + }, + "data_description": { + "peak_price_flex": "Maximum below the daily maximum price that intervals can be and still qualify as 'peak price'. Recommended: -15 to -20 with relaxation enabled (default), or -25 to -35 without relaxation. Maximum: -50 (hard cap for reliable period detection). Note: Negative values indicate distance below maximum.", + "peak_price_min_distance_from_avg": "Ensures periods are significantly more expensive than the daily average, not just marginally above it. This filters out noise and prevents marking slightly-above-average periods as 'peak price' on days with flat prices. Higher values = stricter filtering (only truly expensive periods qualify). Default: 5 means periods must be at least 5% above the daily average." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxation & Target Periods", + "description": "Configure automatic filter relaxation and target period counts. Enable 'Achieve Minimum Count' to activate relaxation.", + "data": { + "enable_min_periods_peak": "Achieve Minimum Count", + "min_periods_peak": "Minimum Periods", + "relaxation_attempts_peak": "Relaxation Attempts" + }, + "data_description": { + "enable_min_periods_peak": "When enabled, filters will be gradually relaxed if not enough periods are found. This attempts to reach the desired minimum number of periods to ensure you're warned about expensive periods even on days with unusual price patterns.", + "min_periods_peak": "Minimum number of peak price periods to aim for per day. Filters will be relaxed step-by-step to try achieving this count. Only active when 'Achieve Minimum Count' is enabled. Default: 1", + "relaxation_attempts_peak": "How many flex levels (attempts) to try before giving up. Each attempt runs all filter combinations at the new flex level. More attempts increase the chance of finding additional peak periods at the cost of longer processing time." + } + }, + "extension_settings": { + "name": "Period Edge Extension", + "description": "Optionally extend detected peak price periods at both edges to absorb adjacent very expensive intervals.", + "data": { + "peak_price_extend_to_very_expensive": "Extend to Very Expensive Intervals", + "peak_price_max_extension_intervals": "Maximum Extension Intervals" + }, + "data_description": { + "peak_price_extend_to_very_expensive": "When enabled, detected peak price periods expand outward to absorb adjacent intervals with a 'Very expensive' price level. This widens high-price windows to better capture extremely expensive intervals at the edges of detected periods.", + "peak_price_max_extension_intervals": "Maximum number of additional intervals to absorb per side (left and right edge). Each interval is 15 minutes. Example: 4 intervals = up to 1 hour extension per edge. Default: 4" + } + } }, - "abort": { - "entry_not_found": "Tibber configuration entry not found.", - "reset_cancelled": "Reset cancelled. No changes were made to your configuration.", - "reset_successful": "✅ All settings have been reset to factory defaults. Your configuration is now like a fresh installation.", - "finished": "Configuration completed." + "submit": "↩ Save & Back" + }, + "price_trend": { + "title": "📈 Price Trend Thresholds", + "description": "**Configure thresholds for price trend sensors.** These sensors compare current price with the average of the next N hours to determine if prices are rising, falling, or stable.\n\n**5-Level Scale:** Uses strongly_falling (-2), falling (-1), stable (0), rising (+1), strongly_rising (+2) for automation comparisons via trend_value attribute.{entity_warning}", + "data": { + "price_trend_threshold_rising": "Rising Threshold", + "price_trend_threshold_strongly_rising": "Strongly Rising Threshold", + "price_trend_threshold_falling": "Falling Threshold", + "price_trend_threshold_strongly_falling": "Strongly Falling Threshold", + "price_trend_change_confirmation": "Trend Change Confirmation", + "price_trend_min_price_change": "Min. Price Change (Trend)", + "price_trend_min_price_change_strongly": "Min. Price Change (Strong Trend)" + }, + "data_description": { + "price_trend_threshold_rising": "Percentage that the average of the next N hours must be above the current price to qualify as 'rising' trend. Example: 3 means average is at least 3% higher → prices will rise. Typical values: 3-10%. Default: 3%", + "price_trend_threshold_strongly_rising": "Percentage for 'strongly rising' trend. Must be higher than rising threshold. Example: 9 means average is at least 9% higher → prices will rise significantly. Typical values: 6-20%. Default: 9%", + "price_trend_threshold_falling": "Percentage (negative) that the average of the next N hours must be below the current price to qualify as 'falling' trend. Example: -3 means average is at least 3% lower → prices will fall. Typical values: -3 to -10%. Default: -3%", + "price_trend_threshold_strongly_falling": "Percentage (negative) for 'strongly falling' trend. Must be lower (more negative) than falling threshold. Example: -9 means average is at least 9% lower → prices will fall significantly. Typical values: -6 to -20%. Default: -9%", + "price_trend_change_confirmation": "Number of consecutive 15-minute intervals that must confirm a new trend direction before reporting a trend change. Higher values mean more stability and fewer false changes, lower values mean faster detection. Range: 2 (30 min) to 6 (90 min). Default: 3 (45 min)", + "price_trend_min_price_change": "Minimum absolute price difference (in ct/øre) required for a 'rising' or 'falling' trend. Prevents tiny price changes from triggering trends at low price levels. Set to 0 to disable (pure percentage mode). Default: 0.5", + "price_trend_min_price_change_strongly": "Minimum absolute price difference (in ct/øre) required for a 'strongly rising' or 'strongly falling' trend. Should be higher than the regular trend minimum. Set to 0 to disable. Default: 1.5" + }, + "submit": "↩ Save & Back" + }, + "volatility": { + "title": "💨 Price Volatility Thresholds", + "description": "**Configure thresholds for volatility classification.** Volatility measures relative price variation using the coefficient of variation (CV = standard deviation / mean × 100%). These thresholds are percentage values that work across all price levels.\n\nUsed by:\n• Volatility sensors (classification)\n• Trend sensors (adaptive threshold adjustment: <moderate = more sensitive, ≥high = less sensitive){entity_warning}", + "data": { + "volatility_threshold_moderate": "Moderate Threshold", + "volatility_threshold_high": "High Threshold", + "volatility_threshold_very_high": "Very High Threshold" + }, + "data_description": { + "volatility_threshold_moderate": "Coefficient of Variation (CV) at which prices are considered 'moderately volatile'. CV = (standard deviation / mean) × 100%. Example: 15 means price fluctuations of ±15% around average. Sensors show this classification, trend sensors become more sensitive. Default: 15%", + "volatility_threshold_high": "Coefficient of Variation (CV) at which prices are considered 'highly volatile'. Example: 30 means price fluctuations of ±30% around average. Larger price jumps expected, trend sensors become less sensitive. Default: 30%", + "volatility_threshold_very_high": "Coefficient of Variation (CV) at which prices are considered 'very highly volatile'. Example: 50 means extreme price fluctuations of ±50% around average. On such days, strong price spikes are likely. Default: 50%" + }, + "submit": "↩ Save & Back" + }, + "chart_data_export": { + "title": "📊 Chart Data Export Sensor", + "description": "The Chart Data Export Sensor provides price data as sensor attributes.\n\n⚠️ **Note:** This sensor is a legacy feature for compatibility with older tools.\n\n**Recommended for new setups:** Use the `tibber_prices.get_chartdata` **service directly** - it's more flexible, efficient, and the modern Home Assistant approach.\n\n**When this sensor makes sense:**\n\n✅ Your dashboard tool can **only** read attributes (no service calls)\n✅ You need static data that updates automatically\n❌ **Not for automations:** Use `tibber_prices.get_chartdata` directly there - more flexible and efficient!\n\n---\n\n{sensor_status_info}", + "submit": "↩ Ok & Back" + }, + "reset_to_defaults": { + "title": "🔄 Reset to Defaults", + "description": "⚠️ **Warning:** This will reset **ALL** settings to factory defaults.\n\n**What will be reset:**\n• All price rating thresholds\n• All volatility thresholds\n• All price trend thresholds\n• All best price period settings\n• All peak price period settings\n• Display settings\n• General settings\n\n**What will NOT be reset:**\n• Your Tibber API token\n• Selected home\n• Currency\n\n**💡 Tip:** This is useful if you want to start fresh after experimenting with settings.", + "data": { + "confirm_reset": "Yes, reset everything to defaults" + }, + "submit": "Reset Now" + } + }, + "error": { + "auth": "The Tibber Access Token is invalid.", + "connection": "Unable to connect to Tibber. Please check your internet connection.", + "unknown": "An unexpected error occurred. Please check the logs for details.", + "cannot_connect": "Failed to connect", + "invalid_access_token": "Invalid access token", + "different_home": "The access token is not valid for the home ID this integration is configured for.", + "invalid_period_length": "Period length must be at least 15 minutes (multiples of 15).", + "invalid_flex": "Flexibility percentage must be between -50% and +50%", + "invalid_best_price_distance": "Distance percentage must be between -50% and 0% (negative = below average)", + "invalid_peak_price_distance": "Distance percentage must be between 0% and 50% (positive = above average)", + "invalid_min_periods": "Minimum periods count must be between 1 and 10", + "invalid_gap_count": "Gap count must be between 0 and 8", + "invalid_relaxation_attempts": "Relaxation attempts must be between 1 and 12", + "invalid_price_rating_low": "Low price rating threshold must be between -50% and -5%", + "invalid_price_rating_high": "High price rating threshold must be between 5% and 50%", + "invalid_price_rating_thresholds": "Low threshold must be less than high threshold", + "invalid_volatility_threshold_moderate": "Moderate volatility threshold must be between 5% and 25%", + "invalid_volatility_threshold_high": "High volatility threshold must be between 20% and 40%", + "invalid_volatility_threshold_very_high": "Very high volatility threshold must be between 35% and 80%", + "invalid_volatility_thresholds": "Thresholds must be in ascending order: moderate < high < very high", + "invalid_price_trend_rising": "Rising trend threshold must be between 1% and 50%", + "invalid_price_trend_falling": "Falling trend threshold must be between -50% and -1%", + "invalid_price_trend_strongly_rising": "Strongly rising trend threshold must be between 2% and 100%", + "invalid_price_trend_strongly_falling": "Strongly falling trend threshold must be between -100% and -2%", + "invalid_trend_strongly_rising_less_than_rising": "Strongly rising threshold must be greater than rising threshold", + "invalid_trend_strongly_falling_greater_than_falling": "Strongly falling threshold must be less (more negative) than falling threshold" + }, + "abort": { + "entry_not_found": "Tibber configuration entry not found.", + "reset_cancelled": "Reset cancelled. No changes were made to your configuration.", + "reset_successful": "✅ All settings have been reset to factory defaults. Your configuration is now like a fresh installation.", + "finished": "Configuration completed." + } + }, + "entity": { + "sensor": { + "current_interval_price": { + "name": "Current Electricity Price" + }, + "current_interval_price_base": { + "name": "Current Electricity Price (Energy Dashboard)" + }, + "next_interval_price": { + "name": "Next Electricity Price" + }, + "previous_interval_price": { + "name": "Previous Electricity Price" + }, + "current_hour_average_price": { + "name": "⌀ Hourly Price Current" + }, + "next_hour_average_price": { + "name": "⌀ Hourly Price Next" + }, + "current_interval_price_level": { + "name": "Current Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" } - }, - "entity": { - "sensor": { - "current_interval_price": { - "name": "Current Electricity Price" - }, - "current_interval_price_base": { - "name": "Current Electricity Price (Energy Dashboard)" - }, - "next_interval_price": { - "name": "Next Electricity Price" - }, - "previous_interval_price": { - "name": "Previous Electricity Price" - }, - "current_hour_average_price": { - "name": "⌀ Hourly Price Current" - }, - "next_hour_average_price": { - "name": "⌀ Hourly Price Next" - }, - "current_interval_price_level": { - "name": "Current Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "next_interval_price_level": { - "name": "Next Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "previous_interval_price_level": { - "name": "Previous Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "current_hour_price_level": { - "name": "Current Hour Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "next_hour_price_level": { - "name": "Next Hour Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "lowest_price_today": { - "name": "Today's Lowest Price" - }, - "highest_price_today": { - "name": "Today's Highest Price" - }, - "average_price_today": { - "name": "⌀ Price Today" - }, - "lowest_price_tomorrow": { - "name": "Tomorrow's Lowest Price" - }, - "highest_price_tomorrow": { - "name": "Tomorrow's Highest Price" - }, - "average_price_tomorrow": { - "name": "⌀ Price Tomorrow" - }, - "yesterday_price_level": { - "name": "Yesterday's Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "today_price_level": { - "name": "Today's Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "tomorrow_price_level": { - "name": "Tomorrow's Price Level", - "state": { - "very_cheap": "Very Cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very Expensive" - } - }, - "yesterday_price_rating": { - "name": "Yesterday's Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "today_price_rating": { - "name": "Today's Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "tomorrow_price_rating": { - "name": "Tomorrow's Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "trailing_price_average": { - "name": "⌀ Price Trailing 24h" - }, - "leading_price_average": { - "name": "⌀ Price Leading 24h" - }, - "trailing_price_min": { - "name": "Trailing 24h Minimum Price" - }, - "trailing_price_max": { - "name": "Trailing 24h Maximum Price" - }, - "leading_price_min": { - "name": "Leading 24h Minimum Price" - }, - "leading_price_max": { - "name": "Leading 24h Maximum Price" - }, - "current_interval_price_rating": { - "name": "Current Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "next_interval_price_rating": { - "name": "Next Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "previous_interval_price_rating": { - "name": "Previous Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "current_hour_price_rating": { - "name": "Current Hour Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "next_hour_price_rating": { - "name": "Next Hour Price Rating", - "state": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "next_avg_1h": { - "name": "⌀ Price Next 1h" - }, - "next_avg_2h": { - "name": "⌀ Price Next 2h" - }, - "next_avg_3h": { - "name": "⌀ Price Next 3h" - }, - "next_avg_4h": { - "name": "⌀ Price Next 4h" - }, - "next_avg_5h": { - "name": "⌀ Price Next 5h" - }, - "next_avg_6h": { - "name": "⌀ Price Next 6h" - }, - "next_avg_8h": { - "name": "⌀ Price Next 8h" - }, - "next_avg_12h": { - "name": "⌀ Price Next 12h" - }, - "price_outlook_1h": { - "name": "Price Outlook (1h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_2h": { - "name": "Price Outlook (2h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_3h": { - "name": "Price Outlook (3h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_4h": { - "name": "Price Outlook (4h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_5h": { - "name": "Price Outlook (5h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_6h": { - "name": "Price Outlook (6h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_8h": { - "name": "Price Outlook (8h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_outlook_12h": { - "name": "Price Outlook (12h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_2h": { - "name": "Price Trajectory (2h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_3h": { - "name": "Price Trajectory (3h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_4h": { - "name": "Price Trajectory (4h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_5h": { - "name": "Price Trajectory (5h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_6h": { - "name": "Price Trajectory (6h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_8h": { - "name": "Price Trajectory (8h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "price_trajectory_12h": { - "name": "Price Trajectory (12h)", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "current_price_trend": { - "name": "Current Price Trend", - "state": { - "strongly_rising": "Strongly Rising", - "rising": "Rising", - "stable": "Stable", - "falling": "Falling", - "strongly_falling": "Strongly Falling" - } - }, - "next_price_trend_change": { - "name": "Next Price Trend Change" - }, - "next_price_trend_change_in": { - "name": "Next Price Trend Change In" - }, - "daily_rating": { - "name": "Daily Price Rating" - }, - "monthly_rating": { - "name": "Monthly Price Rating" - }, - "data_lifecycle_status": { - "name": "Data Lifecycle Status", - "state": { - "cached": "Cached", - "fresh": "Fresh", - "refreshing": "Refreshing", - "searching_tomorrow": "Searching Tomorrow", - "turnover_pending": "Turnover Pending", - "error": "Error" - } - }, - "today_volatility": { - "name": "Today's Price Volatility", - "state": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very_high": "Very High" - } - }, - "tomorrow_volatility": { - "name": "Tomorrow's Price Volatility", - "state": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very_high": "Very High" - } - }, - "next_24h_volatility": { - "name": "Next 24h Price Volatility", - "state": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very_high": "Very High" - } - }, - "today_tomorrow_volatility": { - "name": "Today+Tomorrow Price Volatility", - "state": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very_high": "Very High" - } - }, - "best_price_end_time": { - "name": "Best Price End" - }, - "best_price_period_duration": { - "name": "Best Price Duration" - }, - "best_price_remaining_minutes": { - "name": "Best Price Remaining Time" - }, - "best_price_progress": { - "name": "Best Price Progress" - }, - "best_price_next_start_time": { - "name": "Best Price Start" - }, - "best_price_next_in_minutes": { - "name": "Best Price Starts In" - }, - "peak_price_end_time": { - "name": "Peak Price End" - }, - "peak_price_period_duration": { - "name": "Peak Price Duration" - }, - "peak_price_remaining_minutes": { - "name": "Peak Price Remaining Time" - }, - "peak_price_progress": { - "name": "Peak Price Progress" - }, - "peak_price_next_start_time": { - "name": "Peak Price Start" - }, - "peak_price_next_in_minutes": { - "name": "Peak Price Starts In" - }, - "home_type": { - "name": "Home Type", - "state": { - "apartment": "Apartment", - "rowhouse": "Rowhouse", - "house": "House", - "cottage": "Cottage" - } - }, - "home_size": { - "name": "Home Size" - }, - "main_fuse_size": { - "name": "Main Fuse Size" - }, - "number_of_residents": { - "name": "Number of Residents" - }, - "primary_heating_source": { - "name": "Primary Heating Source", - "state": { - "air2air_heatpump": "Air-to-Air Heat Pump", - "air2water_heatpump": "Air-to-Water Heat Pump", - "boiler": "Boiler", - "central_heating": "Central Heating", - "district_heating": "District Heating", - "district": "District Heating", - "electric_boiler": "Electric Boiler", - "electricity": "Electricity", - "floor": "Floor Heating", - "gas": "Gas", - "ground_heatpump": "Ground Heat Pump", - "ground": "Ground Heat Pump", - "oil": "Oil", - "other": "Other", - "waste": "Waste Heat" - } - }, - "grid_company": { - "name": "Grid Company" - }, - "grid_area_code": { - "name": "Grid Area Code" - }, - "price_area_code": { - "name": "Price Area Code" - }, - "consumption_ean": { - "name": "Consumption EAN" - }, - "production_ean": { - "name": "Production EAN" - }, - "energy_tax_type": { - "name": "Energy Tax Type" - }, - "vat_type": { - "name": "VAT Type" - }, - "estimated_annual_consumption": { - "name": "Estimated Annual Consumption" - }, - "subscription_status": { - "name": "Subscription Status", - "state": { - "running": "Running", - "ended": "Ended", - "pending": "Pending", - "unknown": "Unknown" - } - }, - "day_pattern_yesterday": { - "name": "Yesterday's Price Pattern", - "state": { - "valley": "Valley", - "peak": "Peak", - "double_valley": "Double Valley", - "double_peak": "Double Peak", - "flat": "Flat", - "rising": "Rising", - "falling": "Falling", - "mixed": "Mixed" - } - }, - "day_pattern_today": { - "name": "Today's Price Pattern", - "state": { - "valley": "Valley", - "peak": "Peak", - "double_valley": "Double Valley", - "double_peak": "Double Peak", - "flat": "Flat", - "rising": "Rising", - "falling": "Falling", - "mixed": "Mixed" - } - }, - "day_pattern_tomorrow": { - "name": "Tomorrow's Price Pattern", - "state": { - "valley": "Valley", - "peak": "Peak", - "double_valley": "Double Valley", - "double_peak": "Double Peak", - "flat": "Flat", - "rising": "Rising", - "falling": "Falling", - "mixed": "Mixed" - } - }, - "chart_data_export": { - "name": "Chart Data Export", - "state": { - "pending": "Pending", - "ready": "Ready", - "error": "Error" - } - }, - "chart_metadata": { - "name": "Chart Metadata", - "state": { - "pending": "Pending", - "ready": "Ready", - "error": "Error" - } - } - }, - "binary_sensor": { - "peak_price_period": { - "name": "Peak Price Period" - }, - "best_price_period": { - "name": "Best Price Period" - }, - "connection": { - "name": "Tibber API Connection" - }, - "tomorrow_data_available": { - "name": "Tomorrow's Data Available" - }, - "has_ventilation_system": { - "name": "Has Ventilation System" - }, - "realtime_consumption_enabled": { - "name": "Realtime Consumption Enabled" - } - }, - "number": { - "best_price_flex_override": { - "name": "Best Price: Flexibility" - }, - "best_price_min_distance_override": { - "name": "Best Price: Minimum Distance" - }, - "best_price_min_period_length_override": { - "name": "Best Price: Minimum Period Length" - }, - "best_price_min_periods_override": { - "name": "Best Price: Minimum Periods" - }, - "best_price_relaxation_attempts_override": { - "name": "Best Price: Relaxation Attempts" - }, - "best_price_gap_count_override": { - "name": "Best Price: Gap Tolerance" - }, - "peak_price_flex_override": { - "name": "Peak Price: Flexibility" - }, - "peak_price_min_distance_override": { - "name": "Peak Price: Minimum Distance" - }, - "peak_price_min_period_length_override": { - "name": "Peak Price: Minimum Period Length" - }, - "peak_price_min_periods_override": { - "name": "Peak Price: Minimum Periods" - }, - "peak_price_relaxation_attempts_override": { - "name": "Peak Price: Relaxation Attempts" - }, - "peak_price_gap_count_override": { - "name": "Peak Price: Gap Tolerance" - } - }, - "switch": { - "best_price_enable_relaxation_override": { - "name": "Best Price: Achieve Minimum Count" - }, - "peak_price_enable_relaxation_override": { - "name": "Peak Price: Achieve Minimum Count" - } + }, + "next_interval_price_level": { + "name": "Next Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" } - }, - "issues": { - "new_homes_available": { - "title": "New Tibber homes detected", - "description": "We detected {count} new home(s) on your Tibber account: {homes}. You can add them to Home Assistant through the Tibber integration configuration." - }, - "homes_removed": { - "title": "Tibber homes removed", - "description": "We detected that {count} home(s) have been removed from your Tibber account: {homes}. Please review your Tibber integration configuration." - }, - "tomorrow_data_missing": { - "title": "Tomorrow's price data missing for {home_name}", - "description": "Tomorrow's electricity price data is still unavailable after {warning_hour}:00. This is unusual, as Tibber typically publishes tomorrow's prices in the afternoon (around 13:00-14:00 CET).\n\nPossible causes:\n- Tibber has not yet published tomorrow's prices\n- Temporary API issues\n- Your electricity provider has not submitted prices to Tibber\n\nThis issue will automatically resolve once tomorrow's data becomes available. If this persists beyond 20:00, please check the Tibber app or contact Tibber support." - }, - "rate_limit_exceeded": { - "title": "API rate limit exceeded for {home_name}", - "description": "The Tibber API has rate-limited this integration after {error_count} consecutive errors. This means requests are being made too frequently.\n\nThe integration will automatically retry with increasing delays. This issue will resolve once the rate limit expires.\n\nIf this persists for several hours, consider:\n- Checking if multiple Home Assistant instances are using the same API token\n- Verifying no other applications are heavily using your Tibber API token\n- Reducing the update frequency if you've customized it" - }, - "home_not_found": { - "title": "Home {home_name} not found in Tibber account", - "description": "The home configured in this integration (entry ID: {entry_id}) is no longer available in your Tibber account. This typically happens when:\n- The home was deleted from your Tibber account\n- The home was moved to a different Tibber account\n- Access to this home was revoked\n\nPlease remove this integration entry and re-add it if the home should still be monitored. To remove this entry, go to Settings → Devices & Services → Tibber Prices and delete the {home_name} configuration." - }, - "entity_migration": { - "title": "Tibber Prices: Action required after update ({home_name})", - "description": "This update includes breaking changes that were applied automatically.\n\n**Renamed Entities ({count})**\n\nThe following entity keys were renamed. Your existing entity IDs and automations remain intact:\n\n{entity_list}\n\n**Duration Sensor Value Change**\n\nAll duration sensors (remaining time, starts in, period duration, trend change countdown) now report their state value in **minutes** instead of hours. The display unit in dashboards remains hours by default.\n\nIf you have automations using numeric comparisons on these sensors, update your thresholds:\n- Old: `state < 0.25` (15 minutes as hours)\n- New: `state < 15` (15 minutes)\n\nDismiss this notice after reviewing your automations." + }, + "previous_interval_price_level": { + "name": "Previous Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" } - }, - "exceptions": { - "no_entries_found": { - "message": "No Tibber Prices integration entries found. Please set up the integration first." - }, - "multiple_entries_no_entry_id": { - "message": "Multiple Tibber Prices entries found. Please specify 'entry_id' to select which entry to use." - }, - "invalid_entry_id": { - "message": "Invalid or unavailable config entry. Please check the entry ID and ensure the integration is loaded." - }, - "missing_home_id": { - "message": "Home ID not found in the config entry. Please reconfigure the integration." - }, - "user_data_not_available": { - "message": "User data is not yet available. Please wait for the first data update to complete." - }, - "timezone_not_found": { - "message": "Could not determine the home timezone. Please verify the home configuration in your Tibber account." - }, - "end_before_start": { - "message": "End time must be after start time." - }, - "price_fetch_failed": { - "message": "Failed to fetch price data from the Tibber API. Please try again later." - }, - "invalid_search_scope": { - "message": "Invalid search scope value. Valid scopes are: today, tomorrow, remaining_today, next_24h, next_48h." - }, - "scope_conflicts_with_range": { - "message": "search_scope cannot be combined with explicit range parameters: {params}. Use either search_scope OR explicit start/end parameters." - }, - "day_offset_requires_time": { - "message": "{offset_param} requires {time_param} to be set. Day offset only modifies the date of an explicit time parameter." - }, - "min_level_exceeds_max": { - "message": "min_price_level '{min_level}' is higher than max_price_level '{max_level}'. The minimum level must be equal to or lower than the maximum level." - }, - "power_profile_length_mismatch": { - "message": "power_profile has {profile_length} entries but the duration requires {interval_count} intervals ({duration_minutes} minutes). The power_profile must have exactly one entry per 15-minute interval." - }, - "level_and_rating_filter_conflict": { - "message": "level_filter and rating_level_filter cannot be used together. Use only one filter type per request." - }, - "insert_nulls_requires_filter": { - "message": "insert_nulls mode '{mode}' requires a level_filter or rating_level_filter to define segments. Without a filter, use insert_nulls: none." - }, - "connect_segments_requires_segments_mode": { - "message": "connect_segments requires insert_nulls to be set to 'segments'. Set insert_nulls: segments to use segment connection." - }, - "array_fields_requires_array_format": { - "message": "array_fields can only be used with output_format: array_of_arrays. Change the output format or remove array_fields." - }, - "invalid_array_fields": { - "message": "Invalid array_fields template. Use field names in curly braces, e.g. '{start_time}, {price_per_kwh}, {level}'." + }, + "current_hour_price_level": { + "name": "Current Hour Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" } - }, - "services": { - "get_price": { - "name": "Get Price Data", - "description": "Fetch price data for a specific time range with automatic routing. Development and testing service for the price_info_for_range API function. Automatically uses PRICE_INFO, PRICE_INFO_RANGE, or both based on the time range boundary.", - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "start_time": { - "name": "Start Time", - "description": "Start of the time range (inclusive, timezone-aware)." - }, - "end_time": { - "name": "End Time", - "description": "End of the time range (exclusive, timezone-aware)." - } - } - }, - "get_apexcharts_yaml": { - "name": "Get ApexCharts Card YAML", - "description": "⚠️ IMPORTANT: This service generates a BASIC EXAMPLE configuration for ApexCharts Card as a starting point. It is NOT a complete solution for all ApexCharts features. This integration is primarily a DATA PROVIDER. The generated YAML demonstrates how to use the `get_chartdata` service to fetch price data. Due to the segmented nature of our data (different time periods per series) and the use of Home Assistant's service API instead of entity attributes, many advanced ApexCharts features (like in_header, certain transformations) are not compatible or require manual customization. You are welcome to customize the generated YAML for your specific needs, but please understand that comprehensive ApexCharts configuration support is beyond the scope of this integration. Community contributions with improved configurations are always appreciated - if you find a better setup that works, please share it so everyone can benefit! For direct data access to build your own charts, use the `get_chartdata` service instead.", - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "day": { - "name": "Day", - "description": "Which day to visualize (default: Rolling Window). Fixed day options (Yesterday/Today/Tomorrow) show 24h spans without additional dependencies. Dynamic options require config-template-card: Rolling Window displays a fixed 48h window that automatically shifts between yesterday+today and today+tomorrow based on data availability. Rolling Window (Auto-Zoom) behaves the same but additionally auto-zooms in (2h lookback + remaining time until midnight, graph_span decreases every 15 minutes)." - }, - "level_type": { - "name": "Level Type", - "description": "Select which price level classification to visualize: 'rating_level' (low/normal/high based on your configured thresholds) or 'level' (Tibber API levels: very cheap/cheap/normal/expensive/very expensive)." - }, - "highlight_best_price": { - "name": "Highlight Best Price Periods", - "description": "Add a semi-transparent green overlay to highlight the best price periods on the chart. This makes it easy to visually identify the optimal times for energy consumption." - }, - "highlight_peak_price": { - "name": "Highlight Peak Price Periods", - "description": "Add a semi-transparent red overlay to highlight the peak price periods on the chart. This makes it easy to visually identify times when energy is most expensive." - }, - "resolution": { - "name": "Resolution", - "description": "Time resolution for the chart data. 'interval' (default): Original 15-minute intervals (96 points per day). 'hourly': Aggregated hourly values using a rolling 60-minute window (24 points per day) for a cleaner, less cluttered chart." - } - } - }, - "get_chartdata": { - "name": "Get Chart Data", - "description": "Returns price data in a simple chart-friendly format compatible with the Tibber Core integration output structure. Perfect for use with popular chart cards like ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card, or the built-in History Graph Card. Field names and data structure can be customized to match your specific chart requirements.", - "sections": { - "general": { - "name": "General", - "description": "General settings for fetching chart data." - }, - "selection": { - "name": "Selection", - "description": "Select which data to include in the output." - }, - "filters": { - "name": "Filters", - "description": "Filter data based on price levels, rating levels, or special periods." - }, - "transformation": { - "name": "Transform Data", - "description": "Transform the data output for better chart compatibility." - }, - "format": { - "name": "Format", - "description": "Customize the output format." - }, - "arrays_of_arrays": { - "name": "Advanced Output Settings: Array of Arrays", - "description": "Settings for output format when using an array of arrays." - }, - "arrays_of_objects": { - "name": "Advanced Output Settings: Array of Objects", - "description": "Settings for output format when using an array of objects." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "day": { - "name": "Day", - "description": "Which day(s) to fetch prices for. You can select multiple days. If not specified, returns a rolling 2-day window: today+tomorrow (when tomorrow data is available) or yesterday+today (when tomorrow data is not yet available). This provides continuous chart display without gaps." - }, - "resolution": { - "name": "Resolution", - "description": "Time resolution for the returned data. Options: 'interval' (default, 15-minute intervals, 96 points per day), 'hourly' (hourly averages, 24 points per day)." - }, - "output_format": { - "name": "Output Format", - "description": "Output format for the returned data. Options: 'array_of_objects' (default, array of objects with customizable field names), 'array_of_arrays' (array of [timestamp, price] arrays with trailing null point for stepline charts)." - }, - "array_fields": { - "name": "Array Fields", - "description": "Define which fields to include. Use field names in curly braces, separated by commas. Available fields: start_time, price_per_kwh, level, rating_level, average. Fields will be automatically enabled even if include_* options are not set. Leave empty for default (timestamp and price only)." - }, - "subunit_currency": { - "name": "Subunit Currency", - "description": "Return prices in subunit currency units (cents for EUR, øre for NOK/SEK) instead of base currency units. Disabled by default." - }, - "round_decimals": { - "name": "Round Decimals", - "description": "Number of decimal places to round prices to (0-10). If not specified, uses default precision (4 decimals for base currency, 2 for subunit currency)." - }, - "data_key": { - "name": "Data Key", - "description": "Custom name for the top-level data key in the response. Defaults to 'data' if not specified." - }, - "include_level": { - "name": "Include Level", - "description": "Include the Tibber price level field (very cheap/cheap/normal/expensive/very expensive) in each data point." - }, - "include_rating_level": { - "name": "Include Rating Level", - "description": "Include the calculated rating level field (low/normal/high) based on your configured thresholds in each data point." - }, - "include_average": { - "name": "Include Average", - "description": "Include the daily average price in each data point for comparison." - }, - "include_energy": { - "name": "Include Energy Price", - "description": "Include the raw energy/spot price (excluding taxes and fees) in each data point. This is the 'energy' field from the Tibber API, useful for feed-in/net metering calculations." - }, - "include_tax": { - "name": "Include Tax", - "description": "Include the tax component of the price in each data point. This is the 'tax' field from the Tibber API, representing fees, taxes, and grid charges." - }, - "level_filter": { - "name": "Level Filter", - "description": "Filter intervals to include only specific Tibber price levels (very cheap/cheap/normal/expensive/very expensive). If not specified, all levels are included." - }, - "rating_level_filter": { - "name": "Rating Level Filter", - "description": "Filter intervals to include only specific rating levels (low/normal/high). If not specified, all rating levels are included." - }, - "period_filter": { - "name": "Period Filter", - "description": "Filter intervals to include only those within Best Price or Peak Price periods. Options: 'best_price' (only intervals in Best Price periods), 'peak_price' (only intervals in Peak Price periods). If not specified, all intervals are included. This uses the precomputed period data from binary sensors." - }, - "insert_nulls": { - "name": "Insert NULL Values", - "description": "Control NULL value insertion for filtered data. 'none' (default): No NULL values, only matching intervals. 'segments': Add NULL points at segment boundaries for clean gaps in charts (recommended for stepline charts). 'all': Insert NULL for all timestamps where filter doesn't match (useful for continuous time series visualization)." - }, - "connect_segments": { - "name": "Connect Segments", - "description": "[ONLY WITH 'Insert NULL Values'] When enabled, adds connecting points at segment boundaries to visually connect different price level segments in stepline charts. When price goes DOWN at a boundary, adds a point with the lower price at the end of the current segment. When price goes UP, adds a hold point before the gap. This creates smooth visual transitions between segments instead of abrupt gaps." - }, - "add_trailing_null": { - "name": "Add Trailing Null Point", - "description": "Add a final data point with null values (except timestamp) at the end. Some chart libraries need this to prevent extrapolation/interpolation to the viewport edge when using stepline rendering. Leave disabled unless your chart requires it." - }, - "start_time_field": { - "name": "Start Time Field Name", - "description": "Custom name for the start time field in the output. Defaults to 'start_time' if not specified." - }, - "end_time_field": { - "name": "End Time Field Name", - "description": "Custom name for the end time field in the output. Defaults to 'end_time' if not specified. Only used with period_filter." - }, - "price_field": { - "name": "Price Field Name", - "description": "Custom name for the price field in the output. Defaults to 'price_per_kwh' if not specified." - }, - "level_field": { - "name": "Level Field Name", - "description": "Custom name for the level field in the output. Defaults to 'level' if not specified. Only used when include_level is enabled." - }, - "rating_level_field": { - "name": "Rating Level Field Name", - "description": "Custom name for the rating_level field in the output. Defaults to 'rating_level' if not specified. Only used when include_rating_level is enabled." - }, - "average_field": { - "name": "Average Field Name", - "description": "Custom name for the average field in the output. Defaults to 'average' if not specified. Only used when include_average is enabled." - }, - "energy_field": { - "name": "Energy Field Name", - "description": "Custom name for the energy price field in the output. Defaults to 'energy_price' if not specified. Only used when include_energy is enabled." - }, - "tax_field": { - "name": "Tax Field Name", - "description": "Custom name for the tax field in the output. Defaults to 'tax' if not specified. Only used when include_tax is enabled." - }, - "metadata": { - "name": "Metadata", - "description": "Control metadata inclusion in the response. 'include' (default): Returns both chart data and metadata with price statistics, currency info, Y-axis suggestions, and time range. 'only': Returns only metadata without processing chart data (fast, useful for dynamic Y-axis configuration). 'none': Returns only chart data without metadata." - } - } - }, - "refresh_user_data": { - "name": "Refresh User Data", - "description": "Forces a refresh of the user data (homes, profile information) from the Tibber API. This can be useful after making changes to your Tibber account or when troubleshooting connectivity issues.", - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - } - } - }, - "find_cheapest_block": { - "name": "Find Cheapest Block", - "description": "Finds the cheapest contiguous time window of a given duration. Designed for appliance scheduling: dishwasher, washing machine, dryer, etc. Returns the single cheapest window with start/end times and price statistics.", - "sections": { - "search_range": { - "name": "Search Range", - "description": "Define the time window to search within." - }, - "time_alternatives": { - "name": "Alternative Time Range Options", - "description": "Alternative ways to define the search range using time-of-day and offsets." - }, - "price_filter": { - "name": "Price Level Filter", - "description": "Restrict search to intervals within the specified price level range." - }, - "output": { - "name": "Output Options", - "description": "Control cost estimation and comparison output." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "duration": { - "name": "Duration", - "description": "Length of the desired contiguous window. Automatically rounded up to the next quarter-hour. Maximum: 12 hours." - }, - "search_start": { - "name": "Search Start", - "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." - }, - "search_end": { - "name": "Search End", - "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." - }, - "search_start_time": { - "name": "Search Start Time", - "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." - }, - "search_start_day_offset": { - "name": "Search Start Day Offset", - "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." - }, - "search_end_time": { - "name": "Search End Time", - "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." - }, - "search_end_day_offset": { - "name": "Search End Day Offset", - "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." - }, - "search_start_offset_minutes": { - "name": "Search Start Offset (minutes)", - "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." - }, - "search_end_offset_minutes": { - "name": "Search End Offset (minutes)", - "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." - }, - "include_current_interval": { - "name": "Include Current Interval", - "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." - }, - "use_base_unit": { - "name": "Use Base Currency Unit", - "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." - }, - "search_scope": { - "name": "Search Scope", - "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." - }, - "max_price_level": { - "name": "Maximum Price Level", - "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." - }, - "min_price_level": { - "name": "Minimum Price Level", - "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." - }, - "include_comparison_details": { - "name": "Include Comparison Details", - "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." - }, - "power_profile": { - "name": "Power Profile", - "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." - } - } - }, - "find_most_expensive_block": { - "name": "Find Most Expensive Block", - "description": "Finds the most expensive contiguous time window of a given duration. Useful for identifying peak price periods to avoid. Returns the single most expensive window with start/end times and price statistics.", - "sections": { - "search_range": { - "name": "Search Range", - "description": "Define the time window to search within." - }, - "time_alternatives": { - "name": "Alternative Time Range Options", - "description": "Alternative ways to define the search range using time-of-day and offsets." - }, - "price_filter": { - "name": "Price Level Filter", - "description": "Restrict search to intervals within the specified price level range." - }, - "output": { - "name": "Output Options", - "description": "Control cost estimation and comparison output." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "duration": { - "name": "Duration", - "description": "Length of the desired contiguous window. Automatically rounded up to the next quarter-hour. Maximum: 12 hours." - }, - "search_start": { - "name": "Search Start", - "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." - }, - "search_end": { - "name": "Search End", - "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." - }, - "search_start_time": { - "name": "Search Start Time", - "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." - }, - "search_start_day_offset": { - "name": "Search Start Day Offset", - "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." - }, - "search_end_time": { - "name": "Search End Time", - "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." - }, - "search_end_day_offset": { - "name": "Search End Day Offset", - "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." - }, - "search_start_offset_minutes": { - "name": "Search Start Offset (minutes)", - "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." - }, - "search_end_offset_minutes": { - "name": "Search End Offset (minutes)", - "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." - }, - "include_current_interval": { - "name": "Include Current Interval", - "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." - }, - "use_base_unit": { - "name": "Use Base Currency Unit", - "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." - }, - "search_scope": { - "name": "Search Scope", - "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." - }, - "max_price_level": { - "name": "Maximum Price Level", - "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." - }, - "min_price_level": { - "name": "Minimum Price Level", - "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." - }, - "include_comparison_details": { - "name": "Include Comparison Details", - "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." - }, - "power_profile": { - "name": "Power Profile", - "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." - } - } - }, - "find_cheapest_hours": { - "name": "Find Cheapest Hours", - "description": "Finds the cheapest intervals totaling a given duration, not necessarily contiguous. Designed for flexible loads: battery charging, EV, water heater. Returns a schedule of intervals grouped into contiguous segments.", - "sections": { - "search_range": { - "name": "Search Range", - "description": "Define the time window to search within." - }, - "time_alternatives": { - "name": "Alternative Time Range Options", - "description": "Alternative ways to define the search range using time-of-day and offsets." - }, - "price_filter": { - "name": "Price Level Filter", - "description": "Restrict search to intervals within the specified price level range." - }, - "output": { - "name": "Output Options", - "description": "Control cost estimation and comparison output." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "duration": { - "name": "Duration", - "description": "Total cheap time needed. Automatically rounded up to the next quarter-hour. Maximum: 24 hours." - }, - "search_start": { - "name": "Search Start", - "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." - }, - "search_end": { - "name": "Search End", - "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." - }, - "search_start_time": { - "name": "Search Start Time", - "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." - }, - "search_start_day_offset": { - "name": "Search Start Day Offset", - "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." - }, - "search_end_time": { - "name": "Search End Time", - "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." - }, - "search_end_day_offset": { - "name": "Search End Day Offset", - "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." - }, - "search_start_offset_minutes": { - "name": "Search Start Offset (minutes)", - "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." - }, - "search_end_offset_minutes": { - "name": "Search End Offset (minutes)", - "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." - }, - "include_current_interval": { - "name": "Include Current Interval", - "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." - }, - "min_segment_duration": { - "name": "Minimum Segment Duration", - "description": "Minimum contiguous run length. Prevents rapid on/off cycling for devices with minimum run times. Automatically rounded up to the next quarter-hour. Default: 15 minutes. Maximum: 4 hours." - }, - "use_base_unit": { - "name": "Use Base Currency Unit", - "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." - }, - "search_scope": { - "name": "Search Scope", - "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." - }, - "max_price_level": { - "name": "Maximum Price Level", - "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." - }, - "min_price_level": { - "name": "Minimum Price Level", - "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." - }, - "include_comparison_details": { - "name": "Include Comparison Details", - "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." - }, - "power_profile": { - "name": "Power Profile", - "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." - } - } - }, - "find_most_expensive_hours": { - "name": "Find Most Expensive Hours", - "description": "Finds the most expensive intervals totaling a given duration, not necessarily contiguous. Useful for identifying peak price periods to avoid. Returns a schedule of intervals grouped into contiguous segments.", - "sections": { - "search_range": { - "name": "Search Range", - "description": "Define the time window to search within." - }, - "time_alternatives": { - "name": "Alternative Time Range Options", - "description": "Alternative ways to define the search range using time-of-day and offsets." - }, - "price_filter": { - "name": "Price Level Filter", - "description": "Restrict search to intervals within the specified price level range." - }, - "output": { - "name": "Output Options", - "description": "Control cost estimation and comparison output." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "duration": { - "name": "Duration", - "description": "Total expensive time to find. Automatically rounded up to the next quarter-hour. Maximum: 24 hours." - }, - "search_start": { - "name": "Search Start", - "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." - }, - "search_end": { - "name": "Search End", - "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." - }, - "search_start_time": { - "name": "Search Start Time", - "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." - }, - "search_start_day_offset": { - "name": "Search Start Day Offset", - "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." - }, - "search_end_time": { - "name": "Search End Time", - "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." - }, - "search_end_day_offset": { - "name": "Search End Day Offset", - "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." - }, - "search_start_offset_minutes": { - "name": "Search Start Offset (minutes)", - "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." - }, - "search_end_offset_minutes": { - "name": "Search End Offset (minutes)", - "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." - }, - "include_current_interval": { - "name": "Include Current Interval", - "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." - }, - "min_segment_duration": { - "name": "Minimum Segment Duration", - "description": "Minimum contiguous run length. Prevents rapid on/off cycling for devices with minimum run times. Automatically rounded up to the next quarter-hour. Default: 15 minutes. Maximum: 4 hours." - }, - "use_base_unit": { - "name": "Use Base Currency Unit", - "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." - }, - "search_scope": { - "name": "Search Scope", - "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." - }, - "max_price_level": { - "name": "Maximum Price Level", - "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." - }, - "min_price_level": { - "name": "Minimum Price Level", - "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." - }, - "include_comparison_details": { - "name": "Include Comparison Details", - "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." - }, - "power_profile": { - "name": "Power Profile", - "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." - } - } - }, - "find_cheapest_schedule": { - "name": "Find Cheapest Schedule", - "description": "Schedules multiple appliances optimally without time overlap. Each task gets the cheapest available contiguous window; tasks are placed greedily in ascending cost order. Returns a per-task schedule with start/end times and price stats.", - "sections": { - "scheduling_options": { - "name": "Scheduling Options", - "description": "Configure tasks and gap constraints between them." - }, - "search_range": { - "name": "Search Range", - "description": "Define the time window to search within." - }, - "time_alternatives": { - "name": "Alternative Time Range Options", - "description": "Alternative ways to define the search range using time-of-day and offsets." - }, - "price_filter": { - "name": "Price Level Filter", - "description": "Restrict search to intervals within the specified price level range." - }, - "output": { - "name": "Output Options", - "description": "Control output currency unit." - } - }, - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "The config entry ID for the Tibber integration." - }, - "tasks": { - "name": "Tasks", - "description": "List of tasks to schedule. Each task requires name (string) and duration (hh:mm:ss). Optionally add power_profile (list of watts per 15-min interval). Maximum 4 tasks." - }, - "gap_minutes": { - "name": "Gap Between Tasks (minutes)", - "description": "Minimum gap in minutes between consecutive scheduled tasks. Rounded up to 15 minutes. Default: 0 (no gap)." - }, - "search_scope": { - "name": "Search Scope", - "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." - }, - "search_start": { - "name": "Search Start", - "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." - }, - "search_end": { - "name": "Search End", - "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." - }, - "search_start_time": { - "name": "Search Start Time", - "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." - }, - "search_start_day_offset": { - "name": "Search Start Day Offset", - "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search Start Time." - }, - "search_end_time": { - "name": "Search End Time", - "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." - }, - "search_end_day_offset": { - "name": "Search End Day Offset", - "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search End Time." - }, - "search_start_offset_minutes": { - "name": "Search Start Offset (minutes)", - "description": "Alternative: start searching this many minutes from now. Positive = future, negative = past. Ignored if Search Start or Search Start Time is set." - }, - "search_end_offset_minutes": { - "name": "Search End Offset (minutes)", - "description": "Alternative: stop searching this many minutes from now. Positive = future, negative = past. Ignored if Search End or Search End Time is set." - }, - "include_current_interval": { - "name": "Include Current Interval", - "description": "Include the currently running 15-minute interval in the search." - }, - "max_price_level": { - "name": "Maximum Price Level", - "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." - }, - "min_price_level": { - "name": "Minimum Price Level", - "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." - }, - "use_base_unit": { - "name": "Use Base Currency Unit", - "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." - } - } - }, - "debug_clear_tomorrow": { - "name": "Debug: Clear Tomorrow Data", - "description": "DEBUG/TESTING: Removes tomorrow's price data from the interval pool cache. Use this to test the tomorrow data refresh cycle without waiting for the next day. After calling this service, the lifecycle sensor will show 'searching_tomorrow' (after 13:00) and the next Timer #1 cycle will fetch new data from the API.", - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "Optional config entry ID. If not provided, uses the first available entry." - } - } + }, + "next_hour_price_level": { + "name": "Next Hour Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" } + }, + "lowest_price_today": { + "name": "Today's Lowest Price" + }, + "highest_price_today": { + "name": "Today's Highest Price" + }, + "average_price_today": { + "name": "⌀ Price Today" + }, + "lowest_price_tomorrow": { + "name": "Tomorrow's Lowest Price" + }, + "highest_price_tomorrow": { + "name": "Tomorrow's Highest Price" + }, + "average_price_tomorrow": { + "name": "⌀ Price Tomorrow" + }, + "yesterday_price_level": { + "name": "Yesterday's Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" + } + }, + "today_price_level": { + "name": "Today's Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" + } + }, + "tomorrow_price_level": { + "name": "Tomorrow's Price Level", + "state": { + "very_cheap": "Very Cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very Expensive" + } + }, + "yesterday_price_rating": { + "name": "Yesterday's Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "today_price_rating": { + "name": "Today's Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "tomorrow_price_rating": { + "name": "Tomorrow's Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "trailing_price_average": { + "name": "⌀ Price Trailing 24h" + }, + "leading_price_average": { + "name": "⌀ Price Leading 24h" + }, + "trailing_price_min": { + "name": "Trailing 24h Minimum Price" + }, + "trailing_price_max": { + "name": "Trailing 24h Maximum Price" + }, + "leading_price_min": { + "name": "Leading 24h Minimum Price" + }, + "leading_price_max": { + "name": "Leading 24h Maximum Price" + }, + "current_interval_price_rating": { + "name": "Current Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "next_interval_price_rating": { + "name": "Next Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "previous_interval_price_rating": { + "name": "Previous Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "current_hour_price_rating": { + "name": "Current Hour Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "next_hour_price_rating": { + "name": "Next Hour Price Rating", + "state": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "next_avg_1h": { + "name": "⌀ Price Next 1h" + }, + "next_avg_2h": { + "name": "⌀ Price Next 2h" + }, + "next_avg_3h": { + "name": "⌀ Price Next 3h" + }, + "next_avg_4h": { + "name": "⌀ Price Next 4h" + }, + "next_avg_5h": { + "name": "⌀ Price Next 5h" + }, + "next_avg_6h": { + "name": "⌀ Price Next 6h" + }, + "next_avg_8h": { + "name": "⌀ Price Next 8h" + }, + "next_avg_12h": { + "name": "⌀ Price Next 12h" + }, + "price_outlook_1h": { + "name": "Price Outlook (1h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_2h": { + "name": "Price Outlook (2h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_3h": { + "name": "Price Outlook (3h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_4h": { + "name": "Price Outlook (4h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_5h": { + "name": "Price Outlook (5h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_6h": { + "name": "Price Outlook (6h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_8h": { + "name": "Price Outlook (8h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_outlook_12h": { + "name": "Price Outlook (12h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_2h": { + "name": "Price Trajectory (2h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_3h": { + "name": "Price Trajectory (3h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_4h": { + "name": "Price Trajectory (4h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_5h": { + "name": "Price Trajectory (5h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_6h": { + "name": "Price Trajectory (6h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_8h": { + "name": "Price Trajectory (8h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "price_trajectory_12h": { + "name": "Price Trajectory (12h)", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "current_price_trend": { + "name": "Current Price Trend", + "state": { + "strongly_rising": "Strongly Rising", + "rising": "Rising", + "stable": "Stable", + "falling": "Falling", + "strongly_falling": "Strongly Falling" + } + }, + "next_price_trend_change": { + "name": "Next Price Trend Change" + }, + "next_price_trend_change_in": { + "name": "Next Price Trend Change In" + }, + "daily_rating": { + "name": "Daily Price Rating" + }, + "monthly_rating": { + "name": "Monthly Price Rating" + }, + "data_lifecycle_status": { + "name": "Data Lifecycle Status", + "state": { + "cached": "Cached", + "fresh": "Fresh", + "refreshing": "Refreshing", + "searching_tomorrow": "Searching Tomorrow", + "turnover_pending": "Turnover Pending", + "error": "Error" + } + }, + "today_volatility": { + "name": "Today's Price Volatility", + "state": { + "low": "Low", + "moderate": "Moderate", + "high": "High", + "very_high": "Very High" + } + }, + "tomorrow_volatility": { + "name": "Tomorrow's Price Volatility", + "state": { + "low": "Low", + "moderate": "Moderate", + "high": "High", + "very_high": "Very High" + } + }, + "next_24h_volatility": { + "name": "Next 24h Price Volatility", + "state": { + "low": "Low", + "moderate": "Moderate", + "high": "High", + "very_high": "Very High" + } + }, + "today_tomorrow_volatility": { + "name": "Today+Tomorrow Price Volatility", + "state": { + "low": "Low", + "moderate": "Moderate", + "high": "High", + "very_high": "Very High" + } + }, + "best_price_end_time": { + "name": "Best Price End" + }, + "best_price_period_duration": { + "name": "Best Price Duration" + }, + "best_price_remaining_minutes": { + "name": "Best Price Remaining Time" + }, + "best_price_progress": { + "name": "Best Price Progress" + }, + "best_price_next_start_time": { + "name": "Best Price Start" + }, + "best_price_next_in_minutes": { + "name": "Best Price Starts In" + }, + "peak_price_end_time": { + "name": "Peak Price End" + }, + "peak_price_period_duration": { + "name": "Peak Price Duration" + }, + "peak_price_remaining_minutes": { + "name": "Peak Price Remaining Time" + }, + "peak_price_progress": { + "name": "Peak Price Progress" + }, + "peak_price_next_start_time": { + "name": "Peak Price Start" + }, + "peak_price_next_in_minutes": { + "name": "Peak Price Starts In" + }, + "home_type": { + "name": "Home Type", + "state": { + "apartment": "Apartment", + "rowhouse": "Rowhouse", + "house": "House", + "cottage": "Cottage" + } + }, + "home_size": { + "name": "Home Size" + }, + "main_fuse_size": { + "name": "Main Fuse Size" + }, + "number_of_residents": { + "name": "Number of Residents" + }, + "primary_heating_source": { + "name": "Primary Heating Source", + "state": { + "air2air_heatpump": "Air-to-Air Heat Pump", + "air2water_heatpump": "Air-to-Water Heat Pump", + "boiler": "Boiler", + "central_heating": "Central Heating", + "district_heating": "District Heating", + "district": "District Heating", + "electric_boiler": "Electric Boiler", + "electricity": "Electricity", + "floor": "Floor Heating", + "gas": "Gas", + "ground_heatpump": "Ground Heat Pump", + "ground": "Ground Heat Pump", + "oil": "Oil", + "other": "Other", + "waste": "Waste Heat" + } + }, + "grid_company": { + "name": "Grid Company" + }, + "grid_area_code": { + "name": "Grid Area Code" + }, + "price_area_code": { + "name": "Price Area Code" + }, + "consumption_ean": { + "name": "Consumption EAN" + }, + "production_ean": { + "name": "Production EAN" + }, + "energy_tax_type": { + "name": "Energy Tax Type" + }, + "vat_type": { + "name": "VAT Type" + }, + "estimated_annual_consumption": { + "name": "Estimated Annual Consumption" + }, + "subscription_status": { + "name": "Subscription Status", + "state": { + "running": "Running", + "ended": "Ended", + "pending": "Pending", + "unknown": "Unknown" + } + }, + "day_pattern_yesterday": { + "name": "Yesterday's Price Pattern", + "state": { + "valley": "Valley", + "peak": "Peak", + "double_valley": "Double Valley", + "double_peak": "Double Peak", + "flat": "Flat", + "rising": "Rising", + "falling": "Falling", + "mixed": "Mixed" + } + }, + "day_pattern_today": { + "name": "Today's Price Pattern", + "state": { + "valley": "Valley", + "peak": "Peak", + "double_valley": "Double Valley", + "double_peak": "Double Peak", + "flat": "Flat", + "rising": "Rising", + "falling": "Falling", + "mixed": "Mixed" + } + }, + "day_pattern_tomorrow": { + "name": "Tomorrow's Price Pattern", + "state": { + "valley": "Valley", + "peak": "Peak", + "double_valley": "Double Valley", + "double_peak": "Double Peak", + "flat": "Flat", + "rising": "Rising", + "falling": "Falling", + "mixed": "Mixed" + } + }, + "chart_data_export": { + "name": "Chart Data Export", + "state": { + "pending": "Pending", + "ready": "Ready", + "error": "Error" + } + }, + "chart_metadata": { + "name": "Chart Metadata", + "state": { + "pending": "Pending", + "ready": "Ready", + "error": "Error" + } + } }, - "selector": { - "account_choice": { - "options": { - "new_token": "Add new Tibber account API token" - } + "binary_sensor": { + "peak_price_period": { + "name": "Peak Price Period" + }, + "best_price_period": { + "name": "Best Price Period" + }, + "connection": { + "name": "Tibber API Connection" + }, + "tomorrow_data_available": { + "name": "Tomorrow's Data Available" + }, + "has_ventilation_system": { + "name": "Has Ventilation System" + }, + "realtime_consumption_enabled": { + "name": "Realtime Consumption Enabled" + } + }, + "number": { + "best_price_flex_override": { + "name": "Best Price: Flexibility" + }, + "best_price_min_distance_override": { + "name": "Best Price: Minimum Distance" + }, + "best_price_min_period_length_override": { + "name": "Best Price: Minimum Period Length" + }, + "best_price_min_periods_override": { + "name": "Best Price: Minimum Periods" + }, + "best_price_relaxation_attempts_override": { + "name": "Best Price: Relaxation Attempts" + }, + "best_price_gap_count_override": { + "name": "Best Price: Gap Tolerance" + }, + "peak_price_flex_override": { + "name": "Peak Price: Flexibility" + }, + "peak_price_min_distance_override": { + "name": "Peak Price: Minimum Distance" + }, + "peak_price_min_period_length_override": { + "name": "Peak Price: Minimum Period Length" + }, + "peak_price_min_periods_override": { + "name": "Peak Price: Minimum Periods" + }, + "peak_price_relaxation_attempts_override": { + "name": "Peak Price: Relaxation Attempts" + }, + "peak_price_gap_count_override": { + "name": "Peak Price: Gap Tolerance" + } + }, + "switch": { + "best_price_enable_relaxation_override": { + "name": "Best Price: Achieve Minimum Count" + }, + "peak_price_enable_relaxation_override": { + "name": "Peak Price: Achieve Minimum Count" + } + } + }, + "issues": { + "new_homes_available": { + "title": "New Tibber homes detected", + "description": "We detected {count} new home(s) on your Tibber account: {homes}. You can add them to Home Assistant through the Tibber integration configuration." + }, + "homes_removed": { + "title": "Tibber homes removed", + "description": "We detected that {count} home(s) have been removed from your Tibber account: {homes}. Please review your Tibber integration configuration." + }, + "tomorrow_data_missing": { + "title": "Tomorrow's price data missing for {home_name}", + "description": "Tomorrow's electricity price data is still unavailable after {warning_hour}:00. This is unusual, as Tibber typically publishes tomorrow's prices in the afternoon (around 13:00-14:00 CET).\n\nPossible causes:\n- Tibber has not yet published tomorrow's prices\n- Temporary API issues\n- Your electricity provider has not submitted prices to Tibber\n\nThis issue will automatically resolve once tomorrow's data becomes available. If this persists beyond 20:00, please check the Tibber app or contact Tibber support." + }, + "rate_limit_exceeded": { + "title": "API rate limit exceeded for {home_name}", + "description": "The Tibber API has rate-limited this integration after {error_count} consecutive errors. This means requests are being made too frequently.\n\nThe integration will automatically retry with increasing delays. This issue will resolve once the rate limit expires.\n\nIf this persists for several hours, consider:\n- Checking if multiple Home Assistant instances are using the same API token\n- Verifying no other applications are heavily using your Tibber API token\n- Reducing the update frequency if you've customized it" + }, + "home_not_found": { + "title": "Home {home_name} not found in Tibber account", + "description": "The home configured in this integration (entry ID: {entry_id}) is no longer available in your Tibber account. This typically happens when:\n- The home was deleted from your Tibber account\n- The home was moved to a different Tibber account\n- Access to this home was revoked\n\nPlease remove this integration entry and re-add it if the home should still be monitored. To remove this entry, go to Settings → Devices & Services → Tibber Prices and delete the {home_name} configuration." + }, + "entity_migration": { + "title": "Tibber Prices: Action required after update ({home_name})", + "description": "This update includes breaking changes that were applied automatically.\n\n**Renamed Entities ({count})**\n\nThe following entity keys were renamed. Your existing entity IDs and automations remain intact:\n\n{entity_list}\n\n**Duration Sensor Value Change**\n\nAll duration sensors (remaining time, starts in, period duration, trend change countdown) now report their state value in **minutes** instead of hours. The display unit in dashboards remains hours by default.\n\nIf you have automations using numeric comparisons on these sensors, update your thresholds:\n- Old: `state < 0.25` (15 minutes as hours)\n- New: `state < 15` (15 minutes)\n\nDismiss this notice after reviewing your automations." + } + }, + "exceptions": { + "no_entries_found": { + "message": "No Tibber Prices integration entries found. Please set up the integration first." + }, + "multiple_entries_no_entry_id": { + "message": "Multiple Tibber Prices entries found. Please specify 'entry_id' to select which entry to use." + }, + "invalid_entry_id": { + "message": "Invalid or unavailable config entry. Please check the entry ID and ensure the integration is loaded." + }, + "missing_home_id": { + "message": "Home ID not found in the config entry. Please reconfigure the integration." + }, + "user_data_not_available": { + "message": "User data is not yet available. Please wait for the first data update to complete." + }, + "timezone_not_found": { + "message": "Could not determine the home timezone. Please verify the home configuration in your Tibber account." + }, + "end_before_start": { + "message": "End time must be after start time." + }, + "price_fetch_failed": { + "message": "Failed to fetch price data from the Tibber API. Please try again later." + }, + "invalid_search_scope": { + "message": "Invalid search scope value. Valid scopes are: today, tomorrow, remaining_today, next_24h, next_48h." + }, + "scope_conflicts_with_range": { + "message": "search_scope cannot be combined with explicit range parameters: {params}. Use either search_scope OR explicit start/end parameters." + }, + "day_offset_requires_time": { + "message": "{offset_param} requires {time_param} to be set. Day offset only modifies the date of an explicit time parameter." + }, + "min_level_exceeds_max": { + "message": "min_price_level '{min_level}' is higher than max_price_level '{max_level}'. The minimum level must be equal to or lower than the maximum level." + }, + "power_profile_length_mismatch": { + "message": "power_profile has {profile_length} entries but the duration requires {interval_count} intervals ({duration_minutes} minutes). The power_profile must have exactly one entry per 15-minute interval." + }, + "level_and_rating_filter_conflict": { + "message": "level_filter and rating_level_filter cannot be used together. Use only one filter type per request." + }, + "insert_nulls_requires_filter": { + "message": "insert_nulls mode '{mode}' requires a level_filter or rating_level_filter to define segments. Without a filter, use insert_nulls: none." + }, + "connect_segments_requires_segments_mode": { + "message": "connect_segments requires insert_nulls to be set to 'segments'. Set insert_nulls: segments to use segment connection." + }, + "array_fields_requires_array_format": { + "message": "array_fields can only be used with output_format: array_of_arrays. Change the output format or remove array_fields." + }, + "invalid_array_fields": { + "message": "Invalid array_fields template. Use field names in curly braces, e.g. '{start_time}, {price_per_kwh}, {level}'." + } + }, + "services": { + "get_price": { + "name": "Get Price Data", + "description": "Fetch price data for a specific time range with automatic routing. Development and testing service for the price_info_for_range API function. Automatically uses PRICE_INFO, PRICE_INFO_RANGE, or both based on the time range boundary.", + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "start_time": { + "name": "Start Time", + "description": "Start of the time range (inclusive, timezone-aware)." + }, + "end_time": { + "name": "End Time", + "description": "End of the time range (exclusive, timezone-aware)." + } + } + }, + "get_apexcharts_yaml": { + "name": "Get ApexCharts Card YAML", + "description": "⚠️ IMPORTANT: This service generates a BASIC EXAMPLE configuration for ApexCharts Card as a starting point. It is NOT a complete solution for all ApexCharts features. This integration is primarily a DATA PROVIDER. The generated YAML demonstrates how to use the `get_chartdata` service to fetch price data. Due to the segmented nature of our data (different time periods per series) and the use of Home Assistant's service API instead of entity attributes, many advanced ApexCharts features (like in_header, certain transformations) are not compatible or require manual customization. You are welcome to customize the generated YAML for your specific needs, but please understand that comprehensive ApexCharts configuration support is beyond the scope of this integration. Community contributions with improved configurations are always appreciated - if you find a better setup that works, please share it so everyone can benefit! For direct data access to build your own charts, use the `get_chartdata` service instead.", + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." }, "day": { - "options": { - "yesterday": "Yesterday", - "today": "Today", - "tomorrow": "Tomorrow", - "rolling_window": "Rolling Window", - "rolling_window_autozoom": "Rolling Window (Auto-Zoom)" - } - }, - "resolution": { - "options": { - "interval": "Interval (15 min)", - "hourly": "Hourly" - } - }, - "output_format": { - "options": { - "array_of_objects": "Array of Objects", - "array_of_arrays": "Array of Arrays" - } + "name": "Day", + "description": "Which day to visualize (default: Rolling Window). Fixed day options (Yesterday/Today/Tomorrow) show 24h spans without additional dependencies. Dynamic options require config-template-card: Rolling Window displays a fixed 48h window that automatically shifts between yesterday+today and today+tomorrow based on data availability. Rolling Window (Auto-Zoom) behaves the same but additionally auto-zooms in (2h lookback + remaining time until midnight, graph_span decreases every 15 minutes)." }, "level_type": { - "options": { - "rating_level": "Rating Level (low/normal/high)", - "level": "Tibber Level (very cheap to very expensive)" - } + "name": "Level Type", + "description": "Select which price level classification to visualize: 'rating_level' (low/normal/high based on your configured thresholds) or 'level' (Tibber API levels: very cheap/cheap/normal/expensive/very expensive)." + }, + "highlight_best_price": { + "name": "Highlight Best Price Periods", + "description": "Add a semi-transparent green overlay to highlight the best price periods on the chart. This makes it easy to visually identify the optimal times for energy consumption." + }, + "highlight_peak_price": { + "name": "Highlight Peak Price Periods", + "description": "Add a semi-transparent red overlay to highlight the peak price periods on the chart. This makes it easy to visually identify times when energy is most expensive." + }, + "resolution": { + "name": "Resolution", + "description": "Time resolution for the chart data. 'interval' (default): Original 15-minute intervals (96 points per day). 'hourly': Aggregated hourly values using a rolling 60-minute window (24 points per day) for a cleaner, less cluttered chart." + } + } + }, + "get_chartdata": { + "name": "Get Chart Data", + "description": "Returns price data in a simple chart-friendly format compatible with the Tibber Core integration output structure. Perfect for use with popular chart cards like ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card, or the built-in History Graph Card. Field names and data structure can be customized to match your specific chart requirements.", + "sections": { + "general": { + "name": "General", + "description": "General settings for fetching chart data." + }, + "selection": { + "name": "Selection", + "description": "Select which data to include in the output." + }, + "filters": { + "name": "Filters", + "description": "Filter data based on price levels, rating levels, or special periods." + }, + "transformation": { + "name": "Transform Data", + "description": "Transform the data output for better chart compatibility." + }, + "format": { + "name": "Format", + "description": "Customize the output format." + }, + "arrays_of_arrays": { + "name": "Advanced Output Settings: Array of Arrays", + "description": "Settings for output format when using an array of arrays." + }, + "arrays_of_objects": { + "name": "Advanced Output Settings: Array of Objects", + "description": "Settings for output format when using an array of objects." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "day": { + "name": "Day", + "description": "Which day(s) to fetch prices for. You can select multiple days. If not specified, returns a rolling 2-day window: today+tomorrow (when tomorrow data is available) or yesterday+today (when tomorrow data is not yet available). This provides continuous chart display without gaps." + }, + "resolution": { + "name": "Resolution", + "description": "Time resolution for the returned data. Options: 'interval' (default, 15-minute intervals, 96 points per day), 'hourly' (hourly averages, 24 points per day)." + }, + "output_format": { + "name": "Output Format", + "description": "Output format for the returned data. Options: 'array_of_objects' (default, array of objects with customizable field names), 'array_of_arrays' (array of [timestamp, price] arrays with trailing null point for stepline charts)." + }, + "array_fields": { + "name": "Array Fields", + "description": "Define which fields to include. Use field names in curly braces, separated by commas. Available fields: start_time, price_per_kwh, level, rating_level, average. Fields will be automatically enabled even if include_* options are not set. Leave empty for default (timestamp and price only)." + }, + "subunit_currency": { + "name": "Subunit Currency", + "description": "Return prices in subunit currency units (cents for EUR, øre for NOK/SEK) instead of base currency units. Disabled by default." + }, + "round_decimals": { + "name": "Round Decimals", + "description": "Number of decimal places to round prices to (0-10). If not specified, uses default precision (4 decimals for base currency, 2 for subunit currency)." + }, + "data_key": { + "name": "Data Key", + "description": "Custom name for the top-level data key in the response. Defaults to 'data' if not specified." + }, + "include_level": { + "name": "Include Level", + "description": "Include the Tibber price level field (very cheap/cheap/normal/expensive/very expensive) in each data point." + }, + "include_rating_level": { + "name": "Include Rating Level", + "description": "Include the calculated rating level field (low/normal/high) based on your configured thresholds in each data point." + }, + "include_average": { + "name": "Include Average", + "description": "Include the daily average price in each data point for comparison." + }, + "include_energy": { + "name": "Include Energy Price", + "description": "Include the raw energy/spot price (excluding taxes and fees) in each data point. This is the 'energy' field from the Tibber API, useful for feed-in/net metering calculations." + }, + "include_tax": { + "name": "Include Tax", + "description": "Include the tax component of the price in each data point. This is the 'tax' field from the Tibber API, representing fees, taxes, and grid charges." }, "level_filter": { - "options": { - "very_cheap": "Very cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very expensive" - } + "name": "Level Filter", + "description": "Filter intervals to include only specific Tibber price levels (very cheap/cheap/normal/expensive/very expensive). If not specified, all levels are included." }, "rating_level_filter": { - "options": { - "low": "Low", - "normal": "Normal", - "high": "High" - } - }, - "insert_nulls": { - "options": { - "none": "None", - "segments": "Segments", - "all": "All" - } + "name": "Rating Level Filter", + "description": "Filter intervals to include only specific rating levels (low/normal/high). If not specified, all rating levels are included." }, "period_filter": { - "options": { - "best_price": "Best Price Periods", - "peak_price": "Peak Price Periods" - } + "name": "Period Filter", + "description": "Filter intervals to include only those within Best Price or Peak Price periods. Options: 'best_price' (only intervals in Best Price periods), 'peak_price' (only intervals in Peak Price periods). If not specified, all intervals are included. This uses the precomputed period data from binary sensors." + }, + "insert_nulls": { + "name": "Insert NULL Values", + "description": "Control NULL value insertion for filtered data. 'none' (default): No NULL values, only matching intervals. 'segments': Add NULL points at segment boundaries for clean gaps in charts (recommended for stepline charts). 'all': Insert NULL for all timestamps where filter doesn't match (useful for continuous time series visualization)." + }, + "connect_segments": { + "name": "Connect Segments", + "description": "[ONLY WITH 'Insert NULL Values'] When enabled, adds connecting points at segment boundaries to visually connect different price level segments in stepline charts. When price goes DOWN at a boundary, adds a point with the lower price at the end of the current segment. When price goes UP, adds a hold point before the gap. This creates smooth visual transitions between segments instead of abrupt gaps." + }, + "add_trailing_null": { + "name": "Add Trailing Null Point", + "description": "Add a final data point with null values (except timestamp) at the end. Some chart libraries need this to prevent extrapolation/interpolation to the viewport edge when using stepline rendering. Leave disabled unless your chart requires it." + }, + "start_time_field": { + "name": "Start Time Field Name", + "description": "Custom name for the start time field in the output. Defaults to 'start_time' if not specified." + }, + "end_time_field": { + "name": "End Time Field Name", + "description": "Custom name for the end time field in the output. Defaults to 'end_time' if not specified. Only used with period_filter." + }, + "price_field": { + "name": "Price Field Name", + "description": "Custom name for the price field in the output. Defaults to 'price_per_kwh' if not specified." + }, + "level_field": { + "name": "Level Field Name", + "description": "Custom name for the level field in the output. Defaults to 'level' if not specified. Only used when include_level is enabled." + }, + "rating_level_field": { + "name": "Rating Level Field Name", + "description": "Custom name for the rating_level field in the output. Defaults to 'rating_level' if not specified. Only used when include_rating_level is enabled." + }, + "average_field": { + "name": "Average Field Name", + "description": "Custom name for the average field in the output. Defaults to 'average' if not specified. Only used when include_average is enabled." + }, + "energy_field": { + "name": "Energy Field Name", + "description": "Custom name for the energy price field in the output. Defaults to 'energy_price' if not specified. Only used when include_energy is enabled." + }, + "tax_field": { + "name": "Tax Field Name", + "description": "Custom name for the tax field in the output. Defaults to 'tax' if not specified. Only used when include_tax is enabled." }, "metadata": { - "options": { - "include": "Include (data + metadata)", - "only": "Only metadata", - "none": "None (data only)" - } + "name": "Metadata", + "description": "Control metadata inclusion in the response. 'include' (default): Returns both chart data and metadata with price statistics, currency info, Y-axis suggestions, and time range. 'only': Returns only metadata without processing chart data (fast, useful for dynamic Y-axis configuration). 'none': Returns only chart data without metadata." + } + } + }, + "refresh_user_data": { + "name": "Refresh User Data", + "description": "Forces a refresh of the user data (homes, profile information) from the Tibber API. This can be useful after making changes to your Tibber account or when troubleshooting connectivity issues.", + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + } + } + }, + "find_cheapest_block": { + "name": "Find Cheapest Block", + "description": "Finds the cheapest contiguous time window of a given duration. Designed for appliance scheduling: dishwasher, washing machine, dryer, etc. Returns the single cheapest window with start/end times and price statistics.", + "sections": { + "search_range": { + "name": "Search Range", + "description": "Define the time window to search within." }, - "volatility": { - "options": { - "low": "Low", - "moderate": "Moderate", - "high": "High", - "very_high": "Very high" - } + "time_alternatives": { + "name": "Alternative Time Range Options", + "description": "Alternative ways to define the search range using time-of-day and offsets." }, - "current_interval_price_level": { - "options": { - "any": "Any", - "very_cheap": "Very cheap", - "cheap": "Cheap", - "normal": "Normal", - "expensive": "Expensive", - "very_expensive": "Very expensive" - } + "price_filter": { + "name": "Price Level Filter", + "description": "Restrict search to intervals within the specified price level range." }, - "currency_display_mode": { - "options": { - "base": "Base Currency (€, kr)", - "subunit": "Subunit Currency (ct, øre)" - } + "output": { + "name": "Output Options", + "description": "Control cost estimation and comparison output." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." }, - "average_sensor_display": { - "options": { - "median": "Median", - "mean": "Arithmetic Mean" - } + "duration": { + "name": "Duration", + "description": "Length of the desired contiguous window. Automatically rounded up to the next quarter-hour. Maximum: 12 hours." + }, + "search_start": { + "name": "Search Start", + "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." + }, + "search_end": { + "name": "Search End", + "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." + }, + "search_start_time": { + "name": "Search Start Time", + "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." + }, + "search_start_day_offset": { + "name": "Search Start Day Offset", + "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." + }, + "search_end_time": { + "name": "Search End Time", + "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." + }, + "search_end_day_offset": { + "name": "Search End Day Offset", + "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." + }, + "search_start_offset_minutes": { + "name": "Search Start Offset (minutes)", + "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." + }, + "search_end_offset_minutes": { + "name": "Search End Offset (minutes)", + "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." + }, + "include_current_interval": { + "name": "Include Current Interval", + "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." + }, + "use_base_unit": { + "name": "Use Base Currency Unit", + "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." }, "search_scope": { - "options": { - "today": "Today", - "tomorrow": "Tomorrow", - "remaining_today": "Remaining Today", - "next_24h": "Next 24 Hours", - "next_48h": "Next 48 Hours" - } + "name": "Search Scope", + "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." + }, + "max_price_level": { + "name": "Maximum Price Level", + "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." + }, + "min_price_level": { + "name": "Minimum Price Level", + "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." + }, + "include_comparison_details": { + "name": "Include Comparison Details", + "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." + }, + "power_profile": { + "name": "Power Profile", + "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." } + } }, - "title": "Tibber Price Information & Ratings" + "find_most_expensive_block": { + "name": "Find Most Expensive Block", + "description": "Finds the most expensive contiguous time window of a given duration. Useful for identifying peak price periods to avoid. Returns the single most expensive window with start/end times and price statistics.", + "sections": { + "search_range": { + "name": "Search Range", + "description": "Define the time window to search within." + }, + "time_alternatives": { + "name": "Alternative Time Range Options", + "description": "Alternative ways to define the search range using time-of-day and offsets." + }, + "price_filter": { + "name": "Price Level Filter", + "description": "Restrict search to intervals within the specified price level range." + }, + "output": { + "name": "Output Options", + "description": "Control cost estimation and comparison output." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "duration": { + "name": "Duration", + "description": "Length of the desired contiguous window. Automatically rounded up to the next quarter-hour. Maximum: 12 hours." + }, + "search_start": { + "name": "Search Start", + "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." + }, + "search_end": { + "name": "Search End", + "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." + }, + "search_start_time": { + "name": "Search Start Time", + "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." + }, + "search_start_day_offset": { + "name": "Search Start Day Offset", + "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." + }, + "search_end_time": { + "name": "Search End Time", + "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." + }, + "search_end_day_offset": { + "name": "Search End Day Offset", + "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." + }, + "search_start_offset_minutes": { + "name": "Search Start Offset (minutes)", + "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." + }, + "search_end_offset_minutes": { + "name": "Search End Offset (minutes)", + "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." + }, + "include_current_interval": { + "name": "Include Current Interval", + "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." + }, + "use_base_unit": { + "name": "Use Base Currency Unit", + "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." + }, + "search_scope": { + "name": "Search Scope", + "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." + }, + "max_price_level": { + "name": "Maximum Price Level", + "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." + }, + "min_price_level": { + "name": "Minimum Price Level", + "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." + }, + "include_comparison_details": { + "name": "Include Comparison Details", + "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." + }, + "power_profile": { + "name": "Power Profile", + "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." + } + } + }, + "find_cheapest_hours": { + "name": "Find Cheapest Hours", + "description": "Finds the cheapest intervals totaling a given duration, not necessarily contiguous. Designed for flexible loads: battery charging, EV, water heater. Returns a schedule of intervals grouped into contiguous segments.", + "sections": { + "search_range": { + "name": "Search Range", + "description": "Define the time window to search within." + }, + "time_alternatives": { + "name": "Alternative Time Range Options", + "description": "Alternative ways to define the search range using time-of-day and offsets." + }, + "price_filter": { + "name": "Price Level Filter", + "description": "Restrict search to intervals within the specified price level range." + }, + "output": { + "name": "Output Options", + "description": "Control cost estimation and comparison output." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "duration": { + "name": "Duration", + "description": "Total cheap time needed. Automatically rounded up to the next quarter-hour. Maximum: 24 hours." + }, + "search_start": { + "name": "Search Start", + "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." + }, + "search_end": { + "name": "Search End", + "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." + }, + "search_start_time": { + "name": "Search Start Time", + "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." + }, + "search_start_day_offset": { + "name": "Search Start Day Offset", + "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." + }, + "search_end_time": { + "name": "Search End Time", + "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." + }, + "search_end_day_offset": { + "name": "Search End Day Offset", + "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." + }, + "search_start_offset_minutes": { + "name": "Search Start Offset (minutes)", + "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." + }, + "search_end_offset_minutes": { + "name": "Search End Offset (minutes)", + "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." + }, + "include_current_interval": { + "name": "Include Current Interval", + "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." + }, + "min_segment_duration": { + "name": "Minimum Segment Duration", + "description": "Minimum contiguous run length. Prevents rapid on/off cycling for devices with minimum run times. Automatically rounded up to the next quarter-hour. Default: 15 minutes. Maximum: 4 hours." + }, + "use_base_unit": { + "name": "Use Base Currency Unit", + "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." + }, + "search_scope": { + "name": "Search Scope", + "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." + }, + "max_price_level": { + "name": "Maximum Price Level", + "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." + }, + "min_price_level": { + "name": "Minimum Price Level", + "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." + }, + "include_comparison_details": { + "name": "Include Comparison Details", + "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." + }, + "power_profile": { + "name": "Power Profile", + "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." + } + } + }, + "find_most_expensive_hours": { + "name": "Find Most Expensive Hours", + "description": "Finds the most expensive intervals totaling a given duration, not necessarily contiguous. Useful for identifying peak price periods to avoid. Returns a schedule of intervals grouped into contiguous segments.", + "sections": { + "search_range": { + "name": "Search Range", + "description": "Define the time window to search within." + }, + "time_alternatives": { + "name": "Alternative Time Range Options", + "description": "Alternative ways to define the search range using time-of-day and offsets." + }, + "price_filter": { + "name": "Price Level Filter", + "description": "Restrict search to intervals within the specified price level range." + }, + "output": { + "name": "Output Options", + "description": "Control cost estimation and comparison output." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "duration": { + "name": "Duration", + "description": "Total expensive time to find. Automatically rounded up to the next quarter-hour. Maximum: 24 hours." + }, + "search_start": { + "name": "Search Start", + "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." + }, + "search_end": { + "name": "Search End", + "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." + }, + "search_start_time": { + "name": "Search Start Time", + "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." + }, + "search_start_day_offset": { + "name": "Search Start Day Offset", + "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search Start Time." + }, + "search_end_time": { + "name": "Search End Time", + "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." + }, + "search_end_day_offset": { + "name": "Search End Day Offset", + "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Negative values search in the past. Only used with Search End Time." + }, + "search_start_offset_minutes": { + "name": "Search Start Offset (minutes)", + "description": "Alternative: start searching this many minutes from now. Positive = future (60 = in 1 hour), negative = past (-60 = 1 hour ago). Ignored if Search Start or Search Start Time is set." + }, + "search_end_offset_minutes": { + "name": "Search End Offset (minutes)", + "description": "Alternative: stop searching this many minutes from now. Positive = future (480 = in 8 hours), negative = past (-60 = 1 hour ago). Ignored if Search End or Search End Time is set." + }, + "include_current_interval": { + "name": "Include Current Interval", + "description": "Include the currently running 15-minute interval in the search. When enabled (default), the search starts at the beginning of the current interval so it can be part of the result." + }, + "min_segment_duration": { + "name": "Minimum Segment Duration", + "description": "Minimum contiguous run length. Prevents rapid on/off cycling for devices with minimum run times. Automatically rounded up to the next quarter-hour. Default: 15 minutes. Maximum: 4 hours." + }, + "use_base_unit": { + "name": "Use Base Currency Unit", + "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." + }, + "search_scope": { + "name": "Search Scope", + "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." + }, + "max_price_level": { + "name": "Maximum Price Level", + "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." + }, + "min_price_level": { + "name": "Minimum Price Level", + "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." + }, + "include_comparison_details": { + "name": "Include Comparison Details", + "description": "Enrich the price_comparison result with additional fields: comparison_price_min, comparison_price_max, and (block only) comparison_window_end." + }, + "power_profile": { + "name": "Power Profile", + "description": "Variable power draw in watts per 15-minute interval. When set, estimated_total_cost reflects actual consumption instead of a flat 1 kW load. The profile is extended by repeating the last value if shorter than the window." + } + } + }, + "find_cheapest_schedule": { + "name": "Find Cheapest Schedule", + "description": "Schedules multiple appliances optimally without time overlap. Each task gets the cheapest available contiguous window; tasks are placed greedily in ascending cost order. Returns a per-task schedule with start/end times and price stats.", + "sections": { + "scheduling_options": { + "name": "Scheduling Options", + "description": "Configure tasks and gap constraints between them." + }, + "search_range": { + "name": "Search Range", + "description": "Define the time window to search within." + }, + "time_alternatives": { + "name": "Alternative Time Range Options", + "description": "Alternative ways to define the search range using time-of-day and offsets." + }, + "price_filter": { + "name": "Price Level Filter", + "description": "Restrict search to intervals within the specified price level range." + }, + "output": { + "name": "Output Options", + "description": "Control output currency unit." + } + }, + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "The config entry ID for the Tibber integration." + }, + "tasks": { + "name": "Tasks", + "description": "List of tasks to schedule. Each task requires name (string) and duration (hh:mm:ss). Optionally add power_profile (list of watts per 15-min interval). Maximum 4 tasks." + }, + "gap_minutes": { + "name": "Gap Between Tasks (minutes)", + "description": "Minimum gap in minutes between consecutive scheduled tasks. Rounded up to 15 minutes. Default: 0 (no gap)." + }, + "search_scope": { + "name": "Search Scope", + "description": "Shorthand for common search ranges. Overrides all other time range options. today / tomorrow = full calendar day, remaining_today = now until midnight, next_24h / next_48h = rolling window from now." + }, + "search_start": { + "name": "Search Start", + "description": "Start of the search range as exact date and time. Highest priority — overrides all other start options. Defaults to now if not specified." + }, + "search_end": { + "name": "Search End", + "description": "End of the search range as exact date and time. Highest priority — overrides all other end options. Defaults to end of tomorrow if not specified." + }, + "search_start_time": { + "name": "Search Start Time", + "description": "Alternative: start searching at this time of day. Combine with day offset. Ignored if Search Start (datetime) is set." + }, + "search_start_day_offset": { + "name": "Search Start Day Offset", + "description": "Day offset for Search Start Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search Start Time." + }, + "search_end_time": { + "name": "Search End Time", + "description": "Alternative: stop searching at this time of day. Combine with day offset. Ignored if Search End (datetime) is set." + }, + "search_end_day_offset": { + "name": "Search End Day Offset", + "description": "Day offset for Search End Time. -7 to 2: -1 = yesterday, 0 = today, 1 = tomorrow. Only used with Search End Time." + }, + "search_start_offset_minutes": { + "name": "Search Start Offset (minutes)", + "description": "Alternative: start searching this many minutes from now. Positive = future, negative = past. Ignored if Search Start or Search Start Time is set." + }, + "search_end_offset_minutes": { + "name": "Search End Offset (minutes)", + "description": "Alternative: stop searching this many minutes from now. Positive = future, negative = past. Ignored if Search End or Search End Time is set." + }, + "include_current_interval": { + "name": "Include Current Interval", + "description": "Include the currently running 15-minute interval in the search." + }, + "max_price_level": { + "name": "Maximum Price Level", + "description": "Only consider intervals at or below this Tibber price level. very_cheap = most restrictive, very_expensive = no restriction." + }, + "min_price_level": { + "name": "Minimum Price Level", + "description": "Only consider intervals at or above this Tibber price level. Useful for find_most_expensive to focus on truly expensive intervals." + }, + "use_base_unit": { + "name": "Use Base Currency Unit", + "description": "Force prices in base currency (EUR, NOK) instead of the configured display unit (ct, øre). Useful for calculations." + } + } + }, + "debug_clear_tomorrow": { + "name": "Debug: Clear Tomorrow Data", + "description": "DEBUG/TESTING: Removes tomorrow's price data from the interval pool cache. Use this to test the tomorrow data refresh cycle without waiting for the next day. After calling this service, the lifecycle sensor will show 'searching_tomorrow' (after 13:00) and the next Timer #1 cycle will fetch new data from the API.", + "fields": { + "entry_id": { + "name": "Entry ID", + "description": "Optional config entry ID. If not provided, uses the first available entry." + } + } + } + }, + "selector": { + "account_choice": { + "options": { + "new_token": "Add new Tibber account API token" + } + }, + "day": { + "options": { + "yesterday": "Yesterday", + "today": "Today", + "tomorrow": "Tomorrow", + "rolling_window": "Rolling Window", + "rolling_window_autozoom": "Rolling Window (Auto-Zoom)" + } + }, + "resolution": { + "options": { + "interval": "Interval (15 min)", + "hourly": "Hourly" + } + }, + "output_format": { + "options": { + "array_of_objects": "Array of Objects", + "array_of_arrays": "Array of Arrays" + } + }, + "level_type": { + "options": { + "rating_level": "Rating Level (low/normal/high)", + "level": "Tibber Level (very cheap to very expensive)" + } + }, + "level_filter": { + "options": { + "very_cheap": "Very cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very expensive" + } + }, + "rating_level_filter": { + "options": { + "low": "Low", + "normal": "Normal", + "high": "High" + } + }, + "insert_nulls": { + "options": { + "none": "None", + "segments": "Segments", + "all": "All" + } + }, + "period_filter": { + "options": { + "best_price": "Best Price Periods", + "peak_price": "Peak Price Periods" + } + }, + "metadata": { + "options": { + "include": "Include (data + metadata)", + "only": "Only metadata", + "none": "None (data only)" + } + }, + "volatility": { + "options": { + "low": "Low", + "moderate": "Moderate", + "high": "High", + "very_high": "Very high" + } + }, + "current_interval_price_level": { + "options": { + "any": "Any", + "very_cheap": "Very cheap", + "cheap": "Cheap", + "normal": "Normal", + "expensive": "Expensive", + "very_expensive": "Very expensive" + } + }, + "currency_display_mode": { + "options": { + "base": "Base Currency (€, kr)", + "subunit": "Subunit Currency (ct, øre)" + } + }, + "average_sensor_display": { + "options": { + "median": "Median", + "mean": "Arithmetic Mean" + } + }, + "search_scope": { + "options": { + "today": "Today", + "tomorrow": "Tomorrow", + "remaining_today": "Remaining Today", + "next_24h": "Next 24 Hours", + "next_48h": "Next 48 Hours" + } + } + }, + "title": "Tibber Price Information & Ratings" } diff --git a/custom_components/tibber_prices/translations/nb.json b/custom_components/tibber_prices/translations/nb.json index 03bace6..1dc0aed 100644 --- a/custom_components/tibber_prices/translations/nb.json +++ b/custom_components/tibber_prices/translations/nb.json @@ -1,1931 +1,1955 @@ { - "config": { - "step": { - "account_choice": { - "title": "Velg konto", - "description": "Du kan legge til et nytt hjem fra en eksisterende Tibber-konto eller skrive inn et nytt API-token for en annen konto.", - "data": { - "account_choice": "Konto" - }, - "submit": "Fortsett →" - }, - "new_token": { - "title": "Skriv inn API-token", - "description": "Sett opp Tibber Prisinformasjon & Vurderinger.\n\nFor å generere et API-tilgangstoken, besøk [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-tilgangstoken" - }, - "submit": "Valider token" - }, - "user": { - "description": "Sett opp Tibber Prisinformasjon & Vurderinger.\n\nFor å generere et API-tilgangstoken, besøk [{tibber_url}]({tibber_url}).", - "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 [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-tilgangstoken" - }, - "submit": "Oppdater token" - } + "config": { + "step": { + "account_choice": { + "title": "Velg konto", + "description": "Du kan legge til et nytt hjem fra en eksisterende Tibber-konto eller skrive inn et nytt API-token for en annen konto.", + "data": { + "account_choice": "Konto" }, - "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.", - "home_already_configured": "Dette hjemmet er allerede konfigurert i en annen oppføring. Hvert hjem kan kun konfigureres én gang.", - "no_active_subscription": "Dette hjemmet har ikke en aktiv Tibber-kontrakt. Bare hjem med aktive strømkontrakter kan legges til Home Assistant.", - "subscription_expired": "Tibber-kontrakten for dette hjemmet har utløpt. Bare hjem med aktive eller fremtidige strømkontrakter kan legges til Home Assistant.", - "future_subscription_warning": "Merk: Tibber-kontrakten for dette hjemmet har ikke startet ennå. Funksjonaliteten kan være begrenset til kontrakten blir aktiv." + "submit": "Fortsett →" + }, + "new_token": { + "title": "Skriv inn API-token", + "description": "Sett opp Tibber Prisinformasjon & Vurderinger.\n\nFor å generere et API-tilgangstoken, besøk [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-tilgangstoken" }, - "abort": { - "already_configured": "Alle tilgjengelige Tibber-hjem er allerede konfigurert. Hvert hjem kan kun konfigureres én gang.", - "entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet.", - "setup_complete": "Oppsett fullført! Du kan endre ytterligere alternativer for Tibber Prices i integrasjonens alternativer etter å ha lukket denne dialogen.", - "reauth_successful": "Ny autentisering vellykket. Integrasjonen har blitt oppdatert med det nye tilgangstokenet." + "submit": "Valider token" + }, + "user": { + "description": "Sett opp Tibber Prisinformasjon & Vurderinger.\n\nFor å generere et API-tilgangstoken, besøk [{tibber_url}]({tibber_url}).", + "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 [{tibber_url}]({tibber_url}).", + "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.", + "home_already_configured": "Dette hjemmet er allerede konfigurert i en annen oppføring. Hvert hjem kan kun konfigureres én gang.", + "no_active_subscription": "Dette hjemmet har ikke en aktiv Tibber-kontrakt. Bare hjem med aktive strømkontrakter kan legges til Home Assistant.", + "subscription_expired": "Tibber-kontrakten for dette hjemmet har utløpt. Bare hjem med aktive eller fremtidige strømkontrakter kan legges til Home Assistant.", + "future_subscription_warning": "Merk: Tibber-kontrakten for dette hjemmet har ikke startet ennå. Funksjonaliteten kan være begrenset til kontrakten blir aktiv." + }, + "abort": { + "already_configured": "Alle tilgjengelige Tibber-hjem er allerede konfigurert. Hvert hjem kan kun konfigureres én gang.", + "entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet.", + "setup_complete": "Oppsett fullført! Du kan endre ytterligere alternativer for Tibber Prices i integrasjonens alternativer etter å ha lukket denne dialogen.", + "reauth_successful": "Ny autentisering vellykket. Integrasjonen har blitt oppdatert med det nye tilgangstokenet." + } + }, + "common": { + "step_progress": "{step_num} / {total_steps}", + "override_warning_template": "⚠️ {fields} styres av konfigurasjons-entitet", + "override_warning_and": "og", + "override_field_label_best_price_min_period_length": "Minste periodelengde", + "override_field_label_best_price_max_level_gap_count": "Gaptoleranse", + "override_field_label_best_price_flex": "Fleksibilitet", + "override_field_label_best_price_min_distance_from_avg": "Minimumsavstand", + "override_field_label_enable_min_periods_best": "Oppnå minimum antall", + "override_field_label_min_periods_best": "Minimumperioder", + "override_field_label_relaxation_attempts_best": "Avslapningsforsøk", + "override_field_label_peak_price_min_period_length": "Minste periodelengde", + "override_field_label_peak_price_max_level_gap_count": "Gaptoleranse", + "override_field_label_peak_price_flex": "Fleksibilitet", + "override_field_label_peak_price_min_distance_from_avg": "Minimumsavstand", + "override_field_label_enable_min_periods_peak": "Oppnå minimum antall", + "override_field_label_min_periods_peak": "Minimumperioder", + "override_field_label_relaxation_attempts_peak": "Avslapningsforsøk" + }, + "config_subentries": { + "home": { + "entry_type": "Tidsreisevisning", + "initiate_flow": { + "user": "Opprett tidsreisevisning" + }, + "title": "Opprett tidsreisevisning", + "step": { + "user": { + "title": "Velg konfigurasjonsoppføring", + "description": "Velg konfigurasjonsoppføringen du vil opprette en tidsreisevisning for.\n\n**Tidsreisevisninger** lar deg se historiske prisdata som om det var nåværende tid. Dette er nyttig for å teste automatiseringer eller analysere tidligere prismønstre.", + "data": { + "parent_entry_id": "Konfigurasjonsoppføring" + } + }, + "time_offset": { + "title": "Konfigurer tidsforskyvning", + "description": "Konfigurer hvor langt tilbake i tid denne visningen skal reise.\n\n**Anbefalt:** Bruk **≥2 dager** forskyvning for å unngå konflikter med \"yesterday\"-entiteter som også gir historiske data.\n\n**Eksempler:**\n• **-7 dager**: Vis priser fra 7 dager siden\n• **-2 dager, 3 timer**: Vis priser fra 2 dager og 3 timer siden\n• **-14 dager**: Vis priser fra 2 uker siden", + "data": { + "virtual_time_offset_days": "Dager tilbake", + "time_offset": "Ekstra tidsforskyvning" + }, + "data_description": { + "virtual_time_offset_days": "Hvor mange dager å reise tilbake i tid. Glidebryter-område: 0 til 374 dager (≈1 år). Anbefalt: ≥2 dager for å unngå konflikter med \"yesterday\"-entiteter.", + "time_offset": "Valgfri finjustering: Legg til timer og/eller minutter til dagesforskyvningen. Tiden trekkes automatisk fra (reis lenger tilbake). Merk: Sekunder ignoreres - kun minuttbasert presisjon støttes." + } + }, + "init": { + "title": "Konfigurer tidsforskyvning på nytt", + "description": "Oppdater tidsforskyvningen for denne tidsreisevisningen.", + "data": { + "virtual_time_offset_days": "Dager tilbake", + "time_offset": "Ekstra tidsforskyvning" + }, + "data_description": { + "virtual_time_offset_days": "Hvor mange dager å reise tilbake i tid. Glidebryter-område: 0 til 374 dager (≈1 år). Anbefalt: ≥2 dager for å unngå konflikter med \"yesterday\"-entiteter.", + "time_offset": "Valgfri finjustering: Legg til timer og/eller minutter til dagesforskyvningen. Tiden trekkes automatisk fra (reis lenger tilbake). Merk: Sekunder ignoreres - kun minuttbasert presisjon støttes." + } } - }, - "common": { - "step_progress": "{step_num} / {total_steps}", - "override_warning_template": "⚠️ {fields} styres av konfigurasjons-entitet", - "override_warning_and": "og", - "override_field_label_best_price_min_period_length": "Minste periodelengde", - "override_field_label_best_price_max_level_gap_count": "Gaptoleranse", - "override_field_label_best_price_flex": "Fleksibilitet", - "override_field_label_best_price_min_distance_from_avg": "Minimumsavstand", - "override_field_label_enable_min_periods_best": "Oppnå minimum antall", - "override_field_label_min_periods_best": "Minimumperioder", - "override_field_label_relaxation_attempts_best": "Avslapningsforsøk", - "override_field_label_peak_price_min_period_length": "Minste periodelengde", - "override_field_label_peak_price_max_level_gap_count": "Gaptoleranse", - "override_field_label_peak_price_flex": "Fleksibilitet", - "override_field_label_peak_price_min_distance_from_avg": "Minimumsavstand", - "override_field_label_enable_min_periods_peak": "Oppnå minimum antall", - "override_field_label_min_periods_peak": "Minimumperioder", - "override_field_label_relaxation_attempts_peak": "Avslapningsforsøk" - }, - "config_subentries": { - "home": { - "entry_type": "Tidsreisevisning", - "initiate_flow": { - "user": "Opprett tidsreisevisning" - }, - "title": "Opprett tidsreisevisning", - "step": { - "user": { - "title": "Velg konfigurasjonsoppføring", - "description": "Velg konfigurasjonsoppføringen du vil opprette en tidsreisevisning for.\n\n**Tidsreisevisninger** lar deg se historiske prisdata som om det var nåværende tid. Dette er nyttig for å teste automatiseringer eller analysere tidligere prismønstre.", - "data": { - "parent_entry_id": "Konfigurasjonsoppføring" - } - }, - "time_offset": { - "title": "Konfigurer tidsforskyvning", - "description": "Konfigurer hvor langt tilbake i tid denne visningen skal reise.\n\n**Anbefalt:** Bruk **≥2 dager** forskyvning for å unngå konflikter med \"yesterday\"-entiteter som også gir historiske data.\n\n**Eksempler:**\n• **-7 dager**: Vis priser fra 7 dager siden\n• **-2 dager, 3 timer**: Vis priser fra 2 dager og 3 timer siden\n• **-14 dager**: Vis priser fra 2 uker siden", - "data": { - "virtual_time_offset_days": "Dager tilbake", - "time_offset": "Ekstra tidsforskyvning" - }, - "data_description": { - "virtual_time_offset_days": "Hvor mange dager å reise tilbake i tid. Glidebryter-område: 0 til 374 dager (≈1 år). Anbefalt: ≥2 dager for å unngå konflikter med \"yesterday\"-entiteter.", - "time_offset": "Valgfri finjustering: Legg til timer og/eller minutter til dagesforskyvningen. Tiden trekkes automatisk fra (reis lenger tilbake). Merk: Sekunder ignoreres - kun minuttbasert presisjon støttes." - } - }, - "init": { - "title": "Konfigurer tidsforskyvning på nytt", - "description": "Oppdater tidsforskyvningen for denne tidsreisevisningen.", - "data": { - "virtual_time_offset_days": "Dager tilbake", - "time_offset": "Ekstra tidsforskyvning" - }, - "data_description": { - "virtual_time_offset_days": "Hvor mange dager å reise tilbake i tid. Glidebryter-område: 0 til 374 dager (≈1 år). Anbefalt: ≥2 dager for å unngå konflikter med \"yesterday\"-entiteter.", - "time_offset": "Valgfri finjustering: Legg til timer og/eller minutter til dagesforskyvningen. Tiden trekkes automatisk fra (reis lenger tilbake). Merk: Sekunder ignoreres - kun minuttbasert presisjon støttes." - } - } - }, - "error": { - "no_time_offset": "Minst én tidsforskyvningsverdi må være negativ (kun historiske data)." - }, - "abort": { - "already_configured": "**En tidsreisevisning med denne eksakte tidsforskyvningen eksisterer allerede.**\n\nVelg en annen forskyvning.", - "no_main_entries": "Ingen hovedkonfigurasjonsoppføringer funnet. Legg til et Tibber-hjem først.", - "parent_entry_not_found": "Valgt konfigurasjonsoppføring ikke funnet." - } + }, + "error": { + "no_time_offset": "Minst én tidsforskyvningsverdi må være negativ (kun historiske data)." + }, + "abort": { + "already_configured": "**En tidsreisevisning med denne eksakte tidsforskyvningen eksisterer allerede.**\n\nVelg en annen forskyvning.", + "no_main_entries": "Ingen hovedkonfigurasjonsoppføringer funnet. Legg til et Tibber-hjem først.", + "parent_entry_not_found": "Valgt konfigurasjonsoppføring ikke funnet." + } + } + }, + "options": { + "step": { + "init": { + "menu_options": { + "general_settings": "⚙️ Generelle innstillinger", + "display_settings": "💱 Valutavisning", + "current_interval_price_rating": "📊 Prisvurdering", + "price_level": "🏷️ Prisnivå", + "volatility": "💨 Prisvolatilitet", + "best_price": "💚 Beste prisperiode", + "peak_price": "🔴 Toppprisperiode", + "price_trend": "📈 Pristrend", + "chart_data_export": "📊 Diagramdata-eksportsensor", + "reset_to_defaults": "🔄 Tilbakestill til standard", + "finish": "⬅️ Tilbake" } - }, - "options": { - "step": { - "init": { - "menu_options": { - "general_settings": "⚙️ Generelle innstillinger", - "display_settings": "💱 Valutavisning", - "current_interval_price_rating": "📊 Prisvurdering", - "price_level": "🏷️ Prisnivå", - "volatility": "💨 Prisvolatilitet", - "best_price": "💚 Beste prisperiode", - "peak_price": "🔴 Toppprisperiode", - "price_trend": "📈 Pristrend", - "chart_data_export": "📊 Diagramdata-eksportsensor", - "reset_to_defaults": "🔄 Tilbakestill til standard", - "finish": "⬅️ Tilbake" - } + }, + "general_settings": { + "title": "⚙️ Generelle innstillinger", + "description": "**Konfigurer generelle innstillinger for Tibber prisinformasjon og vurderinger.**\n\n---\n\n**Bruker:** {user_login}", + "data": { + "extended_descriptions": "Utvidede beskrivelser", + "average_sensor_display": "Gjennomsnittssensor-visning" + }, + "data_description": { + "extended_descriptions": "Styrer om entitetsattributter inkluderer detaljerte forklaringer og brukstips.\n\n• Deaktivert (standard): Bare kort beskrivelse\n• Aktivert: Detaljert forklaring + praktiske brukseksempler\n\nEksempel:\nDeaktivert = 1 attributt\nAktivert = 2 ekstra attributter", + "average_sensor_display": "Velg hvilket statistisk mål som skal vises i sensortilstanden for gjennomsnittspris-sensorer. Den andre verdien vises som attributt.\n\n• **Median (standard)**: Viser den 'typiske' prisen, motstandsdyktig mot ekstreme topper - best for visning og menneskelig tolkning\n• **Aritmetisk gjennomsnitt**: Viser det sanne matematiske gjennomsnittet inkludert alle priser - best når du trenger eksakte kostnadsberegninger\n\nFor automatiseringer, bruk attributtet `price_mean` eller `price_median` for å få tilgang til begge verdier uavhengig av denne innstillingen." + }, + "submit": "↩ Lagre & tilbake" + }, + "display_settings": { + "title": "💱 Valutavisningsinnstillinger", + "description": "_{step_progress}_\n\n**Konfigurer hvordan strømpriser vises - i basisvaluta (€, kr) eller underenhet (ct, øre).**\n\n---", + "data": { + "currency_display_mode": "Visningsmodus" + }, + "data_description": { + "currency_display_mode": "Velg hvordan priser vises:\n\n• **Basisvaluta** (€/kWh, kr/kWh): Desimalverdier (f.eks. 0,25 €/kWh) - forskjeller synlige fra 3.-4. desimalplass\n• **Underenhet** (ct/kWh, øre/kWh): Større verdier (f.eks. 25,00 ct/kWh) - forskjeller allerede synlige fra 1. desimalplass\n\nStandard avhenger av valutaen din:\n• EUR → Underenhet (cent) - tysk/nederlandsk preferanse\n• NOK/SEK/DKK → Basisvaluta (kroner) - skandinavisk preferanse\n• USD/GBP → Basisvaluta\n\n**💡 Tips:** Ved valg av underenhet kan du aktivere den ekstra sensoren \"Nåværende strømpris (Energi-dashboard)\" (deaktivert som standard)." + }, + "submit": "↩ Lagre & tilbake" + }, + "current_interval_price_rating": { + "title": "📊 Prisvurderingsinnstillinger", + "description": "**Konfigurer terskler og stabilisering for prisvurderingsnivåer (lav/normal/høy) basert på sammenligning med etterfølgende 24-timers gjennomsnitt.**{entity_warning}", + "data": { + "price_rating_threshold_low": "Lav-terskel", + "price_rating_threshold_high": "Høy-terskel", + "price_rating_hysteresis": "Hysterese", + "price_rating_gap_tolerance": "Gap-toleranse" + }, + "data_description": { + "price_rating_threshold_low": "Prosentverdi for hvor mye gjeldende pris må være under det etterfølgende 24-timers gjennomsnittet for å kvalifisere som 'lav' vurdering. Eksempel: -10 betyr minst 10% under gjennomsnitt. Sensorer med denne vurderingen indikerer gunstige tidsvinduer. Standard: -10%", + "price_rating_threshold_high": "Prosentverdi for hvor mye gjeldende pris må være over det etterfølgende 24-timers gjennomsnittet for å kvalifisere som 'høy' vurdering. Eksempel: 10 betyr minst 10% over gjennomsnitt. Sensorer med denne vurderingen advarer om dyre tidsvinduer. Standard: 10%", + "price_rating_hysteresis": "Prosentbånd rundt terskler for å unngå raske tilstandsendringer. Når vurderingen allerede er LAV, må prisen stige over (terskel + hysterese) for å bytte til NORMAL. Tilsvarende krever HØY at prisen faller under (terskel - hysterese) for å forlate tilstanden. Dette gir stabilitet for automatiseringer som reagerer på vurderingsendringer. Sett til 0 for å deaktivere. Standard: 2%", + "price_rating_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende vurderinger. Små isolerte vurderingsendringer slås sammen med den dominerende nabogruppen. Dette gir stabilitet for automatiseringer ved å forhindre at korte vurderingstopper utløser unødvendige handlinger. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'høy'-intervaller korrigeres til 'høy'. Sett til 0 for å deaktivere. Standard: 1" + }, + "submit": "↩ Lagre & tilbake" + }, + "best_price": { + "title": "💚 Beste Prisperiode Innstillinger", + "description": "**Konfigurer innstillinger for Beste Prisperiode binærsensor. Denne sensoren er aktiv i perioder med de laveste strømprisene.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periodeinnstillinger", + "description": "Konfigurer periodelengde og prisnivåbegrensninger.", + "data": { + "best_price_min_period_length": "Minimum periodelengde", + "best_price_max_level": "Prisnivåfilter", + "best_price_max_level_gap_count": "Gaptoleranse" }, - "general_settings": { - "title": "⚙️ Generelle innstillinger", - "description": "**Konfigurer generelle innstillinger for Tibber prisinformasjon og vurderinger.**\n\n---\n\n**Bruker:** {user_login}", - "data": { - "extended_descriptions": "Utvidede beskrivelser", - "average_sensor_display": "Gjennomsnittssensor-visning" - }, - "data_description": { - "extended_descriptions": "Styrer om entitetsattributter inkluderer detaljerte forklaringer og brukstips.\n\n• Deaktivert (standard): Bare kort beskrivelse\n• Aktivert: Detaljert forklaring + praktiske brukseksempler\n\nEksempel:\nDeaktivert = 1 attributt\nAktivert = 2 ekstra attributter", - "average_sensor_display": "Velg hvilket statistisk mål som skal vises i sensortilstanden for gjennomsnittspris-sensorer. Den andre verdien vises som attributt.\n\n• **Median (standard)**: Viser den 'typiske' prisen, motstandsdyktig mot ekstreme topper - best for visning og menneskelig tolkning\n• **Aritmetisk gjennomsnitt**: Viser det sanne matematiske gjennomsnittet inkludert alle priser - best når du trenger eksakte kostnadsberegninger\n\nFor automatiseringer, bruk attributtet `price_mean` eller `price_median` for å få tilgang til begge verdier uavhengig av denne innstillingen." - }, - "submit": "↩ Lagre & tilbake" - }, - "display_settings": { - "title": "💱 Valutavisningsinnstillinger", - "description": "_{step_progress}_\n\n**Konfigurer hvordan strømpriser vises - i basisvaluta (€, kr) eller underenhet (ct, øre).**\n\n---", - "data": { - "currency_display_mode": "Visningsmodus" - }, - "data_description": { - "currency_display_mode": "Velg hvordan priser vises:\n\n• **Basisvaluta** (€/kWh, kr/kWh): Desimalverdier (f.eks. 0,25 €/kWh) - forskjeller synlige fra 3.-4. desimalplass\n• **Underenhet** (ct/kWh, øre/kWh): Større verdier (f.eks. 25,00 ct/kWh) - forskjeller allerede synlige fra 1. desimalplass\n\nStandard avhenger av valutaen din:\n• EUR → Underenhet (cent) - tysk/nederlandsk preferanse\n• NOK/SEK/DKK → Basisvaluta (kroner) - skandinavisk preferanse\n• USD/GBP → Basisvaluta\n\n**💡 Tips:** Ved valg av underenhet kan du aktivere den ekstra sensoren \"Nåværende strømpris (Energi-dashboard)\" (deaktivert som standard)." - }, - "submit": "↩ Lagre & tilbake" - }, - "current_interval_price_rating": { - "title": "📊 Prisvurderingsinnstillinger", - "description": "**Konfigurer terskler og stabilisering for prisvurderingsnivåer (lav/normal/høy) basert på sammenligning med etterfølgende 24-timers gjennomsnitt.**{entity_warning}", - "data": { - "price_rating_threshold_low": "Lav-terskel", - "price_rating_threshold_high": "Høy-terskel", - "price_rating_hysteresis": "Hysterese", - "price_rating_gap_tolerance": "Gap-toleranse" - }, - "data_description": { - "price_rating_threshold_low": "Prosentverdi for hvor mye gjeldende pris må være under det etterfølgende 24-timers gjennomsnittet for å kvalifisere som 'lav' vurdering. Eksempel: -10 betyr minst 10% under gjennomsnitt. Sensorer med denne vurderingen indikerer gunstige tidsvinduer. Standard: -10%", - "price_rating_threshold_high": "Prosentverdi for hvor mye gjeldende pris må være over det etterfølgende 24-timers gjennomsnittet for å kvalifisere som 'høy' vurdering. Eksempel: 10 betyr minst 10% over gjennomsnitt. Sensorer med denne vurderingen advarer om dyre tidsvinduer. Standard: 10%", - "price_rating_hysteresis": "Prosentbånd rundt terskler for å unngå raske tilstandsendringer. Når vurderingen allerede er LAV, må prisen stige over (terskel + hysterese) for å bytte til NORMAL. Tilsvarende krever HØY at prisen faller under (terskel - hysterese) for å forlate tilstanden. Dette gir stabilitet for automatiseringer som reagerer på vurderingsendringer. Sett til 0 for å deaktivere. Standard: 2%", - "price_rating_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende vurderinger. Små isolerte vurderingsendringer slås sammen med den dominerende nabogruppen. Dette gir stabilitet for automatiseringer ved å forhindre at korte vurderingstopper utløser unødvendige handlinger. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'høy'-intervaller korrigeres til 'høy'. Sett til 0 for å deaktivere. Standard: 1" - }, - "submit": "↩ Lagre & tilbake" - }, - "best_price": { - "title": "💚 Beste Prisperiode Innstillinger", - "description": "**Konfigurer innstillinger for Beste Prisperiode binærsensor. Denne sensoren er aktiv i perioder med de laveste strømprisene.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periodeinnstillinger", - "description": "Konfigurer periodelengde og prisnivåbegrensninger.", - "data": { - "best_price_min_period_length": "Minimum periodelengde", - "best_price_max_level": "Prisnivåfilter", - "best_price_max_level_gap_count": "Gaptoleranse" - }, - "data_description": { - "best_price_min_period_length": "Minimum varighet for at en periode skal regnes som 'beste pris'. Lengre perioder er mer praktiske for å kjøre apparater som oppvaskmaskiner eller varmepumper. Beste pris-perioder krever minimum 60 minutter (sammenlignet med 30 minutter for topppris-advarsler) fordi de skal gi meningsfulle tidsvinduer for forbruksplanlegging, ikke bare kortvarige muligheter.", - "best_price_max_level": "Vis kun beste pris-perioder hvis de inneholder intervaller med prisnivåer ≤ valgt verdi. For eksempel: å velge '**Billig**' betyr at perioden må ha minst étt '**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å.", - "best_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig étt nivåtrinn fra det nødvendige nivået. For eksempel: med '**Billig**' filter og gapantall 1, aksepteres sekvensen '**Billig**, **Billig**, **Normal**, **Billig**' (**Normal** er étt trinn over **Billig**). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. **Merk:** Gaptoleranse krever perioder ≥90 minutter (6 intervaller) for å oppdage avvik effektivt. Standard: 0 (streng filtrering, ingen toleranse)." - } - }, - "flexibility_settings": { - "name": "Fleksibilitetsinnstillinger", - "description": "Konfigurer prissammenligningsgrenser og filtrering.", - "data": { - "best_price_flex": "Fleksibilitet", - "best_price_min_distance_from_avg": "Minimumsavstand" - }, - "data_description": { - "best_price_flex": "Maksimalt over den daglige minimumsprisen der intervaller fortsatt kvalifiserer som 'beste pris'. Anbefalt: 15-20 med lemping aktivert (standard), eller 25-35 uten lemping. Maksimum: 50 (hard grense for pålitelig periodegjenkjenning).", - "best_price_min_distance_from_avg": "Sikrer at perioder er betydelig billigere enn daglig gjennomsnitt, ikke bare marginalt under det. Dette filtrerer støy og forhindrer at litt-under-gjennomsnittet perioder markeres som 'beste pris' på dager med flate priser. Høyere verdier = strengere filtrering (bare virkelig billige perioder kvalifiserer). Standard: 5 betyr at perioder må være minst 5% under daglig gjennomsnitt." - } - }, - "relaxation_and_target_periods": { - "name": "Lemping & Målperioder", - "description": "Konfigurer automatisk filterlemping og målperiodeantall. Aktiver 'Oppnå minimumsantall' for å aktivere lemping.", - "data": { - "enable_min_periods_best": "Oppnå minimumsantall", - "min_periods_best": "Minimumsperioder", - "relaxation_attempts_best": "Lempingsforsøk" - }, - "data_description": { - "enable_min_periods_best": "Når aktivert vil filtre gradvis bli lempet hvis ikke nok perioder blir funnet. Dette forsøker å nå det ønskede minimumsantall perioder, som kan inkludere mindre optimale tidsvinduer som beste pris-perioder.", - "min_periods_best": "Minimumsantall beste pris-perioder å sikte på per dag. Filtre vil bli lempet steg for steg for å forsøke å oppnå dette antallet. Kun aktiv når 'Oppnå minimumsantall' er aktivert. Standard: 1", - "relaxation_attempts_best": "Hvor mange fleksnivåer (forsøk) å prøve før man gir opp. Hvert forsøk kjører alle filterkombinasjoner på det nye fleksnivået. Flere forsøk øker sjansen for å finne flere perioder på bekostning av lengre behandlingstid." - } - } - }, - "submit": "↩ Lagre & tilbake" - }, - "peak_price": { - "title": "🔴 Toppprisperiode Innstillinger", - "description": "**Konfigurer innstillinger for Toppprisperiode binærsensor. Denne sensoren er aktiv i perioder med de høyeste strømprisene.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periodeinnstillinger", - "description": "Konfigurer periodelengde og prisnivåbegrensninger.", - "data": { - "peak_price_min_period_length": "Minimum periodelengde", - "peak_price_min_level": "Prisnivåfilter", - "peak_price_max_level_gap_count": "Gaptoleranse" - }, - "data_description": { - "peak_price_min_period_length": "Minimum varighet for at en periode skal regnes som 'topppris'. Topppris-advarsler er tillatt for kortere perioder (minimum 30 minutter sammenlignet med 60 minutter for beste pris) fordi korte dyre topper er verdt å advare om, selv om de er for korte for forbruksplanlegging.", - "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 étt '**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å.", - "peak_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig étt nivåtrinn fra det nødvendige nivået. For eksempel: med '**Dyr**' filter og gapantall 1, aksepteres sekvensen '**Dyr**, **Dyr**, **Normal**, **Dyr**' (**Normal** er étt trinn under **Dyr**). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. **Merk:** Gaptoleranse krever perioder ≥90 minutter (6 intervaller) for å oppdage avvik effektivt. Standard: 0 (streng filtrering, ingen toleranse)." - } - }, - "flexibility_settings": { - "name": "Fleksibilitetsinnstillinger", - "description": "Konfigurer prissammenligningskriterier og filtrering.", - "data": { - "peak_price_flex": "Fleksibilitet", - "peak_price_min_distance_from_avg": "Minimumsavstand" - }, - "data_description": { - "peak_price_flex": "Maksimalt under den daglige maksimumsprisen der intervaller fortsatt kvalifiserer som 'topppris'. Anbefaling: -15 til -20 med lemping aktivert (standard), eller -25 til -35 uten lemping. Maksimum: -50 (hard grense for pålitelig periodegjenkjenning). Merk: Negative verdier angir avstand under maksimum.", - "peak_price_min_distance_from_avg": "Sikrer at perioder er betydelig dyrere enn daglig gjennomsnitt, ikke bare marginalt over det. Dette filtrerer støy og forhindrer at litt-over-gjennomsnittet perioder markeres som 'topppris' på dager med flate priser. Høyere verdier = strengere filtrering (bare virkelig dyre perioder kvalifiserer). Standard: 5 betyr at perioder må være minst 5% over daglig gjennomsnitt." - } - }, - "relaxation_and_target_periods": { - "name": "Lemping & målperioder", - "description": "Konfigurer automatisk filterlempelse og målperioder. Aktiver 'Prøv å oppnå minimum antall perioder' for å aktivere lemping.", - "data": { - "enable_min_periods_peak": "Prøv å oppnå minimum antall perioder", - "min_periods_peak": "Minimum antall perioder", - "relaxation_attempts_peak": "Antall lempingsforsøk" - }, - "data_description": { - "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_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." - } - } - }, - "submit": "↩ Lagre & tilbake" - }, - "price_trend": { - "title": "📈 Pristrendterskler", - "description": "**Konfigurer terskler for pristrendsensorer. Disse sensorene sammenligner nåværende pris med gjennomsnittet av de neste N timene for å bestemme om prisene stiger sterkt, stiger, er stabile, faller eller faller sterkt.**{entity_warning}", - "data": { - "price_trend_threshold_rising": "Stigende terskel", - "price_trend_threshold_strongly_rising": "Sterkt stigende terskel", - "price_trend_threshold_falling": "Fallende terskel", - "price_trend_threshold_strongly_falling": "Sterkt fallende terskel", - "price_trend_change_confirmation": "Trendendringsbekreftelse", - "price_trend_min_price_change": "Min. prisendring (trend)", - "price_trend_min_price_change_strongly": "Min. prisendring (sterk trend)" - }, - "data_description": { - "price_trend_threshold_rising": "Prosentverdi som gjennomsnittet av de neste N timene må være over den nåværende prisen for å kvalifisere som 'stigende' trend. Eksempel: 3 betyr gjennomsnittet er minst 3% høyere → prisene vil stige. Typiske verdier: 3-10%. Standard: 3%", - "price_trend_threshold_strongly_rising": "Prosentverdi som gjennomsnittet av de neste N timene må være over den nåværende prisen for å kvalifisere som 'sterkt stigende' trend. Må være høyere enn stigende terskel. Typiske verdier: 6-20%. Standard: 9%", - "price_trend_threshold_falling": "Prosentverdi (negativ) som gjennomsnittet av de neste N timene må være under den nåværende prisen for å kvalifisere som 'synkende' trend. Eksempel: -3 betyr gjennomsnittet er minst 3% lavere → prisene vil falle. Typiske verdier: -3 til -10%. Standard: -3%", - "price_trend_threshold_strongly_falling": "Prosentverdi (negativ) som gjennomsnittet av de neste N timene må være under den nåværende prisen for å kvalifisere som 'sterkt synkende' trend. Må være lavere (mer negativ) enn fallende terskel. Typiske verdier: -6 til -20%. Standard: -9%", - "price_trend_change_confirmation": "Antall påfølgende 15-minutters intervaller som må bekrefte en ny trendretning før en trendendring rapporteres. Høyere verdier betyr mer stabilitet og færre falske endringer, lavere verdier betyr raskere oppdagelse. Område: 2 (30 min) til 6 (90 min). Standard: 3 (45 min)", - "price_trend_min_price_change": "Minste absolutte prisdifferanse (i ct/øre) som kreves for en 'stigende' eller 'synkende' trend. Forhindrer at minimale prisendringer utløser trender ved lave prisnivåer. Sett til 0 for å deaktivere (ren prosentmodus). Standard: 0,5", - "price_trend_min_price_change_strongly": "Minste absolutte prisdifferanse (i ct/øre) som kreves for en 'sterkt stigende' eller 'sterkt synkende' trend. Bør være høyere enn det vanlige trendminimum. Sett til 0 for å deaktivere. Standard: 1,5" - }, - "submit": "↩ Lagre & tilbake" - }, - "volatility": { - "title": "💨 Volatilitets-terskler", - "description": "**Konfigurer terskler for volatilitetsklassifisering.** Volatilitet måler relativ prisvariation ved hjelp av variasjonskoeffisienten (VK = standardavvik / gjennomsnitt × 100%). Disse tersklene er prosentverdier som fungerer på tvers av alle prisnivåer.\n\nBrukes av:\n• Volatilitetssensorer (klassifisering)\n• Trendsensorer (adaptiv terskel justering: <moderat = mer følsom, ≥høy = mindre følsom){entity_warning}", - "data": { - "volatility_threshold_moderate": "Moderat terskel", - "volatility_threshold_high": "Høy terskel", - "volatility_threshold_very_high": "Veldig høy terskel" - }, - "data_description": { - "volatility_threshold_moderate": "Variasjonskoeffisient (VK) der prisene anses som 'moderat volatile'. VK = (standardavvik / gjennomsnitt) × 100%. Eksempel: 15 betyr prissvingninger på ±15% rundt gjennomsnittet. Sensorer viser denne klassifiseringen, trendsensorer blir mer følsomme. Standard: 15%", - "volatility_threshold_high": "Variasjonskoeffisient (VK) der prisene anses som 'svært volatile'. Eksempel: 30 betyr prissvingninger på ±30% rundt gjennomsnittet. Større prishopp forventes, trendsensorer blir mindre følsomme. Standard: 30%", - "volatility_threshold_very_high": "Variasjonskoeffisient (VK) der prisene anses som 'veldig svært volatile'. Eksempel: 50 betyr ekstreme prissvingninger på ±50% rundt gjennomsnittet. På slike dager er sterke pristoppsannsynlige. Standard: 50%" - }, - "submit": "↩ Lagre & tilbake" - }, - "chart_data_export": { - "title": "📊 Diagram-dataeksport Sensor", - "description": "Diagram-dataeksport-sensoren gir prisdata som sensorattributter.\n\n⚠️ **Merk:** Denne sensoren er en legacy-funksjon for kompatibilitet med eldre verktøy.\n\n**Anbefalt for nye oppsett:** Bruk `tibber_prices.get_chartdata` **tjenesten direkte** - den er mer fleksibel, effektiv og den moderne Home Assistant-tilnærmingen.\n\n**Når denne sensoren gir mening:**\n\n✅ Dashboardverktøyet ditt kan **kun** lese attributter (ingen tjenestekall)\n✅ Du trenger statiske data som oppdateres automatisk\n❌ **Ikke for automatiseringer:** Bruk `tibber_prices.get_chartdata` direkte der - mer fleksibel og effektiv!\n\n---\n\n{sensor_status_info}", - "submit": "↩ Ok & tilbake" - }, - "reset_to_defaults": { - "title": "🔄 Tilbakestill til standard", - "description": "⚠️ **Advarsel:** Dette vil tilbakestille **ALLE** innstillinger til fabrikkstandard.\n\n**Hva vil bli tilbakestilt:**\n• Alle prisvurderingsterskler\n• Alle volatilitetsterskler\n• Alle pristrendterskler\n• Alle innstillinger for beste prisperiode\n• Alle innstillinger for toppprisperiode\n• Visningsinnstillinger\n• Generelle innstillinger\n\n**Hva vil IKKE bli tilbakestilt:**\n• Ditt Tibber API-token\n• Valgt hjem\n• Valuta\n\n**💡 Tips:** Dette er nyttig hvis du vil starte på nytt etter å ha eksperimentert med innstillinger.", - "data": { - "confirm_reset": "Ja, tilbakestill alt til standard" - }, - "submit": "Tilbakestill nå" - }, - "price_level": { - "title": "🏷️ Prisnivå-innstillinger", - "description": "**Konfigurer stabilisering for Tibbers prisnivå-klassifisering (veldig billig/billig/normal/dyr/veldig dyr).**\n\nTibbers API gir et prisnivå-felt for hvert intervall. Denne innstillingen jevner ut korte svingninger for å forhindre ustabilitet i automatiseringer.{entity_warning}", - "data": { - "price_level_gap_tolerance": "Gap-toleranse" - }, - "data_description": { - "price_level_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende prisnivåer. Små isolerte nivåendringer slås sammen med den dominerende nabogruppen. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'billig'-intervaller korrigeres til 'billig'. Sett til 0 for å deaktivere. Standard: 1" - }, - "submit": "↩ Lagre & tilbake" + "data_description": { + "best_price_min_period_length": "Minimum varighet for at en periode skal regnes som 'beste pris'. Lengre perioder er mer praktiske for å kjøre apparater som oppvaskmaskiner eller varmepumper. Beste pris-perioder krever minimum 60 minutter (sammenlignet med 30 minutter for topppris-advarsler) fordi de skal gi meningsfulle tidsvinduer for forbruksplanlegging, ikke bare kortvarige muligheter.", + "best_price_max_level": "Vis kun beste pris-perioder hvis de inneholder intervaller med prisnivåer ≤ valgt verdi. For eksempel: å velge '**Billig**' betyr at perioden må ha minst étt '**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å.", + "best_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig étt nivåtrinn fra det nødvendige nivået. For eksempel: med '**Billig**' filter og gapantall 1, aksepteres sekvensen '**Billig**, **Billig**, **Normal**, **Billig**' (**Normal** er étt trinn over **Billig**). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. **Merk:** Gaptoleranse krever perioder ≥90 minutter (6 intervaller) for å oppdage avvik effektivt. Standard: 0 (streng filtrering, ingen toleranse)." } + }, + "flexibility_settings": { + "name": "Fleksibilitetsinnstillinger", + "description": "Konfigurer prissammenligningsgrenser og filtrering.", + "data": { + "best_price_flex": "Fleksibilitet", + "best_price_min_distance_from_avg": "Minimumsavstand" + }, + "data_description": { + "best_price_flex": "Maksimalt over den daglige minimumsprisen der intervaller fortsatt kvalifiserer som 'beste pris'. Anbefalt: 15-20 med lemping aktivert (standard), eller 25-35 uten lemping. Maksimum: 50 (hard grense for pålitelig periodegjenkjenning).", + "best_price_min_distance_from_avg": "Sikrer at perioder er betydelig billigere enn daglig gjennomsnitt, ikke bare marginalt under det. Dette filtrerer støy og forhindrer at litt-under-gjennomsnittet perioder markeres som 'beste pris' på dager med flate priser. Høyere verdier = strengere filtrering (bare virkelig billige perioder kvalifiserer). Standard: 5 betyr at perioder må være minst 5% under daglig gjennomsnitt." + } + }, + "relaxation_and_target_periods": { + "name": "Lemping & Målperioder", + "description": "Konfigurer automatisk filterlemping og målperiodeantall. Aktiver 'Oppnå minimumsantall' for å aktivere lemping.", + "data": { + "enable_min_periods_best": "Oppnå minimumsantall", + "min_periods_best": "Minimumsperioder", + "relaxation_attempts_best": "Lempingsforsøk" + }, + "data_description": { + "enable_min_periods_best": "Når aktivert vil filtre gradvis bli lempet hvis ikke nok perioder blir funnet. Dette forsøker å nå det ønskede minimumsantall perioder, som kan inkludere mindre optimale tidsvinduer som beste pris-perioder.", + "min_periods_best": "Minimumsantall beste pris-perioder å sikte på per dag. Filtre vil bli lempet steg for steg for å forsøke å oppnå dette antallet. Kun aktiv når 'Oppnå minimumsantall' er aktivert. Standard: 1", + "relaxation_attempts_best": "Hvor mange fleksnivåer (forsøk) å prøve før man gir opp. Hvert forsøk kjører alle filterkombinasjoner på det nye fleksnivået. Flere forsøk øker sjansen for å finne flere perioder på bekostning av lengre behandlingstid." + } + }, + "extension_settings": { + "name": "Utvidelse av perioderender", + "description": "Utvid eventuelt oppdagede bestprisperioder ved begge ender for å inkludere tilstøtende svært billige intervaller.", + "data": { + "best_price_extend_to_very_cheap": "Utvid til svært billige intervaller", + "best_price_max_extension_intervals": "Maksimale utvidelsesintervaller" + }, + "data_description": { + "best_price_extend_to_very_cheap": "Når aktivert, utvider oppdagede bestprisperioder seg utover for å inkludere tilstøtende intervaller med prisnivået 'Svært billig'. Dette fanger opp ekstremt billige intervaller ved kantene av oppdagede perioder.", + "best_price_max_extension_intervals": "Maksimalt antall ekstra intervaller per side (venstre og høyre kant). Hvert intervall er 15 minutter. Eksempel: 4 intervaller = opptil 1 times utvidelse per kant. Standard: 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.", - "invalid_flex": "Fleksibilitetsprosent må være mellom -50% og +50%", - "invalid_best_price_distance": "Avstandsprosent må være mellom -50% og 0% (negativ = under gjennomsnitt)", - "invalid_peak_price_distance": "Avstandsprosent må være mellom 0% og 50% (positiv = over gjennomsnitt)", - "invalid_min_periods": "Minimumsantall perioder må være mellom 1 og 10", - "invalid_period_length": "Periodelengden må være minst 15 minutter (multipler av 15).", - "invalid_gap_count": "Gaptoleranse må være mellom 0 og 8", - "invalid_relaxation_attempts": "Lempingsforsøk må være mellom 1 og 12", - "invalid_price_rating_low": "Lav prisvurderingsgrense må være mellom -50% og -5%", - "invalid_price_rating_high": "Høy prisvurderingsgrense må være mellom 5% og 50%", - "invalid_price_rating_thresholds": "Lav grense må være mindre enn høy grense", - "invalid_volatility_threshold_moderate": "Moderat volatilitetsgrense må være mellom 5% og 25%", - "invalid_volatility_threshold_high": "Høy volatilitetsgrense må være mellom 20% og 40%", - "invalid_volatility_threshold_very_high": "Svært høy volatilitetsgrense må være mellom 35% og 80%", - "invalid_volatility_thresholds": "Grensene må være i stigende rekkefølge: moderat < høy < svært høy", - "invalid_price_trend_rising": "Stigende trendgrense må være mellom 1% og 50%", - "invalid_price_trend_falling": "Fallende trendgrense må være mellom -50% og -1%", - "invalid_price_trend_strongly_rising": "Sterkt stigende trendgrense må være mellom 2% og 100%", - "invalid_price_trend_strongly_falling": "Sterkt fallende trendgrense må være mellom -100% og -2%", - "invalid_trend_strongly_rising_less_than_rising": "Sterkt stigende-grense må være høyere enn stigende-grense", - "invalid_trend_strongly_falling_greater_than_falling": "Sterkt fallende-grense må være lavere (mer negativ) enn fallende-grense" + "submit": "↩ Lagre & tilbake" + }, + "peak_price": { + "title": "🔴 Toppprisperiode Innstillinger", + "description": "**Konfigurer innstillinger for Toppprisperiode binærsensor. Denne sensoren er aktiv i perioder med de høyeste strømprisene.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periodeinnstillinger", + "description": "Konfigurer periodelengde og prisnivåbegrensninger.", + "data": { + "peak_price_min_period_length": "Minimum periodelengde", + "peak_price_min_level": "Prisnivåfilter", + "peak_price_max_level_gap_count": "Gaptoleranse" + }, + "data_description": { + "peak_price_min_period_length": "Minimum varighet for at en periode skal regnes som 'topppris'. Topppris-advarsler er tillatt for kortere perioder (minimum 30 minutter sammenlignet med 60 minutter for beste pris) fordi korte dyre topper er verdt å advare om, selv om de er for korte for forbruksplanlegging.", + "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 étt '**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å.", + "peak_price_max_level_gap_count": "Maksimalt antall påfølgende intervaller som kan avvike med nøyaktig étt nivåtrinn fra det nødvendige nivået. For eksempel: med '**Dyr**' filter og gapantall 1, aksepteres sekvensen '**Dyr**, **Dyr**, **Normal**, **Dyr**' (**Normal** er étt trinn under **Dyr**). Dette forhindrer at perioder blir delt opp av tilfeldige nivåavvik. **Merk:** Gaptoleranse krever perioder ≥90 minutter (6 intervaller) for å oppdage avvik effektivt. Standard: 0 (streng filtrering, ingen toleranse)." + } + }, + "flexibility_settings": { + "name": "Fleksibilitetsinnstillinger", + "description": "Konfigurer prissammenligningskriterier og filtrering.", + "data": { + "peak_price_flex": "Fleksibilitet", + "peak_price_min_distance_from_avg": "Minimumsavstand" + }, + "data_description": { + "peak_price_flex": "Maksimalt under den daglige maksimumsprisen der intervaller fortsatt kvalifiserer som 'topppris'. Anbefaling: -15 til -20 med lemping aktivert (standard), eller -25 til -35 uten lemping. Maksimum: -50 (hard grense for pålitelig periodegjenkjenning). Merk: Negative verdier angir avstand under maksimum.", + "peak_price_min_distance_from_avg": "Sikrer at perioder er betydelig dyrere enn daglig gjennomsnitt, ikke bare marginalt over det. Dette filtrerer støy og forhindrer at litt-over-gjennomsnittet perioder markeres som 'topppris' på dager med flate priser. Høyere verdier = strengere filtrering (bare virkelig dyre perioder kvalifiserer). Standard: 5 betyr at perioder må være minst 5% over daglig gjennomsnitt." + } + }, + "relaxation_and_target_periods": { + "name": "Lemping & målperioder", + "description": "Konfigurer automatisk filterlempelse og målperioder. Aktiver 'Prøv å oppnå minimum antall perioder' for å aktivere lemping.", + "data": { + "enable_min_periods_peak": "Prøv å oppnå minimum antall perioder", + "min_periods_peak": "Minimum antall perioder", + "relaxation_attempts_peak": "Antall lempingsforsøk" + }, + "data_description": { + "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_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." + } + }, + "extension_settings": { + "name": "Utvidelse av perioderender", + "description": "Utvid eventuelt oppdagede topprisperioder ved begge ender for å inkludere tilstøtende svært dyre intervaller.", + "data": { + "peak_price_extend_to_very_expensive": "Utvid til svært dyre intervaller", + "peak_price_max_extension_intervals": "Maksimale utvidelsesintervaller" + }, + "data_description": { + "peak_price_extend_to_very_expensive": "Når aktivert, utvider oppdagede topprisperioder seg utover for å inkludere tilstøtende intervaller med prisnivået 'Svært dyrt'. Dette fanger opp ekstremt dyre intervaller ved kantene av oppdagede perioder.", + "peak_price_max_extension_intervals": "Maksimalt antall ekstra intervaller per side (venstre og høyre kant). Hvert intervall er 15 minutter. Eksempel: 4 intervaller = opptil 1 times utvidelse per kant. Standard: 4" + } + } }, - "abort": { - "entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet.", - "reset_cancelled": "Tilbakestilling avbrutt. Ingen endringer ble gjort i konfigurasjonen din.", - "reset_successful": "✅ Alle innstillinger har blitt tilbakestilt til fabrikkstandard. Konfigurasjonen din er nå som en ny installasjon.", - "finished": "Konfigurasjon fullført." + "submit": "↩ Lagre & tilbake" + }, + "price_trend": { + "title": "📈 Pristrendterskler", + "description": "**Konfigurer terskler for pristrendsensorer. Disse sensorene sammenligner nåværende pris med gjennomsnittet av de neste N timene for å bestemme om prisene stiger sterkt, stiger, er stabile, faller eller faller sterkt.**{entity_warning}", + "data": { + "price_trend_threshold_rising": "Stigende terskel", + "price_trend_threshold_strongly_rising": "Sterkt stigende terskel", + "price_trend_threshold_falling": "Fallende terskel", + "price_trend_threshold_strongly_falling": "Sterkt fallende terskel", + "price_trend_change_confirmation": "Trendendringsbekreftelse", + "price_trend_min_price_change": "Min. prisendring (trend)", + "price_trend_min_price_change_strongly": "Min. prisendring (sterk trend)" + }, + "data_description": { + "price_trend_threshold_rising": "Prosentverdi som gjennomsnittet av de neste N timene må være over den nåværende prisen for å kvalifisere som 'stigende' trend. Eksempel: 3 betyr gjennomsnittet er minst 3% høyere → prisene vil stige. Typiske verdier: 3-10%. Standard: 3%", + "price_trend_threshold_strongly_rising": "Prosentverdi som gjennomsnittet av de neste N timene må være over den nåværende prisen for å kvalifisere som 'sterkt stigende' trend. Må være høyere enn stigende terskel. Typiske verdier: 6-20%. Standard: 9%", + "price_trend_threshold_falling": "Prosentverdi (negativ) som gjennomsnittet av de neste N timene må være under den nåværende prisen for å kvalifisere som 'synkende' trend. Eksempel: -3 betyr gjennomsnittet er minst 3% lavere → prisene vil falle. Typiske verdier: -3 til -10%. Standard: -3%", + "price_trend_threshold_strongly_falling": "Prosentverdi (negativ) som gjennomsnittet av de neste N timene må være under den nåværende prisen for å kvalifisere som 'sterkt synkende' trend. Må være lavere (mer negativ) enn fallende terskel. Typiske verdier: -6 til -20%. Standard: -9%", + "price_trend_change_confirmation": "Antall påfølgende 15-minutters intervaller som må bekrefte en ny trendretning før en trendendring rapporteres. Høyere verdier betyr mer stabilitet og færre falske endringer, lavere verdier betyr raskere oppdagelse. Område: 2 (30 min) til 6 (90 min). Standard: 3 (45 min)", + "price_trend_min_price_change": "Minste absolutte prisdifferanse (i ct/øre) som kreves for en 'stigende' eller 'synkende' trend. Forhindrer at minimale prisendringer utløser trender ved lave prisnivåer. Sett til 0 for å deaktivere (ren prosentmodus). Standard: 0,5", + "price_trend_min_price_change_strongly": "Minste absolutte prisdifferanse (i ct/øre) som kreves for en 'sterkt stigende' eller 'sterkt synkende' trend. Bør være høyere enn det vanlige trendminimum. Sett til 0 for å deaktivere. Standard: 1,5" + }, + "submit": "↩ Lagre & tilbake" + }, + "volatility": { + "title": "💨 Volatilitets-terskler", + "description": "**Konfigurer terskler for volatilitetsklassifisering.** Volatilitet måler relativ prisvariation ved hjelp av variasjonskoeffisienten (VK = standardavvik / gjennomsnitt × 100%). Disse tersklene er prosentverdier som fungerer på tvers av alle prisnivåer.\n\nBrukes av:\n• Volatilitetssensorer (klassifisering)\n• Trendsensorer (adaptiv terskel justering: <moderat = mer følsom, ≥høy = mindre følsom){entity_warning}", + "data": { + "volatility_threshold_moderate": "Moderat terskel", + "volatility_threshold_high": "Høy terskel", + "volatility_threshold_very_high": "Veldig høy terskel" + }, + "data_description": { + "volatility_threshold_moderate": "Variasjonskoeffisient (VK) der prisene anses som 'moderat volatile'. VK = (standardavvik / gjennomsnitt) × 100%. Eksempel: 15 betyr prissvingninger på ±15% rundt gjennomsnittet. Sensorer viser denne klassifiseringen, trendsensorer blir mer følsomme. Standard: 15%", + "volatility_threshold_high": "Variasjonskoeffisient (VK) der prisene anses som 'svært volatile'. Eksempel: 30 betyr prissvingninger på ±30% rundt gjennomsnittet. Større prishopp forventes, trendsensorer blir mindre følsomme. Standard: 30%", + "volatility_threshold_very_high": "Variasjonskoeffisient (VK) der prisene anses som 'veldig svært volatile'. Eksempel: 50 betyr ekstreme prissvingninger på ±50% rundt gjennomsnittet. På slike dager er sterke pristoppsannsynlige. Standard: 50%" + }, + "submit": "↩ Lagre & tilbake" + }, + "chart_data_export": { + "title": "📊 Diagram-dataeksport Sensor", + "description": "Diagram-dataeksport-sensoren gir prisdata som sensorattributter.\n\n⚠️ **Merk:** Denne sensoren er en legacy-funksjon for kompatibilitet med eldre verktøy.\n\n**Anbefalt for nye oppsett:** Bruk `tibber_prices.get_chartdata` **tjenesten direkte** - den er mer fleksibel, effektiv og den moderne Home Assistant-tilnærmingen.\n\n**Når denne sensoren gir mening:**\n\n✅ Dashboardverktøyet ditt kan **kun** lese attributter (ingen tjenestekall)\n✅ Du trenger statiske data som oppdateres automatisk\n❌ **Ikke for automatiseringer:** Bruk `tibber_prices.get_chartdata` direkte der - mer fleksibel og effektiv!\n\n---\n\n{sensor_status_info}", + "submit": "↩ Ok & tilbake" + }, + "reset_to_defaults": { + "title": "🔄 Tilbakestill til standard", + "description": "⚠️ **Advarsel:** Dette vil tilbakestille **ALLE** innstillinger til fabrikkstandard.\n\n**Hva vil bli tilbakestilt:**\n• Alle prisvurderingsterskler\n• Alle volatilitetsterskler\n• Alle pristrendterskler\n• Alle innstillinger for beste prisperiode\n• Alle innstillinger for toppprisperiode\n• Visningsinnstillinger\n• Generelle innstillinger\n\n**Hva vil IKKE bli tilbakestilt:**\n• Ditt Tibber API-token\n• Valgt hjem\n• Valuta\n\n**💡 Tips:** Dette er nyttig hvis du vil starte på nytt etter å ha eksperimentert med innstillinger.", + "data": { + "confirm_reset": "Ja, tilbakestill alt til standard" + }, + "submit": "Tilbakestill nå" + }, + "price_level": { + "title": "🏷️ Prisnivå-innstillinger", + "description": "**Konfigurer stabilisering for Tibbers prisnivå-klassifisering (veldig billig/billig/normal/dyr/veldig dyr).**\n\nTibbers API gir et prisnivå-felt for hvert intervall. Denne innstillingen jevner ut korte svingninger for å forhindre ustabilitet i automatiseringer.{entity_warning}", + "data": { + "price_level_gap_tolerance": "Gap-toleranse" + }, + "data_description": { + "price_level_gap_tolerance": "Maksimalt antall påfølgende intervaller som kan 'jevnes ut' hvis de avviker fra omkringliggende prisnivåer. Små isolerte nivåendringer slås sammen med den dominerende nabogruppen. Eksempel: 1 betyr at et enkelt 'normal'-intervall omgitt av 'billig'-intervaller korrigeres til 'billig'. Sett til 0 for å deaktivere. Standard: 1" + }, + "submit": "↩ Lagre & tilbake" + } + }, + "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.", + "invalid_flex": "Fleksibilitetsprosent må være mellom -50% og +50%", + "invalid_best_price_distance": "Avstandsprosent må være mellom -50% og 0% (negativ = under gjennomsnitt)", + "invalid_peak_price_distance": "Avstandsprosent må være mellom 0% og 50% (positiv = over gjennomsnitt)", + "invalid_min_periods": "Minimumsantall perioder må være mellom 1 og 10", + "invalid_period_length": "Periodelengden må være minst 15 minutter (multipler av 15).", + "invalid_gap_count": "Gaptoleranse må være mellom 0 og 8", + "invalid_relaxation_attempts": "Lempingsforsøk må være mellom 1 og 12", + "invalid_price_rating_low": "Lav prisvurderingsgrense må være mellom -50% og -5%", + "invalid_price_rating_high": "Høy prisvurderingsgrense må være mellom 5% og 50%", + "invalid_price_rating_thresholds": "Lav grense må være mindre enn høy grense", + "invalid_volatility_threshold_moderate": "Moderat volatilitetsgrense må være mellom 5% og 25%", + "invalid_volatility_threshold_high": "Høy volatilitetsgrense må være mellom 20% og 40%", + "invalid_volatility_threshold_very_high": "Svært høy volatilitetsgrense må være mellom 35% og 80%", + "invalid_volatility_thresholds": "Grensene må være i stigende rekkefølge: moderat < høy < svært høy", + "invalid_price_trend_rising": "Stigende trendgrense må være mellom 1% og 50%", + "invalid_price_trend_falling": "Fallende trendgrense må være mellom -50% og -1%", + "invalid_price_trend_strongly_rising": "Sterkt stigende trendgrense må være mellom 2% og 100%", + "invalid_price_trend_strongly_falling": "Sterkt fallende trendgrense må være mellom -100% og -2%", + "invalid_trend_strongly_rising_less_than_rising": "Sterkt stigende-grense må være høyere enn stigende-grense", + "invalid_trend_strongly_falling_greater_than_falling": "Sterkt fallende-grense må være lavere (mer negativ) enn fallende-grense" + }, + "abort": { + "entry_not_found": "Tibber-konfigurasjonsoppføring ikke funnet.", + "reset_cancelled": "Tilbakestilling avbrutt. Ingen endringer ble gjort i konfigurasjonen din.", + "reset_successful": "✅ Alle innstillinger har blitt tilbakestilt til fabrikkstandard. Konfigurasjonen din er nå som en ny installasjon.", + "finished": "Konfigurasjon fullført." + } + }, + "entity": { + "sensor": { + "current_interval_price": { + "name": "Nåværende strømpris" + }, + "current_interval_price_base": { + "name": "Nåværende strømpris (Energi-dashboard)" + }, + "next_interval_price": { + "name": "Neste strømpris" + }, + "previous_interval_price": { + "name": "Forrige strømpris" + }, + "current_hour_average_price": { + "name": "⌀ Timepris nåværende" + }, + "next_hour_average_price": { + "name": "⌀ Timepris neste" + }, + "current_interval_price_level": { + "name": "Nåværende prisnivå", + "state": { + "very_cheap": "Veldig billig", + "cheap": "Billig", + "normal": "Normal", + "expensive": "Dyr", + "very_expensive": "Veldig dyr" } - }, - "entity": { - "sensor": { - "current_interval_price": { - "name": "Nåværende strømpris" - }, - "current_interval_price_base": { - "name": "Nåværende strømpris (Energi-dashboard)" - }, - "next_interval_price": { - "name": "Neste strømpris" - }, - "previous_interval_price": { - "name": "Forrige strømpris" - }, - "current_hour_average_price": { - "name": "⌀ Timepris nåværende" - }, - "next_hour_average_price": { - "name": "⌀ Timepris neste" - }, - "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": "⌀ Pris i dag" - }, - "lowest_price_tomorrow": { - "name": "Morgendagens laveste pris" - }, - "highest_price_tomorrow": { - "name": "Morgendagens høyeste pris" - }, - "average_price_tomorrow": { - "name": "⌀ Pris i morgen" - }, - "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": "⌀ Pris glidende 24t" - }, - "leading_price_average": { - "name": "⌀ Pris fremtidig 24t" - }, - "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 timeprisvurdering", - "state": { - "low": "Lav", - "normal": "Normal", - "high": "Høy" - } - }, - "next_hour_price_rating": { - "name": "Neste timeprisvurdering", - "state": { - "low": "Lav", - "normal": "Normal", - "high": "Høy" - } - }, - "next_avg_1h": { - "name": "⌀ Pris neste 1t" - }, - "next_avg_2h": { - "name": "⌀ Pris neste 2t" - }, - "next_avg_3h": { - "name": "⌀ Pris neste 3t" - }, - "next_avg_4h": { - "name": "⌀ Pris neste 4t" - }, - "next_avg_5h": { - "name": "⌀ Pris neste 5t" - }, - "next_avg_6h": { - "name": "⌀ Pris neste 6t" - }, - "next_avg_8h": { - "name": "⌀ Pris neste 8t" - }, - "next_avg_12h": { - "name": "⌀ Pris neste 12t" - }, - "price_outlook_1h": { - "name": "Prisutblikk (1t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_2h": { - "name": "Prisutblikk (2t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_3h": { - "name": "Prisutblikk (3t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_4h": { - "name": "Prisutblikk (4t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_5h": { - "name": "Prisutblikk (5t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_6h": { - "name": "Prisutblikk (6t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_8h": { - "name": "Prisutblikk (8t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_outlook_12h": { - "name": "Prisutblikk (12t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_2h": { - "name": "Prisforløp (2t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_3h": { - "name": "Prisforløp (3t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_4h": { - "name": "Prisforløp (4t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_5h": { - "name": "Prisforløp (5t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_6h": { - "name": "Prisforløp (6t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_8h": { - "name": "Prisforløp (8t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "price_trajectory_12h": { - "name": "Prisforløp (12t)", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "current_price_trend": { - "name": "Nåværende pristrend", - "state": { - "strongly_rising": "Sterkt stigende", - "rising": "Stigende", - "stable": "Stabil", - "falling": "Fallende", - "strongly_falling": "Sterkt fallende" - } - }, - "next_price_trend_change": { - "name": "Neste trendendring" - }, - "next_price_trend_change_in": { - "name": "Neste trendendring om" - }, - "daily_rating": { - "name": "Daglig prisvurdering" - }, - "monthly_rating": { - "name": "Månedlig prisvurdering" - }, - "data_lifecycle_status": { - "name": "Datalivssyklus-status", - "state": { - "cached": "Hurtigbufret", - "fresh": "Fersk", - "refreshing": "Oppdaterer", - "searching_tomorrow": "Søker morgendagens data", - "turnover_pending": "Midnattskifte venter", - "error": "Feil" - } - }, - "today_volatility": { - "name": "Volatilitet i dag", - "state": { - "low": "Lav", - "moderate": "Moderat", - "high": "Høy", - "very_high": "Svært Høy" - } - }, - "tomorrow_volatility": { - "name": "Volatilitet i morgen", - "state": { - "low": "Lav", - "moderate": "Moderat", - "high": "Høy", - "very_high": "Svært Høy" - } - }, - "next_24h_volatility": { - "name": "Volatilitet neste 24t", - "state": { - "low": "Lav", - "moderate": "Moderat", - "high": "Høy", - "very_high": "Svært Høy" - } - }, - "today_tomorrow_volatility": { - "name": "Volatilitet i dag+i morgen", - "state": { - "low": "Lav", - "moderate": "Moderat", - "high": "Høy", - "very_high": "Svært Høy" - } - }, - "best_price_end_time": { - "name": "Beste pris slutter" - }, - "best_price_period_duration": { - "name": "Beste pris varighet" - }, - "best_price_remaining_minutes": { - "name": "Beste pris gjenværende tid" - }, - "best_price_progress": { - "name": "Beste pris fremgang" - }, - "best_price_next_start_time": { - "name": "Beste pris starter" - }, - "best_price_next_in_minutes": { - "name": "Beste pris starter om" - }, - "peak_price_end_time": { - "name": "Topppris slutter" - }, - "peak_price_period_duration": { - "name": "Topppris varighet" - }, - "peak_price_remaining_minutes": { - "name": "Topppris gjenværende tid" - }, - "peak_price_progress": { - "name": "Topppris fremgang" - }, - "peak_price_next_start_time": { - "name": "Topppris starter" - }, - "peak_price_next_in_minutes": { - "name": "Topppris starter om" - }, - "home_type": { - "name": "Boligtype", - "state": { - "apartment": "Leilighet", - "rowhouse": "Rekkehus", - "house": "Hus", - "cottage": "Hytte" - } - }, - "home_size": { - "name": "Boligareal" - }, - "main_fuse_size": { - "name": "Hovedsikring" - }, - "number_of_residents": { - "name": "Antall beboere" - }, - "primary_heating_source": { - "name": "Primær varmekilde", - "state": { - "air2air_heatpump": "Luft-til-luft-varmepumpe", - "air2water_heatpump": "Luft-til-vann-varmepumpe", - "boiler": "Varmtvannsbereder", - "central_heating": "Sentralvarme", - "district_heating": "Fjernvarme", - "district": "Fjernvarme", - "electric_boiler": "Elektrisk varmtvannsbereder", - "electricity": "Elektrisitet", - "floor": "Gulvvarme", - "gas": "Gass", - "ground_heatpump": "Jordvarmepumpe", - "ground": "Jordvarmepumpe", - "oil": "Olje", - "other": "Annet", - "waste": "Spillvarme" - } - }, - "grid_company": { - "name": "Nettselskap" - }, - "grid_area_code": { - "name": "Nettområdekode" - }, - "price_area_code": { - "name": "Prisområdekode" - }, - "consumption_ean": { - "name": "Forbruks-EAN" - }, - "production_ean": { - "name": "Produksjons-EAN" - }, - "energy_tax_type": { - "name": "Energiavgiftstype" - }, - "vat_type": { - "name": "MVA-type" - }, - "estimated_annual_consumption": { - "name": "Estimert årlig forbruk" - }, - "subscription_status": { - "name": "Abonnementsstatus", - "state": { - "running": "Aktiv", - "ended": "Avsluttet", - "pending": "Venter", - "unknown": "Ukjent" - } - }, - "day_pattern_yesterday": { - "name": "Prismønster i går", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dobbel dal", - "double_peak": "Dobbel topp", - "flat": "Flat", - "rising": "Stigende", - "falling": "Fallende", - "mixed": "Blandet" - } - }, - "day_pattern_today": { - "name": "Prismønster i dag", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dobbel dal", - "double_peak": "Dobbel topp", - "flat": "Flat", - "rising": "Stigende", - "falling": "Fallende", - "mixed": "Blandet" - } - }, - "day_pattern_tomorrow": { - "name": "Prismønster i morgen", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dobbel dal", - "double_peak": "Dobbel topp", - "flat": "Flat", - "rising": "Stigende", - "falling": "Fallende", - "mixed": "Blandet" - } - }, - "chart_data_export": { - "name": "Diagramdataeksport", - "state": { - "pending": "Venter", - "ready": "Klar", - "error": "Feil" - } - }, - "chart_metadata": { - "name": "Diagrammetadata", - "state": { - "pending": "Venter", - "ready": "Klar", - "error": "Feil" - } - } - }, - "binary_sensor": { - "peak_price_period": { - "name": "Toppris-periode" - }, - "best_price_period": { - "name": "Lavpris-periode" - }, - "connection": { - "name": "Tibber API-tilkobling" - }, - "tomorrow_data_available": { - "name": "Morgendagens data tilgjengelig" - }, - "has_ventilation_system": { - "name": "Har ventilasjonsanlegg" - }, - "realtime_consumption_enabled": { - "name": "Sanntidsforbruk aktivert" - } - }, - "number": { - "best_price_flex_override": { - "name": "Beste pris: Fleksibilitet" - }, - "best_price_min_distance_override": { - "name": "Beste pris: Minimumsavstand" - }, - "best_price_min_period_length_override": { - "name": "Beste pris: Minimum periodelengde" - }, - "best_price_min_periods_override": { - "name": "Beste pris: Minimum perioder" - }, - "best_price_relaxation_attempts_override": { - "name": "Beste pris: Lemping forsøk" - }, - "best_price_gap_count_override": { - "name": "Beste pris: Gaptoleranse" - }, - "peak_price_flex_override": { - "name": "Topppris: Fleksibilitet" - }, - "peak_price_min_distance_override": { - "name": "Topppris: Minimumsavstand" - }, - "peak_price_min_period_length_override": { - "name": "Topppris: Minimum periodelengde" - }, - "peak_price_min_periods_override": { - "name": "Topppris: Minimum perioder" - }, - "peak_price_relaxation_attempts_override": { - "name": "Topppris: Lemping forsøk" - }, - "peak_price_gap_count_override": { - "name": "Topppris: Gaptoleranse" - } - }, - "switch": { - "best_price_enable_relaxation_override": { - "name": "Beste pris: Oppnå minimumsantall" - }, - "peak_price_enable_relaxation_override": { - "name": "Topppris: Oppnå minimumsantall" - } + }, + "next_interval_price_level": { + "name": "Neste prisnivå", + "state": { + "very_cheap": "Veldig billig", + "cheap": "Billig", + "normal": "Normal", + "expensive": "Dyr", + "very_expensive": "Veldig dyr" } - }, - "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." - }, - "tomorrow_data_missing": { - "title": "Prisdata for i morgen mangler for {home_name}", - "description": "Strømprisdata for i morgen er fortsatt utilgjengelig etter {warning_hour}:00. Dette er uvanlig, da Tibber vanligvis publiserer morgendagens priser på ettermiddagen (rundt 13:00-14:00 CET).\n\nMulige årsaker:\n- Tibber har ikke publisert morgendagens priser ennå\n- Midlertidige API-problemer\n- Strømleverandøren din har ikke sendt inn priser til Tibber\n\nDette problemet vil løse seg automatisk når morgendagens data blir tilgjengelig. Hvis dette vedvarer etter 20:00, vennligst sjekk Tibber-appen eller kontakt Tibber-support." - }, - "rate_limit_exceeded": { - "title": "API-hastighetsbegrensning overskredet for {home_name}", - "description": "Tibber-APIet har hastighetsbegrenset denne integrasjonen etter {error_count} påfølgende feil. Dette betyr at forespørsler blir gjort for hyppig.\n\nIntegrasjonen vil automatisk prøve på nytt med økende forsinkelser. Dette problemet vil løse seg når hastighetsbegrensningen utløper.\n\nHvis dette vedvarer i flere timer, vurder:\n- Å sjekke om flere Home Assistant-instanser bruker samme API-token\n- Å verifisere at ingen andre applikasjoner bruker Tibber-API-tokenet ditt mye\n- Å redusere oppdateringsfrekvensen hvis du har tilpasset den" - }, - "home_not_found": { - "title": "Hjemmet {home_name} ble ikke funnet i Tibber-kontoen", - "description": "Hjemmet konfigurert i denne integrasjonen (oppførings-ID: {entry_id}) er ikke lenger tilgjengelig i Tibber-kontoen din. Dette skjer vanligvis når:\n- Hjemmet ble slettet fra Tibber-kontoen din\n- Hjemmet ble flyttet til en annen Tibber-konto\n- Tilgang til dette hjemmet ble tilbakekalt\n\nVennligst fjern denne integrasjonsoppføringen og legg den til på nytt hvis hjemmet fortsatt skal overvåkes. For å fjerne denne oppføringen, gå til Innstillinger → Enheter og tjenester → Tibber Prices og slett {home_name}-konfigurasjonen." - }, - "entity_migration": { - "title": "Tibber Prices: Handling kreves etter oppdatering ({home_name})", - "description": "Denne oppdateringen inkluderer endringer som ble brukt automatisk.\n\n**Omdøpte entiteter ({count})**\n\nFølgende entity-nøkler ble omdøpt. Dine eksisterende entity-ID-er og automatiseringer forblir intakte:\n\n{entity_list}\n\n**Endrede varighetssensorverdier**\n\nAlle varighetssensorer (gjenværende tid, starter om, periodevarighet, trendendrings-nedtelling) rapporterer nå tilstandsverdien i **minutter** i stedet for timer. Visningsenheten i dashboards forblir timer som standard.\n\nHvis du har automatiseringer med numeriske sammenligninger på disse sensorene, oppdater tersklene:\n- Gammelt: `state < 0.25` (15 minutter som timer)\n- Nytt: `state < 15` (15 minutter)\n\nAvvis dette varselet etter å ha gjennomgått automatiseringene dine." + }, + "previous_interval_price_level": { + "name": "Forrige prisnivå", + "state": { + "very_cheap": "Veldig billig", + "cheap": "Billig", + "normal": "Normal", + "expensive": "Dyr", + "very_expensive": "Veldig dyr" } - }, - "exceptions": { - "no_entries_found": { - "message": "Ingen Tibber Prices integrasjonsoppføringer funnet. Vennligst sett opp integrasjonen først." - }, - "multiple_entries_no_entry_id": { - "message": "Flere Tibber Prices oppføringer funnet. Vennligst angi 'entry_id' for å velge hvilken oppføring som skal brukes." - }, - "invalid_entry_id": { - "message": "Ugyldig eller utilgjengelig konfigurasjonsoppføring. Vennligst sjekk oppførings-ID-en og sørg for at integrasjonen er lastet." - }, - "missing_home_id": { - "message": "Hjemme-ID ikke funnet i konfigurasjonsoppføringen. Vennligst rekonfigurer integrasjonen." - }, - "user_data_not_available": { - "message": "Brukerdata er ikke tilgjengelig ennå. Vennligst vent til den første dataoppdateringen er fullført." - }, - "timezone_not_found": { - "message": "Kunne ikke bestemme hjemmets tidssone. Vennligst sjekk hjemmekonfigurasjonen i Tibber-kontoen din." - }, - "end_before_start": { - "message": "Sluttid må være etter starttid." - }, - "price_fetch_failed": { - "message": "Kunne ikke hente prisdata fra Tibber API. Vennligst prøv igjen senere." - }, - "invalid_search_scope": { - "message": "Ugyldig søkeområde. Gyldige verdier er: today, tomorrow, remaining_today, next_24h, next_48h." - }, - "scope_conflicts_with_range": { - "message": "search_scope kan ikke kombineres med eksplisitte områdeparametre: {params}. Bruk enten search_scope ELLER eksplisitte start-/sluttparametre." - }, - "day_offset_requires_time": { - "message": "{offset_param} krever at {time_param} er satt. Dagsforskyvning endrer kun datoen til en eksplisitt tidsparameter." - }, - "min_level_exceeds_max": { - "message": "min_price_level '{min_level}' er høyere enn max_price_level '{max_level}'. Minimumsnivået må være lik eller lavere enn maksimumsnivået." - }, - "power_profile_length_mismatch": { - "message": "power_profile har {profile_length} oppføringer, men varigheten krever {interval_count} intervaller ({duration_minutes} minutter). power_profile må ha nøyaktig én oppføring per 15-minutters intervall." - }, - "level_and_rating_filter_conflict": { - "message": "level_filter og rating_level_filter kan ikke brukes sammen. Bruk kun én filtertype per forespørsel." - }, - "insert_nulls_requires_filter": { - "message": "insert_nulls-modus '{mode}' krever en level_filter eller rating_level_filter for å definere segmenter. Uten filter, bruk insert_nulls: none." - }, - "connect_segments_requires_segments_mode": { - "message": "connect_segments krever at insert_nulls er satt til 'segments'. Sett insert_nulls: segments for å bruke segmentforbindelse." - }, - "array_fields_requires_array_format": { - "message": "array_fields kan kun brukes med output_format: array_of_arrays. Endre utdataformatet eller fjern array_fields." - }, - "invalid_array_fields": { - "message": "Ugyldig array_fields-mal. Bruk feltnavn i krøllparenteser, f.eks. '{start_time}, {price_per_kwh}, {level}'." + }, + "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" } - }, - "services": { - "get_price": { - "name": "Hent prisdata", - "description": "Hent prisdata for et spesifikt tidsrom med automatisk ruting. Utviklings- og testtjeneste for price_info_for_range API-funksjonen. Bruker automatisk PRICE_INFO, PRICE_INFO_RANGE eller begge basert på tidsromgrensen.", - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfigurasjonsoppførings-IDen for Tibber-integrasjonen." - }, - "start_time": { - "name": "Starttid", - "description": "Start av tidsrommet (inklusiv, tidssonetilpasset)." - }, - "end_time": { - "name": "Sluttid", - "description": "Slutt av tidsrommet (eksklusiv, tidssonetilpasset)." - } - } - }, - "get_apexcharts_yaml": { - "name": "Hent ApexCharts-kort YAML", - "description": "⚠️ VIKTIG: Denne tjenesten genererer en GRUNNLEGGENDE EKSEMPEL-konfigurasjon for ApexCharts-kort som et utgangspunkt. Det er IKKE en komplett løsning for alle ApexCharts-funksjoner. Denne integrasjonen er primært en DATALEVERANDØR. Den genererte YAML-en demonstrerer hvordan du bruker `get_chartdata`-tjenesten for å hente prisdata. På grunn av den segmenterte naturen til våre data (forskjellige tidsperioder per serie) og bruken av Home Assistants service-API i stedet for entitetsattributter, er mange avanserte ApexCharts-funksjoner (som in_header, visse transformasjoner) ikke kompatible eller krever manuell tilpasning. Du er velkommen til å tilpasse den genererte YAML for dine spesifikke behov, men vær oppmerksom på at omfattende ApexCharts-konfigurasjonsstøtte er utenfor rammen av denne integrasjonen. Bidrag fra fellesskapet med forbedrede konfigurasjoner er alltid velkomne - hvis du finner en bedre oppsett som fungerer, vennligst del det slik at alle kan dra nytte av det! For direkte datatilgang for å bygge dine egne diagrammer, bruk `get_chartdata`-tjenesten i stedet.", - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfigureringsoppførings-IDen for Tibber-integrasjonen." - }, - "day": { - "name": "Dag", - "description": "Hvilken dag som skal visualiseres (standard: Rullerende vindu). Faste dagalternativer (I går/I dag/I morgen) viser 24t-spenn uten ekstra avhengigheter. Dynamiske alternativer krever config-template-card: Rullerende vindu lager et fast 48t-vindu som automatisk skifter mellom i går+i dag og i dag+i morgen basert på datatilgjengelighet. Rullerende vindu (Auto-Zoom) oppfører seg likt, men zoomer i tillegg automatisk inn (2t tilbakeblikk + gjenværende tid til midnatt, graph_span reduseres hvert 15. minutt)." - }, - "level_type": { - "name": "Nivåtype", - "description": "Velg hvilken prisnivåklassifisering som skal visualiseres: 'rating_level' (lav/normal/høy basert på dine konfigurerte terskelverdier) eller 'level' (Tibber API-nivåer: veldig billig/billig/normal/dyr/veldig dyr)." - }, - "highlight_best_price": { - "name": "Fremhev beste prisperioder", - "description": "Legg til et halvgjennomsiktig grønt overlegg for å fremheve de beste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere de optimale tidene for energiforbruk." - }, - "highlight_peak_price": { - "name": "Fremhev høyeste prisperioder", - "description": "Legg til et halvgjennomsiktig rødt overlegg for å fremheve de høyeste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere tidene når energi er dyrest." - }, - "resolution": { - "name": "Oppløsning", - "description": "Tidsoppløsning for diagramdata. 'interval' (standard): Opprinnelige 15-minutters intervaller (96 punkter per dag). 'hourly': Aggregerte timeverdier med et rullende 60-minutters vindu (24 punkter per dag) for et ryddigere og mindre rotete diagram." - } - } - }, - "get_chartdata": { - "name": "Hent diagramdata", - "description": "Returnerer prisdata i et enkelt diagramvennlig format kompatibelt med Tibber Core-integrasjonens utdatastruktur. Perfekt for bruk med populære diagramkort som ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card eller den innebygde History Graph Card. Feltnavn og datastruktur kan tilpasses for å matche diagrammets krav.", - "sections": { - "general": { - "name": "Generelt", - "description": "Basisalternativer for henting av diagramdata." - }, - "selection": { - "name": "Valg", - "description": "Velg hvilke data som skal inkluderes i utdataene." - }, - "filters": { - "name": "Filtre", - "description": "Filtrer data basert på prisnivåer, prisvurderinger eller spesielle perioder." - }, - "transformation": { - "name": "Transformer data", - "description": "Transformer datautdataene for bedre diagramkompatibilitet." - }, - "format": { - "name": "Format", - "description": "Tilpass utdataformatet." - }, - "arrays_of_arrays": { - "name": "Avanserte utdatainnstillinger: Array av arrays", - "description": "Innstillinger for utdataformat ved bruk av array av arrays." - }, - "arrays_of_objects": { - "name": "Avanserte utdatainnstillinger: Array av objekter", - "description": "Innstillinger for utdataformat ved bruk av array av objekter." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "day": { - "name": "Dag", - "description": "Hvilken dag(er) skal det hentes priser for. Du kan velge flere dager. Hvis ikke angitt, returneres et rullerende 2-dagers vindu: i dag+i morgen (når morgendagens data er tilgjengelig) eller i går+i dag (når morgendagens data ikke er tilgjengelig ennå). Dette gir kontinuerlig diagramvisning uten hull." - }, - "resolution": { - "name": "Oppløsning", - "description": "Tidsoppløsning for de returnerte dataene. Alternativer: 'interval' (standard, 15-minutters intervaller, 96 datapunkter per dag), 'hourly' (timegjennomsnitt, 24 datapunkter per dag)." - }, - "output_format": { - "name": "Utdataformat", - "description": "Utdataformat for de returnerte dataene. Alternativer: 'array_of_objects' (standard, array av objekter med tilpassbare feltnavn), 'array_of_arrays' (array av [tidsstempel, pris]-arrays med avsluttende null-punkt for stepline-diagrammer)." - }, - "array_fields": { - "name": "Array-felt", - "description": "Definer hvilke felt som skal inkluderes. Bruk feltnavn i krøllparenteser, adskilt med komma. Tilgjengelige felt: start_time, price_per_kwh, level, rating_level, average. Felt vil automatisk aktiveres selv om include_*-alternativene ikke er satt. La stå tom for standard (kun tidsstempel og pris)." - }, - "subunit_currency": { - "name": "Underenhet valuta", - "description": "Returner priser i underenhet valutaenheter (øre for NOK/SEK, cent for EUR) i stedet for basisvalutaenheter. Deaktivert som standard." - }, - "round_decimals": { - "name": "Rund desimaler", - "description": "Antall desimalplasser å runde priser til (0-10). Hvis ikke angitt, brukes standard presisjon (4 desimaler for basisvaluta, 2 for underenhet valuta)." - }, - "include_level": { - "name": "Inkluder prisnivå", - "description": "Inkluder Tibber-prisnivåfeltet (veldig billig/billig/normal/dyr/veldig dyr) i hvert datapunkt." - }, - "include_rating_level": { - "name": "Inkluder prisvurdering", - "description": "Inkluder det beregnede prisvurderingsfeltet (lav/normal/høy) basert på dine konfigurerte terskler i hvert datapunkt." - }, - "include_average": { - "name": "Inkluder gjennomsnitt", - "description": "Inkluder daglig gjennomsnittspris i hvert datapunkt for sammenligning." - }, - "include_energy": { - "name": "Inkluder energipris", - "description": "Inkluder rå energi-/spotpris (ekskludert skatter og avgifter) i hvert datapunkt. Dette er 'energy'-feltet fra Tibber-APIet, nyttig for innmatings-/nettomålingsberegninger." - }, - "include_tax": { - "name": "Inkluder skatt", - "description": "Inkluder skatteandelen av prisen i hvert datapunkt. Dette er 'tax'-feltet fra Tibber-APIet, som representerer avgifter, skatter og nettleie." - }, - "level_filter": { - "name": "Prisnivåfilter", - "description": "Filtrer intervaller for å bare inkludere spesifikke Tibber-prisnivåer (veldig billig/billig/normal/dyr/veldig dyr). Hvis ikke angitt, inkluderes alle nivåer." - }, - "rating_level_filter": { - "name": "Prisvurderingsfilter", - "description": "Filtrer intervaller for å inkludere bare spesifikke prisvurderinger (lav/normal/høy). Hvis ikke spesifisert, inkluderes alle vurderinger." - }, - "period_filter": { - "name": "Periodefilter", - "description": "Filtrer intervaller for å inkludere kun de innenfor Beste pris- eller Topp pris-perioder. Alternativer: 'best_price' (kun intervaller i Beste pris-perioder), 'peak_price' (kun intervaller i Topp pris-perioder). Hvis ikke spesifisert, inkluderes alle intervaller. Bruker forhåndsberegnede periodedata fra binære sensorer." - }, - "insert_nulls": { - "name": "Sett inn NULL-verdier", - "description": "Kontroller innsetting av NULL-verdier for filtrerte data. 'none' (standard): Ingen NULL-verdier, bare matchende intervaller. 'segments': Legg til NULL-punkter ved segmentgrenser for rene hull i diagrammer (anbefalt for trinnlinjediagrammer). 'all': Sett inn NULL for alle tidsstempler der filteret ikke samsvarer (nyttig for kontinuerlig tidsserievisualisering)." - }, - "connect_segments": { - "name": "Koble segmenter", - "description": "[KUN MED 'Sett inn NULL-verdier'] Når aktivert, legges tilkoblingspunkter til ved segmentgrenser for å visuelt koble ulike prisnivå-segmenter i trinnlinjediagrammer. Når prisen går NED, legges et punkt med lavere pris til på slutten av gjeldende segment. Når prisen går OPP, legges et holdepunkt til før hullet. Dette skaper jevne visuelle overganger mellom segmenter i stedet for brå hull." - }, - "add_trailing_null": { - "name": "Legg til avsluttende null-punkt", - "description": "Legg til et siste datapunkt med nullverdier (unntatt tidsstempel) på slutten. Noen diagrambiblioteker trenger dette for å forhindre ekstrapolering/interpolering til visningsportens kant ved bruk av trinnlinje-rendering. La være deaktivert med mindre diagrammet ditt krever det." - }, - "start_time_field": { - "name": "Starttid-feltnavn", - "description": "Egendefinert navn for starttid-feltet i utdata. Standard er 'start_time' hvis ikke angitt." - }, - "end_time_field": { - "name": "Sluttid-feltnavn", - "description": "Egendefinert navn for sluttid-feltet i utdata. Standard er 'end_time' hvis ikke angitt. Brukes kun med period_filter." - }, - "price_field": { - "name": "Prisfelt-navn", - "description": "Tilpasset navn for prisfeltet i utdata. Standard er 'price_per_kwh'." - }, - "level_field": { - "name": "Prisnivåfelt-navn", - "description": "Tilpasset navn for prisnivåfeltet i utdata. Standard er 'level'. Brukes bare når include_level er aktivert." - }, - "rating_level_field": { - "name": "Prisvurderingsfelt-navn", - "description": "Tilpasset navn for prisvurderingsfeltet i utdata. Standard er 'rating_level'. Brukes bare når include_rating_level er aktivert." - }, - "average_field": { - "name": "Gjennomsnittsfelt-navn", - "description": "Tilpasset navn for gjennomsnittsfeltet i utdata. Standard er 'average'. Brukes bare når include_average er aktivert." - }, - "energy_field": { - "name": "Energiprisfelt-navn", - "description": "Tilpasset navn for energiprisfeltet i utdata. Standard er 'energy_price'. Brukes bare når include_energy er aktivert." - }, - "tax_field": { - "name": "Skattefelt-navn", - "description": "Tilpasset navn for skattefeltet i utdata. Standard er 'tax'. Brukes bare når include_tax er aktivert." - }, - "metadata": { - "name": "Metadata", - "description": "Kontroller metadata-inkludering i svaret. 'include' (standard): Returnerer både diagramdata og metadata med prisstatistikk, valutainformasjon, Y-akse forslag og tidsperiode. 'only': Returnerer bare metadata uten å behandle diagramdata (raskt, nyttig for dynamisk Y-akse konfigurasjon). 'none': Returnerer bare diagramdata uten metadata." - }, - "data_key": { - "name": "Datanøkkel", - "description": "Tilpasset navn for datanøkkelen på toppnivå i svaret. Standard er 'data' hvis ikke angitt." - } - } - }, - "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." - } - } - }, - "find_cheapest_block": { - "name": "Finn billigste blokk", - "description": "Finner det billigste sammenhengende tidsvinduet med en gitt varighet. Designet for apparatplanlegging: oppvaskmaskin, vaskemaskin, tørketrommel osv. Returnerer det billigste vinduet med start-/sluttider og prisstatistikk.", - "sections": { - "search_range": { - "name": "Soekeomraade", - "description": "Definer tidsvinduet for soeket." - }, - "time_alternatives": { - "name": "Alternative tidsalternativer", - "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." - }, - "price_filter": { - "name": "Prisnivaae-filter", - "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." - }, - "output": { - "name": "Utdata-alternativer", - "description": "Styr kostnadsestimat og sammenligningsutdata." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "duration": { - "name": "Varighet", - "description": "Lengden på det ønskede sammenhengende vinduet. Rundes automatisk opp til nærmeste kvarter. Maksimum: 12 timer." - }, - "search_start": { - "name": "Søkestart", - "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." - }, - "search_end": { - "name": "Søkeslutt", - "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." - }, - "search_start_time": { - "name": "Søkestart-klokkeslett", - "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." - }, - "search_start_day_offset": { - "name": "Søkestart dagsforskyvning", - "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." - }, - "search_end_time": { - "name": "Søkeslutt-klokkeslett", - "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." - }, - "search_end_day_offset": { - "name": "Søkeslutt dagsforskyvning", - "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." - }, - "search_start_offset_minutes": { - "name": "Søkestart-forskyvning (minutter)", - "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." - }, - "search_end_offset_minutes": { - "name": "Søkeslutt-forskyvning (minutter)", - "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." - }, - "include_current_interval": { - "name": "Inkluder gjeldende intervall", - "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." - }, - "use_base_unit": { - "name": "Bruk basisvaluta", - "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." - }, - "search_scope": { - "name": "Soekeomfang (snarvei)", - "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." - }, - "max_price_level": { - "name": "Maksimalt prisnivaae", - "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." - }, - "min_price_level": { - "name": "Minimalt prisnivaae", - "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." - }, - "include_comparison_details": { - "name": "Inkluder sammenligningsdetaljer", - "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." - } - } - }, - "find_most_expensive_block": { - "name": "Finn dyreste blokk", - "description": "Finner det dyreste sammenhengende tidsvinduet med en gitt varighet. Nyttig for å identifisere topprisperioder som bør unngås. Returnerer det dyreste vinduet med start-/sluttider og prisstatistikk.", - "sections": { - "search_range": { - "name": "Soekeomraade", - "description": "Definer tidsvinduet for soeket." - }, - "time_alternatives": { - "name": "Alternative tidsalternativer", - "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." - }, - "price_filter": { - "name": "Prisnivaae-filter", - "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." - }, - "output": { - "name": "Utdata-alternativer", - "description": "Styr kostnadsestimat og sammenligningsutdata." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "duration": { - "name": "Varighet", - "description": "Lengden på det ønskede sammenhengende vinduet. Rundes automatisk opp til nærmeste kvarter. Maksimum: 12 timer." - }, - "search_start": { - "name": "Søkestart", - "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." - }, - "search_end": { - "name": "Søkeslutt", - "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." - }, - "search_start_time": { - "name": "Søkestart-klokkeslett", - "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." - }, - "search_start_day_offset": { - "name": "Søkestart dagsforskyvning", - "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." - }, - "search_end_time": { - "name": "Søkeslutt-klokkeslett", - "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." - }, - "search_end_day_offset": { - "name": "Søkeslutt dagsforskyvning", - "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." - }, - "search_start_offset_minutes": { - "name": "Søkestart-forskyvning (minutter)", - "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." - }, - "search_end_offset_minutes": { - "name": "Søkeslutt-forskyvning (minutter)", - "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." - }, - "include_current_interval": { - "name": "Inkluder gjeldende intervall", - "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." - }, - "use_base_unit": { - "name": "Bruk basisvaluta", - "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." - }, - "search_scope": { - "name": "Soekeomfang (snarvei)", - "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." - }, - "max_price_level": { - "name": "Maksimalt prisnivaae", - "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." - }, - "min_price_level": { - "name": "Minimalt prisnivaae", - "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." - }, - "include_comparison_details": { - "name": "Inkluder sammenligningsdetaljer", - "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." - } - } - }, - "find_cheapest_hours": { - "name": "Finn billigste timer", - "description": "Finner de billigste intervallene for en gitt total varighet, ikke nødvendigvis sammenhengende. Designet for fleksible laster: batterilading, elbil, varmtvannsbereder. Returnerer en tidsplan med intervaller gruppert i sammenhengende segmenter.", - "sections": { - "search_range": { - "name": "Soekeomraade", - "description": "Definer tidsvinduet for soeket." - }, - "time_alternatives": { - "name": "Alternative tidsalternativer", - "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." - }, - "price_filter": { - "name": "Prisnivaae-filter", - "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." - }, - "output": { - "name": "Utdata-alternativer", - "description": "Styr kostnadsestimat og sammenligningsutdata." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "duration": { - "name": "Varighet", - "description": "Nødvendig billig total tid. Rundes automatisk opp til nærmeste kvarter. Maksimum: 24 timer." - }, - "search_start": { - "name": "Søkestart", - "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." - }, - "search_end": { - "name": "Søkeslutt", - "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." - }, - "search_start_time": { - "name": "Søkestart-klokkeslett", - "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." - }, - "search_start_day_offset": { - "name": "Søkestart dagsforskyvning", - "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." - }, - "search_end_time": { - "name": "Søkeslutt-klokkeslett", - "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." - }, - "search_end_day_offset": { - "name": "Søkeslutt dagsforskyvning", - "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." - }, - "search_start_offset_minutes": { - "name": "Søkestart-forskyvning (minutter)", - "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." - }, - "search_end_offset_minutes": { - "name": "Søkeslutt-forskyvning (minutter)", - "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." - }, - "include_current_interval": { - "name": "Inkluder gjeldende intervall", - "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." - }, - "min_segment_duration": { - "name": "Minimum segmentvarighet", - "description": "Minimum sammenhengende kjøretid. Forhindrer rask av/på-sykling for enheter med minimum kjøretid. Rundes automatisk opp til nærmeste kvarter. Standard: 15 minutter. Maksimum: 4 timer." - }, - "use_base_unit": { - "name": "Bruk basisvaluta", - "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." - }, - "search_scope": { - "name": "Soekeomfang (snarvei)", - "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." - }, - "max_price_level": { - "name": "Maksimalt prisnivaae", - "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." - }, - "min_price_level": { - "name": "Minimalt prisnivaae", - "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." - }, - "include_comparison_details": { - "name": "Inkluder sammenligningsdetaljer", - "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." - } - } - }, - "find_most_expensive_hours": { - "name": "Finn dyreste timer", - "description": "Finner de dyreste intervallene for en gitt total varighet, ikke nødvendigvis sammenhengende. Nyttig for å identifisere topprisperioder som bør unngås. Returnerer en tidsplan med intervaller gruppert i sammenhengende segmenter.", - "sections": { - "search_range": { - "name": "Soekeomraade", - "description": "Definer tidsvinduet for soeket." - }, - "time_alternatives": { - "name": "Alternative tidsalternativer", - "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." - }, - "price_filter": { - "name": "Prisnivaae-filter", - "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." - }, - "output": { - "name": "Utdata-alternativer", - "description": "Styr kostnadsestimat og sammenligningsutdata." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "duration": { - "name": "Varighet", - "description": "Dyr total tid som skal finnes. Rundes automatisk opp til nærmeste kvarter. Maksimum: 24 timer." - }, - "search_start": { - "name": "Søkestart", - "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." - }, - "search_end": { - "name": "Søkeslutt", - "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." - }, - "search_start_time": { - "name": "Søkestart-klokkeslett", - "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." - }, - "search_start_day_offset": { - "name": "Søkestart dagsforskyvning", - "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." - }, - "search_end_time": { - "name": "Søkeslutt-klokkeslett", - "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." - }, - "search_end_day_offset": { - "name": "Søkeslutt dagsforskyvning", - "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." - }, - "search_start_offset_minutes": { - "name": "Søkestart-forskyvning (minutter)", - "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." - }, - "search_end_offset_minutes": { - "name": "Søkeslutt-forskyvning (minutter)", - "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." - }, - "include_current_interval": { - "name": "Inkluder gjeldende intervall", - "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." - }, - "min_segment_duration": { - "name": "Minimum segmentvarighet", - "description": "Minimum sammenhengende kjøretid. Forhindrer rask av/på-sykling for enheter med minimum kjøretid. Rundes automatisk opp til nærmeste kvarter. Standard: 15 minutter. Maksimum: 4 timer." - }, - "use_base_unit": { - "name": "Bruk basisvaluta", - "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." - }, - "search_scope": { - "name": "Soekeomfang (snarvei)", - "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." - }, - "max_price_level": { - "name": "Maksimalt prisnivaae", - "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." - }, - "min_price_level": { - "name": "Minimalt prisnivaae", - "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." - }, - "include_comparison_details": { - "name": "Inkluder sammenligningsdetaljer", - "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." - } - } - }, - "find_cheapest_schedule": { - "name": "Finn billigste tidsplan", - "description": "Planlegger flere apparater optimalt uten tidsoverlapp. Hver oppgave tildeles det billigste tilgjengelige sammenhengende tidsvinduet.", - "sections": { - "scheduling_options": { - "name": "Planleggingsalternativer", - "description": "Konfigurer oppgaver og pause mellom dem." - }, - "search_range": { - "name": "Soekeomraade", - "description": "Definer tidsvinduet for soeket." - }, - "time_alternatives": { - "name": "Alternative tidsalternativer", - "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." - }, - "price_filter": { - "name": "Prisnivaae-filter", - "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." - }, - "output": { - "name": "Utdata-alternativer", - "description": "Styr kostnadsestimat og sammenligningsutdata." - } - }, - "fields": { - "entry_id": { - "name": "Oppførings-ID", - "description": "Konfig-oppførings-ID for Tibber-integrasjonen." - }, - "tasks": { - "name": "Oppgaver", - "description": "Liste over oppgaver som skal planlegges. Hver oppgave trenger name (tekst) og duration (hh:mm:ss). Eventuelt power_profile (watt per 15-min-intervall). Maks 4 oppgaver." - }, - "gap_minutes": { - "name": "Pause mellom oppgaver (minutter)", - "description": "Minimum pause i minutter mellom paafoeglende planlagte oppgaver. Avrundes opp til 15 minutter. Standard: 0 (ingen pause)." - }, - "search_scope": { - "name": "Soekeomfang (snarvei)", - "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." - }, - "search_start": { - "name": "Søkestart", - "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." - }, - "search_end": { - "name": "Søkeslutt", - "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." - }, - "search_start_time": { - "name": "Søkestart-klokkeslett", - "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." - }, - "search_start_day_offset": { - "name": "Søkestart dagsforskyvning", - "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." - }, - "search_end_time": { - "name": "Søkeslutt-klokkeslett", - "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." - }, - "search_end_day_offset": { - "name": "Søkeslutt dagsforskyvning", - "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." - }, - "search_start_offset_minutes": { - "name": "Søkestart-forskyvning (minutter)", - "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." - }, - "search_end_offset_minutes": { - "name": "Søkeslutt-forskyvning (minutter)", - "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." - }, - "include_current_interval": { - "name": "Inkluder gjeldende intervall", - "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." - }, - "max_price_level": { - "name": "Maksimalt prisnivaae", - "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." - }, - "min_price_level": { - "name": "Minimalt prisnivaae", - "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." - }, - "use_base_unit": { - "name": "Bruk basisvaluta", - "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." - } - } + }, + "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": "⌀ Pris i dag" + }, + "lowest_price_tomorrow": { + "name": "Morgendagens laveste pris" + }, + "highest_price_tomorrow": { + "name": "Morgendagens høyeste pris" + }, + "average_price_tomorrow": { + "name": "⌀ Pris i morgen" + }, + "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": "⌀ Pris glidende 24t" + }, + "leading_price_average": { + "name": "⌀ Pris fremtidig 24t" + }, + "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 timeprisvurdering", + "state": { + "low": "Lav", + "normal": "Normal", + "high": "Høy" + } + }, + "next_hour_price_rating": { + "name": "Neste timeprisvurdering", + "state": { + "low": "Lav", + "normal": "Normal", + "high": "Høy" + } + }, + "next_avg_1h": { + "name": "⌀ Pris neste 1t" + }, + "next_avg_2h": { + "name": "⌀ Pris neste 2t" + }, + "next_avg_3h": { + "name": "⌀ Pris neste 3t" + }, + "next_avg_4h": { + "name": "⌀ Pris neste 4t" + }, + "next_avg_5h": { + "name": "⌀ Pris neste 5t" + }, + "next_avg_6h": { + "name": "⌀ Pris neste 6t" + }, + "next_avg_8h": { + "name": "⌀ Pris neste 8t" + }, + "next_avg_12h": { + "name": "⌀ Pris neste 12t" + }, + "price_outlook_1h": { + "name": "Prisutblikk (1t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_2h": { + "name": "Prisutblikk (2t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_3h": { + "name": "Prisutblikk (3t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_4h": { + "name": "Prisutblikk (4t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_5h": { + "name": "Prisutblikk (5t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_6h": { + "name": "Prisutblikk (6t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_8h": { + "name": "Prisutblikk (8t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_outlook_12h": { + "name": "Prisutblikk (12t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_2h": { + "name": "Prisforløp (2t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_3h": { + "name": "Prisforløp (3t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_4h": { + "name": "Prisforløp (4t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_5h": { + "name": "Prisforløp (5t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_6h": { + "name": "Prisforløp (6t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_8h": { + "name": "Prisforløp (8t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "price_trajectory_12h": { + "name": "Prisforløp (12t)", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "current_price_trend": { + "name": "Nåværende pristrend", + "state": { + "strongly_rising": "Sterkt stigende", + "rising": "Stigende", + "stable": "Stabil", + "falling": "Fallende", + "strongly_falling": "Sterkt fallende" + } + }, + "next_price_trend_change": { + "name": "Neste trendendring" + }, + "next_price_trend_change_in": { + "name": "Neste trendendring om" + }, + "daily_rating": { + "name": "Daglig prisvurdering" + }, + "monthly_rating": { + "name": "Månedlig prisvurdering" + }, + "data_lifecycle_status": { + "name": "Datalivssyklus-status", + "state": { + "cached": "Hurtigbufret", + "fresh": "Fersk", + "refreshing": "Oppdaterer", + "searching_tomorrow": "Søker morgendagens data", + "turnover_pending": "Midnattskifte venter", + "error": "Feil" + } + }, + "today_volatility": { + "name": "Volatilitet i dag", + "state": { + "low": "Lav", + "moderate": "Moderat", + "high": "Høy", + "very_high": "Svært Høy" + } + }, + "tomorrow_volatility": { + "name": "Volatilitet i morgen", + "state": { + "low": "Lav", + "moderate": "Moderat", + "high": "Høy", + "very_high": "Svært Høy" + } + }, + "next_24h_volatility": { + "name": "Volatilitet neste 24t", + "state": { + "low": "Lav", + "moderate": "Moderat", + "high": "Høy", + "very_high": "Svært Høy" + } + }, + "today_tomorrow_volatility": { + "name": "Volatilitet i dag+i morgen", + "state": { + "low": "Lav", + "moderate": "Moderat", + "high": "Høy", + "very_high": "Svært Høy" + } + }, + "best_price_end_time": { + "name": "Beste pris slutter" + }, + "best_price_period_duration": { + "name": "Beste pris varighet" + }, + "best_price_remaining_minutes": { + "name": "Beste pris gjenværende tid" + }, + "best_price_progress": { + "name": "Beste pris fremgang" + }, + "best_price_next_start_time": { + "name": "Beste pris starter" + }, + "best_price_next_in_minutes": { + "name": "Beste pris starter om" + }, + "peak_price_end_time": { + "name": "Topppris slutter" + }, + "peak_price_period_duration": { + "name": "Topppris varighet" + }, + "peak_price_remaining_minutes": { + "name": "Topppris gjenværende tid" + }, + "peak_price_progress": { + "name": "Topppris fremgang" + }, + "peak_price_next_start_time": { + "name": "Topppris starter" + }, + "peak_price_next_in_minutes": { + "name": "Topppris starter om" + }, + "home_type": { + "name": "Boligtype", + "state": { + "apartment": "Leilighet", + "rowhouse": "Rekkehus", + "house": "Hus", + "cottage": "Hytte" + } + }, + "home_size": { + "name": "Boligareal" + }, + "main_fuse_size": { + "name": "Hovedsikring" + }, + "number_of_residents": { + "name": "Antall beboere" + }, + "primary_heating_source": { + "name": "Primær varmekilde", + "state": { + "air2air_heatpump": "Luft-til-luft-varmepumpe", + "air2water_heatpump": "Luft-til-vann-varmepumpe", + "boiler": "Varmtvannsbereder", + "central_heating": "Sentralvarme", + "district_heating": "Fjernvarme", + "district": "Fjernvarme", + "electric_boiler": "Elektrisk varmtvannsbereder", + "electricity": "Elektrisitet", + "floor": "Gulvvarme", + "gas": "Gass", + "ground_heatpump": "Jordvarmepumpe", + "ground": "Jordvarmepumpe", + "oil": "Olje", + "other": "Annet", + "waste": "Spillvarme" + } + }, + "grid_company": { + "name": "Nettselskap" + }, + "grid_area_code": { + "name": "Nettområdekode" + }, + "price_area_code": { + "name": "Prisområdekode" + }, + "consumption_ean": { + "name": "Forbruks-EAN" + }, + "production_ean": { + "name": "Produksjons-EAN" + }, + "energy_tax_type": { + "name": "Energiavgiftstype" + }, + "vat_type": { + "name": "MVA-type" + }, + "estimated_annual_consumption": { + "name": "Estimert årlig forbruk" + }, + "subscription_status": { + "name": "Abonnementsstatus", + "state": { + "running": "Aktiv", + "ended": "Avsluttet", + "pending": "Venter", + "unknown": "Ukjent" + } + }, + "day_pattern_yesterday": { + "name": "Prismønster i går", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dobbel dal", + "double_peak": "Dobbel topp", + "flat": "Flat", + "rising": "Stigende", + "falling": "Fallende", + "mixed": "Blandet" + } + }, + "day_pattern_today": { + "name": "Prismønster i dag", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dobbel dal", + "double_peak": "Dobbel topp", + "flat": "Flat", + "rising": "Stigende", + "falling": "Fallende", + "mixed": "Blandet" + } + }, + "day_pattern_tomorrow": { + "name": "Prismønster i morgen", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dobbel dal", + "double_peak": "Dobbel topp", + "flat": "Flat", + "rising": "Stigende", + "falling": "Fallende", + "mixed": "Blandet" + } + }, + "chart_data_export": { + "name": "Diagramdataeksport", + "state": { + "pending": "Venter", + "ready": "Klar", + "error": "Feil" + } + }, + "chart_metadata": { + "name": "Diagrammetadata", + "state": { + "pending": "Venter", + "ready": "Klar", + "error": "Feil" + } + } }, - "selector": { - "account_choice": { - "options": { - "new_token": "Legg til ny Tibber-konto med API-token" - } + "binary_sensor": { + "peak_price_period": { + "name": "Toppris-periode" + }, + "best_price_period": { + "name": "Lavpris-periode" + }, + "connection": { + "name": "Tibber API-tilkobling" + }, + "tomorrow_data_available": { + "name": "Morgendagens data tilgjengelig" + }, + "has_ventilation_system": { + "name": "Har ventilasjonsanlegg" + }, + "realtime_consumption_enabled": { + "name": "Sanntidsforbruk aktivert" + } + }, + "number": { + "best_price_flex_override": { + "name": "Beste pris: Fleksibilitet" + }, + "best_price_min_distance_override": { + "name": "Beste pris: Minimumsavstand" + }, + "best_price_min_period_length_override": { + "name": "Beste pris: Minimum periodelengde" + }, + "best_price_min_periods_override": { + "name": "Beste pris: Minimum perioder" + }, + "best_price_relaxation_attempts_override": { + "name": "Beste pris: Lemping forsøk" + }, + "best_price_gap_count_override": { + "name": "Beste pris: Gaptoleranse" + }, + "peak_price_flex_override": { + "name": "Topppris: Fleksibilitet" + }, + "peak_price_min_distance_override": { + "name": "Topppris: Minimumsavstand" + }, + "peak_price_min_period_length_override": { + "name": "Topppris: Minimum periodelengde" + }, + "peak_price_min_periods_override": { + "name": "Topppris: Minimum perioder" + }, + "peak_price_relaxation_attempts_override": { + "name": "Topppris: Lemping forsøk" + }, + "peak_price_gap_count_override": { + "name": "Topppris: Gaptoleranse" + } + }, + "switch": { + "best_price_enable_relaxation_override": { + "name": "Beste pris: Oppnå minimumsantall" + }, + "peak_price_enable_relaxation_override": { + "name": "Topppris: Oppnå minimumsantall" + } + } + }, + "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." + }, + "tomorrow_data_missing": { + "title": "Prisdata for i morgen mangler for {home_name}", + "description": "Strømprisdata for i morgen er fortsatt utilgjengelig etter {warning_hour}:00. Dette er uvanlig, da Tibber vanligvis publiserer morgendagens priser på ettermiddagen (rundt 13:00-14:00 CET).\n\nMulige årsaker:\n- Tibber har ikke publisert morgendagens priser ennå\n- Midlertidige API-problemer\n- Strømleverandøren din har ikke sendt inn priser til Tibber\n\nDette problemet vil løse seg automatisk når morgendagens data blir tilgjengelig. Hvis dette vedvarer etter 20:00, vennligst sjekk Tibber-appen eller kontakt Tibber-support." + }, + "rate_limit_exceeded": { + "title": "API-hastighetsbegrensning overskredet for {home_name}", + "description": "Tibber-APIet har hastighetsbegrenset denne integrasjonen etter {error_count} påfølgende feil. Dette betyr at forespørsler blir gjort for hyppig.\n\nIntegrasjonen vil automatisk prøve på nytt med økende forsinkelser. Dette problemet vil løse seg når hastighetsbegrensningen utløper.\n\nHvis dette vedvarer i flere timer, vurder:\n- Å sjekke om flere Home Assistant-instanser bruker samme API-token\n- Å verifisere at ingen andre applikasjoner bruker Tibber-API-tokenet ditt mye\n- Å redusere oppdateringsfrekvensen hvis du har tilpasset den" + }, + "home_not_found": { + "title": "Hjemmet {home_name} ble ikke funnet i Tibber-kontoen", + "description": "Hjemmet konfigurert i denne integrasjonen (oppførings-ID: {entry_id}) er ikke lenger tilgjengelig i Tibber-kontoen din. Dette skjer vanligvis når:\n- Hjemmet ble slettet fra Tibber-kontoen din\n- Hjemmet ble flyttet til en annen Tibber-konto\n- Tilgang til dette hjemmet ble tilbakekalt\n\nVennligst fjern denne integrasjonsoppføringen og legg den til på nytt hvis hjemmet fortsatt skal overvåkes. For å fjerne denne oppføringen, gå til Innstillinger → Enheter og tjenester → Tibber Prices og slett {home_name}-konfigurasjonen." + }, + "entity_migration": { + "title": "Tibber Prices: Handling kreves etter oppdatering ({home_name})", + "description": "Denne oppdateringen inkluderer endringer som ble brukt automatisk.\n\n**Omdøpte entiteter ({count})**\n\nFølgende entity-nøkler ble omdøpt. Dine eksisterende entity-ID-er og automatiseringer forblir intakte:\n\n{entity_list}\n\n**Endrede varighetssensorverdier**\n\nAlle varighetssensorer (gjenværende tid, starter om, periodevarighet, trendendrings-nedtelling) rapporterer nå tilstandsverdien i **minutter** i stedet for timer. Visningsenheten i dashboards forblir timer som standard.\n\nHvis du har automatiseringer med numeriske sammenligninger på disse sensorene, oppdater tersklene:\n- Gammelt: `state < 0.25` (15 minutter som timer)\n- Nytt: `state < 15` (15 minutter)\n\nAvvis dette varselet etter å ha gjennomgått automatiseringene dine." + } + }, + "exceptions": { + "no_entries_found": { + "message": "Ingen Tibber Prices integrasjonsoppføringer funnet. Vennligst sett opp integrasjonen først." + }, + "multiple_entries_no_entry_id": { + "message": "Flere Tibber Prices oppføringer funnet. Vennligst angi 'entry_id' for å velge hvilken oppføring som skal brukes." + }, + "invalid_entry_id": { + "message": "Ugyldig eller utilgjengelig konfigurasjonsoppføring. Vennligst sjekk oppførings-ID-en og sørg for at integrasjonen er lastet." + }, + "missing_home_id": { + "message": "Hjemme-ID ikke funnet i konfigurasjonsoppføringen. Vennligst rekonfigurer integrasjonen." + }, + "user_data_not_available": { + "message": "Brukerdata er ikke tilgjengelig ennå. Vennligst vent til den første dataoppdateringen er fullført." + }, + "timezone_not_found": { + "message": "Kunne ikke bestemme hjemmets tidssone. Vennligst sjekk hjemmekonfigurasjonen i Tibber-kontoen din." + }, + "end_before_start": { + "message": "Sluttid må være etter starttid." + }, + "price_fetch_failed": { + "message": "Kunne ikke hente prisdata fra Tibber API. Vennligst prøv igjen senere." + }, + "invalid_search_scope": { + "message": "Ugyldig søkeområde. Gyldige verdier er: today, tomorrow, remaining_today, next_24h, next_48h." + }, + "scope_conflicts_with_range": { + "message": "search_scope kan ikke kombineres med eksplisitte områdeparametre: {params}. Bruk enten search_scope ELLER eksplisitte start-/sluttparametre." + }, + "day_offset_requires_time": { + "message": "{offset_param} krever at {time_param} er satt. Dagsforskyvning endrer kun datoen til en eksplisitt tidsparameter." + }, + "min_level_exceeds_max": { + "message": "min_price_level '{min_level}' er høyere enn max_price_level '{max_level}'. Minimumsnivået må være lik eller lavere enn maksimumsnivået." + }, + "power_profile_length_mismatch": { + "message": "power_profile har {profile_length} oppføringer, men varigheten krever {interval_count} intervaller ({duration_minutes} minutter). power_profile må ha nøyaktig én oppføring per 15-minutters intervall." + }, + "level_and_rating_filter_conflict": { + "message": "level_filter og rating_level_filter kan ikke brukes sammen. Bruk kun én filtertype per forespørsel." + }, + "insert_nulls_requires_filter": { + "message": "insert_nulls-modus '{mode}' krever en level_filter eller rating_level_filter for å definere segmenter. Uten filter, bruk insert_nulls: none." + }, + "connect_segments_requires_segments_mode": { + "message": "connect_segments krever at insert_nulls er satt til 'segments'. Sett insert_nulls: segments for å bruke segmentforbindelse." + }, + "array_fields_requires_array_format": { + "message": "array_fields kan kun brukes med output_format: array_of_arrays. Endre utdataformatet eller fjern array_fields." + }, + "invalid_array_fields": { + "message": "Ugyldig array_fields-mal. Bruk feltnavn i krøllparenteser, f.eks. '{start_time}, {price_per_kwh}, {level}'." + } + }, + "services": { + "get_price": { + "name": "Hent prisdata", + "description": "Hent prisdata for et spesifikt tidsrom med automatisk ruting. Utviklings- og testtjeneste for price_info_for_range API-funksjonen. Bruker automatisk PRICE_INFO, PRICE_INFO_RANGE eller begge basert på tidsromgrensen.", + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfigurasjonsoppførings-IDen for Tibber-integrasjonen." + }, + "start_time": { + "name": "Starttid", + "description": "Start av tidsrommet (inklusiv, tidssonetilpasset)." + }, + "end_time": { + "name": "Sluttid", + "description": "Slutt av tidsrommet (eksklusiv, tidssonetilpasset)." + } + } + }, + "get_apexcharts_yaml": { + "name": "Hent ApexCharts-kort YAML", + "description": "⚠️ VIKTIG: Denne tjenesten genererer en GRUNNLEGGENDE EKSEMPEL-konfigurasjon for ApexCharts-kort som et utgangspunkt. Det er IKKE en komplett løsning for alle ApexCharts-funksjoner. Denne integrasjonen er primært en DATALEVERANDØR. Den genererte YAML-en demonstrerer hvordan du bruker `get_chartdata`-tjenesten for å hente prisdata. På grunn av den segmenterte naturen til våre data (forskjellige tidsperioder per serie) og bruken av Home Assistants service-API i stedet for entitetsattributter, er mange avanserte ApexCharts-funksjoner (som in_header, visse transformasjoner) ikke kompatible eller krever manuell tilpasning. Du er velkommen til å tilpasse den genererte YAML for dine spesifikke behov, men vær oppmerksom på at omfattende ApexCharts-konfigurasjonsstøtte er utenfor rammen av denne integrasjonen. Bidrag fra fellesskapet med forbedrede konfigurasjoner er alltid velkomne - hvis du finner en bedre oppsett som fungerer, vennligst del det slik at alle kan dra nytte av det! For direkte datatilgang for å bygge dine egne diagrammer, bruk `get_chartdata`-tjenesten i stedet.", + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfigureringsoppførings-IDen for Tibber-integrasjonen." }, "day": { - "options": { - "yesterday": "I går", - "today": "I dag", - "tomorrow": "I morgen", - "rolling_window": "Rullerende vindu", - "rolling_window_autozoom": "Rullerende vindu (Auto-Zoom)" - } - }, - "resolution": { - "options": { - "interval": "Intervall (15 min)", - "hourly": "Hver time" - } - }, - "output_format": { - "options": { - "array_of_objects": "Array av objekter", - "array_of_arrays": "Array av arrays" - } + "name": "Dag", + "description": "Hvilken dag som skal visualiseres (standard: Rullerende vindu). Faste dagalternativer (I går/I dag/I morgen) viser 24t-spenn uten ekstra avhengigheter. Dynamiske alternativer krever config-template-card: Rullerende vindu lager et fast 48t-vindu som automatisk skifter mellom i går+i dag og i dag+i morgen basert på datatilgjengelighet. Rullerende vindu (Auto-Zoom) oppfører seg likt, men zoomer i tillegg automatisk inn (2t tilbakeblikk + gjenværende tid til midnatt, graph_span reduseres hvert 15. minutt)." }, "level_type": { - "options": { - "rating_level": "Vurderingsnivå (lav/normal/høy)", - "level": "Tibber-nivå (veldig billig til veldig dyr)" - } + "name": "Nivåtype", + "description": "Velg hvilken prisnivåklassifisering som skal visualiseres: 'rating_level' (lav/normal/høy basert på dine konfigurerte terskelverdier) eller 'level' (Tibber API-nivåer: veldig billig/billig/normal/dyr/veldig dyr)." + }, + "highlight_best_price": { + "name": "Fremhev beste prisperioder", + "description": "Legg til et halvgjennomsiktig grønt overlegg for å fremheve de beste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere de optimale tidene for energiforbruk." + }, + "highlight_peak_price": { + "name": "Fremhev høyeste prisperioder", + "description": "Legg til et halvgjennomsiktig rødt overlegg for å fremheve de høyeste prisperiodene i diagrammet. Dette gjør det enkelt å visuelt identifisere tidene når energi er dyrest." + }, + "resolution": { + "name": "Oppløsning", + "description": "Tidsoppløsning for diagramdata. 'interval' (standard): Opprinnelige 15-minutters intervaller (96 punkter per dag). 'hourly': Aggregerte timeverdier med et rullende 60-minutters vindu (24 punkter per dag) for et ryddigere og mindre rotete diagram." + } + } + }, + "get_chartdata": { + "name": "Hent diagramdata", + "description": "Returnerer prisdata i et enkelt diagramvennlig format kompatibelt med Tibber Core-integrasjonens utdatastruktur. Perfekt for bruk med populære diagramkort som ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card eller den innebygde History Graph Card. Feltnavn og datastruktur kan tilpasses for å matche diagrammets krav.", + "sections": { + "general": { + "name": "Generelt", + "description": "Basisalternativer for henting av diagramdata." + }, + "selection": { + "name": "Valg", + "description": "Velg hvilke data som skal inkluderes i utdataene." + }, + "filters": { + "name": "Filtre", + "description": "Filtrer data basert på prisnivåer, prisvurderinger eller spesielle perioder." + }, + "transformation": { + "name": "Transformer data", + "description": "Transformer datautdataene for bedre diagramkompatibilitet." + }, + "format": { + "name": "Format", + "description": "Tilpass utdataformatet." + }, + "arrays_of_arrays": { + "name": "Avanserte utdatainnstillinger: Array av arrays", + "description": "Innstillinger for utdataformat ved bruk av array av arrays." + }, + "arrays_of_objects": { + "name": "Avanserte utdatainnstillinger: Array av objekter", + "description": "Innstillinger for utdataformat ved bruk av array av objekter." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "day": { + "name": "Dag", + "description": "Hvilken dag(er) skal det hentes priser for. Du kan velge flere dager. Hvis ikke angitt, returneres et rullerende 2-dagers vindu: i dag+i morgen (når morgendagens data er tilgjengelig) eller i går+i dag (når morgendagens data ikke er tilgjengelig ennå). Dette gir kontinuerlig diagramvisning uten hull." + }, + "resolution": { + "name": "Oppløsning", + "description": "Tidsoppløsning for de returnerte dataene. Alternativer: 'interval' (standard, 15-minutters intervaller, 96 datapunkter per dag), 'hourly' (timegjennomsnitt, 24 datapunkter per dag)." + }, + "output_format": { + "name": "Utdataformat", + "description": "Utdataformat for de returnerte dataene. Alternativer: 'array_of_objects' (standard, array av objekter med tilpassbare feltnavn), 'array_of_arrays' (array av [tidsstempel, pris]-arrays med avsluttende null-punkt for stepline-diagrammer)." + }, + "array_fields": { + "name": "Array-felt", + "description": "Definer hvilke felt som skal inkluderes. Bruk feltnavn i krøllparenteser, adskilt med komma. Tilgjengelige felt: start_time, price_per_kwh, level, rating_level, average. Felt vil automatisk aktiveres selv om include_*-alternativene ikke er satt. La stå tom for standard (kun tidsstempel og pris)." + }, + "subunit_currency": { + "name": "Underenhet valuta", + "description": "Returner priser i underenhet valutaenheter (øre for NOK/SEK, cent for EUR) i stedet for basisvalutaenheter. Deaktivert som standard." + }, + "round_decimals": { + "name": "Rund desimaler", + "description": "Antall desimalplasser å runde priser til (0-10). Hvis ikke angitt, brukes standard presisjon (4 desimaler for basisvaluta, 2 for underenhet valuta)." + }, + "include_level": { + "name": "Inkluder prisnivå", + "description": "Inkluder Tibber-prisnivåfeltet (veldig billig/billig/normal/dyr/veldig dyr) i hvert datapunkt." + }, + "include_rating_level": { + "name": "Inkluder prisvurdering", + "description": "Inkluder det beregnede prisvurderingsfeltet (lav/normal/høy) basert på dine konfigurerte terskler i hvert datapunkt." + }, + "include_average": { + "name": "Inkluder gjennomsnitt", + "description": "Inkluder daglig gjennomsnittspris i hvert datapunkt for sammenligning." + }, + "include_energy": { + "name": "Inkluder energipris", + "description": "Inkluder rå energi-/spotpris (ekskludert skatter og avgifter) i hvert datapunkt. Dette er 'energy'-feltet fra Tibber-APIet, nyttig for innmatings-/nettomålingsberegninger." + }, + "include_tax": { + "name": "Inkluder skatt", + "description": "Inkluder skatteandelen av prisen i hvert datapunkt. Dette er 'tax'-feltet fra Tibber-APIet, som representerer avgifter, skatter og nettleie." }, "level_filter": { - "options": { - "very_cheap": "Veldig billig", - "cheap": "Billig", - "normal": "Normal", - "expensive": "Dyr", - "very_expensive": "Veldig dyr" - } + "name": "Prisnivåfilter", + "description": "Filtrer intervaller for å bare inkludere spesifikke Tibber-prisnivåer (veldig billig/billig/normal/dyr/veldig dyr). Hvis ikke angitt, inkluderes alle nivåer." }, "rating_level_filter": { - "options": { - "low": "Lav", - "normal": "Normal", - "high": "Høy" - } - }, - "insert_nulls": { - "options": { - "none": "Ingen", - "segments": "Segmenter", - "all": "Alle" - } + "name": "Prisvurderingsfilter", + "description": "Filtrer intervaller for å inkludere bare spesifikke prisvurderinger (lav/normal/høy). Hvis ikke spesifisert, inkluderes alle vurderinger." }, "period_filter": { - "options": { - "best_price": "Beste prisperioder", - "peak_price": "Topp prisperioder" - } + "name": "Periodefilter", + "description": "Filtrer intervaller for å inkludere kun de innenfor Beste pris- eller Topp pris-perioder. Alternativer: 'best_price' (kun intervaller i Beste pris-perioder), 'peak_price' (kun intervaller i Topp pris-perioder). Hvis ikke spesifisert, inkluderes alle intervaller. Bruker forhåndsberegnede periodedata fra binære sensorer." + }, + "insert_nulls": { + "name": "Sett inn NULL-verdier", + "description": "Kontroller innsetting av NULL-verdier for filtrerte data. 'none' (standard): Ingen NULL-verdier, bare matchende intervaller. 'segments': Legg til NULL-punkter ved segmentgrenser for rene hull i diagrammer (anbefalt for trinnlinjediagrammer). 'all': Sett inn NULL for alle tidsstempler der filteret ikke samsvarer (nyttig for kontinuerlig tidsserievisualisering)." + }, + "connect_segments": { + "name": "Koble segmenter", + "description": "[KUN MED 'Sett inn NULL-verdier'] Når aktivert, legges tilkoblingspunkter til ved segmentgrenser for å visuelt koble ulike prisnivå-segmenter i trinnlinjediagrammer. Når prisen går NED, legges et punkt med lavere pris til på slutten av gjeldende segment. Når prisen går OPP, legges et holdepunkt til før hullet. Dette skaper jevne visuelle overganger mellom segmenter i stedet for brå hull." + }, + "add_trailing_null": { + "name": "Legg til avsluttende null-punkt", + "description": "Legg til et siste datapunkt med nullverdier (unntatt tidsstempel) på slutten. Noen diagrambiblioteker trenger dette for å forhindre ekstrapolering/interpolering til visningsportens kant ved bruk av trinnlinje-rendering. La være deaktivert med mindre diagrammet ditt krever det." + }, + "start_time_field": { + "name": "Starttid-feltnavn", + "description": "Egendefinert navn for starttid-feltet i utdata. Standard er 'start_time' hvis ikke angitt." + }, + "end_time_field": { + "name": "Sluttid-feltnavn", + "description": "Egendefinert navn for sluttid-feltet i utdata. Standard er 'end_time' hvis ikke angitt. Brukes kun med period_filter." + }, + "price_field": { + "name": "Prisfelt-navn", + "description": "Tilpasset navn for prisfeltet i utdata. Standard er 'price_per_kwh'." + }, + "level_field": { + "name": "Prisnivåfelt-navn", + "description": "Tilpasset navn for prisnivåfeltet i utdata. Standard er 'level'. Brukes bare når include_level er aktivert." + }, + "rating_level_field": { + "name": "Prisvurderingsfelt-navn", + "description": "Tilpasset navn for prisvurderingsfeltet i utdata. Standard er 'rating_level'. Brukes bare når include_rating_level er aktivert." + }, + "average_field": { + "name": "Gjennomsnittsfelt-navn", + "description": "Tilpasset navn for gjennomsnittsfeltet i utdata. Standard er 'average'. Brukes bare når include_average er aktivert." + }, + "energy_field": { + "name": "Energiprisfelt-navn", + "description": "Tilpasset navn for energiprisfeltet i utdata. Standard er 'energy_price'. Brukes bare når include_energy er aktivert." + }, + "tax_field": { + "name": "Skattefelt-navn", + "description": "Tilpasset navn for skattefeltet i utdata. Standard er 'tax'. Brukes bare når include_tax er aktivert." }, "metadata": { - "options": { - "include": "Inkluder (data + metadata)", - "only": "Kun metadata", - "none": "Ingen (kun data)" - } + "name": "Metadata", + "description": "Kontroller metadata-inkludering i svaret. 'include' (standard): Returnerer både diagramdata og metadata med prisstatistikk, valutainformasjon, Y-akse forslag og tidsperiode. 'only': Returnerer bare metadata uten å behandle diagramdata (raskt, nyttig for dynamisk Y-akse konfigurasjon). 'none': Returnerer bare diagramdata uten metadata." }, - "volatility": { - "options": { - "low": "Lav", - "moderate": "Moderat", - "high": "Høy", - "very_high": "Svært høy" - } + "data_key": { + "name": "Datanøkkel", + "description": "Tilpasset navn for datanøkkelen på toppnivå i svaret. Standard er 'data' hvis ikke angitt." + } + } + }, + "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." + } + } + }, + "find_cheapest_block": { + "name": "Finn billigste blokk", + "description": "Finner det billigste sammenhengende tidsvinduet med en gitt varighet. Designet for apparatplanlegging: oppvaskmaskin, vaskemaskin, tørketrommel osv. Returnerer det billigste vinduet med start-/sluttider og prisstatistikk.", + "sections": { + "search_range": { + "name": "Soekeomraade", + "description": "Definer tidsvinduet for soeket." }, - "current_interval_price_level": { - "options": { - "any": "Alle", - "very_cheap": "Svært billig", - "cheap": "Billig", - "normal": "Normal", - "expensive": "Dyr", - "very_expensive": "Svært dyr" - } + "time_alternatives": { + "name": "Alternative tidsalternativer", + "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." }, - "currency_display_mode": { - "options": { - "base": "Basisvaluta (€, kr)", - "subunit": "Underenhet valuta (ct, øre)" - } + "price_filter": { + "name": "Prisnivaae-filter", + "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." }, - "average_sensor_display": { - "options": { - "median": "Median", - "mean": "Aritmetisk gjennomsnitt" - } + "output": { + "name": "Utdata-alternativer", + "description": "Styr kostnadsestimat og sammenligningsutdata." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "duration": { + "name": "Varighet", + "description": "Lengden på det ønskede sammenhengende vinduet. Rundes automatisk opp til nærmeste kvarter. Maksimum: 12 timer." + }, + "search_start": { + "name": "Søkestart", + "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." + }, + "search_end": { + "name": "Søkeslutt", + "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." + }, + "search_start_time": { + "name": "Søkestart-klokkeslett", + "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." + }, + "search_start_day_offset": { + "name": "Søkestart dagsforskyvning", + "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." + }, + "search_end_time": { + "name": "Søkeslutt-klokkeslett", + "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." + }, + "search_end_day_offset": { + "name": "Søkeslutt dagsforskyvning", + "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." + }, + "search_start_offset_minutes": { + "name": "Søkestart-forskyvning (minutter)", + "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." + }, + "search_end_offset_minutes": { + "name": "Søkeslutt-forskyvning (minutter)", + "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." + }, + "include_current_interval": { + "name": "Inkluder gjeldende intervall", + "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." + }, + "use_base_unit": { + "name": "Bruk basisvaluta", + "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." }, "search_scope": { - "options": { - "today": "I dag", - "tomorrow": "I morgen", - "remaining_today": "Resten av dagen", - "next_24h": "Neste 24 timer", - "next_48h": "Neste 48 timer" - } + "name": "Soekeomfang (snarvei)", + "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." + }, + "max_price_level": { + "name": "Maksimalt prisnivaae", + "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." + }, + "min_price_level": { + "name": "Minimalt prisnivaae", + "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." + }, + "include_comparison_details": { + "name": "Inkluder sammenligningsdetaljer", + "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." } + } }, - "title": "Tibber Prisinformasjon & Vurderinger" + "find_most_expensive_block": { + "name": "Finn dyreste blokk", + "description": "Finner det dyreste sammenhengende tidsvinduet med en gitt varighet. Nyttig for å identifisere topprisperioder som bør unngås. Returnerer det dyreste vinduet med start-/sluttider og prisstatistikk.", + "sections": { + "search_range": { + "name": "Soekeomraade", + "description": "Definer tidsvinduet for soeket." + }, + "time_alternatives": { + "name": "Alternative tidsalternativer", + "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." + }, + "price_filter": { + "name": "Prisnivaae-filter", + "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." + }, + "output": { + "name": "Utdata-alternativer", + "description": "Styr kostnadsestimat og sammenligningsutdata." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "duration": { + "name": "Varighet", + "description": "Lengden på det ønskede sammenhengende vinduet. Rundes automatisk opp til nærmeste kvarter. Maksimum: 12 timer." + }, + "search_start": { + "name": "Søkestart", + "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." + }, + "search_end": { + "name": "Søkeslutt", + "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." + }, + "search_start_time": { + "name": "Søkestart-klokkeslett", + "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." + }, + "search_start_day_offset": { + "name": "Søkestart dagsforskyvning", + "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." + }, + "search_end_time": { + "name": "Søkeslutt-klokkeslett", + "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." + }, + "search_end_day_offset": { + "name": "Søkeslutt dagsforskyvning", + "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." + }, + "search_start_offset_minutes": { + "name": "Søkestart-forskyvning (minutter)", + "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." + }, + "search_end_offset_minutes": { + "name": "Søkeslutt-forskyvning (minutter)", + "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." + }, + "include_current_interval": { + "name": "Inkluder gjeldende intervall", + "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." + }, + "use_base_unit": { + "name": "Bruk basisvaluta", + "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." + }, + "search_scope": { + "name": "Soekeomfang (snarvei)", + "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." + }, + "max_price_level": { + "name": "Maksimalt prisnivaae", + "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." + }, + "min_price_level": { + "name": "Minimalt prisnivaae", + "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." + }, + "include_comparison_details": { + "name": "Inkluder sammenligningsdetaljer", + "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." + } + } + }, + "find_cheapest_hours": { + "name": "Finn billigste timer", + "description": "Finner de billigste intervallene for en gitt total varighet, ikke nødvendigvis sammenhengende. Designet for fleksible laster: batterilading, elbil, varmtvannsbereder. Returnerer en tidsplan med intervaller gruppert i sammenhengende segmenter.", + "sections": { + "search_range": { + "name": "Soekeomraade", + "description": "Definer tidsvinduet for soeket." + }, + "time_alternatives": { + "name": "Alternative tidsalternativer", + "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." + }, + "price_filter": { + "name": "Prisnivaae-filter", + "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." + }, + "output": { + "name": "Utdata-alternativer", + "description": "Styr kostnadsestimat og sammenligningsutdata." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "duration": { + "name": "Varighet", + "description": "Nødvendig billig total tid. Rundes automatisk opp til nærmeste kvarter. Maksimum: 24 timer." + }, + "search_start": { + "name": "Søkestart", + "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." + }, + "search_end": { + "name": "Søkeslutt", + "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." + }, + "search_start_time": { + "name": "Søkestart-klokkeslett", + "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." + }, + "search_start_day_offset": { + "name": "Søkestart dagsforskyvning", + "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." + }, + "search_end_time": { + "name": "Søkeslutt-klokkeslett", + "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." + }, + "search_end_day_offset": { + "name": "Søkeslutt dagsforskyvning", + "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." + }, + "search_start_offset_minutes": { + "name": "Søkestart-forskyvning (minutter)", + "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." + }, + "search_end_offset_minutes": { + "name": "Søkeslutt-forskyvning (minutter)", + "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." + }, + "include_current_interval": { + "name": "Inkluder gjeldende intervall", + "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." + }, + "min_segment_duration": { + "name": "Minimum segmentvarighet", + "description": "Minimum sammenhengende kjøretid. Forhindrer rask av/på-sykling for enheter med minimum kjøretid. Rundes automatisk opp til nærmeste kvarter. Standard: 15 minutter. Maksimum: 4 timer." + }, + "use_base_unit": { + "name": "Bruk basisvaluta", + "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." + }, + "search_scope": { + "name": "Soekeomfang (snarvei)", + "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." + }, + "max_price_level": { + "name": "Maksimalt prisnivaae", + "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." + }, + "min_price_level": { + "name": "Minimalt prisnivaae", + "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." + }, + "include_comparison_details": { + "name": "Inkluder sammenligningsdetaljer", + "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." + } + } + }, + "find_most_expensive_hours": { + "name": "Finn dyreste timer", + "description": "Finner de dyreste intervallene for en gitt total varighet, ikke nødvendigvis sammenhengende. Nyttig for å identifisere topprisperioder som bør unngås. Returnerer en tidsplan med intervaller gruppert i sammenhengende segmenter.", + "sections": { + "search_range": { + "name": "Soekeomraade", + "description": "Definer tidsvinduet for soeket." + }, + "time_alternatives": { + "name": "Alternative tidsalternativer", + "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." + }, + "price_filter": { + "name": "Prisnivaae-filter", + "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." + }, + "output": { + "name": "Utdata-alternativer", + "description": "Styr kostnadsestimat og sammenligningsutdata." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "duration": { + "name": "Varighet", + "description": "Dyr total tid som skal finnes. Rundes automatisk opp til nærmeste kvarter. Maksimum: 24 timer." + }, + "search_start": { + "name": "Søkestart", + "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." + }, + "search_end": { + "name": "Søkeslutt", + "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." + }, + "search_start_time": { + "name": "Søkestart-klokkeslett", + "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." + }, + "search_start_day_offset": { + "name": "Søkestart dagsforskyvning", + "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." + }, + "search_end_time": { + "name": "Søkeslutt-klokkeslett", + "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." + }, + "search_end_day_offset": { + "name": "Søkeslutt dagsforskyvning", + "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." + }, + "search_start_offset_minutes": { + "name": "Søkestart-forskyvning (minutter)", + "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." + }, + "search_end_offset_minutes": { + "name": "Søkeslutt-forskyvning (minutter)", + "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." + }, + "include_current_interval": { + "name": "Inkluder gjeldende intervall", + "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." + }, + "min_segment_duration": { + "name": "Minimum segmentvarighet", + "description": "Minimum sammenhengende kjøretid. Forhindrer rask av/på-sykling for enheter med minimum kjøretid. Rundes automatisk opp til nærmeste kvarter. Standard: 15 minutter. Maksimum: 4 timer." + }, + "use_base_unit": { + "name": "Bruk basisvaluta", + "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." + }, + "search_scope": { + "name": "Soekeomfang (snarvei)", + "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." + }, + "max_price_level": { + "name": "Maksimalt prisnivaae", + "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." + }, + "min_price_level": { + "name": "Minimalt prisnivaae", + "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." + }, + "include_comparison_details": { + "name": "Inkluder sammenligningsdetaljer", + "description": "Berik price_comparison-resultatet med tilleggsfelter: comparison_price_min, comparison_price_max og (kun blokk) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabelt effektforbruk i watt per 15-minuttersintervall. Naa satt, gjenspeiler estimated_total_cost faktisk forbruk i stedet for en fast 1 kW-last." + } + } + }, + "find_cheapest_schedule": { + "name": "Finn billigste tidsplan", + "description": "Planlegger flere apparater optimalt uten tidsoverlapp. Hver oppgave tildeles det billigste tilgjengelige sammenhengende tidsvinduet.", + "sections": { + "scheduling_options": { + "name": "Planleggingsalternativer", + "description": "Konfigurer oppgaver og pause mellom dem." + }, + "search_range": { + "name": "Soekeomraade", + "description": "Definer tidsvinduet for soeket." + }, + "time_alternatives": { + "name": "Alternative tidsalternativer", + "description": "Alternative maater aa definere soekeomraadet paa med tidspunkt og offsets." + }, + "price_filter": { + "name": "Prisnivaae-filter", + "description": "Begrens soeket til intervaller innenfor det angitte prisnivaae-omraadet." + }, + "output": { + "name": "Utdata-alternativer", + "description": "Styr kostnadsestimat og sammenligningsutdata." + } + }, + "fields": { + "entry_id": { + "name": "Oppførings-ID", + "description": "Konfig-oppførings-ID for Tibber-integrasjonen." + }, + "tasks": { + "name": "Oppgaver", + "description": "Liste over oppgaver som skal planlegges. Hver oppgave trenger name (tekst) og duration (hh:mm:ss). Eventuelt power_profile (watt per 15-min-intervall). Maks 4 oppgaver." + }, + "gap_minutes": { + "name": "Pause mellom oppgaver (minutter)", + "description": "Minimum pause i minutter mellom paafoeglende planlagte oppgaver. Avrundes opp til 15 minutter. Standard: 0 (ingen pause)." + }, + "search_scope": { + "name": "Soekeomfang (snarvei)", + "description": "Snarvei for vanlige soekeomraader. Overstyrer alle andre tidsalternativer. today/tomorrow = hele kalenderdagen, remaining_today = naa til midnatt, next_24h/next_48h = rullende vindu fra naa." + }, + "search_start": { + "name": "Søkestart", + "description": "Start av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre startalternativer. Standard er nå hvis ikke angitt." + }, + "search_end": { + "name": "Søkeslutt", + "description": "Slutt av søkeområdet som eksakt dato og tid. Høyeste prioritet — overstyrer alle andre sluttalternativer. Standard er slutten av i morgen hvis ikke angitt." + }, + "search_start_time": { + "name": "Søkestart-klokkeslett", + "description": "Alternativ: Start søk fra dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkestart (dato/tid) er satt." + }, + "search_start_day_offset": { + "name": "Søkestart dagsforskyvning", + "description": "Dagsforskyvning for Søkestart-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkestart-klokkeslett." + }, + "search_end_time": { + "name": "Søkeslutt-klokkeslett", + "description": "Alternativ: Søk til dette klokkeslettet. Kombiner med dagsforskyvning. Ignoreres hvis Søkeslutt (dato/tid) er satt." + }, + "search_end_day_offset": { + "name": "Søkeslutt dagsforskyvning", + "description": "Dagsforskyvning for Søkeslutt-klokkeslett. -7 til 2: -1 = i går, 0 = i dag, 1 = i morgen. Negative verdier søker i fortiden. Brukes kun med Søkeslutt-klokkeslett." + }, + "search_start_offset_minutes": { + "name": "Søkestart-forskyvning (minutter)", + "description": "Alternativ: Start søk dette antall minutter fra nå. Positiv = fremtid (60 = om 1 time), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkestart eller Søkestart-klokkeslett er satt." + }, + "search_end_offset_minutes": { + "name": "Søkeslutt-forskyvning (minutter)", + "description": "Alternativ: Stopp søk dette antall minutter fra nå. Positiv = fremtid (480 = om 8 timer), negativ = fortid (-60 = 1 time siden). Ignoreres hvis Søkeslutt eller Søkeslutt-klokkeslett er satt." + }, + "include_current_interval": { + "name": "Inkluder gjeldende intervall", + "description": "Inkluder det pågående 15-minutters intervallet i søket. Når aktivert (standard), starter søket ved begynnelsen av gjeldende intervall slik at det kan være en del av resultatet." + }, + "max_price_level": { + "name": "Maksimalt prisnivaae", + "description": "Ta bare med intervaller paa eller under dette Tibber-prisnivaeet. very_cheap = mest restriktivt, very_expensive = ingen begrensning." + }, + "min_price_level": { + "name": "Minimalt prisnivaae", + "description": "Ta bare med intervaller paa eller over dette Tibber-prisnivaeet. Nyttig for find_most_expensive for aa fokusere paa virkelig dyre intervaller." + }, + "use_base_unit": { + "name": "Bruk basisvaluta", + "description": "Tving priser i basisvaluta (EUR, NOK) i stedet for konfigurert visningsenhet (ct, øre). Nyttig for beregninger." + } + } + } + }, + "selector": { + "account_choice": { + "options": { + "new_token": "Legg til ny Tibber-konto med API-token" + } + }, + "day": { + "options": { + "yesterday": "I går", + "today": "I dag", + "tomorrow": "I morgen", + "rolling_window": "Rullerende vindu", + "rolling_window_autozoom": "Rullerende vindu (Auto-Zoom)" + } + }, + "resolution": { + "options": { + "interval": "Intervall (15 min)", + "hourly": "Hver time" + } + }, + "output_format": { + "options": { + "array_of_objects": "Array av objekter", + "array_of_arrays": "Array av arrays" + } + }, + "level_type": { + "options": { + "rating_level": "Vurderingsnivå (lav/normal/høy)", + "level": "Tibber-nivå (veldig billig til veldig dyr)" + } + }, + "level_filter": { + "options": { + "very_cheap": "Veldig billig", + "cheap": "Billig", + "normal": "Normal", + "expensive": "Dyr", + "very_expensive": "Veldig dyr" + } + }, + "rating_level_filter": { + "options": { + "low": "Lav", + "normal": "Normal", + "high": "Høy" + } + }, + "insert_nulls": { + "options": { + "none": "Ingen", + "segments": "Segmenter", + "all": "Alle" + } + }, + "period_filter": { + "options": { + "best_price": "Beste prisperioder", + "peak_price": "Topp prisperioder" + } + }, + "metadata": { + "options": { + "include": "Inkluder (data + metadata)", + "only": "Kun metadata", + "none": "Ingen (kun data)" + } + }, + "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" + } + }, + "currency_display_mode": { + "options": { + "base": "Basisvaluta (€, kr)", + "subunit": "Underenhet valuta (ct, øre)" + } + }, + "average_sensor_display": { + "options": { + "median": "Median", + "mean": "Aritmetisk gjennomsnitt" + } + }, + "search_scope": { + "options": { + "today": "I dag", + "tomorrow": "I morgen", + "remaining_today": "Resten av dagen", + "next_24h": "Neste 24 timer", + "next_48h": "Neste 48 timer" + } + } + }, + "title": "Tibber Prisinformasjon & Vurderinger" } diff --git a/custom_components/tibber_prices/translations/nl.json b/custom_components/tibber_prices/translations/nl.json index e5dddd2..86a55c7 100644 --- a/custom_components/tibber_prices/translations/nl.json +++ b/custom_components/tibber_prices/translations/nl.json @@ -1,1931 +1,1955 @@ { - "config": { - "step": { - "account_choice": { - "title": "Kies Account", - "description": "Je kunt een ander huis van een bestaand Tibber-account toevoegen of een nieuw API-token invoeren voor een ander account.", - "data": { - "account_choice": "Account" - }, - "submit": "Doorgaan →" - }, - "new_token": { - "title": "Voer API-Token In", - "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-toegangstoken" - }, - "submit": "Token valideren" - }, - "user": { - "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-toegangstoken" - }, - "submit": "Token valideren" - }, - "select_home": { - "description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.", - "data": { - "home_id": "Huis" - }, - "title": "Kies een Huis", - "submit": "Huis selecteren" - }, - "finish": { - "description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.", - "data": { - "home_id": "Huis-ID" - }, - "title": "Kies een huis", - "submit": "Huis selecteren" - }, - "reauth_confirm": { - "title": "Tibber Price Integratie Opnieuw Authenticeren", - "description": "Het toegangstoken voor Tibber is niet langer geldig. Voer een nieuw API-toegangstoken in om deze integratie te blijven gebruiken.\n\nOm een nieuw API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-toegangstoken" - }, - "submit": "Token bijwerken" - } + "config": { + "step": { + "account_choice": { + "title": "Kies Account", + "description": "Je kunt een ander huis van een bestaand Tibber-account toevoegen of een nieuw API-token invoeren voor een ander account.", + "data": { + "account_choice": "Account" }, - "error": { - "auth": "Het Tibber-toegangstoken is ongeldig.", - "connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.", - "unknown": "Onverwachte fout", - "cannot_connect": "Verbinding mislukt", - "invalid_access_token": "Ongeldig toegangstoken", - "missing_homes": "Het nieuwe toegangstoken heeft geen toegang tot alle geconfigureerde huizen. Gebruik een toegangstoken dat toegang heeft tot dezelfde Tibber-huizen.", - "home_already_configured": "Dit huis is al geconfigureerd in een ander item. Elk huis kan slechts één keer worden geconfigureerd.", - "no_active_subscription": "Dit huis heeft geen actief Tibber-contract. Alleen huizen met actieve elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.", - "subscription_expired": "Het Tibber-contract voor dit huis is verlopen. Alleen huizen met actieve of toekomstige elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.", - "future_subscription_warning": "Let op: Het Tibber-contract van dit huis is nog niet gestart. De functionaliteit kan beperkt zijn totdat het contract actief wordt." + "submit": "Doorgaan →" + }, + "new_token": { + "title": "Voer API-Token In", + "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-toegangstoken" }, - "abort": { - "already_configured": "Alle beschikbare Tibber-huizen zijn al geconfigureerd. Elk huis kan slechts één keer worden geconfigureerd.", - "entry_not_found": "Tibber-configuratie-item niet gevonden.", - "setup_complete": "Installatie voltooid! Je kunt extra opties voor Tibber Prices wijzigen in de integratie-opties na het sluiten van dit dialoogvenster.", - "reauth_successful": "Herauthenticatie geslaagd. De integratie is bijgewerkt met het nieuwe toegangstoken." + "submit": "Token valideren" + }, + "user": { + "description": "Stel Tibber Prijsinformatie & Beoordelingen in.\n\nOm een API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-toegangstoken" + }, + "submit": "Token valideren" + }, + "select_home": { + "description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.", + "data": { + "home_id": "Huis" + }, + "title": "Kies een Huis", + "submit": "Huis selecteren" + }, + "finish": { + "description": "Selecteer een huis om prijsinformatie en beoordelingen op te halen.", + "data": { + "home_id": "Huis-ID" + }, + "title": "Kies een huis", + "submit": "Huis selecteren" + }, + "reauth_confirm": { + "title": "Tibber Price Integratie Opnieuw Authenticeren", + "description": "Het toegangstoken voor Tibber is niet langer geldig. Voer een nieuw API-toegangstoken in om deze integratie te blijven gebruiken.\n\nOm een nieuw API-toegangstoken te genereren, bezoek [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-toegangstoken" + }, + "submit": "Token bijwerken" + } + }, + "error": { + "auth": "Het Tibber-toegangstoken is ongeldig.", + "connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.", + "unknown": "Onverwachte fout", + "cannot_connect": "Verbinding mislukt", + "invalid_access_token": "Ongeldig toegangstoken", + "missing_homes": "Het nieuwe toegangstoken heeft geen toegang tot alle geconfigureerde huizen. Gebruik een toegangstoken dat toegang heeft tot dezelfde Tibber-huizen.", + "home_already_configured": "Dit huis is al geconfigureerd in een ander item. Elk huis kan slechts één keer worden geconfigureerd.", + "no_active_subscription": "Dit huis heeft geen actief Tibber-contract. Alleen huizen met actieve elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.", + "subscription_expired": "Het Tibber-contract voor dit huis is verlopen. Alleen huizen met actieve of toekomstige elektriciteitscontracten kunnen worden toegevoegd aan Home Assistant.", + "future_subscription_warning": "Let op: Het Tibber-contract van dit huis is nog niet gestart. De functionaliteit kan beperkt zijn totdat het contract actief wordt." + }, + "abort": { + "already_configured": "Alle beschikbare Tibber-huizen zijn al geconfigureerd. Elk huis kan slechts één keer worden geconfigureerd.", + "entry_not_found": "Tibber-configuratie-item niet gevonden.", + "setup_complete": "Installatie voltooid! Je kunt extra opties voor Tibber Prices wijzigen in de integratie-opties na het sluiten van dit dialoogvenster.", + "reauth_successful": "Herauthenticatie geslaagd. De integratie is bijgewerkt met het nieuwe toegangstoken." + } + }, + "common": { + "step_progress": "{step_num} / {total_steps}", + "override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit", + "override_warning_and": "en", + "override_field_label_best_price_min_period_length": "Minimale periodelengte", + "override_field_label_best_price_max_level_gap_count": "Gaptolerantie", + "override_field_label_best_price_flex": "Flexibiliteit", + "override_field_label_best_price_min_distance_from_avg": "Minimale afstand", + "override_field_label_enable_min_periods_best": "Minimum aantal bereiken", + "override_field_label_min_periods_best": "Minimale periodes", + "override_field_label_relaxation_attempts_best": "Ontspanningspogingen", + "override_field_label_peak_price_min_period_length": "Minimale periodelengte", + "override_field_label_peak_price_max_level_gap_count": "Gaptolerantie", + "override_field_label_peak_price_flex": "Flexibiliteit", + "override_field_label_peak_price_min_distance_from_avg": "Minimale afstand", + "override_field_label_enable_min_periods_peak": "Minimum aantal bereiken", + "override_field_label_min_periods_peak": "Minimale periodes", + "override_field_label_relaxation_attempts_peak": "Ontspanningspogingen" + }, + "config_subentries": { + "home": { + "entry_type": "Tijdreisweergave", + "initiate_flow": { + "user": "Tijdreisweergave Aanmaken" + }, + "title": "Tijdreisweergave Aanmaken", + "step": { + "user": { + "title": "Selecteer Configuratie-Item", + "description": "Selecteer het configuratie-item waarvoor je een tijdreisweergave wilt aanmaken.\n\n**Tijdreisweergaven** laten je historische prijsgegevens zien alsof het de huidige tijd is. Dit is handig voor het testen van automatiseringen of het analyseren van prijspatronen uit het verleden.", + "data": { + "parent_entry_id": "Configuratie-Item" + } + }, + "time_offset": { + "title": "Configureer Tijdverschuiving", + "description": "Configureer hoe ver terug in de tijd deze weergave moet reizen.\n\n**Aanbevolen:** Gebruik **≥2 dagen** verschuiving om conflicten met \"gisteren\"-entiteiten te voorkomen die ook historische gegevens bieden.\n\n**Voorbeelden:**\n• **-7 dagen**: Bekijk prijzen van 7 dagen geleden\n• **-2 dagen, 3 uur**: Bekijk prijzen van 2 dagen en 3 uur geleden\n• **-14 dagen**: Bekijk prijzen van 2 weken geleden", + "data": { + "virtual_time_offset_days": "Dagen Terug", + "time_offset": "Extra Tijdverschuiving" + }, + "data_description": { + "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.", + "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund." + } + }, + "init": { + "title": "Tijdverschuiving Opnieuw Configureren", + "description": "Werk de tijdverschuiving voor deze tijdreisweergave bij.", + "data": { + "virtual_time_offset_days": "Dagen Terug", + "time_offset": "Extra Tijdverschuiving" + }, + "data_description": { + "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.", + "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund." + } } - }, - "common": { - "step_progress": "{step_num} / {total_steps}", - "override_warning_template": "⚠️ {fields} wordt beheerd door configuratie-entiteit", - "override_warning_and": "en", - "override_field_label_best_price_min_period_length": "Minimale periodelengte", - "override_field_label_best_price_max_level_gap_count": "Gaptolerantie", - "override_field_label_best_price_flex": "Flexibiliteit", - "override_field_label_best_price_min_distance_from_avg": "Minimale afstand", - "override_field_label_enable_min_periods_best": "Minimum aantal bereiken", - "override_field_label_min_periods_best": "Minimale periodes", - "override_field_label_relaxation_attempts_best": "Ontspanningspogingen", - "override_field_label_peak_price_min_period_length": "Minimale periodelengte", - "override_field_label_peak_price_max_level_gap_count": "Gaptolerantie", - "override_field_label_peak_price_flex": "Flexibiliteit", - "override_field_label_peak_price_min_distance_from_avg": "Minimale afstand", - "override_field_label_enable_min_periods_peak": "Minimum aantal bereiken", - "override_field_label_min_periods_peak": "Minimale periodes", - "override_field_label_relaxation_attempts_peak": "Ontspanningspogingen" - }, - "config_subentries": { - "home": { - "entry_type": "Tijdreisweergave", - "initiate_flow": { - "user": "Tijdreisweergave Aanmaken" - }, - "title": "Tijdreisweergave Aanmaken", - "step": { - "user": { - "title": "Selecteer Configuratie-Item", - "description": "Selecteer het configuratie-item waarvoor je een tijdreisweergave wilt aanmaken.\n\n**Tijdreisweergaven** laten je historische prijsgegevens zien alsof het de huidige tijd is. Dit is handig voor het testen van automatiseringen of het analyseren van prijspatronen uit het verleden.", - "data": { - "parent_entry_id": "Configuratie-Item" - } - }, - "time_offset": { - "title": "Configureer Tijdverschuiving", - "description": "Configureer hoe ver terug in de tijd deze weergave moet reizen.\n\n**Aanbevolen:** Gebruik **≥2 dagen** verschuiving om conflicten met \"gisteren\"-entiteiten te voorkomen die ook historische gegevens bieden.\n\n**Voorbeelden:**\n• **-7 dagen**: Bekijk prijzen van 7 dagen geleden\n• **-2 dagen, 3 uur**: Bekijk prijzen van 2 dagen en 3 uur geleden\n• **-14 dagen**: Bekijk prijzen van 2 weken geleden", - "data": { - "virtual_time_offset_days": "Dagen Terug", - "time_offset": "Extra Tijdverschuiving" - }, - "data_description": { - "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.", - "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund." - } - }, - "init": { - "title": "Tijdverschuiving Opnieuw Configureren", - "description": "Werk de tijdverschuiving voor deze tijdreisweergave bij.", - "data": { - "virtual_time_offset_days": "Dagen Terug", - "time_offset": "Extra Tijdverschuiving" - }, - "data_description": { - "virtual_time_offset_days": "Hoeveel dagen terug in de tijd reizen. Schuifbereik: 0 tot 374 dagen (≈1 jaar). Aanbevolen: ≥2 dagen om conflicten met \"gisteren\"-entiteiten te voorkomen.", - "time_offset": "Optionele fijnafstemming: Voeg uren en/of minuten toe aan de dagverschuiving. De tijd wordt automatisch afgetrokken (verder terug reizen). Let op: Seconden worden genegeerd - alleen precisie op minuutniveau wordt ondersteund." - } - } - }, - "error": { - "no_time_offset": "Minimaal één tijdverschuivingswaarde moet negatief zijn (alleen historische gegevens)." - }, - "abort": { - "already_configured": "**Een tijdreisweergave met exact deze tijdverschuiving bestaat al.**\n\nKies een andere verschuiving.", - "no_main_entries": "Geen hoofdconfiguratie-items gevonden. Voeg eerst een Tibber-huis toe.", - "parent_entry_not_found": "Geselecteerd configuratie-item niet gevonden." - } + }, + "error": { + "no_time_offset": "Minimaal één tijdverschuivingswaarde moet negatief zijn (alleen historische gegevens)." + }, + "abort": { + "already_configured": "**Een tijdreisweergave met exact deze tijdverschuiving bestaat al.**\n\nKies een andere verschuiving.", + "no_main_entries": "Geen hoofdconfiguratie-items gevonden. Voeg eerst een Tibber-huis toe.", + "parent_entry_not_found": "Geselecteerd configuratie-item niet gevonden." + } + } + }, + "options": { + "step": { + "init": { + "menu_options": { + "general_settings": "⚙️ Algemene Instellingen", + "display_settings": "💱 Valuta Weergave", + "current_interval_price_rating": "📊 Prijsbeoordeling", + "price_level": "🏷️ Prijsniveau", + "volatility": "💨 Prijsvolatiliteit", + "best_price": "💚 Beste Prijs Periode", + "peak_price": "🔴 Piekprijs Periode", + "price_trend": "📈 Prijstrend", + "chart_data_export": "📊 Grafiekdata Export Sensor", + "reset_to_defaults": "🔄 Standaardwaarden Herstellen", + "finish": "⬅️ Terug" } - }, - "options": { - "step": { - "init": { - "menu_options": { - "general_settings": "⚙️ Algemene Instellingen", - "display_settings": "💱 Valuta Weergave", - "current_interval_price_rating": "📊 Prijsbeoordeling", - "price_level": "🏷️ Prijsniveau", - "volatility": "💨 Prijsvolatiliteit", - "best_price": "💚 Beste Prijs Periode", - "peak_price": "🔴 Piekprijs Periode", - "price_trend": "📈 Prijstrend", - "chart_data_export": "📊 Grafiekdata Export Sensor", - "reset_to_defaults": "🔄 Standaardwaarden Herstellen", - "finish": "⬅️ Terug" - } + }, + "general_settings": { + "title": "⚙️ Algemene Instellingen", + "description": "**Configureer algemene instellingen voor Tibber Prijsinformatie & Beoordelingen.**\n\n---\n\n**Gebruiker:** {user_login}", + "data": { + "extended_descriptions": "Uitgebreide Beschrijvingen", + "average_sensor_display": "Gemiddelde Sensor Weergave" + }, + "data_description": { + "extended_descriptions": "Bepaalt of entiteitsattributen gedetailleerde uitleg en gebruikstips bevatten.\n\n• Uitgeschakeld (standaard): Alleen korte beschrijving\n• Ingeschakeld: Gedetailleerde uitleg + praktische gebruiksvoorbeelden\n\nVoorbeeld:\nUitgeschakeld = 1 attribuut\nIngeschakeld = 2 extra attributen", + "average_sensor_display": "Kies welke statistische maat weergegeven moet worden in de sensorstatus voor gemiddelde prijssensoren. De andere waarde wordt als attribuut getoond.\n\n• **Mediaan (standaard)**: Toont de 'typische' prijs, resistent tegen extreme pieken - best voor weergave en menselijke interpretatie\n• **Rekenkundig gemiddelde**: Toont het echte wiskundige gemiddelde inclusief alle prijzen - best wanneer je exacte kostenberekeningen nodig hebt\n\nVoor automatiseringen, gebruik het attribuut `price_mean` of `price_median` om toegang te krijgen tot beide waarden ongeacht deze instelling." + }, + "submit": "↩ Opslaan & Terug" + }, + "display_settings": { + "title": "💱 Valuta Weergave-Instellingen", + "description": "**Configureer hoe elektriciteitsprijzen worden weergegeven - in basisvaluta (€, kr) of subeenheid (ct, øre).**\n\n---", + "data": { + "currency_display_mode": "Weergavemodus" + }, + "data_description": { + "currency_display_mode": "Kies hoe prijzen worden weergegeven:\n\n• **Basisvaluta** (€/kWh, kr/kWh): Decimale waarden (bijv. 0,25 €/kWh) - verschillen zichtbaar vanaf 3e-4e decimaal\n• **Subeenheid Valuta** (ct/kWh, øre/kWh): Grotere waarden (bijv. 25,00 ct/kWh) - verschillen zichtbaar vanaf 1e decimaal\n\nStandaard hangt af van je valuta:\n• EUR → Subeenheid (cents) - Duitse/Nederlandse voorkeur\n• NOK/SEK/DKK → Basis (kronen) - Scandinavische voorkeur\n• USD/GBP → Basisvaluta\n\n**💡 Tip:** Bij selectie van Subeenheid Valuta kun je de extra \"Huidige Elektriciteitsprijs (Energie Dashboard)\" sensor inschakelen (standaard uitgeschakeld)." + }, + "submit": "↩ Opslaan & Terug" + }, + "current_interval_price_rating": { + "title": "📊 Instellingen Prijsbeoordeling", + "description": "**Configureer drempelwaarden en stabilisatie voor prijsbeoordelingsniveaus (laag/normaal/hoog) gebaseerd op vergelijking met het voortschrijdende 24-uurs gemiddelde.**{entity_warning}", + "data": { + "price_rating_threshold_low": "Lage Drempel", + "price_rating_threshold_high": "Hoge Drempel", + "price_rating_hysteresis": "Hysterese", + "price_rating_gap_tolerance": "Gap Tolerantie" + }, + "data_description": { + "price_rating_threshold_low": "Percentage onder het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'laag' beoordelingsniveau. Voorbeeld: -10 betekent minimaal 10% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdvensters aan. Standaard: -10%", + "price_rating_threshold_high": "Percentage boven het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'hoog' beoordelingsniveau. Voorbeeld: 10 betekent minimaal 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdvensters. Standaard: 10%", + "price_rating_hysteresis": "Percentageband rond drempelwaarden om snelle toestandswijzigingen te voorkomen. Wanneer de beoordeling al LAAG is, moet de prijs boven (drempel + hysterese) stijgen om naar NORMAAL te wisselen. Evenzo vereist HOOG dat de prijs onder (drempel - hysterese) daalt om de toestand te verlaten. Dit zorgt voor stabiliteit bij automatiseringen die reageren op beoordelingswijzigingen. Stel in op 0 om uit te schakelen. Standaard: 2%", + "price_rating_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'gladgestreken' kan worden als ze afwijken van omringende beoordelingen. Kleine geïsoleerde beoordelingswijzigingen worden samengevoegd met het dominante naburige blok. Dit zorgt voor stabiliteit bij automatiseringen door te voorkomen dat korte beoordelingspieken onnodige acties activeren. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'hoog'-intervallen gecorrigeerd wordt naar 'hoog'. Stel in op 0 om uit te schakelen. Standaard: 1" + }, + "submit": "↩ Opslaan & Terug" + }, + "best_price": { + "title": "💚 Beste Prijs Periode Instellingen", + "description": "**Configureer instellingen voor de Beste Prijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periode Duur & Niveaus", + "description": "Configureer hoe lang periodes moeten zijn en welke prijsniveaus moeten worden opgenomen.", + "data": { + "best_price_min_period_length": "Minimale Periode Lengte", + "best_price_max_level": "Prijsniveau Filter", + "best_price_max_level_gap_count": "Gat Tolerantie" }, - "general_settings": { - "title": "⚙️ Algemene Instellingen", - "description": "**Configureer algemene instellingen voor Tibber Prijsinformatie & Beoordelingen.**\n\n---\n\n**Gebruiker:** {user_login}", - "data": { - "extended_descriptions": "Uitgebreide Beschrijvingen", - "average_sensor_display": "Gemiddelde Sensor Weergave" - }, - "data_description": { - "extended_descriptions": "Bepaalt of entiteitsattributen gedetailleerde uitleg en gebruikstips bevatten.\n\n• Uitgeschakeld (standaard): Alleen korte beschrijving\n• Ingeschakeld: Gedetailleerde uitleg + praktische gebruiksvoorbeelden\n\nVoorbeeld:\nUitgeschakeld = 1 attribuut\nIngeschakeld = 2 extra attributen", - "average_sensor_display": "Kies welke statistische maat weergegeven moet worden in de sensorstatus voor gemiddelde prijssensoren. De andere waarde wordt als attribuut getoond.\n\n• **Mediaan (standaard)**: Toont de 'typische' prijs, resistent tegen extreme pieken - best voor weergave en menselijke interpretatie\n• **Rekenkundig gemiddelde**: Toont het echte wiskundige gemiddelde inclusief alle prijzen - best wanneer je exacte kostenberekeningen nodig hebt\n\nVoor automatiseringen, gebruik het attribuut `price_mean` of `price_median` om toegang te krijgen tot beide waarden ongeacht deze instelling." - }, - "submit": "↩ Opslaan & Terug" - }, - "display_settings": { - "title": "💱 Valuta Weergave-Instellingen", - "description": "**Configureer hoe elektriciteitsprijzen worden weergegeven - in basisvaluta (€, kr) of subeenheid (ct, øre).**\n\n---", - "data": { - "currency_display_mode": "Weergavemodus" - }, - "data_description": { - "currency_display_mode": "Kies hoe prijzen worden weergegeven:\n\n• **Basisvaluta** (€/kWh, kr/kWh): Decimale waarden (bijv. 0,25 €/kWh) - verschillen zichtbaar vanaf 3e-4e decimaal\n• **Subeenheid Valuta** (ct/kWh, øre/kWh): Grotere waarden (bijv. 25,00 ct/kWh) - verschillen zichtbaar vanaf 1e decimaal\n\nStandaard hangt af van je valuta:\n• EUR → Subeenheid (cents) - Duitse/Nederlandse voorkeur\n• NOK/SEK/DKK → Basis (kronen) - Scandinavische voorkeur\n• USD/GBP → Basisvaluta\n\n**💡 Tip:** Bij selectie van Subeenheid Valuta kun je de extra \"Huidige Elektriciteitsprijs (Energie Dashboard)\" sensor inschakelen (standaard uitgeschakeld)." - }, - "submit": "↩ Opslaan & Terug" - }, - "current_interval_price_rating": { - "title": "📊 Instellingen Prijsbeoordeling", - "description": "**Configureer drempelwaarden en stabilisatie voor prijsbeoordelingsniveaus (laag/normaal/hoog) gebaseerd op vergelijking met het voortschrijdende 24-uurs gemiddelde.**{entity_warning}", - "data": { - "price_rating_threshold_low": "Lage Drempel", - "price_rating_threshold_high": "Hoge Drempel", - "price_rating_hysteresis": "Hysterese", - "price_rating_gap_tolerance": "Gap Tolerantie" - }, - "data_description": { - "price_rating_threshold_low": "Percentage onder het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'laag' beoordelingsniveau. Voorbeeld: -10 betekent minimaal 10% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdvensters aan. Standaard: -10%", - "price_rating_threshold_high": "Percentage boven het voortschrijdende 24-uurs gemiddelde dat de huidige prijs moet zijn om te kwalificeren als 'hoog' beoordelingsniveau. Voorbeeld: 10 betekent minimaal 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdvensters. Standaard: 10%", - "price_rating_hysteresis": "Percentageband rond drempelwaarden om snelle toestandswijzigingen te voorkomen. Wanneer de beoordeling al LAAG is, moet de prijs boven (drempel + hysterese) stijgen om naar NORMAAL te wisselen. Evenzo vereist HOOG dat de prijs onder (drempel - hysterese) daalt om de toestand te verlaten. Dit zorgt voor stabiliteit bij automatiseringen die reageren op beoordelingswijzigingen. Stel in op 0 om uit te schakelen. Standaard: 2%", - "price_rating_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'gladgestreken' kan worden als ze afwijken van omringende beoordelingen. Kleine geïsoleerde beoordelingswijzigingen worden samengevoegd met het dominante naburige blok. Dit zorgt voor stabiliteit bij automatiseringen door te voorkomen dat korte beoordelingspieken onnodige acties activeren. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'hoog'-intervallen gecorrigeerd wordt naar 'hoog'. Stel in op 0 om uit te schakelen. Standaard: 1" - }, - "submit": "↩ Opslaan & Terug" - }, - "best_price": { - "title": "💚 Beste Prijs Periode Instellingen", - "description": "**Configureer instellingen voor de Beste Prijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periode Duur & Niveaus", - "description": "Configureer hoe lang periodes moeten zijn en welke prijsniveaus moeten worden opgenomen.", - "data": { - "best_price_min_period_length": "Minimale Periode Lengte", - "best_price_max_level": "Prijsniveau Filter", - "best_price_max_level_gap_count": "Gat Tolerantie" - }, - "data_description": { - "best_price_min_period_length": "Minimale duur voor een periode om als 'beste prijs' te worden beschouwd. Langere periodes zijn praktischer voor apparaten zoals vaatwassers of warmtepompen. Beste prijs periodes vereisen minimaal 60 minuten (versus 30 minuten voor piekprijs waarschuwingen) omdat ze betekenisvolle tijdvensters voor verbruiksplanning moeten bieden, niet alleen korte kansen.", - "best_price_max_level": "Toon alleen beste prijs periodes als ze intervallen bevatten met prijsniveaus ≤ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Goedkoop**' moet de periode minimaal één '**Zeer goedkoop**' of '**Goedkoop**' interval hebben. Dit zorgt ervoor dat 'beste prijs' periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer '**Alles**' om beste prijzen te tonen ongeacht hun absolute prijsniveau.", - "best_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Goedkoop**' filter en gat telling 1, wordt een reeks '**Goedkoop**, **Goedkoop**, **Normaal**, **Goedkoop**' geaccepteerd (**Normaal** is één stap boven **Goedkoop**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." - } - }, - "flexibility_settings": { - "name": "Flexibiliteit & Drempelwaarden", - "description": "Bepaal hoeveel prijzen kunnen afwijken en nog steeds als 'beste prijs' kwalificeren.", - "data": { - "best_price_flex": "Flexibiliteit", - "best_price_min_distance_from_avg": "Minimale Afstand" - }, - "data_description": { - "best_price_flex": "Maximum boven de dagelijkse minimumprijs dat intervallen kunnen zijn en nog steeds als 'beste prijs' kwalificeren. Aanbevolen: 15-20 met relaxatie ingeschakeld (standaard), of 25-35 zonder relaxatie. Maximum: 50 (harde limiet voor betrouwbare periodedetectie).", - "best_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant goedkoper zijn dan het dagelijkse gemiddelde, niet slechts marginaal eronder. Dit filtert ruis en voorkomt het markeren van licht-onder-gemiddelde periodes als 'beste prijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt goedkope periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% onder het dagelijkse gemiddelde moeten zijn." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxatie & Doelperiodes", - "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.", - "data": { - "enable_min_periods_best": "Bereik Minimum Aantal", - "min_periods_best": "Minimale Periodes", - "relaxation_attempts_best": "Relaxatie Pogingen" - }, - "data_description": { - "enable_min_periods_best": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken, wat minder optimale tijdvensters als beste-prijs periodes kan bevatten.", - "min_periods_best": "Minimaal aantal beste prijsperiodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1", - "relaxation_attempts_best": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra periodes te vinden ten koste van langere verwerkingstijd." - } - } - }, - "submit": "↩ Opslaan & Terug" - }, - "peak_price": { - "title": "🔴 Piekprijs Periode Instellingen", - "description": "**Configureer instellingen voor de Piekprijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de hoogste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periode Instellingen", - "description": "Configureer periodeduur en prijsniveau beperkingen.", - "data": { - "peak_price_min_period_length": "Minimale Periode Lengte", - "peak_price_min_level": "Prijsniveau Filter", - "peak_price_max_level_gap_count": "Gat Tolerantie" - }, - "data_description": { - "peak_price_min_period_length": "Minimale duur voor een periode om als 'piekprijs' te worden beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (30 minuten minimum vs. 60 minuten voor beste prijs) omdat korte dure pieken de moeite waard zijn om voor te waarschuwen, zelfs als ze te kort zijn voor verbruiksplanning.", - "peak_price_min_level": "Toon alleen piekprijs periodes als ze intervallen bevatten met prijsniveaus ≥ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Duur**' moet de periode minimaal één '**Duur**' of '**Zeer duur**' interval hebben. Dit zorgt ervoor dat 'piekprijs' periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer '**Alles**' om piekprijzen te tonen ongeacht hun absolute prijsniveau.", - "peak_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Duur**' filter en gat telling 2, wordt een reeks '**Duur**, **Normaal**, **Normaal**, **Duur**' geaccepteerd (**Normaal** is één stap onder **Duur**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." - } - }, - "flexibility_settings": { - "name": "Flexibiliteit Instellingen", - "description": "Configureer drempelwaarden voor prijsvergelijking en filtering.", - "data": { - "peak_price_flex": "Flexibiliteit", - "peak_price_min_distance_from_avg": "Minimale Afstand" - }, - "data_description": { - "peak_price_flex": "Maximum onder de dagelijkse maximumprijs dat intervallen kunnen zijn en nog steeds als 'piekprijs' kwalificeren. Aanbevolen: -15 tot -20 met relaxatie ingeschakeld (standaard), of -25 tot -35 zonder relaxatie. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven afstand onder maximum aan.", - "peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het dagelijkse gemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt het markeren van licht-boven-gemiddelde periodes als 'piekprijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het dagelijkse gemiddelde moeten zijn." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxatie & Doelperiodes", - "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.", - "data": { - "enable_min_periods_peak": "Bereik Minimum Aantal", - "min_periods_peak": "Minimale Periodes", - "relaxation_attempts_peak": "Relaxatie Pogingen" - }, - "data_description": { - "enable_min_periods_peak": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om je te waarschuwen voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.", - "min_periods_peak": "Minimaal aantal piekprijs periodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1", - "relaxation_attempts_peak": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra piekperiodes te vinden ten koste van langere verwerkingstijd." - } - } - }, - "submit": "↩ Opslaan & Terug" - }, - "price_trend": { - "title": "📈 Prijstrend Drempelwaarden", - "description": "**Configureer drempelwaarden voor prijstrend sensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen sterk stijgen, stijgen, stabiel zijn, dalen of sterk dalen.**{entity_warning}", - "data": { - "price_trend_threshold_rising": "Stijgende Drempel", - "price_trend_threshold_strongly_rising": "Sterk Stijgende Drempel", - "price_trend_threshold_falling": "Dalende Drempel", - "price_trend_threshold_strongly_falling": "Sterk Dalende Drempel", - "price_trend_change_confirmation": "Trendverandering Bevestiging", - "price_trend_min_price_change": "Min. Prijsverandering (Trend)", - "price_trend_min_price_change_strongly": "Min. Prijsverandering (Sterke Trend)" - }, - "data_description": { - "price_trend_threshold_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'stijgende' trend. Voorbeeld: 3 betekent dat het gemiddelde minimaal 3% hoger is → prijzen zullen stijgen. Typische waarden: 3-10%. Standaard: 3%", - "price_trend_threshold_strongly_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'sterk stijgende' trend. Moet hoger zijn dan stijgende drempel. Typische waarden: 6-20%. Standaard: 9%", - "price_trend_threshold_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'dalende' trend. Voorbeeld: -3 betekent dat het gemiddelde minimaal 3% lager is → prijzen zullen dalen. Typische waarden: -3 tot -10%. Standaard: -3%", - "price_trend_threshold_strongly_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'sterk dalende' trend. Moet lager (meer negatief) zijn dan dalende drempel. Typische waarden: -6 tot -20%. Standaard: -9%", - "price_trend_change_confirmation": "Aantal opeenvolgende 15-minuten intervallen dat een nieuwe trendrichting moet bevestigen voordat een trendverandering wordt gemeld. Hogere waarden betekenen meer stabiliteit en minder valse veranderingen, lagere waarden betekenen snellere detectie. Bereik: 2 (30 min) tot 6 (90 min). Standaard: 3 (45 min)", - "price_trend_min_price_change": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'stijgende' of 'dalende' trend. Voorkomt dat minimale prijswijzigingen trends veroorzaken bij lage prijsniveaus. Stel in op 0 om te deactiveren (pure percentagemodus). Standaard: 0,5", - "price_trend_min_price_change_strongly": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'sterk stijgende' of 'sterk dalende' trend. Moet hoger zijn dan het reguliere trendminimum. Stel in op 0 om te deactiveren. Standaard: 1,5" - }, - "submit": "↩ Opslaan & Terug" - }, - "volatility": { - "title": "💨 Prijsvolatiliteit Drempelwaarden", - "description": "**Configureer drempelwaarden voor volatiliteitsclassificatie.** Volatiliteit meet relatieve prijsvariatie met de variëfficcïnt (CV = standaarddeviatie / gemiddelde × 100%). Deze drempelwaarden zijn percentagewaarden die werken over alle prijsniveaus.\n\nGebruikt door:\n• Volatiliteit sensoren (classificatie)\n• Trend sensoren (adaptieve drempelaanpassing: <gematigd = gevoeliger, ≥hoog = minder gevoelig){entity_warning}", - "data": { - "volatility_threshold_moderate": "Gematigde Drempel", - "volatility_threshold_high": "Hoge Drempel", - "volatility_threshold_very_high": "Zeer Hoge Drempel" - }, - "data_description": { - "volatility_threshold_moderate": "Variëfficcïnt (CV) waarbij prijzen als 'gematigd volatiel' worden beschouwd. CV = (standaarddeviatie / gemiddelde) × 100%. Voorbeeld: 15 betekent prijsschommelingen van ±15% rond gemiddelde. Sensoren tonen deze classificatie, trend sensoren worden gevoeliger. Standaard: 15%", - "volatility_threshold_high": "Variëfficcïnt (CV) waarbij prijzen als 'hoog volatiel' worden beschouwd. Voorbeeld: 30 betekent prijsschommelingen van ±30% rond gemiddelde. Grotere prijssprongen verwacht, trend sensoren worden minder gevoelig. Standaard: 30%", - "volatility_threshold_very_high": "Variëfficcïnt (CV) waarbij prijzen als 'zeer hoog volatiel' worden beschouwd. Voorbeeld: 50 betekent extreme prijsschommelingen van ±50% rond gemiddelde. Op zulke dagen zijn sterke prijspieken waarschijnlijk. Standaard: 50%" - }, - "submit": "↩ Opslaan & Terug" - }, - "chart_data_export": { - "title": "📊 Grafiekdata Export Sensor", - "description": "De Grafiekdata Export Sensor biedt prijsgegevens als sensor attributen.\n\n⚠️ **Let op:** Deze sensor is een legacy functie voor compatibiliteit met oudere tools.\n\n**Aanbevolen voor nieuwe setups:** Gebruik de `tibber_prices.get_chartdata` **service direct** - het is flexibeler, efficïnter, en de moderne Home Assistant aanpak.\n\n**Wanneer deze sensor zinvol is:**\n\n✅ Je dashboardtool kan **alleen** attributen lezen (geen service calls)\n✅ Je hebt statische data nodig die automatisch update\n❌ **Niet voor automatiseringen:** Gebruik `tibber_prices.get_chartdata` daar direct - flexibeler en efficïnter!\n\n---\n\n{sensor_status_info}", - "submit": "↩ Ok & Terug" - }, - "reset_to_defaults": { - "title": "🔄 Standaardwaarden Herstellen", - "description": "⚠️ **Waarschuwing:** Dit zal **ALLE** instellingen naar fabrieksinstellingen terugzetten.\n\n**Wat wordt gereset:**\n• Alle prijsbeoordeling drempelwaarden\n• Alle volatiliteit drempelwaarden\n• Alle prijstrend drempelwaarden\n• Alle beste prijsperiode instellingen\n• Alle piekprijs periode instellingen\n• Weergave-instellingen\n• Algemene instellingen\n\n**Wat wordt NIET gereset:**\n• Je Tibber API-token\n• Geselecteerd huis\n• Valuta\n\n**💡 Tip:** Dit is handig als je opnieuw wilt beginnen na het experimenteren met instellingen.", - "data": { - "confirm_reset": "Ja, reset alles naar standaardwaarden" - }, - "submit": "Nu Resetten" - }, - "price_level": { - "title": "🏷️ Prijsniveau-instellingen", - "description": "**Configureer stabilisatie voor Tibbers prijsniveau-classificatie (zeer goedkoop/goedkoop/normaal/duur/zeer duur).**\n\nTibbers API levert een prijsniveau-veld voor elk interval. Deze instelling egaliseer korte fluctuaties om instabiliteit in automatiseringen te voorkomen.{entity_warning}", - "data": { - "price_level_gap_tolerance": "Gap-tolerantie" - }, - "data_description": { - "price_level_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'afgevlakt' kan worden als ze afwijken van omringende prijsniveaus. Kleine geïsoleerde niveauwijzigingen worden samengevoegd met het dominante aangrenzende blok. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'goedkoop'-intervallen wordt gecorrigeerd naar 'goedkoop'. Stel in op 0 om uit te schakelen. Standaard: 1" - }, - "submit": "↩ Opslaan & terug" + "data_description": { + "best_price_min_period_length": "Minimale duur voor een periode om als 'beste prijs' te worden beschouwd. Langere periodes zijn praktischer voor apparaten zoals vaatwassers of warmtepompen. Beste prijs periodes vereisen minimaal 60 minuten (versus 30 minuten voor piekprijs waarschuwingen) omdat ze betekenisvolle tijdvensters voor verbruiksplanning moeten bieden, niet alleen korte kansen.", + "best_price_max_level": "Toon alleen beste prijs periodes als ze intervallen bevatten met prijsniveaus ≤ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Goedkoop**' moet de periode minimaal één '**Zeer goedkoop**' of '**Goedkoop**' interval hebben. Dit zorgt ervoor dat 'beste prijs' periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer '**Alles**' om beste prijzen te tonen ongeacht hun absolute prijsniveau.", + "best_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Goedkoop**' filter en gat telling 1, wordt een reeks '**Goedkoop**, **Goedkoop**, **Normaal**, **Goedkoop**' geaccepteerd (**Normaal** is één stap boven **Goedkoop**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." } + }, + "flexibility_settings": { + "name": "Flexibiliteit & Drempelwaarden", + "description": "Bepaal hoeveel prijzen kunnen afwijken en nog steeds als 'beste prijs' kwalificeren.", + "data": { + "best_price_flex": "Flexibiliteit", + "best_price_min_distance_from_avg": "Minimale Afstand" + }, + "data_description": { + "best_price_flex": "Maximum boven de dagelijkse minimumprijs dat intervallen kunnen zijn en nog steeds als 'beste prijs' kwalificeren. Aanbevolen: 15-20 met relaxatie ingeschakeld (standaard), of 25-35 zonder relaxatie. Maximum: 50 (harde limiet voor betrouwbare periodedetectie).", + "best_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant goedkoper zijn dan het dagelijkse gemiddelde, niet slechts marginaal eronder. Dit filtert ruis en voorkomt het markeren van licht-onder-gemiddelde periodes als 'beste prijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt goedkope periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% onder het dagelijkse gemiddelde moeten zijn." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxatie & Doelperiodes", + "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.", + "data": { + "enable_min_periods_best": "Bereik Minimum Aantal", + "min_periods_best": "Minimale Periodes", + "relaxation_attempts_best": "Relaxatie Pogingen" + }, + "data_description": { + "enable_min_periods_best": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken, wat minder optimale tijdvensters als beste-prijs periodes kan bevatten.", + "min_periods_best": "Minimaal aantal beste prijsperiodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1", + "relaxation_attempts_best": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra periodes te vinden ten koste van langere verwerkingstijd." + } + }, + "extension_settings": { + "name": "Uitbreiding aan perioderand", + "description": "Breid gedetecteerde beste-prijsperioden eventueel uit aan beide randen om aangrenzende zeer goedkope intervallen op te nemen.", + "data": { + "best_price_extend_to_very_cheap": "Uitbreiden met zeer goedkope intervallen", + "best_price_max_extension_intervals": "Maximale uitbreidingsintervallen" + }, + "data_description": { + "best_price_extend_to_very_cheap": "Indien ingeschakeld, breiden gedetecteerde beste-prijsperioden zich uit aan de randen om aangrenzende intervallen met prijsniveau 'Zeer goedkoop' op te nemen. Dit vangt extreem goedkope intervallen op aan de randen van gedetecteerde perioden.", + "best_price_max_extension_intervals": "Maximaal aantal extra intervallen per kant (linker en rechter rand). Elk interval is 15 minuten. Voorbeeld: 4 intervallen = maximaal 1 uur uitbreiding per rand. Standaard: 4" + } + } }, - "error": { - "auth": "Het Tibber-toegangstoken is ongeldig.", - "connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.", - "unknown": "Er is een onverwachte fout opgetreden. Controleer de logs voor details.", - "cannot_connect": "Verbinding mislukt", - "invalid_access_token": "Ongeldig toegangstoken", - "different_home": "Het toegangstoken is niet geldig voor het huis-ID waarvoor deze integratie is geconfigureerd.", - "invalid_period_length": "Periode lengte moet minimaal 15 minuten zijn (veelvouden van 15).", - "invalid_flex": "Flexibiliteitspercentage moet tussen -50% en +50% zijn", - "invalid_best_price_distance": "Afstandspercentage moet tussen -50% en 0% zijn (negatief = onder gemiddelde)", - "invalid_peak_price_distance": "Afstandspercentage moet tussen 0% en 50% zijn (positief = boven gemiddelde)", - "invalid_min_periods": "Minimaal aantal periodes moet tussen 1 en 10 zijn", - "invalid_gap_count": "Gat telling moet tussen 0 en 8 zijn", - "invalid_relaxation_attempts": "Relaxatie pogingen moeten tussen 1 en 12 zijn", - "invalid_price_rating_low": "Lage prijsbeoordeling drempel moet tussen -50% en -5% zijn", - "invalid_price_rating_high": "Hoge prijsbeoordeling drempel moet tussen 5% en 50% zijn", - "invalid_price_rating_thresholds": "Lage drempel moet lager zijn dan hoge drempel", - "invalid_volatility_threshold_moderate": "Gematigde volatiliteit drempel moet tussen 5% en 25% zijn", - "invalid_volatility_threshold_high": "Hoge volatiliteit drempel moet tussen 20% en 40% zijn", - "invalid_volatility_threshold_very_high": "Zeer hoge volatiliteit drempel moet tussen 35% en 80% zijn", - "invalid_volatility_thresholds": "Drempelwaarden moeten in oplopende volgorde zijn: gematigd < hoog < zeer hoog", - "invalid_price_trend_rising": "Stijgende trend drempel moet tussen 1% en 50% zijn", - "invalid_price_trend_falling": "Dalende trend drempel moet tussen -50% en -1% zijn", - "invalid_price_trend_strongly_rising": "Sterk stijgende trend drempel moet tussen 2% en 100% zijn", - "invalid_price_trend_strongly_falling": "Sterk dalende trend drempel moet tussen -100% en -2% zijn", - "invalid_trend_strongly_rising_less_than_rising": "Sterk stijgende drempel moet hoger zijn dan stijgende drempel", - "invalid_trend_strongly_falling_greater_than_falling": "Sterk dalende drempel moet lager (meer negatief) zijn dan dalende drempel" + "submit": "↩ Opslaan & Terug" + }, + "peak_price": { + "title": "🔴 Piekprijs Periode Instellingen", + "description": "**Configureer instellingen voor de Piekprijs Periode binaire sensor. Deze sensor is actief tijdens periodes met de hoogste elektriciteitsprijzen.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periode Instellingen", + "description": "Configureer periodeduur en prijsniveau beperkingen.", + "data": { + "peak_price_min_period_length": "Minimale Periode Lengte", + "peak_price_min_level": "Prijsniveau Filter", + "peak_price_max_level_gap_count": "Gat Tolerantie" + }, + "data_description": { + "peak_price_min_period_length": "Minimale duur voor een periode om als 'piekprijs' te worden beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (30 minuten minimum vs. 60 minuten voor beste prijs) omdat korte dure pieken de moeite waard zijn om voor te waarschuwen, zelfs als ze te kort zijn voor verbruiksplanning.", + "peak_price_min_level": "Toon alleen piekprijs periodes als ze intervallen bevatten met prijsniveaus ≥ geselecteerde waarde. Bijvoorbeeld, bij selectie '**Duur**' moet de periode minimaal één '**Duur**' of '**Zeer duur**' interval hebben. Dit zorgt ervoor dat 'piekprijs' periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer '**Alles**' om piekprijzen te tonen ongeacht hun absolute prijsniveau.", + "peak_price_max_level_gap_count": "Maximaal aantal opeenvolgende intervallen toegestaan die precies één niveaustap afwijken van het vereiste niveau. Bijvoorbeeld: met '**Duur**' filter en gat telling 2, wordt een reeks '**Duur**, **Normaal**, **Normaal**, **Duur**' geaccepteerd (**Normaal** is één stap onder **Duur**). Dit voorkomt dat periodes worden gesplitst door incidentele niveauafwijkingen. **Let op:** Gat tolerantie vereist periodes ≥90 minuten (6 intervallen) om uitschieters effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." + } + }, + "flexibility_settings": { + "name": "Flexibiliteit Instellingen", + "description": "Configureer drempelwaarden voor prijsvergelijking en filtering.", + "data": { + "peak_price_flex": "Flexibiliteit", + "peak_price_min_distance_from_avg": "Minimale Afstand" + }, + "data_description": { + "peak_price_flex": "Maximum onder de dagelijkse maximumprijs dat intervallen kunnen zijn en nog steeds als 'piekprijs' kwalificeren. Aanbevolen: -15 tot -20 met relaxatie ingeschakeld (standaard), of -25 tot -35 zonder relaxatie. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven afstand onder maximum aan.", + "peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het dagelijkse gemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt het markeren van licht-boven-gemiddelde periodes als 'piekprijs' op dagen met vlakke prijzen. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het dagelijkse gemiddelde moeten zijn." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxatie & Doelperiodes", + "description": "Configureer automatische filterrelaxatie en doel periode aantallen. Schakel 'Bereik Minimum Aantal' in om relaxatie te activeren.", + "data": { + "enable_min_periods_peak": "Bereik Minimum Aantal", + "min_periods_peak": "Minimale Periodes", + "relaxation_attempts_peak": "Relaxatie Pogingen" + }, + "data_description": { + "enable_min_periods_peak": "Wanneer ingeschakeld, worden filters geleidelijk versoepeld als niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om je te waarschuwen voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.", + "min_periods_peak": "Minimaal aantal piekprijs periodes om per dag na te streven. Filters worden stapsgewijs versoepeld om dit aantal te proberen te bereiken. Alleen actief wanneer 'Bereik Minimum Aantal' is ingeschakeld. Standaard: 1", + "relaxation_attempts_peak": "Hoeveel flex niveaus (pogingen) te proberen voordat opgegeven wordt. Elke poging voert alle filtercombinaties uit op het nieuwe flex niveau. Meer pogingen verhogen de kans om extra piekperiodes te vinden ten koste van langere verwerkingstijd." + } + }, + "extension_settings": { + "name": "Uitbreiding aan perioderand", + "description": "Breid gedetecteerde piekprijsperioden eventueel uit aan beide randen om aangrenzende zeer dure intervallen op te nemen.", + "data": { + "peak_price_extend_to_very_expensive": "Uitbreiden met zeer dure intervallen", + "peak_price_max_extension_intervals": "Maximale uitbreidingsintervallen" + }, + "data_description": { + "peak_price_extend_to_very_expensive": "Indien ingeschakeld, breiden gedetecteerde piekprijsperioden zich uit aan de randen om aangrenzende intervallen met prijsniveau 'Zeer duur' op te nemen. Dit vangt extreem dure intervallen op aan de randen van gedetecteerde perioden.", + "peak_price_max_extension_intervals": "Maximaal aantal extra intervallen per kant (linker en rechter rand). Elk interval is 15 minuten. Voorbeeld: 4 intervallen = maximaal 1 uur uitbreiding per rand. Standaard: 4" + } + } }, - "abort": { - "entry_not_found": "Tibber-configuratie-item niet gevonden.", - "reset_cancelled": "Reset geannuleerd. Er zijn geen wijzigingen aangebracht in je configuratie.", - "reset_successful": "✅ Alle instellingen zijn teruggezet naar fabrieksinstellingen. Je configuratie is nu als een nieuwe installatie.", - "finished": "Configuratie voltooid." + "submit": "↩ Opslaan & Terug" + }, + "price_trend": { + "title": "📈 Prijstrend Drempelwaarden", + "description": "**Configureer drempelwaarden voor prijstrend sensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen sterk stijgen, stijgen, stabiel zijn, dalen of sterk dalen.**{entity_warning}", + "data": { + "price_trend_threshold_rising": "Stijgende Drempel", + "price_trend_threshold_strongly_rising": "Sterk Stijgende Drempel", + "price_trend_threshold_falling": "Dalende Drempel", + "price_trend_threshold_strongly_falling": "Sterk Dalende Drempel", + "price_trend_change_confirmation": "Trendverandering Bevestiging", + "price_trend_min_price_change": "Min. Prijsverandering (Trend)", + "price_trend_min_price_change_strongly": "Min. Prijsverandering (Sterke Trend)" + }, + "data_description": { + "price_trend_threshold_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'stijgende' trend. Voorbeeld: 3 betekent dat het gemiddelde minimaal 3% hoger is → prijzen zullen stijgen. Typische waarden: 3-10%. Standaard: 3%", + "price_trend_threshold_strongly_rising": "Percentage dat het gemiddelde van de volgende N uur boven de huidige prijs moet zijn om te kwalificeren als 'sterk stijgende' trend. Moet hoger zijn dan stijgende drempel. Typische waarden: 6-20%. Standaard: 9%", + "price_trend_threshold_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'dalende' trend. Voorbeeld: -3 betekent dat het gemiddelde minimaal 3% lager is → prijzen zullen dalen. Typische waarden: -3 tot -10%. Standaard: -3%", + "price_trend_threshold_strongly_falling": "Percentage (negatief) dat het gemiddelde van de volgende N uur onder de huidige prijs moet zijn om te kwalificeren als 'sterk dalende' trend. Moet lager (meer negatief) zijn dan dalende drempel. Typische waarden: -6 tot -20%. Standaard: -9%", + "price_trend_change_confirmation": "Aantal opeenvolgende 15-minuten intervallen dat een nieuwe trendrichting moet bevestigen voordat een trendverandering wordt gemeld. Hogere waarden betekenen meer stabiliteit en minder valse veranderingen, lagere waarden betekenen snellere detectie. Bereik: 2 (30 min) tot 6 (90 min). Standaard: 3 (45 min)", + "price_trend_min_price_change": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'stijgende' of 'dalende' trend. Voorkomt dat minimale prijswijzigingen trends veroorzaken bij lage prijsniveaus. Stel in op 0 om te deactiveren (pure percentagemodus). Standaard: 0,5", + "price_trend_min_price_change_strongly": "Minimaal absoluut prijsverschil (in ct/øre) vereist voor een 'sterk stijgende' of 'sterk dalende' trend. Moet hoger zijn dan het reguliere trendminimum. Stel in op 0 om te deactiveren. Standaard: 1,5" + }, + "submit": "↩ Opslaan & Terug" + }, + "volatility": { + "title": "💨 Prijsvolatiliteit Drempelwaarden", + "description": "**Configureer drempelwaarden voor volatiliteitsclassificatie.** Volatiliteit meet relatieve prijsvariatie met de variëfficcïnt (CV = standaarddeviatie / gemiddelde × 100%). Deze drempelwaarden zijn percentagewaarden die werken over alle prijsniveaus.\n\nGebruikt door:\n• Volatiliteit sensoren (classificatie)\n• Trend sensoren (adaptieve drempelaanpassing: <gematigd = gevoeliger, ≥hoog = minder gevoelig){entity_warning}", + "data": { + "volatility_threshold_moderate": "Gematigde Drempel", + "volatility_threshold_high": "Hoge Drempel", + "volatility_threshold_very_high": "Zeer Hoge Drempel" + }, + "data_description": { + "volatility_threshold_moderate": "Variëfficcïnt (CV) waarbij prijzen als 'gematigd volatiel' worden beschouwd. CV = (standaarddeviatie / gemiddelde) × 100%. Voorbeeld: 15 betekent prijsschommelingen van ±15% rond gemiddelde. Sensoren tonen deze classificatie, trend sensoren worden gevoeliger. Standaard: 15%", + "volatility_threshold_high": "Variëfficcïnt (CV) waarbij prijzen als 'hoog volatiel' worden beschouwd. Voorbeeld: 30 betekent prijsschommelingen van ±30% rond gemiddelde. Grotere prijssprongen verwacht, trend sensoren worden minder gevoelig. Standaard: 30%", + "volatility_threshold_very_high": "Variëfficcïnt (CV) waarbij prijzen als 'zeer hoog volatiel' worden beschouwd. Voorbeeld: 50 betekent extreme prijsschommelingen van ±50% rond gemiddelde. Op zulke dagen zijn sterke prijspieken waarschijnlijk. Standaard: 50%" + }, + "submit": "↩ Opslaan & Terug" + }, + "chart_data_export": { + "title": "📊 Grafiekdata Export Sensor", + "description": "De Grafiekdata Export Sensor biedt prijsgegevens als sensor attributen.\n\n⚠️ **Let op:** Deze sensor is een legacy functie voor compatibiliteit met oudere tools.\n\n**Aanbevolen voor nieuwe setups:** Gebruik de `tibber_prices.get_chartdata` **service direct** - het is flexibeler, efficïnter, en de moderne Home Assistant aanpak.\n\n**Wanneer deze sensor zinvol is:**\n\n✅ Je dashboardtool kan **alleen** attributen lezen (geen service calls)\n✅ Je hebt statische data nodig die automatisch update\n❌ **Niet voor automatiseringen:** Gebruik `tibber_prices.get_chartdata` daar direct - flexibeler en efficïnter!\n\n---\n\n{sensor_status_info}", + "submit": "↩ Ok & Terug" + }, + "reset_to_defaults": { + "title": "🔄 Standaardwaarden Herstellen", + "description": "⚠️ **Waarschuwing:** Dit zal **ALLE** instellingen naar fabrieksinstellingen terugzetten.\n\n**Wat wordt gereset:**\n• Alle prijsbeoordeling drempelwaarden\n• Alle volatiliteit drempelwaarden\n• Alle prijstrend drempelwaarden\n• Alle beste prijsperiode instellingen\n• Alle piekprijs periode instellingen\n• Weergave-instellingen\n• Algemene instellingen\n\n**Wat wordt NIET gereset:**\n• Je Tibber API-token\n• Geselecteerd huis\n• Valuta\n\n**💡 Tip:** Dit is handig als je opnieuw wilt beginnen na het experimenteren met instellingen.", + "data": { + "confirm_reset": "Ja, reset alles naar standaardwaarden" + }, + "submit": "Nu Resetten" + }, + "price_level": { + "title": "🏷️ Prijsniveau-instellingen", + "description": "**Configureer stabilisatie voor Tibbers prijsniveau-classificatie (zeer goedkoop/goedkoop/normaal/duur/zeer duur).**\n\nTibbers API levert een prijsniveau-veld voor elk interval. Deze instelling egaliseer korte fluctuaties om instabiliteit in automatiseringen te voorkomen.{entity_warning}", + "data": { + "price_level_gap_tolerance": "Gap-tolerantie" + }, + "data_description": { + "price_level_gap_tolerance": "Maximaal aantal opeenvolgende intervallen dat 'afgevlakt' kan worden als ze afwijken van omringende prijsniveaus. Kleine geïsoleerde niveauwijzigingen worden samengevoegd met het dominante aangrenzende blok. Voorbeeld: 1 betekent dat een enkel 'normaal'-interval omringd door 'goedkoop'-intervallen wordt gecorrigeerd naar 'goedkoop'. Stel in op 0 om uit te schakelen. Standaard: 1" + }, + "submit": "↩ Opslaan & terug" + } + }, + "error": { + "auth": "Het Tibber-toegangstoken is ongeldig.", + "connection": "Kan geen verbinding maken met Tibber. Controleer je internetverbinding.", + "unknown": "Er is een onverwachte fout opgetreden. Controleer de logs voor details.", + "cannot_connect": "Verbinding mislukt", + "invalid_access_token": "Ongeldig toegangstoken", + "different_home": "Het toegangstoken is niet geldig voor het huis-ID waarvoor deze integratie is geconfigureerd.", + "invalid_period_length": "Periode lengte moet minimaal 15 minuten zijn (veelvouden van 15).", + "invalid_flex": "Flexibiliteitspercentage moet tussen -50% en +50% zijn", + "invalid_best_price_distance": "Afstandspercentage moet tussen -50% en 0% zijn (negatief = onder gemiddelde)", + "invalid_peak_price_distance": "Afstandspercentage moet tussen 0% en 50% zijn (positief = boven gemiddelde)", + "invalid_min_periods": "Minimaal aantal periodes moet tussen 1 en 10 zijn", + "invalid_gap_count": "Gat telling moet tussen 0 en 8 zijn", + "invalid_relaxation_attempts": "Relaxatie pogingen moeten tussen 1 en 12 zijn", + "invalid_price_rating_low": "Lage prijsbeoordeling drempel moet tussen -50% en -5% zijn", + "invalid_price_rating_high": "Hoge prijsbeoordeling drempel moet tussen 5% en 50% zijn", + "invalid_price_rating_thresholds": "Lage drempel moet lager zijn dan hoge drempel", + "invalid_volatility_threshold_moderate": "Gematigde volatiliteit drempel moet tussen 5% en 25% zijn", + "invalid_volatility_threshold_high": "Hoge volatiliteit drempel moet tussen 20% en 40% zijn", + "invalid_volatility_threshold_very_high": "Zeer hoge volatiliteit drempel moet tussen 35% en 80% zijn", + "invalid_volatility_thresholds": "Drempelwaarden moeten in oplopende volgorde zijn: gematigd < hoog < zeer hoog", + "invalid_price_trend_rising": "Stijgende trend drempel moet tussen 1% en 50% zijn", + "invalid_price_trend_falling": "Dalende trend drempel moet tussen -50% en -1% zijn", + "invalid_price_trend_strongly_rising": "Sterk stijgende trend drempel moet tussen 2% en 100% zijn", + "invalid_price_trend_strongly_falling": "Sterk dalende trend drempel moet tussen -100% en -2% zijn", + "invalid_trend_strongly_rising_less_than_rising": "Sterk stijgende drempel moet hoger zijn dan stijgende drempel", + "invalid_trend_strongly_falling_greater_than_falling": "Sterk dalende drempel moet lager (meer negatief) zijn dan dalende drempel" + }, + "abort": { + "entry_not_found": "Tibber-configuratie-item niet gevonden.", + "reset_cancelled": "Reset geannuleerd. Er zijn geen wijzigingen aangebracht in je configuratie.", + "reset_successful": "✅ Alle instellingen zijn teruggezet naar fabrieksinstellingen. Je configuratie is nu als een nieuwe installatie.", + "finished": "Configuratie voltooid." + } + }, + "entity": { + "sensor": { + "current_interval_price": { + "name": "Huidige Elektriciteitsprijs" + }, + "current_interval_price_base": { + "name": "Huidige Elektriciteitsprijs (Energie Dashboard)" + }, + "next_interval_price": { + "name": "Volgende Elektriciteitsprijs" + }, + "previous_interval_price": { + "name": "Vorige Elektriciteitsprijs" + }, + "current_hour_average_price": { + "name": "⌀ Uurprijs Huidig" + }, + "next_hour_average_price": { + "name": "⌀ Uurprijs Volgend" + }, + "current_interval_price_level": { + "name": "Huidig Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" } - }, - "entity": { - "sensor": { - "current_interval_price": { - "name": "Huidige Elektriciteitsprijs" - }, - "current_interval_price_base": { - "name": "Huidige Elektriciteitsprijs (Energie Dashboard)" - }, - "next_interval_price": { - "name": "Volgende Elektriciteitsprijs" - }, - "previous_interval_price": { - "name": "Vorige Elektriciteitsprijs" - }, - "current_hour_average_price": { - "name": "⌀ Uurprijs Huidig" - }, - "next_hour_average_price": { - "name": "⌀ Uurprijs Volgend" - }, - "current_interval_price_level": { - "name": "Huidig Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "next_interval_price_level": { - "name": "Volgend Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "previous_interval_price_level": { - "name": "Vorig Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "current_hour_price_level": { - "name": "Huidig Uur Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "next_hour_price_level": { - "name": "Volgend Uur Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "lowest_price_today": { - "name": "Laagste Prijs Vandaag" - }, - "highest_price_today": { - "name": "Hoogste Prijs Vandaag" - }, - "average_price_today": { - "name": "⌀ Prijs Vandaag" - }, - "lowest_price_tomorrow": { - "name": "Laagste Prijs Morgen" - }, - "highest_price_tomorrow": { - "name": "Hoogste Prijs Morgen" - }, - "average_price_tomorrow": { - "name": "⌀ Prijs Morgen" - }, - "yesterday_price_level": { - "name": "Gisteren Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "today_price_level": { - "name": "Vandaag Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "tomorrow_price_level": { - "name": "Morgen Prijsniveau", - "state": { - "very_cheap": "Zeer Goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer Duur" - } - }, - "yesterday_price_rating": { - "name": "Gisteren Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "today_price_rating": { - "name": "Vandaag Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "tomorrow_price_rating": { - "name": "Morgen Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "trailing_price_average": { - "name": "⌀ Prijs Afgelopen 24u" - }, - "leading_price_average": { - "name": "⌀ Prijs Komende 24u" - }, - "trailing_price_min": { - "name": "Afgelopen 24u Minimumprijs" - }, - "trailing_price_max": { - "name": "Afgelopen 24u Maximumprijs" - }, - "leading_price_min": { - "name": "Komende 24u Minimumprijs" - }, - "leading_price_max": { - "name": "Komende 24u Maximumprijs" - }, - "current_interval_price_rating": { - "name": "Huidige Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "next_interval_price_rating": { - "name": "Volgende Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "previous_interval_price_rating": { - "name": "Vorige Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "current_hour_price_rating": { - "name": "Huidig Uur Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "next_hour_price_rating": { - "name": "Volgend Uur Prijsbeoordeling", - "state": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "next_avg_1h": { - "name": "⌀ Prijs Komende 1u" - }, - "next_avg_2h": { - "name": "⌀ Prijs Komende 2u" - }, - "next_avg_3h": { - "name": "⌀ Prijs Komende 3u" - }, - "next_avg_4h": { - "name": "⌀ Prijs Komende 4u" - }, - "next_avg_5h": { - "name": "⌀ Prijs Komende 5u" - }, - "next_avg_6h": { - "name": "⌀ Prijs Komende 6u" - }, - "next_avg_8h": { - "name": "⌀ Prijs Komende 8u" - }, - "next_avg_12h": { - "name": "⌀ Prijs Komende 12u" - }, - "price_outlook_1h": { - "name": "Prijsvooruitzicht (1u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_2h": { - "name": "Prijsvooruitzicht (2u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_3h": { - "name": "Prijsvooruitzicht (3u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_4h": { - "name": "Prijsvooruitzicht (4u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_5h": { - "name": "Prijsvooruitzicht (5u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_6h": { - "name": "Prijsvooruitzicht (6u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_8h": { - "name": "Prijsvooruitzicht (8u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_outlook_12h": { - "name": "Prijsvooruitzicht (12u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_2h": { - "name": "Prijstrajectorie (2u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_3h": { - "name": "Prijstrajectorie (3u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_4h": { - "name": "Prijstrajectorie (4u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_5h": { - "name": "Prijstrajectorie (5u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_6h": { - "name": "Prijstrajectorie (6u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_8h": { - "name": "Prijstrajectorie (8u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "price_trajectory_12h": { - "name": "Prijstrajectorie (12u)", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "current_price_trend": { - "name": "Huidige Prijstrend", - "state": { - "strongly_rising": "Sterk stijgend", - "rising": "Stijgend", - "stable": "Stabiel", - "falling": "Dalend", - "strongly_falling": "Sterk dalend" - } - }, - "next_price_trend_change": { - "name": "Volgende Prijstrend Wijziging" - }, - "next_price_trend_change_in": { - "name": "Volgende Prijstrend Wijziging over" - }, - "daily_rating": { - "name": "Dagelijkse Prijsbeoordeling" - }, - "monthly_rating": { - "name": "Maandelijkse Prijsbeoordeling" - }, - "data_lifecycle_status": { - "name": "Data Levenscyclus Status", - "state": { - "cached": "Gecachet", - "fresh": "Vers", - "refreshing": "Vernieuwen", - "searching_tomorrow": "Morgen Zoeken", - "turnover_pending": "Omslag In Behandeling", - "error": "Fout" - } - }, - "today_volatility": { - "name": "Vandaag Prijsvolatiliteit", - "state": { - "low": "Laag", - "moderate": "Gematigd", - "high": "Hoog", - "very_high": "Zeer Hoog" - } - }, - "tomorrow_volatility": { - "name": "Morgen Prijsvolatiliteit", - "state": { - "low": "Laag", - "moderate": "Gematigd", - "high": "Hoog", - "very_high": "Zeer Hoog" - } - }, - "next_24h_volatility": { - "name": "Komende 24u Prijsvolatiliteit", - "state": { - "low": "Laag", - "moderate": "Gematigd", - "high": "Hoog", - "very_high": "Zeer Hoog" - } - }, - "today_tomorrow_volatility": { - "name": "Vandaag+Morgen Prijsvolatiliteit", - "state": { - "low": "Laag", - "moderate": "Gematigd", - "high": "Hoog", - "very_high": "Zeer Hoog" - } - }, - "best_price_end_time": { - "name": "Beste Prijs Einde" - }, - "best_price_period_duration": { - "name": "Beste Prijs Duur" - }, - "best_price_remaining_minutes": { - "name": "Beste Prijs Resterende Tijd" - }, - "best_price_progress": { - "name": "Beste Prijs Voortgang" - }, - "best_price_next_start_time": { - "name": "Beste Prijs Start" - }, - "best_price_next_in_minutes": { - "name": "Beste Prijs Start Over" - }, - "peak_price_end_time": { - "name": "Piekprijs Einde" - }, - "peak_price_period_duration": { - "name": "Piekprijs Duur" - }, - "peak_price_remaining_minutes": { - "name": "Piekprijs Resterende Tijd" - }, - "peak_price_progress": { - "name": "Piekprijs Voortgang" - }, - "peak_price_next_start_time": { - "name": "Piekprijs Start" - }, - "peak_price_next_in_minutes": { - "name": "Piekprijs Start Over" - }, - "home_type": { - "name": "Huistype", - "state": { - "apartment": "Appartement", - "rowhouse": "Rijtjeshuis", - "house": "Huis", - "cottage": "Huisje" - } - }, - "home_size": { - "name": "Huisgrootte" - }, - "main_fuse_size": { - "name": "Hoofdzekering Grootte" - }, - "number_of_residents": { - "name": "Aantal Bewoners" - }, - "primary_heating_source": { - "name": "Primaire Verwarmingsbron", - "state": { - "air2air_heatpump": "Lucht-naar-Lucht Warmtepomp", - "air2water_heatpump": "Lucht-naar-Water Warmtepomp", - "boiler": "Boiler", - "central_heating": "Centrale Verwarming", - "district_heating": "Stadsverwarming", - "district": "Stadsverwarming", - "electric_boiler": "Elektrische Boiler", - "electricity": "Elektriciteit", - "floor": "Vloerverwarming", - "gas": "Gas", - "ground_heatpump": "Bodem Warmtepomp", - "ground": "Bodem Warmtepomp", - "oil": "Olie", - "other": "Overig", - "waste": "Restwarmte" - } - }, - "grid_company": { - "name": "Netbedrijf" - }, - "grid_area_code": { - "name": "Netgebiedcode" - }, - "price_area_code": { - "name": "Prijsgebiedcode" - }, - "consumption_ean": { - "name": "Verbruik EAN" - }, - "production_ean": { - "name": "Productie EAN" - }, - "energy_tax_type": { - "name": "Energiebelasting Type" - }, - "vat_type": { - "name": "BTW Type" - }, - "estimated_annual_consumption": { - "name": "Geschat Jaarverbruik" - }, - "subscription_status": { - "name": "Abonnement Status", - "state": { - "running": "Actief", - "ended": "Beëindigd", - "pending": "In Afwachting", - "unknown": "Onbekend" - } - }, - "day_pattern_yesterday": { - "name": "Prijspatroon Gisteren", - "state": { - "valley": "Dal", - "peak": "Piek", - "double_valley": "Dubbel Dal", - "double_peak": "Dubbele Piek", - "flat": "Vlak", - "rising": "Stijgend", - "falling": "Dalend", - "mixed": "Gemengd" - } - }, - "day_pattern_today": { - "name": "Prijspatroon Vandaag", - "state": { - "valley": "Dal", - "peak": "Piek", - "double_valley": "Dubbel Dal", - "double_peak": "Dubbele Piek", - "flat": "Vlak", - "rising": "Stijgend", - "falling": "Dalend", - "mixed": "Gemengd" - } - }, - "day_pattern_tomorrow": { - "name": "Prijspatroon Morgen", - "state": { - "valley": "Dal", - "peak": "Piek", - "double_valley": "Dubbel Dal", - "double_peak": "Dubbele Piek", - "flat": "Vlak", - "rising": "Stijgend", - "falling": "Dalend", - "mixed": "Gemengd" - } - }, - "chart_data_export": { - "name": "Grafiekdata Export", - "state": { - "pending": "In Afwachting", - "ready": "Gereed", - "error": "Fout" - } - }, - "chart_metadata": { - "name": "Grafiek Metadata", - "state": { - "pending": "In Afwachting", - "ready": "Gereed", - "error": "Fout" - } - } - }, - "binary_sensor": { - "peak_price_period": { - "name": "Piekprijs Periode" - }, - "best_price_period": { - "name": "Beste Prijs Periode" - }, - "connection": { - "name": "Tibber API Verbinding" - }, - "tomorrow_data_available": { - "name": "Morgen Gegevens Beschikbaar" - }, - "has_ventilation_system": { - "name": "Heeft Ventilatiesysteem" - }, - "realtime_consumption_enabled": { - "name": "Realtime Verbruik Ingeschakeld" - } - }, - "number": { - "best_price_flex_override": { - "name": "Beste prijs: Flexibiliteit" - }, - "best_price_min_distance_override": { - "name": "Beste prijs: Minimale afstand" - }, - "best_price_min_period_length_override": { - "name": "Beste prijs: Minimale periodelengte" - }, - "best_price_min_periods_override": { - "name": "Beste prijs: Minimum periodes" - }, - "best_price_relaxation_attempts_override": { - "name": "Beste prijs: Versoepeling pogingen" - }, - "best_price_gap_count_override": { - "name": "Beste prijs: Gap tolerantie" - }, - "peak_price_flex_override": { - "name": "Piekprijs: Flexibiliteit" - }, - "peak_price_min_distance_override": { - "name": "Piekprijs: Minimale afstand" - }, - "peak_price_min_period_length_override": { - "name": "Piekprijs: Minimale periodelengte" - }, - "peak_price_min_periods_override": { - "name": "Piekprijs: Minimum periodes" - }, - "peak_price_relaxation_attempts_override": { - "name": "Piekprijs: Versoepeling pogingen" - }, - "peak_price_gap_count_override": { - "name": "Piekprijs: Gap tolerantie" - } - }, - "switch": { - "best_price_enable_relaxation_override": { - "name": "Beste prijs: Minimum aantal bereiken" - }, - "peak_price_enable_relaxation_override": { - "name": "Piekprijs: Minimum aantal bereiken" - } + }, + "next_interval_price_level": { + "name": "Volgend Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" } - }, - "issues": { - "new_homes_available": { - "title": "Nieuwe Tibber huizen gedetecteerd", - "description": "We hebben {count} nieuw(e) huis/huizen gedetecteerd op je Tibber-account: {homes}. Je kunt ze toevoegen aan Home Assistant via de Tibber integratie configuratie." - }, - "homes_removed": { - "title": "Tibber huizen verwijderd", - "description": "We hebben gedetecteerd dat {count} huis/huizen zijn verwijderd van je Tibber-account: {homes}. Controleer je Tibber integratie configuratie." - }, - "tomorrow_data_missing": { - "title": "Morgen prijsgegevens ontbreken voor {home_name}", - "description": "Morgen elektriciteitsprijs gegevens zijn nog steeds niet beschikbaar na {warning_hour}:00. Dit is ongebruikelijk, omdat Tibber normaal gesproken morgen prijzen publiceert in de middag (rond 13:00-14:00 CET).\n\nMogelijke oorzaken:\n- Tibber heeft morgen prijzen nog niet gepubliceerd\n- Tijdelijke API-problemen\n- Je elektriciteitsleverancier heeft nog geen prijzen ingediend bij Tibber\n\nDit probleem lost zich automatisch op zodra morgen gegevens beschikbaar worden. Als dit na 20:00 aanhoudt, controleer dan de Tibber-app of neem contact op met Tibber support." - }, - "rate_limit_exceeded": { - "title": "API rate limiet overschreden voor {home_name}", - "description": "De Tibber API heeft deze integratie beperkt na {error_count} opeenvolgende fouten. Dit betekent dat verzoeken te frequent worden gedaan.\n\nDe integratie zal automatisch opnieuw proberen met toenemende vertragingen. Dit probleem lost zich op zodra de rate limiet verloopt.\n\nAls dit meerdere uren aanhoudt, overweeg dan:\n- Te controleren of meerdere Home Assistant instanties hetzelfde API-token gebruiken\n- Te verifiëren dat geen andere applicaties intensief je Tibber API-token gebruiken\n- De update frequentie te verlagen als je deze hebt aangepast" - }, - "home_not_found": { - "title": "Huis {home_name} niet gevonden in Tibber-account", - "description": "Het huis geconfigureerd in deze integratie (entry ID: {entry_id}) is niet langer beschikbaar in je Tibber-account. Dit gebeurt meestal wanneer:\n- Het huis is verwijderd uit je Tibber-account\n- Het huis is verplaatst naar een ander Tibber-account\n- Toegang tot dit huis is ingetrokken\n\nVerwijder dit integratie-item en voeg het opnieuw toe als het huis nog steeds gemonitord moet worden. Om dit item te verwijderen, ga naar Instellingen → Apparaten & Services → Tibber Prices en verwijder de {home_name} configuratie." - }, - "entity_migration": { - "title": "Tibber Prices: Actie vereist na update ({home_name})", - "description": "Deze update bevat wijzigingen die automatisch zijn toegepast.\n\n**Hernoemde entiteiten ({count})**\n\nDe volgende entity-sleutels zijn hernoemd. Je bestaande entity-ID's en automatiseringen blijven intact:\n\n{entity_list}\n\n**Gewijzigde duur-sensorwaarden**\n\nAlle duur-sensoren (resterende tijd, start over, periodeduur, trendwijzigings-aftelling) rapporteren hun statuswaarde nu in **minuten** in plaats van uren. De weergave-eenheid in dashboards blijft standaard uren.\n\nAls je automatiseringen hebt met numerieke vergelijkingen op deze sensoren, werk dan je drempelwaarden bij:\n- Oud: `state < 0.25` (15 minuten als uren)\n- Nieuw: `state < 15` (15 minuten)\n\nSluit deze melding nadat je je automatiseringen hebt gecontroleerd." + }, + "previous_interval_price_level": { + "name": "Vorig Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" } - }, - "exceptions": { - "no_entries_found": { - "message": "Geen Tibber Prices integratie-items gevonden. Stel de integratie eerst in." - }, - "multiple_entries_no_entry_id": { - "message": "Meerdere Tibber Prices items gevonden. Geef 'entry_id' op om het gewenste item te selecteren." - }, - "invalid_entry_id": { - "message": "Ongeldige of niet-beschikbare configuratie-item. Controleer de item-ID en zorg dat de integratie geladen is." - }, - "missing_home_id": { - "message": "Huis-ID niet gevonden in het configuratie-item. Configureer de integratie opnieuw." - }, - "user_data_not_available": { - "message": "Gebruikersgegevens zijn nog niet beschikbaar. Wacht tot de eerste gegevensupdate is voltooid." - }, - "timezone_not_found": { - "message": "Kon de tijdzone van het huis niet bepalen. Controleer de huisconfiguratie in je Tibber-account." - }, - "end_before_start": { - "message": "Eindtijd moet na de starttijd liggen." - }, - "price_fetch_failed": { - "message": "Kon prijsgegevens niet ophalen bij de Tibber API. Probeer het later opnieuw." - }, - "invalid_search_scope": { - "message": "Ongeldig zoekbereik. Geldige waarden zijn: today, tomorrow, remaining_today, next_24h, next_48h." - }, - "scope_conflicts_with_range": { - "message": "search_scope kan niet gecombineerd worden met expliciete bereikparameters: {params}. Gebruik search_scope OF expliciete start-/eindparameters." - }, - "day_offset_requires_time": { - "message": "{offset_param} vereist dat {time_param} ingesteld is. Dagoffset wijzigt alleen de datum van een expliciete tijdparameter." - }, - "min_level_exceeds_max": { - "message": "min_price_level '{min_level}' is hoger dan max_price_level '{max_level}'. Het minimumniveau moet gelijk aan of lager zijn dan het maximumniveau." - }, - "power_profile_length_mismatch": { - "message": "power_profile heeft {profile_length} items maar de duur vereist {interval_count} intervallen ({duration_minutes} minuten). Het power_profile moet precies één item per 15-minuten-interval hebben." - }, - "level_and_rating_filter_conflict": { - "message": "level_filter en rating_level_filter kunnen niet samen gebruikt worden. Gebruik slechts één filtertype per verzoek." - }, - "insert_nulls_requires_filter": { - "message": "insert_nulls-modus '{mode}' vereist een level_filter of rating_level_filter om segmenten te definiëren. Zonder filter, gebruik insert_nulls: none." - }, - "connect_segments_requires_segments_mode": { - "message": "connect_segments vereist dat insert_nulls op 'segments' staat. Stel insert_nulls: segments in om segmentverbinding te gebruiken." - }, - "array_fields_requires_array_format": { - "message": "array_fields kan alleen gebruikt worden met output_format: array_of_arrays. Wijzig het uitvoerformaat of verwijder array_fields." - }, - "invalid_array_fields": { - "message": "Ongeldig array_fields-sjabloon. Gebruik veldnamen tussen accolades, bijv. '{start_time}, {price_per_kwh}, {level}'." + }, + "current_hour_price_level": { + "name": "Huidig Uur Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" } - }, - "services": { - "get_price": { - "name": "Prijsgegevens Ophalen", - "description": "Haal prijsgegevens op voor een specifiek tijdsbereik met automatische routing. Ontwikkelings- en testservice voor de price_info_for_range API-functie. Gebruikt automatisch PRICE_INFO, PRICE_INFO_RANGE of beide op basis van de tijdsbereikgrens.", - "fields": { - "entry_id": { - "name": "Entry ID", - "description": "De configuratie entry ID voor de Tibber integratie." - }, - "start_time": { - "name": "Starttijd", - "description": "Begin van het tijdsbereik (inclusief, tijdzonebewust)." - }, - "end_time": { - "name": "Eindtijd", - "description": "Einde van het tijdsbereik (exclusief, tijdzonebewust)." - } - } - }, - "get_apexcharts_yaml": { - "name": "ApexCharts-kaart YAML ophalen", - "description": "⚠️ BELANGRIJK: Deze service genereert een BASALE VOORBEELD-configuratie voor ApexCharts-kaart als startpunt. Het is GEEN complete oplossing voor alle ApexCharts-functies. Deze integratie is primair een GEGEVENSLEVERANCIER. De gegenereerde YAML demonstreert hoe je de `get_chartdata`-service gebruikt om prijsgegevens op te halen. Vanwege de gesegmenteerde aard van onze gegevens (verschillende tijdsperioden per serie) en het gebruik van Home Assistant's service-API in plaats van entiteitsattributen, zijn veel geavanceerde ApexCharts-functies (zoals in_header, bepaalde transformaties) niet compatibel of vereisen handmatige aanpassing. Je bent welkom om de gegenereerde YAML aan te passen voor jouw specifieke behoeften, maar begrijp alsjeblieft dat uitgebreide ApexCharts-configuratieondersteuning buiten het bereik van deze integratie valt. Bijdragen van de gemeenschap met verbeterde configuraties zijn altijd welkom - als je een betere setup vindt die werkt, deel het dan alsjeblieft zodat iedereen ervan kan profiteren! Voor directe gegevenstoegang om je eigen grafieken te bouwen, gebruik in plaats daarvan de `get_chartdata`-service.", - "fields": { - "entry_id": { - "name": "Invoer-ID", - "description": "Het configuratie-invoer-ID voor de Tibber-integratie." - }, - "day": { - "name": "Dag", - "description": "Welke dag gevisualiseerd moet worden (standaard: Rollend venster). Vaste dagopties (Gisteren/Vandaag/Morgen) tonen 24u-vensters zonder extra afhankelijkheden. Dynamische opties vereisen config-template-card: Rollend venster creëert een vast 48u-venster dat automatisch wisselt tussen gisteren+vandaag en vandaag+morgen op basis van databeschikbaarheid. Rollend venster (Auto-Zoom) gedraagt zich hetzelfde maar zoomt bovendien automatisch in (2u terugkijken + resterende tijd tot middernacht, graph_span neemt elke 15 minuten af)." - }, - "level_type": { - "name": "Niveautype", - "description": "Selecteer welke prijsniveauclassificatie gevisualiseerd moet worden: 'rating_level' (laag/normaal/hoog op basis van jouw geconfigureerde drempelwaarden) of 'level' (Tibber API-niveaus: zeer goedkoop/goedkoop/normaal/duur/zeer duur)." - }, - "highlight_best_price": { - "name": "Beste prijsperiodes markeren", - "description": "Voeg een halfdo0rzichtige groene overlay toe om de beste prijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de optimale tijden voor energieverbruik te identificeren." - }, - "highlight_peak_price": { - "name": "Piekprijsperiodes markeren", - "description": "Voeg een halfdoorzichtige rode overlay toe om de piekprijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de tijden te identificeren wanneer energie het duurst is." - }, - "resolution": { - "name": "Resolutie", - "description": "Tijdresolutie voor de grafiekdata. 'interval' (standaard): Originele 15-minutenintervallen (96 punten per dag). 'hourly': Geaggregeerde uurwaarden met een rollend 60-minutenvenster (24 punten per dag) voor een overzichtelijkere grafiek." - } - } - }, - "get_chartdata": { - "name": "Grafiekdata Ophalen", - "description": "Geeft prijsgegevens terug in een eenvoudig grafiekvriendelijk formaat compatibel met de Tibber Core-integratie outputstructuur. Perfect voor gebruik met populaire grafiekkaarten zoals ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card of de ingebouwde History Graph Card. Veldnamen en gegevensstructuur kunnen worden aangepast aan de vereisten van je grafiek.", - "sections": { - "general": { - "name": "Algemeen", - "description": "Basisopties voor het ophalen van grafiekgegevens." - }, - "selection": { - "name": "Selectie", - "description": "Selecteer welke gegevens in de uitvoer moeten worden opgenomen." - }, - "filters": { - "name": "Filters", - "description": "Filter gegevens op basis van prijsniveaus, prijsbeoordelingen of speciale periodes." - }, - "transformation": { - "name": "Gegevens transformeren", - "description": "Transformeer de gegevensuitvoer voor betere grafiekcompatibiliteit." - }, - "format": { - "name": "Formaat", - "description": "Pas het uitvoerformaat aan." - }, - "arrays_of_arrays": { - "name": "Geavanceerde uitvoerinstellingen: Array van arrays", - "description": "Instellingen voor uitvoerformaat bij gebruik van array van arrays." - }, - "arrays_of_objects": { - "name": "Geavanceerde uitvoerinstellingen: Array van objecten", - "description": "Instellingen voor uitvoerformaat bij gebruik van array van objecten." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "day": { - "name": "Dag", - "description": "Voor welke dag(en) moeten prijzen worden opgehaald. Je kunt meerdere dagen selecteren. Als niet opgegeven, wordt een rollend 2-daags venster geretourneerd: vandaag+morgen (wanneer morgengegevens beschikbaar zijn) of gisteren+vandaag (wanneer morgengegevens nog niet beschikbaar zijn). Dit zorgt voor een continue grafiekweergave zonder hiaten." - }, - "resolution": { - "name": "Resolutie", - "description": "Tijdsresolutie voor de geretourneerde gegevens. Opties: 'interval' (standaard, 15-minuten intervallen, 96 datapunten per dag), 'hourly' (uurgemiddelden, 24 datapunten per dag)." - }, - "output_format": { - "name": "Uitvoerformaat", - "description": "Uitvoerformaat voor de geretourneerde gegevens. Opties: 'array_of_objects' (standaard, array van objecten met aanpasbare veldnamen), 'array_of_arrays' (array van [tijdstempel, prijs]-arrays met afsluitend null-punt voor stepline-grafieken)." - }, - "array_fields": { - "name": "Array-velden", - "description": "Definieer welke velden moeten worden opgenomen. Gebruik veldnamen tussen accolades, gescheiden door komma's. Beschikbare velden: start_time, price_per_kwh, level, rating_level, average. Velden worden automatisch ingeschakeld, zelfs als include_*-opties niet zijn ingesteld. Laat leeg voor standaard (alleen tijdstempel en prijs)." - }, - "subunit_currency": { - "name": "Subeenheid valuta", - "description": "Retourneer prijzen in subeenheid valuta-eenheden (cent voor EUR, øre voor NOK/SEK) in plaats van basisvaluta-eenheden. Standaard uitgeschakeld." - }, - "round_decimals": { - "name": "Decimalen afronden", - "description": "Aantal decimalen om prijzen op af te ronden (0-10). Indien niet opgegeven, wordt de standaardprecisie gebruikt (4 decimalen voor basisvaluta, 2 voor subeenheid valuta)." - }, - "include_level": { - "name": "Prijsniveau opnemen", - "description": "Voeg het Tibber-prijsniveauveld (zeer goedkoop/goedkoop/normaal/duur/zeer duur) toe aan elk gegevenspunt." - }, - "include_rating_level": { - "name": "Prijsbeoordeling opnemen", - "description": "Voeg het berekende prijsbeoordelingsveld (laag/normaal/hoog) toe op basis van jouw geconfigureerde drempels aan elk gegevenspunt." - }, - "include_average": { - "name": "Gemiddelde opnemen", - "description": "Dagelijkse gemiddelde prijs opnemen in elk gegevenspunt ter vergelijking." - }, - "include_energy": { - "name": "Energieprijs opnemen", - "description": "De kale energie-/spotprijs (exclusief belastingen en heffingen) opnemen in elk gegevenspunt. Dit is het 'energy'-veld uit de Tibber-API, handig voor teruglever-/salderingsberekeningen." - }, - "include_tax": { - "name": "Belasting opnemen", - "description": "Het belastingdeel van de prijs opnemen in elk gegevenspunt. Dit is het 'tax'-veld uit de Tibber-API, dat heffingen, belastingen en netwerkkosten vertegenwoordigt." - }, - "level_filter": { - "name": "Prijsniveaufilter", - "description": "Intervallen filteren om alleen specifieke Tibber-prijsniveaus op te nemen (zeer goedkoop/goedkoop/normaal/duur/zeer duur). Indien niet opgegeven, worden alle niveaus opgenomen." - }, - "rating_level_filter": { - "name": "Prijsbeoordeling Filter", - "description": "Filter intervallen om alleen specifieke prijsbeoordelingen op te nemen (laag/normaal/hoog). Als dit niet is opgegeven, worden alle beoordelingen opgenomen." - }, - "period_filter": { - "name": "Periode Filter", - "description": "Filter intervallen om alleen die binnen Beste prijs- of Piek prijs-perioden op te nemen. Opties: 'best_price' (alleen intervallen in Beste prijs-perioden), 'peak_price' (alleen intervallen in Piek prijs-perioden). Als niet opgegeven, worden alle intervallen opgenomen. Gebruikt vooraf berekende periodegegevens van binaire sensoren." - }, - "insert_nulls": { - "name": "NULL-waarden invoegen", - "description": "Beheer het invoegen van NULL-waarden voor gefilterde gegevens. 'none' (standaard): Geen NULL-waarden, alleen overeenkomende intervallen. 'segments': Voeg NULL-punten toe bij segmentgrenzen voor schone gaten in grafieken (aanbevolen voor traplijngrafieken). 'all': Voeg NULL in voor alle tijdstempels waarbij het filter niet overeenkomt (handig voor continue tijdreeksvisualisatie)." - }, - "connect_segments": { - "name": "Segmenten verbinden", - "description": "[ALLEEN MET 'NULL-waarden invoegen'] Indien ingeschakeld, worden verbindingspunten toegevoegd bij segmentgrenzen om verschillende prijsniveau-segmenten visueel te verbinden in traplijngrafieken. Wanneer de prijs DAALT, wordt een punt met de lagere prijs toegevoegd aan het einde van het huidige segment. Wanneer de prijs STIJGT, wordt een houdpunt toegevoegd vóór de gat. Dit creëert vloeiende visuele overgangen tussen segmenten in plaats van abrupte gaten." - }, - "add_trailing_null": { - "name": "Voeg afsluitend null-punt toe", - "description": "Voeg een laatste datapunt met null-waarden (behalve tijdstempel) toe aan het einde. Sommige diagrambibliotheken hebben dit nodig om extrapolatie/interpolatie naar de rand van het viewport te voorkomen bij stepline-weergave. Laat uitgeschakeld tenzij je diagram dit vereist." - }, - "start_time_field": { - "name": "Starttijd-veldnaam", - "description": "Aangepaste naam voor het starttijd-veld in de uitvoer. Standaard is 'start_time' als niet opgegeven." - }, - "end_time_field": { - "name": "Eindtijd-veldnaam", - "description": "Aangepaste naam voor het eindtijd-veld in de uitvoer. Standaard is 'end_time' als niet opgegeven. Alleen gebruikt met period_filter." - }, - "price_field": { - "name": "Prijsveld-naam", - "description": "Aangepaste naam voor het prijsveld in de uitvoer. Standaard is 'price_per_kwh'." - }, - "level_field": { - "name": "Prijsniveauveld-naam", - "description": "Aangepaste naam voor het prijsniveauveld in de uitvoer. Standaard is 'level'. Alleen gebruikt wanneer include_level is ingeschakeld." - }, - "rating_level_field": { - "name": "Prijsbeoordelingsveld-naam", - "description": "Aangepaste naam voor het prijsbeoordelingsveld in de uitvoer. Standaard is 'rating_level'. Alleen gebruikt wanneer include_rating_level is ingeschakeld." - }, - "average_field": { - "name": "Gemiddelde veld-naam", - "description": "Aangepaste naam voor het gemiddelde veld in de uitvoer. Standaard is 'average'. Alleen gebruikt wanneer include_average is ingeschakeld." - }, - "energy_field": { - "name": "Energieprijs veld-naam", - "description": "Aangepaste naam voor het energieprijsveld in de uitvoer. Standaard is 'energy_price'. Alleen gebruikt wanneer include_energy is ingeschakeld." - }, - "tax_field": { - "name": "Belasting veld-naam", - "description": "Aangepaste naam voor het belastingveld in de uitvoer. Standaard is 'tax'. Alleen gebruikt wanneer include_tax is ingeschakeld." - }, - "metadata": { - "name": "Metadata", - "description": "Beheer metadata-opname in het antwoord. 'include' (standaard): Retourneert zowel grafiekdata als metadata met prijsstatistieken, valuta-info, Y-as suggesties en tijdsbereik. 'only': Retourneert alleen metadata zonder grafiekdata te verwerken (snel, handig voor dynamische Y-as configuratie). 'none': Retourneert alleen grafiekdata zonder metadata." - }, - "data_key": { - "name": "Gegevenssleutel", - "description": "Aangepaste naam voor de gegevenssleutel op het hoogste niveau in het antwoord. Standaard is 'data' als niet opgegeven." - } - } - }, - "refresh_user_data": { - "name": "Gebruikersgegevens vernieuwen", - "description": "Forceert een vernieuwing van de gebruikersgegevens (huizen, profielinformatie) van de Tibber API. Dit kan handig zijn na het maken van wijzigingen in je Tibber-account of bij het oplossen van verbindingsproblemen.", - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - } - } - }, - "find_cheapest_block": { - "name": "Goedkoopste blok vinden", - "description": "Vindt het goedkoopste aaneengesloten tijdvenster van een bepaalde duur. Ontworpen voor apparaatplanning: vaatwasser, wasmachine, droger enz. Retourneert het goedkoopste venster met start-/eindtijden en prijsstatistieken.", - "sections": { - "search_range": { - "name": "Zoekbereik", - "description": "Definieer het tijdvenster voor het zoeken." - }, - "time_alternatives": { - "name": "Alternatieve tijdbereiksopties", - "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." - }, - "price_filter": { - "name": "Prijsniveau-filter", - "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." - }, - "output": { - "name": "Uitvoeropties", - "description": "Stuur kostnadsraming en vergelijkingsuitvoer." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "duration": { - "name": "Duur", - "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur." - }, - "search_start": { - "name": "Zoekstart", - "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." - }, - "search_end": { - "name": "Zoekeinde", - "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." - }, - "search_start_time": { - "name": "Zoekstart-tijd", - "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." - }, - "search_start_day_offset": { - "name": "Zoekstart dagoffset", - "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." - }, - "search_end_time": { - "name": "Zoekeinde-tijd", - "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." - }, - "search_end_day_offset": { - "name": "Zoekeinde dagoffset", - "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." - }, - "search_start_offset_minutes": { - "name": "Zoekstart-offset (minuten)", - "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." - }, - "search_end_offset_minutes": { - "name": "Zoekeinde-offset (minuten)", - "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." - }, - "include_current_interval": { - "name": "Huidig interval opnemen", - "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." - }, - "use_base_unit": { - "name": "Basisvaluta gebruiken", - "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." - }, - "search_scope": { - "name": "Zoekbereik (snelkoppeling)", - "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." - }, - "max_price_level": { - "name": "Maximaal prijsniveau", - "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." - }, - "min_price_level": { - "name": "Minimaal prijsniveau", - "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." - }, - "include_comparison_details": { - "name": "Vergelijkingsdetails meenemen", - "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." - }, - "power_profile": { - "name": "Vermogensprofiel", - "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." - } - } - }, - "find_most_expensive_block": { - "name": "Duurste blok vinden", - "description": "Vindt het duurste aaneengesloten tijdvenster van een bepaalde duur. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert het duurste venster met start-/eindtijden en prijsstatistieken.", - "sections": { - "search_range": { - "name": "Zoekbereik", - "description": "Definieer het tijdvenster voor het zoeken." - }, - "time_alternatives": { - "name": "Alternatieve tijdbereiksopties", - "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." - }, - "price_filter": { - "name": "Prijsniveau-filter", - "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." - }, - "output": { - "name": "Uitvoeropties", - "description": "Stuur kostnadsraming en vergelijkingsuitvoer." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "duration": { - "name": "Duur", - "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur." - }, - "search_start": { - "name": "Zoekstart", - "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." - }, - "search_end": { - "name": "Zoekeinde", - "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." - }, - "search_start_time": { - "name": "Zoekstart-tijd", - "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." - }, - "search_start_day_offset": { - "name": "Zoekstart dagoffset", - "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." - }, - "search_end_time": { - "name": "Zoekeinde-tijd", - "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." - }, - "search_end_day_offset": { - "name": "Zoekeinde dagoffset", - "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." - }, - "search_start_offset_minutes": { - "name": "Zoekstart-offset (minuten)", - "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." - }, - "search_end_offset_minutes": { - "name": "Zoekeinde-offset (minuten)", - "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." - }, - "include_current_interval": { - "name": "Huidig interval opnemen", - "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." - }, - "use_base_unit": { - "name": "Basisvaluta gebruiken", - "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." - }, - "search_scope": { - "name": "Zoekbereik (snelkoppeling)", - "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." - }, - "max_price_level": { - "name": "Maximaal prijsniveau", - "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." - }, - "min_price_level": { - "name": "Minimaal prijsniveau", - "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." - }, - "include_comparison_details": { - "name": "Vergelijkingsdetails meenemen", - "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." - }, - "power_profile": { - "name": "Vermogensprofiel", - "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." - } - } - }, - "find_cheapest_hours": { - "name": "Goedkoopste uren vinden", - "description": "Vindt de goedkoopste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Ontworpen voor flexibele belastingen: batterijladen, elektrisch voertuig, warmwaterboiler. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.", - "sections": { - "search_range": { - "name": "Zoekbereik", - "description": "Definieer het tijdvenster voor het zoeken." - }, - "time_alternatives": { - "name": "Alternatieve tijdbereiksopties", - "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." - }, - "price_filter": { - "name": "Prijsniveau-filter", - "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." - }, - "output": { - "name": "Uitvoeropties", - "description": "Stuur kostnadsraming en vergelijkingsuitvoer." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "duration": { - "name": "Duur", - "description": "Benodigde goedkope totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur." - }, - "search_start": { - "name": "Zoekstart", - "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." - }, - "search_end": { - "name": "Zoekeinde", - "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." - }, - "search_start_time": { - "name": "Zoekstart-tijd", - "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." - }, - "search_start_day_offset": { - "name": "Zoekstart dagoffset", - "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." - }, - "search_end_time": { - "name": "Zoekeinde-tijd", - "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." - }, - "search_end_day_offset": { - "name": "Zoekeinde dagoffset", - "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." - }, - "search_start_offset_minutes": { - "name": "Zoekstart-offset (minuten)", - "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." - }, - "search_end_offset_minutes": { - "name": "Zoekeinde-offset (minuten)", - "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." - }, - "include_current_interval": { - "name": "Huidig interval opnemen", - "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." - }, - "min_segment_duration": { - "name": "Minimale segmentduur", - "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur." - }, - "use_base_unit": { - "name": "Basisvaluta gebruiken", - "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." - }, - "search_scope": { - "name": "Zoekbereik (snelkoppeling)", - "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." - }, - "max_price_level": { - "name": "Maximaal prijsniveau", - "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." - }, - "min_price_level": { - "name": "Minimaal prijsniveau", - "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." - }, - "include_comparison_details": { - "name": "Vergelijkingsdetails meenemen", - "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." - }, - "power_profile": { - "name": "Vermogensprofiel", - "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." - } - } - }, - "find_most_expensive_hours": { - "name": "Duurste uren vinden", - "description": "Vindt de duurste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.", - "sections": { - "search_range": { - "name": "Zoekbereik", - "description": "Definieer het tijdvenster voor het zoeken." - }, - "time_alternatives": { - "name": "Alternatieve tijdbereiksopties", - "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." - }, - "price_filter": { - "name": "Prijsniveau-filter", - "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." - }, - "output": { - "name": "Uitvoeropties", - "description": "Stuur kostnadsraming en vergelijkingsuitvoer." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "duration": { - "name": "Duur", - "description": "Te vinden dure totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur." - }, - "search_start": { - "name": "Zoekstart", - "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." - }, - "search_end": { - "name": "Zoekeinde", - "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." - }, - "search_start_time": { - "name": "Zoekstart-tijd", - "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." - }, - "search_start_day_offset": { - "name": "Zoekstart dagoffset", - "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." - }, - "search_end_time": { - "name": "Zoekeinde-tijd", - "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." - }, - "search_end_day_offset": { - "name": "Zoekeinde dagoffset", - "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." - }, - "search_start_offset_minutes": { - "name": "Zoekstart-offset (minuten)", - "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." - }, - "search_end_offset_minutes": { - "name": "Zoekeinde-offset (minuten)", - "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." - }, - "include_current_interval": { - "name": "Huidig interval opnemen", - "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." - }, - "min_segment_duration": { - "name": "Minimale segmentduur", - "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur." - }, - "use_base_unit": { - "name": "Basisvaluta gebruiken", - "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." - }, - "search_scope": { - "name": "Zoekbereik (snelkoppeling)", - "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." - }, - "max_price_level": { - "name": "Maximaal prijsniveau", - "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." - }, - "min_price_level": { - "name": "Minimaal prijsniveau", - "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." - }, - "include_comparison_details": { - "name": "Vergelijkingsdetails meenemen", - "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." - }, - "power_profile": { - "name": "Vermogensprofiel", - "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." - } - } - }, - "find_cheapest_schedule": { - "name": "Goedkoopste schema vinden", - "description": "Plant meerdere apparaten optimaal zonder tijdoverlap. Elke taak krijgt het goedkoopste beschikbare aaneengesloten tijdvenster.", - "sections": { - "scheduling_options": { - "name": "Planningsopties", - "description": "Configureer taken en tussenpozen." - }, - "search_range": { - "name": "Zoekbereik", - "description": "Definieer het tijdvenster voor het zoeken." - }, - "time_alternatives": { - "name": "Alternatieve tijdbereiksopties", - "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." - }, - "price_filter": { - "name": "Prijsniveau-filter", - "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." - }, - "output": { - "name": "Uitvoeropties", - "description": "Stuur kostnadsraming en vergelijkingsuitvoer." - } - }, - "fields": { - "entry_id": { - "name": "Item-ID", - "description": "De config-item-ID voor de Tibber-integratie." - }, - "tasks": { - "name": "Taken", - "description": "Lijst van in te plannen taken. Elke taak heeft name (tekst) en duration (hh:mm:ss). Optioneel power_profile (watt per 15-min-interval). Maximaal 4 taken." - }, - "gap_minutes": { - "name": "Tussenpose tussen taken (minuten)", - "description": "Minimale tussenpose in minuten tussen opeenvolgende ingeplande taken. Afgerond omhoog tot 15 minuten. Standaard: 0 (geen tussenpose)." - }, - "search_scope": { - "name": "Zoekbereik (snelkoppeling)", - "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." - }, - "search_start": { - "name": "Zoekstart", - "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." - }, - "search_end": { - "name": "Zoekeinde", - "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." - }, - "search_start_time": { - "name": "Zoekstart-tijd", - "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." - }, - "search_start_day_offset": { - "name": "Zoekstart dagoffset", - "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." - }, - "search_end_time": { - "name": "Zoekeinde-tijd", - "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." - }, - "search_end_day_offset": { - "name": "Zoekeinde dagoffset", - "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." - }, - "search_start_offset_minutes": { - "name": "Zoekstart-offset (minuten)", - "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." - }, - "search_end_offset_minutes": { - "name": "Zoekeinde-offset (minuten)", - "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." - }, - "include_current_interval": { - "name": "Huidig interval opnemen", - "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." - }, - "max_price_level": { - "name": "Maximaal prijsniveau", - "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." - }, - "min_price_level": { - "name": "Minimaal prijsniveau", - "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." - }, - "use_base_unit": { - "name": "Basisvaluta gebruiken", - "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." - } - } + }, + "next_hour_price_level": { + "name": "Volgend Uur Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" } + }, + "lowest_price_today": { + "name": "Laagste Prijs Vandaag" + }, + "highest_price_today": { + "name": "Hoogste Prijs Vandaag" + }, + "average_price_today": { + "name": "⌀ Prijs Vandaag" + }, + "lowest_price_tomorrow": { + "name": "Laagste Prijs Morgen" + }, + "highest_price_tomorrow": { + "name": "Hoogste Prijs Morgen" + }, + "average_price_tomorrow": { + "name": "⌀ Prijs Morgen" + }, + "yesterday_price_level": { + "name": "Gisteren Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" + } + }, + "today_price_level": { + "name": "Vandaag Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" + } + }, + "tomorrow_price_level": { + "name": "Morgen Prijsniveau", + "state": { + "very_cheap": "Zeer Goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer Duur" + } + }, + "yesterday_price_rating": { + "name": "Gisteren Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "today_price_rating": { + "name": "Vandaag Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "tomorrow_price_rating": { + "name": "Morgen Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "trailing_price_average": { + "name": "⌀ Prijs Afgelopen 24u" + }, + "leading_price_average": { + "name": "⌀ Prijs Komende 24u" + }, + "trailing_price_min": { + "name": "Afgelopen 24u Minimumprijs" + }, + "trailing_price_max": { + "name": "Afgelopen 24u Maximumprijs" + }, + "leading_price_min": { + "name": "Komende 24u Minimumprijs" + }, + "leading_price_max": { + "name": "Komende 24u Maximumprijs" + }, + "current_interval_price_rating": { + "name": "Huidige Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "next_interval_price_rating": { + "name": "Volgende Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "previous_interval_price_rating": { + "name": "Vorige Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "current_hour_price_rating": { + "name": "Huidig Uur Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "next_hour_price_rating": { + "name": "Volgend Uur Prijsbeoordeling", + "state": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "next_avg_1h": { + "name": "⌀ Prijs Komende 1u" + }, + "next_avg_2h": { + "name": "⌀ Prijs Komende 2u" + }, + "next_avg_3h": { + "name": "⌀ Prijs Komende 3u" + }, + "next_avg_4h": { + "name": "⌀ Prijs Komende 4u" + }, + "next_avg_5h": { + "name": "⌀ Prijs Komende 5u" + }, + "next_avg_6h": { + "name": "⌀ Prijs Komende 6u" + }, + "next_avg_8h": { + "name": "⌀ Prijs Komende 8u" + }, + "next_avg_12h": { + "name": "⌀ Prijs Komende 12u" + }, + "price_outlook_1h": { + "name": "Prijsvooruitzicht (1u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_2h": { + "name": "Prijsvooruitzicht (2u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_3h": { + "name": "Prijsvooruitzicht (3u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_4h": { + "name": "Prijsvooruitzicht (4u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_5h": { + "name": "Prijsvooruitzicht (5u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_6h": { + "name": "Prijsvooruitzicht (6u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_8h": { + "name": "Prijsvooruitzicht (8u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_outlook_12h": { + "name": "Prijsvooruitzicht (12u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_2h": { + "name": "Prijstrajectorie (2u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_3h": { + "name": "Prijstrajectorie (3u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_4h": { + "name": "Prijstrajectorie (4u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_5h": { + "name": "Prijstrajectorie (5u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_6h": { + "name": "Prijstrajectorie (6u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_8h": { + "name": "Prijstrajectorie (8u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "price_trajectory_12h": { + "name": "Prijstrajectorie (12u)", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "current_price_trend": { + "name": "Huidige Prijstrend", + "state": { + "strongly_rising": "Sterk stijgend", + "rising": "Stijgend", + "stable": "Stabiel", + "falling": "Dalend", + "strongly_falling": "Sterk dalend" + } + }, + "next_price_trend_change": { + "name": "Volgende Prijstrend Wijziging" + }, + "next_price_trend_change_in": { + "name": "Volgende Prijstrend Wijziging over" + }, + "daily_rating": { + "name": "Dagelijkse Prijsbeoordeling" + }, + "monthly_rating": { + "name": "Maandelijkse Prijsbeoordeling" + }, + "data_lifecycle_status": { + "name": "Data Levenscyclus Status", + "state": { + "cached": "Gecachet", + "fresh": "Vers", + "refreshing": "Vernieuwen", + "searching_tomorrow": "Morgen Zoeken", + "turnover_pending": "Omslag In Behandeling", + "error": "Fout" + } + }, + "today_volatility": { + "name": "Vandaag Prijsvolatiliteit", + "state": { + "low": "Laag", + "moderate": "Gematigd", + "high": "Hoog", + "very_high": "Zeer Hoog" + } + }, + "tomorrow_volatility": { + "name": "Morgen Prijsvolatiliteit", + "state": { + "low": "Laag", + "moderate": "Gematigd", + "high": "Hoog", + "very_high": "Zeer Hoog" + } + }, + "next_24h_volatility": { + "name": "Komende 24u Prijsvolatiliteit", + "state": { + "low": "Laag", + "moderate": "Gematigd", + "high": "Hoog", + "very_high": "Zeer Hoog" + } + }, + "today_tomorrow_volatility": { + "name": "Vandaag+Morgen Prijsvolatiliteit", + "state": { + "low": "Laag", + "moderate": "Gematigd", + "high": "Hoog", + "very_high": "Zeer Hoog" + } + }, + "best_price_end_time": { + "name": "Beste Prijs Einde" + }, + "best_price_period_duration": { + "name": "Beste Prijs Duur" + }, + "best_price_remaining_minutes": { + "name": "Beste Prijs Resterende Tijd" + }, + "best_price_progress": { + "name": "Beste Prijs Voortgang" + }, + "best_price_next_start_time": { + "name": "Beste Prijs Start" + }, + "best_price_next_in_minutes": { + "name": "Beste Prijs Start Over" + }, + "peak_price_end_time": { + "name": "Piekprijs Einde" + }, + "peak_price_period_duration": { + "name": "Piekprijs Duur" + }, + "peak_price_remaining_minutes": { + "name": "Piekprijs Resterende Tijd" + }, + "peak_price_progress": { + "name": "Piekprijs Voortgang" + }, + "peak_price_next_start_time": { + "name": "Piekprijs Start" + }, + "peak_price_next_in_minutes": { + "name": "Piekprijs Start Over" + }, + "home_type": { + "name": "Huistype", + "state": { + "apartment": "Appartement", + "rowhouse": "Rijtjeshuis", + "house": "Huis", + "cottage": "Huisje" + } + }, + "home_size": { + "name": "Huisgrootte" + }, + "main_fuse_size": { + "name": "Hoofdzekering Grootte" + }, + "number_of_residents": { + "name": "Aantal Bewoners" + }, + "primary_heating_source": { + "name": "Primaire Verwarmingsbron", + "state": { + "air2air_heatpump": "Lucht-naar-Lucht Warmtepomp", + "air2water_heatpump": "Lucht-naar-Water Warmtepomp", + "boiler": "Boiler", + "central_heating": "Centrale Verwarming", + "district_heating": "Stadsverwarming", + "district": "Stadsverwarming", + "electric_boiler": "Elektrische Boiler", + "electricity": "Elektriciteit", + "floor": "Vloerverwarming", + "gas": "Gas", + "ground_heatpump": "Bodem Warmtepomp", + "ground": "Bodem Warmtepomp", + "oil": "Olie", + "other": "Overig", + "waste": "Restwarmte" + } + }, + "grid_company": { + "name": "Netbedrijf" + }, + "grid_area_code": { + "name": "Netgebiedcode" + }, + "price_area_code": { + "name": "Prijsgebiedcode" + }, + "consumption_ean": { + "name": "Verbruik EAN" + }, + "production_ean": { + "name": "Productie EAN" + }, + "energy_tax_type": { + "name": "Energiebelasting Type" + }, + "vat_type": { + "name": "BTW Type" + }, + "estimated_annual_consumption": { + "name": "Geschat Jaarverbruik" + }, + "subscription_status": { + "name": "Abonnement Status", + "state": { + "running": "Actief", + "ended": "Beëindigd", + "pending": "In Afwachting", + "unknown": "Onbekend" + } + }, + "day_pattern_yesterday": { + "name": "Prijspatroon Gisteren", + "state": { + "valley": "Dal", + "peak": "Piek", + "double_valley": "Dubbel Dal", + "double_peak": "Dubbele Piek", + "flat": "Vlak", + "rising": "Stijgend", + "falling": "Dalend", + "mixed": "Gemengd" + } + }, + "day_pattern_today": { + "name": "Prijspatroon Vandaag", + "state": { + "valley": "Dal", + "peak": "Piek", + "double_valley": "Dubbel Dal", + "double_peak": "Dubbele Piek", + "flat": "Vlak", + "rising": "Stijgend", + "falling": "Dalend", + "mixed": "Gemengd" + } + }, + "day_pattern_tomorrow": { + "name": "Prijspatroon Morgen", + "state": { + "valley": "Dal", + "peak": "Piek", + "double_valley": "Dubbel Dal", + "double_peak": "Dubbele Piek", + "flat": "Vlak", + "rising": "Stijgend", + "falling": "Dalend", + "mixed": "Gemengd" + } + }, + "chart_data_export": { + "name": "Grafiekdata Export", + "state": { + "pending": "In Afwachting", + "ready": "Gereed", + "error": "Fout" + } + }, + "chart_metadata": { + "name": "Grafiek Metadata", + "state": { + "pending": "In Afwachting", + "ready": "Gereed", + "error": "Fout" + } + } }, - "selector": { - "account_choice": { - "options": { - "new_token": "Nieuw Tibber account API-token toevoegen" - } + "binary_sensor": { + "peak_price_period": { + "name": "Piekprijs Periode" + }, + "best_price_period": { + "name": "Beste Prijs Periode" + }, + "connection": { + "name": "Tibber API Verbinding" + }, + "tomorrow_data_available": { + "name": "Morgen Gegevens Beschikbaar" + }, + "has_ventilation_system": { + "name": "Heeft Ventilatiesysteem" + }, + "realtime_consumption_enabled": { + "name": "Realtime Verbruik Ingeschakeld" + } + }, + "number": { + "best_price_flex_override": { + "name": "Beste prijs: Flexibiliteit" + }, + "best_price_min_distance_override": { + "name": "Beste prijs: Minimale afstand" + }, + "best_price_min_period_length_override": { + "name": "Beste prijs: Minimale periodelengte" + }, + "best_price_min_periods_override": { + "name": "Beste prijs: Minimum periodes" + }, + "best_price_relaxation_attempts_override": { + "name": "Beste prijs: Versoepeling pogingen" + }, + "best_price_gap_count_override": { + "name": "Beste prijs: Gap tolerantie" + }, + "peak_price_flex_override": { + "name": "Piekprijs: Flexibiliteit" + }, + "peak_price_min_distance_override": { + "name": "Piekprijs: Minimale afstand" + }, + "peak_price_min_period_length_override": { + "name": "Piekprijs: Minimale periodelengte" + }, + "peak_price_min_periods_override": { + "name": "Piekprijs: Minimum periodes" + }, + "peak_price_relaxation_attempts_override": { + "name": "Piekprijs: Versoepeling pogingen" + }, + "peak_price_gap_count_override": { + "name": "Piekprijs: Gap tolerantie" + } + }, + "switch": { + "best_price_enable_relaxation_override": { + "name": "Beste prijs: Minimum aantal bereiken" + }, + "peak_price_enable_relaxation_override": { + "name": "Piekprijs: Minimum aantal bereiken" + } + } + }, + "issues": { + "new_homes_available": { + "title": "Nieuwe Tibber huizen gedetecteerd", + "description": "We hebben {count} nieuw(e) huis/huizen gedetecteerd op je Tibber-account: {homes}. Je kunt ze toevoegen aan Home Assistant via de Tibber integratie configuratie." + }, + "homes_removed": { + "title": "Tibber huizen verwijderd", + "description": "We hebben gedetecteerd dat {count} huis/huizen zijn verwijderd van je Tibber-account: {homes}. Controleer je Tibber integratie configuratie." + }, + "tomorrow_data_missing": { + "title": "Morgen prijsgegevens ontbreken voor {home_name}", + "description": "Morgen elektriciteitsprijs gegevens zijn nog steeds niet beschikbaar na {warning_hour}:00. Dit is ongebruikelijk, omdat Tibber normaal gesproken morgen prijzen publiceert in de middag (rond 13:00-14:00 CET).\n\nMogelijke oorzaken:\n- Tibber heeft morgen prijzen nog niet gepubliceerd\n- Tijdelijke API-problemen\n- Je elektriciteitsleverancier heeft nog geen prijzen ingediend bij Tibber\n\nDit probleem lost zich automatisch op zodra morgen gegevens beschikbaar worden. Als dit na 20:00 aanhoudt, controleer dan de Tibber-app of neem contact op met Tibber support." + }, + "rate_limit_exceeded": { + "title": "API rate limiet overschreden voor {home_name}", + "description": "De Tibber API heeft deze integratie beperkt na {error_count} opeenvolgende fouten. Dit betekent dat verzoeken te frequent worden gedaan.\n\nDe integratie zal automatisch opnieuw proberen met toenemende vertragingen. Dit probleem lost zich op zodra de rate limiet verloopt.\n\nAls dit meerdere uren aanhoudt, overweeg dan:\n- Te controleren of meerdere Home Assistant instanties hetzelfde API-token gebruiken\n- Te verifiëren dat geen andere applicaties intensief je Tibber API-token gebruiken\n- De update frequentie te verlagen als je deze hebt aangepast" + }, + "home_not_found": { + "title": "Huis {home_name} niet gevonden in Tibber-account", + "description": "Het huis geconfigureerd in deze integratie (entry ID: {entry_id}) is niet langer beschikbaar in je Tibber-account. Dit gebeurt meestal wanneer:\n- Het huis is verwijderd uit je Tibber-account\n- Het huis is verplaatst naar een ander Tibber-account\n- Toegang tot dit huis is ingetrokken\n\nVerwijder dit integratie-item en voeg het opnieuw toe als het huis nog steeds gemonitord moet worden. Om dit item te verwijderen, ga naar Instellingen → Apparaten & Services → Tibber Prices en verwijder de {home_name} configuratie." + }, + "entity_migration": { + "title": "Tibber Prices: Actie vereist na update ({home_name})", + "description": "Deze update bevat wijzigingen die automatisch zijn toegepast.\n\n**Hernoemde entiteiten ({count})**\n\nDe volgende entity-sleutels zijn hernoemd. Je bestaande entity-ID's en automatiseringen blijven intact:\n\n{entity_list}\n\n**Gewijzigde duur-sensorwaarden**\n\nAlle duur-sensoren (resterende tijd, start over, periodeduur, trendwijzigings-aftelling) rapporteren hun statuswaarde nu in **minuten** in plaats van uren. De weergave-eenheid in dashboards blijft standaard uren.\n\nAls je automatiseringen hebt met numerieke vergelijkingen op deze sensoren, werk dan je drempelwaarden bij:\n- Oud: `state < 0.25` (15 minuten als uren)\n- Nieuw: `state < 15` (15 minuten)\n\nSluit deze melding nadat je je automatiseringen hebt gecontroleerd." + } + }, + "exceptions": { + "no_entries_found": { + "message": "Geen Tibber Prices integratie-items gevonden. Stel de integratie eerst in." + }, + "multiple_entries_no_entry_id": { + "message": "Meerdere Tibber Prices items gevonden. Geef 'entry_id' op om het gewenste item te selecteren." + }, + "invalid_entry_id": { + "message": "Ongeldige of niet-beschikbare configuratie-item. Controleer de item-ID en zorg dat de integratie geladen is." + }, + "missing_home_id": { + "message": "Huis-ID niet gevonden in het configuratie-item. Configureer de integratie opnieuw." + }, + "user_data_not_available": { + "message": "Gebruikersgegevens zijn nog niet beschikbaar. Wacht tot de eerste gegevensupdate is voltooid." + }, + "timezone_not_found": { + "message": "Kon de tijdzone van het huis niet bepalen. Controleer de huisconfiguratie in je Tibber-account." + }, + "end_before_start": { + "message": "Eindtijd moet na de starttijd liggen." + }, + "price_fetch_failed": { + "message": "Kon prijsgegevens niet ophalen bij de Tibber API. Probeer het later opnieuw." + }, + "invalid_search_scope": { + "message": "Ongeldig zoekbereik. Geldige waarden zijn: today, tomorrow, remaining_today, next_24h, next_48h." + }, + "scope_conflicts_with_range": { + "message": "search_scope kan niet gecombineerd worden met expliciete bereikparameters: {params}. Gebruik search_scope OF expliciete start-/eindparameters." + }, + "day_offset_requires_time": { + "message": "{offset_param} vereist dat {time_param} ingesteld is. Dagoffset wijzigt alleen de datum van een expliciete tijdparameter." + }, + "min_level_exceeds_max": { + "message": "min_price_level '{min_level}' is hoger dan max_price_level '{max_level}'. Het minimumniveau moet gelijk aan of lager zijn dan het maximumniveau." + }, + "power_profile_length_mismatch": { + "message": "power_profile heeft {profile_length} items maar de duur vereist {interval_count} intervallen ({duration_minutes} minuten). Het power_profile moet precies één item per 15-minuten-interval hebben." + }, + "level_and_rating_filter_conflict": { + "message": "level_filter en rating_level_filter kunnen niet samen gebruikt worden. Gebruik slechts één filtertype per verzoek." + }, + "insert_nulls_requires_filter": { + "message": "insert_nulls-modus '{mode}' vereist een level_filter of rating_level_filter om segmenten te definiëren. Zonder filter, gebruik insert_nulls: none." + }, + "connect_segments_requires_segments_mode": { + "message": "connect_segments vereist dat insert_nulls op 'segments' staat. Stel insert_nulls: segments in om segmentverbinding te gebruiken." + }, + "array_fields_requires_array_format": { + "message": "array_fields kan alleen gebruikt worden met output_format: array_of_arrays. Wijzig het uitvoerformaat of verwijder array_fields." + }, + "invalid_array_fields": { + "message": "Ongeldig array_fields-sjabloon. Gebruik veldnamen tussen accolades, bijv. '{start_time}, {price_per_kwh}, {level}'." + } + }, + "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": { - "options": { - "yesterday": "Gisteren", - "today": "Vandaag", - "tomorrow": "Morgen", - "rolling_window": "Schuivend Venster", - "rolling_window_autozoom": "Schuivend Venster (Auto-Zoom)" - } - }, - "resolution": { - "options": { - "interval": "Interval (15 min)", - "hourly": "Per Uur" - } - }, - "output_format": { - "options": { - "array_of_objects": "Array van Objecten", - "array_of_arrays": "Array van Arrays" - } + "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": { - "options": { - "rating_level": "Beoordelingsniveau (laag/normaal/hoog)", - "level": "Tibber Niveau (zeer goedkoop tot zeer duur)" - } + "name": "Niveautype", + "description": "Selecteer welke prijsniveauclassificatie gevisualiseerd moet worden: 'rating_level' (laag/normaal/hoog op basis van jouw geconfigureerde drempelwaarden) of 'level' (Tibber API-niveaus: zeer goedkoop/goedkoop/normaal/duur/zeer duur)." + }, + "highlight_best_price": { + "name": "Beste prijsperiodes markeren", + "description": "Voeg een halfdo0rzichtige groene overlay toe om de beste prijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de optimale tijden voor energieverbruik te identificeren." + }, + "highlight_peak_price": { + "name": "Piekprijsperiodes markeren", + "description": "Voeg een halfdoorzichtige rode overlay toe om de piekprijsperiodes in de grafiek te markeren. Dit maakt het gemakkelijk om visueel de tijden te identificeren wanneer energie het duurst is." + }, + "resolution": { + "name": "Resolutie", + "description": "Tijdresolutie voor de grafiekdata. 'interval' (standaard): Originele 15-minutenintervallen (96 punten per dag). 'hourly': Geaggregeerde uurwaarden met een rollend 60-minutenvenster (24 punten per dag) voor een overzichtelijkere grafiek." + } + } + }, + "get_chartdata": { + "name": "Grafiekdata Ophalen", + "description": "Geeft prijsgegevens terug in een eenvoudig grafiekvriendelijk formaat compatibel met de Tibber Core-integratie outputstructuur. Perfect voor gebruik met populaire grafiekkaarten zoals ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card of de ingebouwde History Graph Card. Veldnamen en gegevensstructuur kunnen worden aangepast aan de vereisten van je grafiek.", + "sections": { + "general": { + "name": "Algemeen", + "description": "Basisopties voor het ophalen van grafiekgegevens." + }, + "selection": { + "name": "Selectie", + "description": "Selecteer welke gegevens in de uitvoer moeten worden opgenomen." + }, + "filters": { + "name": "Filters", + "description": "Filter gegevens op basis van prijsniveaus, prijsbeoordelingen of speciale periodes." + }, + "transformation": { + "name": "Gegevens transformeren", + "description": "Transformeer de gegevensuitvoer voor betere grafiekcompatibiliteit." + }, + "format": { + "name": "Formaat", + "description": "Pas het uitvoerformaat aan." + }, + "arrays_of_arrays": { + "name": "Geavanceerde uitvoerinstellingen: Array van arrays", + "description": "Instellingen voor uitvoerformaat bij gebruik van array van arrays." + }, + "arrays_of_objects": { + "name": "Geavanceerde uitvoerinstellingen: Array van objecten", + "description": "Instellingen voor uitvoerformaat bij gebruik van array van objecten." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "day": { + "name": "Dag", + "description": "Voor welke dag(en) moeten prijzen worden opgehaald. Je kunt meerdere dagen selecteren. Als niet opgegeven, wordt een rollend 2-daags venster geretourneerd: vandaag+morgen (wanneer morgengegevens beschikbaar zijn) of gisteren+vandaag (wanneer morgengegevens nog niet beschikbaar zijn). Dit zorgt voor een continue grafiekweergave zonder hiaten." + }, + "resolution": { + "name": "Resolutie", + "description": "Tijdsresolutie voor de geretourneerde gegevens. Opties: 'interval' (standaard, 15-minuten intervallen, 96 datapunten per dag), 'hourly' (uurgemiddelden, 24 datapunten per dag)." + }, + "output_format": { + "name": "Uitvoerformaat", + "description": "Uitvoerformaat voor de geretourneerde gegevens. Opties: 'array_of_objects' (standaard, array van objecten met aanpasbare veldnamen), 'array_of_arrays' (array van [tijdstempel, prijs]-arrays met afsluitend null-punt voor stepline-grafieken)." + }, + "array_fields": { + "name": "Array-velden", + "description": "Definieer welke velden moeten worden opgenomen. Gebruik veldnamen tussen accolades, gescheiden door komma's. Beschikbare velden: start_time, price_per_kwh, level, rating_level, average. Velden worden automatisch ingeschakeld, zelfs als include_*-opties niet zijn ingesteld. Laat leeg voor standaard (alleen tijdstempel en prijs)." + }, + "subunit_currency": { + "name": "Subeenheid valuta", + "description": "Retourneer prijzen in subeenheid valuta-eenheden (cent voor EUR, øre voor NOK/SEK) in plaats van basisvaluta-eenheden. Standaard uitgeschakeld." + }, + "round_decimals": { + "name": "Decimalen afronden", + "description": "Aantal decimalen om prijzen op af te ronden (0-10). Indien niet opgegeven, wordt de standaardprecisie gebruikt (4 decimalen voor basisvaluta, 2 voor subeenheid valuta)." + }, + "include_level": { + "name": "Prijsniveau opnemen", + "description": "Voeg het Tibber-prijsniveauveld (zeer goedkoop/goedkoop/normaal/duur/zeer duur) toe aan elk gegevenspunt." + }, + "include_rating_level": { + "name": "Prijsbeoordeling opnemen", + "description": "Voeg het berekende prijsbeoordelingsveld (laag/normaal/hoog) toe op basis van jouw geconfigureerde drempels aan elk gegevenspunt." + }, + "include_average": { + "name": "Gemiddelde opnemen", + "description": "Dagelijkse gemiddelde prijs opnemen in elk gegevenspunt ter vergelijking." + }, + "include_energy": { + "name": "Energieprijs opnemen", + "description": "De kale energie-/spotprijs (exclusief belastingen en heffingen) opnemen in elk gegevenspunt. Dit is het 'energy'-veld uit de Tibber-API, handig voor teruglever-/salderingsberekeningen." + }, + "include_tax": { + "name": "Belasting opnemen", + "description": "Het belastingdeel van de prijs opnemen in elk gegevenspunt. Dit is het 'tax'-veld uit de Tibber-API, dat heffingen, belastingen en netwerkkosten vertegenwoordigt." }, "level_filter": { - "options": { - "very_cheap": "Zeer goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer duur" - } + "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": { - "options": { - "low": "Laag", - "normal": "Normaal", - "high": "Hoog" - } - }, - "insert_nulls": { - "options": { - "none": "Geen", - "segments": "Segmenten", - "all": "Alles" - } + "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": { - "options": { - "best_price": "Beste Prijs Periodes", - "peak_price": "Piekprijs Periodes" - } + "name": "Periode Filter", + "description": "Filter intervallen om alleen die binnen Beste prijs- of Piek prijs-perioden op te nemen. Opties: 'best_price' (alleen intervallen in Beste prijs-perioden), 'peak_price' (alleen intervallen in Piek prijs-perioden). Als niet opgegeven, worden alle intervallen opgenomen. Gebruikt vooraf berekende periodegegevens van binaire sensoren." + }, + "insert_nulls": { + "name": "NULL-waarden invoegen", + "description": "Beheer het invoegen van NULL-waarden voor gefilterde gegevens. 'none' (standaard): Geen NULL-waarden, alleen overeenkomende intervallen. 'segments': Voeg NULL-punten toe bij segmentgrenzen voor schone gaten in grafieken (aanbevolen voor traplijngrafieken). 'all': Voeg NULL in voor alle tijdstempels waarbij het filter niet overeenkomt (handig voor continue tijdreeksvisualisatie)." + }, + "connect_segments": { + "name": "Segmenten verbinden", + "description": "[ALLEEN MET 'NULL-waarden invoegen'] Indien ingeschakeld, worden verbindingspunten toegevoegd bij segmentgrenzen om verschillende prijsniveau-segmenten visueel te verbinden in traplijngrafieken. Wanneer de prijs DAALT, wordt een punt met de lagere prijs toegevoegd aan het einde van het huidige segment. Wanneer de prijs STIJGT, wordt een houdpunt toegevoegd vóór de gat. Dit creëert vloeiende visuele overgangen tussen segmenten in plaats van abrupte gaten." + }, + "add_trailing_null": { + "name": "Voeg afsluitend null-punt toe", + "description": "Voeg een laatste datapunt met null-waarden (behalve tijdstempel) toe aan het einde. Sommige diagrambibliotheken hebben dit nodig om extrapolatie/interpolatie naar de rand van het viewport te voorkomen bij stepline-weergave. Laat uitgeschakeld tenzij je diagram dit vereist." + }, + "start_time_field": { + "name": "Starttijd-veldnaam", + "description": "Aangepaste naam voor het starttijd-veld in de uitvoer. Standaard is 'start_time' als niet opgegeven." + }, + "end_time_field": { + "name": "Eindtijd-veldnaam", + "description": "Aangepaste naam voor het eindtijd-veld in de uitvoer. Standaard is 'end_time' als niet opgegeven. Alleen gebruikt met period_filter." + }, + "price_field": { + "name": "Prijsveld-naam", + "description": "Aangepaste naam voor het prijsveld in de uitvoer. Standaard is 'price_per_kwh'." + }, + "level_field": { + "name": "Prijsniveauveld-naam", + "description": "Aangepaste naam voor het prijsniveauveld in de uitvoer. Standaard is 'level'. Alleen gebruikt wanneer include_level is ingeschakeld." + }, + "rating_level_field": { + "name": "Prijsbeoordelingsveld-naam", + "description": "Aangepaste naam voor het prijsbeoordelingsveld in de uitvoer. Standaard is 'rating_level'. Alleen gebruikt wanneer include_rating_level is ingeschakeld." + }, + "average_field": { + "name": "Gemiddelde veld-naam", + "description": "Aangepaste naam voor het gemiddelde veld in de uitvoer. Standaard is 'average'. Alleen gebruikt wanneer include_average is ingeschakeld." + }, + "energy_field": { + "name": "Energieprijs veld-naam", + "description": "Aangepaste naam voor het energieprijsveld in de uitvoer. Standaard is 'energy_price'. Alleen gebruikt wanneer include_energy is ingeschakeld." + }, + "tax_field": { + "name": "Belasting veld-naam", + "description": "Aangepaste naam voor het belastingveld in de uitvoer. Standaard is 'tax'. Alleen gebruikt wanneer include_tax is ingeschakeld." }, "metadata": { - "options": { - "include": "Inbegrepen (data + metadata)", - "only": "Alleen metadata", - "none": "Geen (alleen data)" - } + "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." }, - "volatility": { - "options": { - "low": "Laag", - "moderate": "Gematigd", - "high": "Hoog", - "very_high": "Zeer hoog" - } + "data_key": { + "name": "Gegevenssleutel", + "description": "Aangepaste naam voor de gegevenssleutel op het hoogste niveau in het antwoord. Standaard is 'data' als niet opgegeven." + } + } + }, + "refresh_user_data": { + "name": "Gebruikersgegevens vernieuwen", + "description": "Forceert een vernieuwing van de gebruikersgegevens (huizen, profielinformatie) van de Tibber API. Dit kan handig zijn na het maken van wijzigingen in je Tibber-account of bij het oplossen van verbindingsproblemen.", + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + } + } + }, + "find_cheapest_block": { + "name": "Goedkoopste blok vinden", + "description": "Vindt het goedkoopste aaneengesloten tijdvenster van een bepaalde duur. Ontworpen voor apparaatplanning: vaatwasser, wasmachine, droger enz. Retourneert het goedkoopste venster met start-/eindtijden en prijsstatistieken.", + "sections": { + "search_range": { + "name": "Zoekbereik", + "description": "Definieer het tijdvenster voor het zoeken." }, - "current_interval_price_level": { - "options": { - "any": "Alles", - "very_cheap": "Zeer goedkoop", - "cheap": "Goedkoop", - "normal": "Normaal", - "expensive": "Duur", - "very_expensive": "Zeer duur" - } + "time_alternatives": { + "name": "Alternatieve tijdbereiksopties", + "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." }, - "currency_display_mode": { - "options": { - "base": "Basisvaluta (€, kr)", - "subunit": "Subeenheid Valuta (ct, øre)" - } + "price_filter": { + "name": "Prijsniveau-filter", + "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." }, - "average_sensor_display": { - "options": { - "median": "Mediaan", - "mean": "Rekenkundig Gemiddelde" - } + "output": { + "name": "Uitvoeropties", + "description": "Stuur kostnadsraming en vergelijkingsuitvoer." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "duration": { + "name": "Duur", + "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur." + }, + "search_start": { + "name": "Zoekstart", + "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." + }, + "search_end": { + "name": "Zoekeinde", + "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." + }, + "search_start_time": { + "name": "Zoekstart-tijd", + "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." + }, + "search_start_day_offset": { + "name": "Zoekstart dagoffset", + "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." + }, + "search_end_time": { + "name": "Zoekeinde-tijd", + "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." + }, + "search_end_day_offset": { + "name": "Zoekeinde dagoffset", + "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." + }, + "search_start_offset_minutes": { + "name": "Zoekstart-offset (minuten)", + "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." + }, + "search_end_offset_minutes": { + "name": "Zoekeinde-offset (minuten)", + "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." + }, + "include_current_interval": { + "name": "Huidig interval opnemen", + "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." + }, + "use_base_unit": { + "name": "Basisvaluta gebruiken", + "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." }, "search_scope": { - "options": { - "today": "Vandaag", - "tomorrow": "Morgen", - "remaining_today": "Rest van vandaag", - "next_24h": "Komende 24 uur", - "next_48h": "Komende 48 uur" - } + "name": "Zoekbereik (snelkoppeling)", + "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." + }, + "max_price_level": { + "name": "Maximaal prijsniveau", + "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." + }, + "min_price_level": { + "name": "Minimaal prijsniveau", + "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." + }, + "include_comparison_details": { + "name": "Vergelijkingsdetails meenemen", + "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." + }, + "power_profile": { + "name": "Vermogensprofiel", + "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." } + } }, - "title": "Tibber Prijsinformatie & Beoordelingen" + "find_most_expensive_block": { + "name": "Duurste blok vinden", + "description": "Vindt het duurste aaneengesloten tijdvenster van een bepaalde duur. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert het duurste venster met start-/eindtijden en prijsstatistieken.", + "sections": { + "search_range": { + "name": "Zoekbereik", + "description": "Definieer het tijdvenster voor het zoeken." + }, + "time_alternatives": { + "name": "Alternatieve tijdbereiksopties", + "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." + }, + "price_filter": { + "name": "Prijsniveau-filter", + "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." + }, + "output": { + "name": "Uitvoeropties", + "description": "Stuur kostnadsraming en vergelijkingsuitvoer." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "duration": { + "name": "Duur", + "description": "Lengte van het gewenste aaneengesloten venster. Automatisch afgerond naar het volgende kwartier. Maximum: 12 uur." + }, + "search_start": { + "name": "Zoekstart", + "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." + }, + "search_end": { + "name": "Zoekeinde", + "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." + }, + "search_start_time": { + "name": "Zoekstart-tijd", + "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." + }, + "search_start_day_offset": { + "name": "Zoekstart dagoffset", + "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." + }, + "search_end_time": { + "name": "Zoekeinde-tijd", + "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." + }, + "search_end_day_offset": { + "name": "Zoekeinde dagoffset", + "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." + }, + "search_start_offset_minutes": { + "name": "Zoekstart-offset (minuten)", + "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." + }, + "search_end_offset_minutes": { + "name": "Zoekeinde-offset (minuten)", + "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." + }, + "include_current_interval": { + "name": "Huidig interval opnemen", + "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." + }, + "use_base_unit": { + "name": "Basisvaluta gebruiken", + "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." + }, + "search_scope": { + "name": "Zoekbereik (snelkoppeling)", + "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." + }, + "max_price_level": { + "name": "Maximaal prijsniveau", + "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." + }, + "min_price_level": { + "name": "Minimaal prijsniveau", + "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." + }, + "include_comparison_details": { + "name": "Vergelijkingsdetails meenemen", + "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." + }, + "power_profile": { + "name": "Vermogensprofiel", + "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." + } + } + }, + "find_cheapest_hours": { + "name": "Goedkoopste uren vinden", + "description": "Vindt de goedkoopste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Ontworpen voor flexibele belastingen: batterijladen, elektrisch voertuig, warmwaterboiler. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.", + "sections": { + "search_range": { + "name": "Zoekbereik", + "description": "Definieer het tijdvenster voor het zoeken." + }, + "time_alternatives": { + "name": "Alternatieve tijdbereiksopties", + "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." + }, + "price_filter": { + "name": "Prijsniveau-filter", + "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." + }, + "output": { + "name": "Uitvoeropties", + "description": "Stuur kostnadsraming en vergelijkingsuitvoer." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "duration": { + "name": "Duur", + "description": "Benodigde goedkope totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur." + }, + "search_start": { + "name": "Zoekstart", + "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." + }, + "search_end": { + "name": "Zoekeinde", + "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." + }, + "search_start_time": { + "name": "Zoekstart-tijd", + "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." + }, + "search_start_day_offset": { + "name": "Zoekstart dagoffset", + "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." + }, + "search_end_time": { + "name": "Zoekeinde-tijd", + "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." + }, + "search_end_day_offset": { + "name": "Zoekeinde dagoffset", + "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." + }, + "search_start_offset_minutes": { + "name": "Zoekstart-offset (minuten)", + "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." + }, + "search_end_offset_minutes": { + "name": "Zoekeinde-offset (minuten)", + "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." + }, + "include_current_interval": { + "name": "Huidig interval opnemen", + "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." + }, + "min_segment_duration": { + "name": "Minimale segmentduur", + "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur." + }, + "use_base_unit": { + "name": "Basisvaluta gebruiken", + "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." + }, + "search_scope": { + "name": "Zoekbereik (snelkoppeling)", + "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." + }, + "max_price_level": { + "name": "Maximaal prijsniveau", + "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." + }, + "min_price_level": { + "name": "Minimaal prijsniveau", + "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." + }, + "include_comparison_details": { + "name": "Vergelijkingsdetails meenemen", + "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." + }, + "power_profile": { + "name": "Vermogensprofiel", + "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." + } + } + }, + "find_most_expensive_hours": { + "name": "Duurste uren vinden", + "description": "Vindt de duurste intervallen voor een bepaalde totale duur, niet noodzakelijk aaneengesloten. Nuttig voor het identificeren van piekprijsperioden die vermeden moeten worden. Retourneert een schema van intervallen gegroepeerd in aaneengesloten segmenten.", + "sections": { + "search_range": { + "name": "Zoekbereik", + "description": "Definieer het tijdvenster voor het zoeken." + }, + "time_alternatives": { + "name": "Alternatieve tijdbereiksopties", + "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." + }, + "price_filter": { + "name": "Prijsniveau-filter", + "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." + }, + "output": { + "name": "Uitvoeropties", + "description": "Stuur kostnadsraming en vergelijkingsuitvoer." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "duration": { + "name": "Duur", + "description": "Te vinden dure totale tijd. Automatisch afgerond naar het volgende kwartier. Maximum: 24 uur." + }, + "search_start": { + "name": "Zoekstart", + "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." + }, + "search_end": { + "name": "Zoekeinde", + "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." + }, + "search_start_time": { + "name": "Zoekstart-tijd", + "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." + }, + "search_start_day_offset": { + "name": "Zoekstart dagoffset", + "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." + }, + "search_end_time": { + "name": "Zoekeinde-tijd", + "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." + }, + "search_end_day_offset": { + "name": "Zoekeinde dagoffset", + "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." + }, + "search_start_offset_minutes": { + "name": "Zoekstart-offset (minuten)", + "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." + }, + "search_end_offset_minutes": { + "name": "Zoekeinde-offset (minuten)", + "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." + }, + "include_current_interval": { + "name": "Huidig interval opnemen", + "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." + }, + "min_segment_duration": { + "name": "Minimale segmentduur", + "description": "Minimale aaneengesloten looptijd. Voorkomt snel aan-/uitschakelen bij apparaten met minimale looptijden. Automatisch afgerond naar het volgende kwartier. Standaard: 15 minuten. Maximum: 4 uur." + }, + "use_base_unit": { + "name": "Basisvaluta gebruiken", + "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." + }, + "search_scope": { + "name": "Zoekbereik (snelkoppeling)", + "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." + }, + "max_price_level": { + "name": "Maximaal prijsniveau", + "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." + }, + "min_price_level": { + "name": "Minimaal prijsniveau", + "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." + }, + "include_comparison_details": { + "name": "Vergelijkingsdetails meenemen", + "description": "Verrijk het price_comparison-resultaat met extra velden: comparison_price_min, comparison_price_max en (alleen blok) comparison_window_end." + }, + "power_profile": { + "name": "Vermogensprofiel", + "description": "Variabel vermogensverbruik in watt per 15-minuten-interval. Indien ingesteld, weerspiegelt estimated_total_cost het werkelijke verbruik." + } + } + }, + "find_cheapest_schedule": { + "name": "Goedkoopste schema vinden", + "description": "Plant meerdere apparaten optimaal zonder tijdoverlap. Elke taak krijgt het goedkoopste beschikbare aaneengesloten tijdvenster.", + "sections": { + "scheduling_options": { + "name": "Planningsopties", + "description": "Configureer taken en tussenpozen." + }, + "search_range": { + "name": "Zoekbereik", + "description": "Definieer het tijdvenster voor het zoeken." + }, + "time_alternatives": { + "name": "Alternatieve tijdbereiksopties", + "description": "Alternatieve manieren om het zoekbereik te definieren via tijdstip en offsets." + }, + "price_filter": { + "name": "Prijsniveau-filter", + "description": "Beperk het zoeken tot intervallen binnen het opgegeven prijsniveaubereik." + }, + "output": { + "name": "Uitvoeropties", + "description": "Stuur kostnadsraming en vergelijkingsuitvoer." + } + }, + "fields": { + "entry_id": { + "name": "Item-ID", + "description": "De config-item-ID voor de Tibber-integratie." + }, + "tasks": { + "name": "Taken", + "description": "Lijst van in te plannen taken. Elke taak heeft name (tekst) en duration (hh:mm:ss). Optioneel power_profile (watt per 15-min-interval). Maximaal 4 taken." + }, + "gap_minutes": { + "name": "Tussenpose tussen taken (minuten)", + "description": "Minimale tussenpose in minuten tussen opeenvolgende ingeplande taken. Afgerond omhoog tot 15 minuten. Standaard: 0 (geen tussenpose)." + }, + "search_scope": { + "name": "Zoekbereik (snelkoppeling)", + "description": "Snelkoppeling voor veelgebruikte zoekbereiken. Overschrijft alle andere tijdopties. today/tomorrow = volledige kalenderdag, remaining_today = nu tot middernacht, next_24h/next_48h = rolling venster vanaf nu." + }, + "search_start": { + "name": "Zoekstart", + "description": "Begin van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere startopties. Standaard is nu als niet opgegeven." + }, + "search_end": { + "name": "Zoekeinde", + "description": "Einde van het zoekbereik als exacte datum en tijd. Hoogste prioriteit — overschrijft alle andere eindopties. Standaard is einde van morgen als niet opgegeven." + }, + "search_start_time": { + "name": "Zoekstart-tijd", + "description": "Alternatief: Start zoeken vanaf dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekstart (datum/tijd) is ingesteld." + }, + "search_start_day_offset": { + "name": "Zoekstart dagoffset", + "description": "Dagoffset voor Zoekstart-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekstart-tijd." + }, + "search_end_time": { + "name": "Zoekeinde-tijd", + "description": "Alternatief: Zoek tot dit tijdstip. Combineer met dagoffset. Wordt genegeerd als Zoekeinde (datum/tijd) is ingesteld." + }, + "search_end_day_offset": { + "name": "Zoekeinde dagoffset", + "description": "Dagoffset voor Zoekeinde-tijd. -7 tot 2: -1 = gisteren, 0 = vandaag, 1 = morgen. Negatieve waarden zoeken in het verleden. Wordt alleen gebruikt met Zoekeinde-tijd." + }, + "search_start_offset_minutes": { + "name": "Zoekstart-offset (minuten)", + "description": "Alternatief: Start met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (60 = over 1 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekstart of Zoekstart-tijd is ingesteld." + }, + "search_end_offset_minutes": { + "name": "Zoekeinde-offset (minuten)", + "description": "Alternatief: Stop met zoeken over dit aantal minuten vanaf nu. Positief = toekomst (480 = over 8 uur), negatief = verleden (-60 = 1 uur geleden). Wordt genegeerd als Zoekeinde of Zoekeinde-tijd is ingesteld." + }, + "include_current_interval": { + "name": "Huidig interval opnemen", + "description": "Het huidige lopende 15-minuten interval opnemen in de zoekopdracht. Indien ingeschakeld (standaard), begint de zoekopdracht aan het begin van het huidige interval zodat het deel kan uitmaken van het resultaat." + }, + "max_price_level": { + "name": "Maximaal prijsniveau", + "description": "Overweeg alleen intervallen op of onder dit Tibber-prijsniveau. very_cheap = meest restrictief, very_expensive = geen beperking." + }, + "min_price_level": { + "name": "Minimaal prijsniveau", + "description": "Overweeg alleen intervallen op of boven dit Tibber-prijsniveau. Nuttig voor find_most_expensive om te focussen op echt dure intervallen." + }, + "use_base_unit": { + "name": "Basisvaluta gebruiken", + "description": "Forceer prijzen in basisvaluta (EUR, NOK) in plaats van de geconfigureerde weergave-eenheid (ct, øre). Handig voor berekeningen." + } + } + } + }, + "selector": { + "account_choice": { + "options": { + "new_token": "Nieuw Tibber account API-token toevoegen" + } + }, + "day": { + "options": { + "yesterday": "Gisteren", + "today": "Vandaag", + "tomorrow": "Morgen", + "rolling_window": "Schuivend Venster", + "rolling_window_autozoom": "Schuivend Venster (Auto-Zoom)" + } + }, + "resolution": { + "options": { + "interval": "Interval (15 min)", + "hourly": "Per Uur" + } + }, + "output_format": { + "options": { + "array_of_objects": "Array van Objecten", + "array_of_arrays": "Array van Arrays" + } + }, + "level_type": { + "options": { + "rating_level": "Beoordelingsniveau (laag/normaal/hoog)", + "level": "Tibber Niveau (zeer goedkoop tot zeer duur)" + } + }, + "level_filter": { + "options": { + "very_cheap": "Zeer goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer duur" + } + }, + "rating_level_filter": { + "options": { + "low": "Laag", + "normal": "Normaal", + "high": "Hoog" + } + }, + "insert_nulls": { + "options": { + "none": "Geen", + "segments": "Segmenten", + "all": "Alles" + } + }, + "period_filter": { + "options": { + "best_price": "Beste Prijs Periodes", + "peak_price": "Piekprijs Periodes" + } + }, + "metadata": { + "options": { + "include": "Inbegrepen (data + metadata)", + "only": "Alleen metadata", + "none": "Geen (alleen data)" + } + }, + "volatility": { + "options": { + "low": "Laag", + "moderate": "Gematigd", + "high": "Hoog", + "very_high": "Zeer hoog" + } + }, + "current_interval_price_level": { + "options": { + "any": "Alles", + "very_cheap": "Zeer goedkoop", + "cheap": "Goedkoop", + "normal": "Normaal", + "expensive": "Duur", + "very_expensive": "Zeer duur" + } + }, + "currency_display_mode": { + "options": { + "base": "Basisvaluta (€, kr)", + "subunit": "Subeenheid Valuta (ct, øre)" + } + }, + "average_sensor_display": { + "options": { + "median": "Mediaan", + "mean": "Rekenkundig Gemiddelde" + } + }, + "search_scope": { + "options": { + "today": "Vandaag", + "tomorrow": "Morgen", + "remaining_today": "Rest van vandaag", + "next_24h": "Komende 24 uur", + "next_48h": "Komende 48 uur" + } + } + }, + "title": "Tibber Prijsinformatie & Beoordelingen" } diff --git a/custom_components/tibber_prices/translations/sv.json b/custom_components/tibber_prices/translations/sv.json index 49c0a1d..c685aa5 100644 --- a/custom_components/tibber_prices/translations/sv.json +++ b/custom_components/tibber_prices/translations/sv.json @@ -1,1931 +1,1955 @@ { - "config": { - "step": { - "account_choice": { - "title": "Välj konto", - "description": "Du kan lägga till ett annat hem från ett befintligt Tibber-konto eller ange en ny API-token för ett annat konto.", - "data": { - "account_choice": "Konto" - }, - "submit": "Fortsätt →" - }, - "new_token": { - "title": "Ange API-token", - "description": "Konfigurera Tibber Prisinformation & Betyg.\n\nFör att generera en API-åtkomsttoken, besök [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-åtkomsttoken" - }, - "submit": "Validera token" - }, - "user": { - "description": "Konfigurera Tibber Prisinformation & Betyg.\n\nFör att generera en API-åtkomsttoken, besök [{tibber_url}]({tibber_url}).", - "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": "Återautentisera Tibber-prisintegration", - "description": "Åtkomsttoken för Tibber är inte längre giltig. 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 [{tibber_url}]({tibber_url}).", - "data": { - "access_token": "API-åtkomsttoken" - }, - "submit": "Uppdatera token" - } + "config": { + "step": { + "account_choice": { + "title": "Välj konto", + "description": "Du kan lägga till ett annat hem från ett befintligt Tibber-konto eller ange en ny API-token för ett annat konto.", + "data": { + "account_choice": "Konto" }, - "error": { - "auth": "Tibber-åtkomsttoken är ogiltig.", - "connection": "Kan inte ansluta till Tibber. Kontrollera din internetanslutning.", - "unknown": "Oväntat fel", - "cannot_connect": "Anslutning misslyckades", - "invalid_access_token": "Ogiltig åtkomsttoken", - "missing_homes": "Den nya åtkomsttoken har inte åtkomst till alla konfigurerade hem. Använd en åtkomsttoken som har åtkomst till samma Tibber-hem.", - "home_already_configured": "Detta hem är redan konfigurerat i en annan post. Varje hem kan bara konfigureras en gång.", - "no_active_subscription": "Detta hem har inget aktivt Tibber-avtal. Endast hem med aktiva elavtal kan läggas till i Home Assistant.", - "subscription_expired": "Tibber-avtalet för detta hem har löpt ut. Endast hem med aktiva eller framtida elavtal kan läggas till i Home Assistant.", - "future_subscription_warning": "Obs: Detta hems Tibber-avtal har inte börjat ännu. Funktionaliteten kan vara begränsad tills avtalet blir aktivt." + "submit": "Fortsätt →" + }, + "new_token": { + "title": "Ange API-token", + "description": "Konfigurera Tibber Prisinformation & Betyg.\n\nFör att generera en API-åtkomsttoken, besök [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-åtkomsttoken" }, - "abort": { - "already_configured": "Alla tillgängliga Tibber-hem är redan konfigurerade. Varje hem kan bara konfigureras en gång.", - "entry_not_found": "Tibber-konfigurationspost hittades inte.", - "setup_complete": "Konfiguration klar! Du kan ändra ytterligare alternativ för Tibber-priser i integrationens inställningar efter att ha stängt denna dialogruta.", - "reauth_successful": "Återautentisering lyckades. Integrationen har uppdaterats med den nya åtkomsttoken." + "submit": "Validera token" + }, + "user": { + "description": "Konfigurera Tibber Prisinformation & Betyg.\n\nFör att generera en API-åtkomsttoken, besök [{tibber_url}]({tibber_url}).", + "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": "Återautentisera Tibber-prisintegration", + "description": "Åtkomsttoken för Tibber är inte längre giltig. 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 [{tibber_url}]({tibber_url}).", + "data": { + "access_token": "API-åtkomsttoken" + }, + "submit": "Uppdatera token" + } + }, + "error": { + "auth": "Tibber-åtkomsttoken är ogiltig.", + "connection": "Kan inte ansluta till Tibber. Kontrollera din internetanslutning.", + "unknown": "Oväntat fel", + "cannot_connect": "Anslutning misslyckades", + "invalid_access_token": "Ogiltig åtkomsttoken", + "missing_homes": "Den nya åtkomsttoken har inte åtkomst till alla konfigurerade hem. Använd en åtkomsttoken som har åtkomst till samma Tibber-hem.", + "home_already_configured": "Detta hem är redan konfigurerat i en annan post. Varje hem kan bara konfigureras en gång.", + "no_active_subscription": "Detta hem har inget aktivt Tibber-avtal. Endast hem med aktiva elavtal kan läggas till i Home Assistant.", + "subscription_expired": "Tibber-avtalet för detta hem har löpt ut. Endast hem med aktiva eller framtida elavtal kan läggas till i Home Assistant.", + "future_subscription_warning": "Obs: Detta hems Tibber-avtal har inte börjat ännu. Funktionaliteten kan vara begränsad tills avtalet blir aktivt." + }, + "abort": { + "already_configured": "Alla tillgängliga Tibber-hem är redan konfigurerade. Varje hem kan bara konfigureras en gång.", + "entry_not_found": "Tibber-konfigurationspost hittades inte.", + "setup_complete": "Konfiguration klar! Du kan ändra ytterligare alternativ för Tibber-priser i integrationens inställningar efter att ha stängt denna dialogruta.", + "reauth_successful": "Återautentisering lyckades. Integrationen har uppdaterats med den nya åtkomsttoken." + } + }, + "common": { + "step_progress": "{step_num} / {total_steps}", + "override_warning_template": "⚠️ {fields} styrs av konfigurationsentitet", + "override_warning_and": "och", + "override_field_label_best_price_min_period_length": "Minsta periodlängd", + "override_field_label_best_price_max_level_gap_count": "Glappstolerans", + "override_field_label_best_price_flex": "Flexibilitet", + "override_field_label_best_price_min_distance_from_avg": "Minsta avstånd", + "override_field_label_enable_min_periods_best": "Uppnå minsta antal", + "override_field_label_min_periods_best": "Minimiperioder", + "override_field_label_relaxation_attempts_best": "Avslappningsförsök", + "override_field_label_peak_price_min_period_length": "Minsta periodlängd", + "override_field_label_peak_price_max_level_gap_count": "Glappstolerans", + "override_field_label_peak_price_flex": "Flexibilitet", + "override_field_label_peak_price_min_distance_from_avg": "Minsta avstånd", + "override_field_label_enable_min_periods_peak": "Uppnå minsta antal", + "override_field_label_min_periods_peak": "Minimiperioder", + "override_field_label_relaxation_attempts_peak": "Avslappningsförsök" + }, + "config_subentries": { + "home": { + "entry_type": "Tidsresevy", + "initiate_flow": { + "user": "Skapa tidsresevy" + }, + "title": "Skapa tidsresevy", + "step": { + "user": { + "title": "Välj konfigurationspost", + "description": "Välj den konfigurationspost som du vill skapa en tidsresevy för.\n\n**Tidsresevyer** låter dig se historisk prisdata som om det vore nuvarande tid. Detta är användbart för att testa automationer eller analysera tidigare prismönster.", + "data": { + "parent_entry_id": "Konfigurationspost" + } + }, + "time_offset": { + "title": "Konfigurera tidsförskjutning", + "description": "Konfigurera hur långt tillbaka i tiden denna vy ska resa.\n\n**Rekommenderat:** Använd **≥2 dagar** förskjutning för att undvika konflikter med \"igår\"-entiteter som också tillhandahåller historisk data.\n\n**Exempel:**\n• **-7 dagar**: Visa priser från 7 dagar sedan\n• **-2 dagar, 3 timmar**: Visa priser från 2 dagar och 3 timmar sedan\n• **-14 dagar**: Visa priser från 2 veckor sedan", + "data": { + "virtual_time_offset_days": "Dagar tillbaka", + "time_offset": "Extra tidsförskjutning" + }, + "data_description": { + "virtual_time_offset_days": "Hur många dagar ska man resa tillbaka i tiden. Skjutreglage: 0 till 374 dagar (≈1 år). Rekommenderat: ≥2 dagar för att undvika konflikter med \"igår\"-entiteter.", + "time_offset": "Valfri finjustering: Lägg till timmar och/eller minuter till dagförskjutningen. Tiden subtraheras automatiskt (resa tillbaka längre). Obs: Sekunder ignoreras - endast minutnoggrannhet stöds." + } + }, + "init": { + "title": "Konfigurera om tidsförskjutning", + "description": "Uppdatera tidsförskjutningen för denna tidsresevy.", + "data": { + "virtual_time_offset_days": "Dagar tillbaka", + "time_offset": "Extra tidsförskjutning" + }, + "data_description": { + "virtual_time_offset_days": "Hur många dagar ska man resa tillbaka i tiden. Skjutreglage: 0 till 374 dagar (≈1 år). Rekommenderat: ≥2 dagar för att undvika konflikter med \"igår\"-entiteter.", + "time_offset": "Valfri finjustering: Lägg till timmar och/eller minuter till dagförskjutningen. Tiden subtraheras automatiskt (resa tillbaka längre). Obs: Sekunder ignoreras - endast minutnoggrannhet stöds." + } } - }, - "common": { - "step_progress": "{step_num} / {total_steps}", - "override_warning_template": "⚠️ {fields} styrs av konfigurationsentitet", - "override_warning_and": "och", - "override_field_label_best_price_min_period_length": "Minsta periodlängd", - "override_field_label_best_price_max_level_gap_count": "Glappstolerans", - "override_field_label_best_price_flex": "Flexibilitet", - "override_field_label_best_price_min_distance_from_avg": "Minsta avstånd", - "override_field_label_enable_min_periods_best": "Uppnå minsta antal", - "override_field_label_min_periods_best": "Minimiperioder", - "override_field_label_relaxation_attempts_best": "Avslappningsförsök", - "override_field_label_peak_price_min_period_length": "Minsta periodlängd", - "override_field_label_peak_price_max_level_gap_count": "Glappstolerans", - "override_field_label_peak_price_flex": "Flexibilitet", - "override_field_label_peak_price_min_distance_from_avg": "Minsta avstånd", - "override_field_label_enable_min_periods_peak": "Uppnå minsta antal", - "override_field_label_min_periods_peak": "Minimiperioder", - "override_field_label_relaxation_attempts_peak": "Avslappningsförsök" - }, - "config_subentries": { - "home": { - "entry_type": "Tidsresevy", - "initiate_flow": { - "user": "Skapa tidsresevy" - }, - "title": "Skapa tidsresevy", - "step": { - "user": { - "title": "Välj konfigurationspost", - "description": "Välj den konfigurationspost som du vill skapa en tidsresevy för.\n\n**Tidsresevyer** låter dig se historisk prisdata som om det vore nuvarande tid. Detta är användbart för att testa automationer eller analysera tidigare prismönster.", - "data": { - "parent_entry_id": "Konfigurationspost" - } - }, - "time_offset": { - "title": "Konfigurera tidsförskjutning", - "description": "Konfigurera hur långt tillbaka i tiden denna vy ska resa.\n\n**Rekommenderat:** Använd **≥2 dagar** förskjutning för att undvika konflikter med \"igår\"-entiteter som också tillhandahåller historisk data.\n\n**Exempel:**\n• **-7 dagar**: Visa priser från 7 dagar sedan\n• **-2 dagar, 3 timmar**: Visa priser från 2 dagar och 3 timmar sedan\n• **-14 dagar**: Visa priser från 2 veckor sedan", - "data": { - "virtual_time_offset_days": "Dagar tillbaka", - "time_offset": "Extra tidsförskjutning" - }, - "data_description": { - "virtual_time_offset_days": "Hur många dagar ska man resa tillbaka i tiden. Skjutreglage: 0 till 374 dagar (≈1 år). Rekommenderat: ≥2 dagar för att undvika konflikter med \"igår\"-entiteter.", - "time_offset": "Valfri finjustering: Lägg till timmar och/eller minuter till dagförskjutningen. Tiden subtraheras automatiskt (resa tillbaka längre). Obs: Sekunder ignoreras - endast minutnoggrannhet stöds." - } - }, - "init": { - "title": "Konfigurera om tidsförskjutning", - "description": "Uppdatera tidsförskjutningen för denna tidsresevy.", - "data": { - "virtual_time_offset_days": "Dagar tillbaka", - "time_offset": "Extra tidsförskjutning" - }, - "data_description": { - "virtual_time_offset_days": "Hur många dagar ska man resa tillbaka i tiden. Skjutreglage: 0 till 374 dagar (≈1 år). Rekommenderat: ≥2 dagar för att undvika konflikter med \"igår\"-entiteter.", - "time_offset": "Valfri finjustering: Lägg till timmar och/eller minuter till dagförskjutningen. Tiden subtraheras automatiskt (resa tillbaka längre). Obs: Sekunder ignoreras - endast minutnoggrannhet stöds." - } - } - }, - "error": { - "no_time_offset": "Minst ett tidsförskjutningsvärde måste vara negativt (endast historisk data)." - }, - "abort": { - "already_configured": "**En tidsresevy med exakt denna tidsförskjutning finns redan.**\n\nVälj en annan förskjutning.", - "no_main_entries": "Inga huvudkonfigurationsposter hittades. Lägg till ett Tibber-hem först.", - "parent_entry_not_found": "Vald konfigurationspost hittades inte." - } + }, + "error": { + "no_time_offset": "Minst ett tidsförskjutningsvärde måste vara negativt (endast historisk data)." + }, + "abort": { + "already_configured": "**En tidsresevy med exakt denna tidsförskjutning finns redan.**\n\nVälj en annan förskjutning.", + "no_main_entries": "Inga huvudkonfigurationsposter hittades. Lägg till ett Tibber-hem först.", + "parent_entry_not_found": "Vald konfigurationspost hittades inte." + } + } + }, + "options": { + "step": { + "init": { + "menu_options": { + "general_settings": "⚙️ Allmänna inställningar", + "display_settings": "💱 Valutavisning", + "current_interval_price_rating": "📊 Prisbetyg", + "price_level": "🏷️ Prisnivå", + "volatility": "💨 Prisvolatilitet", + "best_price": "💚 Bästa Prisperiod", + "peak_price": "🔴 Topprisperiod", + "price_trend": "📈 Pristrend", + "chart_data_export": "📊 Diagramdataexport-sensor", + "reset_to_defaults": "🔄 Återställ till standard", + "finish": "⬅️ Tillbaka" } - }, - "options": { - "step": { - "init": { - "menu_options": { - "general_settings": "⚙️ Allmänna inställningar", - "display_settings": "💱 Valutavisning", - "current_interval_price_rating": "📊 Prisbetyg", - "price_level": "🏷️ Prisnivå", - "volatility": "💨 Prisvolatilitet", - "best_price": "💚 Bästa Prisperiod", - "peak_price": "🔴 Topprisperiod", - "price_trend": "📈 Pristrend", - "chart_data_export": "📊 Diagramdataexport-sensor", - "reset_to_defaults": "🔄 Återställ till standard", - "finish": "⬅️ Tillbaka" - } + }, + "general_settings": { + "title": "⚙️ Allmänna inställningar", + "description": "**Konfigurera allmänna inställningar för Tibber prisinformation och betyg.**\n\n---\n\n**Användare:** {user_login}", + "data": { + "extended_descriptions": "Utökade beskrivningar", + "average_sensor_display": "Visa genomsnittssensor" + }, + "data_description": { + "extended_descriptions": "Kontrollerar om entitetsattribut inkluderar detaljerade förklaringar och användningstips.\n\n• Inaktiverad (standard): Endast kort beskrivning\n• Aktiverad: Detaljerad förklaring + praktiska användningsexempel\n\nExempel:\nInaktiverad = 1 attribut\nAktiverad = 2 ytterligare attribut", + "average_sensor_display": "Välj vilket statistiskt mått som ska visas i sensortillståndet för genomsnittsprissensorer. Det andra värdet visas som ett attribut.\n\n• **Median (standard)**: Visar det 'typiska' priset, resistent mot extrema toppar - bäst för visning och mänsklig tolkning\n• **Aritmetiskt medelvärde**: Visar det sanna matematiska genomsnittet inklusive alla priser - bäst när du behöver exakta kostnadsberäkningar\n\nFör automatiseringar, använd attributet `price_mean` eller `price_median` för att komma åt båda värdena oavsett denna inställning." + }, + "submit": "↩ Spara & tillbaka" + }, + "display_settings": { + "title": "💱 Valutavisningsinställningar", + "description": "**Konfigurera hur elpriser visas - i basvaluta (€, kr) eller underenhet (ct, øre).**\n\n---", + "data": { + "currency_display_mode": "Visningsläge" + }, + "data_description": { + "currency_display_mode": "Välj hur priser visas:\n\n• **Basvaluta** (€/kWh, kr/kWh): Decimalvärden (t.ex. 0,25 €/kWh) - skillnader synliga från 3:e-4:e decimalen\n• **Underenhetsvaluta** (ct/kWh, øre/kWh): Större värden (t.ex. 25,00 ct/kWh) - skillnader synliga från 1:a decimalen\n\nStandard beror på din valuta:\n• EUR → Underenhet (cent) - Tysk/nederländsk preferens\n• NOK/SEK/DKK → Bas (kronor) - Skandinavisk preferens\n• USD/GBP → Basvaluta\n\n**💡 Tips:** När du väljer Underenhetsvaluta kan du aktivera den extra sensorn \"Aktuellt Elpris (Energidashboard)\" (inaktiverad som standard)." + }, + "submit": "↩ Spara & tillbaka" + }, + "current_interval_price_rating": { + "title": "📊 Prisbetyginställningar", + "description": "**Konfigurera tröskelvärden och stabilisering för prisbetygsnivåer (låg/normal/hög) baserat på jämförelse med glidande 24-timmars genomsnitt.**{entity_warning}", + "data": { + "price_rating_threshold_low": "Låg tröskel", + "price_rating_threshold_high": "Hög tröskel", + "price_rating_hysteresis": "Hysteres", + "price_rating_gap_tolerance": "Gap-tolerans" + }, + "data_description": { + "price_rating_threshold_low": "Procentandel under det glidande 24-timmars genomsnittet som det aktuella priset måste vara för att kvalificera som 'lågt' betyg. Exempel: -10 betyder minst 10% under genomsnittet. Sensorer med detta betyg indikerar gynnsamma tidsfönster. Standard: -10%", + "price_rating_threshold_high": "Procentandel över det glidande 24-timmars genomsnittet som det aktuella priset måste vara för att kvalificera som 'högt' betyg. Exempel: 10 betyder minst 10% över genomsnittet. Sensorer med detta betyg varnar om dyra tidsfönster. Standard: 10%", + "price_rating_hysteresis": "Procentband runt tröskelvärden för att undvika snabba tillståndsändringar. När betyget redan är LÅGT måste priset stiga över (tröskel + hysteres) för att byta till NORMAL. Likaså kräver HÖGT att priset faller under (tröskel - hysteres) för att lämna tillståndet. Detta ger stabilitet för automatiseringar som reagerar på betygsändringar. Sätt till 0 för att inaktivera. Standard: 2%", + "price_rating_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande betyg. Små isolerade betygsändringar sammanfogas med det dominerande grannblocket. Detta ger stabilitet för automatiseringar genom att förhindra att korta betygstoppar utlöser onödiga åtgärder. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'hög'-intervaller korrigeras till 'hög'. Sätt till 0 för att inaktivera. Standard: 1" + }, + "submit": "↩ Spara & tillbaka" + }, + "best_price": { + "title": "💚 Bästa Prisperiod-inställningar", + "description": "**Konfigurera inställningar för binärsensorn Bästa Prisperiod. Denna sensor är aktiv under perioder med lägsta elpriserna.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periodlängd & Nivåer", + "description": "Konfigurera hur långa perioder ska vara och vilka prisnivåer som ska inkluderas.", + "data": { + "best_price_min_period_length": "Minsta Periodlängd", + "best_price_max_level": "Prisnivåfilter", + "best_price_max_level_gap_count": "Gaptolerans" }, - "general_settings": { - "title": "⚙️ Allmänna inställningar", - "description": "**Konfigurera allmänna inställningar för Tibber prisinformation och betyg.**\n\n---\n\n**Användare:** {user_login}", - "data": { - "extended_descriptions": "Utökade beskrivningar", - "average_sensor_display": "Visa genomsnittssensor" - }, - "data_description": { - "extended_descriptions": "Kontrollerar om entitetsattribut inkluderar detaljerade förklaringar och användningstips.\n\n• Inaktiverad (standard): Endast kort beskrivning\n• Aktiverad: Detaljerad förklaring + praktiska användningsexempel\n\nExempel:\nInaktiverad = 1 attribut\nAktiverad = 2 ytterligare attribut", - "average_sensor_display": "Välj vilket statistiskt mått som ska visas i sensortillståndet för genomsnittsprissensorer. Det andra värdet visas som ett attribut.\n\n• **Median (standard)**: Visar det 'typiska' priset, resistent mot extrema toppar - bäst för visning och mänsklig tolkning\n• **Aritmetiskt medelvärde**: Visar det sanna matematiska genomsnittet inklusive alla priser - bäst när du behöver exakta kostnadsberäkningar\n\nFör automatiseringar, använd attributet `price_mean` eller `price_median` för att komma åt båda värdena oavsett denna inställning." - }, - "submit": "↩ Spara & tillbaka" - }, - "display_settings": { - "title": "💱 Valutavisningsinställningar", - "description": "**Konfigurera hur elpriser visas - i basvaluta (€, kr) eller underenhet (ct, øre).**\n\n---", - "data": { - "currency_display_mode": "Visningsläge" - }, - "data_description": { - "currency_display_mode": "Välj hur priser visas:\n\n• **Basvaluta** (€/kWh, kr/kWh): Decimalvärden (t.ex. 0,25 €/kWh) - skillnader synliga från 3:e-4:e decimalen\n• **Underenhetsvaluta** (ct/kWh, øre/kWh): Större värden (t.ex. 25,00 ct/kWh) - skillnader synliga från 1:a decimalen\n\nStandard beror på din valuta:\n• EUR → Underenhet (cent) - Tysk/nederländsk preferens\n• NOK/SEK/DKK → Bas (kronor) - Skandinavisk preferens\n• USD/GBP → Basvaluta\n\n**💡 Tips:** När du väljer Underenhetsvaluta kan du aktivera den extra sensorn \"Aktuellt Elpris (Energidashboard)\" (inaktiverad som standard)." - }, - "submit": "↩ Spara & tillbaka" - }, - "current_interval_price_rating": { - "title": "📊 Prisbetyginställningar", - "description": "**Konfigurera tröskelvärden och stabilisering för prisbetygsnivåer (låg/normal/hög) baserat på jämförelse med glidande 24-timmars genomsnitt.**{entity_warning}", - "data": { - "price_rating_threshold_low": "Låg tröskel", - "price_rating_threshold_high": "Hög tröskel", - "price_rating_hysteresis": "Hysteres", - "price_rating_gap_tolerance": "Gap-tolerans" - }, - "data_description": { - "price_rating_threshold_low": "Procentandel under det glidande 24-timmars genomsnittet som det aktuella priset måste vara för att kvalificera som 'lågt' betyg. Exempel: -10 betyder minst 10% under genomsnittet. Sensorer med detta betyg indikerar gynnsamma tidsfönster. Standard: -10%", - "price_rating_threshold_high": "Procentandel över det glidande 24-timmars genomsnittet som det aktuella priset måste vara för att kvalificera som 'högt' betyg. Exempel: 10 betyder minst 10% över genomsnittet. Sensorer med detta betyg varnar om dyra tidsfönster. Standard: 10%", - "price_rating_hysteresis": "Procentband runt tröskelvärden för att undvika snabba tillståndsändringar. När betyget redan är LÅGT måste priset stiga över (tröskel + hysteres) för att byta till NORMAL. Likaså kräver HÖGT att priset faller under (tröskel - hysteres) för att lämna tillståndet. Detta ger stabilitet för automatiseringar som reagerar på betygsändringar. Sätt till 0 för att inaktivera. Standard: 2%", - "price_rating_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande betyg. Små isolerade betygsändringar sammanfogas med det dominerande grannblocket. Detta ger stabilitet för automatiseringar genom att förhindra att korta betygstoppar utlöser onödiga åtgärder. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'hög'-intervaller korrigeras till 'hög'. Sätt till 0 för att inaktivera. Standard: 1" - }, - "submit": "↩ Spara & tillbaka" - }, - "best_price": { - "title": "💚 Bästa Prisperiod-inställningar", - "description": "**Konfigurera inställningar för binärsensorn Bästa Prisperiod. Denna sensor är aktiv under perioder med lägsta elpriserna.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periodlängd & Nivåer", - "description": "Konfigurera hur långa perioder ska vara och vilka prisnivåer som ska inkluderas.", - "data": { - "best_price_min_period_length": "Minsta Periodlängd", - "best_price_max_level": "Prisnivåfilter", - "best_price_max_level_gap_count": "Gaptolerans" - }, - "data_description": { - "best_price_min_period_length": "Minsta varaktighet för en period för att betraktas som 'bästa pris'. Längre perioder är mer praktiska för att köra apparater som diskmaskiner eller värmepumpar. Bästa prisperioder kräver 60 minuter minimum (jämfört med 30 minuter för topprisvarningar) eftersom de bör ge meningsfulla tidsfönster för förbrukningsplanering, inte bara korta möjligheter.", - "best_price_max_level": "Visa endast bästa prisperioder om de innehåller intervall med prisnivåer ≤ valt värde. Till exempel betyder valet '**Billigt**' 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 termer. Välj '**Alla**' för att visa bästa priser oavsett deras absoluta prisnivå.", - "best_price_max_level_gap_count": "Maximalt antal konsekutiva intervall som tillåts avvika med exakt ett nivåsteg från den nödvändiga nivån. 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. **Obs:** Gaptolerans kräver perioder ≥90 minuter (6 intervall) för att upptäcka avvikare effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." - } - }, - "flexibility_settings": { - "name": "Flexibilitet & Trösklar", - "description": "Kontrollera hur mycket priser kan avvika och fortfarande kvalificera som 'bästa pris'.", - "data": { - "best_price_flex": "Flexibilitet", - "best_price_min_distance_from_avg": "Minimiavstånd" - }, - "data_description": { - "best_price_flex": "Maximum över dagens minimipris som intervall kan vara och fortfarande kvalificera som 'bästa pris'. Rekommenderat: 15-20 med relaxation aktiverad (standard), eller 25-35 utan relaxation. Maximum: 50 (hård gräns för pålitlig perioddetektering).", - "best_price_min_distance_from_avg": "Säkerställer att perioder är betydligt billigare än dagsgenomsnittet, inte bara marginellt under det. Detta filtrerar bort brus och förhindrar att perioder strax under genomsnittet markeras som 'bästa pris' på dagar med platta priser. Högre värden = striktare filtrering (endast verkligt billiga perioder kvalificerar). Standard: 5 betyder att perioder måste vara minst 5% under dagsgenomsnittet." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxation & Målperioder", - "description": "Konfigurera automatisk filterrelaxation och målperiodsantal. Aktivera 'Uppnå Minimiantal' för att aktivera relaxation.", - "data": { - "enable_min_periods_best": "Uppnå Minimiantal", - "min_periods_best": "Minsta Perioder", - "relaxation_attempts_best": "Relaxationsförsök" - }, - "data_description": { - "enable_min_periods_best": "När aktiverad kommer filter gradvis att relaxeras om inte tillräckligt många perioder hittas. Detta försöker nå det önskade minimiantalet perioder, vilket kan inkludera mindre optimala tidsfönster som bästa-pris-perioder.", - "min_periods_best": "Minsta antal bästa prisperioder att sikta på per dag. Filter kommer att relaxeras steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Uppnå Minimiantal' är aktiverad. Standard: 1", - "relaxation_attempts_best": "Hur många flexnivåer (försök) att prova innan man ger upp. Varje försök kör alla filterkombinationer på den nya flexnivån. Fler försök ökar chansen att hitta ytterligare perioder på bekostnad av längre behandlingstid." - } - } - }, - "submit": "↩ Spara & tillbaka" - }, - "peak_price": { - "title": "🔴 Topprisperiod-inställningar", - "description": "**Konfigurera inställningar för binärsensorn Topprisperiod. Denna sensor är aktiv under perioder med högsta elpriserna.**{entity_warning}{override_warning}\n\n---", - "sections": { - "period_settings": { - "name": "Periodinställningar", - "description": "Konfigurera periodlängd och prisnivåbegränsningar.", - "data": { - "peak_price_min_period_length": "Minsta Periodlängd", - "peak_price_min_level": "Prisnivåfilter", - "peak_price_max_level_gap_count": "Gaptolerans" - }, - "data_description": { - "peak_price_min_period_length": "Minsta varaktighet för en period för att betraktas som 'topppris'. Topprisvarningar är tillåtna för kortare perioder (30 minuters minimum jämfört med 60 minuter för bästa pris) eftersom korta dyra toppar är värda att varna om, även om de är för korta för förbrukningsplanering.", - "peak_price_min_level": "Visa endast topprisperioder om de innehåller intervall med prisnivåer ≥ valt värde. Till exempel betyder valet '**Dyrt**' att perioden måste ha minst ett '**Dyrt**' eller '**Mycket dyrt**' intervall. Detta säkerställer att 'topppris'-perioder inte bara är relativt dyra för dagen, utan faktiskt dyra i absoluta termer. Välj '**Alla**' för att visa topppriser oavsett deras absoluta prisnivå.", - "peak_price_max_level_gap_count": "Maximalt antal konsekutiva intervall som tillåts avvika med exakt ett nivåsteg från den nödvändiga nivån. 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. **Obs:** Gaptolerans kräver perioder ≥90 minuter (6 intervall) för att upptäcka avvikare effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." - } - }, - "flexibility_settings": { - "name": "Flexibilitetsinställningar", - "description": "Konfigurera prisjämförelsetrösklar och filtrering.", - "data": { - "peak_price_flex": "Flexibilitet", - "peak_price_min_distance_from_avg": "Minimiavstånd" - }, - "data_description": { - "peak_price_flex": "Maximum under dagens maximipris som intervall kan vara och fortfarande kvalificera som 'topppris'. Rekommenderat: -15 till -20 med relaxation aktiverad (standard), eller -25 till -35 utan relaxation. Maximum: -50 (hård gräns för pålitlig perioddetektering). Obs: Negativa värden indikerar avstånd under maximum.", - "peak_price_min_distance_from_avg": "Säkerställer att perioder är betydligt dyrare än dagsgenomsnittet, inte bara marginellt över det. Detta filtrerar bort brus och förhindrar att perioder strax över genomsnittet markeras som 'topppris' på dagar med platta priser. Högre värden = striktare filtrering (endast verkligt dyra perioder kvalificerar). Standard: 5 betyder att perioder måste vara minst 5% över dagsgenomsnittet." - } - }, - "relaxation_and_target_periods": { - "name": "Relaxation & Målperioder", - "description": "Konfigurera automatisk filterrelaxation och målperiodsantal. Aktivera 'Uppnå Minimiantal' för att aktivera relaxation.", - "data": { - "enable_min_periods_peak": "Uppnå Minimiantal", - "min_periods_peak": "Minsta Perioder", - "relaxation_attempts_peak": "Relaxationsförsök" - }, - "data_description": { - "enable_min_periods_peak": "När aktiverad kommer filter gradvis att relaxeras om inte tillräckligt många perioder hittas. Detta försöker nå det önskade minimiantalet perioder för att säkerställa att du varnas om dyra perioder även på dagar med ovanliga prismönster.", - "min_periods_peak": "Minsta antal topprisperioder att sikta på per dag. Filter kommer att relaxeras steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Uppnå Minimiantal' är aktiverad. Standard: 1", - "relaxation_attempts_peak": "Hur många flexnivåer (försök) att prova innan man ger upp. Varje försök kör alla filterkombinationer på den nya flexnivån. Fler försök ökar chansen att hitta ytterligare toppperioder på bekostnad av längre behandlingstid." - } - } - }, - "submit": "↩ Spara & tillbaka" - }, - "price_trend": { - "title": "📈 Pristrendtrösklar", - "description": "**Konfigurera tröskelvärden för pristrendsensorer. Dessa sensorer jämför aktuellt pris med genomsnittet av de nästa N timmarna för att bestämma om priserna stiger kraftigt, stiger, är stabila, faller eller faller kraftigt.**{entity_warning}", - "data": { - "price_trend_threshold_rising": "Stigande tröskel", - "price_trend_threshold_strongly_rising": "Kraftigt stigande tröskel", - "price_trend_threshold_falling": "Fallande tröskel", - "price_trend_threshold_strongly_falling": "Kraftigt fallande tröskel", - "price_trend_change_confirmation": "Trendändringsbekräftelse", - "price_trend_min_price_change": "Min. prisändring (trend)", - "price_trend_min_price_change_strongly": "Min. prisändring (stark trend)" - }, - "data_description": { - "price_trend_threshold_rising": "Procentandel som genomsnittet av de nästa N timmarna måste vara över det aktuella priset för att kvalificera som 'stigande' trend. Exempel: 3 betyder att genomsnittet är minst 3% högre → priserna kommer att stiga. Typiska värden: 3-10%. Standard: 3%", - "price_trend_threshold_strongly_rising": "Procentandel som genomsnittet av de nästa N timmarna måste vara över det aktuella priset för att kvalificera som 'kraftigt stigande' trend. Måste vara högre än stigande tröskel. Typiska värden: 6-20%. Standard: 9%", - "price_trend_threshold_falling": "Procentandel (negativ) som genomsnittet av de nästa N timmarna måste vara under det aktuella priset för att kvalificera som 'fallande' trend. Exempel: -3 betyder att genomsnittet är minst 3% lägre → priserna kommer att falla. Typiska värden: -3 till -10%. Standard: -3%", - "price_trend_threshold_strongly_falling": "Procentandel (negativ) som genomsnittet av de nästa N timmarna måste vara under det aktuella priset för att kvalificera som 'kraftigt fallande' trend. Måste vara lägre (mer negativ) än fallande tröskel. Typiska värden: -6 till -20%. Standard: -9%", - "price_trend_change_confirmation": "Antal på varandra följande 15-minutersintervall som måste bekräfta en ny trendriktning innan en trendändring rapporteras. Högre värden innebär mer stabilitet och färre falska ändringar, lägre värden innebär snabbare upptäckt. Intervall: 2 (30 min) till 6 (90 min). Standard: 3 (45 min)", - "price_trend_min_price_change": "Minsta absoluta prisskillnad (i ct/öre) som krävs för en 'stigande' eller 'fallande' trend. Förhindrar att minimala prisändringar utlöser trender vid låga prisnivåer. Sätt till 0 för att inaktivera (rent procentläge). Standard: 0,5", - "price_trend_min_price_change_strongly": "Minsta absoluta prisskillnad (i ct/öre) som krävs för en 'kraftigt stigande' eller 'kraftigt fallande' trend. Bör vara högre än det vanliga trendminimumet. Sätt till 0 för att inaktivera. Standard: 1,5" - }, - "submit": "↩ Spara & tillbaka" - }, - "volatility": { - "title": "💨 Prisvolatilitetströsklar", - "description": "**Konfigurera tröskelvärden för volatilitetsklassificering.** Volatilitet mäter relativ prisvariation med variationskoefficienten (CV = standardavvikelse / medelvärde × 100%). Dessa tröskelvärden är procentvärden som fungerar över alla prisnivåer.\n\nAnvänds av:\n• Volatilitetssensorer (klassificering)\n• Trendsensorer (adaptiv tröskeljustering: <måttlig = mer känslig, ≥hög = mindre känslig){entity_warning}", - "data": { - "volatility_threshold_moderate": "Måttlig tröskel", - "volatility_threshold_high": "Hög tröskel", - "volatility_threshold_very_high": "Mycket hög tröskel" - }, - "data_description": { - "volatility_threshold_moderate": "Variationskoefficient (CV) vid vilken priser anses 'måttligt volatila'. CV = (standardavvikelse / medelvärde) × 100%. Exempel: 15 betyder prisfluktuationer på ±15% runt genomsnittet. Sensorer visar denna klassificering, trendsensorer blir mer känsliga. Standard: 15%", - "volatility_threshold_high": "Variationskoefficient (CV) vid vilken priser anses 'högvolatila'. Exempel: 30 betyder prisfluktuationer på ±30% runt genomsnittet. Större prishopp förväntas, trendsensorer blir mindre känsliga. Standard: 30%", - "volatility_threshold_very_high": "Variationskoefficient (CV) vid vilken priser anses 'mycket högvolatila'. Exempel: 50 betyder extrema prisfluktuationer på ±50% runt genomsnittet. På sådana dagar är starka pristoppar troliga. Standard: 50%" - }, - "submit": "↩ Spara & tillbaka" - }, - "chart_data_export": { - "title": "📊 Diagramdataexport-sensor", - "description": "Diagramdataexport-sensorn tillhandahåller prisdata som sensorattribut.\n\n⚠️ **Obs:** Denna sensor är en äldre funktion för kompatibilitet med äldre verktyg.\n\n**Rekommenderat för nya konfigurationer:** Använd `tibber_prices.get_chartdata` **tjänsten direkt** - den är mer flexibel, effektiv och det moderna Home Assistant-sättet.\n\n**När denna sensor är meningsfull:**\n\n✅ Ditt instrumentpanelverktyg kan **endast** läsa attribut (inga tjänsteanrop)\n✅ Du behöver statisk data som uppdateras automatiskt\n❌ **Inte för automationer:** Använd `tibber_prices.get_chartdata` direkt där - mer flexibelt och effektivt!\n\n---\n\n{sensor_status_info}", - "submit": "↩ Ok & tillbaka" - }, - "reset_to_defaults": { - "title": "🔄 Återställ till standard", - "description": "⚠️ **Varning:** Detta kommer att återställa **ALLA** inställningar till fabriksstandard.\n\n**Vad som kommer att återställas:**\n• Alla prisbetygströsklar\n• Alla volatilitetströsklar\n• Alla pristrendtrösklar\n• Alla bästa prisperiodinställningar\n• Alla topprisperiodinställningar\n• Visningsinställningar\n• Allmänna inställningar\n\n**Vad som INTE kommer att återställas:**\n• Din Tibber API-token\n• Valt hem\n• Valuta\n\n**💡 Tips:** Detta är användbart om du vill börja om från början efter att ha experimenterat med inställningar.", - "data": { - "confirm_reset": "Ja, återställ allt till standard" - }, - "submit": "Återställ nu" - }, - "price_level": { - "title": "🏷️ Prisnivå-inställningar", - "description": "**Konfigurera stabilisering för Tibbers prisnivå-klassificering (mycket billig/billig/normal/dyr/mycket dyr).**\n\nTibbers API tillhandahåller ett prisnivå-fält för varje intervall. Denna inställning jämnar ut korta fluktuationer för att förhindra instabilitet i automatiseringar.{entity_warning}", - "data": { - "price_level_gap_tolerance": "Gap-tolerans" - }, - "data_description": { - "price_level_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande prisnivåer. Små isolerade nivåförändringar sammanfogas med det dominerande grannblocket. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'billig'-intervaller korrigeras till 'billig'. Sätt till 0 för att inaktivera. Standard: 1" - }, - "submit": "↩ Spara & tillbaka" + "data_description": { + "best_price_min_period_length": "Minsta varaktighet för en period för att betraktas som 'bästa pris'. Längre perioder är mer praktiska för att köra apparater som diskmaskiner eller värmepumpar. Bästa prisperioder kräver 60 minuter minimum (jämfört med 30 minuter för topprisvarningar) eftersom de bör ge meningsfulla tidsfönster för förbrukningsplanering, inte bara korta möjligheter.", + "best_price_max_level": "Visa endast bästa prisperioder om de innehåller intervall med prisnivåer ≤ valt värde. Till exempel betyder valet '**Billigt**' 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 termer. Välj '**Alla**' för att visa bästa priser oavsett deras absoluta prisnivå.", + "best_price_max_level_gap_count": "Maximalt antal konsekutiva intervall som tillåts avvika med exakt ett nivåsteg från den nödvändiga nivån. 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. **Obs:** Gaptolerans kräver perioder ≥90 minuter (6 intervall) för att upptäcka avvikare effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." } + }, + "flexibility_settings": { + "name": "Flexibilitet & Trösklar", + "description": "Kontrollera hur mycket priser kan avvika och fortfarande kvalificera som 'bästa pris'.", + "data": { + "best_price_flex": "Flexibilitet", + "best_price_min_distance_from_avg": "Minimiavstånd" + }, + "data_description": { + "best_price_flex": "Maximum över dagens minimipris som intervall kan vara och fortfarande kvalificera som 'bästa pris'. Rekommenderat: 15-20 med relaxation aktiverad (standard), eller 25-35 utan relaxation. Maximum: 50 (hård gräns för pålitlig perioddetektering).", + "best_price_min_distance_from_avg": "Säkerställer att perioder är betydligt billigare än dagsgenomsnittet, inte bara marginellt under det. Detta filtrerar bort brus och förhindrar att perioder strax under genomsnittet markeras som 'bästa pris' på dagar med platta priser. Högre värden = striktare filtrering (endast verkligt billiga perioder kvalificerar). Standard: 5 betyder att perioder måste vara minst 5% under dagsgenomsnittet." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxation & Målperioder", + "description": "Konfigurera automatisk filterrelaxation och målperiodsantal. Aktivera 'Uppnå Minimiantal' för att aktivera relaxation.", + "data": { + "enable_min_periods_best": "Uppnå Minimiantal", + "min_periods_best": "Minsta Perioder", + "relaxation_attempts_best": "Relaxationsförsök" + }, + "data_description": { + "enable_min_periods_best": "När aktiverad kommer filter gradvis att relaxeras om inte tillräckligt många perioder hittas. Detta försöker nå det önskade minimiantalet perioder, vilket kan inkludera mindre optimala tidsfönster som bästa-pris-perioder.", + "min_periods_best": "Minsta antal bästa prisperioder att sikta på per dag. Filter kommer att relaxeras steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Uppnå Minimiantal' är aktiverad. Standard: 1", + "relaxation_attempts_best": "Hur många flexnivåer (försök) att prova innan man ger upp. Varje försök kör alla filterkombinationer på den nya flexnivån. Fler försök ökar chansen att hitta ytterligare perioder på bekostnad av längre behandlingstid." + } + }, + "extension_settings": { + "name": "Utvidgning av periodändarna", + "description": "Utvidga eventuellt hittade bästa-prisperioder vid båda ändarna för att inkludera angränsande mycket billiga intervall.", + "data": { + "best_price_extend_to_very_cheap": "Utvidga till mycket billiga intervall", + "best_price_max_extension_intervals": "Maximalt antal utvidgningsintervall" + }, + "data_description": { + "best_price_extend_to_very_cheap": "När aktiverat utvidgas hittade bästa-prisperioder utåt för att inkludera angränsande intervall med prisnivån 'Mycket billig'. Detta fångar upp extremt billiga intervall vid kanterna av hittade perioder.", + "best_price_max_extension_intervals": "Maximalt antal extra intervall per sida (vänster och höger kant). Varje intervall är 15 minuter. Exempel: 4 intervall = upp till 1 timmes utvidgning per kant. Standard: 4" + } + } }, - "error": { - "auth": "Tibber-åtkomsttoken är ogiltig.", - "connection": "Kan inte ansluta till Tibber. Kontrollera din internetanslutning.", - "unknown": "Ett oväntat fel inträffade. Kontrollera loggarna för detaljer.", - "cannot_connect": "Anslutning misslyckades", - "invalid_access_token": "Ogiltig åtkomsttoken", - "different_home": "Åtkomsttoken är inte giltig för det hem-ID som denna integration är konfigurerad för.", - "invalid_period_length": "Periodlängd måste vara minst 15 minuter (multiplar av 15).", - "invalid_flex": "Flexibilitetsprocent måste vara mellan -50% och +50%", - "invalid_best_price_distance": "Avstånds procent måste vara mellan -50% och 0% (negativ = under genomsnitt)", - "invalid_peak_price_distance": "Avstånds procent måste vara mellan 0% och 50% (positiv = över genomsnitt)", - "invalid_min_periods": "Minsta perioder måste vara mellan 1 och 10", - "invalid_gap_count": "Gapantal måste vara mellan 0 och 8", - "invalid_relaxation_attempts": "Relaxationsförsök måste vara mellan 1 och 12", - "invalid_price_rating_low": "Låg prisbetygströskel måste vara mellan -50% och -5%", - "invalid_price_rating_high": "Hög prisbetygströskel måste vara mellan 5% och 50%", - "invalid_price_rating_thresholds": "Låg tröskel måste vara mindre än hög tröskel", - "invalid_volatility_threshold_moderate": "Måttlig volatilitetströskel måste vara mellan 5% och 25%", - "invalid_volatility_threshold_high": "Hög volatilitetströskel måste vara mellan 20% och 40%", - "invalid_volatility_threshold_very_high": "Mycket hög volatilitetströskel måste vara mellan 35% och 80%", - "invalid_volatility_thresholds": "Trösklar måste vara i stigande ordning: måttlig < hög < mycket hög", - "invalid_price_trend_rising": "Stigande trendtröskel måste vara mellan 1% och 50%", - "invalid_price_trend_falling": "Fallande trendtröskel måste vara mellan -50% och -1%", - "invalid_price_trend_strongly_rising": "Kraftigt stigande trendtröskel måste vara mellan 2% och 100%", - "invalid_price_trend_strongly_falling": "Kraftigt fallande trendtröskel måste vara mellan -100% och -2%", - "invalid_trend_strongly_rising_less_than_rising": "Kraftigt stigande-tröskel måste vara högre än stigande-tröskel", - "invalid_trend_strongly_falling_greater_than_falling": "Kraftigt fallande-tröskel måste vara lägre (mer negativ) än fallande-tröskel" + "submit": "↩ Spara & tillbaka" + }, + "peak_price": { + "title": "🔴 Topprisperiod-inställningar", + "description": "**Konfigurera inställningar för binärsensorn Topprisperiod. Denna sensor är aktiv under perioder med högsta elpriserna.**{entity_warning}{override_warning}\n\n---", + "sections": { + "period_settings": { + "name": "Periodinställningar", + "description": "Konfigurera periodlängd och prisnivåbegränsningar.", + "data": { + "peak_price_min_period_length": "Minsta Periodlängd", + "peak_price_min_level": "Prisnivåfilter", + "peak_price_max_level_gap_count": "Gaptolerans" + }, + "data_description": { + "peak_price_min_period_length": "Minsta varaktighet för en period för att betraktas som 'topppris'. Topprisvarningar är tillåtna för kortare perioder (30 minuters minimum jämfört med 60 minuter för bästa pris) eftersom korta dyra toppar är värda att varna om, även om de är för korta för förbrukningsplanering.", + "peak_price_min_level": "Visa endast topprisperioder om de innehåller intervall med prisnivåer ≥ valt värde. Till exempel betyder valet '**Dyrt**' att perioden måste ha minst ett '**Dyrt**' eller '**Mycket dyrt**' intervall. Detta säkerställer att 'topppris'-perioder inte bara är relativt dyra för dagen, utan faktiskt dyra i absoluta termer. Välj '**Alla**' för att visa topppriser oavsett deras absoluta prisnivå.", + "peak_price_max_level_gap_count": "Maximalt antal konsekutiva intervall som tillåts avvika med exakt ett nivåsteg från den nödvändiga nivån. 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. **Obs:** Gaptolerans kräver perioder ≥90 minuter (6 intervall) för att upptäcka avvikare effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." + } + }, + "flexibility_settings": { + "name": "Flexibilitetsinställningar", + "description": "Konfigurera prisjämförelsetrösklar och filtrering.", + "data": { + "peak_price_flex": "Flexibilitet", + "peak_price_min_distance_from_avg": "Minimiavstånd" + }, + "data_description": { + "peak_price_flex": "Maximum under dagens maximipris som intervall kan vara och fortfarande kvalificera som 'topppris'. Rekommenderat: -15 till -20 med relaxation aktiverad (standard), eller -25 till -35 utan relaxation. Maximum: -50 (hård gräns för pålitlig perioddetektering). Obs: Negativa värden indikerar avstånd under maximum.", + "peak_price_min_distance_from_avg": "Säkerställer att perioder är betydligt dyrare än dagsgenomsnittet, inte bara marginellt över det. Detta filtrerar bort brus och förhindrar att perioder strax över genomsnittet markeras som 'topppris' på dagar med platta priser. Högre värden = striktare filtrering (endast verkligt dyra perioder kvalificerar). Standard: 5 betyder att perioder måste vara minst 5% över dagsgenomsnittet." + } + }, + "relaxation_and_target_periods": { + "name": "Relaxation & Målperioder", + "description": "Konfigurera automatisk filterrelaxation och målperiodsantal. Aktivera 'Uppnå Minimiantal' för att aktivera relaxation.", + "data": { + "enable_min_periods_peak": "Uppnå Minimiantal", + "min_periods_peak": "Minsta Perioder", + "relaxation_attempts_peak": "Relaxationsförsök" + }, + "data_description": { + "enable_min_periods_peak": "När aktiverad kommer filter gradvis att relaxeras om inte tillräckligt många perioder hittas. Detta försöker nå det önskade minimiantalet perioder för att säkerställa att du varnas om dyra perioder även på dagar med ovanliga prismönster.", + "min_periods_peak": "Minsta antal topprisperioder att sikta på per dag. Filter kommer att relaxeras steg för steg för att försöka uppnå detta antal. Endast aktiv när 'Uppnå Minimiantal' är aktiverad. Standard: 1", + "relaxation_attempts_peak": "Hur många flexnivåer (försök) att prova innan man ger upp. Varje försök kör alla filterkombinationer på den nya flexnivån. Fler försök ökar chansen att hitta ytterligare toppperioder på bekostnad av längre behandlingstid." + } + }, + "extension_settings": { + "name": "Utvidgning av periodändarna", + "description": "Utvidga eventuellt hittade topprisperioder vid båda ändarna för att inkludera angränsande mycket dyra intervall.", + "data": { + "peak_price_extend_to_very_expensive": "Utvidga till mycket dyra intervall", + "peak_price_max_extension_intervals": "Maximalt antal utvidgningsintervall" + }, + "data_description": { + "peak_price_extend_to_very_expensive": "När aktiverat utvidgas hittade topprisperioder utåt för att inkludera angränsande intervall med prisnivån 'Mycket dyr'. Detta fångar upp extremt dyra intervall vid kanterna av hittade perioder.", + "peak_price_max_extension_intervals": "Maximalt antal extra intervall per sida (vänster och höger kant). Varje intervall är 15 minuter. Exempel: 4 intervall = upp till 1 timmes utvidgning per kant. Standard: 4" + } + } }, - "abort": { - "entry_not_found": "Tibber-konfigurationspost hittades inte.", - "reset_cancelled": "Återställning avbruten. Inga ändringar gjordes i din konfiguration.", - "reset_successful": "✅ Alla inställningar har återställts till fabriksstandard. Din konfiguration är nu som en ny installation.", - "finished": "Konfiguration slutförd." + "submit": "↩ Spara & tillbaka" + }, + "price_trend": { + "title": "📈 Pristrendtrösklar", + "description": "**Konfigurera tröskelvärden för pristrendsensorer. Dessa sensorer jämför aktuellt pris med genomsnittet av de nästa N timmarna för att bestämma om priserna stiger kraftigt, stiger, är stabila, faller eller faller kraftigt.**{entity_warning}", + "data": { + "price_trend_threshold_rising": "Stigande tröskel", + "price_trend_threshold_strongly_rising": "Kraftigt stigande tröskel", + "price_trend_threshold_falling": "Fallande tröskel", + "price_trend_threshold_strongly_falling": "Kraftigt fallande tröskel", + "price_trend_change_confirmation": "Trendändringsbekräftelse", + "price_trend_min_price_change": "Min. prisändring (trend)", + "price_trend_min_price_change_strongly": "Min. prisändring (stark trend)" + }, + "data_description": { + "price_trend_threshold_rising": "Procentandel som genomsnittet av de nästa N timmarna måste vara över det aktuella priset för att kvalificera som 'stigande' trend. Exempel: 3 betyder att genomsnittet är minst 3% högre → priserna kommer att stiga. Typiska värden: 3-10%. Standard: 3%", + "price_trend_threshold_strongly_rising": "Procentandel som genomsnittet av de nästa N timmarna måste vara över det aktuella priset för att kvalificera som 'kraftigt stigande' trend. Måste vara högre än stigande tröskel. Typiska värden: 6-20%. Standard: 9%", + "price_trend_threshold_falling": "Procentandel (negativ) som genomsnittet av de nästa N timmarna måste vara under det aktuella priset för att kvalificera som 'fallande' trend. Exempel: -3 betyder att genomsnittet är minst 3% lägre → priserna kommer att falla. Typiska värden: -3 till -10%. Standard: -3%", + "price_trend_threshold_strongly_falling": "Procentandel (negativ) som genomsnittet av de nästa N timmarna måste vara under det aktuella priset för att kvalificera som 'kraftigt fallande' trend. Måste vara lägre (mer negativ) än fallande tröskel. Typiska värden: -6 till -20%. Standard: -9%", + "price_trend_change_confirmation": "Antal på varandra följande 15-minutersintervall som måste bekräfta en ny trendriktning innan en trendändring rapporteras. Högre värden innebär mer stabilitet och färre falska ändringar, lägre värden innebär snabbare upptäckt. Intervall: 2 (30 min) till 6 (90 min). Standard: 3 (45 min)", + "price_trend_min_price_change": "Minsta absoluta prisskillnad (i ct/öre) som krävs för en 'stigande' eller 'fallande' trend. Förhindrar att minimala prisändringar utlöser trender vid låga prisnivåer. Sätt till 0 för att inaktivera (rent procentläge). Standard: 0,5", + "price_trend_min_price_change_strongly": "Minsta absoluta prisskillnad (i ct/öre) som krävs för en 'kraftigt stigande' eller 'kraftigt fallande' trend. Bör vara högre än det vanliga trendminimumet. Sätt till 0 för att inaktivera. Standard: 1,5" + }, + "submit": "↩ Spara & tillbaka" + }, + "volatility": { + "title": "💨 Prisvolatilitetströsklar", + "description": "**Konfigurera tröskelvärden för volatilitetsklassificering.** Volatilitet mäter relativ prisvariation med variationskoefficienten (CV = standardavvikelse / medelvärde × 100%). Dessa tröskelvärden är procentvärden som fungerar över alla prisnivåer.\n\nAnvänds av:\n• Volatilitetssensorer (klassificering)\n• Trendsensorer (adaptiv tröskeljustering: <måttlig = mer känslig, ≥hög = mindre känslig){entity_warning}", + "data": { + "volatility_threshold_moderate": "Måttlig tröskel", + "volatility_threshold_high": "Hög tröskel", + "volatility_threshold_very_high": "Mycket hög tröskel" + }, + "data_description": { + "volatility_threshold_moderate": "Variationskoefficient (CV) vid vilken priser anses 'måttligt volatila'. CV = (standardavvikelse / medelvärde) × 100%. Exempel: 15 betyder prisfluktuationer på ±15% runt genomsnittet. Sensorer visar denna klassificering, trendsensorer blir mer känsliga. Standard: 15%", + "volatility_threshold_high": "Variationskoefficient (CV) vid vilken priser anses 'högvolatila'. Exempel: 30 betyder prisfluktuationer på ±30% runt genomsnittet. Större prishopp förväntas, trendsensorer blir mindre känsliga. Standard: 30%", + "volatility_threshold_very_high": "Variationskoefficient (CV) vid vilken priser anses 'mycket högvolatila'. Exempel: 50 betyder extrema prisfluktuationer på ±50% runt genomsnittet. På sådana dagar är starka pristoppar troliga. Standard: 50%" + }, + "submit": "↩ Spara & tillbaka" + }, + "chart_data_export": { + "title": "📊 Diagramdataexport-sensor", + "description": "Diagramdataexport-sensorn tillhandahåller prisdata som sensorattribut.\n\n⚠️ **Obs:** Denna sensor är en äldre funktion för kompatibilitet med äldre verktyg.\n\n**Rekommenderat för nya konfigurationer:** Använd `tibber_prices.get_chartdata` **tjänsten direkt** - den är mer flexibel, effektiv och det moderna Home Assistant-sättet.\n\n**När denna sensor är meningsfull:**\n\n✅ Ditt instrumentpanelverktyg kan **endast** läsa attribut (inga tjänsteanrop)\n✅ Du behöver statisk data som uppdateras automatiskt\n❌ **Inte för automationer:** Använd `tibber_prices.get_chartdata` direkt där - mer flexibelt och effektivt!\n\n---\n\n{sensor_status_info}", + "submit": "↩ Ok & tillbaka" + }, + "reset_to_defaults": { + "title": "🔄 Återställ till standard", + "description": "⚠️ **Varning:** Detta kommer att återställa **ALLA** inställningar till fabriksstandard.\n\n**Vad som kommer att återställas:**\n• Alla prisbetygströsklar\n• Alla volatilitetströsklar\n• Alla pristrendtrösklar\n• Alla bästa prisperiodinställningar\n• Alla topprisperiodinställningar\n• Visningsinställningar\n• Allmänna inställningar\n\n**Vad som INTE kommer att återställas:**\n• Din Tibber API-token\n• Valt hem\n• Valuta\n\n**💡 Tips:** Detta är användbart om du vill börja om från början efter att ha experimenterat med inställningar.", + "data": { + "confirm_reset": "Ja, återställ allt till standard" + }, + "submit": "Återställ nu" + }, + "price_level": { + "title": "🏷️ Prisnivå-inställningar", + "description": "**Konfigurera stabilisering för Tibbers prisnivå-klassificering (mycket billig/billig/normal/dyr/mycket dyr).**\n\nTibbers API tillhandahåller ett prisnivå-fält för varje intervall. Denna inställning jämnar ut korta fluktuationer för att förhindra instabilitet i automatiseringar.{entity_warning}", + "data": { + "price_level_gap_tolerance": "Gap-tolerans" + }, + "data_description": { + "price_level_gap_tolerance": "Maximalt antal på varandra följande intervaller som kan 'jämnas ut' om de avviker från omgivande prisnivåer. Små isolerade nivåförändringar sammanfogas med det dominerande grannblocket. Exempel: 1 betyder att ett enstaka 'normal'-intervall omgivet av 'billig'-intervaller korrigeras till 'billig'. Sätt till 0 för att inaktivera. Standard: 1" + }, + "submit": "↩ Spara & tillbaka" + } + }, + "error": { + "auth": "Tibber-åtkomsttoken är ogiltig.", + "connection": "Kan inte ansluta till Tibber. Kontrollera din internetanslutning.", + "unknown": "Ett oväntat fel inträffade. Kontrollera loggarna för detaljer.", + "cannot_connect": "Anslutning misslyckades", + "invalid_access_token": "Ogiltig åtkomsttoken", + "different_home": "Åtkomsttoken är inte giltig för det hem-ID som denna integration är konfigurerad för.", + "invalid_period_length": "Periodlängd måste vara minst 15 minuter (multiplar av 15).", + "invalid_flex": "Flexibilitetsprocent måste vara mellan -50% och +50%", + "invalid_best_price_distance": "Avstånds procent måste vara mellan -50% och 0% (negativ = under genomsnitt)", + "invalid_peak_price_distance": "Avstånds procent måste vara mellan 0% och 50% (positiv = över genomsnitt)", + "invalid_min_periods": "Minsta perioder måste vara mellan 1 och 10", + "invalid_gap_count": "Gapantal måste vara mellan 0 och 8", + "invalid_relaxation_attempts": "Relaxationsförsök måste vara mellan 1 och 12", + "invalid_price_rating_low": "Låg prisbetygströskel måste vara mellan -50% och -5%", + "invalid_price_rating_high": "Hög prisbetygströskel måste vara mellan 5% och 50%", + "invalid_price_rating_thresholds": "Låg tröskel måste vara mindre än hög tröskel", + "invalid_volatility_threshold_moderate": "Måttlig volatilitetströskel måste vara mellan 5% och 25%", + "invalid_volatility_threshold_high": "Hög volatilitetströskel måste vara mellan 20% och 40%", + "invalid_volatility_threshold_very_high": "Mycket hög volatilitetströskel måste vara mellan 35% och 80%", + "invalid_volatility_thresholds": "Trösklar måste vara i stigande ordning: måttlig < hög < mycket hög", + "invalid_price_trend_rising": "Stigande trendtröskel måste vara mellan 1% och 50%", + "invalid_price_trend_falling": "Fallande trendtröskel måste vara mellan -50% och -1%", + "invalid_price_trend_strongly_rising": "Kraftigt stigande trendtröskel måste vara mellan 2% och 100%", + "invalid_price_trend_strongly_falling": "Kraftigt fallande trendtröskel måste vara mellan -100% och -2%", + "invalid_trend_strongly_rising_less_than_rising": "Kraftigt stigande-tröskel måste vara högre än stigande-tröskel", + "invalid_trend_strongly_falling_greater_than_falling": "Kraftigt fallande-tröskel måste vara lägre (mer negativ) än fallande-tröskel" + }, + "abort": { + "entry_not_found": "Tibber-konfigurationspost hittades inte.", + "reset_cancelled": "Återställning avbruten. Inga ändringar gjordes i din konfiguration.", + "reset_successful": "✅ Alla inställningar har återställts till fabriksstandard. Din konfiguration är nu som en ny installation.", + "finished": "Konfiguration slutförd." + } + }, + "entity": { + "sensor": { + "current_interval_price": { + "name": "Aktuellt elpris" + }, + "current_interval_price_base": { + "name": "Aktuellt elpris (Energidashboard)" + }, + "next_interval_price": { + "name": "Nästa elpris" + }, + "previous_interval_price": { + "name": "Föregående elpris" + }, + "current_hour_average_price": { + "name": "⌀ Timpris aktuell" + }, + "next_hour_average_price": { + "name": "⌀ Timpris nästa" + }, + "current_interval_price_level": { + "name": "Aktuell prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" } - }, - "entity": { - "sensor": { - "current_interval_price": { - "name": "Aktuellt elpris" - }, - "current_interval_price_base": { - "name": "Aktuellt elpris (Energidashboard)" - }, - "next_interval_price": { - "name": "Nästa elpris" - }, - "previous_interval_price": { - "name": "Föregående elpris" - }, - "current_hour_average_price": { - "name": "⌀ Timpris aktuell" - }, - "next_hour_average_price": { - "name": "⌀ Timpris nästa" - }, - "current_interval_price_level": { - "name": "Aktuell prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "next_interval_price_level": { - "name": "Nästa prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "previous_interval_price_level": { - "name": "Föregående prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "current_hour_price_level": { - "name": "Aktuell timprisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "next_hour_price_level": { - "name": "Nästa timprisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "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": "⌀ Pris idag" - }, - "lowest_price_tomorrow": { - "name": "Morgondagens lägsta pris" - }, - "highest_price_tomorrow": { - "name": "Morgondagens högsta pris" - }, - "average_price_tomorrow": { - "name": "⌀ Pris imorgon" - }, - "yesterday_price_level": { - "name": "Gårdagens prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "today_price_level": { - "name": "Dagens prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "tomorrow_price_level": { - "name": "Morgondagens prisnivå", - "state": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } - }, - "yesterday_price_rating": { - "name": "Gårdagens prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "today_price_rating": { - "name": "Dagens prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "tomorrow_price_rating": { - "name": "Morgondagens prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "trailing_price_average": { - "name": "⌀ Pris glidande 24h" - }, - "leading_price_average": { - "name": "⌀ Pris framåt 24h" - }, - "trailing_price_min": { - "name": "Glidande 24h minimipris" - }, - "trailing_price_max": { - "name": "Glidande 24h maximipris" - }, - "leading_price_min": { - "name": "Framåt 24h minimipris" - }, - "leading_price_max": { - "name": "Framåt 24h maximipris" - }, - "current_interval_price_rating": { - "name": "Aktuellt prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "next_interval_price_rating": { - "name": "Nästa prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "previous_interval_price_rating": { - "name": "Föregående prisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "current_hour_price_rating": { - "name": "Aktuellt timprisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "next_hour_price_rating": { - "name": "Nästa timprisbetyg", - "state": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "next_avg_1h": { - "name": "⌀ Pris nästa 1h" - }, - "next_avg_2h": { - "name": "⌀ Pris nästa 2h" - }, - "next_avg_3h": { - "name": "⌀ Pris nästa 3h" - }, - "next_avg_4h": { - "name": "⌀ Pris nästa 4h" - }, - "next_avg_5h": { - "name": "⌀ Pris nästa 5h" - }, - "next_avg_6h": { - "name": "⌀ Pris nästa 6h" - }, - "next_avg_8h": { - "name": "⌀ Pris nästa 8h" - }, - "next_avg_12h": { - "name": "⌀ Pris nästa 12h" - }, - "price_outlook_1h": { - "name": "Prisöversikt (1h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_2h": { - "name": "Prisöversikt (2h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_3h": { - "name": "Prisöversikt (3h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_4h": { - "name": "Prisöversikt (4h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_5h": { - "name": "Prisöversikt (5h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_6h": { - "name": "Prisöversikt (6h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_8h": { - "name": "Prisöversikt (8h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_outlook_12h": { - "name": "Prisöversikt (12h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_2h": { - "name": "Prisutveckling (2h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_3h": { - "name": "Prisutveckling (3h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_4h": { - "name": "Prisutveckling (4h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_5h": { - "name": "Prisutveckling (5h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_6h": { - "name": "Prisutveckling (6h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_8h": { - "name": "Prisutveckling (8h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "price_trajectory_12h": { - "name": "Prisutveckling (12h)", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "current_price_trend": { - "name": "Aktuell pristrend", - "state": { - "strongly_rising": "Kraftigt stigande", - "rising": "Stigande", - "stable": "Stabil", - "falling": "Fallande", - "strongly_falling": "Kraftigt fallande" - } - }, - "next_price_trend_change": { - "name": "Nästa pristrendändring" - }, - "next_price_trend_change_in": { - "name": "Nästa pristrendändring om" - }, - "daily_rating": { - "name": "Dagligt prisbetyg" - }, - "monthly_rating": { - "name": "Månatligt prisbetyg" - }, - "data_lifecycle_status": { - "name": "Datalivscykelstatus", - "state": { - "cached": "Cachad", - "fresh": "Färsk", - "refreshing": "Uppdaterar", - "searching_tomorrow": "Söker morgondag", - "turnover_pending": "Väntar på övergång", - "error": "Fel" - } - }, - "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 24h 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" - } - }, - "best_price_end_time": { - "name": "Bästa pris slutar" - }, - "best_price_period_duration": { - "name": "Bästa pris varaktighet" - }, - "best_price_remaining_minutes": { - "name": "Bästa pris återstående tid" - }, - "best_price_progress": { - "name": "Bästa pris framsteg" - }, - "best_price_next_start_time": { - "name": "Bästa pris startar" - }, - "best_price_next_in_minutes": { - "name": "Bästa pris startar om" - }, - "peak_price_end_time": { - "name": "Topppris slutar" - }, - "peak_price_period_duration": { - "name": "Topppris varaktighet" - }, - "peak_price_remaining_minutes": { - "name": "Topppris återstående tid" - }, - "peak_price_progress": { - "name": "Topppris framsteg" - }, - "peak_price_next_start_time": { - "name": "Topppris startar" - }, - "peak_price_next_in_minutes": { - "name": "Topppris startar om" - }, - "home_type": { - "name": "Hemtyp", - "state": { - "apartment": "Lägenhet", - "rowhouse": "Radhus", - "house": "Hus", - "cottage": "Stuga" - } - }, - "home_size": { - "name": "Hemstorlek" - }, - "main_fuse_size": { - "name": "Huvudsäkringsstorlek" - }, - "number_of_residents": { - "name": "Antal boende" - }, - "primary_heating_source": { - "name": "Primär värmekälla", - "state": { - "air2air_heatpump": "Luft-till-luft värmepump", - "air2water_heatpump": "Luft-till-vatten värmepump", - "boiler": "Panna", - "central_heating": "Centralvärme", - "district_heating": "Fjärrvärme", - "district": "Fjärrvärme", - "electric_boiler": "Elpanna", - "electricity": "El", - "floor": "Golvvärme", - "gas": "Gas", - "ground_heatpump": "Bergvärmepump", - "ground": "Bergvärmepump", - "oil": "Olja", - "other": "Annat", - "waste": "Spillvärme" - } - }, - "grid_company": { - "name": "Nätbolag" - }, - "grid_area_code": { - "name": "Nätområdeskod" - }, - "price_area_code": { - "name": "Prisområdeskod" - }, - "consumption_ean": { - "name": "Förbruknings-EAN" - }, - "production_ean": { - "name": "Produktions-EAN" - }, - "energy_tax_type": { - "name": "Energiskattetyp" - }, - "vat_type": { - "name": "Momstyp" - }, - "estimated_annual_consumption": { - "name": "Beräknad årlig förbrukning" - }, - "subscription_status": { - "name": "Abonnemangsstatus", - "state": { - "running": "Aktiv", - "ended": "Avslutad", - "pending": "Väntande", - "unknown": "Okänd" - } - }, - "day_pattern_yesterday": { - "name": "Prismönster Igår", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dubbeldal", - "double_peak": "Dubbeltopp", - "flat": "Flat", - "rising": "Stigande", - "falling": "Fallande", - "mixed": "Blandad" - } - }, - "day_pattern_today": { - "name": "Prismönster Idag", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dubbeldal", - "double_peak": "Dubbeltopp", - "flat": "Flat", - "rising": "Stigande", - "falling": "Fallande", - "mixed": "Blandad" - } - }, - "day_pattern_tomorrow": { - "name": "Prismönster Imorgon", - "state": { - "valley": "Dal", - "peak": "Topp", - "double_valley": "Dubbeldal", - "double_peak": "Dubbeltopp", - "flat": "Flat", - "rising": "Stigande", - "falling": "Fallande", - "mixed": "Blandad" - } - }, - "chart_data_export": { - "name": "Diagramdataexport", - "state": { - "pending": "Väntande", - "ready": "Redo", - "error": "Fel" - } - }, - "chart_metadata": { - "name": "Diagrammetadata", - "state": { - "pending": "Väntande", - "ready": "Redo", - "error": "Fel" - } - } - }, - "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" - }, - "has_ventilation_system": { - "name": "Har ventilationssystem" - }, - "realtime_consumption_enabled": { - "name": "Realtidsförbrukning aktiverad" - } - }, - "number": { - "best_price_flex_override": { - "name": "Bästa pris: Flexibilitet" - }, - "best_price_min_distance_override": { - "name": "Bästa pris: Minimiavstånd" - }, - "best_price_min_period_length_override": { - "name": "Bästa pris: Minsta periodlängd" - }, - "best_price_min_periods_override": { - "name": "Bästa pris: Minsta antal perioder" - }, - "best_price_relaxation_attempts_override": { - "name": "Bästa pris: Lättnadsförsök" - }, - "best_price_gap_count_override": { - "name": "Bästa pris: Glaptolerans" - }, - "peak_price_flex_override": { - "name": "Topppris: Flexibilitet" - }, - "peak_price_min_distance_override": { - "name": "Topppris: Minimiavstånd" - }, - "peak_price_min_period_length_override": { - "name": "Topppris: Minsta periodlängd" - }, - "peak_price_min_periods_override": { - "name": "Topppris: Minsta antal perioder" - }, - "peak_price_relaxation_attempts_override": { - "name": "Topppris: Lättnadsförsök" - }, - "peak_price_gap_count_override": { - "name": "Topppris: Glaptolerans" - } - }, - "switch": { - "best_price_enable_relaxation_override": { - "name": "Bästa pris: Uppnå minimiantal" - }, - "peak_price_enable_relaxation_override": { - "name": "Topppris: Uppnå minimiantal" - } + }, + "next_interval_price_level": { + "name": "Nästa prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" } - }, - "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 genom Tibber-integrationskonfigurationen." - }, - "homes_removed": { - "title": "Tibber-hem borttagna", - "description": "Vi upptäckte att {count} hem har tagits bort från ditt Tibber-konto: {homes}. Granska din Tibber-integrationskonfiguration." - }, - "tomorrow_data_missing": { - "title": "Morgondagens prisdata saknas för {home_name}", - "description": "Morgondagens elprisdata är fortfarande otillgänglig efter {warning_hour}:00. Detta är ovanligt, eftersom Tibber vanligtvis publicerar morgondagens priser på eftermiddagen (runt 13:00-14:00 CET).\n\nMöjliga orsaker:\n- Tibber har ännu inte publicerat morgondagens priser\n- Tillfälliga API-problem\n- Din elleverantör har inte skickat priser till Tibber\n\nDetta problem löser sig automatiskt när morgondagens data blir tillgänglig. Om detta kvarstår efter 20:00, kontrollera Tibber-appen eller kontakta Tibber support." - }, - "rate_limit_exceeded": { - "title": "API-hastighetsgräns överskriden för {home_name}", - "description": "Tibber API har hastighetsbegränsat denna integration efter {error_count} konsekutiva fel. Detta betyder att förfrågningar görs för ofta.\n\nIntegrationen kommer automatiskt att försöka igen med ökande fördröjningar. Detta problem löser sig när hastighetsgränsen löper ut.\n\nOm detta kvarstår i flera timmar, överväg:\n- Kontrollera om flera Home Assistant-instanser använder samma API-token\n- Verifiera att inga andra applikationer använder din Tibber API-token kraftigt\n- Minska uppdateringsfrekvensen om du har anpassat den" - }, - "home_not_found": { - "title": "Hem {home_name} hittades inte i Tibber-konto", - "description": "Hemmet som konfigurerats i denna integration (post-ID: {entry_id}) är inte längre tillgängligt i ditt Tibber-konto. Detta händer vanligtvis när:\n- Hemmet togs bort från ditt Tibber-konto\n- Hemmet flyttades till ett annat Tibber-konto\n- Åtkomst till detta hem återkallades\n\nTa bort denna integrationspost och lägg till den igen om hemmet fortfarande ska övervakas. För att ta bort denna post, gå till Inställningar → Enheter & Tjänster → Tibber-priser och radera {home_name}-konfigurationen." - }, - "entity_migration": { - "title": "Tibber Prices: Åtgärd krävs efter uppdatering ({home_name})", - "description": "Denna uppdatering innehåller ändringar som tillämpades automatiskt.\n\n**Omdöpta entiteter ({count})**\n\nFöljande entity-nycklar döptes om automatiskt. Dina befintliga entity-ID:n och automatiseringar förblir intakta:\n\n{entity_list}\n\n**Ändrade varaktighetssensorvärden**\n\nAlla varaktighetssensorer (återstående tid, startar om, periodvaraktighet, trendändrings-nedräkning) rapporterar nu sitt tillståndsvärde i **minuter** istället för timmar. Visningsenheten i dashboards förblir timmar som standard.\n\nOm du har automatiseringar med numeriska jämförelser på dessa sensorer, uppdatera dina tröskelvärden:\n- Gammalt: `state < 0.25` (15 minuter som timmar)\n- Nytt: `state < 15` (15 minuter)\n\nStäng detta meddelande efter att du har granskat dina automatiseringar." + }, + "previous_interval_price_level": { + "name": "Föregående prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" } - }, - "exceptions": { - "no_entries_found": { - "message": "Inga Tibber Prices integrationsposter hittades. Konfigurera integrationen först." - }, - "multiple_entries_no_entry_id": { - "message": "Flera Tibber Prices poster hittades. Ange 'entry_id' för att välja vilken post som ska användas." - }, - "invalid_entry_id": { - "message": "Ogiltig eller otillgänglig konfigurationspost. Kontrollera post-ID:t och se till att integrationen är laddad." - }, - "missing_home_id": { - "message": "Hem-ID hittades inte i konfigurationsposten. Konfigurera om integrationen." - }, - "user_data_not_available": { - "message": "Användardata är inte tillgänglig ännu. Vänta tills den första datauppdateringen är klar." - }, - "timezone_not_found": { - "message": "Kunde inte fastställa hemmets tidszon. Kontrollera hemkonfigurationen i ditt Tibber-konto." - }, - "end_before_start": { - "message": "Sluttid måste vara efter starttid." - }, - "price_fetch_failed": { - "message": "Kunde inte hämta prisdata från Tibber API. Försök igen senare." - }, - "invalid_search_scope": { - "message": "Ogiltigt sökområde. Giltiga värden är: today, tomorrow, remaining_today, next_24h, next_48h." - }, - "scope_conflicts_with_range": { - "message": "search_scope kan inte kombineras med explicita områdesparametrar: {params}. Använd antingen search_scope ELLER explicita start-/slutparametrar." - }, - "day_offset_requires_time": { - "message": "{offset_param} kräver att {time_param} är satt. Dagsförskjutning ändrar bara datumet för en explicit tidsparameter." - }, - "min_level_exceeds_max": { - "message": "min_price_level '{min_level}' är högre än max_price_level '{max_level}'. Miniminivån måste vara lika med eller lägre än maximinivån." - }, - "power_profile_length_mismatch": { - "message": "power_profile har {profile_length} poster men varaktigheten kräver {interval_count} intervaller ({duration_minutes} minuter). power_profile måste ha exakt en post per 15-minutersintervall." - }, - "level_and_rating_filter_conflict": { - "message": "level_filter och rating_level_filter kan inte användas tillsammans. Använd bara en filtertyp per begäran." - }, - "insert_nulls_requires_filter": { - "message": "insert_nulls-läge '{mode}' kräver ett level_filter eller rating_level_filter för att definiera segment. Utan filter, använd insert_nulls: none." - }, - "connect_segments_requires_segments_mode": { - "message": "connect_segments kräver att insert_nulls är satt till 'segments'. Ställ in insert_nulls: segments för att använda segmentanslutning." - }, - "array_fields_requires_array_format": { - "message": "array_fields kan bara användas med output_format: array_of_arrays. Ändra utdataformatet eller ta bort array_fields." - }, - "invalid_array_fields": { - "message": "Ogiltig array_fields-mall. Använd fältnamn inom klammerparenteser, t.ex. '{start_time}, {price_per_kwh}, {level}'." + }, + "current_hour_price_level": { + "name": "Aktuell timprisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" } - }, - "services": { - "get_price": { - "name": "Hämta prisdata", - "description": "Hämta prisdata för ett specifikt tidsintervall med automatisk routing. Utvecklings- och testservice för price_info_for_range API-funktionen. Använder automatiskt PRICE_INFO, PRICE_INFO_RANGE eller båda baserat på tidsintervallets gränser.", - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "start_time": { - "name": "Starttid", - "description": "Start för tidsintervallet (inklusivt, tidszonmedveten)." - }, - "end_time": { - "name": "Sluttid", - "description": "Slut för tidsintervallet (exklusivt, tidszonmedveten)." - } - } - }, - "get_apexcharts_yaml": { - "name": "Hämta ApexCharts Card YAML", - "description": "⚠️ VIKTIGT: Denna service genererar en GRUNDLÄGGANDE EXEMPELKONFIGURATION för ApexCharts Card som en startpunkt. Det är INTE en komplett lösning för alla ApexCharts-funktioner. Denna integration är primärt en DATALEVERANTÖR. Den genererade YAML:en demonstrerar hur man använder `get_chartdata`-servicen för att hämta prisdata. På grund av den segmenterade naturen hos vår data (olika tidsperioder per serie) och användningen av Home Assistants service-API istället för entitetsattribut är många avancerade ApexCharts-funktioner (som in_header, vissa transformationer) inte kompatibla eller kräver manuell anpassning. Du är välkommen att anpassa den genererade YAML:en för dina specifika behov, men förstå att omfattande ApexCharts-konfigurationsstöd ligger utanför denna integrations omfång. Community-bidrag med förbättrade konfigurationer uppskattas alltid - om du hittar en bättre konfiguration som fungerar, dela den så att alla kan dra nytta av den! För direkt dataåtkomst för att bygga dina egna diagram, använd `get_chartdata`-servicen istället.", - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "day": { - "name": "Dag", - "description": "Vilken dag som ska visualiseras (standard: Glidande fönster). Fasta dagalternativ (Igår/Idag/Imorgon) visar 24h-spann utan ytterligare beroenden. Dynamiska alternativ kräver config-template-card: Glidande fönster visar ett fast 48h-fönster som automatiskt skiftar mellan igår+idag och idag+imorgon baserat på datatillgänglighet. Glidande fönster (Auto-Zoom) beter sig likadant men zoomar dessutom automatiskt in (2h tillbakablick + återstående tid till midnatt, graph_span minskar var 15:e minut)." - }, - "level_type": { - "name": "Nivåtyp", - "description": "Välj vilken prisnivåklassificering som ska visualiseras: 'rating_level' (låg/normal/hög baserat på dina konfigurerade tröskelvärden) eller 'level' (Tibber API-nivåer: mycket billigt/billigt/normalt/dyrt/mycket dyrt)." - }, - "highlight_best_price": { - "name": "Markera bästa prisperioder", - "description": "Lägg till ett halvtransparent grönt överlag för att markera de bästa prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera de optimala tiderna för energiförbrukning." - }, - "highlight_peak_price": { - "name": "Markera högsta prisperioder", - "description": "Lägg till ett halvtransparent rött överlag för att markera de högsta prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera tiderna när energi är som dyrast." - }, - "resolution": { - "name": "Upplösning", - "description": "Tidsupplösning för diagramdata. 'interval' (standard): Ursprungliga 15-minutersintervall (96 punkter per dag). 'hourly': Aggregerade timvärden med ett rullande 60-minutersfönster (24 punkter per dag) för ett renare och mindre rörigt diagram." - } - } - }, - "get_chartdata": { - "name": "Hämta diagramdata", - "description": "Returnerar prisdata i ett enkelt diagramvänligt format som är kompatibelt med Tibber Core-integrationens utdatastruktur. Perfekt för användning med populära diagramkort som ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card eller det inbyggda History Graph Card. Fältnamn och datastruktur kan anpassas för att matcha dina specifika diagramkrav.", - "sections": { - "general": { - "name": "Allmänt", - "description": "Allmänna inställningar för att hämta diagramdata." - }, - "selection": { - "name": "Urval", - "description": "Välj vilken data som ska inkluderas i utdatan." - }, - "filters": { - "name": "Filter", - "description": "Filtrera data baserat på prisnivåer, betygsnivåer eller specialperioder." - }, - "transformation": { - "name": "Transformera data", - "description": "Transformera datautdatan för bättre diagramkompatibilitet." - }, - "format": { - "name": "Format", - "description": "Anpassa utdataformatet." - }, - "arrays_of_arrays": { - "name": "Avancerade utdatainställningar: Array av arrays", - "description": "Inställningar för utdataformat när en array av arrays används." - }, - "arrays_of_objects": { - "name": "Avancerade utdatainställningar: Array av objekt", - "description": "Inställningar för utdataformat när en array av objekt används." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "day": { - "name": "Dag", - "description": "Vilken/vilka dag(ar) att hämta priser för. Du kan välja flera dagar. Om inget anges returneras ett glidande 2-dagarsfönster: idag+imorgon (när morgondagens data finns tillgänglig) eller igår+idag (när morgondagens data ännu inte är tillgänglig). Detta ger kontinuerlig diagramvisning utan luckor." - }, - "resolution": { - "name": "Upplösning", - "description": "Tidsupplösning för returnerad data. Alternativ: 'interval' (standard, 15-minutersintervall, 96 punkter per dag), 'hourly' (timmedelvärden, 24 punkter per dag)." - }, - "output_format": { - "name": "Utdataformat", - "description": "Utdataformat för returnerad data. Alternativ: 'array_of_objects' (standard, array av objekt med anpassningsbara fältnamn), 'array_of_arrays' (array av [tidstämpel, pris]-arrays med avslutande null-punkt för stegdiagram)." - }, - "array_fields": { - "name": "Array-fält", - "description": "Definiera vilka fält som ska inkluderas. Använd fältnamn inom klammerparenteser, separerade med kommatecken. Tillgängliga fält: start_time, price_per_kwh, level, rating_level, average. Fält kommer automatiskt att aktiveras även om include_*-alternativ inte är inställda. Lämna tomt för standard (endast tidstämpel och pris)." - }, - "subunit_currency": { - "name": "Underenhetsvaluta", - "description": "Returnera priser i underenhetsvaluta (cent för EUR, øre för NOK/SEK) istället för basvalutaenheter. Inaktiverad som standard." - }, - "round_decimals": { - "name": "Avrunda decimaler", - "description": "Antal decimaler att avrunda priser till (0-10). Om inget anges används standardprecision (4 decimaler för basvaluta, 2 för underenhetsvaluta)." - }, - "data_key": { - "name": "Datanyckel", - "description": "Anpassat namn för datanyckeln på toppnivå i svaret. Standard är 'data' om inget anges." - }, - "include_level": { - "name": "Inkludera nivå", - "description": "Inkludera Tibbers prisnivåfält (mycket billigt/billigt/normalt/dyrt/mycket dyrt) i varje datapunkt." - }, - "include_rating_level": { - "name": "Inkludera betygsnivå", - "description": "Inkludera det beräknade betygsnivåfältet (låg/normal/hög) baserat på dina konfigurerade tröskelvärden i varje datapunkt." - }, - "include_average": { - "name": "Inkludera medelvärde", - "description": "Inkludera dagligt medelpris i varje datapunkt för jämförelse." - }, - "include_energy": { - "name": "Inkludera energipris", - "description": "Inkludera rått energi-/spotpris (exklusive skatter och avgifter) i varje datapunkt. Detta är 'energy'-fältet från Tibber-API:et, användbart för inmatnings-/nettomätningsberäkningar." - }, - "include_tax": { - "name": "Inkludera skatt", - "description": "Inkludera skattedelen av priset i varje datapunkt. Detta är 'tax'-fältet från Tibber-API:et, som representerar avgifter, skatter och nätavgifter." - }, - "level_filter": { - "name": "Nivåfilter", - "description": "Filtrera intervaller för att endast inkludera specifika Tibber-prisnivåer (mycket billigt/billigt/normalt/dyrt/mycket dyrt). Om inget anges inkluderas alla nivåer." - }, - "rating_level_filter": { - "name": "Betygsnivåfilter", - "description": "Filtrera intervaller för att endast inkludera specifika betygsnivåer (låg/normal/hög). Om inget anges inkluderas alla betygsnivåer." - }, - "period_filter": { - "name": "Periodfilter", - "description": "Filtrera intervaller för att endast inkludera de inom Bästa pris- eller Topppris-perioder. Alternativ: 'best_price' (endast intervaller i Bästa pris-perioder), 'peak_price' (endast intervaller i Topppris-perioder). Om inget anges inkluderas alla intervaller. Detta använder förberäknad perioddata från binära sensorer." - }, - "insert_nulls": { - "name": "Infoga NULL-värden", - "description": "Kontrollera infogning av NULL-värden för filtrerad data. 'none' (standard): Inga NULL-värden, endast matchande intervaller. 'segments': Lägg till NULL-punkter vid segmentgränser för rena luckor i diagram (rekommenderas för stegdiagram). 'all': Infoga NULL för alla tidstämplar där filtret inte matchar (användbart för kontinuerlig tidsserievisualisering)." - }, - "connect_segments": { - "name": "Anslut segment", - "description": "[ENDAST MED 'Infoga NULL-värden'] När aktiverad läggs anslutande punkter till vid segmentgränser för att visuellt ansluta olika prisnivåsegment i stegdiagram. När priset går NER vid en gräns läggs en punkt med det lägre priset till i slutet av det aktuella segmentet. När priset går UPP läggs en hållpunkt till innan luckan. Detta skapar smärre visuella övergångar mellan segment istället för abrupta luckor." - }, - "add_trailing_null": { - "name": "Lägg till avslutande null-punkt", - "description": "Lägg till en sista datapunkt med null-värden (förutom tidstämpel) i slutet. Vissa diagrambibliotek behöver detta för att förhindra extrapolering/interpolering till vyportens kant när steglinje-rendering används. Lämna inaktiverad om inte ditt diagram kräver det." - }, - "start_time_field": { - "name": "Starttidsfältnamn", - "description": "Anpassat namn för starttidsfältet i utdatan. Standard är 'start_time' om inget anges." - }, - "end_time_field": { - "name": "Sluttidsfältnamn", - "description": "Anpassat namn för sluttidsfältet i utdatan. Standard är 'end_time' om inget anges. Används endast med period_filter." - }, - "price_field": { - "name": "Prisfältnamn", - "description": "Anpassat namn för prisfältet i utdatan. Standard är 'price_per_kwh' om inget anges." - }, - "level_field": { - "name": "Nivåfältnamn", - "description": "Anpassat namn för nivåfältet i utdatan. Standard är 'level' om inget anges. Används endast när include_level är aktiverad." - }, - "rating_level_field": { - "name": "Betygsnivåfältnamn", - "description": "Anpassat namn för betygsnivåfältet i utdatan. Standard är 'rating_level' om inget anges. Används endast när include_rating_level är aktiverad." - }, - "average_field": { - "name": "Medelvärdesfältnamn", - "description": "Anpassat namn för medelvärdesfältet i utdatan. Standard är 'average' om inget anges. Används endast när include_average är aktiverad." - }, - "energy_field": { - "name": "Energiprisfältnamn", - "description": "Anpassat namn för energiprisfältet i utdatan. Standard är 'energy_price' om inget anges. Används endast när include_energy är aktiverad." - }, - "tax_field": { - "name": "Skattefältnamn", - "description": "Anpassat namn för skattefältet i utdatan. Standard är 'tax' om inget anges. Används endast när include_tax är aktiverad." - }, - "metadata": { - "name": "Metadata", - "description": "Kontrollera inkludering av metadata i svaret. 'include' (standard): Returnerar både diagramdata och metadata med prisstatistik, valutainfo, Y-axelförslag och tidsintervall. 'only': Returnerar endast metadata utan att bearbeta diagramdata (snabbt, användbart för dynamisk Y-axelkonfiguration). 'none': Returnerar endast diagramdata utan metadata." - } - } - }, - "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": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - } - } - }, - "find_cheapest_block": { - "name": "Hitta billigaste blocket", - "description": "Hittar det billigaste sammanhängande tidsfönstret med en given varaktighet. Designat för apparatschemaläggning: diskmaskin, tvättmaskin, torktumlare osv. Returnerar det billigaste fönstret med start-/sluttider och prisstatistik.", - "sections": { - "search_range": { - "name": "Soekomraade", - "description": "Definiera tidsfoenstret att soeka inom." - }, - "time_alternatives": { - "name": "Alternativa tidsinstaellningar", - "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." - }, - "price_filter": { - "name": "Prisnivaaefilter", - "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." - }, - "output": { - "name": "Utdataalternativ", - "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "duration": { - "name": "Varaktighet", - "description": "Längd på det önskade sammanhängande fönstret. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 12 timmar." - }, - "search_start": { - "name": "Sökstart", - "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." - }, - "search_end": { - "name": "Sökslut", - "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." - }, - "search_start_time": { - "name": "Sökstart-klockslag", - "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." - }, - "search_start_day_offset": { - "name": "Sökstart dagförskjutning", - "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." - }, - "search_end_time": { - "name": "Sökslut-klockslag", - "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." - }, - "search_end_day_offset": { - "name": "Sökslut dagförskjutning", - "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." - }, - "search_start_offset_minutes": { - "name": "Sökstart-förskjutning (minuter)", - "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." - }, - "search_end_offset_minutes": { - "name": "Sökslut-förskjutning (minuter)", - "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." - }, - "include_current_interval": { - "name": "Inkludera aktuellt intervall", - "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." - }, - "use_base_unit": { - "name": "Använd basvaluta", - "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." - }, - "search_scope": { - "name": "Soekumfaang (genvaeg)", - "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." - }, - "max_price_level": { - "name": "Maximal prisnivaae", - "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." - }, - "min_price_level": { - "name": "Minimal prisnivaae", - "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." - }, - "include_comparison_details": { - "name": "Inkludera jaemfoerelsdetaljer", - "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." - } - } - }, - "find_most_expensive_block": { - "name": "Hitta dyraste blocket", - "description": "Hittar det dyraste sammanhängande tidsfönstret med en given varaktighet. Användbart för att identifiera topprisperioder som bör undvikas. Returnerar det dyraste fönstret med start-/sluttider och prisstatistik.", - "sections": { - "search_range": { - "name": "Soekomraade", - "description": "Definiera tidsfoenstret att soeka inom." - }, - "time_alternatives": { - "name": "Alternativa tidsinstaellningar", - "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." - }, - "price_filter": { - "name": "Prisnivaaefilter", - "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." - }, - "output": { - "name": "Utdataalternativ", - "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "duration": { - "name": "Varaktighet", - "description": "Längd på det önskade sammanhängande fönstret. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 12 timmar." - }, - "search_start": { - "name": "Sökstart", - "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." - }, - "search_end": { - "name": "Sökslut", - "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." - }, - "search_start_time": { - "name": "Sökstart-klockslag", - "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." - }, - "search_start_day_offset": { - "name": "Sökstart dagförskjutning", - "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." - }, - "search_end_time": { - "name": "Sökslut-klockslag", - "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." - }, - "search_end_day_offset": { - "name": "Sökslut dagförskjutning", - "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." - }, - "search_start_offset_minutes": { - "name": "Sökstart-förskjutning (minuter)", - "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." - }, - "search_end_offset_minutes": { - "name": "Sökslut-förskjutning (minuter)", - "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." - }, - "include_current_interval": { - "name": "Inkludera aktuellt intervall", - "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." - }, - "use_base_unit": { - "name": "Använd basvaluta", - "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." - }, - "search_scope": { - "name": "Soekumfaang (genvaeg)", - "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." - }, - "max_price_level": { - "name": "Maximal prisnivaae", - "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." - }, - "min_price_level": { - "name": "Minimal prisnivaae", - "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." - }, - "include_comparison_details": { - "name": "Inkludera jaemfoerelsdetaljer", - "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." - } - } - }, - "find_cheapest_hours": { - "name": "Hitta billigaste timmarna", - "description": "Hittar de billigaste intervallen för en given total varaktighet, inte nödvändigtvis sammanhängande. Designat för flexibla laster: batteriladdning, elbil, varmvattenberedare. Returnerar ett schema av intervaller grupperade i sammanhängande segment.", - "sections": { - "search_range": { - "name": "Soekomraade", - "description": "Definiera tidsfoenstret att soeka inom." - }, - "time_alternatives": { - "name": "Alternativa tidsinstaellningar", - "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." - }, - "price_filter": { - "name": "Prisnivaaefilter", - "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." - }, - "output": { - "name": "Utdataalternativ", - "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "duration": { - "name": "Varaktighet", - "description": "Behövd billig total tid. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 24 timmar." - }, - "search_start": { - "name": "Sökstart", - "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." - }, - "search_end": { - "name": "Sökslut", - "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." - }, - "search_start_time": { - "name": "Sökstart-klockslag", - "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." - }, - "search_start_day_offset": { - "name": "Sökstart dagförskjutning", - "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." - }, - "search_end_time": { - "name": "Sökslut-klockslag", - "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." - }, - "search_end_day_offset": { - "name": "Sökslut dagförskjutning", - "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." - }, - "search_start_offset_minutes": { - "name": "Sökstart-förskjutning (minuter)", - "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." - }, - "search_end_offset_minutes": { - "name": "Sökslut-förskjutning (minuter)", - "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." - }, - "include_current_interval": { - "name": "Inkludera aktuellt intervall", - "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." - }, - "min_segment_duration": { - "name": "Minsta segmentvaraktighet", - "description": "Minsta sammanhängande körtid. Förhindrar snabb av/på-cykling för enheter med minsta körtider. Avrundas automatiskt uppåt till närmaste kvart. Standard: 15 minuter. Maximum: 4 timmar." - }, - "use_base_unit": { - "name": "Använd basvaluta", - "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." - }, - "search_scope": { - "name": "Soekumfaang (genvaeg)", - "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." - }, - "max_price_level": { - "name": "Maximal prisnivaae", - "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." - }, - "min_price_level": { - "name": "Minimal prisnivaae", - "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." - }, - "include_comparison_details": { - "name": "Inkludera jaemfoerelsdetaljer", - "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." - } - } - }, - "find_most_expensive_hours": { - "name": "Hitta dyraste timmarna", - "description": "Hittar de dyraste intervallen för en given total varaktighet, inte nödvändigtvis sammanhängande. Användbart för att identifiera topprisperioder som bör undvikas. Returnerar ett schema av intervaller grupperade i sammanhängande segment.", - "sections": { - "search_range": { - "name": "Soekomraade", - "description": "Definiera tidsfoenstret att soeka inom." - }, - "time_alternatives": { - "name": "Alternativa tidsinstaellningar", - "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." - }, - "price_filter": { - "name": "Prisnivaaefilter", - "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." - }, - "output": { - "name": "Utdataalternativ", - "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "duration": { - "name": "Varaktighet", - "description": "Dyr total tid att hitta. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 24 timmar." - }, - "search_start": { - "name": "Sökstart", - "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." - }, - "search_end": { - "name": "Sökslut", - "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." - }, - "search_start_time": { - "name": "Sökstart-klockslag", - "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." - }, - "search_start_day_offset": { - "name": "Sökstart dagförskjutning", - "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." - }, - "search_end_time": { - "name": "Sökslut-klockslag", - "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." - }, - "search_end_day_offset": { - "name": "Sökslut dagförskjutning", - "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." - }, - "search_start_offset_minutes": { - "name": "Sökstart-förskjutning (minuter)", - "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." - }, - "search_end_offset_minutes": { - "name": "Sökslut-förskjutning (minuter)", - "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." - }, - "include_current_interval": { - "name": "Inkludera aktuellt intervall", - "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." - }, - "min_segment_duration": { - "name": "Minsta segmentvaraktighet", - "description": "Minsta sammanhängande körtid. Förhindrar snabb av/på-cykling för enheter med minsta körtider. Avrundas automatiskt uppåt till närmaste kvart. Standard: 15 minuter. Maximum: 4 timmar." - }, - "use_base_unit": { - "name": "Använd basvaluta", - "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." - }, - "search_scope": { - "name": "Soekumfaang (genvaeg)", - "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." - }, - "max_price_level": { - "name": "Maximal prisnivaae", - "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." - }, - "min_price_level": { - "name": "Minimal prisnivaae", - "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." - }, - "include_comparison_details": { - "name": "Inkludera jaemfoerelsdetaljer", - "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." - }, - "power_profile": { - "name": "Effektprofil", - "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." - } - } - }, - "find_cheapest_schedule": { - "name": "Hitta billigaste schema", - "description": "Schemalaggar flera apparater optimalt utan tidsoeverlapp. Varje uppgift tilldelas det billigaste tillgaengliga sammanhangande tidsfoenster.", - "sections": { - "scheduling_options": { - "name": "Schemalagningsalternativ", - "description": "Konfigurera uppgifter och pauser mellan dem." - }, - "search_range": { - "name": "Soekomraade", - "description": "Definiera tidsfoenstret att soeka inom." - }, - "time_alternatives": { - "name": "Alternativa tidsinstaellningar", - "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." - }, - "price_filter": { - "name": "Prisnivaaefilter", - "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." - }, - "output": { - "name": "Utdataalternativ", - "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." - } - }, - "fields": { - "entry_id": { - "name": "Entry-ID", - "description": "Config entry-ID för Tibber-integrationen." - }, - "tasks": { - "name": "Uppgifter", - "description": "Lista med uppgifter att schemalagga. Varje uppgift kraever name (text) och duration (hh:mm:ss). Valfritt power_profile (watt per 15-min-intervall). Maximalt 4 uppgifter." - }, - "gap_minutes": { - "name": "Paus mellan uppgifter (minuter)", - "description": "Minsta paus i minuter mellan paa varandra foeoljande schemalagda uppgifter. Avrundas uppaat till 15 minuter. Standard: 0 (ingen paus)." - }, - "search_scope": { - "name": "Soekumfaang (genvaeg)", - "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." - }, - "search_start": { - "name": "Sökstart", - "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." - }, - "search_end": { - "name": "Sökslut", - "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." - }, - "search_start_time": { - "name": "Sökstart-klockslag", - "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." - }, - "search_start_day_offset": { - "name": "Sökstart dagförskjutning", - "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." - }, - "search_end_time": { - "name": "Sökslut-klockslag", - "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." - }, - "search_end_day_offset": { - "name": "Sökslut dagförskjutning", - "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." - }, - "search_start_offset_minutes": { - "name": "Sökstart-förskjutning (minuter)", - "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." - }, - "search_end_offset_minutes": { - "name": "Sökslut-förskjutning (minuter)", - "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." - }, - "include_current_interval": { - "name": "Inkludera aktuellt intervall", - "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." - }, - "max_price_level": { - "name": "Maximal prisnivaae", - "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." - }, - "min_price_level": { - "name": "Minimal prisnivaae", - "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." - }, - "use_base_unit": { - "name": "Använd basvaluta", - "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." - } - } + }, + "next_hour_price_level": { + "name": "Nästa timprisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "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": "⌀ Pris idag" + }, + "lowest_price_tomorrow": { + "name": "Morgondagens lägsta pris" + }, + "highest_price_tomorrow": { + "name": "Morgondagens högsta pris" + }, + "average_price_tomorrow": { + "name": "⌀ Pris imorgon" + }, + "yesterday_price_level": { + "name": "Gårdagens prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" + } + }, + "today_price_level": { + "name": "Dagens prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" + } + }, + "tomorrow_price_level": { + "name": "Morgondagens prisnivå", + "state": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" + } + }, + "yesterday_price_rating": { + "name": "Gårdagens prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "today_price_rating": { + "name": "Dagens prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "tomorrow_price_rating": { + "name": "Morgondagens prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "trailing_price_average": { + "name": "⌀ Pris glidande 24h" + }, + "leading_price_average": { + "name": "⌀ Pris framåt 24h" + }, + "trailing_price_min": { + "name": "Glidande 24h minimipris" + }, + "trailing_price_max": { + "name": "Glidande 24h maximipris" + }, + "leading_price_min": { + "name": "Framåt 24h minimipris" + }, + "leading_price_max": { + "name": "Framåt 24h maximipris" + }, + "current_interval_price_rating": { + "name": "Aktuellt prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "next_interval_price_rating": { + "name": "Nästa prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "previous_interval_price_rating": { + "name": "Föregående prisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "current_hour_price_rating": { + "name": "Aktuellt timprisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "next_hour_price_rating": { + "name": "Nästa timprisbetyg", + "state": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "next_avg_1h": { + "name": "⌀ Pris nästa 1h" + }, + "next_avg_2h": { + "name": "⌀ Pris nästa 2h" + }, + "next_avg_3h": { + "name": "⌀ Pris nästa 3h" + }, + "next_avg_4h": { + "name": "⌀ Pris nästa 4h" + }, + "next_avg_5h": { + "name": "⌀ Pris nästa 5h" + }, + "next_avg_6h": { + "name": "⌀ Pris nästa 6h" + }, + "next_avg_8h": { + "name": "⌀ Pris nästa 8h" + }, + "next_avg_12h": { + "name": "⌀ Pris nästa 12h" + }, + "price_outlook_1h": { + "name": "Prisöversikt (1h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_2h": { + "name": "Prisöversikt (2h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_3h": { + "name": "Prisöversikt (3h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_4h": { + "name": "Prisöversikt (4h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_5h": { + "name": "Prisöversikt (5h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_6h": { + "name": "Prisöversikt (6h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_8h": { + "name": "Prisöversikt (8h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_outlook_12h": { + "name": "Prisöversikt (12h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_2h": { + "name": "Prisutveckling (2h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_3h": { + "name": "Prisutveckling (3h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_4h": { + "name": "Prisutveckling (4h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_5h": { + "name": "Prisutveckling (5h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_6h": { + "name": "Prisutveckling (6h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_8h": { + "name": "Prisutveckling (8h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "price_trajectory_12h": { + "name": "Prisutveckling (12h)", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "current_price_trend": { + "name": "Aktuell pristrend", + "state": { + "strongly_rising": "Kraftigt stigande", + "rising": "Stigande", + "stable": "Stabil", + "falling": "Fallande", + "strongly_falling": "Kraftigt fallande" + } + }, + "next_price_trend_change": { + "name": "Nästa pristrendändring" + }, + "next_price_trend_change_in": { + "name": "Nästa pristrendändring om" + }, + "daily_rating": { + "name": "Dagligt prisbetyg" + }, + "monthly_rating": { + "name": "Månatligt prisbetyg" + }, + "data_lifecycle_status": { + "name": "Datalivscykelstatus", + "state": { + "cached": "Cachad", + "fresh": "Färsk", + "refreshing": "Uppdaterar", + "searching_tomorrow": "Söker morgondag", + "turnover_pending": "Väntar på övergång", + "error": "Fel" + } + }, + "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 24h 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" + } + }, + "best_price_end_time": { + "name": "Bästa pris slutar" + }, + "best_price_period_duration": { + "name": "Bästa pris varaktighet" + }, + "best_price_remaining_minutes": { + "name": "Bästa pris återstående tid" + }, + "best_price_progress": { + "name": "Bästa pris framsteg" + }, + "best_price_next_start_time": { + "name": "Bästa pris startar" + }, + "best_price_next_in_minutes": { + "name": "Bästa pris startar om" + }, + "peak_price_end_time": { + "name": "Topppris slutar" + }, + "peak_price_period_duration": { + "name": "Topppris varaktighet" + }, + "peak_price_remaining_minutes": { + "name": "Topppris återstående tid" + }, + "peak_price_progress": { + "name": "Topppris framsteg" + }, + "peak_price_next_start_time": { + "name": "Topppris startar" + }, + "peak_price_next_in_minutes": { + "name": "Topppris startar om" + }, + "home_type": { + "name": "Hemtyp", + "state": { + "apartment": "Lägenhet", + "rowhouse": "Radhus", + "house": "Hus", + "cottage": "Stuga" + } + }, + "home_size": { + "name": "Hemstorlek" + }, + "main_fuse_size": { + "name": "Huvudsäkringsstorlek" + }, + "number_of_residents": { + "name": "Antal boende" + }, + "primary_heating_source": { + "name": "Primär värmekälla", + "state": { + "air2air_heatpump": "Luft-till-luft värmepump", + "air2water_heatpump": "Luft-till-vatten värmepump", + "boiler": "Panna", + "central_heating": "Centralvärme", + "district_heating": "Fjärrvärme", + "district": "Fjärrvärme", + "electric_boiler": "Elpanna", + "electricity": "El", + "floor": "Golvvärme", + "gas": "Gas", + "ground_heatpump": "Bergvärmepump", + "ground": "Bergvärmepump", + "oil": "Olja", + "other": "Annat", + "waste": "Spillvärme" + } + }, + "grid_company": { + "name": "Nätbolag" + }, + "grid_area_code": { + "name": "Nätområdeskod" + }, + "price_area_code": { + "name": "Prisområdeskod" + }, + "consumption_ean": { + "name": "Förbruknings-EAN" + }, + "production_ean": { + "name": "Produktions-EAN" + }, + "energy_tax_type": { + "name": "Energiskattetyp" + }, + "vat_type": { + "name": "Momstyp" + }, + "estimated_annual_consumption": { + "name": "Beräknad årlig förbrukning" + }, + "subscription_status": { + "name": "Abonnemangsstatus", + "state": { + "running": "Aktiv", + "ended": "Avslutad", + "pending": "Väntande", + "unknown": "Okänd" + } + }, + "day_pattern_yesterday": { + "name": "Prismönster Igår", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dubbeldal", + "double_peak": "Dubbeltopp", + "flat": "Flat", + "rising": "Stigande", + "falling": "Fallande", + "mixed": "Blandad" + } + }, + "day_pattern_today": { + "name": "Prismönster Idag", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dubbeldal", + "double_peak": "Dubbeltopp", + "flat": "Flat", + "rising": "Stigande", + "falling": "Fallande", + "mixed": "Blandad" + } + }, + "day_pattern_tomorrow": { + "name": "Prismönster Imorgon", + "state": { + "valley": "Dal", + "peak": "Topp", + "double_valley": "Dubbeldal", + "double_peak": "Dubbeltopp", + "flat": "Flat", + "rising": "Stigande", + "falling": "Fallande", + "mixed": "Blandad" + } + }, + "chart_data_export": { + "name": "Diagramdataexport", + "state": { + "pending": "Väntande", + "ready": "Redo", + "error": "Fel" + } + }, + "chart_metadata": { + "name": "Diagrammetadata", + "state": { + "pending": "Väntande", + "ready": "Redo", + "error": "Fel" + } + } }, - "selector": { - "account_choice": { - "options": { - "new_token": "Lägg till ny Tibber-konto API-token" - } + "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" + }, + "has_ventilation_system": { + "name": "Har ventilationssystem" + }, + "realtime_consumption_enabled": { + "name": "Realtidsförbrukning aktiverad" + } + }, + "number": { + "best_price_flex_override": { + "name": "Bästa pris: Flexibilitet" + }, + "best_price_min_distance_override": { + "name": "Bästa pris: Minimiavstånd" + }, + "best_price_min_period_length_override": { + "name": "Bästa pris: Minsta periodlängd" + }, + "best_price_min_periods_override": { + "name": "Bästa pris: Minsta antal perioder" + }, + "best_price_relaxation_attempts_override": { + "name": "Bästa pris: Lättnadsförsök" + }, + "best_price_gap_count_override": { + "name": "Bästa pris: Glaptolerans" + }, + "peak_price_flex_override": { + "name": "Topppris: Flexibilitet" + }, + "peak_price_min_distance_override": { + "name": "Topppris: Minimiavstånd" + }, + "peak_price_min_period_length_override": { + "name": "Topppris: Minsta periodlängd" + }, + "peak_price_min_periods_override": { + "name": "Topppris: Minsta antal perioder" + }, + "peak_price_relaxation_attempts_override": { + "name": "Topppris: Lättnadsförsök" + }, + "peak_price_gap_count_override": { + "name": "Topppris: Glaptolerans" + } + }, + "switch": { + "best_price_enable_relaxation_override": { + "name": "Bästa pris: Uppnå minimiantal" + }, + "peak_price_enable_relaxation_override": { + "name": "Topppris: Uppnå minimiantal" + } + } + }, + "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 genom Tibber-integrationskonfigurationen." + }, + "homes_removed": { + "title": "Tibber-hem borttagna", + "description": "Vi upptäckte att {count} hem har tagits bort från ditt Tibber-konto: {homes}. Granska din Tibber-integrationskonfiguration." + }, + "tomorrow_data_missing": { + "title": "Morgondagens prisdata saknas för {home_name}", + "description": "Morgondagens elprisdata är fortfarande otillgänglig efter {warning_hour}:00. Detta är ovanligt, eftersom Tibber vanligtvis publicerar morgondagens priser på eftermiddagen (runt 13:00-14:00 CET).\n\nMöjliga orsaker:\n- Tibber har ännu inte publicerat morgondagens priser\n- Tillfälliga API-problem\n- Din elleverantör har inte skickat priser till Tibber\n\nDetta problem löser sig automatiskt när morgondagens data blir tillgänglig. Om detta kvarstår efter 20:00, kontrollera Tibber-appen eller kontakta Tibber support." + }, + "rate_limit_exceeded": { + "title": "API-hastighetsgräns överskriden för {home_name}", + "description": "Tibber API har hastighetsbegränsat denna integration efter {error_count} konsekutiva fel. Detta betyder att förfrågningar görs för ofta.\n\nIntegrationen kommer automatiskt att försöka igen med ökande fördröjningar. Detta problem löser sig när hastighetsgränsen löper ut.\n\nOm detta kvarstår i flera timmar, överväg:\n- Kontrollera om flera Home Assistant-instanser använder samma API-token\n- Verifiera att inga andra applikationer använder din Tibber API-token kraftigt\n- Minska uppdateringsfrekvensen om du har anpassat den" + }, + "home_not_found": { + "title": "Hem {home_name} hittades inte i Tibber-konto", + "description": "Hemmet som konfigurerats i denna integration (post-ID: {entry_id}) är inte längre tillgängligt i ditt Tibber-konto. Detta händer vanligtvis när:\n- Hemmet togs bort från ditt Tibber-konto\n- Hemmet flyttades till ett annat Tibber-konto\n- Åtkomst till detta hem återkallades\n\nTa bort denna integrationspost och lägg till den igen om hemmet fortfarande ska övervakas. För att ta bort denna post, gå till Inställningar → Enheter & Tjänster → Tibber-priser och radera {home_name}-konfigurationen." + }, + "entity_migration": { + "title": "Tibber Prices: Åtgärd krävs efter uppdatering ({home_name})", + "description": "Denna uppdatering innehåller ändringar som tillämpades automatiskt.\n\n**Omdöpta entiteter ({count})**\n\nFöljande entity-nycklar döptes om automatiskt. Dina befintliga entity-ID:n och automatiseringar förblir intakta:\n\n{entity_list}\n\n**Ändrade varaktighetssensorvärden**\n\nAlla varaktighetssensorer (återstående tid, startar om, periodvaraktighet, trendändrings-nedräkning) rapporterar nu sitt tillståndsvärde i **minuter** istället för timmar. Visningsenheten i dashboards förblir timmar som standard.\n\nOm du har automatiseringar med numeriska jämförelser på dessa sensorer, uppdatera dina tröskelvärden:\n- Gammalt: `state < 0.25` (15 minuter som timmar)\n- Nytt: `state < 15` (15 minuter)\n\nStäng detta meddelande efter att du har granskat dina automatiseringar." + } + }, + "exceptions": { + "no_entries_found": { + "message": "Inga Tibber Prices integrationsposter hittades. Konfigurera integrationen först." + }, + "multiple_entries_no_entry_id": { + "message": "Flera Tibber Prices poster hittades. Ange 'entry_id' för att välja vilken post som ska användas." + }, + "invalid_entry_id": { + "message": "Ogiltig eller otillgänglig konfigurationspost. Kontrollera post-ID:t och se till att integrationen är laddad." + }, + "missing_home_id": { + "message": "Hem-ID hittades inte i konfigurationsposten. Konfigurera om integrationen." + }, + "user_data_not_available": { + "message": "Användardata är inte tillgänglig ännu. Vänta tills den första datauppdateringen är klar." + }, + "timezone_not_found": { + "message": "Kunde inte fastställa hemmets tidszon. Kontrollera hemkonfigurationen i ditt Tibber-konto." + }, + "end_before_start": { + "message": "Sluttid måste vara efter starttid." + }, + "price_fetch_failed": { + "message": "Kunde inte hämta prisdata från Tibber API. Försök igen senare." + }, + "invalid_search_scope": { + "message": "Ogiltigt sökområde. Giltiga värden är: today, tomorrow, remaining_today, next_24h, next_48h." + }, + "scope_conflicts_with_range": { + "message": "search_scope kan inte kombineras med explicita områdesparametrar: {params}. Använd antingen search_scope ELLER explicita start-/slutparametrar." + }, + "day_offset_requires_time": { + "message": "{offset_param} kräver att {time_param} är satt. Dagsförskjutning ändrar bara datumet för en explicit tidsparameter." + }, + "min_level_exceeds_max": { + "message": "min_price_level '{min_level}' är högre än max_price_level '{max_level}'. Miniminivån måste vara lika med eller lägre än maximinivån." + }, + "power_profile_length_mismatch": { + "message": "power_profile har {profile_length} poster men varaktigheten kräver {interval_count} intervaller ({duration_minutes} minuter). power_profile måste ha exakt en post per 15-minutersintervall." + }, + "level_and_rating_filter_conflict": { + "message": "level_filter och rating_level_filter kan inte användas tillsammans. Använd bara en filtertyp per begäran." + }, + "insert_nulls_requires_filter": { + "message": "insert_nulls-läge '{mode}' kräver ett level_filter eller rating_level_filter för att definiera segment. Utan filter, använd insert_nulls: none." + }, + "connect_segments_requires_segments_mode": { + "message": "connect_segments kräver att insert_nulls är satt till 'segments'. Ställ in insert_nulls: segments för att använda segmentanslutning." + }, + "array_fields_requires_array_format": { + "message": "array_fields kan bara användas med output_format: array_of_arrays. Ändra utdataformatet eller ta bort array_fields." + }, + "invalid_array_fields": { + "message": "Ogiltig array_fields-mall. Använd fältnamn inom klammerparenteser, t.ex. '{start_time}, {price_per_kwh}, {level}'." + } + }, + "services": { + "get_price": { + "name": "Hämta prisdata", + "description": "Hämta prisdata för ett specifikt tidsintervall med automatisk routing. Utvecklings- och testservice för price_info_for_range API-funktionen. Använder automatiskt PRICE_INFO, PRICE_INFO_RANGE eller båda baserat på tidsintervallets gränser.", + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "start_time": { + "name": "Starttid", + "description": "Start för tidsintervallet (inklusivt, tidszonmedveten)." + }, + "end_time": { + "name": "Sluttid", + "description": "Slut för tidsintervallet (exklusivt, tidszonmedveten)." + } + } + }, + "get_apexcharts_yaml": { + "name": "Hämta ApexCharts Card YAML", + "description": "⚠️ VIKTIGT: Denna service genererar en GRUNDLÄGGANDE EXEMPELKONFIGURATION för ApexCharts Card som en startpunkt. Det är INTE en komplett lösning för alla ApexCharts-funktioner. Denna integration är primärt en DATALEVERANTÖR. Den genererade YAML:en demonstrerar hur man använder `get_chartdata`-servicen för att hämta prisdata. På grund av den segmenterade naturen hos vår data (olika tidsperioder per serie) och användningen av Home Assistants service-API istället för entitetsattribut är många avancerade ApexCharts-funktioner (som in_header, vissa transformationer) inte kompatibla eller kräver manuell anpassning. Du är välkommen att anpassa den genererade YAML:en för dina specifika behov, men förstå att omfattande ApexCharts-konfigurationsstöd ligger utanför denna integrations omfång. Community-bidrag med förbättrade konfigurationer uppskattas alltid - om du hittar en bättre konfiguration som fungerar, dela den så att alla kan dra nytta av den! För direkt dataåtkomst för att bygga dina egna diagram, använd `get_chartdata`-servicen istället.", + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." }, "day": { - "options": { - "yesterday": "Igår", - "today": "Idag", - "tomorrow": "Imorgon", - "rolling_window": "Glidande fönster", - "rolling_window_autozoom": "Glidande fönster (Auto-Zoom)" - } - }, - "resolution": { - "options": { - "interval": "Intervall (15 min)", - "hourly": "Varje timme" - } - }, - "output_format": { - "options": { - "array_of_objects": "Array av objekt", - "array_of_arrays": "Array av arrays" - } + "name": "Dag", + "description": "Vilken dag som ska visualiseras (standard: Glidande fönster). Fasta dagalternativ (Igår/Idag/Imorgon) visar 24h-spann utan ytterligare beroenden. Dynamiska alternativ kräver config-template-card: Glidande fönster visar ett fast 48h-fönster som automatiskt skiftar mellan igår+idag och idag+imorgon baserat på datatillgänglighet. Glidande fönster (Auto-Zoom) beter sig likadant men zoomar dessutom automatiskt in (2h tillbakablick + återstående tid till midnatt, graph_span minskar var 15:e minut)." }, "level_type": { - "options": { - "rating_level": "Betygnivå (låg/normal/hög)", - "level": "Tibber-nivå (mycket billigt till mycket dyrt)" - } + "name": "Nivåtyp", + "description": "Välj vilken prisnivåklassificering som ska visualiseras: 'rating_level' (låg/normal/hög baserat på dina konfigurerade tröskelvärden) eller 'level' (Tibber API-nivåer: mycket billigt/billigt/normalt/dyrt/mycket dyrt)." + }, + "highlight_best_price": { + "name": "Markera bästa prisperioder", + "description": "Lägg till ett halvtransparent grönt överlag för att markera de bästa prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera de optimala tiderna för energiförbrukning." + }, + "highlight_peak_price": { + "name": "Markera högsta prisperioder", + "description": "Lägg till ett halvtransparent rött överlag för att markera de högsta prisperioderna i diagrammet. Detta gör det enkelt att visuellt identifiera tiderna när energi är som dyrast." + }, + "resolution": { + "name": "Upplösning", + "description": "Tidsupplösning för diagramdata. 'interval' (standard): Ursprungliga 15-minutersintervall (96 punkter per dag). 'hourly': Aggregerade timvärden med ett rullande 60-minutersfönster (24 punkter per dag) för ett renare och mindre rörigt diagram." + } + } + }, + "get_chartdata": { + "name": "Hämta diagramdata", + "description": "Returnerar prisdata i ett enkelt diagramvänligt format som är kompatibelt med Tibber Core-integrationens utdatastruktur. Perfekt för användning med populära diagramkort som ha-price-timeline-card, ApexCharts Card, Plotly Graph Card, Mini Graph Card eller det inbyggda History Graph Card. Fältnamn och datastruktur kan anpassas för att matcha dina specifika diagramkrav.", + "sections": { + "general": { + "name": "Allmänt", + "description": "Allmänna inställningar för att hämta diagramdata." + }, + "selection": { + "name": "Urval", + "description": "Välj vilken data som ska inkluderas i utdatan." + }, + "filters": { + "name": "Filter", + "description": "Filtrera data baserat på prisnivåer, betygsnivåer eller specialperioder." + }, + "transformation": { + "name": "Transformera data", + "description": "Transformera datautdatan för bättre diagramkompatibilitet." + }, + "format": { + "name": "Format", + "description": "Anpassa utdataformatet." + }, + "arrays_of_arrays": { + "name": "Avancerade utdatainställningar: Array av arrays", + "description": "Inställningar för utdataformat när en array av arrays används." + }, + "arrays_of_objects": { + "name": "Avancerade utdatainställningar: Array av objekt", + "description": "Inställningar för utdataformat när en array av objekt används." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "day": { + "name": "Dag", + "description": "Vilken/vilka dag(ar) att hämta priser för. Du kan välja flera dagar. Om inget anges returneras ett glidande 2-dagarsfönster: idag+imorgon (när morgondagens data finns tillgänglig) eller igår+idag (när morgondagens data ännu inte är tillgänglig). Detta ger kontinuerlig diagramvisning utan luckor." + }, + "resolution": { + "name": "Upplösning", + "description": "Tidsupplösning för returnerad data. Alternativ: 'interval' (standard, 15-minutersintervall, 96 punkter per dag), 'hourly' (timmedelvärden, 24 punkter per dag)." + }, + "output_format": { + "name": "Utdataformat", + "description": "Utdataformat för returnerad data. Alternativ: 'array_of_objects' (standard, array av objekt med anpassningsbara fältnamn), 'array_of_arrays' (array av [tidstämpel, pris]-arrays med avslutande null-punkt för stegdiagram)." + }, + "array_fields": { + "name": "Array-fält", + "description": "Definiera vilka fält som ska inkluderas. Använd fältnamn inom klammerparenteser, separerade med kommatecken. Tillgängliga fält: start_time, price_per_kwh, level, rating_level, average. Fält kommer automatiskt att aktiveras även om include_*-alternativ inte är inställda. Lämna tomt för standard (endast tidstämpel och pris)." + }, + "subunit_currency": { + "name": "Underenhetsvaluta", + "description": "Returnera priser i underenhetsvaluta (cent för EUR, øre för NOK/SEK) istället för basvalutaenheter. Inaktiverad som standard." + }, + "round_decimals": { + "name": "Avrunda decimaler", + "description": "Antal decimaler att avrunda priser till (0-10). Om inget anges används standardprecision (4 decimaler för basvaluta, 2 för underenhetsvaluta)." + }, + "data_key": { + "name": "Datanyckel", + "description": "Anpassat namn för datanyckeln på toppnivå i svaret. Standard är 'data' om inget anges." + }, + "include_level": { + "name": "Inkludera nivå", + "description": "Inkludera Tibbers prisnivåfält (mycket billigt/billigt/normalt/dyrt/mycket dyrt) i varje datapunkt." + }, + "include_rating_level": { + "name": "Inkludera betygsnivå", + "description": "Inkludera det beräknade betygsnivåfältet (låg/normal/hög) baserat på dina konfigurerade tröskelvärden i varje datapunkt." + }, + "include_average": { + "name": "Inkludera medelvärde", + "description": "Inkludera dagligt medelpris i varje datapunkt för jämförelse." + }, + "include_energy": { + "name": "Inkludera energipris", + "description": "Inkludera rått energi-/spotpris (exklusive skatter och avgifter) i varje datapunkt. Detta är 'energy'-fältet från Tibber-API:et, användbart för inmatnings-/nettomätningsberäkningar." + }, + "include_tax": { + "name": "Inkludera skatt", + "description": "Inkludera skattedelen av priset i varje datapunkt. Detta är 'tax'-fältet från Tibber-API:et, som representerar avgifter, skatter och nätavgifter." }, "level_filter": { - "options": { - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } + "name": "Nivåfilter", + "description": "Filtrera intervaller för att endast inkludera specifika Tibber-prisnivåer (mycket billigt/billigt/normalt/dyrt/mycket dyrt). Om inget anges inkluderas alla nivåer." }, "rating_level_filter": { - "options": { - "low": "Låg", - "normal": "Normal", - "high": "Hög" - } - }, - "insert_nulls": { - "options": { - "none": "Ingen", - "segments": "Segment", - "all": "Alla" - } + "name": "Betygsnivåfilter", + "description": "Filtrera intervaller för att endast inkludera specifika betygsnivåer (låg/normal/hög). Om inget anges inkluderas alla betygsnivåer." }, "period_filter": { - "options": { - "best_price": "Bästa prisperioder", - "peak_price": "Topprisperioder" - } + "name": "Periodfilter", + "description": "Filtrera intervaller för att endast inkludera de inom Bästa pris- eller Topppris-perioder. Alternativ: 'best_price' (endast intervaller i Bästa pris-perioder), 'peak_price' (endast intervaller i Topppris-perioder). Om inget anges inkluderas alla intervaller. Detta använder förberäknad perioddata från binära sensorer." + }, + "insert_nulls": { + "name": "Infoga NULL-värden", + "description": "Kontrollera infogning av NULL-värden för filtrerad data. 'none' (standard): Inga NULL-värden, endast matchande intervaller. 'segments': Lägg till NULL-punkter vid segmentgränser för rena luckor i diagram (rekommenderas för stegdiagram). 'all': Infoga NULL för alla tidstämplar där filtret inte matchar (användbart för kontinuerlig tidsserievisualisering)." + }, + "connect_segments": { + "name": "Anslut segment", + "description": "[ENDAST MED 'Infoga NULL-värden'] När aktiverad läggs anslutande punkter till vid segmentgränser för att visuellt ansluta olika prisnivåsegment i stegdiagram. När priset går NER vid en gräns läggs en punkt med det lägre priset till i slutet av det aktuella segmentet. När priset går UPP läggs en hållpunkt till innan luckan. Detta skapar smärre visuella övergångar mellan segment istället för abrupta luckor." + }, + "add_trailing_null": { + "name": "Lägg till avslutande null-punkt", + "description": "Lägg till en sista datapunkt med null-värden (förutom tidstämpel) i slutet. Vissa diagrambibliotek behöver detta för att förhindra extrapolering/interpolering till vyportens kant när steglinje-rendering används. Lämna inaktiverad om inte ditt diagram kräver det." + }, + "start_time_field": { + "name": "Starttidsfältnamn", + "description": "Anpassat namn för starttidsfältet i utdatan. Standard är 'start_time' om inget anges." + }, + "end_time_field": { + "name": "Sluttidsfältnamn", + "description": "Anpassat namn för sluttidsfältet i utdatan. Standard är 'end_time' om inget anges. Används endast med period_filter." + }, + "price_field": { + "name": "Prisfältnamn", + "description": "Anpassat namn för prisfältet i utdatan. Standard är 'price_per_kwh' om inget anges." + }, + "level_field": { + "name": "Nivåfältnamn", + "description": "Anpassat namn för nivåfältet i utdatan. Standard är 'level' om inget anges. Används endast när include_level är aktiverad." + }, + "rating_level_field": { + "name": "Betygsnivåfältnamn", + "description": "Anpassat namn för betygsnivåfältet i utdatan. Standard är 'rating_level' om inget anges. Används endast när include_rating_level är aktiverad." + }, + "average_field": { + "name": "Medelvärdesfältnamn", + "description": "Anpassat namn för medelvärdesfältet i utdatan. Standard är 'average' om inget anges. Används endast när include_average är aktiverad." + }, + "energy_field": { + "name": "Energiprisfältnamn", + "description": "Anpassat namn för energiprisfältet i utdatan. Standard är 'energy_price' om inget anges. Används endast när include_energy är aktiverad." + }, + "tax_field": { + "name": "Skattefältnamn", + "description": "Anpassat namn för skattefältet i utdatan. Standard är 'tax' om inget anges. Används endast när include_tax är aktiverad." }, "metadata": { - "options": { - "include": "Inkludera (data + metadata)", - "only": "Endast metadata", - "none": "Ingen (endast data)" - } + "name": "Metadata", + "description": "Kontrollera inkludering av metadata i svaret. 'include' (standard): Returnerar både diagramdata och metadata med prisstatistik, valutainfo, Y-axelförslag och tidsintervall. 'only': Returnerar endast metadata utan att bearbeta diagramdata (snabbt, användbart för dynamisk Y-axelkonfiguration). 'none': Returnerar endast diagramdata utan metadata." + } + } + }, + "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": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + } + } + }, + "find_cheapest_block": { + "name": "Hitta billigaste blocket", + "description": "Hittar det billigaste sammanhängande tidsfönstret med en given varaktighet. Designat för apparatschemaläggning: diskmaskin, tvättmaskin, torktumlare osv. Returnerar det billigaste fönstret med start-/sluttider och prisstatistik.", + "sections": { + "search_range": { + "name": "Soekomraade", + "description": "Definiera tidsfoenstret att soeka inom." }, - "volatility": { - "options": { - "low": "Låg", - "moderate": "Måttlig", - "high": "Hög", - "very_high": "Mycket hög" - } + "time_alternatives": { + "name": "Alternativa tidsinstaellningar", + "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." }, - "current_interval_price_level": { - "options": { - "any": "Alla", - "very_cheap": "Mycket billigt", - "cheap": "Billigt", - "normal": "Normalt", - "expensive": "Dyrt", - "very_expensive": "Mycket dyrt" - } + "price_filter": { + "name": "Prisnivaaefilter", + "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." }, - "currency_display_mode": { - "options": { - "base": "Basvaluta (€, kr)", - "subunit": "Underenhetsvaluta (ct, øre)" - } + "output": { + "name": "Utdataalternativ", + "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." }, - "average_sensor_display": { - "options": { - "median": "Median", - "mean": "Aritmetiskt medelvärde" - } + "duration": { + "name": "Varaktighet", + "description": "Längd på det önskade sammanhängande fönstret. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 12 timmar." + }, + "search_start": { + "name": "Sökstart", + "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." + }, + "search_end": { + "name": "Sökslut", + "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." + }, + "search_start_time": { + "name": "Sökstart-klockslag", + "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." + }, + "search_start_day_offset": { + "name": "Sökstart dagförskjutning", + "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." + }, + "search_end_time": { + "name": "Sökslut-klockslag", + "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." + }, + "search_end_day_offset": { + "name": "Sökslut dagförskjutning", + "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." + }, + "search_start_offset_minutes": { + "name": "Sökstart-förskjutning (minuter)", + "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." + }, + "search_end_offset_minutes": { + "name": "Sökslut-förskjutning (minuter)", + "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." + }, + "include_current_interval": { + "name": "Inkludera aktuellt intervall", + "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." + }, + "use_base_unit": { + "name": "Använd basvaluta", + "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." }, "search_scope": { - "options": { - "today": "Idag", - "tomorrow": "Imorgon", - "remaining_today": "Aaterstoden av idag", - "next_24h": "Naesta 24 timmar", - "next_48h": "Naesta 48 timmar" - } + "name": "Soekumfaang (genvaeg)", + "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." + }, + "max_price_level": { + "name": "Maximal prisnivaae", + "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." + }, + "min_price_level": { + "name": "Minimal prisnivaae", + "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." + }, + "include_comparison_details": { + "name": "Inkludera jaemfoerelsdetaljer", + "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." } + } }, - "title": "Tibber Prisinformation & Betyg" + "find_most_expensive_block": { + "name": "Hitta dyraste blocket", + "description": "Hittar det dyraste sammanhängande tidsfönstret med en given varaktighet. Användbart för att identifiera topprisperioder som bör undvikas. Returnerar det dyraste fönstret med start-/sluttider och prisstatistik.", + "sections": { + "search_range": { + "name": "Soekomraade", + "description": "Definiera tidsfoenstret att soeka inom." + }, + "time_alternatives": { + "name": "Alternativa tidsinstaellningar", + "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." + }, + "price_filter": { + "name": "Prisnivaaefilter", + "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." + }, + "output": { + "name": "Utdataalternativ", + "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "duration": { + "name": "Varaktighet", + "description": "Längd på det önskade sammanhängande fönstret. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 12 timmar." + }, + "search_start": { + "name": "Sökstart", + "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." + }, + "search_end": { + "name": "Sökslut", + "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." + }, + "search_start_time": { + "name": "Sökstart-klockslag", + "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." + }, + "search_start_day_offset": { + "name": "Sökstart dagförskjutning", + "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." + }, + "search_end_time": { + "name": "Sökslut-klockslag", + "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." + }, + "search_end_day_offset": { + "name": "Sökslut dagförskjutning", + "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." + }, + "search_start_offset_minutes": { + "name": "Sökstart-förskjutning (minuter)", + "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." + }, + "search_end_offset_minutes": { + "name": "Sökslut-förskjutning (minuter)", + "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." + }, + "include_current_interval": { + "name": "Inkludera aktuellt intervall", + "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." + }, + "use_base_unit": { + "name": "Använd basvaluta", + "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." + }, + "search_scope": { + "name": "Soekumfaang (genvaeg)", + "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." + }, + "max_price_level": { + "name": "Maximal prisnivaae", + "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." + }, + "min_price_level": { + "name": "Minimal prisnivaae", + "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." + }, + "include_comparison_details": { + "name": "Inkludera jaemfoerelsdetaljer", + "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." + } + } + }, + "find_cheapest_hours": { + "name": "Hitta billigaste timmarna", + "description": "Hittar de billigaste intervallen för en given total varaktighet, inte nödvändigtvis sammanhängande. Designat för flexibla laster: batteriladdning, elbil, varmvattenberedare. Returnerar ett schema av intervaller grupperade i sammanhängande segment.", + "sections": { + "search_range": { + "name": "Soekomraade", + "description": "Definiera tidsfoenstret att soeka inom." + }, + "time_alternatives": { + "name": "Alternativa tidsinstaellningar", + "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." + }, + "price_filter": { + "name": "Prisnivaaefilter", + "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." + }, + "output": { + "name": "Utdataalternativ", + "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "duration": { + "name": "Varaktighet", + "description": "Behövd billig total tid. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 24 timmar." + }, + "search_start": { + "name": "Sökstart", + "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." + }, + "search_end": { + "name": "Sökslut", + "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." + }, + "search_start_time": { + "name": "Sökstart-klockslag", + "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." + }, + "search_start_day_offset": { + "name": "Sökstart dagförskjutning", + "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." + }, + "search_end_time": { + "name": "Sökslut-klockslag", + "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." + }, + "search_end_day_offset": { + "name": "Sökslut dagförskjutning", + "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." + }, + "search_start_offset_minutes": { + "name": "Sökstart-förskjutning (minuter)", + "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." + }, + "search_end_offset_minutes": { + "name": "Sökslut-förskjutning (minuter)", + "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." + }, + "include_current_interval": { + "name": "Inkludera aktuellt intervall", + "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." + }, + "min_segment_duration": { + "name": "Minsta segmentvaraktighet", + "description": "Minsta sammanhängande körtid. Förhindrar snabb av/på-cykling för enheter med minsta körtider. Avrundas automatiskt uppåt till närmaste kvart. Standard: 15 minuter. Maximum: 4 timmar." + }, + "use_base_unit": { + "name": "Använd basvaluta", + "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." + }, + "search_scope": { + "name": "Soekumfaang (genvaeg)", + "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." + }, + "max_price_level": { + "name": "Maximal prisnivaae", + "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." + }, + "min_price_level": { + "name": "Minimal prisnivaae", + "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." + }, + "include_comparison_details": { + "name": "Inkludera jaemfoerelsdetaljer", + "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." + } + } + }, + "find_most_expensive_hours": { + "name": "Hitta dyraste timmarna", + "description": "Hittar de dyraste intervallen för en given total varaktighet, inte nödvändigtvis sammanhängande. Användbart för att identifiera topprisperioder som bör undvikas. Returnerar ett schema av intervaller grupperade i sammanhängande segment.", + "sections": { + "search_range": { + "name": "Soekomraade", + "description": "Definiera tidsfoenstret att soeka inom." + }, + "time_alternatives": { + "name": "Alternativa tidsinstaellningar", + "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." + }, + "price_filter": { + "name": "Prisnivaaefilter", + "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." + }, + "output": { + "name": "Utdataalternativ", + "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "duration": { + "name": "Varaktighet", + "description": "Dyr total tid att hitta. Avrundas automatiskt uppåt till närmaste kvart. Maximum: 24 timmar." + }, + "search_start": { + "name": "Sökstart", + "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." + }, + "search_end": { + "name": "Sökslut", + "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." + }, + "search_start_time": { + "name": "Sökstart-klockslag", + "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." + }, + "search_start_day_offset": { + "name": "Sökstart dagförskjutning", + "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." + }, + "search_end_time": { + "name": "Sökslut-klockslag", + "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." + }, + "search_end_day_offset": { + "name": "Sökslut dagförskjutning", + "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." + }, + "search_start_offset_minutes": { + "name": "Sökstart-förskjutning (minuter)", + "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." + }, + "search_end_offset_minutes": { + "name": "Sökslut-förskjutning (minuter)", + "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." + }, + "include_current_interval": { + "name": "Inkludera aktuellt intervall", + "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." + }, + "min_segment_duration": { + "name": "Minsta segmentvaraktighet", + "description": "Minsta sammanhängande körtid. Förhindrar snabb av/på-cykling för enheter med minsta körtider. Avrundas automatiskt uppåt till närmaste kvart. Standard: 15 minuter. Maximum: 4 timmar." + }, + "use_base_unit": { + "name": "Använd basvaluta", + "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." + }, + "search_scope": { + "name": "Soekumfaang (genvaeg)", + "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." + }, + "max_price_level": { + "name": "Maximal prisnivaae", + "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." + }, + "min_price_level": { + "name": "Minimal prisnivaae", + "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." + }, + "include_comparison_details": { + "name": "Inkludera jaemfoerelsdetaljer", + "description": "Berika price_comparison-resultatet med ytterligare faelt: comparison_price_min, comparison_price_max och (endast block) comparison_window_end." + }, + "power_profile": { + "name": "Effektprofil", + "description": "Variabel effektfoerbruekning i watt per 15-minutersintervall. Om instaellt, aaterspeglar estimated_total_cost faktisk foerbruekning istaellet foer en fast 1 kW-last." + } + } + }, + "find_cheapest_schedule": { + "name": "Hitta billigaste schema", + "description": "Schemalaggar flera apparater optimalt utan tidsoeverlapp. Varje uppgift tilldelas det billigaste tillgaengliga sammanhangande tidsfoenster.", + "sections": { + "scheduling_options": { + "name": "Schemalagningsalternativ", + "description": "Konfigurera uppgifter och pauser mellan dem." + }, + "search_range": { + "name": "Soekomraade", + "description": "Definiera tidsfoenstret att soeka inom." + }, + "time_alternatives": { + "name": "Alternativa tidsinstaellningar", + "description": "Alternativa saett att definiera soekomraadet via tidpunkt och offset." + }, + "price_filter": { + "name": "Prisnivaaefilter", + "description": "Begraensa soekningen till intervall inom det angivna prisnivaaeintervallet." + }, + "output": { + "name": "Utdataalternativ", + "description": "Styr kostnadsuppskattning och jaemfoerelseresultat." + } + }, + "fields": { + "entry_id": { + "name": "Entry-ID", + "description": "Config entry-ID för Tibber-integrationen." + }, + "tasks": { + "name": "Uppgifter", + "description": "Lista med uppgifter att schemalagga. Varje uppgift kraever name (text) och duration (hh:mm:ss). Valfritt power_profile (watt per 15-min-intervall). Maximalt 4 uppgifter." + }, + "gap_minutes": { + "name": "Paus mellan uppgifter (minuter)", + "description": "Minsta paus i minuter mellan paa varandra foeoljande schemalagda uppgifter. Avrundas uppaat till 15 minuter. Standard: 0 (ingen paus)." + }, + "search_scope": { + "name": "Soekumfaang (genvaeg)", + "description": "Genvaeg foer vanliga soekomraaden. Aasidosaetter alla andra tidsalternativ. today/tomorrow = hela kalenderdagen, remaining_today = nu till midnatt, next_24h/next_48h = rullande foenster fraen nu." + }, + "search_start": { + "name": "Sökstart", + "description": "Start av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra startalternativ. Standard är nu om inte angivet." + }, + "search_end": { + "name": "Sökslut", + "description": "Slut av sökintervallet som exakt datum och tid. Högsta prioritet — åsidosätter alla andra slutalternativ. Standard är slutet av imorgon om inte angivet." + }, + "search_start_time": { + "name": "Sökstart-klockslag", + "description": "Alternativ: Börja söka från detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökstart (datum/tid) är satt." + }, + "search_start_day_offset": { + "name": "Sökstart dagförskjutning", + "description": "Dagförskjutning för Sökstart-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökstart-klockslag." + }, + "search_end_time": { + "name": "Sökslut-klockslag", + "description": "Alternativ: Sök till detta klockslag. Kombinera med dagförskjutning. Ignoreras om Sökslut (datum/tid) är satt." + }, + "search_end_day_offset": { + "name": "Sökslut dagförskjutning", + "description": "Dagförskjutning för Sökslut-klockslag. -7 till 2: -1 = igår, 0 = idag, 1 = imorgon. Negativa värden söker i det förflutna. Används bara med Sökslut-klockslag." + }, + "search_start_offset_minutes": { + "name": "Sökstart-förskjutning (minuter)", + "description": "Alternativ: Börja söka detta antal minuter från nu. Positivt = framtid (60 = om 1 timme), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökstart eller Sökstart-klockslag är satt." + }, + "search_end_offset_minutes": { + "name": "Sökslut-förskjutning (minuter)", + "description": "Alternativ: Sluta söka detta antal minuter från nu. Positivt = framtid (480 = om 8 timmar), negativt = förflutet (-60 = 1 timme sedan). Ignoreras om Sökslut eller Sökslut-klockslag är satt." + }, + "include_current_interval": { + "name": "Inkludera aktuellt intervall", + "description": "Inkludera det pågående 15-minutersintervallet i sökningen. När aktiverat (standard), börjar sökningen vid början av det aktuella intervallet så att det kan vara en del av resultatet." + }, + "max_price_level": { + "name": "Maximal prisnivaae", + "description": "Ta bara med intervall paa eller under denna Tibber-prisnivaae. very_cheap = mest restriktivt, very_expensive = ingen begraensning." + }, + "min_price_level": { + "name": "Minimal prisnivaae", + "description": "Ta bara med intervall paa eller oever denna Tibber-prisnivaae. Anvaendbart foer find_most_expensive foer att fokusera paa verkligt dyra intervall." + }, + "use_base_unit": { + "name": "Använd basvaluta", + "description": "Tvinga priser i basvaluta (EUR, NOK) istället för konfigurerad visningsenhet (ct, öre). Användbart för beräkningar." + } + } + } + }, + "selector": { + "account_choice": { + "options": { + "new_token": "Lägg till ny Tibber-konto API-token" + } + }, + "day": { + "options": { + "yesterday": "Igår", + "today": "Idag", + "tomorrow": "Imorgon", + "rolling_window": "Glidande fönster", + "rolling_window_autozoom": "Glidande fönster (Auto-Zoom)" + } + }, + "resolution": { + "options": { + "interval": "Intervall (15 min)", + "hourly": "Varje timme" + } + }, + "output_format": { + "options": { + "array_of_objects": "Array av objekt", + "array_of_arrays": "Array av arrays" + } + }, + "level_type": { + "options": { + "rating_level": "Betygnivå (låg/normal/hög)", + "level": "Tibber-nivå (mycket billigt till mycket dyrt)" + } + }, + "level_filter": { + "options": { + "very_cheap": "Mycket billigt", + "cheap": "Billigt", + "normal": "Normalt", + "expensive": "Dyrt", + "very_expensive": "Mycket dyrt" + } + }, + "rating_level_filter": { + "options": { + "low": "Låg", + "normal": "Normal", + "high": "Hög" + } + }, + "insert_nulls": { + "options": { + "none": "Ingen", + "segments": "Segment", + "all": "Alla" + } + }, + "period_filter": { + "options": { + "best_price": "Bästa prisperioder", + "peak_price": "Topprisperioder" + } + }, + "metadata": { + "options": { + "include": "Inkludera (data + metadata)", + "only": "Endast metadata", + "none": "Ingen (endast data)" + } + }, + "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" + } + }, + "currency_display_mode": { + "options": { + "base": "Basvaluta (€, kr)", + "subunit": "Underenhetsvaluta (ct, øre)" + } + }, + "average_sensor_display": { + "options": { + "median": "Median", + "mean": "Aritmetiskt medelvärde" + } + }, + "search_scope": { + "options": { + "today": "Idag", + "tomorrow": "Imorgon", + "remaining_today": "Aaterstoden av idag", + "next_24h": "Naesta 24 timmar", + "next_48h": "Naesta 48 timmar" + } + } + }, + "title": "Tibber Prisinformation & Betyg" }