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.
The lifecycle sensor was always showing "fresh" state because
_last_price_update was set on every coordinator update, regardless of
whether data came from API or cache.
Changes:
- interval_pool/manager.py: get_intervals() and get_sensor_data() now
return tuple[data, bool] where bool indicates actual API call
- coordinator/price_data_manager.py: All fetch methods propagate
api_called flag through the call chain
- coordinator/core.py: Only update _last_price_update when api_called=True,
added debug logging to distinguish API calls from cached data
- services/get_price.py: Updated to handle new tuple return type
Impact: Lifecycle sensor now correctly shows "cached" during normal
15-minute updates (using pool cache) and only "fresh" within 5 minutes
of actual API calls. This fixes the issue where the sensor would never
leave the "fresh" state during frequent HA restarts or normal operation.
Renamed service modules for consistency with service identifiers:
- apexcharts.py → get_apexcharts_yaml.py
- chartdata.py → get_chartdata.py
- Added: get_price.py (new service module)
Naming convention: Module names now match service names directly
(tibber_prices.get_apexcharts_yaml → get_apexcharts_yaml.py)
Impact: Improved code organization, easier to locate service implementations.
No functional changes.