270 lines
8.1 KiB
Python
270 lines
8.1 KiB
Python
"""Some common test functions for testing Amber components."""
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from amberelectric.models.actual_interval import ActualInterval
|
|
from amberelectric.models.advanced_price import AdvancedPrice
|
|
from amberelectric.models.channel import ChannelType
|
|
from amberelectric.models.current_interval import CurrentInterval
|
|
from amberelectric.models.forecast_interval import ForecastInterval
|
|
from amberelectric.models.interval import Interval
|
|
from amberelectric.models.price_descriptor import PriceDescriptor
|
|
from amberelectric.models.range import Range
|
|
from amberelectric.models.spike_status import SpikeStatus
|
|
from dateutil import parser
|
|
|
|
|
|
def generate_actual_interval(channel_type: ChannelType, end_time: datetime) -> Interval:
|
|
"""Generate a mock actual interval."""
|
|
start_time = end_time - timedelta(minutes=30)
|
|
if channel_type == ChannelType.CONTROLLEDLOAD:
|
|
per_kwh = 4.4
|
|
if channel_type == ChannelType.FEEDIN:
|
|
per_kwh = 1.1
|
|
return Interval(
|
|
ActualInterval(
|
|
type="ActualInterval",
|
|
duration=30,
|
|
spot_per_kwh=1.0,
|
|
per_kwh=per_kwh,
|
|
date=start_time.date(),
|
|
nem_time=end_time,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
renewables=50,
|
|
channel_type=channel_type,
|
|
spike_status=SpikeStatus.NONE,
|
|
descriptor=PriceDescriptor.LOW,
|
|
)
|
|
)
|
|
|
|
|
|
def generate_current_interval(
|
|
channel_type: ChannelType,
|
|
end_time: datetime,
|
|
range=False,
|
|
) -> Interval:
|
|
"""Generate a mock current price."""
|
|
start_time = end_time - timedelta(minutes=30)
|
|
per_kwh = 8.8
|
|
if channel_type == ChannelType.CONTROLLEDLOAD:
|
|
per_kwh = 4.4
|
|
if channel_type == ChannelType.FEEDIN:
|
|
per_kwh = 1.1
|
|
interval = Interval(
|
|
CurrentInterval(
|
|
type="CurrentInterval",
|
|
duration=30,
|
|
spot_per_kwh=1.0,
|
|
per_kwh=per_kwh,
|
|
date=start_time.date(),
|
|
nem_time=end_time,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
renewables=50.6,
|
|
channel_type=channel_type,
|
|
spike_status=SpikeStatus.NONE,
|
|
descriptor=PriceDescriptor.EXTREMELYLOW,
|
|
estimate=True,
|
|
)
|
|
)
|
|
|
|
if range:
|
|
interval.actual_instance.range = Range(min=6.7, max=9.1)
|
|
|
|
return interval
|
|
|
|
|
|
def generate_forecast_interval(
|
|
channel_type: ChannelType, end_time: datetime, range=False, advanced_price=False
|
|
) -> Interval:
|
|
"""Generate a mock forecast interval."""
|
|
start_time = end_time - timedelta(minutes=30)
|
|
per_kwh = 8.8
|
|
if channel_type == ChannelType.CONTROLLEDLOAD:
|
|
per_kwh = 4.4
|
|
if channel_type == ChannelType.FEEDIN:
|
|
per_kwh = 1.1
|
|
interval = Interval(
|
|
ForecastInterval(
|
|
type="ForecastInterval",
|
|
duration=30,
|
|
spot_per_kwh=1.1,
|
|
per_kwh=per_kwh,
|
|
date=start_time.date(),
|
|
nem_time=end_time,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
renewables=50,
|
|
channel_type=channel_type,
|
|
spike_status=SpikeStatus.NONE,
|
|
descriptor=PriceDescriptor.VERYLOW,
|
|
estimate=True,
|
|
)
|
|
)
|
|
if range:
|
|
interval.actual_instance.range = Range(min=6.7, max=9.1)
|
|
if advanced_price:
|
|
interval.actual_instance.advanced_price = AdvancedPrice(
|
|
low=6.7, predicted=9.0, high=10.2
|
|
)
|
|
return interval
|
|
|
|
|
|
GENERAL_ONLY_SITE_ID = "01FG2K6V5TB6X9W0EWPPMZD6MJ"
|
|
GENERAL_AND_CONTROLLED_SITE_ID = "01FG2MC8RF7GBC4KJXP3YFZ162"
|
|
GENERAL_AND_FEED_IN_SITE_ID = "01FG2MCD8KTRZR9MNNW84VP50S"
|
|
GENERAL_AND_CONTROLLED_FEED_IN_SITE_ID = "01FG2MCD8KTRZR9MNNW847S50S"
|
|
GENERAL_FOR_FAIL = "01JVCEYVSD5HGJG0KT7RNM91GG"
|
|
|
|
GENERAL_CHANNEL = [
|
|
generate_current_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T09:00:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T09:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T10:00:00+10:00")
|
|
),
|
|
]
|
|
|
|
GENERAL_CHANNEL_WITH_RANGE = [
|
|
generate_current_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T08:30:00+10:00"), range=True
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T09:00:00+10:00"), range=True
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T09:30:00+10:00"), range=True
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T10:00:00+10:00"), range=True
|
|
),
|
|
]
|
|
|
|
CONTROLLED_LOAD_CHANNEL = [
|
|
generate_current_interval(
|
|
ChannelType.CONTROLLEDLOAD, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD, parser.parse("2021-09-21T09:00:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD, parser.parse("2021-09-21T09:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD, parser.parse("2021-09-21T10:00:00+10:00")
|
|
),
|
|
]
|
|
|
|
|
|
FEED_IN_CHANNEL = [
|
|
generate_current_interval(
|
|
ChannelType.FEEDIN, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN, parser.parse("2021-09-21T09:00:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN, parser.parse("2021-09-21T09:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN, parser.parse("2021-09-21T10:00:00+10:00")
|
|
),
|
|
]
|
|
|
|
GENERAL_FORECASTS = [
|
|
generate_current_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T09:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T09:30:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T10:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
]
|
|
|
|
FORECASTS = [
|
|
generate_current_interval(
|
|
ChannelType.GENERAL, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_current_interval(
|
|
ChannelType.CONTROLLEDLOAD, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_current_interval(
|
|
ChannelType.FEEDIN, parser.parse("2021-09-21T08:30:00+10:00")
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T09:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T09:30:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.GENERAL,
|
|
parser.parse("2021-09-21T10:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD,
|
|
parser.parse("2021-09-21T09:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD,
|
|
parser.parse("2021-09-21T09:30:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.CONTROLLEDLOAD,
|
|
parser.parse("2021-09-21T10:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN,
|
|
parser.parse("2021-09-21T09:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN,
|
|
parser.parse("2021-09-21T09:30:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
generate_forecast_interval(
|
|
ChannelType.FEEDIN,
|
|
parser.parse("2021-09-21T10:00:00+10:00"),
|
|
range=True,
|
|
advanced_price=True,
|
|
),
|
|
]
|