Ejemplo n.º 1
0
def test_oadr_event():
    event = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id=1,
            modification_number=0,
            market_context='MarketContext1',
            event_status=enums.EVENT_STATUS.NEAR),
        active_period=objects.ActivePeriod(dtstart=datetime.now(),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=datetime.now(),
                                 duration=timedelta(minutes=5),
                                 uid=0,
                                 signal_payload=1),
                objects.Interval(dtstart=datetime.now(),
                                 duration=timedelta(minutes=5),
                                 uid=1,
                                 signal_payload=2)
            ],
                                targets=[objects.Target(ven_id='1234')],
                                signal_name=enums.SIGNAL_NAME.LOAD_CONTROL,
                                signal_type=enums.SIGNAL_TYPE.LEVEL,
                                signal_id=1,
                                current_value=0)
        ],
        targets=[objects.Target(ven_id='1234')])

    response = objects.Response(response_code=200,
                                response_description='OK',
                                request_id='1234')
    msg = create_message('oadrDistributeEvent',
                         response=response,
                         events=[event])
    message_type, message_payload = parse_message(msg)
Ejemplo n.º 2
0
 async def on_poll(ven_id, future=None):
     if future and not future.done():
         future.set_result(True)
         return objects.Event(
             event_descriptor=objects.EventDescriptor(
                 event_id='event001',
                 modification_number=0,
                 event_status='far',
                 market_context='http://marketcontext01'),
             event_signals=[
                 objects.EventSignal(
                     signal_id='signal001',
                     signal_type='level',
                     signal_name='simple',
                     intervals=[
                         objects.Interval(
                             dtstart=now,
                             duration=datetime.timedelta(minutes=10),
                             signal_payload=1)
                     ]),
                 objects.EventSignal(
                     signal_id='signal002',
                     signal_type='price',
                     signal_name='ELECTRICITY_PRICE',
                     intervals=[
                         objects.Interval(
                             dtstart=now,
                             duration=datetime.timedelta(minutes=10),
                             signal_payload=1)
                     ])
             ],
             targets=[objects.Target(ven_id=ven_id)])
     else:
         print("Returning None")
         return None
Ejemplo n.º 3
0
def test_oadr_event_targets_and_targets_by_type():
    event = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id=1,
            modification_number=0,
            market_context='MarketContext1',
            event_status=enums.EVENT_STATUS.NEAR),
        active_period=objects.ActivePeriod(dtstart=datetime.now(),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=datetime.now(),
                                 duration=timedelta(minutes=5),
                                 uid=0,
                                 signal_payload=1),
                objects.Interval(dtstart=datetime.now(),
                                 duration=timedelta(minutes=5),
                                 uid=1,
                                 signal_payload=2)
            ],
                                targets=[objects.Target(ven_id='1234')],
                                signal_name=enums.SIGNAL_NAME.LOAD_CONTROL,
                                signal_type=enums.SIGNAL_TYPE.LEVEL,
                                signal_id=1,
                                current_value=0)
        ],
        targets=[{
            'ven_id': 'ven123'
        }],
        targets_by_type={'ven_id': ['ven123']})

    msg = create_message('oadrDistributeEvent', events=[event])
    validate_xml_schema(ensure_bytes(msg))
    message_type, message_payload = parse_message(msg)
Ejemplo n.º 4
0
def test_get_active_period_from_intervals():
    now = datetime.now(timezone.utc)
    intervals = [{
        'dtstart': now,
        'duration': timedelta(seconds=5)
    }, {
        'dtstart': now + timedelta(seconds=5),
        'duration': timedelta(seconds=5)
    }]
    assert utils.get_active_period_from_intervals(intervals) == {
        'dtstart': now,
        'duration': timedelta(seconds=10)
    }

    intervals = [
        objects.Interval(dtstart=now,
                         duration=timedelta(seconds=5),
                         signal_payload=1),
        objects.Interval(dtstart=now + timedelta(seconds=5),
                         duration=timedelta(seconds=5),
                         signal_payload=2)
    ]
    assert utils.get_active_period_from_intervals(intervals) == {
        'dtstart': now,
        'duration': timedelta(seconds=10)
    }

    assert utils.get_active_period_from_intervals(
        intervals,
        False) == objects.ActivePeriod(dtstart=now,
                                       duration=timedelta(seconds=10))
