# Example consuming OpenADR price signals using HTTP GET # Copyright 2020, Olivine, Inc. import requests import xml.etree.ElementTree as ET import isodate # namespaces oadr = 'http://openadr.org/oadr-2.0b/2012/07' ei = 'http://docs.oasis-open.org/ns/energyinterop/201110' xcal = 'urn:ietf:params:xml:ns:icalendar-2.0' # request payload r = requests.get('https://api.olivineinc.com/i/oe/pricing/signal/paced/etou-dyn') if r.status_code != 200: print (f'exiting with HTTP status {{{r.status_code}}}.') exit() # parse event = ET.fromstring(r.text) # output event vtnComment = event.find(f'{{{ei}}}eventDescriptor/{{{ei}}}vtnComment').text metaData = dict(item.split(':', 1) for item in vtnComment.split(';')) [print(f'{key}: {value}') for key, value in metaData.items()] # get start time activePeriod = event.find(f'{{{ei}}}eiActivePeriod') isoTime = activePeriod.find(f'{{{xcal}}}properties/{{{xcal}}}dtstart/{{{xcal}}}date-time').text startTime = isodate.parse_datetime(isoTime) # process signals for signal in event.iter(f'{{{ei}}}eiEventSignal'): for interval in signal.iter(f'{{{ei}}}interval'): isoDuration = interval.find(f'{{{xcal}}}duration')[0].text price = float(interval.find(f'{{{ei}}}signalPayload/{{{ei}}}payloadFloat')[0].text) duration = isodate.parse_duration(isoDuration) endTime = startTime + duration print (f'{startTime:%Y-%M-%d %H:%m} to {endTime:%Y-%M-%d %H:%m}: {price:.5f}') startTime = endTime