Пример #1
0
        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
Пример #2
0
        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
Пример #3
0
    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')
Пример #4
0
    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
Пример #5
0
    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')
Пример #6
0
    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')
Пример #7
0
    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')
Пример #8
0
    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