mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
* feat(period-calc): adaptive defaults + remove volatility filter Major improvements to period calculation with smarter defaults and simplified configuration: **Adaptive Defaults:** - ENABLE_MIN_PERIODS: true (was false) - Always try to find periods - MIN_PERIODS target: 2 periods/day (ensures coverage) - BEST_PRICE_MAX_LEVEL: "cheap" (was "any") - Prefer genuinely cheap - PEAK_PRICE_MIN_LEVEL: "expensive" (was "any") - Prefer genuinely expensive - GAP_TOLERANCE: 1 (was 0) - Allow 1-level deviations in sequences - MIN_DISTANCE_FROM_AVG: 5% (was 2%) - Ensure significance - PEAK_PRICE_MIN_PERIOD_LENGTH: 30min (was 60min) - More responsive - PEAK_PRICE_FLEX: -20% (was -15%) - Better peak detection **Volatility Filter Removal:** - Removed CONF_BEST_PRICE_MIN_VOLATILITY from const.py - Removed CONF_PEAK_PRICE_MIN_VOLATILITY from const.py - Removed volatility filter UI controls from config_flow.py - Removed filter_periods_by_volatility() calls from coordinator.py - Updated all 5 translations (de, en, nb, nl, sv) **Period Calculation Logic:** - Level filter now integrated into _build_periods() (applied during interval qualification, not as post-filter) - Gap tolerance implemented via _check_level_with_gap_tolerance() - Short periods (<1.5h) use strict filtering (no gap tolerance) - Relaxation now passes level_filter + gap_count directly to PeriodConfig - show_periods check skipped when relaxation enabled (relaxation tries "any" as fallback) **Documentation:** - Complete rewrite of docs/user/period-calculation.md: * Visual examples with timelines * Step-by-step explanation of 4-step process * Configuration scenarios (5 common use cases) * Troubleshooting section with specific fixes * Advanced topics (per-day independence, early stop, etc.) - Updated README.md: "volatility" → "distance from average" Impact: Periods now reliably appear on most days with meaningful quality filters. Users get warned about expensive periods and notified about cheap opportunities without manual tuning. Relaxation ensures coverage while keeping filters as strict as possible. Breaking change: Volatility filter removed (was never a critical feature, often confused users). Existing configs continue to work (removed keys are simply ignored). * feat(periods): modularize period_utils and add statistical outlier filtering Refactored monolithic period_utils.py (1800 lines) into focused modules for better maintainability and added advanced outlier filtering with smart impact tracking. Modular structure: - types.py: Type definitions and constants (89 lines) - level_filtering.py: Level filtering with gap tolerance (121 lines) - period_building.py: Period construction from intervals (238 lines) - period_statistics.py: Statistics and summaries (318 lines) - period_merging.py: Overlap resolution (382 lines) - relaxation.py: Per-day relaxation strategy (547 lines) - core.py: Main API orchestration (251 lines) - outlier_filtering.py: Statistical spike detection (294 lines) - __init__.py: Public API exports (62 lines) New statistical outlier filtering: - Linear regression for trend-based spike detection - 2 standard deviation confidence intervals (95%) - Symmetry checking to preserve legitimate price shifts - Enhanced zigzag detection with relative volatility (catches clusters) - Replaces simple average smoothing with trend-based predictions Smart impact tracking: - Tests if original price would have passed criteria - Only counts smoothed intervals that actually changed period formation - Tracks level gap tolerance usage separately - Both attributes only appear when > 0 (clean UI) New period attributes: - period_interval_smoothed_count: Intervals kept via outlier smoothing - period_interval_level_gap_count: Intervals kept via gap tolerance Impact: Statistical outlier filtering prevents isolated price spikes from breaking continuous periods while preserving data integrity. All statistics use original prices. Smart tracking shows only meaningful interventions, making it clear when tolerance mechanisms actually influenced results. Backwards compatible: All public APIs re-exported from period_utils package. * Update docs/user/period-calculation.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update custom_components/tibber_prices/const.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update custom_components/tibber_prices/coordinator.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update custom_components/tibber_prices/const.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * docs(periods): fix corrupted period-calculation.md and add outlier filtering documentation Completely rewrote period-calculation.md after severe corruption (massive text duplication throughout the file made it 2489 lines). Changes: - Fixed formatting: Removed all duplicate text and headers - Reduced file size: 2594 lines down to 516 lines (clean, readable structure) - Added section 5: "Statistical Outlier Filtering (NEW)" explaining: - Linear regression-based spike detection (95% confidence intervals) - Symmetry checking to preserve legitimate price shifts - Enhanced zigzag detection with relative volatility - Data integrity guarantees (original prices always used) - New period attributes: period_interval_smoothed_count - Added troubleshooting: "Price spikes breaking periods" section - Added technical details: Algorithm constants and implementation notes Impact: Users can now understand how outlier filtering prevents isolated price spikes from breaking continuous periods. Documentation is readable again with no duplicate content. * fix(const): improve clarity in comments regarding period lengths for price alerts * docs(periods): improve formatting and clarity in period-calculation.md * Initial plan * refactor: convert flexibility_pct to ratio once at function entry Co-authored-by: jpawlowski <75446+jpawlowski@users.noreply.github.com> * Update custom_components/tibber_prices/const.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update custom_components/tibber_prices/period_utils/period_building.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update custom_components/tibber_prices/period_utils/relaxation.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Julian Pawlowski <jpawlowski@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
518 lines
25 KiB
JSON
518 lines
25 KiB
JSON
{
|
|
"config": {
|
|
"step": {
|
|
"user": {
|
|
"description": "Richte Tibber Preisinformationen & Bewertungen ein.\n\nUm einen API-Zugriffstoken zu generieren, besuche https://developer.tibber.com.",
|
|
"data": {
|
|
"access_token": "API-Zugriffstoken"
|
|
},
|
|
"submit": "Token validieren"
|
|
},
|
|
"select_home": {
|
|
"description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.",
|
|
"data": {
|
|
"home_id": "Zuhause"
|
|
},
|
|
"title": "Wähle ein Zuhause",
|
|
"submit": "Zuhause auswählen"
|
|
},
|
|
"finish": {
|
|
"description": "Wähle ein Zuhause, um Preisinformationen und Bewertungen abzurufen.",
|
|
"data": {
|
|
"home_id": "Home ID"
|
|
},
|
|
"title": "Wähle ein Zuhause",
|
|
"submit": "Zuhause auswählen"
|
|
},
|
|
"reauth_confirm": {
|
|
"title": "Tibber Preis-Integration erneut authentifizieren",
|
|
"description": "Der Zugriffstoken für Tibber ist nicht mehr gültig. Bitte gib einen neuen API-Zugriffstoken ein, um diese Integration weiter zu nutzen.\n\nUm einen neuen API-Zugriffstoken zu generieren, besuche https://developer.tibber.com.",
|
|
"data": {
|
|
"access_token": "API-Zugriffstoken"
|
|
},
|
|
"submit": "Token aktualisieren"
|
|
}
|
|
},
|
|
"error": {
|
|
"auth": "Der Tibber Zugangstoken ist ungültig.",
|
|
"connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.",
|
|
"unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.",
|
|
"cannot_connect": "Verbindung fehlgeschlagen",
|
|
"invalid_access_token": "Ungültiges Zugriffstoken",
|
|
"missing_homes": "Der neue Zugriffstoken hat keinen Zugriff auf alle konfigurierten Zuhause. Bitte verwende einen Zugriffstoken, der Zugriff auf die gleichen Tibber-Zuhause hat."
|
|
},
|
|
"abort": {
|
|
"already_configured": "Integration ist bereits konfiguriert",
|
|
"entry_not_found": "Tibber Konfigurationseintrag nicht gefunden.",
|
|
"setup_complete": "Einrichtung abgeschlossen! Du kannst zusätzliche Optionen für Tibber Preise in den Integrationsoptionen ändern, nachdem du diesen Dialog geschlossen hast.",
|
|
"reauth_successful": "Erneute Authentifizierung erfolgreich. Die Integration wurde mit dem neuen Zugriffstoken aktualisiert."
|
|
}
|
|
},
|
|
"common": {
|
|
"step_progress": "Schritt {step_num} von {total_steps}"
|
|
},
|
|
"config_subentries": {
|
|
"home": {
|
|
"initiate_flow": {
|
|
"user": "Tibber Zuhause hinzufügen"
|
|
},
|
|
"title": "Tibber Zuhause hinzufügen",
|
|
"step": {
|
|
"user": {
|
|
"title": "Tibber Zuhause hinzufügen",
|
|
"description": "Wähle ein Zuhause aus, das du zu deiner Tibber-Integration hinzufügen möchtest.",
|
|
"data": {
|
|
"home_id": "Zuhause"
|
|
}
|
|
}
|
|
},
|
|
"error": {
|
|
"api_error": "Fehler beim Abrufen der Zuhause von der Tibber API"
|
|
},
|
|
"abort": {
|
|
"no_parent_entry": "Übergeordneter Eintrag nicht gefunden",
|
|
"no_access_token": "Kein Zugriffstoken verfügbar",
|
|
"home_not_found": "Ausgewähltes Zuhause nicht gefunden",
|
|
"api_error": "Fehler beim Abrufen der Zuhause von der Tibber API",
|
|
"no_available_homes": "Keine zusätzlichen Zuhause verfügbar. Alle Zuhause von deinem Tibber-Konto wurden bereits hinzugefügt."
|
|
}
|
|
}
|
|
},
|
|
"options": {
|
|
"step": {
|
|
"init": {
|
|
"title": "Allgemeine Einstellungen",
|
|
"description": "{step_progress}\n\nKonfiguration allgemeiner Einstellungen für Tibber Preisinformationen & Bewertungen.\n\nBenutzer: {user_login}",
|
|
"data": {
|
|
"extended_descriptions": "Erweiterte Beschreibungen in Entity-Attributen anzeigen"
|
|
},
|
|
"submit": "Weiter zu Schritt 2"
|
|
},
|
|
"price_rating": {
|
|
"title": "Preisbewertungs-Schwellwerte",
|
|
"description": "{step_progress}\n\nKonfiguration der Schwellwerte für Preisbewertungsstufen (niedrig/normal/hoch) basierend auf dem Vergleich mit dem gleitenden 24-Stunden-Durchschnitt.",
|
|
"data": {
|
|
"price_rating_threshold_low": "Schwellwert für niedrige Bewertung (unter gleitendem Durchschnitt)",
|
|
"price_rating_threshold_high": "Schwellwert für hohe Bewertung (über gleitendem Durchschnitt)"
|
|
},
|
|
"submit": "Weiter zu Schritt 3"
|
|
},
|
|
"best_price": {
|
|
"title": "Bestpreis-Periode Einstellungen",
|
|
"description": "{step_progress}\n\nKonfiguration für den Bestpreis-Periode Binärsensor. Dieser Sensor ist während der Zeiträume mit den niedrigsten Strompreisen aktiv.",
|
|
"data": {
|
|
"best_price_min_period_length": "Minimale Periodenlänge",
|
|
"best_price_flex": "Flexibilität: Maximal über dem Mindestpreis",
|
|
"best_price_min_distance_from_avg": "Mindestabstand: Erforderlich unter dem Tagesdurchschnitt",
|
|
"best_price_max_level": "Preisniveau-Filter (Optional)",
|
|
"best_price_max_level_gap_count": "Lückentoleranz für Niveaufilter",
|
|
"enable_min_periods_best": "Mindestanzahl Perioden anstreben",
|
|
"min_periods_best": "Mindestanzahl Perioden",
|
|
"relaxation_step_best": "Lockerungsschritt"
|
|
},
|
|
"data_description": {
|
|
"best_price_max_level": "Zeigt Bestpreis-Perioden nur an, wenn sie Intervalle mit Preisniveaus ≤ dem gewählten Wert enthalten. Beispiel: Wahl von 'Günstig' bedeutet, dass die Periode mindestens ein 'SEHR_GÜNSTIG' oder 'GÜNSTIG' Intervall haben muss. Dies stellt sicher, dass 'Bestpreis'-Perioden 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 Perioden durch gelegentliche Niveau-Abweichungen aufgespalten werden. Standard: 0 (strenge Filterung, keine Toleranz).",
|
|
"enable_min_periods_best": "Wenn aktiviert, werden Filter schrittweise gelockert, falls nicht genug Perioden gefunden wurden. Dies versucht die gewünschte Mindestanzahl zu erreichen, was dazu führen kann, dass auch weniger optimale Zeiträume als Bestpreis-Perioden markiert werden.",
|
|
"min_periods_best": "Mindestanzahl an Bestpreis-Perioden, die pro Tag angestrebt werden. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv, wenn 'Mindestanzahl Perioden anstreben' aktiviert ist. Standard: 1",
|
|
"relaxation_step_best": "Prozentsatz des ursprünglichen Flexibilitätsschwellwerts, der pro Lockerungsschritt addiert wird. Beispiel: Bei 15% Flexibilität und 25% Schrittgröße werden 15%, 18,75%, 22,5% usw. versucht. Höhere Werte bedeuten schnellere Lockerung, aber geringere Präzision."
|
|
},
|
|
"submit": "Weiter zu Schritt 5"
|
|
},
|
|
"peak_price": {
|
|
"title": "Spitzenpreis-Periode Einstellungen",
|
|
"description": "{step_progress}\n\nKonfiguration für den Spitzenpreis-Periode Binärsensor. Dieser Sensor ist während der Zeiträume mit den höchsten Strompreisen aktiv.",
|
|
"data": {
|
|
"peak_price_min_period_length": "Minimale Periodenlänge",
|
|
"peak_price_flex": "Flexibilität: Maximal unter dem Höchstpreis (negativer Wert)",
|
|
"peak_price_min_distance_from_avg": "Mindestabstand: Erforderlich über dem Tagesdurchschnitt",
|
|
"peak_price_min_level": "Preisniveau-Filter (Optional)",
|
|
"peak_price_max_level_gap_count": "Lückentoleranz für Niveaufilter",
|
|
"enable_min_periods_peak": "Mindestanzahl Perioden anstreben",
|
|
"min_periods_peak": "Mindestanzahl Perioden",
|
|
"relaxation_step_peak": "Lockerungsschritt"
|
|
},
|
|
"data_description": {
|
|
"peak_price_min_level": "Zeigt Spitzenpreis-Perioden nur an, wenn sie Intervalle mit Preisniveaus ≥ dem gewählten Wert enthalten. Beispiel: Wahl von 'Teuer' bedeutet, dass die Periode mindestens ein 'TEUER' oder 'SEHR_TEUER' Intervall haben muss. Dies stellt sicher, dass 'Spitzenpreis'-Perioden 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 Perioden durch gelegentliche Niveau-Abweichungen aufgespalten werden. Standard: 0 (strenge Filterung, keine Toleranz).",
|
|
"enable_min_periods_peak": "Wenn aktiviert, werden Filter schrittweise gelockert, falls nicht genug Perioden gefunden wurden. Dies versucht die gewünschte Mindestanzahl zu erreichen, um sicherzustellen, dass du auch an Tagen mit ungewöhnlichen Preismustern vor teuren Perioden gewarnt wirst.",
|
|
"min_periods_peak": "Mindestanzahl an Spitzenpreis-Perioden, die pro Tag angestrebt werden. Filter werden schrittweise gelockert, um diese Anzahl zu erreichen. Nur aktiv, wenn 'Mindestanzahl Perioden anstreben' aktiviert ist. Standard: 1",
|
|
"relaxation_step_peak": "Prozentsatz des ursprünglichen Flexibilitätsschwellwerts, der pro Lockerungsschritt addiert wird. Beispiel: Bei -15% Flexibilität und 25% Schrittgröße werden -15%, -18,75%, -22,5% usw. versucht. Höhere Werte bedeuten schnellere Lockerung, aber geringere Präzision."
|
|
},
|
|
"submit": "Weiter zu Schritt 6"
|
|
},
|
|
"price_trend": {
|
|
"title": "Preistrend-Schwellenwerte",
|
|
"description": "{step_progress}\n\nKonfiguriere 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.",
|
|
"data": {
|
|
"price_trend_threshold_rising": "Steigender Schwellenwert (über dem aktuellen Preis)",
|
|
"price_trend_threshold_falling": "Fallender Schwellenwert (unter dem aktuellen Preis, negativer Wert)"
|
|
},
|
|
"submit": "Konfiguration abschließen"
|
|
},
|
|
"volatility": {
|
|
"title": "Preisvolatilität Schwellenwerte",
|
|
"description": "{step_progress}\n\nKonfiguriere Schwellenwerte für die Volatilitätsklassifizierung. Volatilität misst Preisschwankungen (Spanne zwischen Min/Max) in kleinster Währungseinheit. Diese Schwellenwerte werden von Volatilitätssensoren und Periodenfiltern verwendet.",
|
|
"data": {
|
|
"volatility_threshold_moderate": "Moderate Schwelle (Spanne ≥ dieser Wert)",
|
|
"volatility_threshold_high": "Hohe Schwelle (Spanne ≥ dieser Wert)",
|
|
"volatility_threshold_very_high": "Sehr hohe Schwelle (Spanne ≥ dieser Wert)"
|
|
},
|
|
"submit": "Weiter zu Schritt 4"
|
|
}
|
|
},
|
|
"error": {
|
|
"auth": "Der Tibber Zugangstoken ist ungültig.",
|
|
"connection": "Verbindung zu Tibber nicht möglich. Bitte überprüfe deine Internetverbindung.",
|
|
"unknown": "Ein unerwarteter Fehler ist aufgetreten. Bitte überprüfe die Logs für Details.",
|
|
"cannot_connect": "Verbindung fehlgeschlagen",
|
|
"invalid_access_token": "Ungültiges Zugriffstoken",
|
|
"different_home": "Der Zugriffstoken ist nicht gültig für die Home ID, für die diese Integration konfiguriert ist."
|
|
},
|
|
"abort": {
|
|
"entry_not_found": "Tibber Konfigurationseintrag nicht gefunden."
|
|
},
|
|
"best_price_flex": "Bestpreis Flexibilität (%)",
|
|
"peak_price_flex": "Spitzenpreis Flexibilität (%)",
|
|
"price_rating_threshold_low": "Niedriger Preis Schwellenwert (% zum gleitenden Durchschnitt)",
|
|
"price_rating_threshold_high": "Hoher Preis Schwellenwert (% zum gleitenden Durchschnitt)"
|
|
},
|
|
"entity": {
|
|
"sensor": {
|
|
"current_price": {
|
|
"name": "Aktueller Strompreis"
|
|
},
|
|
"next_interval_price": {
|
|
"name": "Nächster Preis"
|
|
},
|
|
"previous_interval_price": {
|
|
"name": "Vorheriger Preis"
|
|
},
|
|
"current_hour_average": {
|
|
"name": "Aktueller Stunden-Durchschnittspreis"
|
|
},
|
|
"next_hour_average": {
|
|
"name": "Nächster Stunden-Durchschnittspreis"
|
|
},
|
|
"price_level": {
|
|
"name": "Aktuelles Preisniveau",
|
|
"state": {
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
},
|
|
"next_interval_price_level": {
|
|
"name": "Nächstes Preisniveau",
|
|
"state": {
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
},
|
|
"previous_interval_price_level": {
|
|
"name": "Vorheriges Preisniveau",
|
|
"state": {
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
},
|
|
"current_hour_price_level": {
|
|
"name": "Aktuelles Stunden-Preisniveau",
|
|
"state": {
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
},
|
|
"next_hour_price_level": {
|
|
"name": "Nächstes Stunden-Preisniveau",
|
|
"state": {
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
},
|
|
"lowest_price_today": {
|
|
"name": "Mindestpreis heute"
|
|
},
|
|
"highest_price_today": {
|
|
"name": "Höchstpreis heute"
|
|
},
|
|
"average_price_today": {
|
|
"name": "Durchschnittspreis heute"
|
|
},
|
|
"lowest_price_tomorrow": {
|
|
"name": "Mindestpreis morgen"
|
|
},
|
|
"highest_price_tomorrow": {
|
|
"name": "Höchstpreis morgen"
|
|
},
|
|
"average_price_tomorrow": {
|
|
"name": "Durchschnittspreis morgen"
|
|
},
|
|
"trailing_price_average": {
|
|
"name": "Nachlaufender 24h-Durchschnittspreis"
|
|
},
|
|
"leading_price_average": {
|
|
"name": "Vorlaufender 24h-Durchschnittspreis"
|
|
},
|
|
"trailing_price_min": {
|
|
"name": "Nachlaufender 24h-Mindestpreis"
|
|
},
|
|
"trailing_price_max": {
|
|
"name": "Nachlaufender 24h-Höchstpreis"
|
|
},
|
|
"leading_price_min": {
|
|
"name": "Vorlaufender 24h-Mindestpreis"
|
|
},
|
|
"leading_price_max": {
|
|
"name": "Vorlaufender 24h-Höchstpreis"
|
|
},
|
|
"price_rating": {
|
|
"name": "Aktuelle Preisbewertung",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"normal": "Normal",
|
|
"high": "Hoch"
|
|
}
|
|
},
|
|
"next_interval_price_rating": {
|
|
"name": "Nächste Preisbewertung",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"normal": "Normal",
|
|
"high": "Hoch"
|
|
}
|
|
},
|
|
"previous_interval_price_rating": {
|
|
"name": "Vorherige Preisbewertung",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"normal": "Normal",
|
|
"high": "Hoch"
|
|
}
|
|
},
|
|
"current_hour_price_rating": {
|
|
"name": "Aktuelle Stunden-Preisbewertung",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"normal": "Normal",
|
|
"high": "Hoch"
|
|
}
|
|
},
|
|
"next_hour_price_rating": {
|
|
"name": "Nächste Stunden-Preisbewertung",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"normal": "Normal",
|
|
"high": "Hoch"
|
|
}
|
|
},
|
|
"next_avg_1h": {
|
|
"name": "Durchschnittspreis nächste 1h"
|
|
},
|
|
"next_avg_2h": {
|
|
"name": "Durchschnittspreis nächste 2h"
|
|
},
|
|
"next_avg_3h": {
|
|
"name": "Durchschnittspreis nächste 3h"
|
|
},
|
|
"next_avg_4h": {
|
|
"name": "Durchschnittspreis nächste 4h"
|
|
},
|
|
"next_avg_5h": {
|
|
"name": "Durchschnittspreis nächste 5h"
|
|
},
|
|
"next_avg_6h": {
|
|
"name": "Durchschnittspreis nächste 6h"
|
|
},
|
|
"next_avg_8h": {
|
|
"name": "Durchschnittspreis nächste 8h"
|
|
},
|
|
"next_avg_12h": {
|
|
"name": "Durchschnittspreis nächste 12h"
|
|
},
|
|
"price_trend_1h": {
|
|
"name": "Preistrend (1h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_2h": {
|
|
"name": "Preistrend (2h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_3h": {
|
|
"name": "Preistrend (3h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_4h": {
|
|
"name": "Preistrend (4h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_5h": {
|
|
"name": "Preistrend (5h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_6h": {
|
|
"name": "Preistrend (6h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_8h": {
|
|
"name": "Preistrend (8h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"price_trend_12h": {
|
|
"name": "Preistrend (12h)",
|
|
"state": {
|
|
"rising": "Steigend",
|
|
"falling": "Fallend",
|
|
"stable": "Stabil"
|
|
}
|
|
},
|
|
"daily_rating": {
|
|
"name": "Tägliche Preisbewertung"
|
|
},
|
|
"monthly_rating": {
|
|
"name": "Monatliche Preisbewertung"
|
|
},
|
|
"data_timestamp": {
|
|
"name": "Preisdaten-Ablauf"
|
|
},
|
|
"today_volatility": {
|
|
"name": "Preisvolatilität heute",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"moderate": "Moderat",
|
|
"high": "Hoch",
|
|
"very_high": "Sehr hoch"
|
|
}
|
|
},
|
|
"tomorrow_volatility": {
|
|
"name": "Preisvolatilität morgen",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"moderate": "Moderat",
|
|
"high": "Hoch",
|
|
"very_high": "Sehr hoch"
|
|
}
|
|
},
|
|
"next_24h_volatility": {
|
|
"name": "Preisvolatilität der nächsten 24h",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"moderate": "Moderat",
|
|
"high": "Hoch",
|
|
"very_high": "Sehr hoch"
|
|
}
|
|
},
|
|
"today_tomorrow_volatility": {
|
|
"name": "Preisvolatilität heute+morgen",
|
|
"state": {
|
|
"low": "Niedrig",
|
|
"moderate": "Moderat",
|
|
"high": "Hoch",
|
|
"very_high": "Sehr hoch"
|
|
}
|
|
},
|
|
"price_forecast": {
|
|
"name": "Preisprognose"
|
|
}
|
|
},
|
|
"binary_sensor": {
|
|
"peak_price_period": {
|
|
"name": "Spitzenpreis-Periode"
|
|
},
|
|
"best_price_period": {
|
|
"name": "Bestpreis-Periode"
|
|
},
|
|
"connection": {
|
|
"name": "Tibber API-Verbindung"
|
|
},
|
|
"tomorrow_data_available": {
|
|
"name": "Daten für morgen verfügbar"
|
|
}
|
|
}
|
|
},
|
|
"issues": {
|
|
"new_homes_available": {
|
|
"title": "Neue Tibber-Häuser erkannt",
|
|
"description": "Wir haben {count} neue(s) Zuhause in deinem Tibber-Konto erkannt: {homes}. Du kannst diese über die Tibber-Integration in Home Assistant hinzufügen."
|
|
},
|
|
"homes_removed": {
|
|
"title": "Tibber-Häuser entfernt",
|
|
"description": "Wir haben erkannt, dass {count} Zuhause aus deinem Tibber-Konto entfernt wurde(n): {homes}. Bitte überprüfe deine Tibber-Integrationskonfiguration."
|
|
}
|
|
},
|
|
"services": {
|
|
"refresh_user_data": {
|
|
"name": "Benutzerdaten aktualisieren",
|
|
"description": "Erzwingt eine Aktualisierung der Benutzerdaten (Häuser, Profilinformationen) aus der Tibber API. Dies kann nützlich sein, nachdem Änderungen an deinem Tibber-Konto vorgenommen wurden oder bei der Fehlerbehebung von Verbindungsproblemen.",
|
|
"fields": {
|
|
"entry_id": {
|
|
"name": "Eintrag-ID",
|
|
"description": "Die Konfigurationseintrag-ID für die Tibber-Integration."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"selector": {
|
|
"volatility": {
|
|
"options": {
|
|
"low": "Niedrig",
|
|
"moderate": "Moderat",
|
|
"high": "Hoch",
|
|
"very_high": "Sehr hoch"
|
|
}
|
|
},
|
|
"price_level": {
|
|
"options": {
|
|
"any": "Beliebig",
|
|
"very_cheap": "Sehr günstig",
|
|
"cheap": "Günstig",
|
|
"normal": "Normal",
|
|
"expensive": "Teuer",
|
|
"very_expensive": "Sehr teuer"
|
|
}
|
|
}
|
|
},
|
|
"title": "Tibber Preisinformationen & Bewertungen"
|
|
}
|