mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
Implemented comprehensive metadata calculation for chart data export service with automatic Y-axis scaling and gradient positioning based on actual price statistics. Changes: - Added 'metadata' parameter to get_chartdata service (include/only/none) - Implemented _calculate_metadata() with per-day price statistics * min/max/avg/median prices * avg_position and median_position (0-1 scale for gradient stops) * yaxis_suggested bounds (floor(min)-1, ceil(max)+1) * time_range with day boundaries * currency info with symbol and unit - Integrated metadata into rolling_window modes via config-template-card * Pre-calculated yaxis bounds (no async issues in templates) * Dynamic gradient stops based on avg_position * Server-side calculation ensures consistency Visual refinements: - Best price overlay opacity reduced to 0.05 (ultra-subtle green hint) - Stroke width increased to 1.5 for better visibility - Gradient opacity adjusted to 0.45 with "light" shade - Marker configuration: size 0, hover size 2, strokeWidth 1 - Header display: Only show LOW/HIGH rating_levels (min/max prices) * Conditional logic excludes NORMAL and level types * Entity state shows meaningful extrema values - NOW marker label removed for rolling_window_autozoom mode * Static position at 120min lookback makes label misleading Code cleanup: - Removed redundant all_series_config (server-side data formatting) - Currency names capitalized (Cents, Øre, Öre, Pence) Translation updates: - Added metadata selector translations (de, en, nb, nl, sv) - Added metadata field description in services - Synchronized all language files Impact: Users get dynamic Y-axis scaling based on actual price data, eliminating manual configuration. Rolling window charts automatically adjust axis bounds and gradient positioning. Header shows only meaningful extreme values (daily min/max). All data transformation happens server-side for optimal performance and consistency.
247 lines
5.6 KiB
YAML
247 lines
5.6 KiB
YAML
get_price:
|
|
fields:
|
|
entry_id:
|
|
required: true
|
|
example: "1234567890abcdef"
|
|
selector:
|
|
config_entry:
|
|
integration: tibber_prices
|
|
start_time:
|
|
required: true
|
|
example: "2025-11-01T00:00:00+01:00"
|
|
selector:
|
|
datetime:
|
|
end_time:
|
|
required: true
|
|
example: "2025-11-02T00:00:00+01:00"
|
|
selector:
|
|
datetime:
|
|
get_apexcharts_yaml:
|
|
fields:
|
|
entry_id:
|
|
required: true
|
|
example: "1234567890abcdef"
|
|
selector:
|
|
config_entry:
|
|
integration: tibber_prices
|
|
day:
|
|
required: false
|
|
example: today
|
|
selector:
|
|
select:
|
|
options:
|
|
- yesterday
|
|
- today
|
|
- tomorrow
|
|
- rolling_window
|
|
- rolling_window_autozoom
|
|
translation_key: day
|
|
level_type:
|
|
required: false
|
|
default: rating_level
|
|
example: rating_level
|
|
selector:
|
|
select:
|
|
options:
|
|
- rating_level
|
|
- level
|
|
translation_key: level_type
|
|
highlight_best_price:
|
|
required: false
|
|
default: true
|
|
example: true
|
|
selector:
|
|
boolean:
|
|
get_chartdata:
|
|
fields:
|
|
general:
|
|
fields:
|
|
entry_id:
|
|
required: true
|
|
example: "1234567890abcdef"
|
|
selector:
|
|
config_entry:
|
|
integration: tibber_prices
|
|
selection:
|
|
collapsed: true
|
|
fields:
|
|
day:
|
|
required: false
|
|
selector:
|
|
select:
|
|
options:
|
|
- yesterday
|
|
- today
|
|
- tomorrow
|
|
multiple: true
|
|
translation_key: day
|
|
resolution:
|
|
required: false
|
|
default: interval
|
|
example: hourly
|
|
selector:
|
|
select:
|
|
options:
|
|
- interval
|
|
- hourly
|
|
translation_key: resolution
|
|
filters:
|
|
collapsed: true
|
|
fields:
|
|
level_filter:
|
|
required: false
|
|
selector:
|
|
select:
|
|
options:
|
|
- very_cheap
|
|
- cheap
|
|
- normal
|
|
- expensive
|
|
- very_expensive
|
|
multiple: true
|
|
translation_key: level_filter
|
|
rating_level_filter:
|
|
required: false
|
|
selector:
|
|
select:
|
|
options:
|
|
- low
|
|
- normal
|
|
- high
|
|
multiple: true
|
|
translation_key: rating_level_filter
|
|
period_filter:
|
|
required: false
|
|
selector:
|
|
select:
|
|
options:
|
|
- best_price
|
|
- peak_price
|
|
translation_key: period_filter
|
|
transformation:
|
|
collapsed: true
|
|
fields:
|
|
minor_currency:
|
|
required: false
|
|
default: false
|
|
example: true
|
|
selector:
|
|
boolean:
|
|
round_decimals:
|
|
required: false
|
|
example: 2
|
|
selector:
|
|
number:
|
|
min: 0
|
|
max: 10
|
|
mode: box
|
|
insert_nulls:
|
|
required: false
|
|
default: none
|
|
selector:
|
|
select:
|
|
options:
|
|
- none
|
|
- segments
|
|
- all
|
|
translation_key: insert_nulls
|
|
connect_segments:
|
|
required: false
|
|
default: false
|
|
selector:
|
|
boolean:
|
|
add_trailing_null:
|
|
required: false
|
|
default: false
|
|
selector:
|
|
boolean:
|
|
format:
|
|
collapsed: true
|
|
fields:
|
|
output_format:
|
|
required: false
|
|
default: array_of_objects
|
|
example: array_of_objects
|
|
selector:
|
|
select:
|
|
options:
|
|
- array_of_objects
|
|
- array_of_arrays
|
|
translation_key: output_format
|
|
data_key:
|
|
required: false
|
|
example: prices
|
|
selector:
|
|
text:
|
|
metadata:
|
|
required: false
|
|
default: include
|
|
selector:
|
|
select:
|
|
options:
|
|
- include
|
|
- only
|
|
- none
|
|
translation_key: metadata
|
|
arrays_of_objects:
|
|
collapsed: true
|
|
fields:
|
|
include_level:
|
|
required: false
|
|
default: false
|
|
example: true
|
|
selector:
|
|
boolean:
|
|
include_rating_level:
|
|
required: false
|
|
default: false
|
|
example: true
|
|
selector:
|
|
boolean:
|
|
include_average:
|
|
required: false
|
|
default: false
|
|
selector:
|
|
boolean:
|
|
start_time_field:
|
|
required: false
|
|
example: time
|
|
selector:
|
|
text:
|
|
end_time_field:
|
|
required: false
|
|
example: end
|
|
selector:
|
|
text:
|
|
price_field:
|
|
required: false
|
|
example: price
|
|
selector:
|
|
text:
|
|
level_field:
|
|
required: false
|
|
selector:
|
|
text:
|
|
rating_level_field:
|
|
required: false
|
|
selector:
|
|
text:
|
|
average_field:
|
|
required: false
|
|
selector:
|
|
text:
|
|
arrays_of_arrays:
|
|
collapsed: true
|
|
fields:
|
|
array_fields:
|
|
required: false
|
|
selector:
|
|
text:
|
|
refresh_user_data:
|
|
fields:
|
|
entry_id:
|
|
required: true
|
|
example: "1234567890abcdef"
|
|
selector:
|
|
config_entry:
|
|
integration: tibber_prices
|