Przeglądaj źródła

fix(ams): confirm drying start instead of trusting the firmware ack (#2533)

The Start Drying button gave no feedback at all and reported success on the
strength of the MQTT ack alone. On a P1S the firmware answers
ams_filament_drying with result=success and then silently declines, and
P1-family firmware never publishes dry_sf_reason — so the #971 reason guard
is inert there and the card just sat unchanged.

Both drying mutations now toast. The start toast claims only that the command
was sent, since that is all the ack proves; the amber countdown badge remains
the signal that a cycle is genuinely live. After a start, the card watches the
unit's dry_status/dry_time (straight from the info bitmask, updated on every
push); firmware reaches DryStatus 1 within seconds of a real start, so still
sitting at zero 30s later means the cycle never began. Bambuddy now says so
and names the two causes: AMS power adapter not connected, or the printer not
idle. Unlike the dry_sf_reason guard this is model-agnostic.
maziggy 1 miesiąc temu
rodzic
commit
0c44db04dd

Plik diff jest za duży
+ 0 - 0
CHANGELOG.md


+ 4 - 4
frontend/src/__tests__/pages/PrintersPageDryingFeedback.test.tsx

@@ -128,7 +128,7 @@ describe('PrintersPage - AMS drying feedback (#2533)', () => {
     vi.useRealTimers();
     vi.useRealTimers();
   });
   });
 
 
