{ "config": { "step": { "user": { "description": "Set up Tibber Price Information & Ratings.\n\nTo generate an API access token, visit https://developer.tibber.com.", "data": { "access_token": "API access token" }, "submit": "Validate Token" }, "select_home": { "description": "Select a home to fetch price information and ratings.", "data": { "home_id": "Home" }, "title": "Pick a Home", "submit": "Select Home" }, "finish": { "description": "Select a home to fetch price information and ratings.", "data": { "home_id": "Home ID" }, "title": "Pick a home", "submit": "Select Home" }, "reauth_confirm": { "title": "Reauthenticate Tibber Price Integration", "description": "The access token for Tibber is no longer valid. Please enter a new API access token to continue using this integration.\n\nTo generate a new API access token, visit https://developer.tibber.com.", "data": { "access_token": "API access token" }, "submit": "Update Token" } }, "error": { "auth": "The Tibber Access Token is invalid.", "connection": "Unable to connect to Tibber. Please check your internet connection.", "unknown": "Unexpected error", "cannot_connect": "Failed to connect", "invalid_access_token": "Invalid access token", "missing_homes": "The new access token does not have access to all configured homes. Please use an access token that has access to the same Tibber homes.", "invalid_yaml_syntax": "Invalid YAML syntax. Please check indentation, colons, and special characters.", "invalid_yaml_structure": "YAML must be a dictionary/object (key: value pairs), not a list or plain text.", "service_call_failed": "Service call validation failed: {error_detail}" }, "abort": { "already_configured": "Integration is already configured", "entry_not_found": "Tibber configuration entry not found.", "setup_complete": "Setup complete! You can change additional options for Tibber Prices in the integration's options after closing this dialog.", "reauth_successful": "Reauthentication successful. The integration has been updated with the new access token." } }, "common": { "step_progress": "Step {step_num} of {total_steps}" }, "config_subentries": { "home": { "initiate_flow": { "user": "Add Tibber Home" }, "title": "Add Tibber Home", "step": { "user": { "title": "Add Tibber Home", "description": "Select a home to add to your Tibber integration.\n\n**Note:** After adding this home, you can add additional homes from the integration's context menu by selecting \"Add Tibber Home\".", "data": { "home_id": "Home" } } }, "error": { "api_error": "Failed to fetch homes from Tibber API" }, "abort": { "no_parent_entry": "Parent entry not found", "no_access_token": "No access token available", "home_not_found": "Selected home not found", "api_error": "Failed to fetch homes from Tibber API", "no_available_homes": "No additional homes available to add. All homes from your Tibber account have already been added." } } }, "options": { "step": { "init": { "title": "General Settings", "description": "{step_progress}\n\nConfigure general settings for Tibber Price Information & Ratings.\n\nUser: {user_login}", "data": { "extended_descriptions": "Show extended descriptions in entity attributes" }, "submit": "Next to Step 2" }, "current_interval_price_rating": { "title": "Price Rating Thresholds", "description": "{step_progress}\n\nConfigure thresholds for price rating levels (low/normal/high) based on comparison with trailing 24-hour average.", "data": { "price_rating_threshold_low": "Low Rating Threshold (below trailing average)", "price_rating_threshold_high": "High Rating Threshold (above trailing average)" }, "submit": "Next to Step 3" }, "best_price": { "title": "Best Price Period Settings", "description": "{step_progress}\n\nConfigure settings for the Best Price Period binary sensor. This sensor is active during periods with the lowest electricity prices.", "data": { "best_price_min_period_length": "Minimum Period Length", "best_price_flex": "Flexibility: Maximum above minimum price", "best_price_min_distance_from_avg": "Minimum Distance: Required below daily average", "best_price_max_level": "Price Level Filter (Optional)", "best_price_max_level_gap_count": "Level Filter Gap Tolerance", "enable_min_periods_best": "Try to Achieve Minimum Period Count", "min_periods_best": "Minimum Periods Required", "relaxation_step_best": "Filter Relaxation Step Size", "relaxation_attempts_best": "Relaxation Attempts" }, "data_description": { "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. 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_step_best": "Percentage of the original flexibility threshold to add per relaxation step. For example: with 15% flexibility and 25% step size, filters will try 15%, 18.75%, 22.5%, etc. Higher values mean faster relaxation but less precision.", "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": "Next to Step 5" }, "peak_price": { "title": "Peak Price Period Settings", "description": "{step_progress}\n\nConfigure settings for the Peak Price Period binary sensor. This sensor is active during periods with the highest electricity prices.", "data": { "peak_price_min_period_length": "Minimum Period Length", "peak_price_flex": "Flexibility: Maximum below maximum price (negative value)", "peak_price_min_distance_from_avg": "Minimum Distance: Required above daily average", "peak_price_min_level": "Price Level Filter (Optional)", "peak_price_max_level_gap_count": "Level Filter Gap Tolerance", "enable_min_periods_peak": "Try to Achieve Minimum Period Count", "min_periods_peak": "Minimum Periods Required", "relaxation_step_peak": "Filter Relaxation Step Size", "relaxation_attempts_peak": "Relaxation Attempts" }, "data_description": { "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. 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_step_peak": "Percentage of the original flexibility threshold to add per relaxation step. For example: with -15% flexibility and 25% step size, filters will try -15%, -18.75%, -22.5%, etc. Higher values mean faster relaxation but less precision.", "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": "Next to Step 6" }, "price_trend": { "title": "Price Trend Thresholds", "description": "{step_progress}\n\nConfigure thresholds for price trend sensors. These sensors compare the current price with the average of the next N hours to determine if prices are rising, falling, or stable.", "data": { "price_trend_threshold_rising": "Rising Threshold (above current price)", "price_trend_threshold_falling": "Falling Threshold (below current price, negative value)" }, "submit": "Next to Step 7" }, "chart_data_export": { "title": "Chart Data Export", "description": "{step_progress}\n\n**⚠️ This step is optional** and only relevant if you plan to enable the **Chart Data Export** diagnostic sensor.\n\n**⚠️ IMPORTANT: Legacy Feature**\nThis sensor exists for **backwards compatibility** with tools that can only read entity attributes (e.g., older ApexCharts versions). **For new integrations, use the `tibber_prices.get_chartdata` service directly** - it's more flexible, efficient, and the recommended Home Assistant approach.\n\n**When to use this sensor:**\n- ✅ Your dashboard tool can ONLY read attributes (not call services)\n- ✅ You need static data that updates automatically\n- ❌ NOT recommended for new integrations that support service calls\n\n**What is this sensor?**\nThis sensor calls the `tibber_prices.get_chartdata` service with your custom YAML parameters and exposes the result as entity attributes.\n\n**How to use it:**\n1. **Complete this configuration** (or leave empty for service defaults)\n2. Go to **Settings → Devices & Services → Tibber Prices**\n3. Click on your home → Find **'Chart Data Export'** in the **Diagnostic** section\n4. Enable the sensor - it will automatically call the service with your configuration\n5. Use the sensor's attributes in your dashboard cards\n\n**Configuration guide:**\n1. Test your service call in **Developer Tools → Services → `tibber_prices.get_chartdata`**\n2. Copy the YAML from the `data:` section (without `entry_id`)\n3. Paste it below (use **Shift+Enter** or **Ctrl+Enter** for new lines, NOT just Enter)\n\n**Example YAML:**\n```yaml\nday:\n - today\n - tomorrow\ninclude_level: true\ninclude_rating_level: true\n```\n\n**Note:** Leave empty to use service defaults or skip this feature if you don't need the sensor.", "data": { "chart_data_config": "Service Configuration (YAML)" }, "data_description": { "chart_data_config": "YAML configuration for get_chartdata service. Supported parameters: day (list of yesterday/today/tomorrow), resolution (interval/hourly), output_format, include_level, include_rating_level, include_average, and many more. See service documentation for full list. Leave empty to use service defaults (today, interval resolution, array of objects)." }, "submit": "Complete Configuration" }, "volatility": { "title": "Price Volatility Thresholds", "description": "{step_progress}\n\nConfigure 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: