Source code for shapeshifter_uftp.uftp.cro_dso

from dataclasses import dataclass, field
from typing import List, Optional
from xsdata.models.datatype import XmlDate

from .defaults import DEFAULT_TIME_ZONE
from .validations import validate_list
from .common import (
    PayloadMessageResponse,
    PayloadMessage,
    RedispatchBy,
)


# pylint: disable=missing-class-docstring,duplicate-code


[docs] @dataclass(kw_only=True) class DsoPortfolioQueryConnection: """ A Connection that is part of the congestion point. :ivar entity_address: EntityAddress of the Connection. :ivar agr_domain: The internet domain of the AGR that represents the prosumer connected on this Connection, if applicable. """ class Meta: name = "DSOPortfolioQueryConnection" entity_address: str = field( metadata={ "name": "EntityAddress", "type": "Attribute", "required": True, "pattern": r"(ea1\.[0-9]{4}-[0-9]{2}\..{1,244}:.{1,244}|ean\.[0-9]{12,34})", } ) agr_domain: Optional[str] = field( default=None, metadata={ "name": "AGR-Domain", "type": "Attribute", "pattern": r"([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}", } )
[docs] @dataclass(kw_only=True) class DsoPortfolioUpdateConnection: """ A connection that the DSO wants the CRO to update. :ivar entity_address: EntityAddress of the Connection. :ivar start_period: The first Period that the Connection is part of this CongestionPoint. :ivar end_period: The last Period that the Connection is part of this CongestionPoint. """ class Meta: name = "DSOPortfolioUpdateConnection" entity_address: str = field( metadata={ "name": "EntityAddress", "type": "Attribute", "required": True, "pattern": r"(ea1\.[0-9]{4}-[0-9]{2}\..{1,244}:.{1,244}|ean\.[0-9]{12,34})", } ) start_period: XmlDate = field( metadata={ "name": "StartPeriod", "type": "Attribute", "required": True, } ) end_period: Optional[XmlDate] = field( default=None, metadata={ "name": "EndPeriod", "type": "Attribute", } )
[docs] @dataclass(kw_only=True) class DsoPortfolioQueryCongestionPoint: """ :ivar connection: :ivar entity_address: EntityAddress of the Connection. """ class Meta: name = "DSOPortfolioQueryCongestionPoint" connections: List[DsoPortfolioQueryConnection] = field( default_factory=list, metadata={ "name": "Connection", "type": "Element", "min_occurs": 1, } ) entity_address: str = field( metadata={ "name": "EntityAddress", "type": "Attribute", "required": True, "pattern": r"(ea1\.[0-9]{4}-[0-9]{2}\..{1,244}:.{1,244}|ean\.[0-9]{12,34})", } ) def __post_init__(self): validate_list('connections', self.connections, DsoPortfolioQueryConnection, 1)
[docs] @dataclass(kw_only=True) class DsoPortfolioQuery(PayloadMessage): """ :ivar time_zone: Time zone ID (as per the IANA time zone database, http://www.iana.org/time-zones, for example: Europe/Amsterdam) indicating the UTC offset that applies to the Period referenced in this message. Although the time zone is a market-wide fixed value, making this assumption explicit in each message is important for validation purposes, allowing implementations to reject messages with an errant UTC offset. :ivar period: The Period for which the AGR requests the portfolio information. :ivar entity_address: EntityAddress of the CongestionPoint """ class Meta: name = "DSOPortfolioQuery" time_zone: str = field( default=DEFAULT_TIME_ZONE, metadata={ "name": "TimeZone", "type": "Attribute", "required": True, "pattern": r"(Africa|America|Australia|Europe|Pacific)/[a-zA-Z0-9_/]{3,}", } ) period: XmlDate = field( metadata={ "name": "Period", "type": "Attribute", "required": True, } ) entity_address: str = field( metadata={ "name": "EntityAddress", "type": "Attribute", "required": True, "pattern": r"(ea1\.[0-9]{4}-[0-9]{2}\..{1,244}:.{1,244}|ean\.[0-9]{12,34})", } )
[docs] @dataclass(kw_only=True) class DsoPortfolioUpdateCongestionPoint: """ A congestion point that the DSO wants the CRO to update. :ivar connection: :ivar entity_address: EntityAddress of the Connection. :ivar start_period: The first Period that the Connection is part of this CongestionPoint. :ivar end_period: The last Period that the Connection is part of this CongestionPoint. :ivar mutex_offers_supported: Indicates whether the DSO accepts mutual exclusive FlexOffers on this CongestionPoint. :ivar day_ahead_redispatch_by: Indicates which party is responsible for day-ahead redispatch. :ivar intraday_redispatch_by: Indicates which party is responsible for intraday ahead redispatch, AGR or DSO. If not specified, there will be no intraday trading on this CongestionPoint. """ class Meta: name = "DSOPortfolioUpdateCongestionPoint" connections: List[DsoPortfolioUpdateConnection] = field( default_factory=list, metadata={ "name": "Connection", "type": "Element", "min_occurs": 1, } ) entity_address: str = field( metadata={ "name": "EntityAddress", "type": "Attribute", "required": True, "pattern": r"(ea1\.[0-9]{4}-[0-9]{2}\..{1,244}:.{1,244}|ean\.[0-9]{12,34})", } ) start_period: XmlDate = field( metadata={ "name": "StartPeriod", "type": "Attribute", "required": True, } ) end_period: Optional[XmlDate] = field( default=None, metadata={ "name": "EndPeriod", "type": "Attribute", } ) mutex_offers_supported: bool = field( metadata={ "name": "MutexOffersSupported", "type": "Attribute", "required": True, } ) day_ahead_redispatch_by: RedispatchBy = field( metadata={ "name": "DayAheadRedispatchBy", "type": "Attribute", "required": True, } ) intraday_redispatch_by: Optional[RedispatchBy] = field( default=None, metadata={ "name": "IntradayRedispatchBy", "type": "Attribute", } ) def __post_init__(self): validate_list('connections', self.connections, DsoPortfolioUpdateConnection, 1)
[docs] @dataclass(kw_only=True) class DsoPortfolioUpdateResponse(PayloadMessageResponse): class Meta: name = "DSOPortfolioUpdateResponse"
[docs] @dataclass(kw_only=True) class DsoPortfolioQueryResponse(PayloadMessageResponse): """ :ivar congestion_point: :ivar time_zone: Time zone ID (as per the IANA time zone database, http://www.iana.org/time-zones, for example: Europe/Amsterdam) indicating the UTC offset that applies to the Period referenced in this message. Although the time zone is a market-wide fixed value, making this assumption explicit in each message is important for validation purposes, allowing implementations to reject messages with an errant UTC offset. :ivar period: The Period for which the AGR requests the portfolio information. """ class Meta: name = "DSOPortfolioQueryResponse" congestion_point: Optional[DsoPortfolioQueryCongestionPoint] = field( default=None, metadata={ "name": "CongestionPoint", "type": "Element", } ) time_zone: str = field( default=DEFAULT_TIME_ZONE, metadata={ "name": "TimeZone", "type": "Attribute", "required": True, "pattern": r"(Africa|America|Australia|Europe|Pacific)/[a-zA-Z0-9_/]{3,}", } ) period: XmlDate = field( metadata={ "name": "Period", "type": "Attribute", "required": True, } )
[docs] @dataclass(kw_only=True) class DsoPortfolioUpdate(PayloadMessage): """ :ivar congestion_point: :ivar time_zone: Time zone ID (as per the IANA time zone database, http://www.iana.org/time-zones, for example: Europe/Amsterdam) indicating the UTC offset that applies to the Period referenced in this message. Although the time zone is a market-wide fixed value, making this assumption explicit in each message is important for validation purposes, allowing implementations to reject messages with an errant UTC offset. """ class Meta: name = "DSOPortfolioUpdate" congestion_points: List[DsoPortfolioUpdateCongestionPoint] = field( default_factory=list, metadata={ "name": "CongestionPoint", "type": "Element", "min_occurs": 1, } ) time_zone: str = field( default=DEFAULT_TIME_ZONE, metadata={ "name": "TimeZone", "type": "Attribute", "required": True, "pattern": r"(Africa|America|Australia|Europe|Pacific)/[a-zA-Z0-9_/]{3,}", } ) def __post_init__(self): validate_list('congestion_points', self.congestion_points, DsoPortfolioUpdateCongestionPoint, 1)