Skip to main content

OpenADR 2.0b VEN

Enrols GEM as a Virtual End Node on an OpenADR 2.0b demand-response program, either directly against a utility VTN or through an on-prem gateway such as an eisy/ISY.

The driver owns the wire only — XML framing, mutual TLS, the registration ceremony and polling. Event interpretation, load curtailment, restore and history are shared with the OpenADR 3.0 driver; see the OpenADR console for everything on that side.

tip

For a new program enrolment, prefer the OpenADR 3.0 driver. Use this one for an existing 2.0b program or to talk to a gateway.

Prerequisites

  • Enrolment with the utility or Energy Services Provider, which supplies the VTN URL, the VEN name, and usually a client certificate.
  • Outbound HTTPS from the controller to the VTN.
  • For gateway mode: an eisy/ISY on the LAN with OpenADR configured, plus its admin credentials.

Setup steps

  1. System → Devices → Add Device, choose OpenADR 2.0b VEN (key openadr2).
  2. Set oadr_modevtn for a direct connection, gateway for an eisy/ISY.
  3. Direct: set vtn_url and ven_name, and paste client_cert, client_key and ca_cert if the program uses mutual TLS. Gateway: set gateway_url, gateway_username and gateway_password.
  4. Configure the response on the console's Response tab: curtailable resources for kW-targeted shedding, and/or level-mapped macros.

Or add it from Integrations → OpenADR, which walks the same steps and then opens the console against the new VEN.

Attribute reference

ScopeAttributeDirectionNotes
deviceoadr_modeoptionalvtn (default) or gateway.
devicevtn_urlrequired in vtn modeBase URL; GEM appends the /OpenADR2/Simple/2.0b/ service paths.
deviceven_nameoptionalName presented at registration. Default GEM-VEN.
deviceven_idread-onlyAssigned by the VTN on first registration. Do not edit.
deviceregistration_idread-onlyAssigned by the VTN. Do not edit.
deviceclient_cert / client_keyoptional, securePEM material for mutual TLS.
deviceca_certoptionalPEM CA chain used to verify the VTN.
deviceallow_insecureoptionalDisables TLS verification. Lab VTNs only.
devicegateway_urlrequired in gateway modeFull URL of the eisy/ISY, e.g. https://192.168.1.100.
devicegateway_usernameoptionalDefault admin.
devicegateway_passwordoptional, secureGateway password.
devicepoll_intervaloptionalMilliseconds between polls. Default 60000, floored at 5000.
deviceresponse_modeoptionalauto (default), resources, macro, both.
deviceprice_thresholdsoptionalMaps a price signal onto shed levels.
devicerestore_spread_msoptionalWindow over which curtailed load is returned. Default 120000.
devicetelemetry_enabledoptionalMeasure and report readings to the VTN. Off by default.
devicetelemetry_sample_msoptionalHow often readings are taken. Default 30000, floored at 5000.
deviceshed_macro_id, restore_macro_id, event_level_1..3_macro_idoptionalLevel-mapped macros.
deviceevent_statusread-onlyidle or active.
devicelast_event_id, last_signal_levelread-onlyMost recent event and the level in force.
devicedr_directiveread-onlyNormalized reading of what the site is being asked to do.
deviceopted_outread-onlyTracking events but not acting on them.
devicedr_active_eventsread-onlyPersisted event and curtailment state. Managed by the driver.
zonedr_event_activeread-only1 while an event is active.
zonedr_signal_levelread-onlyLevel in force.
zonedr_event_idread-onlyCurrent event id.

Zones do not need an address — assigning one to the VEN simply gives it the DR attributes above.

Commands

CommandDescription
registerRegister with the VTN or gateway.
pollPoll for events now.
opt_in / opt_outResume or suspend automatic load control.
test_shed / test_restoreRun the shed or restore macro directly, without an event.
get_eventsEvents currently tracked.
get_statusConnection, registration and event state.
get_response_statusCurtailable capacity and the current shed plan.
get_traceRecent protocol exchanges.
get_telemetryStreams, VTN report subscriptions and latest readings.
send_reportsSend any due telemetry reports now.
note

