hass.tibber_prices/tests
Julian Pawlowski b8e40bfa3b fix(services): prevent plan_charging overcharge from segment-constraint bridging
apply_segment_constraints could add far more grid energy than requested when
max_cycles_per_day or min_charge_duration_minutes forced bridging across
expensive gaps between cheap intervals. With max_cycles_per_day=1, isolated
cheap intervals were merged into one continuous segment by filling every gap
in between, without ever trimming the surplus back down, resulting in
achieved_soc_percent far above 100%.

Add a post-bridging trim step that removes segment-edge intervals (highest
price first) until total grid energy matches the requested target again,
while still respecting max_cycles_per_day/min_charge_duration_minutes and
never dropping below the target itself (fixed-power mode's expected
last-interval rounding overshoot is preserved).

A related edge case is also fixed: trimming could previously remove an
interval required to satisfy a must_reach_by deadline, silently flipping
deadline_met to False even though the overall energy target was still
reached. Deadline-critical intervals are now passed through as
protected_starts and are never removed during trimming.

Fixes #167

Impact: plan_charging no longer overcharges the battery/EV past the
requested target SoC when max_cycles_per_day or min_charge_duration_minutes
is set, and must_reach_by deadlines are honored even when those constraints
require bridging across expensive price gaps.
2026-07-04 17:43:04 +00:00
..
services fix(services): prevent plan_charging overcharge from segment-constraint bridging 2026-07-04 17:43:04 +00:00
__init__.py test: add pytest framework and midnight-crossing tests 2025-11-21 23:47:01 +00:00
test_avg_none_fallback.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_best_price_e2e.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_binary_sensor_period_attributes.py fix(periods): stabilize best and peak period outputs 2026-04-25 22:46:38 +00:00
test_config_validators.py refactor(config): use negative values for Best Price min_distance 2025-11-22 04:44:57 +00:00
test_coordinator_shutdown.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_interval_pool_memory_leak.py fix(interval_pool): rebuild index after dead interval cleanup without empty groups 2026-04-17 12:00:37 +00:00
test_interval_pool_optimization.py chore(testing): add optional Pyright checks for tests 2026-04-25 22:46:43 +00:00
test_level_filtering.py fix(periods): keep negative best-price windows strictly local 2026-04-25 20:00:04 +00:00
test_lifecycle_state.py fix(sensors): ensure connection/tomorrow_data/lifecycle consistency 2025-11-22 04:45:57 +00:00
test_mean_median_display.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_midnight_handler.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_midnight_periods.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_midnight_turnover.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_minmax_none_fallback.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_negative_best_price_periods.py fix(periods): keep negative best-price windows strictly local 2026-04-25 20:00:04 +00:00
test_next_api_poll.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_peak_price_e2e.py refactor(periods): enhance peak period filtering and validation logic 2026-04-17 22:24:18 +00:00
test_percentage_calculations.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_period_calculation.py test(period): document period calculation testing strategy 2025-11-22 04:47:09 +00:00
test_period_overlap.py fix(periods): stabilize best and peak period outputs 2026-04-25 22:46:38 +00:00
test_period_statistics.py fix(periods): stabilize best and peak period outputs 2026-04-25 22:46:38 +00:00
test_periods_hash.py fix(periods): stabilize best and peak period outputs 2026-04-25 22:46:38 +00:00
test_price_calculations.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_price_window.py feat(services): add power-profile-weighted window selection 2026-05-03 22:16:08 +00:00
test_rating_threshold_validation.py chore(testing): add optional Pyright checks for tests 2026-04-25 22:46:43 +00:00
test_relaxation.py fix(periods): separate smoothed levels from period detection 2026-05-03 19:40:34 +00:00
test_resource_cleanup.py chore(testing): add optional Pyright checks for tests 2026-04-25 22:46:43 +00:00
test_sensor_consistency.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_sensor_timer_assignment.py refactor(repairs): simplify currency mode change notification to one-shot 2026-04-15 10:00:59 +00:00
test_time_service.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_timer_scheduling.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00
test_tomorrow_data_refresh.py fix(periods): separate smoothed levels from period detection 2026-05-03 19:40:34 +00:00
test_user_data_validation.py fix(services): use injected now in resolve_search_range day offset 2026-04-14 19:33:24 +00:00