Skip to content

Commit

Permalink
Support for separate tariff pricing for plunge pricing events.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Hale committed Apr 6, 2024
1 parent ba5b9e3 commit 3249bcd
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 5 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ using
import_tariff_breaks: [0.10, 0.20, 0.30]
import_tariff_pricing: ["average", "average", "maximum", "maximum"]
plunge_pricing_tariff_breaks: [0.0, 0.10, 0.30]
plunge_pricing_tariff_pricing: ["average", "maximum", "maximum", "maximum"]

5. Optionally, create an `input_text` helper called `powerwall_tariff_update_status` if you want to see status messages.

Expand Down Expand Up @@ -57,6 +58,8 @@ So, by default, anything below £0.10 is mapped to Super Off-Peak, between £0.1

`import_tariff_pricing`: determines how to calculate the price of each import pricing level from the actual prices assigned to a level.

`plunge_pricing_tariff_pricing`: similar to above, but applied if there are any plunge (negative) prices.

`export_tariff_pricing`: determines how to calculate the price of each export pricing level from the actual prices assigned to a level.

`import_standing_charge`: sensor name or value.
Expand Down
5 changes: 3 additions & 2 deletions src/apps/powerwall/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,14 @@ def _update_schedules_for_day(day_date):
# backwards compatibility
if import_breaks is None:
import_breaks = get_breaks("tariff_breaks")
import_plunge_pricing_breaks = get_breaks("plunge_pricing_tariff_breaks", required=False)
plunge_pricing_breaks = get_breaks("plunge_pricing_tariff_breaks", required=False)
import_pricing = get_pricing("import_tariff_pricing", required=False)
# backwards compatibility
if import_pricing is None:
import_pricing = get_pricing("tariff_pricing")
plunge_pricing_pricing = get_pricing("plunge_pricing_tariff_pricing", required=False)

import_schedules = tariff.get_schedules(import_breaks, import_plunge_pricing_breaks, import_pricing, import_rates)
import_schedules = tariff.get_schedules(import_breaks, import_pricing, plunge_pricing_breaks, plunge_pricing_pricing, import_rates)
if import_schedules is None:
return None, None

Expand Down
9 changes: 7 additions & 2 deletions src/modules/powerwall_tariff.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,7 +346,7 @@ def populate_schedules(schedules, day_rates):
schedule.add(rate)


def get_schedules(breaks_config, plunge_pricing_breaks_config, tariff_pricing_config, day_rates, pricing_key=PRICE_KEY):
def get_schedules(breaks_config, tariff_pricing_config, plunge_pricing_breaks_config, plunge_pricing_tariff_pricing_config, day_rates, pricing_key=PRICE_KEY):
if not day_rates:
return None

Expand All @@ -361,11 +361,16 @@ def get_schedules(breaks_config, plunge_pricing_breaks_config, tariff_pricing_co
else:
configured_breaks = breaks_config

if plunge_pricing and plunge_pricing_tariff_pricing_config:
configured_pricing = plunge_pricing_tariff_pricing_config
else:
configured_pricing = tariff_pricing_config

assigner_funcs = get_tariff_assigners(configured_breaks, day_rates)

schedules = []
for i, charge_name in enumerate(CHARGE_NAMES):
pricing_func = create_pricing(tariff_pricing_config[i])
pricing_func = create_pricing(configured_pricing[i])
schedules.append(Schedule(charge_name, assigner_funcs[i], pricing_func, pricing_key))

populate_schedules(schedules, day_rates)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_tariff.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def test_calculate_tariff(self):
import_rates.next_day = next_rates

day_rates = import_rates.cover_day(day)
import_schedules = tariff.get_schedules(config["import_tariff_breaks"], None, config["import_tariff_pricing"], day_rates)
import_schedules = tariff.get_schedules(config["import_tariff_breaks"], config["import_tariff_pricing"], None, None, day_rates)
week_schedules = tariff.WeekSchedules()
week_schedules.update(day.weekday(), import_schedules, None)
data = tariff.to_tariff_data(config, 0, 0, week_schedules, day)
Expand Down

0 comments on commit 3249bcd

Please sign in to comment.