diff --git a/custom_components/tibber_prices/config_flow_handlers/schemas.py b/custom_components/tibber_prices/config_flow_handlers/schemas.py index 2925b0d..2fd8408 100644 --- a/custom_components/tibber_prices/config_flow_handlers/schemas.py +++ b/custom_components/tibber_prices/config_flow_handlers/schemas.py @@ -89,6 +89,7 @@ from custom_components.tibber_prices.const import ( PEAK_PRICE_MIN_LEVEL_OPTIONS, ) from homeassistant.const import CONF_ACCESS_TOKEN +from homeassistant.data_entry_flow import section from homeassistant.helpers.selector import ( BooleanSelector, NumberSelector, @@ -212,352 +213,408 @@ def get_price_rating_schema(options: Mapping[str, Any]) -> vol.Schema: """Return schema for price rating thresholds configuration.""" return vol.Schema( { - vol.Optional( - CONF_PRICE_RATING_THRESHOLD_LOW, - default=int( - options.get( - CONF_PRICE_RATING_THRESHOLD_LOW, - DEFAULT_PRICE_RATING_THRESHOLD_LOW, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PRICE_RATING_THRESHOLD_LOW, - max=MAX_PRICE_RATING_THRESHOLD_LOW, - unit_of_measurement="%", - step=1, - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_PRICE_RATING_THRESHOLD_HIGH, - default=int( - options.get( - CONF_PRICE_RATING_THRESHOLD_HIGH, - DEFAULT_PRICE_RATING_THRESHOLD_HIGH, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PRICE_RATING_THRESHOLD_HIGH, - max=MAX_PRICE_RATING_THRESHOLD_HIGH, - unit_of_measurement="%", - step=1, - mode=NumberSelectorMode.SLIDER, + vol.Required("price_rating_thresholds"): section( + vol.Schema( + { + vol.Optional( + CONF_PRICE_RATING_THRESHOLD_LOW, + default=int( + options.get( + CONF_PRICE_RATING_THRESHOLD_LOW, + DEFAULT_PRICE_RATING_THRESHOLD_LOW, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PRICE_RATING_THRESHOLD_LOW, + max=MAX_PRICE_RATING_THRESHOLD_LOW, + unit_of_measurement="%", + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_PRICE_RATING_THRESHOLD_HIGH, + default=int( + options.get( + CONF_PRICE_RATING_THRESHOLD_HIGH, + DEFAULT_PRICE_RATING_THRESHOLD_HIGH, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PRICE_RATING_THRESHOLD_HIGH, + max=MAX_PRICE_RATING_THRESHOLD_HIGH, + unit_of_measurement="%", + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), } ) def get_volatility_schema(options: Mapping[str, Any]) -> vol.Schema: - """Return schema for volatility thresholds configuration.""" + """Return schema for volatility thresholds configuration with collapsible sections.""" return vol.Schema( { - vol.Optional( - CONF_VOLATILITY_THRESHOLD_MODERATE, - default=float( - options.get( - CONF_VOLATILITY_THRESHOLD_MODERATE, - DEFAULT_VOLATILITY_THRESHOLD_MODERATE, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_VOLATILITY_THRESHOLD_MODERATE, - max=MAX_VOLATILITY_THRESHOLD_MODERATE, - step=1.0, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_VOLATILITY_THRESHOLD_HIGH, - default=float( - options.get( - CONF_VOLATILITY_THRESHOLD_HIGH, - DEFAULT_VOLATILITY_THRESHOLD_HIGH, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_VOLATILITY_THRESHOLD_HIGH, - max=MAX_VOLATILITY_THRESHOLD_HIGH, - step=1.0, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_VOLATILITY_THRESHOLD_VERY_HIGH, - default=float( - options.get( - CONF_VOLATILITY_THRESHOLD_VERY_HIGH, - DEFAULT_VOLATILITY_THRESHOLD_VERY_HIGH, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_VOLATILITY_THRESHOLD_VERY_HIGH, - max=MAX_VOLATILITY_THRESHOLD_VERY_HIGH, - step=1.0, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, + vol.Required("volatility_thresholds"): section( + vol.Schema( + { + vol.Optional( + CONF_VOLATILITY_THRESHOLD_MODERATE, + default=float( + options.get( + CONF_VOLATILITY_THRESHOLD_MODERATE, + DEFAULT_VOLATILITY_THRESHOLD_MODERATE, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_VOLATILITY_THRESHOLD_MODERATE, + max=MAX_VOLATILITY_THRESHOLD_MODERATE, + step=1.0, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_VOLATILITY_THRESHOLD_HIGH, + default=float( + options.get( + CONF_VOLATILITY_THRESHOLD_HIGH, + DEFAULT_VOLATILITY_THRESHOLD_HIGH, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_VOLATILITY_THRESHOLD_HIGH, + max=MAX_VOLATILITY_THRESHOLD_HIGH, + step=1.0, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_VOLATILITY_THRESHOLD_VERY_HIGH, + default=float( + options.get( + CONF_VOLATILITY_THRESHOLD_VERY_HIGH, + DEFAULT_VOLATILITY_THRESHOLD_VERY_HIGH, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_VOLATILITY_THRESHOLD_VERY_HIGH, + max=MAX_VOLATILITY_THRESHOLD_VERY_HIGH, + step=1.0, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), } ) def get_best_price_schema(options: Mapping[str, Any]) -> vol.Schema: - """Return schema for best price period configuration.""" + """Return schema for best price period configuration with collapsible sections.""" return vol.Schema( { - vol.Optional( - CONF_BEST_PRICE_MIN_PERIOD_LENGTH, - default=int( - options.get( - CONF_BEST_PRICE_MIN_PERIOD_LENGTH, - DEFAULT_BEST_PRICE_MIN_PERIOD_LENGTH, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PERIOD_LENGTH, - max=MAX_MIN_PERIOD_LENGTH, - step=15, - unit_of_measurement="min", - mode=NumberSelectorMode.SLIDER, + vol.Required("period_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_BEST_PRICE_MIN_PERIOD_LENGTH, + default=int( + options.get( + CONF_BEST_PRICE_MIN_PERIOD_LENGTH, + DEFAULT_BEST_PRICE_MIN_PERIOD_LENGTH, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PERIOD_LENGTH, + max=MAX_MIN_PERIOD_LENGTH, + step=15, + unit_of_measurement="min", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_BEST_PRICE_MAX_LEVEL, + default=options.get( + CONF_BEST_PRICE_MAX_LEVEL, + DEFAULT_BEST_PRICE_MAX_LEVEL, + ), + ): SelectSelector( + SelectSelectorConfig( + options=BEST_PRICE_MAX_LEVEL_OPTIONS, + mode=SelectSelectorMode.DROPDOWN, + translation_key="current_interval_price_level", + ), + ), + vol.Optional( + CONF_BEST_PRICE_MAX_LEVEL_GAP_COUNT, + default=int( + options.get( + CONF_BEST_PRICE_MAX_LEVEL_GAP_COUNT, + DEFAULT_BEST_PRICE_MAX_LEVEL_GAP_COUNT, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_GAP_COUNT, + max=MAX_GAP_COUNT, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), - vol.Optional( - CONF_BEST_PRICE_FLEX, - default=int( - options.get( - CONF_BEST_PRICE_FLEX, - DEFAULT_BEST_PRICE_FLEX, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=0, - max=50, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, + vol.Required("flexibility_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_BEST_PRICE_FLEX, + default=int( + options.get( + CONF_BEST_PRICE_FLEX, + DEFAULT_BEST_PRICE_FLEX, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=0, + max=50, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_BEST_PRICE_MIN_DISTANCE_FROM_AVG, + default=int( + options.get( + CONF_BEST_PRICE_MIN_DISTANCE_FROM_AVG, + DEFAULT_BEST_PRICE_MIN_DISTANCE_FROM_AVG, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=-50, + max=0, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), - vol.Optional( - CONF_BEST_PRICE_MIN_DISTANCE_FROM_AVG, - default=int( - options.get( - CONF_BEST_PRICE_MIN_DISTANCE_FROM_AVG, - DEFAULT_BEST_PRICE_MIN_DISTANCE_FROM_AVG, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=-50, - max=0, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_BEST_PRICE_MAX_LEVEL, - default=options.get( - CONF_BEST_PRICE_MAX_LEVEL, - DEFAULT_BEST_PRICE_MAX_LEVEL, - ), - ): SelectSelector( - SelectSelectorConfig( - options=BEST_PRICE_MAX_LEVEL_OPTIONS, - mode=SelectSelectorMode.DROPDOWN, - translation_key="current_interval_price_level", - ), - ), - vol.Optional( - CONF_BEST_PRICE_MAX_LEVEL_GAP_COUNT, - default=int( - options.get( - CONF_BEST_PRICE_MAX_LEVEL_GAP_COUNT, - DEFAULT_BEST_PRICE_MAX_LEVEL_GAP_COUNT, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_GAP_COUNT, - max=MAX_GAP_COUNT, - step=1, - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_ENABLE_MIN_PERIODS_BEST, - default=options.get( - CONF_ENABLE_MIN_PERIODS_BEST, - DEFAULT_ENABLE_MIN_PERIODS_BEST, - ), - ): BooleanSelector(), - vol.Optional( - CONF_MIN_PERIODS_BEST, - default=int( - options.get( - CONF_MIN_PERIODS_BEST, - DEFAULT_MIN_PERIODS_BEST, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=1, - max=MAX_MIN_PERIODS, - step=1, - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_RELAXATION_ATTEMPTS_BEST, - default=int( - options.get( - CONF_RELAXATION_ATTEMPTS_BEST, - DEFAULT_RELAXATION_ATTEMPTS_BEST, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_RELAXATION_ATTEMPTS, - max=MAX_RELAXATION_ATTEMPTS, - step=1, - mode=NumberSelectorMode.SLIDER, + vol.Required("relaxation_and_target_periods"): section( + vol.Schema( + { + vol.Optional( + CONF_ENABLE_MIN_PERIODS_BEST, + default=options.get( + CONF_ENABLE_MIN_PERIODS_BEST, + DEFAULT_ENABLE_MIN_PERIODS_BEST, + ), + ): BooleanSelector(), + vol.Optional( + CONF_MIN_PERIODS_BEST, + default=int( + options.get( + CONF_MIN_PERIODS_BEST, + DEFAULT_MIN_PERIODS_BEST, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=1, + max=MAX_MIN_PERIODS, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_RELAXATION_ATTEMPTS_BEST, + default=int( + options.get( + CONF_RELAXATION_ATTEMPTS_BEST, + DEFAULT_RELAXATION_ATTEMPTS_BEST, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_RELAXATION_ATTEMPTS, + max=MAX_RELAXATION_ATTEMPTS, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), } ) def get_peak_price_schema(options: Mapping[str, Any]) -> vol.Schema: - """Return schema for peak price period configuration.""" + """Return schema for peak price period configuration with collapsible sections.""" return vol.Schema( { - vol.Optional( - CONF_PEAK_PRICE_MIN_PERIOD_LENGTH, - default=int( - options.get( - CONF_PEAK_PRICE_MIN_PERIOD_LENGTH, - DEFAULT_PEAK_PRICE_MIN_PERIOD_LENGTH, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PERIOD_LENGTH, - max=MAX_MIN_PERIOD_LENGTH, - step=15, - unit_of_measurement="min", - mode=NumberSelectorMode.SLIDER, + vol.Required("period_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_PEAK_PRICE_MIN_PERIOD_LENGTH, + default=int( + options.get( + CONF_PEAK_PRICE_MIN_PERIOD_LENGTH, + DEFAULT_PEAK_PRICE_MIN_PERIOD_LENGTH, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PERIOD_LENGTH, + max=MAX_MIN_PERIOD_LENGTH, + step=15, + unit_of_measurement="min", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_PEAK_PRICE_MIN_LEVEL, + default=options.get( + CONF_PEAK_PRICE_MIN_LEVEL, + DEFAULT_PEAK_PRICE_MIN_LEVEL, + ), + ): SelectSelector( + SelectSelectorConfig( + options=PEAK_PRICE_MIN_LEVEL_OPTIONS, + mode=SelectSelectorMode.DROPDOWN, + translation_key="current_interval_price_level", + ), + ), + vol.Optional( + CONF_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, + default=int( + options.get( + CONF_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, + DEFAULT_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_GAP_COUNT, + max=MAX_GAP_COUNT, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), - vol.Optional( - CONF_PEAK_PRICE_FLEX, - default=int( - options.get( - CONF_PEAK_PRICE_FLEX, - DEFAULT_PEAK_PRICE_FLEX, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=-50, - max=0, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, + vol.Required("flexibility_settings"): section( + vol.Schema( + { + vol.Optional( + CONF_PEAK_PRICE_FLEX, + default=int( + options.get( + CONF_PEAK_PRICE_FLEX, + DEFAULT_PEAK_PRICE_FLEX, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=-50, + max=0, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, + default=int( + options.get( + CONF_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, + DEFAULT_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=0, + max=50, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), - vol.Optional( - CONF_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, - default=int( - options.get( - CONF_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, - DEFAULT_PEAK_PRICE_MIN_DISTANCE_FROM_AVG, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=0, - max=50, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_PEAK_PRICE_MIN_LEVEL, - default=options.get( - CONF_PEAK_PRICE_MIN_LEVEL, - DEFAULT_PEAK_PRICE_MIN_LEVEL, - ), - ): SelectSelector( - SelectSelectorConfig( - options=PEAK_PRICE_MIN_LEVEL_OPTIONS, - mode=SelectSelectorMode.DROPDOWN, - translation_key="current_interval_price_level", - ), - ), - vol.Optional( - CONF_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, - default=int( - options.get( - CONF_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, - DEFAULT_PEAK_PRICE_MAX_LEVEL_GAP_COUNT, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_GAP_COUNT, - max=MAX_GAP_COUNT, - step=1, - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_ENABLE_MIN_PERIODS_PEAK, - default=options.get( - CONF_ENABLE_MIN_PERIODS_PEAK, - DEFAULT_ENABLE_MIN_PERIODS_PEAK, - ), - ): BooleanSelector(), - vol.Optional( - CONF_MIN_PERIODS_PEAK, - default=int( - options.get( - CONF_MIN_PERIODS_PEAK, - DEFAULT_MIN_PERIODS_PEAK, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=1, - max=MAX_MIN_PERIODS, - step=1, - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_RELAXATION_ATTEMPTS_PEAK, - default=int( - options.get( - CONF_RELAXATION_ATTEMPTS_PEAK, - DEFAULT_RELAXATION_ATTEMPTS_PEAK, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_RELAXATION_ATTEMPTS, - max=MAX_RELAXATION_ATTEMPTS, - step=1, - mode=NumberSelectorMode.SLIDER, + vol.Required("relaxation_and_target_periods"): section( + vol.Schema( + { + vol.Optional( + CONF_ENABLE_MIN_PERIODS_PEAK, + default=options.get( + CONF_ENABLE_MIN_PERIODS_PEAK, + DEFAULT_ENABLE_MIN_PERIODS_PEAK, + ), + ): BooleanSelector(), + vol.Optional( + CONF_MIN_PERIODS_PEAK, + default=int( + options.get( + CONF_MIN_PERIODS_PEAK, + DEFAULT_MIN_PERIODS_PEAK, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=1, + max=MAX_MIN_PERIODS, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_RELAXATION_ATTEMPTS_PEAK, + default=int( + options.get( + CONF_RELAXATION_ATTEMPTS_PEAK, + DEFAULT_RELAXATION_ATTEMPTS_PEAK, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_RELAXATION_ATTEMPTS, + max=MAX_RELAXATION_ATTEMPTS, + step=1, + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), } ) @@ -567,39 +624,46 @@ def get_price_trend_schema(options: Mapping[str, Any]) -> vol.Schema: """Return schema for price trend thresholds configuration.""" return vol.Schema( { - vol.Optional( - CONF_PRICE_TREND_THRESHOLD_RISING, - default=int( - options.get( - CONF_PRICE_TREND_THRESHOLD_RISING, - DEFAULT_PRICE_TREND_THRESHOLD_RISING, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PRICE_TREND_RISING, - max=MAX_PRICE_TREND_RISING, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, - ), - ), - vol.Optional( - CONF_PRICE_TREND_THRESHOLD_FALLING, - default=int( - options.get( - CONF_PRICE_TREND_THRESHOLD_FALLING, - DEFAULT_PRICE_TREND_THRESHOLD_FALLING, - ) - ), - ): NumberSelector( - NumberSelectorConfig( - min=MIN_PRICE_TREND_FALLING, - max=MAX_PRICE_TREND_FALLING, - step=1, - unit_of_measurement="%", - mode=NumberSelectorMode.SLIDER, + vol.Required("price_trend_thresholds"): section( + vol.Schema( + { + vol.Optional( + CONF_PRICE_TREND_THRESHOLD_RISING, + default=int( + options.get( + CONF_PRICE_TREND_THRESHOLD_RISING, + DEFAULT_PRICE_TREND_THRESHOLD_RISING, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PRICE_TREND_RISING, + max=MAX_PRICE_TREND_RISING, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + vol.Optional( + CONF_PRICE_TREND_THRESHOLD_FALLING, + default=int( + options.get( + CONF_PRICE_TREND_THRESHOLD_FALLING, + DEFAULT_PRICE_TREND_THRESHOLD_FALLING, + ) + ), + ): NumberSelector( + NumberSelectorConfig( + min=MIN_PRICE_TREND_FALLING, + max=MAX_PRICE_TREND_FALLING, + step=1, + unit_of_measurement="%", + mode=NumberSelectorMode.SLIDER, + ), + ), + } ), + {"collapsed": True}, ), } ) diff --git a/custom_components/tibber_prices/translations/de.json b/custom_components/tibber_prices/translations/de.json index 1fae8ec..9c23903 100644 --- a/custom_components/tibber_prices/translations/de.json +++ b/custom_components/tibber_prices/translations/de.json @@ -145,91 +145,153 @@ "current_interval_price_rating": { "title": "📊 Preisbewertungs-Schwellenwerte", "description": "_{step_progress}_\n\n**Konfiguriere Schwellenwerte fĂŒr Preisbewertungsstufen (niedrig/normal/hoch) basierend auf dem Vergleich mit dem nachlaufenden 24-Stunden-Durchschnitt.**\n\n---", - "data": { - "price_rating_threshold_low": "Niedrig-Schwelle", - "price_rating_threshold_high": "Hoch-Schwelle" - }, - "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: 5 bedeutet mindestens 5% unter Durchschnitt. Sensoren mit dieser Bewertung zeigen gĂŒnstige Zeitfenster an. Standard: 5%", - "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%" + "sections": { + "price_rating_thresholds": { + "name": "Preisbewertungs-Schwellenwerte", + "description": "Definiere die Einstufungen fĂŒr die Preisbewertung.", + "data": { + "price_rating_threshold_low": "Niedrig-Schwelle", + "price_rating_threshold_high": "Hoch-Schwelle" + }, + "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: 5 bedeutet mindestens 5% unter Durchschnitt. Sensoren mit dieser Bewertung zeigen gĂŒnstige Zeitfenster an. Standard: 5%", + "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%" + } + } }, "submit": "Weiter →" }, "best_price": { "title": "💚 Bestpreis-Zeitraum Einstellungen", "description": "_{step_progress}_\n\n**Konfiguration fĂŒr den Bestpreis-Zeitraum mit den niedrigsten Strompreisen.**\n\n---", - "data": { - "best_price_min_period_length": "Minimale ZeitraumlĂ€nge", - "best_price_flex": "FlexibilitĂ€t", - "best_price_min_distance_from_avg": "Mindestabstand", - "best_price_max_level": "Preisniveau-Filter", - "best_price_max_level_gap_count": "LĂŒckentoleranz", - "enable_min_periods_best": "Mindestanzahl anstreben", - "min_periods_best": "Mindestanzahl ZeitrĂ€ume", - "relaxation_attempts_best": "Lockerungsversuche" - }, - "data_description": { - "best_price_min_period_length": "Minimale Dauer, damit ein Zeitraum als 'Bestpreis' gilt. LĂ€ngere ZeitrĂ€ume sind praktischer fĂŒr den Betrieb von GerĂ€ten wie GeschirrspĂŒlern oder WĂ€rmepumpen. Bestpreis-ZeitrĂ€ume erfordern mindestens 60 Minuten (im Vergleich zu 30 Minuten fĂŒr Spitzenpreis-Warnungen), da sie sinnvolle Zeitfenster fĂŒr die Verbrauchsplanung bieten sollen, nicht nur kurze Gelegenheiten.", - "best_price_flex": "Maximal ĂŒber dem tĂ€glichen Mindestpreis, bei dem Intervalle noch als 'Bestpreis' qualifizieren. Empfehlung: 15-20 mit aktivierter Lockerung (Standard), oder 25-35 ohne Lockerung. Maximum: 50 (harte Grenze fĂŒr zuverlĂ€ssige Zeitraumerkennung).", - "best_price_min_distance_from_avg": "Stellt sicher, dass ZeitrĂ€ume signifikant gĂŒnstiger als der Tagesdurchschnitt sind, nicht nur geringfĂŒgig darunter. Dies filtert Rauschen und verhindert, dass leicht unterdurchschnittliche ZeitrĂ€ume an Tagen mit flachen Preisen als 'Bestpreis' markiert werden. Höhere Werte = strengere Filterung (nur wirklich gĂŒnstige ZeitrĂ€ume qualifizieren). Standard: 5 bedeutet, ZeitrĂ€ume mĂŒssen mindestens 5% unter dem Tagesdurchschnitt liegen.", - "best_price_max_level": "Zeigt Bestpreis-ZeitrĂ€ume nur an, wenn sie Intervalle mit Preisniveaus ≀ dem gewĂ€hlten Wert enthalten. Beispiel: Wahl von 'GĂŒnstig' bedeutet, dass der Zeitraum mindestens ein 'SEHR GÜNSTIG' oder 'GÜNSTIG' Intervall haben muss. Dies stellt sicher, dass Bestpreis-ZeitrĂ€ume nicht nur relativ gĂŒnstig fĂŒr den Tag sind, sondern tatsĂ€chlich gĂŒnstig in absoluten Zahlen. WĂ€hle 'Beliebig' um Bestpreise unabhĂ€ngig vom absoluten Preisniveau anzuzeigen.", - "best_price_max_level_gap_count": "Maximale Anzahl aufeinanderfolgender Intervalle, die exakt um eine Niveaustufe vom geforderten Level abweichen dĂŒrfen. Beispiel: Bei Filter 'GĂŒnstig' und LĂŒckentoleranz 1 wird die Sequenz 'GÜNSTIG, GÜNSTIG, NORMAL, GÜNSTIG' akzeptiert (NORMAL ist eine Stufe ĂŒber GÜNSTIG). 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).", - "enable_min_periods_best": "Wenn aktiviert, werden Filter schrittweise gelockert, falls nicht genug ZeitrĂ€ume gefunden wurden. Dies versucht die gewĂŒnschte Mindestanzahl zu erreichen, was dazu fĂŒhren kann, dass auch weniger optimale ZeitrĂ€ume als Bestpreis-ZeitrĂ€ume markiert werden.", - "min_periods_best": "Mindestanzahl an Bestpreis-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_best": "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 ZeitrĂ€ume, benötigen aber etwas mehr Rechenzeit." + "sections": { + "period_settings": { + "name": "Zeitraumdauer & Preisniveaus", + "description": "Legen Sie 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 prakti scher 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Ă€hlen Sie '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": "Kontrollieren Sie, 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": "Konfigurieren Sie automatische Filterlockerung und Zielanzahl von ZeitrĂ€umen. Aktivieren Sie '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": "Weiter →" }, "peak_price": { "title": "🔮 Spitzenpreis-Zeitraum Einstellungen", "description": "_{step_progress}_\n\n**Konfiguration fĂŒr den Spitzenpreis-Zeitraum mit den höchsten Strompreisen.**\n\n---", - "data": { - "peak_price_min_period_length": "Minimale ZeitraumlĂ€nge", - "peak_price_flex": "FlexibilitĂ€t", - "peak_price_min_distance_from_avg": "Mindestabstand", - "peak_price_min_level": "Preisniveau-Filter", - "peak_price_max_level_gap_count": "LĂŒckentoleranz", - "enable_min_periods_peak": "Mindestanzahl anstreben", - "min_periods_peak": "Mindestanzahl ZeitrĂ€ume", - "relaxation_attempts_peak": "Lockerungsversuche" - }, - "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_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.", - "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).", - "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." + "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": "Weiter →" }, "price_trend": { "title": "📈 Preistrend-Schwellenwerte", "description": "_{step_progress}_\n\n**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---", - "data": { - "price_trend_threshold_rising": "Steigend-Schwelle", - "price_trend_threshold_falling": "Fallend-Schwelle" - }, - "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: 5 bedeutet Durchschnitt ist mindestens 5% höher → Preise werden steigen. Typische Werte: 5-15%. Standard: 5%", - "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: -5 bedeutet Durchschnitt ist mindestens 5% niedriger → Preise werden fallen. Typische Werte: -5 bis -15%. Standard: -5%" + "sections": { + "price_trend_thresholds": { + "name": "Preistrend-Schwellenwerte", + "description": "Definiere die Einstufungen fĂŒr den Preistrend.", + "data": { + "price_trend_threshold_rising": "Steigend-Schwelle", + "price_trend_threshold_falling": "Fallend-Schwelle" + }, + "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: 5 bedeutet Durchschnitt ist mindestens 5% höher → Preise werden steigen. Typische Werte: 5-15%. Standard: 5%", + "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: -5 bedeutet Durchschnitt ist mindestens 5% niedriger → Preise werden fallen. Typische Werte: -5 bis -15%. Standard: -5%" + } + } }, "submit": "Weiter →" }, "volatility": { "title": "💹 VolatilitĂ€t Schwellenwerte", "description": "_{step_progress}_\n\n**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)\n\n---", - "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%" + "sections": { + "volatility_thresholds": { + "name": "VolatilitĂ€tsschwellen", + "description": "Definiere VolatilitĂ€ts-Klassifizierungsstufen.", + "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": "Weiter →" }, diff --git a/custom_components/tibber_prices/translations/en.json b/custom_components/tibber_prices/translations/en.json index 5d09465..c85f2fb 100644 --- a/custom_components/tibber_prices/translations/en.json +++ b/custom_components/tibber_prices/translations/en.json @@ -145,76 +145,132 @@ "current_interval_price_rating": { "title": "📊 Price Rating Thresholds", "description": "_{step_progress}_\n\n**Configure thresholds for price rating levels (low/normal/high) based on comparison with trailing 24-hour average.**\n\n---", - "data": { - "price_rating_threshold_low": "Low Threshold", - "price_rating_threshold_high": "High Threshold" - }, - "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: 5 means at least 5% below average. Sensors with this rating indicate favorable time windows. Default: 5%", - "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%" + "sections": { + "price_rating_thresholds": { + "name": "Price Rating Thresholds", + "description": "Define price rating classification levels.", + "data": { + "price_rating_threshold_low": "Low Threshold", + "price_rating_threshold_high": "High Threshold" + }, + "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: 5 means at least 5% below average. Sensors with this rating indicate favorable time windows. Default: 5%", + "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%" + } + } }, "submit": "Continue →" }, "best_price": { "title": "💚 Best Price Period Settings", "description": "_{step_progress}_\n\n**Configure settings for the Best Price Period binary sensor. This sensor is active during periods with the lowest electricity prices.**\n\n---", - "data": { - "best_price_min_period_length": "Minimum Period Length", - "best_price_flex": "Flexibility", - "best_price_min_distance_from_avg": "Minimum Distance", - "best_price_max_level": "Price Level Filter", - "best_price_max_level_gap_count": "Gap Tolerance", - "enable_min_periods_best": "Achieve Minimum Count", - "min_periods_best": "Minimum Periods", - "relaxation_attempts_best": "Relaxation Attempts" - }, - "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_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.", - "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).", - "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 'Try to Achieve Minimum Period 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." + "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": "Continue →" }, "peak_price": { "title": "🔮 Peak Price Period Settings", "description": "_{step_progress}_\n\n**Configure settings for the Peak Price Period binary sensor. This sensor is active during periods with the highest electricity prices.**\n\n---", - "data": { - "peak_price_min_period_length": "Minimum Period Length", - "peak_price_flex": "Flexibility", - "peak_price_min_distance_from_avg": "Minimum Distance", - "peak_price_min_level": "Price Level Filter", - "peak_price_max_level_gap_count": "Gap Tolerance", - "enable_min_periods_peak": "Achieve Minimum Count", - "min_periods_peak": "Minimum Periods", - "relaxation_attempts_peak": "Relaxation Attempts" - }, - "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_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.", - "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).", - "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 'Try to Achieve Minimum Period 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." + "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": "Continue →" }, "price_trend": { "title": "📈 Price Trend Thresholds", "description": "_{step_progress}_\n\n**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---", - "data": { - "price_trend_threshold_rising": "Rising Threshold", - "price_trend_threshold_falling": "Falling Threshold" - }, - "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: 5 means average is at least 5% higher → prices will rise. Typical values: 5-15%. Default: 5%", - "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: -5 means average is at least 5% lower → prices will fall. Typical values: -5 to -15%. Default: -5%" + "sections": { + "price_trend_thresholds": { + "name": "Price Trend Thresholds", + "description": "Define price trend classification levels.", + "data": { + "price_trend_threshold_rising": "Rising Threshold", + "price_trend_threshold_falling": "Falling Threshold" + }, + "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: 5 means average is at least 5% higher → prices will rise. Typical values: 5-15%. Default: 5%", + "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: -5 means average is at least 5% lower → prices will fall. Typical values: -5 to -15%. Default: -5%" + } + } }, "submit": "Continue →" }, @@ -226,17 +282,23 @@ "volatility": { "title": "💹 Price Volatility Thresholds", "description": "_{step_progress}_\n\n**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)\n\n---", - "data": { - "volatility_threshold_moderate": "Moderate Threshold", - "volatility_threshold_high": "High Threshold", - "volatility_threshold_very_high": "Very High Threshold" + "sections": { + "volatility_thresholds": { + "name": "Volatility Thresholds", + "description": "Define price volatility classification levels.", + "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%" + } + } }, - "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": "Next to Step 4" + "submit": "Continue →" } }, "error": { diff --git a/custom_components/tibber_prices/translations/nb.json b/custom_components/tibber_prices/translations/nb.json index f3b035d..c086f3c 100644 --- a/custom_components/tibber_prices/translations/nb.json +++ b/custom_components/tibber_prices/translations/nb.json @@ -145,91 +145,153 @@ "current_interval_price_rating": { "title": "📊 Prisvurderings-terskler", "description": "_{step_progress}_\n\n**Konfigurer terskler for prisvurderingsnivĂ„er (lav/normal/hĂžy) basert pĂ„ sammenligning med etterfĂžlgende 24-timers gjennomsnitt.**\n\n---", - "data": { - "price_rating_threshold_low": "Lav-terskel", - "price_rating_threshold_high": "HĂžy-terskel" - }, - "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: 5 betyr minst 5% under gjennomsnitt. Sensorer med denne vurderingen indikerer gunstige tidsvinduer. Standard: 5%", - "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%" + "sections": { + "price_rating_thresholds": { + "name": "Prisvurderings-terskler", + "description": "Definer prisvurderingsnivĂ„er.", + "data": { + "price_rating_threshold_low": "Lav-terskel", + "price_rating_threshold_high": "HĂžy-terskel" + }, + "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: 5 betyr minst 5% under gjennomsnitt. Sensorer med denne vurderingen indikerer gunstige tidsvinduer. Standard: 5%", + "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%" + } + } }, "submit": "Fortsett →" }, "best_price": { "title": "💚 Beste Prisperiode Innstillinger", "description": "_{step_progress}_\n\nKonfigurer innstillinger for **Beste Prisperiode** binĂŠrsensor. Denne sensoren er aktiv i perioder med de laveste strĂžmprisene.\n\n---", - "data": { - "best_price_min_period_length": "Minimum periodelengde", - "best_price_flex": "Fleksibilitet: Maksimum over minimumspris", - "best_price_min_distance_from_avg": "Minimumsavstand: PĂ„krevd under daglig gjennomsnitt", - "best_price_max_level": "PrisnivĂ„filter (valgfritt)", - "best_price_max_level_gap_count": "Gaptoleranse for nivĂ„filter", - "enable_min_periods_best": "PrĂžv Ă„ oppnĂ„ minimum antall perioder", - "min_periods_best": "Minimum antall perioder", - "relaxation_attempts_best": "Antall forsĂžk (fleksnivĂ„er)" - }, - "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 korte muligheter.", - "best_price_flex": "Maksimalt over den daglige minimumsprisen der intervaller fortsatt kvalifiserer som 'beste pris'. Anbefaling: 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.", - "best_price_max_level": "Vis kun beste prisperioder hvis de inneholder intervaller med prisnivĂ„er ≀ valgt verdi. For eksempel: Ă„ velge 'Billig' betyr at perioden mĂ„ ha minst Ă©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Ă„.", - "enable_min_periods_best": "NĂ„r aktivert vil filtrene gradvis bli lempeligere hvis det ikke blir funnet nok perioder. Dette forsĂžker Ă„ nĂ„ Ăžnsket minimum antall perioder, noe som kan fĂžre til at mindre optimale tidsrom blir markert som beste-pris-perioder.", - "min_periods_best": "Minimum antall beste-pris-perioder Ă„ sikte mot per dag. Filtre vil bli lempet trinn for trinn for Ă„ prĂžve Ă„ oppnĂ„ dette antallet. Kun aktiv nĂ„r 'PrĂžv Ă„ oppnĂ„ minimum antall perioder' er aktivert. Standard: 1", - "relaxation_attempts_best": "Hvor mange fleksnivĂ„er (forsĂžk) som testes fĂžr vi gir opp. Hvert forsĂžk kjĂžrer alle filterkombinasjoner pĂ„ det nye fleksnivĂ„et. Flere forsĂžk Ăžker sjansen for ekstra perioder, men tar litt lengre tid.", - "best_price_max_level_gap_count": "Maksimalt antall pĂ„fĂžlgende intervaller som kan avvike med nĂžyaktig Ă©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)." + "sections": { + "period_settings": { + "name": "Period Settings", + "description": "Configure period duration and price level constraints.", + "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 minimum 60 minutes (compared to 30 minutes for peak price alerts) 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 Settings", + "description": "Configure price comparison thresholds and filtering.", + "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": "Fortsett →" }, "peak_price": { "title": "🔮 Toppprisperiode Innstillinger", "description": "_{step_progress}_\n\nKonfigurer innstillinger for **Toppprisperiode** binĂŠrsensor. Denne sensoren er aktiv i perioder med de hĂžyeste strĂžmprisene.\n\n---", - "data": { - "peak_price_min_period_length": "Minimum periodelengde", - "peak_price_flex": "Fleksibilitet: Maksimum under maksimumspris", - "peak_price_min_distance_from_avg": "Minimumsavstand: PĂ„krevd over daglig gjennomsnitt", - "peak_price_min_level": "PrisnivĂ„filter (valgfritt)", - "peak_price_max_level_gap_count": "Gaptoleranse for nivĂ„filter", - "enable_min_periods_peak": "PrĂžv Ă„ oppnĂ„ minimum antall perioder", - "min_periods_peak": "Minimum antall perioder", - "relaxation_attempts_peak": "Antall forsĂžk (fleksnivĂ„er)" - }, - "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_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.", - "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Ă„.", - "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.", - "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)." + "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": "Fortsett →" }, "price_trend": { "title": "📈 Pristrendterskler", "description": "_{step_progress}_\n\n**Konfigurer terskler for pristrendsensorer. Disse sensorene sammenligner nĂ„vĂŠrende pris med gjennomsnittet av de neste N timene for Ă„ bestemme om prisene stiger, faller eller er stabile.**\n\n---", - "data": { - "price_trend_threshold_rising": "Stigende terskel", - "price_trend_threshold_falling": "Fallende terskel" - }, - "data_description": { - "price_trend_threshold_rising": "Prosentverdi for gjennomsnittlig prisĂžkning per time som kvalifiserer trenden som 'stigende'. Eksempel: 5 betyr minst 5% Ăžkning per time. Sensorer med denne trenden indikerer at prisene vil stige raskt. Standard: 5%", - "price_trend_threshold_falling": "Prosentverdi for gjennomsnittlig prisnedgang per time som kvalifiserer trenden som 'synkende'. Eksempel: -5 betyr minst 5% nedgang per time. Sensorer med denne trenden indikerer at prisene vil synke raskt. Standard: -5%" + "sections": { + "price_trend_thresholds": { + "name": "Pristrendterskler", + "description": "Definer pristrendnivĂ„er.", + "data": { + "price_trend_threshold_rising": "Stigende terskel", + "price_trend_threshold_falling": "Fallende terskel" + }, + "data_description": { + "price_trend_threshold_rising": "Prosentverdi for gjennomsnittlig prisĂžkning per time som kvalifiserer trenden som 'stigende'. Eksempel: 5 betyr minst 5% Ăžkning per time. Sensorer med denne trenden indikerer at prisene vil stige raskt. Standard: 5%", + "price_trend_threshold_falling": "Prosentverdi for gjennomsnittlig prisnedgang per time som kvalifiserer trenden som 'synkende'. Eksempel: -5 betyr minst 5% nedgang per time. Sensorer med denne trenden indikerer at prisene vil synke raskt. Standard: -5%" + } + } }, "submit": "Fortsett →" }, "volatility": { "title": "💹 Volatilitets-terskler", "description": "_{step_progress}_\n\n**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)\n\n---", - "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": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'moderat'. Eksempel: 10 betyr standardavvik ≄ 10% av gjennomsnitt. Dette indikerer Ăžkt prisustabilitet. Standard: 10%", - "volatility_threshold_high": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'hĂžy'. Eksempel: 20 betyr standardavvik ≄ 20% av gjennomsnitt. Dette indikerer betydelige prissvingninger. Standard: 20%", - "volatility_threshold_very_high": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'veldig hĂžy'. Eksempel: 30 betyr standardavvik ≄ 30% av gjennomsnitt. Dette indikerer ekstrem prisustabilitet. Standard: 30%" + "sections": { + "volatility_thresholds": { + "name": "Volatilitetsterskler", + "description": "Definer volatilitetsklassifiseringsnivĂ„er.", + "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": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'moderat'. Eksempel: 10 betyr standardavvik ≄ 10% av gjennomsnitt. Dette indikerer Ăžkt prisustabilitet. Standard: 10%", + "volatility_threshold_high": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'hĂžy'. Eksempel: 20 betyr standardavvik ≄ 20% av gjennomsnitt. Dette indikerer betydelige prissvingninger. Standard: 20%", + "volatility_threshold_very_high": "Grenseverdi for standardavvik (% av gjennomsnitt) for Ă„ klassifisere prisvariasjonen som 'veldig hĂžy'. Eksempel: 30 betyr standardavvik ≄ 30% av gjennomsnitt. Dette indikerer ekstrem prisustabilitet. Standard: 30%" + } + } }, "submit": "Fortsett →" }, diff --git a/custom_components/tibber_prices/translations/nl.json b/custom_components/tibber_prices/translations/nl.json index f5801a5..e32c4f2 100644 --- a/custom_components/tibber_prices/translations/nl.json +++ b/custom_components/tibber_prices/translations/nl.json @@ -145,91 +145,153 @@ "current_interval_price_rating": { "title": "📊 Prijsbeoordelingsdrempels", "description": "_{step_progress}_\n\n**Configureer drempels voor prijsbeoordelingsniveaus (laag/normaal/hoog) op basis van vergelijking met het lopende 24-uurs gemiddelde.**\n\n---", - "data": { - "price_rating_threshold_low": "Lage drempel", - "price_rating_threshold_high": "Hoge drempel" - }, - "data_description": { - "price_rating_threshold_low": "Percentage onder het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'laag' te kwalificeren. Voorbeeld: 5 betekent minstens 5% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdsvensters aan. Standaard: 5%", - "price_rating_threshold_high": "Percentage boven het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'hoog' te kwalificeren. Voorbeeld: 10 betekent minstens 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdsvensters. Standaard: 10%" + "sections": { + "price_rating_thresholds": { + "name": "Prijsbeoordelingsdrempels", + "description": "Definieer prijsbeoordelingsniveaus.", + "data": { + "price_rating_threshold_low": "Lage drempel", + "price_rating_threshold_high": "Hoge drempel" + }, + "data_description": { + "price_rating_threshold_low": "Percentage onder het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'laag' te kwalificeren. Voorbeeld: 5 betekent minstens 5% onder gemiddelde. Sensoren met deze beoordeling geven gunstige tijdsvensters aan. Standaard: 5%", + "price_rating_threshold_high": "Percentage boven het lopende 24-uurs gemiddelde dat de huidige prijs moet zijn om als 'hoog' te kwalificeren. Voorbeeld: 10 betekent minstens 10% boven gemiddelde. Sensoren met deze beoordeling waarschuwen voor dure tijdsvensters. Standaard: 10%" + } + } }, "submit": "Doorgaan →" }, "best_price": { "title": "💚 Beste Prijs Periode Instellingen", "description": "_{step_progress}_\n\nConfigureer instellingen voor de **Beste Prijs Periode** binaire sensor. Deze sensor is actief tijdens periodes met de laagste elektriciteitsprijzen.\n\n---", - "data": { - "best_price_min_period_length": "Minimale periodelengte", - "best_price_flex": "Flexibiliteit: Maximaal boven minimumprijs", - "best_price_min_distance_from_avg": "Minimale afstand: Vereist onder daggemiddelde", - "best_price_max_level": "Prijsniveaufilter (Optioneel)", - "best_price_max_level_gap_count": "Gaptolerantie voor niveaufilter", - "enable_min_periods_best": "Probeer minimum aantal periodes te bereiken", - "min_periods_best": "Minimum aantal periodes", - "relaxation_attempts_best": "Aantal ontspanningspogingen" - }, - "data_description": { - "best_price_min_period_length": "Minimale duur voordat een periode als 'beste prijs' wordt beschouwd. Langere periodes zijn praktischer voor het gebruik van apparaten zoals vaatwassers of warmtepompen. Beste prijs periodes vereisen minimaal 60 minuten (versus 30 minuten voor piekprijs waarschuwingen) omdat ze betekenisvolle tijdsvensters moeten bieden voor verbruiksplanning, niet alleen korte kansen.", - "best_price_flex": "Maximaal boven de dagelijkse minimumprijs waarbij intervallen nog kwalificeren als 'beste prijs'. Aanbeveling: 15-20 met versoepeling geactiveerd (standaard), of 25-35 zonder versoepeling. Maximum: 50 (harde limiet voor betrouwbare periodedetectie).", - "best_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant goedkoper zijn dan het daggemiddelde, niet slechts marginaal eronder. Dit filtert ruis en voorkomt dat licht-onder-gemiddelde periodes op dagen met vlakke prijzen als 'beste prijs' worden gemarkeerd. Hogere waarden = striktere filtering (alleen echt goedkope periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% onder het daggemiddelde moeten liggen.", - "best_price_max_level": "Toon alleen beste prijsperiodes als ze intervallen bevatten met prijsniveaus ≀ geselecteerde waarde. Bijvoorbeeld: selecteren van 'Goedkoop' betekent dat de periode minstens één 'ZEER_GOEDKOOP' of 'GOEDKOOP' interval moet hebben. Dit zorgt ervoor dat 'beste prijs'-periodes niet alleen relatief goedkoop zijn voor de dag, maar daadwerkelijk goedkoop in absolute termen. Selecteer 'Alle' om beste prijzen te tonen ongeacht hun absolute prijsniveau.", - "enable_min_periods_best": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je kansen hebt om van lage prijzen te profiteren, zelfs op dagen met ongebruikelijke prijspatronen.", - "min_periods_best": "Minimum aantal beste prijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1", - "relaxation_attempts_best": "Hoeveel keer de ontspanningslogica filters opnieuw mag proberen. Gebruik hogere waarden om meer variaties te testen als dagen extreem grillig zijn. Hogere aantallen vergen meer rekentijd maar vergroten de kans dat het gewenste minimum aantal periodes wordt gehaald.", - "best_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met 'Goedkoop' filter en gaptelling 1 wordt de reeks 'GOEDKOOP, GOEDKOOP, NORMAAL, GOEDKOOP' geaccepteerd (NORMAAL is één stap boven GOEDKOOP). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. **Let op:** Gaptolerantie vereist periodes ≄90 minuten (6 intervallen) om afwijkingen effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." + "sections": { + "period_settings": { + "name": "Period Settings", + "description": "Configure period duration and price level constraints.", + "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 minimum 60 minutes (compared to 30 minutes for peak price alerts) 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 Settings", + "description": "Configure price comparison thresholds and filtering.", + "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": "Doorgaan →" }, "peak_price": { "title": "🔮 Piekprijs Periode Instellingen", "description": "_{step_progress}_\n\nConfigureer instellingen voor de **Piekprijs Periode** binaire sensor. Deze sensor is actief tijdens periodes met de hoogste elektriciteitsprijzen.\n\n---", - "data": { - "peak_price_min_period_length": "Minimale periodelengte", - "peak_price_flex": "Flexibiliteit: Maximaal onder maximumprijs", - "peak_price_min_distance_from_avg": "Minimale afstand: Vereist boven daggemiddelde", - "peak_price_min_level": "Prijsniveaufilter (Optioneel)", - "peak_price_max_level_gap_count": "Gaptolerantie voor niveaufilter", - "enable_min_periods_peak": "Probeer minimum aantal periodes te bereiken", - "min_periods_peak": "Minimum aantal periodes", - "relaxation_attempts_peak": "Aantal ontspanningspogingen" - }, - "data_description": { - "peak_price_min_period_length": "Minimale duur voordat een periode als 'piekprijs' wordt beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (minimaal 30 minuten versus 60 minuten voor beste prijs) omdat korte dure pieken de moeite waard zijn om voor te waarschuwen, zelfs als ze te kort zijn voor verbruiksplanning.", - "peak_price_flex": "Maximaal onder de dagelijkse maximumprijs waarbij intervallen nog kwalificeren als 'piekprijs'. Aanbeveling: -15 tot -20 met versoepeling geactiveerd (standaard), of -25 tot -35 zonder versoepeling. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven de afstand onder het maximum aan.", - "peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het daggemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt dat licht-boven-gemiddelde periodes op dagen met vlakke prijzen als 'piekprijs' worden gemarkeerd. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het daggemiddelde moeten liggen.", - "peak_price_min_level": "Toon alleen piekprijs periodes als ze intervallen bevatten met prijsniveaus ≄ geselecteerde waarde. Bijvoorbeeld: selecteren van 'Duur' betekent dat de periode minstens één 'DUUR' of 'ZEER_DUUR' interval moet hebben. Dit zorgt ervoor dat 'piekprijs'-periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer 'Alle' om piekprijzen te tonen ongeacht hun absolute prijsniveau.", - "enable_min_periods_peak": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je wordt gewaarschuwd voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.", - "min_periods_peak": "Minimum aantal piekprijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1", - "relaxation_attempts_peak": "Hoeveel keer de ontspanningslogica filters opnieuw mag proberen. Gebruik meer pogingen wanneer de piekperiodes moeilijk te vinden zijn door vlakke of zeer grillige dagen. Elke extra poging kost wat extra verwerkingstijd maar vergroot de kans dat periodes worden gevonden.", - "peak_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met 'Duur' filter en gaptelling 1 wordt de reeks 'DUUR, DUUR, NORMAAL, DUUR' geaccepteerd (NORMAAL is één stap onder DUUR). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. **Let op:** Gaptolerantie vereist periodes ≄90 minuten (6 intervallen) om afwijkingen effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." + "sections": { + "period_settings": { + "name": "Periode-instellingen", + "description": "Configureer periodelengte en prijsniveaubeperkingen.", + "data": { + "peak_price_min_period_length": "Minimale periodelengte", + "peak_price_min_level": "Prijsniveaufilter", + "peak_price_max_level_gap_count": "Gaptolerantie" + }, + "data_description": { + "peak_price_min_period_length": "Minimale duur voordat een periode als 'piekprijs' wordt beschouwd. Piekprijs waarschuwingen zijn toegestaan voor kortere periodes (minimaal 30 minuten versus 60 minuten voor beste prijs) omdat korte dure pieken de moeite waard zijn om voor te waarschuwen, zelfs als ze te kort zijn voor verbruiksplanning.", + "peak_price_min_level": "Toon alleen piekprijs periodes als ze intervallen bevatten met prijsniveaus ≄ geselecteerde waarde. Bijvoorbeeld: selecteren van 'Duur' betekent dat de periode minstens één 'DUUR' of 'ZEER_DUUR' interval moet hebben. Dit zorgt ervoor dat 'piekprijs'-periodes niet alleen relatief duur zijn voor de dag, maar daadwerkelijk duur in absolute termen. Selecteer 'Alle' om piekprijzen te tonen ongeacht hun absolute prijsniveau.", + "peak_price_max_level_gap_count": "Maximum aantal opeenvolgende intervallen dat precies één niveaustap mag afwijken van het vereiste niveau. Bijvoorbeeld: met 'Duur' filter en gaptelling 1 wordt de reeks 'DUUR, DUUR, NORMAAL, DUUR' geaccepteerd (NORMAAL is één stap onder DUUR). Dit voorkomt dat periodes worden opgesplitst door incidentele niveauafwijkingen. **Let op:** Gaptolerantie vereist periodes ≄90 minuten (6 intervallen) om afwijkingen effectief te detecteren. Standaard: 0 (strikte filtering, geen tolerantie)." + } + }, + "flexibility_settings": { + "name": "Flexibiliteitsinstellingen", + "description": "Configureer prijsvergelijkingscriteria en filtering.", + "data": { + "peak_price_flex": "Flexibiliteit", + "peak_price_min_distance_from_avg": "Minimale afstand" + }, + "data_description": { + "peak_price_flex": "Maximaal onder de dagelijkse maximumprijs waarbij intervallen nog kwalificeren als 'piekprijs'. Aanbeveling: -15 tot -20 met versoepeling geactiveerd (standaard), of -25 tot -35 zonder versoepeling. Maximum: -50 (harde limiet voor betrouwbare periodedetectie). Let op: Negatieve waarden geven de afstand onder het maximum aan.", + "peak_price_min_distance_from_avg": "Zorgt ervoor dat periodes significant duurder zijn dan het daggemiddelde, niet slechts marginaal erboven. Dit filtert ruis en voorkomt dat licht-boven-gemiddelde periodes op dagen met vlakke prijzen als 'piekprijs' worden gemarkeerd. Hogere waarden = striktere filtering (alleen echt dure periodes kwalificeren). Standaard: 5 betekent dat periodes minimaal 5% boven het daggemiddelde moeten liggen." + } + }, + "relaxation_and_target_periods": { + "name": "Ontspanning en doelperiodes", + "description": "Configureer automatische filterontspanning en doelperiode-aantallen. Schakel 'Probeer minimum aantal periodes te bereiken' in om ontspanning te activeren.", + "data": { + "enable_min_periods_peak": "Probeer minimum aantal periodes te bereiken", + "min_periods_peak": "Minimum aantal periodes", + "relaxation_attempts_peak": "Aantal ontspanningspogingen" + }, + "data_description": { + "enable_min_periods_peak": "Wanneer ingeschakeld worden filters geleidelijk versoepeld als er niet genoeg periodes worden gevonden. Dit probeert het gewenste minimum aantal periodes te bereiken om ervoor te zorgen dat je wordt gewaarschuwd voor dure periodes, zelfs op dagen met ongebruikelijke prijspatronen.", + "min_periods_peak": "Minimum aantal piekprijsperiodes om naar te streven per dag. Filters worden stap voor stap versoepeld om dit aantal te proberen bereiken. Alleen actief wanneer 'Probeer minimum aantal periodes te bereiken' is ingeschakeld. Standaard: 1", + "relaxation_attempts_peak": "Hoeveel keer de ontspanningslogica filters opnieuw mag proberen. Gebruik meer pogingen wanneer de piekperiodes moeilijk te vinden zijn door vlakke of zeer grillige dagen. Elke extra poging kost wat extra verwerkingstijd maar vergroot de kans dat periodes worden gevonden." + } + } }, "submit": "Doorgaan →" }, "price_trend": { "title": "📈 Prijstrenddrempels", "description": "_{step_progress}_\n\n**Configureer drempels voor prijstrendsensoren. Deze sensoren vergelijken de huidige prijs met het gemiddelde van de volgende N uur om te bepalen of prijzen stijgen, dalen of stabiel zijn.**\n\n---", - "data": { - "price_trend_threshold_rising": "Stijgende drempel", - "price_trend_threshold_falling": "Dalende drempel" - }, - "data_description": { - "price_trend_threshold_rising": "Percentage voor gemiddelde prijsstijging per uur die de trend kwalificeert als 'stijgend'. Voorbeeld: 5 betekent minstens 5% stijging per uur. Sensoren met deze trend geven aan dat prijzen snel zullen stijgen. Standaard: 5%", - "price_trend_threshold_falling": "Percentage voor gemiddelde prijsdaling per uur die de trend kwalificeert als 'dalend'. Voorbeeld: -5 betekent minstens 5% daling per uur. Sensoren met deze trend geven aan dat prijzen snel zullen dalen. Standaard: -5%" + "sections": { + "price_trend_thresholds": { + "name": "Prijstrenddrempels", + "description": "Definieer prijstrendniveaus.", + "data": { + "price_trend_threshold_rising": "Stijgende drempel", + "price_trend_threshold_falling": "Dalende drempel" + }, + "data_description": { + "price_trend_threshold_rising": "Percentage voor gemiddelde prijsstijging per uur die de trend kwalificeert als 'stijgend'. Voorbeeld: 5 betekent minstens 5% stijging per uur. Sensoren met deze trend geven aan dat prijzen snel zullen stijgen. Standaard: 5%", + "price_trend_threshold_falling": "Percentage voor gemiddelde prijsdaling per uur die de trend kwalificeert als 'dalend'. Voorbeeld: -5 betekent minstens 5% daling per uur. Sensoren met deze trend geven aan dat prijzen snel zullen dalen. Standaard: -5%" + } + } }, "submit": "Doorgaan →" }, "volatility": { "title": "💹 Volatiliteit Drempels", "description": "_{step_progress}_\n\n**Configureer drempels voor volatiliteitsclassificatie. Volatiliteit meet relatieve prijsvariatie met behulp van de variatiecoĂ«fficiĂ«nt (VC = standaarddeviatie / gemiddelde × 100%). Deze drempels zijn percentagewaarden die werken over alle prijsniveaus.**\n\nGebruikt door:\n‱ Volatiliteitssensoren (classificatie)\n‱ Trendsensoren (adaptieve drempelaanpassing: <matig = gevoeliger, ≄hoog = minder gevoelig)\n\n---", - "data": { - "volatility_threshold_moderate": "Matige drempel", - "volatility_threshold_high": "Hoge drempel", - "volatility_threshold_very_high": "Zeer hoge drempel" - }, - "data_description": { - "volatility_threshold_moderate": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'matig' te classificeren. Voorbeeld: 10 betekent standaardafwijking ≄ 10% van gemiddelde. Dit wijst op verhoogde prijsinstabiliteit. Standaard: 10%", - "volatility_threshold_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'hoog' te classificeren. Voorbeeld: 20 betekent standaardafwijking ≄ 20% van gemiddelde. Dit wijst op aanzienlijke prijsschommelingen. Standaard: 20%", - "volatility_threshold_very_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'zeer hoog' te classificeren. Voorbeeld: 30 betekent standaardafwijking ≄ 30% van gemiddelde. Dit wijst op extreme prijsinstabiliteit. Standaard: 30%" + "sections": { + "volatility_thresholds": { + "name": "Volatiliteitdrempels", + "description": "Definieer volatiliteitsclassificatieniveaus.", + "data": { + "volatility_threshold_moderate": "Matige drempel", + "volatility_threshold_high": "Hoge drempel", + "volatility_threshold_very_high": "Zeer hoge drempel" + }, + "data_description": { + "volatility_threshold_moderate": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'matig' te classificeren. Voorbeeld: 10 betekent standaardafwijking ≄ 10% van gemiddelde. Dit wijst op verhoogde prijsinstabiliteit. Standaard: 10%", + "volatility_threshold_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'hoog' te classificeren. Voorbeeld: 20 betekent standaardafwijking ≄ 20% van gemiddelde. Dit wijst op aanzienlijke prijsschommelingen. Standaard: 20%", + "volatility_threshold_very_high": "Grenswaarde voor standaardafwijking (% van gemiddelde) om prijsvariatie als 'zeer hoog' te classificeren. Voorbeeld: 30 betekent standaardafwijking ≄ 30% van gemiddelde. Dit wijst op extreme prijsinstabiliteit. Standaard: 30%" + } + } }, "submit": "Doorgaan →" }, diff --git a/custom_components/tibber_prices/translations/sv.json b/custom_components/tibber_prices/translations/sv.json index 7ee4e3b..8e587b5 100644 --- a/custom_components/tibber_prices/translations/sv.json +++ b/custom_components/tibber_prices/translations/sv.json @@ -145,91 +145,153 @@ "current_interval_price_rating": { "title": "📊 PrisvĂ€rderingströsklar", "description": "_{step_progress}_\n\n**Konfigurera trösklar för prisvĂ€rderingsnivĂ„er (lĂ„g/normal/hög) baserat pĂ„ jĂ€mförelse med rullande 24-timmars genomsnitt.**\n\n---", - "data": { - "price_rating_threshold_low": "LĂ„g tröskel", - "price_rating_threshold_high": "Hög tröskel" - }, - "data_description": { - "price_rating_threshold_low": "Procent under det rullande 24-timmars genomsnittet som det aktuella priset mĂ„ste vara för att kvalificera som 'lĂ„g' vĂ€rdering. Exempel: 5 betyder minst 5% under genomsnitt. Sensorer med denna vĂ€rdering indikerar gynnsamma tidsfönster. Standard: 5%", - "price_rating_threshold_high": "Procent över det rullande 24-timmars genomsnittet som det aktuella priset mĂ„ste vara för att kvalificera som 'hög' vĂ€rdering. Exempel: 10 betyder minst 10% över genomsnitt. Sensorer med denna vĂ€rdering varnar för dyra tidsfönster. Standard: 10%" + "sections": { + "price_rating_thresholds": { + "name": "PrisvĂ€rderingströsklar", + "description": "Definiera prisvĂ€rderingsnivĂ„er.", + "data": { + "price_rating_threshold_low": "LĂ„g tröskel", + "price_rating_threshold_high": "Hög tröskel" + }, + "data_description": { + "price_rating_threshold_low": "Procent under det rullande 24-timmars genomsnittet som det aktuella priset mĂ„ste vara för att kvalificera som 'lĂ„g' vĂ€rdering. Exempel: 5 betyder minst 5% under genomsnitt. Sensorer med denna vĂ€rdering indikerar gynnsamma tidsfönster. Standard: 5%", + "price_rating_threshold_high": "Procent över det rullande 24-timmars genomsnittet som det aktuella priset mĂ„ste vara för att kvalificera som 'hög' vĂ€rdering. Exempel: 10 betyder minst 10% över genomsnitt. Sensorer med denna vĂ€rdering varnar för dyra tidsfönster. Standard: 10%" + } + } }, "submit": "FortsĂ€tt →" }, "best_price": { "title": "💚 BĂ€sta Pris Period InstĂ€llningar", "description": "_{step_progress}_\n\nKonfigurera instĂ€llningar för **BĂ€sta Pris Period** binĂ€r sensor. Denna sensor Ă€r aktiv under perioder med de lĂ€gsta elpriserna.\n\n---", - "data": { - "best_price_min_period_length": "Minimal periodlĂ€ngd", - "best_price_flex": "Flexibilitet: Maximalt över minimumpris", - "best_price_min_distance_from_avg": "MinimiavstĂ„nd: KrĂ€vs under dagsgenomsnitt", - "best_price_max_level": "PrisnivĂ„filter (Valfritt)", - "best_price_max_level_gap_count": "Gaptolerens för nivĂ„filter", - "enable_min_periods_best": "Försök uppnĂ„ minsta antal perioder", - "min_periods_best": "Minsta antal perioder", - "relaxation_attempts_best": "Antal avslappningsförsök" - }, - "data_description": { - "best_price_min_period_length": "Minsta varaktighet för att en period ska rĂ€knas som 'bĂ€sta pris'. LĂ€ngre perioder Ă€r mer praktiska för att köra apparater som diskmaskiner eller vĂ€rmepumpar. BĂ€sta pris-perioder krĂ€ver minst 60 minuter (jĂ€mfört med 30 minuter för topppris-varningar) eftersom de ska ge meningsfulla tidsfönster för förbruksplanering, inte bara korta tillfĂ€llen.", - "best_price_flex": "Maximalt över dagens minimumpris dĂ€r intervaller fortfarande kvalificerar som 'bĂ€sta pris'. Rekommendation: 15-20 med avslappning aktiverad (standard), eller 25-35 utan avslappning. Maximum: 50 (hĂ„rd grĂ€ns för tillförlitlig periodigkĂ€nning).", - "best_price_min_distance_from_avg": "SĂ€kerstĂ€ller att perioder Ă€r betydligt billigare Ă€n dagsgenomsnittet, inte bara marginellt under det. Detta filtrerar brus och förhindrar att nĂ„got-under-genomsnittet perioder markeras som 'bĂ€sta pris' pĂ„ dagar med platta priser. Högre vĂ€rden = striktare filtrering (endast riktigt billiga perioder kvalificerar). Standard: 5 betyder att perioder mĂ„ste vara minst 5% under dagsgenomsnittet.", - "best_price_max_level": "Visa endast bĂ€sta prisperioder om de innehĂ„ller intervall med prisnivĂ„er ≀ valt vĂ€rde. Till exempel: att vĂ€lja 'Billigt' betyder att perioden mĂ„ste ha minst ett 'MYCKET_BILLIGT' eller 'BILLIGT' intervall. Detta sĂ€kerstĂ€ller att 'bĂ€sta pris'-perioder inte bara Ă€r relativt billiga för dagen, utan faktiskt billiga i absoluta tal. VĂ€lj 'Alla' för att visa bĂ€sta priser oavsett deras absoluta prisnivĂ„.", - "enable_min_periods_best": "NĂ€r aktiverad kommer filtren att gradvis luckras upp om inte tillrĂ€ckligt mĂ„nga perioder hittas. Detta försöker uppnĂ„ det önskade minsta antalet perioder för att sĂ€kerstĂ€lla att du har möjligheter att dra nytta av lĂ„ga priser Ă€ven pĂ„ dagar med ovanliga prismönster.", - "min_periods_best": "Minsta antal bĂ€sta prisperioder att strĂ€va efter per dag. Filtren kommer att luckras upp steg för steg för att försöka uppnĂ„ detta antal. Endast aktiv nĂ€r 'Försök uppnĂ„ minsta antal perioder' Ă€r aktiverad. Standard: 1", - "relaxation_attempts_best": "Hur mĂ„nga gĂ„nger avslappningslogiken fĂ„r försöka hitta nya kombinationer av flex och filter. Öka detta om dagarna Ă€r extrema och du behöver fler försök för att nĂ„ minimikravet. Varje extra försök tar lite mer tid men ökar chansen att hitta perioder.", - "best_price_max_level_gap_count": "Maximalt antal pĂ„ varandra följande intervaller som fĂ„r avvika med exakt ett nivĂ„steg frĂ„n det erforderliga nivĂ„et. Till exempel: med 'Billigt' filter och gapantal 1 accepteras sekvensen 'BILLIGT, BILLIGT, NORMALT, BILLIGT' (NORMALT Ă€r ett steg över BILLIGT). Detta förhindrar att perioder delas upp av tillfĂ€lliga nivĂ„avvikelser. **Obs:** Gaptoleransen krĂ€ver perioder ≄90 minuter (6 intervaller) för att detektera avvikelser effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." + "sections": { + "period_settings": { + "name": "Period Settings", + "description": "Configure period duration and price level constraints.", + "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 minimum 60 minutes (compared to 30 minutes for peak price alerts) 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 Settings", + "description": "Configure price comparison thresholds and filtering.", + "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": "FortsĂ€tt →" }, "peak_price": { "title": "🔮 Topppris Period InstĂ€llningar", "description": "_{step_progress}_\n\nKonfigurera instĂ€llningar för **Topppris Period** binĂ€r sensor. Denna sensor Ă€r aktiv under perioder med de högsta elpriserna.\n\n---", - "data": { - "peak_price_min_period_length": "Minimal periodlĂ€ngd", - "peak_price_flex": "Flexibilitet: Maximalt under maximumpris", - "peak_price_min_distance_from_avg": "MinimiavstĂ„nd: KrĂ€vs över dagsgenomsnitt", - "peak_price_min_level": "PrisnivĂ„filter (Valfritt)", - "peak_price_max_level_gap_count": "Gaptolerens för nivĂ„filter", - "enable_min_periods_peak": "Försök uppnĂ„ minsta antal perioder", - "min_periods_peak": "Minsta antal perioder", - "relaxation_attempts_peak": "Antal avslappningsförsök" - }, - "data_description": { - "peak_price_min_period_length": "Minsta varaktighet för att en period ska rĂ€knas som 'toppris'. Topppris-varningar Ă€r tillĂ„tna för kortare perioder (minst 30 minuter 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örbruksplanering.", - "peak_price_flex": "Maximalt under dagens maximumpris dĂ€r intervaller fortfarande kvalificerar som 'toppris'. Rekommendation: -15 till -20 med avslappning aktiverad (standard), eller -25 till -35 utan avslappning. Maximum: -50 (hĂ„rd grĂ€ns för tillförlitlig periodigkĂ€nning). Observera: Negativa vĂ€rden anger 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 brus och förhindrar att nĂ„got-över-genomsnittet perioder markeras som 'toppris' pĂ„ dagar med platta priser. Högre vĂ€rden = striktare filtrering (endast riktigt dyra perioder kvalificerar). Standard: 5 betyder att perioder mĂ„ste vara minst 5% över dagsgenomsnittet.", - "peak_price_min_level": "Visa endast topprisperioder om de innehĂ„ller intervall med prisnivĂ„er ≄ valt vĂ€rde. Till exempel mĂ„ste perioden om du vĂ€ljer 'Dyr' ha minst ett 'DYR' eller 'MYCKET_DYR' intervall. Detta sĂ€kerstĂ€ller att 'toppris'-perioder inte bara Ă€r relativt dyra för dagen, utan faktiskt dyra i absoluta termer (inte bara 'lite dyrare Ă€n genomsnittet pĂ„ en billig dag').", - "enable_min_periods_peak": "NĂ€r aktiverad kommer filtren att gradvis luckras upp om inte tillrĂ€ckligt mĂ„nga perioder hittas. Detta försöker uppnĂ„ det önskade minsta antalet perioder för att sĂ€kerstĂ€lla att du blir varnad för dyra perioder Ă€ven pĂ„ dagar med ovanliga prismönster.", - "min_periods_peak": "Minsta antal topprisperioder att strĂ€va efter per dag. Filtren kommer att luckras upp steg för steg för att försöka uppnĂ„ detta antal. Endast aktiv nĂ€r 'Försök uppnĂ„ minsta antal perioder' Ă€r aktiverad. Standard: 1", - "relaxation_attempts_peak": "Hur mĂ„nga gĂ„nger avslappningslogiken fĂ„r försöka hitta nya kombinationer av flex och filter. Öka detta nĂ€r topperioderna Ă€r svĂ„ra att hitta pĂ„ grund av platta eller mycket volatila dagar. Fler försök ger större chans att hitta perioder men krĂ€ver lite mer berĂ€kningstid.", - "peak_price_max_level_gap_count": "Maximalt antal pĂ„ varandra följande intervaller som fĂ„r avvika med exakt ett nivĂ„steg frĂ„n det erforderliga nivĂ„et. Till exempel: med 'Dyrt' filter och gapantal 1 accepteras sekvensen 'DYRT, DYRT, NORMALT, DYRT' (NORMALT Ă€r ett steg under DYRT). Detta förhindrar att perioder delas upp av tillfĂ€lliga nivĂ„avvikelser. **Obs:** Gaptoleransen krĂ€ver perioder ≄90 minuter (6 intervaller) för att detektera avvikelser effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." + "sections": { + "period_settings": { + "name": "PeriodinstĂ€llningar", + "description": "Konfigurera periodlĂ€ngd och prisnivĂ„begrĂ€nsningar.", + "data": { + "peak_price_min_period_length": "Minimal periodlĂ€ngd", + "peak_price_min_level": "PrisnivĂ„filter", + "peak_price_max_level_gap_count": "Gaptolerens" + }, + "data_description": { + "peak_price_min_period_length": "Minsta varaktighet för att en period ska rĂ€knas som 'toppris'. Topppris-varningar Ă€r tillĂ„tna för kortare perioder (minst 30 minuter 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örbruksplanering.", + "peak_price_min_level": "Visa endast topprisperioder om de innehĂ„ller intervall med prisnivĂ„er ≄ valt vĂ€rde. Till exempel mĂ„ste perioden om du vĂ€ljer 'Dyr' ha minst ett 'DYR' eller 'MYCKET_DYR' intervall. Detta sĂ€kerstĂ€ller att 'toppris'-perioder inte bara Ă€r relativt dyra för dagen, utan faktiskt dyra i absoluta termer (inte bara 'lite dyrare Ă€n genomsnittet pĂ„ en billig dag').", + "peak_price_max_level_gap_count": "Maximalt antal pĂ„ varandra följande intervaller som fĂ„r avvika med exakt ett nivĂ„steg frĂ„n det erforderliga nivĂ„et. Till exempel: med 'Dyrt' filter och gapantal 1 accepteras sekvensen 'DYRT, DYRT, NORMALT, DYRT' (NORMALT Ă€r ett steg under DYRT). Detta förhindrar att perioder delas upp av tillfĂ€lliga nivĂ„avvikelser. **Obs:** Gaptoleransen krĂ€ver perioder ≄90 minuter (6 intervaller) för att detektera avvikelser effektivt. Standard: 0 (strikt filtrering, ingen tolerans)." + } + }, + "flexibility_settings": { + "name": "FlexibilitetsinstĂ€llningar", + "description": "Konfigurera prisjĂ€mförelsekriterer och filtrering.", + "data": { + "peak_price_flex": "Flexibilitet", + "peak_price_min_distance_from_avg": "MinimiavstĂ„nd" + }, + "data_description": { + "peak_price_flex": "Maximalt under dagens maximumpris dĂ€r intervaller fortfarande kvalificerar som 'toppris'. Rekommendation: -15 till -20 med avslappning aktiverad (standard), eller -25 till -35 utan avslappning. Maximum: -50 (hĂ„rd grĂ€ns för tillförlitlig periodigkĂ€nning). Observera: Negativa vĂ€rden anger 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 brus och förhindrar att nĂ„got-över-genomsnittet perioder markeras som 'toppris' pĂ„ dagar med platta priser. Högre vĂ€rden = striktare filtrering (endast riktigt dyra perioder kvalificerar). Standard: 5 betyder att perioder mĂ„ste vara minst 5% över dagsgenomsnittet." + } + }, + "relaxation_and_target_periods": { + "name": "Avslappning & mĂ„lperioder", + "description": "Konfigurera automatisk filteravslappning och mĂ„lperioder. Aktivera 'Försök uppnĂ„ minsta antal perioder' för att aktivera avslappning.", + "data": { + "enable_min_periods_peak": "Försök uppnĂ„ minsta antal perioder", + "min_periods_peak": "Minsta antal perioder", + "relaxation_attempts_peak": "Antal avslappningsförsök" + }, + "data_description": { + "enable_min_periods_peak": "NĂ€r aktiverad kommer filtren att gradvis luckras upp om inte tillrĂ€ckligt mĂ„nga perioder hittas. Detta försöker uppnĂ„ det önskade minsta antalet perioder för att sĂ€kerstĂ€lla att du blir varnad för dyra perioder Ă€ven pĂ„ dagar med ovanliga prismönster.", + "min_periods_peak": "Minsta antal topprisperioder att strĂ€va efter per dag. Filtren kommer att luckras upp steg för steg för att försöka uppnĂ„ detta antal. Endast aktiv nĂ€r 'Försök uppnĂ„ minsta antal perioder' Ă€r aktiverad. Standard: 1", + "relaxation_attempts_peak": "Hur mĂ„nga gĂ„nger avslappningslogiken fĂ„r försöka hitta nya kombinationer av flex och filter. Öka detta nĂ€r topperioderna Ă€r svĂ„ra att hitta pĂ„ grund av platta eller mycket volatila dagar. Fler försök ger större chans att hitta perioder men krĂ€ver lite mer berĂ€kningstid." + } + } }, "submit": "FortsĂ€tt →" }, "price_trend": { "title": "📈 Pristrendtrösklar", "description": "_{step_progress}_\n\n**Konfigurera trösklar för pristrendsensorer. Dessa sensorer jĂ€mför det aktuella priset med genomsnittet av de nĂ€sta N timmarna för att avgöra om priserna stiger, faller eller Ă€r stabila.**\n\n---", - "data": { - "price_trend_threshold_rising": "Stigande tröskel", - "price_trend_threshold_falling": "Fallande tröskel" - }, - "data_description": { - "price_trend_threshold_rising": "Procent för genomsnittlig prisökning per timme som kvalificerar trenden som 'stigande'. Exempel: 5 betyder minst 5% ökning per timme. Sensorer med denna trend indikerar att priserna kommer att stiga snabbt. Standard: 5%", - "price_trend_threshold_falling": "Procent för genomsnittlig prisminskning per timme som kvalificerar trenden som 'fallande'. Exempel: -5 betyder minst 5% minskning per timme. Sensorer med denna trend indikerar att priserna kommer att falla snabbt. Standard: -5%" + "sections": { + "price_trend_thresholds": { + "name": "Pristrendtrösklar", + "description": "Definiera pristrendnivĂ„er.", + "data": { + "price_trend_threshold_rising": "Stigande tröskel", + "price_trend_threshold_falling": "Fallande tröskel" + }, + "data_description": { + "price_trend_threshold_rising": "Procent för genomsnittlig prisökning per timme som kvalificerar trenden som 'stigande'. Exempel: 5 betyder minst 5% ökning per timme. Sensorer med denna trend indikerar att priserna kommer att stiga snabbt. Standard: 5%", + "price_trend_threshold_falling": "Procent för genomsnittlig prisminskning per timme som kvalificerar trenden som 'fallande'. Exempel: -5 betyder minst 5% minskning per timme. Sensorer med denna trend indikerar att priserna kommer att falla snabbt. Standard: -5%" + } + } }, "submit": "FortsĂ€tt →" }, "volatility": { "title": "💹 Volatilitetströsklar", "description": "_{step_progress}_\n\n**Konfigurera trösklar för volatilitetsklassificering. Volatilitet mĂ€ter relativ prisvariation med hjĂ€lp av variationskoefficienten (VK = standardavvikelse / medelvĂ€rde × 100%). Dessa trösklar Ă€r procentvĂ€rden som fungerar över alla prisnivĂ„er.**\n\nAnvĂ€nds av:\n‱ Volatilitetssensorer (klassificering)\n‱ Trendsensorer (adaptiv tröskel justering: <mĂ„ttlig = mer kĂ€nslig, ≄hög = mindre kĂ€nslig)\n\n---", - "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": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'mĂ„ttlig'. Exempel: 10 betyder standardavvikelse ≄ 10% av genomsnitt. Detta indikerar ökad prisinstabilitet. Standard: 10%", - "volatility_threshold_high": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'hög'. Exempel: 20 betyder standardavvikelse ≄ 20% av genomsnitt. Detta indikerar betydande prissvingningar. Standard: 20%", - "volatility_threshold_very_high": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'mycket hög'. Exempel: 30 betyder standardavvikelse ≄ 30% av genomsnitt. Detta indikerar extrem prisinstabilitet. Standard: 30%" + "sections": { + "volatility_thresholds": { + "name": "Volatilitetströsklar", + "description": "Definiera volatilitetsklassificeringsignivĂ„er.", + "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": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'mĂ„ttlig'. Exempel: 10 betyder standardavvikelse ≄ 10% av genomsnitt. Detta indikerar ökad prisinstabilitet. Standard: 10%", + "volatility_threshold_high": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'hög'. Exempel: 20 betyder standardavvikelse ≄ 20% av genomsnitt. Detta indikerar betydande prissvingningar. Standard: 20%", + "volatility_threshold_very_high": "GrĂ€nsvĂ€rde för standardavvikelse (% av genomsnitt) för att klassificera prisvariation som 'mycket hög'. Exempel: 30 betyder standardavvikelse ≄ 30% av genomsnitt. Detta indikerar extrem prisinstabilitet. Standard: 30%" + } + } }, "submit": "FortsĂ€tt →" },