From cbc7dadf42fc1cc56418caeb7ccba9491175f1ad Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Tue, 26 Oct 2021 21:54:43 -0500
Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Apply=20HAS=5FMULTI=5FHOTEND=20c?=
 =?UTF-8?q?onditional?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../lcd/e3v2/marlinui/ui_status_480x272.cpp   | 15 +++----
 .../src/lcd/extui/dgus/DGUSScreenHandler.cpp  |  8 ++--
 .../lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp  | 12 ++---
 .../extui/dgus/fysetc/DGUSScreenHandler.cpp   |  4 +-
 .../lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp | 44 ++++++++-----------
 .../extui/dgus/hiprecy/DGUSScreenHandler.cpp  |  6 +--
 .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 10 ++---
 .../lcd/extui/dgus/origin/DGUSDisplayDef.cpp  | 10 ++---
 .../extui/dgus/origin/DGUSScreenHandler.cpp   |  6 +--
 .../lcd/extui/dgus_reloaded/DGUSRxHandler.cpp | 12 ++---
 .../lcd/extui/dgus_reloaded/DGUSTxHandler.cpp |  8 ++--
 .../extui/dgus_reloaded/config/DGUS_Addr.h    |  4 +-
 .../dgus_reloaded/definition/DGUS_VPList.cpp  |  4 +-
 Marlin/src/lcd/menu/menu_temperature.cpp      |  7 +--
 Marlin/src/lcd/tft/ui_common.h                |  4 +-
 Marlin/src/pins/esp32/pins_E4D.h              |  2 +-
 Marlin/src/pins/esp32/pins_FYSETC_E4.h        |  2 +-
 Marlin/src/pins/esp32/pins_MRR_ESPA.h         |  2 +-
 Marlin/src/pins/esp32/pins_MRR_ESPE.h         |  2 +-
 Marlin/src/pins/ramps/pins_K8600.h            |  2 +-
 Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h |  2 +-
 Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h    |  2 +-
 .../src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h  |  2 +-
 Marlin/src/pins/stm32f1/pins_CREALITY_V4.h    |  2 +-
 Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h |  2 +-
 Marlin/src/pins/stm32f1/pins_CREALITY_V452.h  |  2 +-
 Marlin/src/pins/stm32f1/pins_CREALITY_V453.h  |  2 +-
 Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h  |  2 +-
 .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h   |  2 +-
 Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h    |  2 +-
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h   |  2 +-
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h  |  2 +-
 .../pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h    |  2 +-
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h  |  2 +-
 .../src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h |  2 +-
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h |  2 +-
 Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h |  2 +-
 Marlin/src/pins/stm32f4/pins_ANET_ET4.h       |  2 +-
 .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h   |  2 +-
 Marlin/src/pins/stm32f4/pins_LERDGE_X.h       |  2 +-
 Marlin/src/pins/stm32f7/pins_REMRAM_V1.h      |  2 +-
 41 files changed, 100 insertions(+), 106 deletions(-)

diff --git a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp
index 703db2ee45..306e9044f7 100644
--- a/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp
+++ b/Marlin/src/lcd/e3v2/marlinui/ui_status_480x272.cpp
@@ -132,20 +132,19 @@ FORCE_INLINE void _draw_fan_status(const uint16_t x, const uint16_t y) {
   }
 }
 
-#if HOTENDS > 2
-  #define HOTEND_STATS 3
-#elif HOTENDS > 1
-  #define HOTEND_STATS 2
-#elif HAS_HOTEND
-  #define HOTEND_STATS 1
-#endif
-
 /**
  * Draw a single heater icon with current and target temperature, at the given XY
  */
 FORCE_INLINE void _draw_heater_status(const heater_id_t heater, const uint16_t x, const uint16_t y) {
 
   #if HAS_HOTEND
+    #if HOTENDS > 2
+      #define HOTEND_STATS 3
+    #elif HOTENDS > 1
+      #define HOTEND_STATS 2
+    #elif HAS_HOTEND
+      #define HOTEND_STATS 1
+    #endif
     static celsius_t old_temp[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, 500),
                      old_target[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, 500);
     static bool old_on[HOTEND_STATS] = ARRAY_N_1(HOTEND_STATS, false);
diff --git a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp
index c9e7268f04..be08b074ff 100644
--- a/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus/DGUSScreenHandler.cpp
@@ -185,7 +185,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) {
         case VP_E0_PID_I: valuesend = unscalePID_i(value); break;
         case VP_E0_PID_D: valuesend = unscalePID_d(value); break;
       #endif
-      #if HOTENDS >= 2
+      #if HAS_MULTI_HOTEND
         case VP_E1_PID_P: valuesend = value; break;
         case VP_E1_PID_I: valuesend = unscalePID_i(value); break;
         case VP_E1_PID_D: valuesend = unscalePID_d(value); break;
@@ -400,7 +400,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va
         acceptedvalue = thermalManager.degTargetHotend(0);
         break;
     #endif
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       case VP_T_E1_Set:
         NOMORE(newvalue, HEATER_1_MAXTEMP);
         thermalManager.setTargetHotend(newvalue, 1);
@@ -551,7 +551,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo
               sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0);
               break;
           #endif
-          #if HOTENDS >= 2
+          #if HAS_MULTI_HOTEND
             case VP_PID_AUTOTUNE_E1:
               sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1);
               break;
@@ -598,7 +598,7 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr
   switch (var.VP) {
     #if HAS_HOTEND
       case VP_E0_CONTROL:
-      #if HOTENDS >= 2
+      #if HAS_MULTI_HOTEND
         case VP_E1_CONTROL:
         #if HOTENDS >= 3
           case VP_E2_CONTROL:
diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp
index d73a7ea552..a4c0997bf8 100644
--- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSDisplayDef.cpp
@@ -51,7 +51,7 @@ const uint16_t VPList_Main[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS,
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VP_T_E1_Is, VP_T_E1_Set,
   #endif
   #if HAS_HEATED_BED
@@ -73,7 +73,7 @@ const uint16_t VPList_Temp[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VP_T_E1_Is, VP_T_E1_Set,
   #endif
   #if HAS_HEATED_BED
@@ -87,7 +87,7 @@ const uint16_t VPList_Status[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VP_T_E1_Is, VP_T_E1_Set,
   #endif
   #if HAS_HEATED_BED
@@ -120,7 +120,7 @@ const uint16_t VPList_Preheat[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VP_T_E1_Is, VP_T_E1_Set,
   #endif
   #if HAS_HEATED_BED
@@ -187,7 +187,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VP_T_E1_Is, VP_T_E1_Set,
   #endif
   #if HAS_HEATED_BED
@@ -379,7 +379,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
       VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload),
     #endif
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>),
     VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
     VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),  // ERROR: Flow is per-extruder, not per-hotend
diff --git a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp
index 2f08136cbb..750acece1c 100644
--- a/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus/fysetc/DGUSScreenHandler.cpp
@@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
           case VP_E0_PID_I: newvalue = scalePID_i(value); break;
           case VP_E0_PID_D: newvalue = scalePID_d(value); break;
         #endif
-        #if HOTENDS >= 2
+        #if HAS_MULTI_HOTEND
           case VP_E1_PID_P: newvalue = value; break;
           case VP_E1_PID_I: newvalue = scalePID_i(value); break;
           case VP_E1_PID_D: newvalue = scalePID_d(value); break;
@@ -334,7 +334,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
       #if HAS_HOTEND
         thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0);
       #endif
-      #if HOTENDS >= 2
+      #if HAS_MULTI_HOTEND
         thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1);
       #endif
       GotoScreen(DGUSLCD_SCREEN_UTILITY);
diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp
index bdcff47ae8..f3f361f84e 100644
--- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSDisplayDef.cpp
@@ -50,7 +50,7 @@ const uint16_t VPList_Main[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded.
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set, VP_E0_STATUS,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -72,7 +72,7 @@ const uint16_t VPList_Main[] PROGMEM = {
 const uint16_t VPList_Temp[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -86,7 +86,7 @@ const uint16_t VPList_Status[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -107,7 +107,7 @@ const uint16_t VPList_Status2[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded
   #if HAS_HOTEND
     VP_Flowrate_E0,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_Flowrate_E1,
     #endif
   #endif
@@ -119,7 +119,7 @@ const uint16_t VPList_Status2[] PROGMEM = {
 const uint16_t VPList_Preheat[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -137,7 +137,7 @@ const uint16_t VPList_ManualMove[] PROGMEM = {
 const uint16_t VPList_ManualExtrude[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -159,7 +159,7 @@ const uint16_t VPList_Filament_heating[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
     VP_E0_FILAMENT_LOAD_UNLOAD,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -169,7 +169,7 @@ const uint16_t VPList_Filament_heating[] PROGMEM = {
 const uint16_t VPList_Filament_load_unload[] PROGMEM = {
   #if HAS_HOTEND
     VP_E0_FILAMENT_LOAD_UNLOAD,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_E1_FILAMENT_LOAD_UNLOAD,
     #endif
   #endif
@@ -185,7 +185,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = {
   VP_PrintProgress_Percentage, VP_PrintTime,
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -205,7 +205,7 @@ const uint16_t VPList_SD_PrintManipulation[] PROGMEM = {
 const uint16_t VPList_SDPrintTune[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -222,23 +222,17 @@ const uint16_t VPList_SDPrintTune[] PROGMEM = {
 };
 
 const uint16_t VPList_StepPerMM[] PROGMEM = {
-  VP_X_STEP_PER_MM,
-  VP_Y_STEP_PER_MM,
-  VP_Z_STEP_PER_MM,
-  #if HAS_HOTEND
-    VP_E0_STEP_PER_MM,
-    #if HOTENDS >= 2
-      VP_E1_STEP_PER_MM,
-    #endif
-  #endif
-  0x0000
+  VP_X_STEP_PER_MM
+  , VP_Y_STEP_PER_MM
+  , VP_Z_STEP_PER_MM
+  OPTARG(HAS_HOTEND,       VP_E0_STEP_PER_MM)
+  OPTARG(HAS_MULTI_HOTEND, VP_E1_STEP_PER_MM)
+  , 0x0000
 };
 
 const uint16_t VPList_PIDE0[] PROGMEM = {
   #if ENABLED(PIDTEMP)
-    VP_E0_PID_P,
-    VP_E0_PID_I,
-    VP_E0_PID_D,
+    VP_E0_PID_P, VP_E0_PID_I, VP_E0_PID_D,
   #endif
   0x0000
 };
@@ -382,7 +376,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
       VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, ScreenHandler.HandlePIDAutotune, nullptr),
     #endif
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>),
     VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
     VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
@@ -435,7 +429,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
   VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
   #if HAS_HOTEND
     VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
     #endif
   #endif
diff --git a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp
index f72a9f439d..79a3cb9103 100644
--- a/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus/hiprecy/DGUSScreenHandler.cpp
@@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
           case VP_E0_PID_I: newvalue = scalePID_i(value); break;
           case VP_E0_PID_D: newvalue = scalePID_d(value); break;
         #endif
-        #if HOTENDS >= 2
+        #if HAS_MULTI_HOTEND
           case VP_E1_PID_P: newvalue = value; break;
           case VP_E1_PID_I: newvalue = scalePID_i(value); break;
           case VP_E1_PID_D: newvalue = scalePID_d(value); break;
@@ -333,7 +333,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
     if (filament_data.action == 0) { // Go back to utility screen
       #if HAS_HOTEND
         thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0);
-        #if HOTENDS >= 2
+        #if HAS_MULTI_HOTEND
           thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1);
         #endif
       #endif
@@ -348,7 +348,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
               thermalManager.setTargetHotend(e_temp, filament_data.extruder);
               break;
           #endif
-          #if HOTENDS >= 2
+          #if HAS_MULTI_HOTEND
             case VP_E1_FILAMENT_LOAD_UNLOAD:
               filament_data.extruder = ExtUI::extruder_t::E1;
               thermalManager.setTargetHotend(e_temp, filament_data.extruder);
diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp
index 9ecfb57397..ff013967c0 100644
--- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp
@@ -122,7 +122,7 @@ const uint16_t VPList_Main[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded.
   #if HAS_HOTEND
     MKSLIST_E_ITEM(0) VP_E0_STATUS,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       MKSLIST_E_ITEM(1) VP_E1_STATUS,
     #endif
   #endif
@@ -567,7 +567,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
     #endif
   #endif
 
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>),
     VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
     VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
@@ -656,7 +656,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
 
   #if HAS_HOTEND
     VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(0)], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E_AXIS_N(1)], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
     #endif
   #endif
@@ -667,7 +667,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
 
   #if HAS_HOTEND
     VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(0)], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
     #endif
   #endif
@@ -744,7 +744,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
 
   #if HAS_HOTEND
     VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>),
     #endif
   #endif
diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp
index 2f5e2787d6..0115d3b8c1 100644
--- a/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp
+++ b/Marlin/src/lcd/extui/dgus/origin/DGUSDisplayDef.cpp
@@ -57,7 +57,7 @@ const uint16_t VPList_Main[] PROGMEM = {
 const uint16_t VPList_Temp[] PROGMEM = {
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -71,7 +71,7 @@ const uint16_t VPList_Status[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded
   #if HAS_HOTEND
     VP_T_E0_Is, VP_T_E0_Set,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_T_E1_Is, VP_T_E1_Set,
     #endif
   #endif
@@ -92,7 +92,7 @@ const uint16_t VPList_Status2[] PROGMEM = {
   // VP_M117, for completeness, but it cannot be auto-uploaded
   #if HAS_HOTEND
     VP_Flowrate_E0,
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VP_Flowrate_E1,
     #endif
   #endif
@@ -182,7 +182,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
       VPHELPER(VP_E0_FILAMENT_LOAD_UNLOAD, nullptr, ScreenHandler.HandleFilamentOption, ScreenHandler.HandleFilamentLoadUnload),
     #endif
   #endif
-  #if HOTENDS >= 2
+  #if HAS_MULTI_HOTEND
     VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>),
     VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
     VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, ScreenHandler.DGUSLCD_SendWordValueToDisplay),
@@ -237,7 +237,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = {
   VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
   #if HAS_HOTEND
     VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
-    #if HOTENDS >= 2
+    #if HAS_MULTI_HOTEND
       VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<1>),
     #endif
   #endif
diff --git a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp
index 82404ead94..b77c92b7eb 100644
--- a/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus/origin/DGUSScreenHandler.cpp
@@ -256,7 +256,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
           case VP_E0_PID_I: newvalue = scalePID_i(value); break;
           case VP_E0_PID_D: newvalue = scalePID_d(value); break;
         #endif
-        #if HOTENDS >= 2
+        #if HAS_MULTI_HOTEND
           case VP_E1_PID_P: newvalue = value; break;
           case VP_E1_PID_I: newvalue = scalePID_i(value); break;
           case VP_E1_PID_D: newvalue = scalePID_d(value); break;
@@ -333,7 +333,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
     if (filament_data.action == 0) { // Go back to utility screen
       #if HAS_HOTEND
         thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0);
-        #if HOTENDS >= 2
+        #if HAS_MULTI_HOTEND
           thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1);
         #endif
       #endif
@@ -348,7 +348,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) {
               thermalManager.setTargetHotend(e_temp, filament_data.extruder);
               break;
           #endif
-          #if HOTENDS >= 2
+          #if HAS_MULTI_HOTEND
             case VP_E1_FILAMENT_LOAD_UNLOAD:
               filament_data.extruder = ExtUI::extruder_t::E1;
               thermalManager.setTargetHotend(e_temp, filament_data.extruder);
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
index f0844dc785..cf95bb1d76 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
@@ -327,7 +327,7 @@ void DGUSRxHandler::TempTarget(DGUS_VP &vp, void *data_ptr) {
     case DGUS_Addr::TEMP_SetTarget_H0:
       ExtUI::setTargetTemp_celsius(temp, ExtUI::H0);
       break;
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Addr::TEMP_SetTarget_H1:
         ExtUI::setTargetTemp_celsius(temp, ExtUI::H1);
         break;
@@ -347,7 +347,7 @@ void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) {
     case DGUS_Data::Heater::ALL:
       ExtUI::setTargetTemp_celsius(0, ExtUI::BED);
       ExtUI::setTargetTemp_celsius(0, ExtUI::H0);
-      #if HOTENDS > 1
+      #if HAS_MULTI_HOTEND
         ExtUI::setTargetTemp_celsius(0, ExtUI::H1);
       #endif
       break;
@@ -357,7 +357,7 @@ void DGUSRxHandler::TempCool(DGUS_VP &vp, void *data_ptr) {
     case DGUS_Data::Heater::H0:
       ExtUI::setTargetTemp_celsius(0, ExtUI::H0);
       break;
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Data::Heater::H1:
         ExtUI::setTargetTemp_celsius(0, ExtUI::H1);
         break;
@@ -827,7 +827,7 @@ void DGUSRxHandler::PIDSelect(DGUS_VP &vp, void *data_ptr) {
       dgus_screen_handler.pid_heater = heater;
       break;
     case DGUS_Data::Heater::H0:
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Data::Heater::H1:
     #endif
       dgus_screen_handler.pid_temp = DGUS_PLA_TEMP_HOTEND;
@@ -858,7 +858,7 @@ void DGUSRxHandler::PIDSetTemp(DGUS_VP &vp, void *data_ptr) {
     case DGUS_Data::Heater::H0:
       temp = constrain(temp, HEATER_0_MINTEMP, (HEATER_0_MAXTEMP - HOTEND_OVERSHOOT));
       break;
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Data::Heater::H1:
         temp = constrain(temp, HEATER_1_MINTEMP, (HEATER_1_MAXTEMP - HOTEND_OVERSHOOT));
         break;
@@ -900,7 +900,7 @@ void DGUSRxHandler::PIDRun(DGUS_VP &vp, void *data_ptr) {
         dgus_screen_handler.SetStatusMessage(F("PID disabled"));
         return;
       #endif
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Data::Heater::H1:
         #if ENABLED(PIDTEMP)
           heater = H_E1;
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
index 3fc48d2ebb..8d57038765 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
@@ -275,7 +275,7 @@ void DGUSTxHandler::TempMax(DGUS_VP &vp) {
     case DGUS_Addr::TEMP_Max_H0:
       temp = HEATER_0_MAXTEMP - HOTEND_OVERSHOOT;
       break;
-    #if HOTENDS > 1
+    #if HAS_MULTI_HOTEND
       case DGUS_Addr::TEMP_Max_H1:
         temp = HEATER_1_MAXTEMP - HOTEND_OVERSHOOT;
         break;
@@ -428,7 +428,7 @@ void DGUSTxHandler::PIDKp(DGUS_VP &vp) {
       case DGUS_Data::Heater::H0:
         value = ExtUI::getPIDValues_Kp(ExtUI::E0);
         break;
-      #if HOTENDS > 1
+      #if HAS_MULTI_HOTEND
         case DGUS_Data::Heater::H1:
           value = ExtUI::getPIDValues_Kp(ExtUI::E1);
           break;
@@ -454,7 +454,7 @@ void DGUSTxHandler::PIDKi(DGUS_VP &vp) {
       case DGUS_Data::Heater::H0:
         value = ExtUI::getPIDValues_Ki(ExtUI::E0);
         break;
-      #if HOTENDS > 1
+      #if HAS_MULTI_HOTEND
         case DGUS_Data::Heater::H1:
           value = ExtUI::getPIDValues_Ki(ExtUI::E1);
           break;
@@ -480,7 +480,7 @@ void DGUSTxHandler::PIDKd(DGUS_VP &vp) {
       case DGUS_Data::Heater::H0:
         value = ExtUI::getPIDValues_Kd(ExtUI::E0);
         break;
-      #if HOTENDS > 1
+      #if HAS_MULTI_HOTEND
         case DGUS_Data::Heater::H1:
           value = ExtUI::getPIDValues_Kd(ExtUI::E1);
           break;
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h
index 4207119c87..39e97156d0 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h
+++ b/Marlin/src/lcd/extui/dgus_reloaded/config/DGUS_Addr.h
@@ -64,7 +64,7 @@ enum class DGUS_Addr : uint16_t {
   TEMP_Preset               = 0x2010, // Popup / Data: DGUS_Data::TempPreset
   TEMP_SetTarget_Bed        = 0x2011, // Type: Integer (16 bits signed)
   TEMP_SetTarget_H0         = 0x2012, // Type: Integer (16 bits signed)
-  #if HOTENDS > 1
+  #if HAS_MULTI_HOTEND
     TEMP_SetTarget_H1       = 0x2013, // Type: Integer (16 bits signed)
   #endif
   TEMP_Cool                 = 0x2014, // Data: DGUS_Data::Heater
@@ -123,7 +123,7 @@ enum class DGUS_Addr : uint16_t {
   TEMP_Current_H0           = 0x30FF, // Type: Integer (16 bits signed)
   TEMP_Target_H0            = 0x3100, // Type: Integer (16 bits signed)
   TEMP_Max_H0               = 0x3101, // Type: Integer (16 bits unsigned)
-  #if HOTENDS > 1
+  #if HAS_MULTI_HOTEND
     TEMP_Current_H1         = 0x3102, // Type: Integer (16 bits signed)
     TEMP_Target_H1          = 0x3103, // Type: Integer (16 bits signed)
     TEMP_Max_H1             = 0x3104, // Type: Integer (16 bits unsigned)
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp
index 27b6d9036c..e77aa45011 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/definition/DGUS_VPList.cpp
@@ -102,7 +102,7 @@ const struct DGUS_VP vp_list[] PROGMEM = {
   VP_HELPER_RX(DGUS_Addr::TEMP_Preset,        &DGUSRxHandler::TempPreset),
   VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_Bed, &DGUSRxHandler::TempTarget),
   VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H0,  &DGUSRxHandler::TempTarget),
-  #if HOTENDS > 1
+  #if HAS_MULTI_HOTEND
     VP_HELPER_RX(DGUS_Addr::TEMP_SetTarget_H1,  &DGUSRxHandler::TempTarget),
   #endif
   VP_HELPER_RX(DGUS_Addr::TEMP_Cool,          &DGUSRxHandler::TempCool),
@@ -217,7 +217,7 @@ const struct DGUS_VP vp_list[] PROGMEM = {
                     &thermalManager.temp_hotend[ExtUI::heater_t::H0].target,
                     &DGUSTxHandler::ExtraToInteger<int16_t>),
   VP_HELPER_TX(DGUS_Addr::TEMP_Max_H0, &DGUSTxHandler::TempMax),
-  #if HOTENDS > 1
+  #if HAS_MULTI_HOTEND
     VP_HELPER_TX_AUTO(DGUS_Addr::TEMP_Current_H1,
                       &thermalManager.temp_hotend[ExtUI::heater_t::H1].celsius,
                       &DGUSTxHandler::ExtraToInteger<float>),
diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp
index 65cef5b76d..3abb2e9c20 100644
--- a/Marlin/src/lcd/menu/menu_temperature.cpp
+++ b/Marlin/src/lcd/menu/menu_temperature.cpp
@@ -122,7 +122,8 @@ void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t i
 
         HOTEND_LOOP() PREHEAT_ITEMS(editable.int8, e);
         ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M_ALL, []() {
-          HOTEND_LOOP() thermalManager.setTargetHotend(ui.material_preset[editable.int8].hotend_temp, e);
+          const celsius_t t = ui.material_preset[editable.int8].hotend_temp;
+          HOTEND_LOOP() thermalManager.setTargetHotend(t, e);
           TERN(HAS_HEATED_BED, _preheat_bed(editable.int8), ui.return_to_status());
         });
 
@@ -268,7 +269,7 @@ void menu_temperature() {
     //
     LOOP_L_N(m, PREHEAT_COUNT) {
       editable.int8 = m;
-      #if HOTENDS > 1 || HAS_HEATED_BED
+      #if HAS_MULTI_HOTEND || HAS_HEATED_BED
         SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m);
       #elif HAS_HOTEND
         ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m);
@@ -295,7 +296,7 @@ void menu_temperature() {
 
     LOOP_L_N(m, PREHEAT_COUNT) {
       editable.int8 = m;
-      #if HOTENDS > 1 || HAS_HEATED_BED
+      #if HAS_MULTI_HOTEND || HAS_HEATED_BED
         SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m);
       #else
         ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m);
diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h
index d3ffd4bc31..7329c31a52 100644
--- a/Marlin/src/lcd/tft/ui_common.h
+++ b/Marlin/src/lcd/tft/ui_common.h
@@ -57,7 +57,7 @@ void menu_item(const uint8_t row, bool sel = false);
 
 #define ABSOLUTE_ZERO     -273.15
 
-#if HAS_TEMP_CHAMBER && HOTENDS > 1
+#if HAS_TEMP_CHAMBER && HAS_MULTI_HOTEND
   #define ITEM_E0         0
   #define ITEM_E1         1
   #define ITEM_BED        2
@@ -74,7 +74,7 @@ void menu_item(const uint8_t row, bool sel = false);
   #define ITEM_COOLER     0
   #define ITEM_FAN        1
   #define ITEMS_COUNT     2
-#elif HOTENDS > 1
+#elif HAS_MULTI_HOTEND
   #define ITEM_E0         0
   #define ITEM_E1         1
   #define ITEM_BED        2
diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h
index 54621f36c1..02a5fe4e33 100644
--- a/Marlin/src/pins/esp32/pins_E4D.h
+++ b/Marlin/src/pins/esp32/pins_E4D.h
@@ -32,7 +32,7 @@
 
 #if EXTRUDERS > 1 || E_STEPPERS > 1
   #error "E4d@box only supports one E Stepper. Comment out this line to continue."
-#elif HOTENDS > 1
+#elif HAS_MULTI_HOTEND
   #error "E4d@box only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h
index 2b2fe40c4a..4e71a66a22 100644
--- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h
+++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h
@@ -32,7 +32,7 @@
 
 #if EXTRUDERS > 1 || E_STEPPERS > 1
   #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue."
-#elif HOTENDS > 1
+#elif HAS_MULTI_HOTEND
   #error "FYSETC E4 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h
index ab4f401f26..a5f70e8159 100644
--- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h
+++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h
@@ -32,7 +32,7 @@
 
 #if EXTRUDERS > 1 || E_STEPPERS > 1
   #error "MRR ESPA only supports one E Stepper. Comment out this line to continue."
-#elif HOTENDS > 1
+#elif HAS_MULTI_HOTEND
   #error "MRR ESPA only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h
index 1f829b7755..ae4f0c6e36 100644
--- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h
+++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h
@@ -33,7 +33,7 @@
 
 #if EXTRUDERS > 2 || E_STEPPERS > 2
   #error "MRR ESPE only supports two E Steppers. Comment out this line to continue."
-#elif HOTENDS > 1
+#elif HAS_MULTI_HOTEND
   #error "MRR ESPE only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/ramps/pins_K8600.h b/Marlin/src/pins/ramps/pins_K8600.h
index f37516b710..0155129927 100644
--- a/Marlin/src/pins/ramps/pins_K8600.h
+++ b/Marlin/src/pins/ramps/pins_K8600.h
@@ -25,7 +25,7 @@
  * VERTEX NANO Arduino Mega with RAMPS EFB v1.4 pin assignments.
  */
 
-#if HOTENDS > 1
+#if HAS_MULTI_HOTEND
   #error "Only 1 hotend is supported for Vertex Nano."
 #endif
 
diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h
index 3b2639b431..75ee01946a 100644
--- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h
+++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h
@@ -28,7 +28,7 @@
 #define REQUIRE_MEGA2560
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Longer3D LGT KIT V1.0 board only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h
index ebd0bdc0c6..3583958906 100644
--- a/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h
+++ b/Marlin/src/pins/ramps/pins_RAMPS_ENDER_4.h
@@ -21,7 +21,7 @@
  */
 #pragma once
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Ender-4 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
index 77eb6aaf14..d5e4db2946 100644
--- a/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
+++ b/Marlin/src/pins/stm32f1/pins_CCROBOT_MEEB_3DP.h
@@ -23,7 +23,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "CCROBOT-ONLINE MEEB_3DP only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
index ea58b5b3a9..bf2a55fc7b 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
@@ -27,7 +27,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h
index 52ebdecc35..ae54805a94 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h
@@ -27,7 +27,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h
index 64e07a0bc8..a2add81c8b 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V452.h
@@ -25,7 +25,7 @@
  * Creality v4.5.2 (STM32F103RET6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Creality v4.5.2 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h
index ca437312c8..7b8c3280d2 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V453.h
@@ -25,7 +25,7 @@
  * Creality v4.5.3 (STM32F103RET6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Creality v4.5.3 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h
index 3b7a4e4402..e19d330092 100644
--- a/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h
+++ b/Marlin/src/pins/stm32f1/pins_FLSUN_HISPEED.h
@@ -31,7 +31,7 @@
 
 #if NOT_TARGET(__STM32F1__, STM32F1xx)
   #error "Oops! Select an STM32F1 board in 'Tools > Board.'"
-#elif HOTENDS > 1 || E_STEPPERS > 1
+#elif HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "FLSUN HiSpeedV1 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h
index 98465a8607..beae0a3bf0 100644
--- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h
+++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h
@@ -32,7 +32,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "JGAurora A5S A1 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
index 34fbdaf02f..7585a6e289 100644
--- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
+++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
@@ -27,7 +27,7 @@
 
 #if NOT_TARGET(__STM32F1__, STM32F1xx)
   #error "Oops! Select a STM32F1 board in 'Tools > Board.'"
-#elif HOTENDS > 1 || E_STEPPERS > 1
+#elif HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Longer3D only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h
index 89ace3493f..6b05bb7a74 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3.h
@@ -25,7 +25,7 @@
  * MKS Robin E3 (STM32F103RCT6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin E3 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h
index a629bce9f3..9d11af43ef 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D.h
@@ -25,7 +25,7 @@
  * MKS Robin E3D (STM32F103RCT6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin E3D only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
index 718f9dc27a..930ef9722d 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3D_V1_1.h
@@ -25,7 +25,7 @@
  * MKS Robin E3D v1.1 (STM32F103RCT6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin E3D v1.1 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
index c5080b5227..06b9721403 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h
@@ -27,7 +27,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin E3P only supports one hotend / E-stepper. Comment out this line to continue."
 #elif HAS_FSMC_TFT
   #error "MKS Robin E3P doesn't support FSMC-based TFT displays."
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
index 30720e0c7f..7a38507c76 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_V1_1.h
@@ -25,7 +25,7 @@
  * MKS Robin E3 v1.1 (STM32F103RCT6) board pin assignments
  */
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin E3 v1.1 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
index 6388e1723c..0407724cf2 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h
@@ -23,7 +23,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin Lite only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h
index ae45d8b6d1..c981fdc00a 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h
@@ -27,7 +27,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "MKS Robin mini only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h
index 8343010432..eb3af65f32 100644
--- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h
+++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h
@@ -23,7 +23,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
index 86851a7840..da53266b7d 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
@@ -23,7 +23,7 @@
 
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h
index 12e47e35cc..7f35c0f5dd 100644
--- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h
+++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h
@@ -24,7 +24,7 @@
 #define ALLOW_STM32DUINO
 #include "env_validate.h"
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "LERDGE X only supports one hotend / E-stepper. Comment out this line to continue."
 #endif
 
diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
index 133dcd2935..dbf2593c48 100644
--- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
+++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
@@ -32,7 +32,7 @@
   #define SRAM_EEPROM_EMULATION                   // Emulate the EEPROM using Backup SRAM
 #endif
 
-#if HOTENDS > 1 || E_STEPPERS > 1
+#if HAS_MULTI_HOTEND || E_STEPPERS > 1
   #error "RemRam only supports one hotend / E-stepper. Comment out this line to continue."
 #endif