From dd6193fa46cc0e803cef3031e53dc5a08621148f Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sat, 27 Jun 2026 20:37:14 +0200 Subject: [PATCH] Remove manual tab override/enable checkboxes from browser and PyQt clients Drops the tc-enable, heater-activate and stirrer-activate checkboxes and all associated state, signal connections, initial-sync flags, and channel-handler logic. Regenerates main_window.py from the updated .ui. Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01DF16nV2ispNw1C9SbvqbRQ --- client/brewpi.ui | 42 --------------------------------- client/brewpi_gui.py | 54 ++----------------------------------------- client/main_window.py | 15 +----------- web/app.js | 31 ++----------------------- web/index.html | 7 ++---- 5 files changed, 7 insertions(+), 142 deletions(-) diff --git a/client/brewpi.ui b/client/brewpi.ui index d88a957..b79de7d 100644 --- a/client/brewpi.ui +++ b/client/brewpi.ui @@ -517,22 +517,6 @@ Controller - - - - 0 - 25 - 141 - 25 - - - - While disabled, the controller tries not to drive the heater (output forced to 0) and the setpoints below are inactive - - - Enabled - - @@ -629,19 +613,6 @@ Qt::Vertical - - - - 30 - 370 - 81 - 31 - - - - Activate - - @@ -665,19 +636,6 @@ Stirrer - - - - 40 - 370 - 81 - 23 - - - - Activate - - diff --git a/client/brewpi_gui.py b/client/brewpi_gui.py index c522451..0995e7e 100755 --- a/client/brewpi_gui.py +++ b/client/brewpi_gui.py @@ -423,9 +423,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.sud_state = None self.sud_user_message = None self._confirm_box = None - # Mirrors the server's TempController.enabled - gates the - # temp/heatrate setpoint controls (see on_tempctrl_changed()). - self.tc_enabled = False # Global, not Sud-specific - from the 'System' channel's one-time # startup message. warp_factor defaults to 1.0 (no scaling) until # that arrives, or for a server that doesn't send it at all. @@ -523,9 +520,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.msg_system.set_recv_handler(lambda msg: self.recv_signal.emit(self.on_system_changed, msg)) self.setupUi(self) - # Matches tc_enabled's default (False) until the server says otherwise. - self.Slider_temp_soll.setEnabled(False) - self.doubleSpinBox_heatrate_soll.setEnabled(False) # Permanent (right-aligned, not cleared by showMessage()/clearMessage()) # label for static environment info - distinct from the status bar's # transient step/schedule messages. @@ -559,9 +553,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.doubleSpinBox_heatrate_soll.valueChanged.connect(self.on_heatrate_soll_changed) - self.checkbox_heater_activate.stateChanged.connect(self.on_checkbox_changed) - self.checkbox_stirrer_activate.stateChanged.connect(self.on_checkbox_stirrer_activate_changed) - self.checkbox_tc_enable.stateChanged.connect(self.on_checkbox_tc_enable_changed) # Show the last value we had before the GUI last closed (see # closeEvent()) right away, rather than the spinbox's bare design-time # default - blockSignals so this doesn't queue a spurious 'AmbientTemp' @@ -590,8 +581,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.slider_pwr_initial_update = True self.slider_temp_soll_initial_update = True self.slider_speed_initial_update = True - self.checkbox_heater_activate_initial_update = True - self.checkbox_stirrer_activate_initial_update = True self.heatrate_soll_initial_update = True self.sud_save_path = None @@ -660,8 +649,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.slider_pwr_initial_update = True self.slider_temp_soll_initial_update = True self.slider_speed_initial_update = True - self.checkbox_heater_activate_initial_update = True - self.checkbox_stirrer_activate_initial_update = True self.heatrate_soll_initial_update = True self.plot.reset() self.ws_client.connect(uri=self.plainTextUri.toPlainText()) @@ -735,12 +722,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.sud_state = None self.sud_user_message = None self._close_confirm_dialog() - self.tc_enabled = False - self.checkbox_tc_enable.blockSignals(True) - self.checkbox_tc_enable.setChecked(False) - self.checkbox_tc_enable.blockSignals(False) - self.Slider_temp_soll.setEnabled(False) - self.doubleSpinBox_heatrate_soll.setEnabled(False) # ambient_temp (the server's last echoed reading, shown in the # status bar) is no longer trustworthy, but the spinbox itself is # a client-owned setting (see closeEvent()/connect()) - leave it @@ -852,22 +833,10 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): print("on_slider_pwr_soll_changed {}".format(value)) self.msg_heater.send({'Power': value}) - def on_checkbox_changed(self, value): - print("on_checkbox_changed {}".format(value)) - self.msg_heater.send({'Activate': int(value == 2)}) - def on_slider_stirrer_speed_soll_changed(self, value): print("on_slider_stirrer_speed_soll_changed {}".format(value)) self.msg_stirrer.send({'Speed': value}) - def on_checkbox_stirrer_activate_changed(self, value): - print("on_checkbox_stirrer_activate_changed {}".format(value)) - self.msg_stirrer.send({'Activate': int(value == 2)}) - - def on_checkbox_tc_enable_changed(self, value): - print("on_checkbox_tc_enable_changed {}".format(value)) - self.msg_tempctrl.send({'Enable': value == 2}) - def on_action_sud_start(self): self.msg_sud.send({'Start': True}) @@ -965,13 +934,6 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): self.doubleSpinBox_heatrate_soll.blockSignals(True) self.doubleSpinBox_heatrate_soll.setValue(subsubmsg['Set']) self.doubleSpinBox_heatrate_soll.blockSignals(False) - elif "Enabled" in key: - self.tc_enabled = msg['Enabled'] - self.checkbox_tc_enable.blockSignals(True) - self.checkbox_tc_enable.setChecked(self.tc_enabled) - self.checkbox_tc_enable.blockSignals(False) - self.Slider_temp_soll.setEnabled(self.tc_enabled) - self.doubleSpinBox_heatrate_soll.setEnabled(self.tc_enabled) if "Ist" in key: submsg = msg['Ist'] if 'Temp' in submsg: @@ -984,13 +946,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): def on_heater_changed(self, msg): for key in msg: - if "Activate" in key: - if self.checkbox_heater_activate_initial_update: - self.checkbox_heater_activate.blockSignals(True) - self.checkbox_heater_activate.setCheckState(2 if msg['Activate'] == 1 else 0) - self.checkbox_heater_activate.blockSignals(False) - self.checkbox_heater_activate_initial_update = False - elif "PowerSet" in key: + if "PowerSet" in key: self.plot_power_set = msg['PowerSet'] self.lcdNumber_power_heater.display(msg['PowerSet']) elif "Power" in key: @@ -1018,13 +974,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow): def on_stirrer_changed(self, msg): print("on_stirrer_changed {}".format(msg)) for key in msg: - if "Activate" in key: - if self.checkbox_stirrer_activate_initial_update: - self.checkbox_stirrer_activate.blockSignals(True) - self.checkbox_stirrer_activate.setCheckState(2 if msg['Activate'] == 1 else 0) - self.checkbox_stirrer_activate.blockSignals(False) - self.checkbox_stirrer_activate_initial_update = False - elif "Speed" in key: + if "Speed" in key: self.stirrer_speed_ist = msg['Speed'] self._update_step_plates() if self.slider_speed_initial_update: diff --git a/client/main_window.py b/client/main_window.py index 86afd2b..aef435d 100644 --- a/client/main_window.py +++ b/client/main_window.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'brewpi.ui' +# Form implementation generated from reading ui file 'client/brewpi.ui' # # Created by: PyQt5 UI code generator 5.15.11 # @@ -190,9 +190,6 @@ class Ui_MainWindow(object): self.groupBox_2.setSizePolicy(sizePolicy) self.groupBox_2.setMinimumSize(QtCore.QSize(0, 0)) self.groupBox_2.setObjectName("groupBox_2") - self.checkbox_tc_enable = QtWidgets.QCheckBox(self.groupBox_2) - self.checkbox_tc_enable.setGeometry(QtCore.QRect(0, 25, 141, 25)) - self.checkbox_tc_enable.setObjectName("checkbox_tc_enable") self.Slider_temp_soll = QtWidgets.QSlider(self.groupBox_2) self.Slider_temp_soll.setGeometry(QtCore.QRect(20, 100, 63, 281)) self.Slider_temp_soll.setMinimum(0) @@ -222,9 +219,6 @@ class Ui_MainWindow(object): self.Slider_pwr_soll.setMaximum(100) self.Slider_pwr_soll.setOrientation(QtCore.Qt.Vertical) self.Slider_pwr_soll.setObjectName("Slider_pwr_soll") - self.checkbox_heater_activate = QtWidgets.QCheckBox(self.groupBox) - self.checkbox_heater_activate.setGeometry(QtCore.QRect(30, 370, 81, 31)) - self.checkbox_heater_activate.setObjectName("checkbox_heater_activate") self.label_10 = QtWidgets.QLabel(self.groupBox) self.label_10.setGeometry(QtCore.QRect(0, 30, 141, 31)) self.label_10.setAlignment(QtCore.Qt.AlignCenter) @@ -232,9 +226,6 @@ class Ui_MainWindow(object): self.horizontalLayout.addWidget(self.groupBox) self.groupBox_3 = QtWidgets.QGroupBox(self.horizontalTabWidgetPage1) self.groupBox_3.setObjectName("groupBox_3") - self.checkbox_stirrer_activate = QtWidgets.QCheckBox(self.groupBox_3) - self.checkbox_stirrer_activate.setGeometry(QtCore.QRect(40, 370, 81, 23)) - self.checkbox_stirrer_activate.setObjectName("checkbox_stirrer_activate") self.Slider_speed_soll = QtWidgets.QSlider(self.groupBox_3) self.Slider_speed_soll.setGeometry(QtCore.QRect(40, 70, 63, 281)) self.Slider_speed_soll.setMinimum(0) @@ -1306,15 +1297,11 @@ class Ui_MainWindow(object): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "BrewPi")) self.groupBox_2.setTitle(_translate("MainWindow", "Controller")) - self.checkbox_tc_enable.setToolTip(_translate("MainWindow", "While disabled, the controller tries not to drive the heater (output forced to 0) and the setpoints below are inactive")) - self.checkbox_tc_enable.setText(_translate("MainWindow", "Enabled")) self.label_6.setText(_translate("MainWindow", "Heat rate")) self.label_9.setText(_translate("MainWindow", "Temperature [°C]")) self.groupBox.setTitle(_translate("MainWindow", "Heater")) - self.checkbox_heater_activate.setText(_translate("MainWindow", "Activate")) self.label_10.setText(_translate("MainWindow", "Power [W]")) self.groupBox_3.setTitle(_translate("MainWindow", "Stirrer")) - self.checkbox_stirrer_activate.setText(_translate("MainWindow", "Activate")) self.label_11.setText(_translate("MainWindow", "Speed [%]")) self.horizontalTabWidget.setTabText(self.horizontalTabWidget.indexOf(self.horizontalTabWidgetPage1), _translate("MainWindow", "Manual")) self.horizontalTabWidget.setTabText(self.horizontalTabWidget.indexOf(self.tab), _translate("MainWindow", "Automatic")) diff --git a/web/app.js b/web/app.js index 50c12e5..1af6002 100644 --- a/web/app.js +++ b/web/app.js @@ -32,8 +32,6 @@ let initialPowerSync = true; let initialSpeedSync = true; let initialHeatrateSync = true; let initialTempSollSync = true; -let initialHeaterActivateSync = true; -let initialStirrerActivateSync = true; let ambientTemp = null; let warpFactor = 1.0; @@ -524,12 +522,7 @@ function updateSudForecast(doc) { function onHeaterChanged(msg) { for (const key of Object.keys(msg)) { - if (key === 'Activate') { - if (initialHeaterActivateSync) { - document.getElementById('heater-activate').checked = !!msg.Activate; - initialHeaterActivateSync = false; - } - } else if (key === 'PowerSet') { + if (key === 'PowerSet') { heaterPowerSoll = msg.PowerSet; document.getElementById('lcd-power-soll').textContent = msg.PowerSet; updateFireVisualization(); @@ -553,12 +546,7 @@ function onHeaterChanged(msg) { function onStirrerChanged(msg) { for (const key of Object.keys(msg)) { - if (key === 'Activate') { - if (initialStirrerActivateSync) { - document.getElementById('stirrer-activate').checked = !!msg.Activate; - initialStirrerActivateSync = false; - } - } else if (key === 'Speed') { + if (key === 'Speed') { stirrerSpeedIst = msg.Speed; if (initialSpeedSync) { document.getElementById('stirrer-speed').value = msg.Speed; @@ -600,12 +588,6 @@ function onTempCtrlChanged(msg) { initialHeatrateSync = false; } } - } else if (key === 'Enabled') { - const enabled = msg.Enabled; - document.getElementById('tc-enabled').checked = enabled; - document.getElementById('temp-soll').disabled = !enabled; - document.getElementById('heatrate-soll').disabled = !enabled; - } if (key === 'Ist') { const ist = msg.Ist; if ('Temp' in ist) { @@ -791,16 +773,10 @@ document.getElementById('heater-power').addEventListener('input', (e) => { document.getElementById('heater-power-readout').textContent = e.target.value; sendMsg('Heater', {Power: Number(e.target.value)}); }); -document.getElementById('heater-activate').addEventListener('change', (e) => { - sendMsg('Heater', {Activate: e.target.checked ? 1 : 0}); -}); document.getElementById('stirrer-speed').addEventListener('input', (e) => { document.getElementById('stirrer-speed-readout').textContent = e.target.value; sendMsg('Stirrer', {Speed: Number(e.target.value)}); }); -document.getElementById('stirrer-activate').addEventListener('change', (e) => { - sendMsg('Stirrer', {Activate: e.target.checked ? 1 : 0}); -}); document.getElementById('temp-soll').addEventListener('input', (e) => { document.getElementById('temp-soll-readout').textContent = e.target.value; sendMsg('TempCtrl', {Soll: {Temp: Number(e.target.value)}}); @@ -808,9 +784,6 @@ document.getElementById('temp-soll').addEventListener('input', (e) => { document.getElementById('heatrate-soll').addEventListener('change', (e) => { sendMsg('TempCtrl', {Soll: {Rate: Number(e.target.value)}}); }); -document.getElementById('tc-enabled').addEventListener('change', (e) => { - sendMsg('TempCtrl', {Enable: e.target.checked}); -}); document.getElementById('ambient-temp').addEventListener('change', (e) => { sendMsg('System', {AmbientTemp: Number(e.target.value)}); }); diff --git a/web/index.html b/web/index.html index 44f698f..e58f177 100644 --- a/web/index.html +++ b/web/index.html @@ -211,18 +211,16 @@

Controller

-

Heater

-

Stirrer

-