Files
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

93 lines
3.6 KiB
Python

from ..uftp import (
DPrognosis,
FlexOffer,
FlexOfferRevocation,
FlexOrderResponse,
FlexRequestResponse,
FlexReservationUpdateResponse,
FlexSettlementResponse,
Metering,
UsefRole,
)
from .base_client import ShapeshifterClient
class ShapeshifterAgrDsoClient(ShapeshifterClient):
"""
Client that allows the Aggregator to connect to the DSO.
"""
sender_role = UsefRole.AGR
recipient_role = UsefRole.DSO
def send_d_prognosis(self, message: DPrognosis) -> None:
"""
D-Prognosis messages are used to communicate D-prognoses between AGRs
and DSOs. D-Prognosis messages always contain data for all ISPs for the
period they apply to, even if a prognosis is sent after the start of
the period, when one or more ISPs are already in the operate or
settlement phase. Receiving implementations should ignore the
information supplied for those ISPs.
"""
return self._send_message(message)
def send_flex_request_response(self, message: FlexRequestResponse) -> None:
"""
Upon receiving and processing a FlexRequest message, the receiving
implementation must reply with a FlexRequestResponse, indicating
whether the flexibility request was processed successfully.
"""
return self._send_message(message)
def send_flex_offer(self, message: FlexOffer) -> None:
"""
FlexOffer messages are used by AGRs to make DSOs an offer for provision
of flexibility. A FlexOffer message contains a list of ISPs and, for
each ISP, the change in consumption or production offered and the price
for the total amount of flexibility offered. FlexOffer messages can be
sent once a FlexRequest message has been received but can also be sent
unsolicited. Note that multiple FlexOffer messages may be sent based on
a single FlexRequest, e.g. to increase the chance that the DSO will
order at least part of its available flexibility. The AGR must make
sure that it can actually provide the flexibility offered across all of
its FlexOffers.
"""
self._send_message(message)
def send_flex_offer_revocation(self, message: FlexOfferRevocation) -> None:
"""
The FlexOfferRevocation message is used by the AGR to revoke a FlexOffer
previously sent to a DSO. It voids the FlexOffer, even if its validity
time has not yet expired. Revocation is not allowed for FlexOffers that
already have associated accepted FlexOrders.
"""
self._send_message(message)
def send_flex_order_response(self, message: FlexOrderResponse) -> None:
"""
Confirm the flex order.
"""
self._send_message(message)
def send_flex_settlement_response(self, message: FlexSettlementResponse) -> None:
"""
Upon receiving and processing a FlexSettlement message, the AGR must
reply with a FlexSettlementResponse, indicating whether the initial
message was handled successfully. When a FlexSettlement message is
rejected, the DSO should consider all FlexOrderSettlement elements of
that message related to potential dispute.
"""
self._send_message(message)
def send_flex_reservation_update_response(self, message: FlexReservationUpdateResponse) -> None:
"""
Confirm the flex reservation update.
"""
self._send_message(message)
def send_metering(self, message: Metering) -> None:
"""
Send metering data to the DSO.
"""
self._send_message(message)