Atom & ESPI
The relationship between Atom & ESPI for carrying Green Button Data
Green Button data files and streams use the Atom Syndication Format Standard to represent structured energy-usage information and retail-customer data in an Extensible Markup Language (XML) format. The power of the Atom Syndication Format to encode complex data for exchange over REST web services was independently recognized by both the GData (Google) and OData (Microsoft) standards. Based on this, the OpenADE Task Force adopted this construct for the development of the NAESB Energy Services Provider Interface (ESPI): the Green Button core standard.
Structure of Atom Syndication for ESPI
Green Button data are structured as specific XML elements from the NAESB espi.xsd and NAESB customer.xsd inside XML that is defined by the W3C atom.xsd. The Atom elements act as “wrappers” around the NAESB Energy Usage and Retail Customer XML data.
For example, look at the <LocalTimeParameters>
element found wrapped in an <entry>
<content>
pair within this singular <feed>
element. In this example, the <feed>
is the root of the Green Button data file/stream:
<!-- Atom wrapper around the ESPI Resources -->
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:espi="http://naesb.org/espi"
xsi:schemaLocation=
"http://www.w3.org/2005/Atom https://greenbuttondata.org/xsd/3_3/atom.xsd
http://naesb.org/espi https://www.naesb.org/espi.xsd">
<id>urn:uuid:3d8aed62-26a7-589a-9473-98f02ef82dc2</id>
<title>Green Button Data</title>
<updated>2022-05-03T04:00:00Z</updated>
<link rel="self"
href="https://data.greenbuttonconnect.org/DataCustodian/espi/1_1/resource/Subscription/4a795488feac"
type="espi-entry/Subscription"/>
<entry>
<!-- LocalTimeParameters -->
<id>urn:uuid:eb4cdb32-6eb7-52c8-a1e3-b14f93dedd79</id>
<link rel="self"
href="https://data.greenbuttonconnect.org/DataCustodian/espi/1_1/resource/LocalTimeParameters/8fc3a2ea413e"
type="espi-entry/LocalTimeParameters"/>
<link rel="up"
href="https://data.greenbuttonconnect.org/DataCustodian/espi/1_1/resource/LocalTimeParameters"
type="espi-feed/LocalTimeParameters"/>
<link rel="related"
href="https://data.greenbuttonconnect.org/DataCustodian/espi/1_1/resource/RetailCustomer/927ca70a14be/UsagePoint/1feb6f7cf56e"
type="espi-entry/UsagePoint"/>
<title>DST For Eastern Time in North America</title>
<content>
<!-- one of many ESPI Resources -->
<espi:LocalTimeParameters>
<espi:dstEndRule>B40E2000</espi:dstEndRule>
<espi:dstOffset>3600</espi:dstOffset>
<espi:dstStartRule>360E2000</espi:dstStartRule>
<espi:tzOffset>-18000</espi:tzOffset>
</espi:LocalTimeParameters>
</content>
<published>2022-05-03T04:00:00Z</published>
<updated>2022-05-03T04:00:00Z</updated>
</entry>
...
</feed>
Feed or Entry
Each <feed>
can contain multiple <entry>
elements that each can contain an ESPI Resource like <LocalTimeParameters>
, <UsagePoint>
, and others.
However, if only a single <entry>
is being sent—requested by an application programming interface (API) call—then <entry>
can be used as the root of the Green Button data stream instead of using the <feed>
as the root (with all its metadata overhead).
Links of an Atom Feed
You will notice there are many <link>
elements inside the singular <feed>
element. Each <link>
has the following attributes:
rel=
to denote the<link>
relates to the<entry>
or to the<feed>
in-which it is found.- Each
<feed>
has several<link>
elements as-does each<entry>
element.
- Each
href=
to define the path to-which the<link>
is related (rel
) in that<entry>
or<feed>
.- It is important to note that the structure of the URL must follow the ESPI Standard and
- the URL must be absolute (not relative); thus containing a full path with the
https://
.
type=
to denote the relationship of the data:espi
(usage data) orcustomer
(identifying data)…feed
(a collection of points) orentry
(a single point)
- the ESPI Resource being referenced…
<LocalTimeParameters>
,<UsagePoint>
,<MeterReading>
,<IntervalBlock>
, etc.
The ESPI Standard documentation describes what’s needed for a given ESPI Resource.
Namespaces for Atom and ESPI
XML functions by having defined namespaces for the elements that comprise a file/stream of data.
Namespaces allow programmers to keep one definition separate from another.
One dictionary may define the word “bonnet” to be “a hat worn by a person” whereas another dictionary may define it to be “the hood of an automobile.” Namespaces prevent one definition from encroaching upon another definition in an XML context.
Since Atom is the wrapper around ESPI Resources, we give Atom a default namespace: xmlns
(for XML NameSpace).
We then explicitly define the ESPI namespace: xmlns:espi
(we would instead define xmlns:cust
for the Retail Customer, identifiable-information data, if our example was for those data).
You’ll note in our examples that there is also a namespace for “XMLSchema-instance” named xmlns:xsi
that covers the standard definitions of what comprise XML in the first place. Tools usually know those definitions anyway but it’s good practice to explicitly keep it separate.
Lastly, we try to help programmers with our examples by referencing the actual namespace dictionaries we use: an XML Schema Definition file, or XSD, is where the elements get their definitions. We include the schema locations for those XSDs in our examples. This allows a programmer to simply open an XML file with their development tools and ensure each element meets the standardized definitions.
We place the xsi:schemaLocation
attribute in the <feed>
root element:
xsi:schemaLocation=
"namespace1 web-location-of-XSD-file-1
namespace2 web-location-of-XSD-file-2">
… as this:
xsi:schemaLocation=
"http://www.w3.org/2005/Atom https://greenbuttondata.org/xsd/3_3/atom.xsd
http://naesb.org/espi https://www.naesb.org/espi.xsd">
Despite http://www.w3.org/2005/Atom and http://naesb.org/espi having the the look-and-feel of actual web-location links (web-location links are “uniform resource locators,” or “URLs”), they are not links to the XSDs. They are simply namespaces (uniform resource identifiers, or URIs). The URLs that follow those namespaces are actual web links.
The namespace resources can be found at the true web links that follow after those namespaces in the example, above. The namespaces could have readable names like JaneSmith but they would not be universally unique. There are other, more-defined, unique, non-URL representations (uniform resource names, or URNs) that could be used instead but often (not always) there is additional information about versioning and authors at the non-resource namespace when it is a URL (web link); so many XML schema designers prefer to use a web link for the namespace even if it is a bit confusing for people not familiar with XML namespaces.
Namespaces defined at Root or Inline
Below, is a smaller example of the namespaces used two different ways:
- defined in the
<feed>
(root of the XML file/stream) and - defined in the enclosed
<content>
element (e.g.,<LocalTimeParameters>
) in-which it is a different namespace, inline.
Neither method is better than the other; it’s a matter of programming preference. You will find our examples both ways and often we use the method that makes it easiest to show you something important in the fewest number of lines for a given example:
<!-- Namespace in Feed -->
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:espi="http://naesb.org/espi"
xsi:schemaLocation=
"http://www.w3.org/2005/Atom https://greenbuttondata.org/xsd/3_3/atom.xsd
http://naesb.org/espi https://www.naesb.org/espi.xsd">
<id>urn:uuid:3d8aed62-26a7-589a-9473-98f02ef82dc2</id>
<title>Green Button Data</title>
<updated>2022-05-03T04:00:00Z</updated>
<link ... />
<link ... />
<entry>
<!-- LocalTimeParameters -->
<id>urn:uuid:eb4cdb32-6eb7-52c8-a1e3-b14f93dedd79</id>
<link ... />
<link ... />
<link ... />
<title>DST For Eastern Time in North America</title>
<content>
<!-- ESPI namespace defined at root (xmlns:espi)
and referenced in the element and each child -->
<espi:LocalTimeParameters>
<espi:dstEndRule>B40E2000</espi:dstEndRule>
<espi:dstOffset>3600</espi:dstOffset>
<espi:dstStartRule>360E2000</espi:dstStartRule>
<espi:tzOffset>-18000</espi:tzOffset>
</espi:LocalTimeParameters>
</content>
<published>2022-05-03T04:00:00Z</published>
<updated>2022-05-03T04:00:00Z</updated>
</entry>
...
</feed>