Offer attributes for P2P energy trading. Attached to Offer.offerAttributes.
Part of the DEG Schema · EnergyTradeOffer
| File | Description |
|---|---|
| attributes.yaml | OpenAPI 3.1.1 schema for EnergyTradeOffer |
| context.jsonld | JSON-LD context (namespace: https://schema.nfh.global/deg/EnergyTradeOffer/v2.0/) |
| vocab.jsonld | RDF vocabulary for EnergyTradeOffer terms |
All interval data (price, quantities, allocations) lives in two BecknTimeSeries:
offerAttributes.commitmentAttributes — the seller’s immutable offer declaration, published at catalog time. Carries PRICE_PER_KWH + AVAILABLE_QTY intervals and declares the full contract table schema via payloadDescriptors, each annotated with insertedBy.
Commitment.commitmentAttributes — the live/growing contract record (sibling of offer). Starts with PRICE_PER_KWH + REQUESTED_QTY and accumulates discom columns and FINAL_ALLOC as the lifecycle progresses.
| Lifecycle stage | Who adds to Commitment.commitmentAttributes |
|---|---|
| init / confirm | buyer appends REQUESTED_QTY |
| post-delivery | discoms append BUYER_DISCOM_ALLOC, BUYER_DISCOM_STATUS, SELLER_DISCOM_ALLOC, SELLER_DISCOM_STATUS, FINAL_ALLOC |
| Property | Type | Required | Description |
|---|---|---|---|
validityWindow |
TimePeriod |
Window during which the offer can be selected/accepted. Present at catalog publish. | |
contractAttributes |
object (JSON-LD) |
DEGContract terms at catalog publish: the role → participantId map (buyer-side null until discover) + policy ref. Mirrors Contract.contractAttributes — NPs promote this field verbatim at init. |
|
participants |
array |
Seller-declared parties (identity-only: id + participantAttributes, no role). Joined from contractAttributes.roles[].participantId. Carries the seller discom’s discomUri + ledgerUri so the buyer can construct init. |
|
commitmentAttributes |
TimeSeries (JSON-LD) |
✓ | Seller’s offer declaration: full payloadDescriptor schema with insertedBy + seller’s initial intervals. Immutable after publish. |
Each descriptor declares one column in the shared contract table:
| payloadType | objectType | insertedBy | units/currency |
|---|---|---|---|
PRICE_PER_KWH |
EVENT_PAYLOAD_DESCRIPTOR |
seller |
currency: INR |
AVAILABLE_QTY |
EVENT_PAYLOAD_DESCRIPTOR |
seller |
units: KWH |
REQUESTED_QTY |
EVENT_PAYLOAD_DESCRIPTOR |
buyer |
units: KWH |
BUYER_DISCOM_ALLOC |
REPORT_PAYLOAD_DESCRIPTOR |
buyerDiscom |
units: KWH |
BUYER_DISCOM_STATUS |
REPORT_PAYLOAD_DESCRIPTOR |
buyerDiscom |
units: STRING |
SELLER_DISCOM_ALLOC |
REPORT_PAYLOAD_DESCRIPTOR |
sellerDiscom |
units: KWH |
SELLER_DISCOM_STATUS |
REPORT_PAYLOAD_DESCRIPTOR |
sellerDiscom |
units: STRING |
FINAL_ALLOC |
REPORT_PAYLOAD_DESCRIPTOR |
sellerDiscom |
units: KWH |
insertedBy answers “why is this column here?” — it names the role responsible for
populating that column. Any column whose insertedBy party is not yet known at publish
time (buyer, discoms) is still declared in payloadDescriptors but has no interval data
until that party participates.
Every payloadType in Commitment.commitmentAttributes.intervals[*].payloads[*].type
MUST appear in Commitment.commitmentAttributes.payloadDescriptors, and vice versa.