PyThermostat: Modify PIDAutotune for GUI usage

Co-authored-by: topquark12 <aw@m-labs.hk>
This commit is contained in:
atse 2024-11-04 12:54:58 +08:00
parent 9868ca4447
commit 828648ed76

View File

@ -2,7 +2,7 @@ import math
import logging import logging
import time import time
from collections import deque, namedtuple from collections import deque, namedtuple
from enum import Enum from enum import Enum, auto
from pythermostat.client import Client from pythermostat.client import Client
@ -13,11 +13,12 @@ from pythermostat.client import Client
class PIDAutotuneState(Enum): class PIDAutotuneState(Enum):
STATE_OFF = 'off' STATE_OFF = auto()
STATE_RELAY_STEP_UP = 'relay step up' STATE_RELAY_STEP_UP = auto()
STATE_RELAY_STEP_DOWN = 'relay step down' STATE_RELAY_STEP_DOWN = auto()
STATE_SUCCEEDED = 'succeeded' STATE_SUCCEEDED = auto()
STATE_FAILED = 'failed' STATE_FAILED = auto()
STATE_READY = auto()
class PIDAutotune: class PIDAutotune:
@ -57,6 +58,21 @@ class PIDAutotune:
self._Ku = 0 self._Ku = 0
self._Pu = 0 self._Pu = 0
def set_param(self, target, step, noiseband, sampletime, lookback):
self._setpoint = target
self._outputstep = step
self._out_max = step
self._out_min = -step
self._noiseband = noiseband
self._inputs = deque(maxlen=round(lookback / sampletime))
def set_ready(self):
self._state = PIDAutotuneState.STATE_READY
self._peak_count = 0
def set_off(self):
self._state = PIDAutotuneState.STATE_OFF
def state(self): def state(self):
"""Get the current state.""" """Get the current state."""
return self._state return self._state
@ -94,9 +110,12 @@ class PIDAutotune:
""" """
now = time_input * 1000 now = time_input * 1000
if (self._state == PIDAutotuneState.STATE_OFF if self._state in (
or self._state == PIDAutotuneState.STATE_SUCCEEDED PIDAutotuneState.STATE_OFF,
or self._state == PIDAutotuneState.STATE_FAILED): PIDAutotuneState.STATE_SUCCEEDED,
PIDAutotuneState.STATE_FAILED,
PIDAutotuneState.STATE_READY,
):
self._state = PIDAutotuneState.STATE_RELAY_STEP_UP self._state = PIDAutotuneState.STATE_RELAY_STEP_UP
self._last_run_timestamp = now self._last_run_timestamp = now