feat(power): add setting to show current status instead of action
Reddit report: the header power toggle switches correctly but displays "backwards" - the button shows the action a click would perform (e.g. "Aus" while the printer is on), not the printer's actual current state, which some users find counterintuitive. Both readings are legitimate, so this adds a per-printer opt-in (Settings -> Power Switch -> "Aktuellen Status statt Aktion anzeigen") rather than flipping the default for everyone. power_status_inverted=0 (default) keeps today's behavior; =1 mirrors the actual on/off state instead. The backend's power-status parsing is untouched - only _applyHeaderPowerState() picks which state to display, so the click handler still always toggles the real state regardless of display mode.
This commit is contained in:
@ -679,6 +679,7 @@ class EndpointsMixin:
|
||||
(getattr(br._args, "power_on_url", "") or "").strip()
|
||||
or (getattr(br._args, "power_off_url", "") or "").strip()
|
||||
),
|
||||
"power_status_inverted": bool(getattr(br._args, "power_status_inverted", 0)),
|
||||
})
|
||||
return self._json_cors({"result": out})
|
||||
|
||||
@ -2018,6 +2019,7 @@ class EndpointsMixin:
|
||||
"power_on_url": getattr(self._args, "power_on_url", "") or "",
|
||||
"power_off_url": getattr(self._args, "power_off_url", "") or "",
|
||||
"power_status_url": getattr(self._args, "power_status_url", "") or "",
|
||||
"power_status_inverted": getattr(self._args, "power_status_inverted", 0),
|
||||
"default_ams_slot": getattr(self._args, "default_ams_slot", "auto"),
|
||||
"auto_leveling": getattr(self._args, "auto_leveling", 1),
|
||||
"vibration_compensation": getattr(self._args, "vibration_compensation", 0),
|
||||
@ -2067,6 +2069,7 @@ class EndpointsMixin:
|
||||
cfg.set("connection", "power_on_url", str(data.get("power_on_url", getattr(self._args, "power_on_url", "") or "")).strip())
|
||||
cfg.set("connection", "power_off_url", str(data.get("power_off_url", getattr(self._args, "power_off_url", "") or "")).strip())
|
||||
cfg.set("connection", "power_status_url", str(data.get("power_status_url", getattr(self._args, "power_status_url", "") or "")).strip())
|
||||
cfg.set("connection", "power_status_inverted", str(int(bool(data.get("power_status_inverted", getattr(self._args, "power_status_inverted", 0))))))
|
||||
cfg.set("print", "default_ams_slot", str(data.get("default_ams_slot", getattr(self._args, "default_ams_slot", "auto"))))
|
||||
cfg.set("print", "auto_leveling", str(data.get("auto_leveling", getattr(self._args, "auto_leveling", 1))))
|
||||
cfg.set("print", "vibration_compensation", str(int(bool(data.get("vibration_compensation", getattr(self._args, "vibration_compensation", 0))))))
|
||||
|
||||
@ -66,6 +66,7 @@ CONFIG_ENV_MAPPING = {
|
||||
"POWER_ON_URL": (CONFIG_SECTION_CONNECTION, "power_on_url"),
|
||||
"POWER_OFF_URL": (CONFIG_SECTION_CONNECTION, "power_off_url"),
|
||||
"POWER_STATUS_URL": (CONFIG_SECTION_CONNECTION, "power_status_url"),
|
||||
"POWER_STATUS_INVERTED": (CONFIG_SECTION_CONNECTION, "power_status_inverted"),
|
||||
"DEFAULT_AMS_SLOT": (CONFIG_SECTION_PRINT, "default_ams_slot"),
|
||||
"AUTO_LEVELING": (CONFIG_SECTION_PRINT, "auto_leveling"),
|
||||
"VIBRATION_COMPENSATION": (CONFIG_SECTION_PRINT, "vibration_compensation"),
|
||||
@ -487,6 +488,7 @@ DEVICE_ID = get("DEVICE_ID", "")
|
||||
POWER_ON_URL = get("POWER_ON_URL", "")
|
||||
POWER_OFF_URL = get("POWER_OFF_URL", "")
|
||||
POWER_STATUS_URL = get("POWER_STATUS_URL", "")
|
||||
POWER_STATUS_INVERTED = _safe_int(get("POWER_STATUS_INVERTED", "0"), 0)
|
||||
DEFAULT_AMS_SLOT = get("DEFAULT_AMS_SLOT", "auto")
|
||||
AUTO_LEVELING = _safe_int(get("AUTO_LEVELING", "1"), 1)
|
||||
VIBRATION_COMPENSATION = _safe_int(get("VIBRATION_COMPENSATION", "0"), 0)
|
||||
|
||||
@ -1177,6 +1177,7 @@ def _build_per_printer_args(base_args, p: dict):
|
||||
a.power_on_url = p.get("power_on_url") or getattr(base_args, "power_on_url", "") or ""
|
||||
a.power_off_url = p.get("power_off_url") or getattr(base_args, "power_off_url", "") or ""
|
||||
a.power_status_url = p.get("power_status_url") or getattr(base_args, "power_status_url", "") or ""
|
||||
a.power_status_inverted = int(p.get("power_status_inverted") or getattr(base_args, "power_status_inverted", 0) or 0)
|
||||
a.kxgauge_url = p.get("kxgauge_url") or getattr(base_args, "kxgauge_url", "") or ""
|
||||
a.kxgauge_enabled = p.get("kxgauge_enabled") or getattr(base_args, "kxgauge_enabled", 0) or 0
|
||||
a.kxgauge_heat_peak = p.get("kxgauge_heat_peak") or getattr(base_args, "kxgauge_heat_peak", 250) or 250
|
||||
@ -1329,6 +1330,8 @@ def main():
|
||||
help="HTTP GET URL to power the printer off")
|
||||
parser.add_argument("--power-status-url", default=env_loader.POWER_STATUS_URL,
|
||||
help="HTTP GET URL returning the smart plug's current on/off state")
|
||||
parser.add_argument("--power-status-inverted", type=int, default=env_loader.POWER_STATUS_INVERTED,
|
||||
help="Show the power switch's current state instead of the toggle action")
|
||||
parser.add_argument("--default-ams-slot",default=env_loader.DEFAULT_AMS_SLOT)
|
||||
parser.add_argument("--auto-leveling", type=int, default=env_loader.AUTO_LEVELING)
|
||||
parser.add_argument("--vibration-compensation", type=int, default=env_loader.VIBRATION_COMPENSATION)
|
||||
|
||||
@ -355,10 +355,17 @@ function _applyHeaderPowerState(state){
|
||||
_headerPowerState=state;
|
||||
var btn=document.getElementById('h-power-btn'), lbl=document.getElementById('h-power-lbl');
|
||||
if(!btn||!lbl)return;
|
||||
if(state==='on'){
|
||||
// Default: show the action a click would perform (printer on -> offer
|
||||
// "Aus"). With power_status_inverted set (Settings -> Power Switch), show
|
||||
// the actual current state instead (printer on -> show "An") - some users
|
||||
// expect the button to mirror reality, not the available action.
|
||||
var inverted=!!(_activePrinter&&_activePrinter.power_status_inverted);
|
||||
var showOn=inverted?state==='on':state==='off';
|
||||
var showOff=inverted?state==='off':state==='on';
|
||||
if(showOff){
|
||||
btn.classList.remove('h-power-can-on');btn.classList.add('h-power-can-off');
|
||||
lbl.textContent=T.printers_power_off_short||'Aus';
|
||||
}else if(state==='off'){
|
||||
}else if(showOn){
|
||||
btn.classList.remove('h-power-can-off');btn.classList.add('h-power-can-on');
|
||||
lbl.textContent=T.printers_power_on_short||'An';
|
||||
}else{
|
||||
@ -572,6 +579,7 @@ function applyLang(){
|
||||
setText('lbl-power-off-url',T.settings_power_off_url||'Power-Off URL');
|
||||
setText('lbl-power-status-url',T.settings_power_status_url||'Status URL');
|
||||
setText('lbl-power-hint',T.settings_power_hint||'Optional: plain HTTP GET URLs for a smart plug (e.g. Tasmota) controlling the printer\'s mains power. Leave empty to hide the power button.');
|
||||
setText('lbl-power-status-inverted',T.settings_power_status_inverted||'Show current status instead of action');
|
||||
setText('lbl-default-slot',T.settings_default_slot);
|
||||
setText('opt-slot-auto',T.settings_slot_auto);
|
||||
setText('lbl-auto-leveling',T.settings_auto_leveling);
|
||||
@ -1254,6 +1262,7 @@ function openSettings(){
|
||||
var pon=document.getElementById('s-power-on-url');if(pon)pon.value=d.power_on_url||'';
|
||||
var poff=document.getElementById('s-power-off-url');if(poff)poff.value=d.power_off_url||'';
|
||||
var pstat=document.getElementById('s-power-status-url');if(pstat)pstat.value=d.power_status_url||'';
|
||||
var pinv=document.getElementById('s-power-status-inverted');if(pinv)pinv.checked=!!d.power_status_inverted;
|
||||
document.getElementById('s-default-slot').value=d.default_ams_slot||'auto';
|
||||
document.getElementById('s-auto-leveling').checked=(d.auto_leveling===undefined?true:!!d.auto_leveling);
|
||||
var vc=document.getElementById('s-vibration-compensation');if(vc)vc.checked=!!d.vibration_compensation;
|
||||
@ -2033,6 +2042,7 @@ function saveSettings(){
|
||||
power_on_url: (document.getElementById('s-power-on-url')||{}).value||'',
|
||||
power_off_url: (document.getElementById('s-power-off-url')||{}).value||'',
|
||||
power_status_url: (document.getElementById('s-power-status-url')||{}).value||'',
|
||||
power_status_inverted: (document.getElementById('s-power-status-inverted')||{}).checked?1:0,
|
||||
default_ams_slot: document.getElementById('s-default-slot').value,
|
||||
auto_leveling: document.getElementById('s-auto-leveling').checked?1:0,
|
||||
vibration_compensation: (document.getElementById('s-vibration-compensation')||{}).checked?1:0,
|
||||
|
||||
@ -566,6 +566,10 @@
|
||||
<input type="text" id="s-power-status-url" placeholder="http://192.168.x.x/cm?cmnd=Power">
|
||||
<small id="lbl-power-hint" style="color:var(--txt2)"></small>
|
||||
</div>
|
||||
<div class="modal-field" style="flex-direction:row;align-items:center;gap:10px">
|
||||
<input type="checkbox" id="s-power-status-inverted" style="width:auto;margin:0">
|
||||
<label id="lbl-power-status-inverted" style="margin:0;cursor:pointer" for="s-power-status-inverted">Aktuellen Status statt Aktion anzeigen</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -274,6 +274,7 @@
|
||||
"settings_power_off_url": "Ausschalt-URL",
|
||||
"settings_power_status_url": "Status-URL",
|
||||
"settings_power_hint": "Optional: einfache HTTP-GET-URLs für eine Steckdose (z.B. Tasmota), die den Drucker per Netzstrom schaltet. Leer lassen blendet den Power-Button aus.",
|
||||
"settings_power_status_inverted": "Aktuellen Status statt Aktion anzeigen",
|
||||
"settings_mqtt_port": "MQTT-Port",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "Profile importieren",
|
||||
|
||||
@ -274,6 +274,7 @@
|
||||
"settings_power_off_url": "Power-Off URL",
|
||||
"settings_power_status_url": "Status URL",
|
||||
"settings_power_hint": "Optional: plain HTTP GET URLs for a smart plug (e.g. Tasmota) controlling the printer's mains power. Leave empty to hide the power button.",
|
||||
"settings_power_status_inverted": "Show current status instead of action",
|
||||
"settings_mqtt_port": "MQTT Port",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "Import profiles",
|
||||
|
||||
@ -274,6 +274,7 @@
|
||||
"settings_power_off_url": "URL de apagado",
|
||||
"settings_power_status_url": "URL de estado",
|
||||
"settings_power_hint": "Opcional: URLs HTTP GET para un enchufe inteligente (p.ej. Tasmota) que controla la alimentación de la impresora. Déjalo vacío para ocultar el botón de encendido.",
|
||||
"settings_power_status_inverted": "Mostrar el estado actual en lugar de la acción",
|
||||
"settings_mqtt_port": "MQTT Port",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "Importar perfiles",
|
||||
|
||||
@ -262,6 +262,7 @@
|
||||
"settings_power_off_url": "URL d'extinction",
|
||||
"settings_power_status_url": "URL de statut",
|
||||
"settings_power_hint": "Optionnel : URL HTTP GET pour une prise connectée (ex. Tasmota) contrôlant l'alimentation secteur de l'imprimante. Laisser vide masque le bouton d'alimentation.",
|
||||
"settings_power_status_inverted": "Afficher l'état actuel au lieu de l'action",
|
||||
"settings_mqtt_port": "Port MQTT",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "Importer des profils",
|
||||
|
||||
@ -262,6 +262,7 @@
|
||||
"settings_power_off_url": "URL spegnimento",
|
||||
"settings_power_status_url": "URL stato",
|
||||
"settings_power_hint": "Opzionale: URL HTTP GET per una presa smart (es. Tasmota) che controlla l'alimentazione della stampante. Lasciare vuoto per nascondere il pulsante di accensione.",
|
||||
"settings_power_status_inverted": "Mostra lo stato attuale invece dell'azione",
|
||||
"settings_mqtt_port": "Porta MQTT",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "Importa profili",
|
||||
|
||||
@ -274,6 +274,7 @@
|
||||
"settings_power_off_url": "关机 URL",
|
||||
"settings_power_status_url": "状态 URL",
|
||||
"settings_power_hint": "可选:智能插座(如 Tasmota)的 HTTP GET 控制 URL,用于控制打印机的电源。留空则隐藏电源按钮。",
|
||||
"settings_power_status_inverted": "显示当前状态而非可执行操作",
|
||||
"settings_mqtt_port": "MQTT 端口",
|
||||
"settings_mqtt_username_placeholder": "userXXXXXXXX",
|
||||
"settings_orca_profiles_import": "导入配置文件",
|
||||
|
||||
Reference in New Issue
Block a user