hakkoso/control/controllers.py

49 lines
1.6 KiB
Python

from time import perf_counter
class Controller():
def __init__(self,
# Actions
# Target value we want to reach, in what period ()
target=None, reach_period_s=None,
# Timeframe we need to wait before changing the
# system output (means: how fast we can trigger
# on/off states). Used to prevent breaking fridge or
# other actuators.
refractary_period_s=10,
# Send notifications outside this range?
warning_range=(None, None)):
self.input = None
self.target = target
self.range = warning_range
self.reach_period_s = reach_period_s
self.refractary_period_s = refractary_period_s
def set_reach_period(self, reach_period_s):
self.reach_period_s = reach_period_s
def set_input(self, input):
self.input = input
def set_input_label(self, label):
self.input_label = label
def set_target(self, target):
print('Setting target', target)
self.target = target
def set_warning_range(self, target):
self.target = target
def one_cycle(self, time=None):
print("ERROR: This function must be implemented by the controller")
"Set the input, run `one_cycle' and return the required actuator action."
def apply(self, input, time=perf_counter):
# Set the current input
self.set_input(input)
# Call one cycle
action = self.one_cycle(time())
# TODO: Check refractary period?
return action