# Standard library imports
import datetime
from typing import Optional
# Local application imports
import twin4build.core as core
import twin4build.utils.types as tps
[docs]
class RulebasedControllerSystem(core.System):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.input = {"actualValue": tps.Scalar()}
self.output = {"inputSignal": tps.Scalar()}
self.interval = 99
self._config = {"parameters": ["interval"]}
@property
def config(self):
return self._config
[docs]
def initialize(
self,
start_time: datetime.datetime,
end_time: datetime.datetime,
step_size: int,
simulator: core.Simulator,
) -> None:
self.hold_900_signal = False
self.hold_750_signal = False
self.hold_600_signal = False
[docs]
def do_step(
self,
secondTime: float,
dateTime: datetime.datetime,
step_size: int,
stepIndex: int,
) -> None:
if self.input["actualValue"] > 900 or self.hold_900_signal:
self.output["inputSignal"].set(1, stepIndex)
if self.input["actualValue"] > 900 - self.interval:
self.hold_900_signal = True
else:
self.hold_900_signal = False
elif self.input["actualValue"] > 750 or self.hold_750_signal:
self.output["inputSignal"].set(0.7, stepIndex)
if self.input["actualValue"] > 750 - self.interval:
self.hold_750_signal = True
else:
self.hold_750_signal = False
elif self.input["actualValue"] > 600 or self.hold_600_signal:
self.output["inputSignal"].set(0.45, stepIndex)
if self.input["actualValue"] > 600 - self.interval:
self.hold_600_signal = True
else:
self.hold_600_signal = False
else:
self.output["inputSignal"].set(0, stepIndex)