hass.tibber_prices/custom_components/tibber_prices/services.yaml
Julian Pawlowski 95950f48c1 feat(services): add find_best_start and plan_charging services
Add two new service actions for intelligent device scheduling:

- find_best_start: Find optimal start time for run-once appliances
  - Considers price, optional energy estimates, optional PV power
  - Supports flexible time windows (HH:MM, ISO datetime, with/without timezone)
  - Prefers future candidates over past ones
  - Includes current interval by default (configurable)
  - Returns recommended start time with cost analysis

- plan_charging: Create optimized charging schedule for energy storage
  - Supports EV, home battery, balcony battery use cases
  - Energy target or duration-based planning
  - Split or continuous charging modes
  - Efficiency factor support
  - Includes current interval by default (configurable)
  - Returns detailed slot-by-slot charging plan

Common improvements:
- Flexible datetime parsing (ISO 8601, with/without timezone, microseconds)
- Time selector in GUI (better UX than text field)
- Currency display based on config entry settings
- Comprehensive error handling and validation
- Detailed response envelopes with warnings/errors

Impact: Users can automate appliance scheduling based on electricity
prices without external automation rules.
2026-01-20 11:47:26 +00:00

483 lines
11 KiB
YAML

get_price:
fields:
entry_id:
required: false
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: false
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:
highlight_peak_price:
required: false
default: false
example: false
selector:
boolean:
get_chartdata:
fields:
general:
fields:
entry_id:
required: false
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:
subunit_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: false
example: "1234567890abcdef"
selector:
config_entry:
integration: tibber_prices
find_best_start:
fields:
entry_id:
required: false
example: "1234567890abcdef"
selector:
config_entry:
integration: tibber_prices
window:
collapsed: false
fields:
start:
required: false
example: "14:00"
selector:
time:
end:
required: false
example: "23:00"
selector:
time:
horizon_hours:
required: false
default: 36
selector:
number:
min: 1
max: 72
mode: box
unit_of_measurement: h
job:
collapsed: false
fields:
duration_minutes:
required: true
example: 120
selector:
number:
min: 15
max: 1440
step: 15
mode: box
unit_of_measurement: min
rounding:
required: false
default: ceil
selector:
select:
options:
- nearest
- floor
- ceil
translation_key: rounding
costing:
collapsed: true
fields:
estimate_energy_kwh:
required: false
example: 1.2
selector:
number:
min: 0.01
max: 100
step: 0.01
mode: box
unit_of_measurement: kWh
estimate_avg_power_w:
required: false
example: 600
selector:
number:
min: 1
max: 50000
step: 1
mode: box
unit_of_measurement: W
pv:
collapsed: true
fields:
pv_entity_id:
required: false
selector:
entity:
domain: sensor
preferences:
collapsed: true
fields:
prefer_earlier_start_on_tie:
required: false
default: true
selector:
boolean:
include_current_interval:
required: false
default: true
selector:
boolean:
plan_charging:
fields:
entry_id:
required: false
example: "1234567890abcdef"
selector:
config_entry:
integration: tibber_prices
window:
collapsed: false
fields:
start:
required: false
example: "00:00"
selector:
time:
end:
required: false
example: "06:00"
selector:
time:
horizon_hours:
required: false
default: 36
selector:
number:
min: 1
max: 72
mode: box
unit_of_measurement: h
charge:
collapsed: false
fields:
energy_target_kwh:
required: false
example: 2.0
selector:
number:
min: 0.01
max: 200
step: 0.01
mode: box
unit_of_measurement: kWh
duration_minutes:
required: false
example: 120
selector:
number:
min: 15
max: 1440
step: 15
mode: box
unit_of_measurement: min
max_power_w:
required: true
example: 1200
selector:
number:
min: 1
max: 50000
step: 1
mode: box
unit_of_measurement: W
min_power_w:
required: false
default: 0
selector:
number:
min: 0
max: 50000
step: 1
mode: box
unit_of_measurement: W
allow_split:
required: false
default: false
selector:
boolean:
rounding:
required: false
default: ceil
selector:
select:
options:
- nearest
- floor
- ceil
translation_key: rounding
efficiency:
required: false
default: 1.0
example: 0.92
selector:
number:
min: 0.01
max: 1.0
step: 0.01
mode: box
pv:
collapsed: true
fields:
pv_entity_id:
required: false
selector:
entity:
domain: sensor
preferences:
collapsed: true
fields:
prefer_fewer_splits:
required: false
default: true
selector:
boolean:
prefer_earlier_completion:
required: false
default: true
selector:
boolean:
include_current_interval:
required: false
default: true
selector:
boolean:
debug_clear_tomorrow:
fields:
entry_id:
required: false
example: "1234567890abcdef"
selector:
config_entry:
integration: tibber_prices