Esempio n. 1
0
class TestPricingModel(unittest.TestCase):
    def setUp(self):
        self.sup = Supervisor()
        batt = Battery("batt_1",
                       price_logic="hourly_preference",
                       capacity=5000.0,
                       max_charge_rate=2000.0,
                       max_discharge_rate=2000.0)
        self.gc1 = GridController(device_id="gc_1",
                                  supervisor=self.sup,
                                  battery=batt,
                                  price_logic='weighted_average')
        self.gc2 = GridController(device_id="gc_2",
                                  supervisor=self.sup,
                                  battery=batt,
                                  price_logic='weighted_average')
        self.sup.register_device(self.gc1)
        self.sup.register_device(self.gc2)
        self.gc1._connected_devices["gc_2"] = self.gc2
        self.gc2._connected_devices["gc_1"] = self.gc1

    @unittest.skip("Exception: Device ID not found (gc_2)")
    def test_weighted_price(self):
        self.gc1.send_power_message("gc_2", -200)  # sending it out
        self.gc1.send_price_message("gc_2", 0.2)
        self.gc2.process_events()
        self.gc2.update_time(3000)
        self.gc2.modulate_price()
        print("current interval prices: {}".format(", ".join(
            map(str, self.gc2._price_logic.get_interval_prices()))))
Esempio n. 2
0
 def setUp(self):
     self.sup = Supervisor()
     self.gc1 = GridController("gc1", self.sup)
     self.gc2 = GridController("gc2", self.sup, [self.gc1])
     self.sup.register_device(self.gc1)
     self.sup.register_device(self.gc2)
     self.gc1.register_device(self.gc2, self.gc2.get_id(), 1)
Esempio n. 3
0
 def setUp(self):
     self.sup = Supervisor()
     self.gc1 = GridController("gc1", self.sup)
     self.gc2 = GridController("gc2", self.sup)
     self.sup.register_device(self.gc1)
     self.sup.register_device(self.gc2)
     self.gc1._connected_devices["gc2"] = self.gc2
Esempio n. 4
0
class TestDeviceRegister(unittest.TestCase):
    def setUp(self):
        self.sup = Supervisor()
        self.gc1 = GridController("gc1", self.sup)
        self.gc2 = GridController("gc2", self.sup, [self.gc1])
        self.sup.register_device(self.gc1)
        self.sup.register_device(self.gc2)
        self.gc1.register_device(self.gc2, self.gc2.get_id(), 1)

    def test_connections(self):
        self.assertEqual(self.gc1._connected_devices["gc2"], self.gc2)
        self.assertEqual(self.gc2._connected_devices["gc1"], self.gc1)
