Regulation : if process value is in deadband, the last output value must not be changed
def _do_regulation(self):
failures_in = 0
failures_out = 0
while not self._stop_event.is_set():
if self.input.allow_regulation():
try:
self._last_input_value = input_value = self.input.read()
except Exception as e:
failures_in += 1
if failures_in > self.max_attempts_before_failure:
raise TimeoutError(
"too many attempts to read input value, regulation stopped"
) from e
else:
failures_in = 0
power_value = self.pid(input_value)
# self._last_output_value = output_value = self._get_power2unit(
# power_value
# )
if not self._x_is_in_idleband(input_value):
self._last_output_value = output_value = self._get_power2unit(power_value)
try:
self.output.set_value(output_value)
failures_out = 0
except Exception as e:
failures_out += 1
if failures_out > self.max_attempts_before_failure:
raise TimeoutError(
"too many attempts to set output value, regulation stopped"
) from e
gevent.sleep(self.pid.sample_time)