Deploy or configure an OpenADR 2.0b-compliant VEN client library (several open-source implementations exist in Python and Java); configure the VEN with its ven_id and registration details for the target Virtual Top Node (VTN).
Register the VEN with the VTN by sending an oadrCreatePartyRegistration request; the VTN responds with a registration ID and a polling interval for PULL mode clients.
In PULL mode, periodically send oadrRequestEvent to the VTN's EiEvent service endpoint to check for active or pending demand-response events; process any returned oadrDistributeEvent payloads.
Parse each oadrEvent for the event signals: extract eventID, dtstart (start time), duration, signal type (e.g., SIMPLE, PRICE), and signal payload value (e.g., 0=normal, 1=moderate, 2=high, 3=special).
Acknowledge receipt by sending oadrCreatedEvent with an optType of optIn or optOut, then execute the appropriate load curtailment or shift action based on the signal level.
Known gotchas
OpenADR 2.0b defines both PUSH (HTTP server on the VEN) and PULL models; many utilities only support one mode — confirm with the VTN operator which transport and security profile (simple HTTP vs. TLS with certificates) is required before implementation.
Event timing uses xs:dateTime with explicit timezone offsets; failing to parse these correctly and treating them as local time causes curtailment actions to fire at the wrong time, which can result in contract penalties.
The oadrPayload XML schema has strict namespace and element ordering requirements; VTNs commonly reject messages where namespace prefixes differ from expected values even though XML namespaces are prefix-agnostic by spec — test with the target VTN's validator if available.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp