[docs]class EventQueue:
def __init__(self):
"""
A priority queue schedule all actions.
"""
self.queue = dict()
self.extra_events = dict()
self.lockdown = -1
[docs] def schedule_event(self,
value,
start_time: int,
priority: int,
type: str = "actuator",
dict_target: dict = None,
component_type: str = None,
control_type: str = None,
actuator_key: str = None,
var_name: str = None,
end_time: int = None,
note: str = None):
"""
Add events/actions that is for the EnergyPlus to run.
:param value: Action value.
:param start_time: When this action will be triggered.
:param priority: An integer. Lower value indicates a higher priority.
:param type: One of ``actuator`` and ``global``.
:param dict_target: A dictionay type of action contains the ``component_type``, ``control_type``, and ``actuator_key``.
:param component_type: A string same as the EnergyPlus conponent type.
:param control_type: A string same as the EnergyPlus control type.
:param actuator_key: A string same as the EnergyPlus actuator name.
:param var_name: A string same as the EnergyPlus global controller name.
:param end_time: (Optional) When this action will stop.
:param note: (Optional) Placeholder for extra information.
:return: None.
"""
control_str = ""
if type == "actuator":
if dict_target is not None:
control_str = "|*|".join([dict_target["Component Type"],
dict_target["Control Type"],
dict_target["Actuator Key"]])
else:
control_str = "|*|".join([component_type, control_type, actuator_key])
elif type == "global":
control_str = var_name
else:
raise ValueError("Invalud control input")
if end_time is None:
end_time = start_time + 1
for time in range(start_time, end_time):
if time < self.lockdown:
continue
self.queue[time] = self.queue.get(time, {"actuator": dict(), "global": dict()})
previous = self.queue[time][type].get(control_str, None)
if previous is None or previous[0] > priority:
self.queue[time][type][control_str] = [priority, value, note]
[docs] def get_event(self,
time: int):
"""
Get all events/actions that happens at a given time.
:param time: Target time.
:return: a dictionary contains all events/actions scheduled at the given time.
"""
return self.queue.get(time, {"actuator": dict(), "global": dict()})
[docs] def trigger(self,
current_time: int):
"""
Get all events/actions that happens at a given time.
In the meantime, lock all happened actions. No more actions can be scheduled before the given time.
:param current_time: Target time.
:return: a dictionary contains all events/actions scheduled at the given time.
"""
self.lockdown = current_time
return self.get_event(current_time)