Skip to content

Commit 92336dc

Browse files
committed
Add support for event callbacks to server.add_raw_event method.
Adds the same callback interface to the server.add_raw_event method that we had for the server.add_event method. This was reported in OpenLEADR#35. Signed-off-by: Stan Janssen <[email protected]>
1 parent bad87bc commit 92336dc

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

openleadr/server.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -233,16 +233,21 @@ def add_event(self, ven_id, signal_name, signal_type, intervals, callback, targe
233233
self.services['event_service'].pending_events[event_id] = (event, callback)
234234
return event_id
235235

236-
def add_raw_event(self, ven_id, event):
236+
def add_raw_event(self, ven_id, event, callback):
237237
"""
238238
Add a new event to the queue for a specific VEN.
239239
:param str ven_id: The ven_id to which this event should be distributed.
240240
:param dict event: The event (as a dict or as a objects.Event instance)
241241
that contains the event details.
242+
:param callable callback: A callback that will receive the opt status for this event.
243+
This callback receives ven_id, event_id, opt_type as its arguments.
242244
"""
243245
if ven_id not in self.message_queues:
244246
self.message_queues[ven_id] = deque()
247+
event_id = utils.getmember(utils.getmember(event, 'event_descriptor'), 'event_id')
245248
self.message_queues[ven_id].append(event)
249+
self.services['event_service'].pending_events[event_id] = (event, callback)
250+
return event_id
246251

247252
def add_handler(self, name, func):
248253
"""

test/test_queues.py

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from openleadr import OpenADRClient, OpenADRServer, enable_default_logging
1+
from openleadr import OpenADRClient, OpenADRServer, enable_default_logging, objects, utils
22
import pytest
33
import asyncio
44
import datetime
@@ -197,3 +197,47 @@ async def test_request_event():
197197
message_type, message_payload = await client.request_event()
198198
assert message_type == 'oadrResponse'
199199
await server.stop()
200+
201+
202+
@pytest.mark.asyncio
203+
async def test_raw_event():
204+
now = datetime.datetime.now(datetime.timezone.utc)
205+
server = OpenADRServer(vtn_id='myvtn')
206+
server.add_handler('on_create_party_registration', on_create_party_registration)
207+
event = objects.Event(event_descriptor=objects.EventDescriptor(event_id='event001',
208+
modification_number=0,
209+
event_status='far',
210+
market_context='http://marketcontext01'),
211+
event_signals=[objects.EventSignal(signal_id='signal001',
212+
signal_type='level',
213+
signal_name='simple',
214+
intervals=[objects.Interval(dtstart=now,
215+
duration=datetime.timedelta(minutes=10),
216+
signal_payload=1)]),
217+
objects.EventSignal(signal_id='signal002',
218+
signal_type='price',
219+
signal_name='ELECTRICITY_PRICE',
220+
intervals=[objects.Interval(dtstart=now,
221+
duration=datetime.timedelta(minutes=10),
222+
signal_payload=1)])],
223+
targets=[objects.Target(ven_id='ven123')])
224+
loop = asyncio.get_event_loop()
225+
event_callback_future = loop.create_future()
226+
server.add_raw_event(ven_id='ven123', event=event, callback=partial(event_callback, future=event_callback_future))
227+
228+
on_event_future = loop.create_future()
229+
client = OpenADRClient(ven_name='myven',
230+
vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b')
231+
client.add_handler('on_event', partial(on_event_opt_in, future=on_event_future))
232+
233+
await server.run_async()
234+
await client.run()
235+
event = await on_event_future
236+
assert len(event['event_signals']) == 2
237+
238+
result = await event_callback_future
239+
assert result == 'optIn'
240+
241+
await client.stop()
242+
await server.stop()
243+

0 commit comments

Comments
 (0)