Esempio n. 5
0
class TestGCMessaging(unittest.TestCase):
    def setUp(self):
        self.sup = Supervisor()
        self.gc1 = GridController("gc1", self.sup)
        self.gc2 = GridController("gc2", self.sup)
        self.sup.register_device(self.gc1)
        self.sup.register_device(self.gc2)
        self.gc1._connected_devices["gc2"] = self.gc2

    def test_GC_register_message(self):
        self.gc1.send_register_message("gc2", 1)
        while self.sup.has_next_event():
            self.sup.occur_next_event()
        self.assertEqual(self.gc2._connected_devices["gc1"], self.gc1)

    def test_GC_power_message_unfulfilled(self):
        # no battery. Can't provide, lists every as request.
        self.gc2._connected_devices["gc1"] = self.gc1
        self.gc1.send_power_message("gc2", 10)
        while self.sup.has_next_event():
            self.sup.occur_next_event()
        self.assertEqual(self.gc2._requested["gc1"], -10)

    def test_balance_power_below_max_battery_rate(self):
        self.gc2._connected_devices["gc1"] = self.gc1
        batt1 = Battery(None)  # no price logic
        batt2 = Battery(None)  # no price logic.
        self.gc1._battery = batt1
        self.gc2._battery = batt2
        self.gc1.send_power_message("gc2", 70)
        while self.sup.has_next_event():
            self.sup.occur_next_event()
        self.assertEqual(self.gc2._loads["gc1"], -70)
        self.assertEqual(self.gc2._battery.get_load(), -70)

    def test_balance_power_above_max_battery_rate(self):
        self.gc1.send_register_message("gc2", 1)
        batt1 = Battery(None)  # no price logic
        batt2 = Battery(None)  # no price logic.
        self.gc1._battery = batt1
        self.gc2._battery = batt2
        self.gc1.send_power_message("gc2", 110)
        while self.sup.has_next_event():
            self.sup.occur_next_event()
        self.assertEqual(self.gc2._loads["gc1"],
                         -100)  # 100 is default max charge rate.
        self.assertEqual(self.gc2._battery.get_load(), -100)
        self.assertEqual(self.gc2._requested["gc1"],
                         -10)  # 10 remaining to be sold to ya.
        """
Esempio n. 6
0
    def make_grid_controllers(self, config, runtime, override_args):

        connections = [
        ]  # a list of tuples of (gc, [connections]) to initialize later once all devices are set.
        if 'grid_controllers' not in config['devices']:
            return connections

        for gc in config['devices']['grid_controllers']:
            gc_id = gc['device_id']
            price_logic = gc['price_logic']
            price_logic = override_args.get(
                'devices.{}.price_logic'.format(gc_id), price_logic)

            msg_latency = gc.get('message_latency',
                                 self.DEFAULT_MESSAGE_LATENCY)
            msg_latency = int(
                override_args.get('devices.{}.message_latency'.format(gc_id),
                                  msg_latency))

            min_alloc_response_threshold = gc.get('threshold_alloc', 1.0)
            min_alloc_response_threshold = float(
                override_args.get('devices.{}.threshold_alloc'.format(gc_id),
                                  min_alloc_response_threshold))

            price_announce_threshold = gc.get('price_announce_threshold', .01)
            price_announce_threshold = float(
                override_args.get(
                    'devices.{}.price_announce_threshold'.format(gc_id),
                    price_announce_threshold))

            schedule = gc.get('schedule', None)
            multiday = schedule.get('multiday',
                                    self.DEFAULT_MULTIDAY) if schedule else 0
            schedule_items = schedule.get('items', None) if schedule else None

            connected_devices = gc.get('connected_devices', None)
            if connected_devices:
                connections.append((gc_id, connected_devices))

            batt_info = gc.get('battery', None)
            if batt_info:
                battery = self.make_battery(battery_info=batt_info,
                                            gc_id=gc_id,
                                            override_args=override_args)
            else:
                battery = None
            new_gc = GridController(
                device_id=gc_id,
                supervisor=self.supervisor,
                battery=battery,
                msg_latency=msg_latency,
                price_logic=price_logic,
                schedule=schedule_items,
                min_alloc_response_threshold=min_alloc_response_threshold,
                price_announce_threshold=price_announce_threshold,
                total_runtime=runtime)
            # make a new grid controller and register it with the supervisor
            self.supervisor.register_device(new_gc)
        return connections
Esempio n. 7
0
 def setUp(self):
     self.sup = Supervisor()
     batt = Battery("batt_1",
                    price_logic="hourly_preference",
                    capacity=5000.0,
                    max_charge_rate=2000.0,
                    max_discharge_rate=2000.0)
     self.gc1 = GridController(device_id="gc_1",
                               supervisor=self.sup,
                               battery=batt,
                               price_logic='weighted_average')
     self.gc2 = GridController(device_id="gc_2",
                               supervisor=self.sup,
                               battery=batt,
                               price_logic='weighted_average')
     self.sup.register_device(self.gc1)
     self.sup.register_device(self.gc2)
     self.gc1._connected_devices["gc_2"] = self.gc2
     self.gc2._connected_devices["gc_1"] = self.gc1
    def test_simple_interation_with_grid_controller(self):

        supervisor = Supervisor()

        notebook_personal_computer_device_id = "notebook_personal_computer_1"
        max_operating_power = 12 * 5
        notebook_personal_computer = NotebookPersonalComputer(notebook_personal_computer_device_id, supervisor, max_operating_power = max_operating_power)

        battery_id = "battery_1"
        battery_price_logic = 'moving_average' # According to the constructor of Battery class, 'hourly_preference' or 'moving_average'
        capacity = 1200.0 # in [Wh] though it is defined in [Ah] in related science and data sheet
        max_charge_rate = 120 # in [W], assuming it's 12[V] battery with 100 [Ah] capacity, rouchly lasting 10 hours, 10[A] maximum.
                              # Note: Charge rate varies depending on state of charge.
        max_discharge_rate = 120 # in [W], same value as above, simplifying for now.
        battery = Battery(battery_id, battery_price_logic, capacity, max_charge_rate, max_discharge_rate)

        grid_controller_device_id = "grid_controller_1"
        grid_controller_price_logic = 'marginal_price' # According to the constructor of GridController,
                                                       # 'weighted_average', 'marginal_price', 'marginal_price_b', or 'static_price'
        grid_controller = GridController(grid_controller_device_id, supervisor, battery = battery, price_logic = grid_controller_price_logic,
                                         connected_devices = [notebook_personal_computer])

        supervisor.register_device(notebook_personal_computer)
        supervisor.register_device(grid_controller)

        grid_controller.send_register_message("notebook_personal_computer_1", 1)
        # grid_controller.build_device_list()
        grid_controller.send_power_message("notebook_personal_computer_1", 10)
Esempio n. 9
0
class TestEventModel(unittest.TestCase):
    def setUp(self):
        self.sup = Supervisor()
        self.gc1 = GridController("gc1", self.sup)
        self.gc2 = GridController("gc2", self.sup)
        self.sup.register_device(self.gc1)
        self.sup.register_device(self.gc2)

    def test_event_queue(self):
        pq = PriorityQueue()
        pq.add(Event(self.gc1.set_power_in, 20), 1)
        pq.add(Event(self.gc1.set_power_in, 20),
               2)  # to make sure they are treated as distinct entities.
        event1, time_stamp = pq.pop()
        event1.run_event()
        self.assertEqual(self.gc1._power_in, 20)
        event2, time_stamp = pq.pop()
        event2.run_event()
        self.assertEqual(self.gc1._power_in, 20)

    def test_single_argument_event(self):
        self.gc1.add_event(Event(self.gc1.set_power_in, 20), 1)
        self.gc1.update_time(1)
        self.gc1.process_events()
        self.assertEqual(self.gc1._power_in, 20)

    def test_multiple_argument_event(self):
        self.gc1.add_event(Event(self.gc1.on_allocated, "gc2", 20), 1)
        self.gc1.update_time(1)
        self.gc1.process_events()
        self.assertEqual(self.gc1._allocated["gc2"], 20)

    def test_no_argument_event(self):
        self.gc1.add_event(Event(self.gc1.add_power_in), 1)
        self.gc1.update_time(1)
        self.gc1.process_events()
        self.assertEqual(self.gc1._power_in, 10)

    """More Tests Here are Highest Priority"""