test_shed and test_restore only prove that a macro executes. To exercise the whole chain — scheduling, signal interpretation, resource planning, curtailment and staggered restore — use Simulate event on the console.

Signal handling

Only a level-typed signal sets a shed level. The 2.0b signalName is checked first (simple, ELECTRICITY_PRICE, LOAD_DISPATCH, LOAD_CONTROL), then signalType (level, price, priceRelative, setpoint, delta, x-loadControlCapacity).

A price or setpoint signal is a number in units that have nothing to do with shed levels, so it is recorded and displayed but never read as one. Price signals drive load only when price_thresholds is configured. Signals GEM cannot classify are shown on the event detail and never acted on.

Telemetry (EiReport)

The report exchange is a negotiation in three stages, and a VEN that registers successfully but never gets asked for data has usually stalled at stage two:

  1. METADATA — after registration GEM sends oadrRegisterReport describing what it can measure, each stream with its own rID and itemBase (powerReal, energyReal).
  2. Request — the VTN replies, or later sends oadrCreateReport, naming a reportSpecifierID, a granularity and a reportBackDuration. Only now does GEM know what to send and how often.
  3. Update — GEM sends oadrUpdateReport on that cadence until the VTN cancels with oadrCancelReport.

A request naming no rIDs means "everything in that specifier". A request naming only streams this VEN does not publish is logged and refused rather than silently accepted — a promise of data that never arrives is worse than a refusal.

Known quirks

  • 2.0b only. Devices previously configured with oadr_profile=2.0a are treated as 2.0b with a warning — the old 2.0a mode never spoke valid 2.0a.
  • XML signatures are not supported. Programs that mandate signed payloads need a certified gateway in front.
  • Telemetry is opt-in. With telemetry_enabled off the VEN registers an empty METADATA set, which is what tells a VTN not to ask for data it will not receive. Turn it on and the VEN offers site real power, site energy, operating state, and per-resource power for any resource declaring a measured_attribute.
  • The VTN owns the report cadence. It subscribes with oadrCreateReport and names its own granularity and reportBackDuration; GEM clamps both to sane bounds (1 minute minimum granularity) but does not otherwise override them.
  • poll_interval is milliseconds. Legacy values under 1000 are read as seconds. A VTN-requested poll frequency (oadrRequestedOadrPollFreq) overrides the configured value.
  • ven_id and registration_id are owned by the VTN and persisted as read-only attributes. Editing them by hand breaks the registration.
  • Gateway mode acknowledges events itself. GEM tracks the opt state locally in that mode and does not send oadrCreatedEvent.

Troubleshooting

SymptomCheck
Registration rejected with a non-200 responseCodeven_name must match what the VTN expects, the certificate CN must match the registered VEN, and the VTN must speak 2.0b. The Monitor tab shows the exact rejection.
Log shows "no ven_id, attempting registration"Registration has not completed. The driver retries on every poll; the Monitor tab shows the 4xx/5xx from the VTN.
mTLS handshake fails with self-signed certificatesPaste the VTN's CA chain into ca_cert. allow_insecure bypasses validation but should never be used in production.
Event arrives but nothing shedsOpen the event on the console — the audit trail records the reason. Common causes are a price-only event with no price_thresholds, a level-0 event, the VEN being opted out, or every resource sitting below its min_level.
Shed falls short of the requested kWThe Response tab shows available capacity against the target, and the shortfall is written to the event audit trail.
Telemetry enabled but nothing is sentThe Telemetry tab shows whether the VTN ever subscribed. An empty subscriptions table means the VTN has not sent oadrCreateReport — check the Monitor tab that the METADATA offer was accepted with a 200.
Reports rejected by the VTNThe Monitor tab holds the exact oadrUpdateReport body and the rejection. A failed send is retried rather than skipped, so the window is not lost.