.. _representations:
=======================
Payload Representations
=======================
In PyOpenADR, the complex hierarchies of the OpenADR XML-payloads are represented as Python dictionaries. These have been simplified as much as possible, allowing for a more natural and more readable experience.
This means that you don't have to instantiate objects and sub-objects and sub-sub-objects, but that you can define the entire object in a single, declarative statement. This kan keep a simple implementation very compact. The downside is that there is little help from your IDE and there is little discoverability for what contents can be provided in the messages. This page can be used as a reference for that information.
To help you, all outgong messages are validated against the XML schema, and you will receive warnings if your messages don't comply to the schema.
The following general principles have been applied to representing OpenADR objects in PyOpenADR:
- All property names are represented in snake_case instead of CamelCase or mixedCase names. For example: ``requestID`` becomes ``request_id``.
- For all properties, the ``oadr*`` and ``Ei*`` prefixes have been stripped away. For example: ``eiResponse`` becomes ``response`` and ``oadrResponse`` becomes ``response``.
- OpenADR timestamps are converted to Python ``datetime.datetime`` objects.
- OpenADR time intervals are converted to Python ``datetime.timedelta`` objects.
- Properties that might have more than 1 copy in the XML representation are put in a list, even if there is just one. This list will be identified by the pluralized version of the original property name. For example:
.. code-block:: xml
<...>
1234
5678
<...>
Will become:
.. code-block:: python3
...
"signals": [1234, 5678],
...
- The messages are usually used as a ``message_name, message_payload`` tuple. The message name is kept, for instance, ``oadrCanceledOpt``, and the payload is given as a dict.
Below is an alphabetized overview of all payloads with their XML and Python representations.
.. _oadrCanceledOpt:
oadrCanceledOpt
===============
OpenADR payload:
.. code-block:: xml
200
OK
f48e3b7e78
pc1e8ace47
pyOpenADR representation:
.. code-block:: python3
{'opt_id': 'pc1e8ace47',
'response': {'request_id': 'f48e3b7e78',
'response_code': 200,
'response_description': 'OK'}}
.. _oadrCanceledPartyRegistration:
oadrCanceledPartyRegistration
=============================
OpenADR payload:
.. code-block:: xml
200
OK
aba0a805de
zf68abb5c2
123ABC
pyOpenADR representation:
.. code-block:: python3
{'registration_id': 'zf68abb5c2',
'response': {'request_id': 'aba0a805de',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
.. _oadrCanceledReport:
oadrCanceledReport
==================
OpenADR payload:
.. code-block:: xml
200
OK
e4dfe735ea
v5d42c35e6
e8bf753e31
pyOpenADR representation:
.. code-block:: python3
{'pending_reports': [{'request_id': 'v5d42c35e6'},
{'request_id': 'e8bf753e31'}],
'response': {'request_id': 'e4dfe735ea',
'response_code': 200,
'response_description': 'OK'}}
OpenADR payload:
.. code-block:: xml
200
OK
c36bce5dcb
b04cbfb723
ra6231a650
123ABC
pyOpenADR representation:
.. code-block:: python3
{'pending_reports': [{'request_id': 'b04cbfb723'},
{'request_id': 'ra6231a650'}],
'response': {'request_id': 'c36bce5dcb',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
.. _oadrCancelOpt:
oadrCancelOpt
=============
OpenADR payload:
.. code-block:: xml
u07a26b1cc
b1ef7afecc
123ABC
pyOpenADR representation:
.. code-block:: python3
{'opt_id': 'b1ef7afecc', 'request_id': 'u07a26b1cc', 'ven_id': '123ABC'}
.. _oadrCancelPartyRegistration:
oadrCancelPartyRegistration
===========================
OpenADR payload:
.. code-block:: xml
z05e4ff0aa
pfe04d8439
123ABC
pyOpenADR representation:
.. code-block:: python3
{'registration_id': 'pfe04d8439',
'request_id': 'z05e4ff0aa',
'ven_id': '123ABC'}
.. _oadrCancelReport:
oadrCancelReport
================
OpenADR payload:
.. code-block:: xml
kcb7b5cf7a
u1ebe92deb
true
123ABC
pyOpenADR representation:
.. code-block:: python3
{'report_request_id': 'u1ebe92deb',
'report_to_follow': True,
'request_id': 'kcb7b5cf7a',
'ven_id': '123ABC'}
.. _oadrCreatedEvent:
oadrCreatedEvent
================
OpenADR payload:
.. code-block:: xml
200
OK
yaa3ee03b1
200
OK
ycab9acb9f
od864b4ea6
1
optIn
200
OK
bf2aad9af8
hc6cf67dab
1
optIn
200
OK
jefb88dcbd
qdff0da955
1
optIn
123ABC
pyOpenADR representation:
.. code-block:: python3
{'event_responses': [{'event_id': 'od864b4ea6',
'modification_number': 1,
'opt_type': 'optIn',
'request_id': 'ycab9acb9f',
'response_code': 200,
'response_description': 'OK'},
{'event_id': 'hc6cf67dab',
'modification_number': 1,
'opt_type': 'optIn',
'request_id': 'bf2aad9af8',
'response_code': 200,
'response_description': 'OK'},
{'event_id': 'qdff0da955',
'modification_number': 1,
'opt_type': 'optIn',
'request_id': 'jefb88dcbd',
'response_code': 200,
'response_description': 'OK'}],
'response': {'request_id': 'yaa3ee03b1',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
OpenADR payload:
.. code-block:: xml
200
OK
yde9c0369d
200
OK
zc9523b16d
fefaa2b0f2
1
optIn
200
OK
tbeecb7c97
t63a63fea4
1
optOut
123ABC
pyOpenADR representation:
.. code-block:: python3
{'event_responses': [{'event_id': 'fefaa2b0f2',
'modification_number': 1,
'opt_type': 'optIn',
'request_id': 'zc9523b16d',
'response_code': 200,
'response_description': 'OK'},
{'event_id': 't63a63fea4',
'modification_number': 1,
'opt_type': 'optOut',
'request_id': 'tbeecb7c97',
'response_code': 200,
'response_description': 'OK'}],
'response': {'request_id': 'yde9c0369d',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
.. _oadrCreatedReport:
oadrCreatedReport
=================
OpenADR payload:
.. code-block:: xml
200
OK
ie8ff94fbc
p8c56f9ed9
hab1cced95
123ABC
pyOpenADR representation:
.. code-block:: python3
{'pending_reports': [{'request_id': 'p8c56f9ed9'},
{'request_id': 'hab1cced95'}],
'response': {'request_id': 'ie8ff94fbc',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
OpenADR payload:
.. code-block:: xml
200
OK
gde557fcae
e1e16137f3
d0f2bcbe89
pyOpenADR representation:
.. code-block:: python3
{'pending_reports': [{'request_id': 'e1e16137f3'},
{'request_id': 'd0f2bcbe89'}],
'response': {'request_id': 'gde557fcae',
'response_code': 200,
'response_description': 'OK'}}
.. _oadrCreatedPartyRegistration:
oadrCreatedPartyRegistration
============================
This message is used by the VTN in two scenarios:
1. The VEN has just sent an :ref:`oadrQueryRegistration` request, and the VTN makes its available profiles and transport mechanisms known to the VEN
2. The VEN has just sent an :ref:`oadrCreatePartyRegistration` request, and the VTN responds by sending the registrationId to the VEN.
OpenADR payload:
.. code-block:: xml
200
OK
k6565d9280
o852fdbac9
123ABC
VTN123
2.0b
simpleHttp
pyOpenADR representation:
.. code-block:: python3
{'profiles': [{'profile_name': '2.0b',
'transports': [{'transport_name': 'simpleHttp'}]}],
'registration_id': 'o852fdbac9',
'response': {'request_id': 'k6565d9280',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC',
'vtn_id': 'VTN123'}
.. _oadrCreateOpt:
oadrCreateOpt
=============
OpenADR payload:
.. code-block:: xml
l170fb7ea4
optIn
participating
VEN123
2020-07-09T15:54:03.151236Z
k6dc07ece8
sdfe18dd5c
1
123ABC
pyOpenADR representation:
.. code-block:: python3
{'created_date_time': datetime.datetime(2020, 7, 9, 15, 54, 3, 151236, tzinfo=datetime.timezone.utc),
'event_id': 'sdfe18dd5c',
'modification_number': 1,
'opt_id': 'l170fb7ea4',
'opt_reason': 'participating',
'opt_type': 'optIn',
'request_id': 'k6dc07ece8',
'targets': [{'ven_id': '123ABC'}],
'ven_id': 'VEN123'}
.. _oadrCreatePartyRegistration:
oadrCreatePartyRegistration
===========================
OpenADR payload:
.. code-block:: xml
g31f3a2aae
123ABC
2.0b
simpleHttp
http://localhost
false
false
test
true
pyOpenADR representation:
.. code-block:: python3
{'http_pull_model': True,
'profile_name': '2.0b',
'report_only': False,
'request_id': 'g31f3a2aae',
'transport_address': 'http://localhost',
'transport_name': 'simpleHttp',
'ven_id': '123ABC',
'ven_name': 'test',
'xml_signature': False}
.. _oadrCreateReport:
oadrCreateReport
================
OpenADR payload:
.. code-block:: xml
sdbbdefaad
d2b7bade5f
9c8bdc00e7
PT15M
PT15M
2019-11-19T11:00:18.672768Z
PT2H
PT5M
d6e2e07485
Direct Read
123ABC
pyOpenADR representation:
.. code-block:: python3
{'report_requests': [{'report_request_id': 'd2b7bade5f',
'report_specifier': {'granularity': datetime.timedelta(seconds=900),
'report_back_duration': datetime.timedelta(seconds=900),
'report_interval': {'dtstart': datetime.datetime(2019, 11, 19, 11, 0, 18, 672768, tzinfo=datetime.timezone.utc),
'duration': datetime.timedelta(seconds=7200),
'tolerance': {'tolerate': {'startafter': datetime.timedelta(seconds=300)}}},
'report_specifier_id': '9c8bdc00e7',
'specifier_payload': {'r_id': 'd6e2e07485',
'reading_type': 'Direct '
'Read'}}}],
'request_id': 'sdbbdefaad',
'ven_id': '123ABC'}
.. _oadrDistributeEvent:
oadrDistributeEvent
===================
This message is sent by the VTN when it delivers an Event to a VEN. This is the main communication of the Event, and it contains myriad options to precisely define the event.
The VEN responds with either an :ref:`oadrCreatedEvent` message, indicating its 'opt' status ("Opt In" or "Opt Out").
OpenADR payload:
.. code-block:: xml
200
OK
123
i5fea744ae
VTN123
ifdda7aff6
1
2020-07-09T15:54:03.166717Z
1
http://MarketContext1
2020-07-09T15:54:03.166717Z
near
false
This is an event
2020-07-09T15:55:03.166717Z
PT10M
PT1M
1
8
PT1M
2
10
PT1M
3
12
PT1M
4
14
PT1M
5
16
PT1M
6
18
PT1M
7
20
PT1M
8
10
PT1M
9
20
LOAD_CONTROL
x-loadControlCapacity
zccf1b86ee
9.99
VEN001
VEN002
always
pyOpenADR representation:
.. code-block:: python3
{'events': [{'active_period': {'dtstart': datetime.datetime(2020, 7, 9, 15, 55, 3, 166717, tzinfo=datetime.timezone.utc),
'duration': datetime.timedelta(seconds=600)},
'event_descriptor': {'created_date_time': datetime.datetime(2020, 7, 9, 15, 54, 3, 166717, tzinfo=datetime.timezone.utc),
'event_id': 'ifdda7aff6',
'event_status': 'near',
'market_context': 'http://MarketContext1',
'modification_date_time': datetime.datetime(2020, 7, 9, 15, 54, 3, 166717, tzinfo=datetime.timezone.utc),
'modification_number': 1,
'priority': 1,
'test_event': 'false',
'vtn_comment': 'This is an event'},
'event_signals': [{'current_value': 9.99,
'intervals': [{'duration': datetime.timedelta(seconds=60),
'signal_payload': 8,
'uid': 1},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 10,
'uid': 2},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 12,
'uid': 3},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 14,
'uid': 4},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 16,
'uid': 5},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 18,
'uid': 6},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 20,
'uid': 7},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 10,
'uid': 8},
{'duration': datetime.timedelta(seconds=60),
'signal_payload': 20,
'uid': 9}],
'signal_id': 'zccf1b86ee',
'signal_name': 'LOAD_CONTROL',
'signal_type': 'x-loadControlCapacity'}],
'response_required': 'always',
'targets': [{'ven_id': 'VEN001'}, {'ven_id': 'VEN002'}]}],
'request_id': 'i5fea744ae',
'response': {'request_id': 123,
'response_code': 200,
'response_description': 'OK'},
'vtn_id': 'VTN123'}
.. _oadrPoll:
oadrPoll
========
This message is sent by the VEN to the VTN to poll for new messages. The VTN responds by sending an empty :ref:`oadrResponse`, a :ref:`oadrDistributeEvent` in case there is an Event for the VEN, a :ref:`oadrRequestReregistration` message in case the VTN want the VEN to register again.
In case the VEN wants to hear only about new Events, it can send a :ref:`oadrRequestEvent` message to the VTN.
OpenADR payload:
.. code-block:: xml
123ABC
pyOpenADR representation:
.. code-block:: python3
{'ven_id': '123ABC'}
.. _oadrQueryRegistration:
oadrQueryRegistration
=====================
This message is used by the VEN to request information on the VTN's capabilities before registering. The VTN will respond with a :ref:`oadrCreatedPartyRegistration` message.
OpenADR payload:
.. code-block:: xml
i8cf15d21f
pyOpenADR representation:
.. code-block:: python3
{'request_id': 'i8cf15d21f'}
.. _oadrRegisteredReport:
oadrRegisteredReport
====================
OpenADR payload:
.. code-block:: xml
200
OK
uadb7d5fe5
f5308f6138
se40c348d9
PT15M
PT15M
2020-07-09T15:54:03.184498Z
PT2H
PT5M
PT30M
PT15M
PT5M
u461c6e37e
Direct Read
tc88cf616d
le65d1bd2e
PT15M
PT15M
2020-07-09T15:54:03.184526Z
PT2H
PT5M
PT30M
PT15M
PT5M
caaff64e5a
Direct Read
VEN123
pyOpenADR representation:
.. code-block:: python3
{'report_requests': [{'report_request_id': 'f5308f6138',
'report_specifier': {'granularity': datetime.timedelta(seconds=900),
'report_back_duration': datetime.timedelta(seconds=900),
'report_interval': {'dtstart': datetime.datetime(2020, 7, 9, 15, 54, 3, 184498, tzinfo=datetime.timezone.utc),
'duration': datetime.timedelta(seconds=7200),
'notification': datetime.timedelta(seconds=1800),
'ramp_up': datetime.timedelta(seconds=900),
'recovery': datetime.timedelta(seconds=300),
'tolerance': {'tolerate': {'startafter': datetime.timedelta(seconds=300)}}},
'report_specifier_id': 'se40c348d9',
'specifier_payload': {'r_id': 'u461c6e37e',
'reading_type': 'Direct '
'Read'}}},
{'report_request_id': 'tc88cf616d',
'report_specifier': {'granularity': datetime.timedelta(seconds=900),
'report_back_duration': datetime.timedelta(seconds=900),
'report_interval': {'dtstart': datetime.datetime(2020, 7, 9, 15, 54, 3, 184526, tzinfo=datetime.timezone.utc),
'duration': datetime.timedelta(seconds=7200),
'notification': datetime.timedelta(seconds=1800),
'ramp_up': datetime.timedelta(seconds=900),
'recovery': datetime.timedelta(seconds=300),
'tolerance': {'tolerate': {'startafter': datetime.timedelta(seconds=300)}}},
'report_specifier_id': 'le65d1bd2e',
'specifier_payload': {'r_id': 'caaff64e5a',
'reading_type': 'Direct '
'Read'}}}],
'response': {'request_id': 'uadb7d5fe5',
'response_code': 200,
'response_description': 'OK'},
'ven_id': 'VEN123'}
.. _oadrRequestEvent:
oadrRequestEvent
================
OpenADR payload:
.. code-block:: xml
oa1c52db3f
123ABC
pyOpenADR representation:
.. code-block:: python3
{'request_id': 'oa1c52db3f', 'ven_id': '123ABC'}
.. _oadrRequestReregistration:
oadrRequestReregistration
=========================
This message is sent by the VTN whenever it want the VEN to go through the registration procedure again. Usually sent in reply to a :ref:`oadrPoll` message.
OpenADR payload:
.. code-block:: xml
123ABC
pyOpenADR representation:
.. code-block:: python3
{'ven_id': '123ABC'}
.. _oadrResponse:
oadrResponse
============
This is a generic message that the VTN sends to the VEN if there is no other message for the VEN. Usually sent in response to an :ref:`oadrPoll` or :ref:`oadrRequestEvent` message.
OpenADR payload:
.. code-block:: xml
200
OK
i4a4d03ae5
123ABC
pyOpenADR representation:
.. code-block:: python3
{'response': {'request_id': 'i4a4d03ae5',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
OpenADR payload:
.. code-block:: xml
200
OK
123ABC
pyOpenADR representation:
.. code-block:: python3
{'response': {'request_id': None,
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
.. _oadrUpdatedReport:
oadrUpdatedReport
=================
OpenADR payload:
.. code-block:: xml
200
OK
icaffaa44f
ra11e4fee3
kbf16facdd
kfbae403c3
k91557da99
false
123ABC
123ABC
pyOpenADR representation:
.. code-block:: python3
{'cancel_report': {'report_request_id': ['kbf16facdd',
'kfbae403c3',
'k91557da99'],
'report_to_follow': False,
'request_id': 'ra11e4fee3',
'ven_id': '123ABC'},
'response': {'request_id': 'icaffaa44f',
'response_code': 200,
'response_description': 'OK'},
'ven_id': '123ABC'}
.. _oadrUpdateReport:
oadrUpdateReport
================
This message contains a report.
OpenADR payload:
.. code-block:: xml
bfbaaa469c
z4edcf6f9d
s1167debd8
123ABC
DEF456
123ABC
x-resourceStatus
x-RMS
http://localhost
PT1M
PT2M
false
m04fa486ef
w5fdcab8d0
TELEMETRY_USAGE
2020-07-10T09:24:38.606626Z
123ABC
pyOpenADR representation:
.. code-block:: python3
{'reports': [{'created_date_time': datetime.datetime(2020, 7, 10, 9, 24, 38, 606626, tzinfo=datetime.timezone.utc),
'report_descriptions': [{'market_context': 'http://localhost',
'r_id': 's1167debd8',
'reading_type': 'x-RMS',
'report_data_sources': [{'ven_id': '123ABC'}],
'report_subjects': [{'ven_id': '123ABC'},
{'ven_id': 'DEF456'}],
'report_type': 'x-resourceStatus',
'sampling_rate': {'max_period': datetime.timedelta(seconds=120),
'min_period': datetime.timedelta(seconds=60),
'on_change': False}}],
'report_id': 'z4edcf6f9d',
'report_name': 'TELEMETRY_USAGE',
'report_request_id': 'm04fa486ef',
'report_specifier_id': 'w5fdcab8d0'}],
'request_id': 'bfbaaa469c',
'ven_id': '123ABC'}