diff --git a/pykirdy/kirdy_qt.py b/pykirdy/kirdy_qt.py index 89272c2..f423a46 100644 --- a/pykirdy/kirdy_qt.py +++ b/pykirdy/kirdy_qt.py @@ -814,8 +814,10 @@ class MainWindow(QtWidgets.QMainWindow): tree.setParameters(self.params[1], showTop=False) self.params[1].sigTreeStateChanged.connect(self.send_command) + self.prev_autotuner_state = None @asyncSlot() async def autotune(param): + self.prev_autotuner_state = None match self.autotuner.state(): case PIDAutotuneState.STATE_OFF: settings = await self.kirdy.device.get_settings_summary() @@ -825,6 +827,7 @@ class MainWindow(QtWidgets.QMainWindow): param.parent().child('Temperature Swing').value(), 1.0 / settings['thermostat']['temp_adc_settings']['rate'], param.parent().child('Lookback').value()) + print(param.parent().child('Lookback').value()) self.autotuner.setReady() param.setOpts(title="Stop") self.kirdy.task_dispatcher(self.kirdy.thermostat.set_constant_current_control_mode()) @@ -878,40 +881,43 @@ class MainWindow(QtWidgets.QMainWindow): self.info_box.setWindowTitle("Command fails to execute") self.info_box.show() - @pyqtSlot(dict) - def autotune_tick(self, report): - match self.autotuner.state(): - case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: - self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000) - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(self.autotuner.output())) - case PIDAutotuneState.STATE_SUCCEEDED: - kp, ki, kd = self.autotuner.get_tec_pid() - self.autotuner.setOff() - self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kp(kp)) - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_ki(ki)) - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kd(kd)) - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_control_mode()) - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_temperature_setpoint(self.params[1].child('PID Config', 'PID Auto Tune', 'Target Temperature').value())) - self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick) - self.background_task_lbl.setText("Ready.") - self.loading_spinner.stop() - self.loading_spinner.hide() - self.info_box.setWindowTitle("PID AutoTune Success") - self.info_box.setText("PID Config has been loaded to Thermostat.\nRegulating temperature.") - self.info_box.show() - - case PIDAutotuneState.STATE_FAILED: - self.autotuner.setOff() - self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") - self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0)) - self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick) - self.background_task_lbl.setText("Ready.") - self.loading_spinner.stop() - self.loading_spinner.hide() - self.info_box.setWindowTitle("PID Autotune Failed") - self.info_box.setText("PID Autotune is failed.") - self.info_box.show() + @asyncSlot(dict) + async def autotune_tick(self, report): + self.autotuner.run(report['thermostat']['temperature'], report['ts']/1000) + if self.prev_autotuner_state != self.autotuner.state(): + match self.autotuner.state(): + case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: + await self.kirdy.thermostat.set_tec_i_out(self.autotuner.output()) + self.prev_autotuner_state = self.autotuner.state() + case PIDAutotuneState.STATE_SUCCEEDED: + kp, ki, kd = self.autotuner.get_tec_pid() + self.autotuner.setOff() + self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kp(kp)) + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_ki(ki)) + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_kd(kd)) + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_pid_control_mode()) + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_temperature_setpoint(self.params[1].child('PID Config', 'PID Auto Tune', 'Target Temperature').value())) + self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick) + self.background_task_lbl.setText("Ready.") + self.loading_spinner.stop() + self.loading_spinner.hide() + self.info_box.setWindowTitle("PID AutoTune Success") + self.info_box.setText("PID Config has been loaded to Thermostat.\nRegulating temperature.") + self.info_box.show() + self.prev_autotuner_state = None + case PIDAutotuneState.STATE_FAILED: + self.autotuner.setOff() + self.params[1].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") + self.kirdy.task_dispatcher(self.kirdy.thermostat.set_tec_i_out(0.0)) + self.kirdy_handler.report_update_sig.disconnect(self.autotune_tick) + self.background_task_lbl.setText("Ready.") + self.loading_spinner.stop() + self.loading_spinner.hide() + self.info_box.setWindowTitle("PID Autotune Failed") + self.info_box.setText("PID Autotune is failed.") + self.info_box.show() + self.prev_autotuner_state = None @pyqtSlot(bool) def _on_connection_changed(self, result):