def build_event_info(self, event_xml): e_id = event.get_event_id(event_xml) e_mod_num = event.get_mod_number(event_xml) e_status = event.get_status(event_xml) # TODO get target & resource info event_start_dttm = event.get_active_period_start(event_xml) event_start_dttm = schedule.dttm_to_str(event_start_dttm) signals = event.get_signals(event_xml) # get start/end time start_at = event_xml.findtext( 'ei:eiActivePeriod/xcal:properties/xcal:dtstart/xcal:date-time', namespaces=event.NS_A) start_at = schedule.str_to_datetime(start_at) duration = event_xml.findtext( 'ei:eiActivePeriod/xcal:properties/xcal:duration/xcal:duration', namespaces=event.NS_A) start_at, end_at = schedule.durations_to_dates(start_at, [duration]) event_info = { "id" : e_id, "mod_num" : e_mod_num, "status" : e_status, "start_at" : start_at.strftime("%Y-%m-%d %H:%M:%S"), "end_at" : end_at.strftime("%Y-%m-%d %H:%M:%S"), } if signals: event_info["signals"] = signals return event_info
def build_event_info(self, event_xml): e_id = event.get_event_id(event_xml) e_mod_num = event.get_mod_number(event_xml) e_status = event.get_status(event_xml) # TODO get target & resource info event_start_dttm = event.get_active_period_start(event_xml) event_start_dttm = schedule.dttm_to_str(event_start_dttm) signals = event.get_signals(event_xml) # get start/end time start_at = event_xml.findtext( 'ei:eiActivePeriod/xcal:properties/xcal:dtstart/xcal:date-time', namespaces=event.NS_A) start_at = schedule.str_to_datetime(start_at) duration = event_xml.findtext( 'ei:eiActivePeriod/xcal:properties/xcal:duration/xcal:duration', namespaces=event.NS_A) start_at, end_at = schedule.durations_to_dates( start_at, [duration]) event_info = { "id": e_id, "mod_num": e_mod_num, "status": e_status, "start_at": start_at.strftime("%Y-%m-%d %H:%M:%S"), "end_at": end_at.strftime("%Y-%m-%d %H:%M:%S"), } if signals: event_info["signals"] = signals return event_info
def test_batch_b(self): print('in test_batch_b()') # The files files = ['batch_b_1.xml', 'batch_b_2.xml', 'batch_b_3.xml'] # Some other stuff e_id = 'e_1' mod_nums = [0, 5, 3] i = 0 # Just an index for us # Load up each file for filename in files: xml_file = open(os.path.join(SAMPLE_DIR, filename)) xml_doc = etree.XML(xml_file.read()) self.assertTrue(self.oadr_schema.validate(xml_doc), msg='Validation failed for "%s"' % (filename)) print('"%s" is valid; Testing it against the payload handler.' % (filename)) # Send it the message and generate a payload payload = self.event_handler.handle_payload(xml_doc) # Grab an event from self._events via the stateful methods, and check mod numbers evt = self.event_handler.get_event(e_id) mod_num = event.get_mod_number(evt) # Make sure we hit the 'else' on the third itteration if i != 2: self.assertEqual( mod_num, mod_nums[i], msg='Mod number not the same! got=%d, should be=%d' % (mod_num, mod_nums[i])) else: self.assertNotEqual( mod_num, mod_nums[i], msg='Not good, the mod numbers are the same') print('Don\'t worry about that warning, it\'s what we want.') print('Expected Mod Number gotten.') # Check the payload if payload is not None: self.assertTrue(self.oadr_schema.validate(payload), msg='Return payload failed for %s' % (filename)) print('Return payload for "%s" is valid.' % (filename)) else: print('No return payload generated for "%s"' % (filename)) print('+' * 4) i += 1 print('test_batch_b() OK')
def _calculate_current_event_status(self, events): ''' returns a 3-tuple of (current_signal_level, current_event_id, remove_events=[]) ''' highest_signal_val = 0 current_event_id = None remove_events = [] # to collect expired events for e in events: try: e_id = event.get_event_id(e, self.event_handler.ns_map) e_mod_num = event.get_mod_number(e, self.event_handler.ns_map) e_status = event.get_status(e, self.event_handler.ns_map) if not self.event_handler.check_target_info(e): logging.debug("Ignoring event %s - no target match", e_id) continue event_start_dttm = event.get_active_period_start(e, self.event_handler.ns_map) signals = event.get_signals(e, self.event_handler.ns_map) if signals is None: logging.debug("Ignoring event %s - no valid signals", e_id) continue logging.debug("All signals: %r", signals) intervals = [s[0] for s in signals] current_interval = schedule.choose_interval( event_start_dttm, intervals ) if current_interval is None: logging.debug("Event %s(%d) has ended", e_id, e_mod_num) remove_events.append(e_id) continue if current_interval < 0: logging.debug("Event %s(%d) has not started yet.", e_id, e_mod_num) continue logging.debug('---------- chose interval %d', current_interval) _, interval_uid, signal_level = signals[current_interval] # signal_level = event.get_current_signal_value(e, self.event_handler.ns_map) logging.debug('Control loop: Evt ID: %s(%s); Interval: %s; Current Signal: %s', e_id, e_mod_num, interval_uid, signal_level ) signal_level = float(signal_level) if signal_level is not None else 0 if signal_level > highest_signal_val: highest_signal_val = signal_level current_event_id = e_id except Exception as e: logging.exception("Error parsing event: %s", e) return highest_signal_val, current_event_id, remove_events
def test_batch_a(self): print("in test_batch_a()") # The files files = [ 'batch_a_1.xml', 'batch_a_2.xml', 'batch_a_3.xml', 'batch_a_4.xml' ] # Some other stuff e_id = 'e_1' mod_nums = [0, 1, 2, 4] i = 0 # Load up each file for filename in files: xml_file = open(os.path.join(SAMPLE_DIR, filename)) xml_doc = etree.XML(xml_file.read()) self.assertTrue(self.oadr_schema.validate(xml_doc), msg='Validation failed for "%s"' % (filename)) print('"%s" is valid; Testing it against the payload handler.' % (filename)) # Send it the message and generate a payload payload = self.event_handler.handle_payload(xml_doc) # Grab an event from self._events via the stateful methods, and check mod numbers evt = self.event_handler.get_event(e_id) mod_num = event.get_mod_number(evt) self.assertEqual( mod_num, mod_nums[i], msg='Mod number not the same! got=%d, should be=%d' % (mod_num, mod_nums[i])) print('Mod number same.') # Check the payload if payload is not None: self.assertTrue(self.oadr_schema.validate(payload), msg='Return payload failed for %s' % (filename)) # print('Return payload for "' + filename + '" is valid.') # print(etree.tostring(payload, pretty_print=True)) else: print('No return payload generated for "%s"' % (filename)) print('+' * 4) i += 1 print('test_batch_a() OK')
def test_batch_b(self): print('in test_batch_b()') # The files files = ['batch_b_1.xml', 'batch_b_2.xml', 'batch_b_3.xml'] # Some other stuff e_id = 'e_1' mod_nums = [0, 5, 3] i = 0 # Just an index for us # Load up each file for filename in files: xml_file = open(os.path.join(SAMPLE_DIR, filename)) xml_doc = etree.XML(xml_file.read()) self.assertTrue(self.oadr_schema.validate(xml_doc), msg='Validation failed for "%s"'%(filename)) print('"%s" is valid; Testing it against the payload handler.'%(filename)) # Send it the message and generate a payload payload = self.event_handler.handle_payload(xml_doc) # Grab an event from self._events via the stateful methods, and check mod numbers evt = self.event_handler.get_event(e_id) mod_num = event.get_mod_number(evt) # Make sure we hit the 'else' on the third itteration if i != 2: self.assertEqual(mod_num, mod_nums[i], msg='Mod number not the same! got=%d, should be=%d'%(mod_num, mod_nums[i])) else: self.assertNotEqual(mod_num, mod_nums[i], msg='Not good, the mod numbers are the same') print('Don\'t worry about that warning, it\'s what we want.') print('Expected Mod Number gotten.') # Check the payload if payload is not None: self.assertTrue(self.oadr_schema.validate(payload), msg='Return payload failed for %s'%(filename)) print('Return payload for "%s" is valid.'%(filename)) else: print('No return payload generated for "%s"'%(filename)) print ('+' * 4) i += 1 print('test_batch_b() OK')
def test_batch_a(self): print("in test_batch_a()") # The files files = ['batch_a_1.xml', 'batch_a_2.xml', 'batch_a_3.xml', 'batch_a_4.xml'] # Some other stuff e_id = 'e_1' mod_nums = [0, 1, 2, 4] i = 0 # Load up each file for filename in files: xml_file = open(os.path.join(SAMPLE_DIR, filename)) xml_doc = etree.XML(xml_file.read()) self.assertTrue(self.oadr_schema.validate(xml_doc), msg='Validation failed for "%s"'%(filename)) print('"%s" is valid; Testing it against the payload handler.'%(filename)) # Send it the message and generate a payload payload = self.event_handler.handle_payload(xml_doc) # Grab an event from self._events via the stateful methods, and check mod numbers evt = self.event_handler.get_event(e_id) mod_num = event.get_mod_number(evt) self.assertEqual(mod_num, mod_nums[i], msg='Mod number not the same! got=%d, should be=%d'%(mod_num, mod_nums[i])) print('Mod number same.') # Check the payload if payload is not None: self.assertTrue(self.oadr_schema.validate(payload), msg='Return payload failed for %s'%(filename)) # print('Return payload for "' + filename + '" is valid.') # print(etree.tostring(payload, pretty_print=True)) else: print('No return payload generated for "%s"'%(filename)) print ('+' * 4) i += 1 print('test_batch_a() OK')
def _calculate_current_event_status(self, events): ''' returns a 3-tuple of (current_signal_level, current_event_id, remove_events=[]) ''' highest_signal_val = 0 current_event_id = None remove_events = [] # to collect expired events for e in events: try: e_id = event.get_event_id(e, self.event_handler.ns_map) e_mod_num = event.get_mod_number(e, self.event_handler.ns_map) e_status = event.get_status(e, self.event_handler.ns_map) if not self.event_handler.check_target_info(e): logging.debug("Ignoring event %s - no target match", e_id) continue event_start_dttm = event.get_active_period_start( e, self.event_handler.ns_map) signals = event.get_signals(e, self.event_handler.ns_map) if signals is None: logging.debug("Ignoring event %s - no valid signals", e_id) continue logging.debug("All signals: %r", signals) intervals = [s[0] for s in signals] current_interval = schedule.choose_interval( event_start_dttm, intervals) if current_interval is None: logging.debug("Event %s(%d) has ended", e_id, e_mod_num) remove_events.append(e_id) continue if current_interval < 0: logging.debug("Event %s(%d) has not started yet.", e_id, e_mod_num) continue logging.debug('---------- chose interval %d', current_interval) _, interval_uid, signal_level = signals[current_interval] # signal_level = event.get_current_signal_value(e, self.event_handler.ns_map) logging.debug( 'Control loop: Evt ID: %s(%s); Interval: %s; Current Signal: %s', e_id, e_mod_num, interval_uid, signal_level) signal_level = float( signal_level) if signal_level is not None else 0 if signal_level > highest_signal_val: highest_signal_val = signal_level current_event_id = e_id except Exception as e: logging.exception("Error parsing event: %s", e) return highest_signal_val, current_event_id, remove_events