Ejemplo n.º 5
0
def test_oadr_event_no_targets():
    with pytest.raises(ValueError):
        event = objects.Event(
            event_descriptor=objects.EventDescriptor(
                event_id=1,
                modification_number=0,
                market_context='MarketContext1',
                event_status=enums.EVENT_STATUS.NEAR),
            active_period=objects.ActivePeriod(dtstart=datetime.now(),
                                               duration=timedelta(minutes=10)),
            event_signals=[
                objects.EventSignal(intervals=[
                    objects.Interval(dtstart=datetime.now(),
                                     duration=timedelta(minutes=5),
                                     uid=0,
                                     signal_payload=1),
                    objects.Interval(dtstart=datetime.now(),
                                     duration=timedelta(minutes=5),
                                     uid=1,
                                     signal_payload=2)
                ],
                                    targets=[objects.Target(ven_id='1234')],
                                    signal_name=enums.SIGNAL_NAME.LOAD_CONTROL,
                                    signal_type=enums.SIGNAL_TYPE.LEVEL,
                                    signal_id=1,
                                    current_value=0)
            ])
Ejemplo n.º 6
0
async def test_raw_event():
    now = datetime.datetime.now(datetime.timezone.utc)
    server = OpenADRServer(vtn_id='myvtn')
    server.add_handler('on_create_party_registration',
                       on_create_party_registration)
    event = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            event_status='far',
            market_context='http://marketcontext01'),
        event_signals=[
            objects.EventSignal(
                signal_id='signal001',
                signal_type='level',
                signal_name='simple',
                intervals=[
                    objects.Interval(dtstart=now,
                                     duration=datetime.timedelta(minutes=10),
                                     signal_payload=1)
                ]),
            objects.EventSignal(
                signal_id='signal002',
                signal_type='price',
                signal_name='ELECTRICITY_PRICE',
                intervals=[
                    objects.Interval(dtstart=now,
                                     duration=datetime.timedelta(minutes=10),
                                     signal_payload=1)
                ])
        ],
        targets=[objects.Target(ven_id='ven123')])
    loop = asyncio.get_event_loop()
    event_callback_future = loop.create_future()
    server.add_raw_event(ven_id='ven123',
                         event=event,
                         callback=partial(event_callback,
                                          future=event_callback_future))

    on_event_future = loop.create_future()
    client = OpenADRClient(
        ven_name='myven', vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b')
    client.add_handler('on_event',
                       partial(on_event_opt_in, future=on_event_future))

    await server.run_async()
    await client.run()
    event = await on_event_future
    assert len(event['event_signals']) == 2

    result = await event_callback_future
    assert result == 'optIn'

    await client.stop()
    await server.stop()
Ejemplo n.º 7
0
async def test_client_event_cleanup():
    now = datetime.datetime.now(datetime.timezone.utc)
    server = OpenADRServer(vtn_id='myvtn')
    server.add_handler('on_create_party_registration',
                       on_create_party_registration)

    loop = asyncio.get_event_loop()
    event_1_callback_future = loop.create_future()
    event_2_callback_future = loop.create_future()
    server.add_event(ven_id='ven123',
                     signal_name='simple',
                     signal_type='level',
                     intervals=[
                         objects.Interval(
                             dtstart=now,
                             duration=datetime.timedelta(seconds=1),
                             signal_payload=1)
                     ],
                     callback=event_1_callback_future)
    await server.run()

    client = OpenADRClient(
        ven_name='ven123',
        vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b')
    client.add_handler('on_event', on_event_opt_in)
    await client.run()
    await asyncio.sleep(0.5)
    assert len(client.received_events) == 1

    await asyncio.sleep(0.5)
    await client._event_cleanup()
    assert len(client.received_events) == 0

    await server.stop()
    await client.stop()
Ejemplo n.º 8
0
def test_increment_modification_number():
    now = datetime.now(timezone.utc)
    event = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            priority=1,
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    utils.increment_event_modification_number(event)
    assert utils.getmember(event, 'event_descriptor.modification_number') == 1
    utils.increment_event_modification_number(event)
    assert utils.getmember(event, 'event_descriptor.modification_number') == 2
Ejemplo n.º 9
0
async def test_cancel_event():
    async def opt_in_to_event(event, future=None):
        if future:
            future.set_result(True)
        return 'optIn'

    async def on_update_event(event, future=None):
        if future:
            future.set_result(event)
        return 'optIn'

    now = datetime.datetime.now(datetime.timezone.utc)
    server = OpenADRServer(vtn_id='myvtn',
                           requested_poll_freq=datetime.timedelta(seconds=1))
    server.add_handler('on_create_party_registration',
                       on_create_party_registration)

    loop = asyncio.get_event_loop()
    event_1_callback_future = loop.create_future()
    event_id = server.add_event(
        ven_id='ven123',
        signal_name='simple',
        signal_type='level',
        intervals=[
            objects.Interval(dtstart=now,
                             duration=datetime.timedelta(seconds=60),
                             signal_payload=1)
        ],
        callback=event_1_callback_future,
        response_required='always')
    await server.run()

    client = OpenADRClient(
        ven_name='ven123',
        vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b')
    client.add_handler('on_event', opt_in_to_event)
    cancel_future = loop.create_future()
    client.add_handler('on_update_event',
                       partial(on_update_event, future=cancel_future))
    await client.run()
    await event_1_callback_future
    server.cancel_event('ven123', event_id)

    result = await cancel_future
    assert utils.getmember(result,
                           'event_descriptor.event_status') == 'cancelled'

    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrResponse'

    await client._event_cleanup()

    assert len(client.responded_events) == 0
    assert len(client.received_events) == 0

    await server.stop()
    await client.stop()
Ejemplo n.º 10
0
def test_server_add_event_with_custom_signal_name():
    server = OpenADRServer(vtn_id='myvtn')
    server.add_event(ven_id='ven123',
                     signal_name='x-invalid',
                     signal_type='x-loadControlCapacity',
                     intervals=[
                         objects.Interval(dtstart=datetime.now(timezone.utc),
                                          duration=timedelta(seconds=10),
                                          signal_payload=1.0)
                     ])
    assert len(server.events['ven123']) == 1
Ejemplo n.º 11
0
def test_server_add_event_with_invalid_signal_name():
    server = OpenADRServer(vtn_id='myvtn')
    with pytest.raises(ValueError):
        server.add_event(ven_id='ven123',
                         signal_name='invalid',
                         signal_type='x-loadControlCapacity',
                         intervals=[
                             objects.Interval(dtstart=datetime.now(
                                 timezone.utc),
                                              duration=timedelta(seconds=10),
                                              signal_payload=1.0)
                         ])
Ejemplo n.º 12
0
def test_event_signal_with_incongruent_targets():
    with pytest.raises(ValueError):
        event_signal = objects.EventSignal(
            intervals=[
                objects.Interval(dtstart=datetime.now(timezone.utc),
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
            signal_name='simple',
            signal_type='level',
            signal_id='signal123',
            targets=[objects.Target(ven_id='ven123')],
            targets_by_type={'ven_id': ['ven123', 'ven456']})
Ejemplo n.º 13
0
def test_event_signal_with_grouped_targets():
    event_signal = objects.EventSignal(
        intervals=[
            objects.Interval(dtstart=datetime.now(timezone.utc),
                             duration=timedelta(minutes=10),
                             signal_payload=1)
        ],
        signal_name='simple',
        signal_type='level',
        signal_id='signal123',
        targets_by_type={'ven_id': ['ven123', 'ven456']})
    assert event_signal.targets == [
        objects.Target(ven_id='ven123'),
        objects.Target(ven_id='ven456')
    ]
Ejemplo n.º 14
0
    return message_type, message_payload


event = objects.Event(event_descriptor=objects.EventDescriptor(
    event_id='event123',
    event_status='far',
    modification_number='1',
    market_context='http://marketcontext01'),
                      event_signals=[
                          objects.EventSignal(
                              signal_name='simple',
                              signal_type='level',
                              signal_id=utils.generate_id(),
                              intervals=[
                                  objects.Interval(
                                      dtstart=datetime.now(timezone.utc),
                                      duration=timedelta(minutes=10),
                                      signal_payload=1)
                              ])
                      ],
                      targets=[{
                          'ven_id': 'ven123'
                      }])

poll_responses = [('oadrResponse', {}),
                  ('oadrDistributeEvent', {
                      'events': [asdict(event)]
                  }),
                  ('oadrCreateReport', {
                      'report_requests': [{
                          'report_request_id': 'req123',
                          'report_specifier': {
Ejemplo n.º 15
0
async def test_multiple_events_in_queue():
    now = datetime.datetime.now(datetime.timezone.utc)
    server = OpenADRServer(vtn_id='myvtn')
    server.add_handler('on_create_party_registration',
                       on_create_party_registration)

    loop = asyncio.get_event_loop()
    event_1_callback_future = loop.create_future()
    event_2_callback_future = loop.create_future()
    server.add_event(ven_id='ven123',
                     signal_name='simple',
                     signal_type='level',
                     intervals=[
                         objects.Interval(
                             dtstart=now,
                             duration=datetime.timedelta(seconds=1),
                             signal_payload=1)
                     ],
                     callback=event_1_callback_future)

    await server.run()

    on_event_future = loop.create_future()
    client = OpenADRClient(
        ven_name='ven123',
        vtn_url='http://localhost:8080/OpenADR2/Simple/2.0b')
    await client.create_party_registration()
    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrDistributeEvent'
    events = response_payload['events']
    assert len(events) == 1
    event_id = events[0]['event_descriptor']['event_id']
    request_id = response_payload['request_id']
    await client.created_event(request_id=request_id,
                               event_id=event_id,
                               opt_type='optIn',
                               modification_number=0)

    server.add_event(ven_id='ven123',
                     signal_name='simple',
                     signal_type='level',
                     intervals=[
                         objects.Interval(
                             dtstart=now + datetime.timedelta(seconds=1),
                             duration=datetime.timedelta(seconds=1),
                             signal_payload=1)
                     ],
                     callback=event_2_callback_future)
    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrDistributeEvent'
    events = response_payload['events']

    # Assert that we still have two events in the response
    assert len(events) == 2

    # Wait one second and retrieve the events again
    await asyncio.sleep(1)
    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrDistributeEvent'
    events = response_payload['events']
    assert len(events) == 2
    assert events[1]['event_descriptor']['event_status'] == 'completed'

    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrDistributeEvent'
    events = response_payload['events']
    assert len(events) == 1
    await asyncio.sleep(1)

    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrDistributeEvent'

    response_type, response_payload = await client.request_event()
    assert response_type == 'oadrResponse'

    await server.stop()
Ejemplo n.º 16
0
def test_order_events():
    now = datetime.now(timezone.utc)
    event_1_active_high_prio = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            priority=1,
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    event_2_active_low_prio = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            priority=2,
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    event_3_active_no_prio = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now - timedelta(minutes=5),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    event_4_far_early = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now + timedelta(minutes=5),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    event_5_far_later = objects.Event(
        event_descriptor=objects.EventDescriptor(
            event_id='event001',
            modification_number=0,
            created_date_time=now,
            event_status='far',
            market_context='http://context01'),
        active_period=objects.ActivePeriod(dtstart=now + timedelta(minutes=10),
                                           duration=timedelta(minutes=10)),
        event_signals=[
            objects.EventSignal(intervals=[
                objects.Interval(dtstart=now,
                                 duration=timedelta(minutes=10),
                                 signal_payload=1)
            ],
                                signal_name='simple',
                                signal_type='level',
                                signal_id='signal001')
        ],
        targets=[{
            'ven_id': 'ven001'
        }])

    events = [
        event_5_far_later, event_4_far_early, event_3_active_no_prio,
        event_2_active_low_prio, event_1_active_high_prio
    ]
    ordered_events = utils.order_events(events)
    assert ordered_events == [
        event_1_active_high_prio, event_2_active_low_prio,
        event_3_active_no_prio, event_4_far_early, event_5_far_later
    ]

    ordered_events = utils.order_events(event_1_active_high_prio)
    assert ordered_events == [event_1_active_high_prio]

    event_1_as_dict = asdict(event_1_active_high_prio)
    ordered_events = utils.order_events(event_1_as_dict)
    assert ordered_events == [event_1_as_dict]