-  it('confirms the start command with a toast', async () => {
+  it('acknowledges the start command with a toast that claims only that it was sent', async () => {
     const user = userEvent.setup();
     const user = userEvent.setup();
     server.use(http.get('/api/v1/printers/:id/status', () => HttpResponse.json(IDLE)));
     server.use(http.get('/api/v1/printers/:id/status', () => HttpResponse.json(IDLE)));
 
 
@@ -136,7 +136,7 @@ describe('PrintersPage - AMS drying feedback (#2533)', () => {
     await startDrying(user);
     await startDrying(user);
 
 
     await waitFor(() => {
     await waitFor(() => {
-      expect(mockShowToast).toHaveBeenCalledWith('Drying started', 'success');
+      expect(mockShowToast).toHaveBeenCalledWith('Drying command sent', 'success');
     });
     });
   });
   });
 
 
@@ -167,7 +167,7 @@ describe('PrintersPage - AMS drying feedback (#2533)', () => {
     await startDrying(user);
     await startDrying(user);
 
 
     await waitFor(() => {
     await waitFor(() => {
-      expect(mockShowToast).toHaveBeenCalledWith('Drying started', 'success');
+      expect(mockShowToast).toHaveBeenCalledWith('Drying command sent', 'success');
     });
     });
 
 
     await vi.advanceTimersByTimeAsync(31_000);
     await vi.advanceTimersByTimeAsync(31_000);
@@ -197,7 +197,7 @@ describe('PrintersPage - AMS drying feedback (#2533)', () => {
     await startDrying(user);
     await startDrying(user);
 
 
     await waitFor(() => {
     await waitFor(() => {
-      expect(mockShowToast).toHaveBeenCalledWith('Drying started', 'success');
+      expect(mockShowToast).toHaveBeenCalledWith('Drying command sent', 'success');
     });
     });
 
 
     await vi.advanceTimersByTimeAsync(31_000);
     await vi.advanceTimersByTimeAsync(31_000);

+ 1 - 1
frontend/src/i18n/locales/de.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Trocknung nicht unterstützt',
       notSupported: 'Trocknung nicht unterstützt',
       powerRequired: 'AMS-Netzteil anschließen, um Trocknung zu aktivieren',
       powerRequired: 'AMS-Netzteil anschließen, um Trocknung zu aktivieren',
       startingDrying: 'Trocknung wird gestartet...',
       startingDrying: 'Trocknung wird gestartet...',
-      toastStarted: 'Trocknung gestartet',
+      toastCommandSent: 'Trocknungsbefehl gesendet',
       toastStopped: 'Trocknung gestoppt',
       toastStopped: 'Trocknung gestoppt',
       toastNotStarted: 'Der Drucker hat den Befehl angenommen, aber das AMS hat die Trocknung nicht gestartet. Prüfe, ob das AMS-Netzteil angeschlossen ist und der Drucker im Leerlauf ist.',
       toastNotStarted: 'Der Drucker hat den Befehl angenommen, aber das AMS hat die Trocknung nicht gestartet. Prüfe, ob das AMS-Netzteil angeschlossen ist und der Drucker im Leerlauf ist.',
       stoppingDrying: 'Trocknung wird gestoppt...',
       stoppingDrying: 'Trocknung wird gestoppt...',

+ 1 - 1
frontend/src/i18n/locales/en.ts

@@ -572,7 +572,7 @@ export default {
       notSupported: 'Drying not supported',
       notSupported: 'Drying not supported',
       powerRequired: 'Connect AMS power adapter to enable drying',
       powerRequired: 'Connect AMS power adapter to enable drying',
       startingDrying: 'Starting drying...',
       startingDrying: 'Starting drying...',
-      toastStarted: 'Drying started',
+      toastCommandSent: 'Drying command sent',
       toastStopped: 'Drying stopped',
       toastStopped: 'Drying stopped',
       toastNotStarted: 'The printer accepted the command but the AMS never started drying. Check that the AMS power adapter is connected and that the printer is idle.',
       toastNotStarted: 'The printer accepted the command but the AMS never started drying. Check that the AMS power adapter is connected and that the printer is idle.',
       stoppingDrying: 'Stopping drying...',
       stoppingDrying: 'Stopping drying...',

+ 1 - 1
frontend/src/i18n/locales/es.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Secado no compatible',
       notSupported: 'Secado no compatible',
       powerRequired: 'Conecte el adaptador de corriente del AMS para activar el secado',
       powerRequired: 'Conecte el adaptador de corriente del AMS para activar el secado',
       startingDrying: 'Iniciando el secado...',
       startingDrying: 'Iniciando el secado...',
-      toastStarted: 'Secado iniciado',
+      toastCommandSent: 'Comando de secado enviado',
       toastStopped: 'Secado detenido',
       toastStopped: 'Secado detenido',
       toastNotStarted: 'La impresora aceptó el comando, pero el AMS no inició el secado. Comprueba que el adaptador de corriente del AMS esté conectado y que la impresora esté inactiva.',
       toastNotStarted: 'La impresora aceptó el comando, pero el AMS no inició el secado. Comprueba que el adaptador de corriente del AMS esté conectado y que la impresora esté inactiva.',
       stoppingDrying: 'Deteniendo el secado...',
       stoppingDrying: 'Deteniendo el secado...',

+ 1 - 1
frontend/src/i18n/locales/fr.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Séchage non pris en charge',
       notSupported: 'Séchage non pris en charge',
       powerRequired: 'Brancher l\'adaptateur secteur AMS pour activer le séchage',
       powerRequired: 'Brancher l\'adaptateur secteur AMS pour activer le séchage',
       startingDrying: 'Démarrage du séchage...',
       startingDrying: 'Démarrage du séchage...',
-      toastStarted: 'Séchage démarré',
+      toastCommandSent: 'Commande de séchage envoyée',
       toastStopped: 'Séchage arrêté',
       toastStopped: 'Séchage arrêté',
       toastNotStarted: 'L\'imprimante a accepté la commande, mais l\'AMS n\'a pas démarré le séchage. Vérifiez que l\'adaptateur secteur de l\'AMS est branché et que l\'imprimante est inactive.',
       toastNotStarted: 'L\'imprimante a accepté la commande, mais l\'AMS n\'a pas démarré le séchage. Vérifiez que l\'adaptateur secteur de l\'AMS est branché et que l\'imprimante est inactive.',
       stoppingDrying: 'Arrêt du séchage...',
       stoppingDrying: 'Arrêt du séchage...',

+ 1 - 1
frontend/src/i18n/locales/it.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Essiccazione non supportata',
       notSupported: 'Essiccazione non supportata',
       powerRequired: 'Collegare l\'alimentatore AMS per abilitare l\'asciugatura',
       powerRequired: 'Collegare l\'alimentatore AMS per abilitare l\'asciugatura',
       startingDrying: 'Avvio essiccazione...',
       startingDrying: 'Avvio essiccazione...',
-      toastStarted: 'Essiccazione avviata',
+      toastCommandSent: 'Comando di essiccazione inviato',
       toastStopped: 'Essiccazione interrotta',
       toastStopped: 'Essiccazione interrotta',
       toastNotStarted: 'La stampante ha accettato il comando, ma l\'AMS non ha avviato l\'essiccazione. Verifica che l\'alimentatore dell\'AMS sia collegato e che la stampante sia inattiva.',
       toastNotStarted: 'La stampante ha accettato il comando, ma l\'AMS non ha avviato l\'essiccazione. Verifica che l\'alimentatore dell\'AMS sia collegato e che la stampante sia inattiva.',
       stoppingDrying: 'Arresto essiccazione...',
       stoppingDrying: 'Arresto essiccazione...',

+ 1 - 1
frontend/src/i18n/locales/ja.ts

@@ -568,7 +568,7 @@ export default {
       notSupported: '乾燥非対応',
       notSupported: '乾燥非対応',
       powerRequired: 'AMS電源アダプターを接続して乾燥を有効にしてください',
       powerRequired: 'AMS電源アダプターを接続して乾燥を有効にしてください',
       startingDrying: '乾燥を開始しています...',
       startingDrying: '乾燥を開始しています...',
-      toastStarted: '乾燥を開始しました',
+      toastCommandSent: '乾燥コマンドを送信しました',
       toastStopped: '乾燥を停止しました',
       toastStopped: '乾燥を停止しました',
       toastNotStarted: 'プリンターはコマンドを受け付けましたが、AMS は乾燥を開始しませんでした。AMS の電源アダプターが接続されているか、プリンターがアイドル状態かを確認してください。',
       toastNotStarted: 'プリンターはコマンドを受け付けましたが、AMS は乾燥を開始しませんでした。AMS の電源アダプターが接続されているか、プリンターがアイドル状態かを確認してください。',
       stoppingDrying: '乾燥を停止しています...',
       stoppingDrying: '乾燥を停止しています...',

+ 1 - 1
frontend/src/i18n/locales/ko.ts

@@ -532,7 +532,7 @@ export default {
       notSupported: '건조 지원 안 됨',
       notSupported: '건조 지원 안 됨',
       powerRequired: '건조를 활성화하려면 AMS 전원 어댑터를 연결하세요',
       powerRequired: '건조를 활성화하려면 AMS 전원 어댑터를 연결하세요',
       startingDrying: '건조 시작 중...',
       startingDrying: '건조 시작 중...',
-      toastStarted: '건조를 시작했습니다',
+      toastCommandSent: '건조 명령을 전송했습니다',
       toastStopped: '건조를 중지했습니다',
       toastStopped: '건조를 중지했습니다',
       toastNotStarted: '프린터가 명령을 수락했지만 AMS가 건조를 시작하지 않았습니다. AMS 전원 어댑터가 연결되어 있는지, 프린터가 대기 상태인지 확인하십시오.',
       toastNotStarted: '프린터가 명령을 수락했지만 AMS가 건조를 시작하지 않았습니다. AMS 전원 어댑터가 연결되어 있는지, 프린터가 대기 상태인지 확인하십시오.',
       stoppingDrying: '건조 정지 중...',
       stoppingDrying: '건조 정지 중...',

+ 1 - 1
frontend/src/i18n/locales/pt-BR.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Secagem não suportada',
       notSupported: 'Secagem não suportada',
       powerRequired: 'Conecte o adaptador de energia AMS para ativar a secagem',
       powerRequired: 'Conecte o adaptador de energia AMS para ativar a secagem',
       startingDrying: 'Iniciando secagem...',
       startingDrying: 'Iniciando secagem...',
-      toastStarted: 'Secagem iniciada',
+      toastCommandSent: 'Comando de secagem enviado',
       toastStopped: 'Secagem interrompida',
       toastStopped: 'Secagem interrompida',
       toastNotStarted: 'A impressora aceitou o comando, mas o AMS não iniciou a secagem. Verifique se o adaptador de energia do AMS está conectado e se a impressora está ociosa.',
       toastNotStarted: 'A impressora aceitou o comando, mas o AMS não iniciou a secagem. Verifique se o adaptador de energia do AMS está conectado e se a impressora está ociosa.',
       stoppingDrying: 'Parando secagem...',
       stoppingDrying: 'Parando secagem...',

+ 1 - 1
frontend/src/i18n/locales/tr.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: 'Kurutma desteklenmiyor',
       notSupported: 'Kurutma desteklenmiyor',
       powerRequired: 'Kurutmayı etkinleştirmek için AMS güç adaptörünü bağlayın',
       powerRequired: 'Kurutmayı etkinleştirmek için AMS güç adaptörünü bağlayın',
       startingDrying: 'Kurutma başlatılıyor...',
       startingDrying: 'Kurutma başlatılıyor...',
-      toastStarted: 'Kurutma başlatıldı',
+      toastCommandSent: 'Kurutma komutu gönderildi',
       toastStopped: 'Kurutma durduruldu',
       toastStopped: 'Kurutma durduruldu',
       toastNotStarted: 'Yazıcı komutu kabul etti ancak AMS kurutmayı başlatmadı. AMS güç adaptörünün bağlı olduğundan ve yazıcının boşta olduğundan emin olun.',
       toastNotStarted: 'Yazıcı komutu kabul etti ancak AMS kurutmayı başlatmadı. AMS güç adaptörünün bağlı olduğundan ve yazıcının boşta olduğundan emin olun.',
       stoppingDrying: 'Kurutma durduruluyor...',
       stoppingDrying: 'Kurutma durduruluyor...',

+ 1 - 1
frontend/src/i18n/locales/zh-CN.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: '不支持干燥',
       notSupported: '不支持干燥',
       powerRequired: '连接AMS电源适配器以启用干燥',
       powerRequired: '连接AMS电源适配器以启用干燥',
       startingDrying: '正在启动干燥...',
       startingDrying: '正在启动干燥...',
-      toastStarted: '已开始干燥',
+      toastCommandSent: '已发送干燥命令',
       toastStopped: '已停止干燥',
       toastStopped: '已停止干燥',
       toastNotStarted: '打印机已接受命令,但 AMS 未开始干燥。请检查 AMS 电源适配器是否已连接,以及打印机是否处于空闲状态。',
       toastNotStarted: '打印机已接受命令,但 AMS 未开始干燥。请检查 AMS 电源适配器是否已连接,以及打印机是否处于空闲状态。',
       stoppingDrying: '正在停止干燥...',
       stoppingDrying: '正在停止干燥...',

+ 1 - 1
frontend/src/i18n/locales/zh-TW.ts

@@ -569,7 +569,7 @@ export default {
       notSupported: '不支援乾燥',
       notSupported: '不支援乾燥',
       powerRequired: '連線AMS電源介面卡以啟用乾燥',
       powerRequired: '連線AMS電源介面卡以啟用乾燥',
       startingDrying: '正在啟動乾燥...',
       startingDrying: '正在啟動乾燥...',
-      toastStarted: '已開始乾燥',
+      toastCommandSent: '已傳送乾燥命令',
       toastStopped: '已停止乾燥',
       toastStopped: '已停止乾燥',
       toastNotStarted: '印表機已接受命令,但 AMS 未開始乾燥。請檢查 AMS 電源變壓器是否已連接,以及印表機是否處於閒置狀態。',
       toastNotStarted: '印表機已接受命令,但 AMS 未開始乾燥。請檢查 AMS 電源變壓器是否已連接,以及印表機是否處於閒置狀態。',
       stoppingDrying: '正在停止乾燥...',
       stoppingDrying: '正在停止乾燥...',

+ 5 - 1
frontend/src/pages/PrintersPage.tsx

@@ -2250,7 +2250,11 @@ function PrinterCard({
     onSuccess: (_data, { amsId }) => {
     onSuccess: (_data, { amsId }) => {
       setDryingPopoverAmsId(null);
       setDryingPopoverAmsId(null);
       setDryStartWatch({ amsId });
       setDryStartWatch({ amsId });
-      showToast(t('printers.drying.toastStarted'), 'success');
+      // "Command sent", not "drying started" — at this point the printer has only
+      // taken the command. The amber countdown badge (dry_time > 0) is what says
+      // the cycle is genuinely live; the watcher below covers the case where it
+      // never appears.
+      showToast(t('printers.drying.toastCommandSent'), 'success');
       queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });
       queryClient.invalidateQueries({ queryKey: ['printerStatus', printer.id] });
     },
     },
     onError: (error: Error) => showToast(error.message || t('printers.toast.failedToSendCommand'), 'error'),
     onError: (error: Error) => showToast(error.message || t('printers.toast.failedToSendCommand'), 'error'),

Plik diff jest za duży
+ 0 - 0
static/assets/index-mGOsF6O8.js


+ 1 - 1
static/index.html

@@ -26,7 +26,7 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-DMFedMEr.js"></script>
+    <script type="module" crossorigin src="/assets/index-mGOsF6O8.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-blSspT6K.css">
     <link rel="stylesheet" crossorigin href="/assets/index-blSspT6K.css">
   </head>
   </head>
   <body>
   <body>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików