# IDEX Parts cooling fan turned off

**URL:** <https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160>\
**Category:** General Discussion\
**Created:** [February 25, 2022, 8:40pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160 "2022-02-25T20:40:41Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![SiC\_FPV](https://avatars.discourse-cdn.com/v4/letter/s/e79b87/32.png) [@SiC\_FPV](https://klipper.discourse.group/u/SiC_FPV)\
**Post date:** [February 25, 2022, 8:40pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/1 "2022-02-25T20:40:41Z")

</div>

I have an IDEX printer, and I want to activate the fan of the second extruder when the tool is activated, I saw a Macro here, so I just copied, but still not working. So, basically something is sending the SET\_FAN\_SPEED FAN=extruder1\_partfan SPEED=0 when the tool changes.  
[klippy.log](https://klipper.discourse.group/uploads/short-url/jo0weErOlpf1T6bN7X9jEv0yo1F.log) (931.1 KB)  
Should I write something on the GCode of the Tool Change? I tried but did’t worked. Appreciated

[fan\_generic extruder0\_partfan]  
pin: PB0

[fan\_generic extruder1\_partfan]  
pin: PB1

[gcode\_macro M106]  
gcode:  
{% if params.P is defined %}  
{% if params.S is defined %}  
{% if params.S|int == 255 %}  
{% set realspeed = 1 %}  
{% else %}  
{% if params.S|int == 0 %}  
{% set realspeed = 0 %}  
{% else %}  
{% set realspeed = 0.003921params.S|int %}  
{% endif %}  
{% endif %}  
SET\_FAN\_SPEED FAN=extruder{params.P|int}\_partfan SPEED={realspeed}  
{% else %}  
SET\_FAN\_SPEED FAN=extruder{params.P|int}\_partfan SPEED=1  
{% endif %}  
{% else %}  
{% if params.S is defined %}  
{% if params.S|int == 255 %}  
{% set realspeed = 1 %}  
{% else %}  
{% if params.S|int == 0 %}  
{% set realspeed = 0 %}  
{% else %}  
{% set realspeed = 0.003921params.S|int %}  
{% endif %}  
{% endif %}  
SET\_FAN\_SPEED FAN=extruder0\_partfan SPEED={realspeed}  
{% else %}  
SET\_FAN\_SPEED FAN=extruder0\_partfan SPEED=1  
{% endif %}  
{% endif %}

[gcode\_macro M107]  
gcode:  
{% if params.P is defined %}  
SET\_FAN\_SPEED FAN=extruder{params.P|int}\_partfan SPEED=0  
{% else %}  
SET\_FAN\_SPEED FAN=extruder0\_partfan SPEED=0  
SET\_FAN\_SPEED FAN=extruder1\_partfan SPEED=0  
{% endif %}

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [March 14, 2022, 4:08pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/2 "2022-03-14T16:08:34Z")

</div>

Hi @SiC_FPV try this

```auto
## add to T0 macro
SET_GCODE_VARIABLE MACRO=FAN_VARIABLE VARIABLE=active_fan VALUE=0
CARRIAGE_PRINT_FAN 

## add to T1 macro
SET_GCODE_VARIABLE MACRO=FAN_VARIABLE VARIABLE=active_fan VALUE=1
CARRIAGE_PRINT_FAN

```

HW config

```auto

# X1 print cooling fan
[fan_generic fan]
pin: PC9
cycle_time: 0.0100
kick_start_time: 1.00

# X2 print cooling fan
[fan_generic fan1]
pin: PA8
cycle_time: 0.0100
kick_start_time: 1.000

```

Macro M106 / M107

```auto

[gcode_macro FAN_VARIABLE]
gcode:

variable_active_fan: 0

#--- Carriages print cooling FANs ---
variable_fan: 'fan' # carriage X1
variable_fan1: 'fan1' # carriage X2
#--- Other user define FANs ---
variable_fan2: 'fan2'     
variable_fan3: 'fan3'
variable_fan4: 'fan4'  
variable_fan5: 'fan5'

##########################################################
# PRINTER FANS MANAGEMENT
# Redefine G-code command M106 and M107 
##########################################################

[gcode_macro M106]
description: Override "M106" to allow multiple extruders.
gcode:

    {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}
    {% set raw_speed = params.S|default(0)|float %}
    {% set fan_speed = (raw_speed / 255.0)|round(2) %}     
        
    {% set target_fan = params.P|default(fan_vars.active_fan)|int %}
    {% set default_fan = ('fan', 'fan1', 'fan2', 'fan3', 'fan4', 'fan5')[target_fan] %}     
    
    {% if target_fan in [0,1] %}
       ### carriages print cooling FAN   
        CARRIAGE_PRINT_FAN SPEED={fan_speed}
    {% else %}
       ### other user define FAN
        SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed}
    {% endif %}
 

[gcode_macro M107]
description: Override "M107" to allow multiple extruders.
gcode:
    M106 S0
     
 
[gcode_macro CARRIAGE_PRINT_FAN]
description: Set automatically the print fan speed for dual carriages modes 
gcode:
    {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}      
    
    {% if params.SPEED is defined %}
        {% set fan_speed = params.SPEED|float %}
    {% else %}
        ### read print fan speed from active carriage/extruder
        {% set fan_speed = printer["fan_generic " + fan_vars.fan].speed|float %}
        {% set fan1_speed = printer["fan_generic " + fan_vars.fan1].speed|float %}
        {% set fan_speed = [fan_speed, fan1_speed]|max %}
    {% endif %}
        
    {% if fan_vars.active_fan == 0 %}
        ### FAN on carriage X1
        SET_FAN_SPEED FAN={fan_vars.fan} SPEED={fan_speed}
        SET_FAN_SPEED FAN={fan_vars.fan1} SPEED=0
    {% elif fan_vars.active_fan == 1 %}
        ### FAN on carriage X2
        SET_FAN_SPEED FAN={fan_vars.fan} SPEED=0
        SET_FAN_SPEED FAN={fan_vars.fan1} SPEED={fan_speed}
    {% endif %}
    

```

---

<div class="post-metadata">

**Author:** ![SiC\_FPV](https://avatars.discourse-cdn.com/v4/letter/s/e79b87/32.png) [@SiC\_FPV](https://klipper.discourse.group/u/SiC_FPV)\
**Post date:** [March 15, 2022, 10:50am UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/3 "2022-03-15T10:50:17Z")

</div>

> [@DrumClock](#):
>
> ```auto
> ##########################################################
> # PRINTER FANS MANAGEMENT
> # Redefine G-code command M106 and M107 
> ##########################################################
> 
> [gcode_macro M106]
> description: Override "M106" to allow multiple extruders.
> gcode:
> 
> {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}
> {% set raw_speed = params.S|default(0)|float %}
> {% set fan_speed = (raw_speed / 255.0)|round(2) %}     
>         
> {% set target_fan = params.P|default(fan_vars.active_fan)|int %}
> {% set default_fan = ('fan', 'fan1', 'fan2', 'fan3', 'fan4', 'fan5')[target_fan] %}     
>     
> {% if target_fan in [0,1] %}
> ### carriages print cooling FAN   
> CARRIAGE_PRINT_FAN SPEED={fan_speed}
> {% else %}
> ### other user define FAN
> SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed}
> {% endif %}
>  
> 
> [gcode_macro M107]
> description: Override "M107" to allow multiple extruders.
> gcode:
> M106 S0
>      
>  
> [gcode_macro CARRIAGE_PRINT_FAN]
> description: Set automatically the print fan speed for dual carriages modes 
> gcode:
> {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}      
>     
> {% if params.SPEED is defined %}
> {% set fan_speed = params.SPEED|float %}
> {% else %}
> ### read print fan speed from active carriage/extruder
> {% set fan_speed = printer["fan_generic " + fan_vars.fan].speed|float %}
> {% set fan1_speed = printer["fan_generic " + fan_vars.fan1].speed|float %}
> {% set fan_speed = [fan_speed, fan1_speed]|max %}
> {% endif %}
>         
> {% if fan_vars.active_fan == 0 %}
> ### FAN on carriage X1
> SET_FAN_SPEED FAN={fan_vars.fan} SPEED={fan_speed}
> SET_FAN_SPEED FAN={fan_vars.fan1} SPEED=0
> {% elif fan_vars.active_fan == 1 %}
> ### FAN on carriage X2
> SET_FAN_SPEED FAN={fan_vars.fan} SPEED=0
> SET_FAN_SPEED FAN={fan_vars.fan1} SPEED={fan_speed}
> {% endif %}
>     
> 
> ```

Thanks mate! I’ll try it, but seems it’s working!!! 😃

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [March 15, 2022, 2:27pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/4 "2022-03-15T14:27:34Z")

</div>

of course it works, I have tested it 🙂

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [March 18, 2022, 6:07pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/5 "2022-03-18T18:07:28Z")

</div>

Hi @SiC_FPV  
**Version 2 - for multiple extruders on one carriages**  
eg my printer … [Test(2) - YouTube](https://youtu.be/qh_7V5xjoyM)

Add to macro Txx

```auto
## add to T0 macro
#  
# CARRIAGE_PRINT_FAN 
#
## add to T1 macro
# 
# CARRIAGE_PRINT_FAN

```

HW config FANs

```auto
# X1 print cooling fan
# [fan_generic fan]
# pin: PC9
# cycle_time: 0.0100
# kick_start_time: 1.00

# X2 print cooling fan
# [fan_generic fan1]
# pin: PA8
# cycle_time: 0.0100
# kick_start_time: 1.000

# Other define FANs
# [fan_generic fan2]
# pin:
# [fan_generic fan3]
# pin:
# [fan_generic fan4]
# pin:
# [fan_generic fan5]
# pin:

```

Macros M160 / M107

````auto

##########################################################
# PRINTER FANS MANAGEMENT
# Redefine G-code command M106 and M107 
##########################################################

[gcode_macro M106]
description: Override "M106" to allow multiple extruders.
gcode:

    
    {% set raw_speed = params.S|default(255)|float %}
    {% set fan_speed = (raw_speed / 255.0)|round(2) %} 

    {% if (params.P) is defined %}  
      {% set target_fan = params.P|int %}     
      {% set default_fan = ('fan', 'fan1', 'fan2', 'fan3', 'fan4', 'fan5')[target_fan] %}  
       SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed}
    {% else %}
        ### carriages print cooling FAN   
        CARRIAGE_PRINT_FAN SPEED={fan_speed}       
    {% endif %}

#=============================================================== 

[gcode_macro M107]
description: Override "M107" to allow multiple extruders.
gcode:

    {% if (params.P) is defined %} 
      M106 S0 P{params.P}
    {% else %}
      M106 S0
    {% endif %}

#===============================================================
 
[gcode_macro CARRIAGE_PRINT_FAN]
description: Set automatically the print fan speed for dual carriages modes 

#--- Carriages print cooling FANs ---
variable_fan: 'fan' # carriage X1
variable_fan1: 'fan1' # carriage X2

gcode:
     
    ### FAN speed  
    {% if params.SPEED is defined %}
        {% set fan_speed = params.SPEED|float %}
    {% else %}
        ### read print fan speed from active carriage/extruder        
        {% set fan_speed = printer["fan_generic " + fan].speed|float %}
        {% set fan1_speed = printer["fan_generic " + fan1].speed|float %}
        {% set fan_speed = [fan_speed, fan1_speed]|max %}
    {% endif %}

    ### Active FAN for carriage
    {% set active_toolhead =({'extruder':0,'extruder1':1,'extruder2':2,'extruder3':3})[printer['toolhead'].extruder] %}    
    
     {% if active_toolhead in [0,1] %}   
        ### FAN on carriage X1       
        SET_FAN_SPEED FAN={fan} SPEED={fan_speed}
        SET_FAN_SPEED FAN={fan1} SPEED=0

     {% elif active_toolhead in [2,3] %}   
        ### FAN on carriage X2        
        SET_FAN_SPEED FAN={fan} SPEED=0
        SET_FAN_SPEED FAN={fan1} SPEED={fan_speed}
    {% endif %}
    ```
````

---

<div class="post-metadata">

**Author:** ![SiC\_FPV](https://avatars.discourse-cdn.com/v4/letter/s/e79b87/32.png) [@SiC\_FPV](https://klipper.discourse.group/u/SiC_FPV)\
**Post date:** [March 18, 2022, 6:25pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/6 "2022-03-18T18:25:29Z")

</div>

Damn bro! 🙏 You’re the best!!! The first one worked perfect. And this one will do it as well!!! Klipper community is the best 🙏 much appreciated!

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [March 18, 2022, 6:33pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/7 "2022-03-18T18:33:50Z")

</div>

I’m not the best … these are others who help learn Klipper 🙂

Do you use `hybrid_corexy` or` hybrid_corexz` kinematics?

it could work this:

````auto
### Active FAN for carriage
    
    
     {% if printer.dual_carriage.active_carriage == "CARRIAGE_0" %}  
        ### FAN on carriage X1       
        SET_FAN_SPEED FAN={fan} SPEED={fan_speed}
        SET_FAN_SPEED FAN={fan1} SPEED=0

     {% elif printer.dual_carriage.active_carriage == "CARRIAGE_1" %} 
        ### FAN on carriage X2        
        SET_FAN_SPEED FAN={fan} SPEED=0
        SET_FAN_SPEED FAN={fan1} SPEED={fan_speed}
    {% endif %}```
````

---

<div class="post-metadata">

**Author:** ![ccomincini](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/ccomincini/32/5373_2.png) [@ccomincini](https://klipper.discourse.group/u/ccomincini)\
**Post date:** [May 19, 2023, 9:27pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/8 "2023-05-19T21:27:23Z")

</div>

Hi I’ve tried to use your macros but I receive this error:  
`!! Error evaluating 'gcode_macro M106:gcode': jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'active_fan'`  
Any suggestion? (please)

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [May 20, 2023, 8:26am UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/9 "2023-05-20T08:26:09Z")

</div>

Hi, send me your current gcode\_macro M106.

---

<div class="post-metadata">

**Author:** ![ccomincini](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/ccomincini/32/5373_2.png) [@ccomincini](https://klipper.discourse.group/u/ccomincini)\
**Post date:** [May 20, 2023, 11:09am UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/10 "2023-05-20T11:09:58Z")

</div>

Here it is, thank you

```auto
[gcode_macro FAN_VARIABLE]
gcode:
    variable_active_fan: 1
    #--- Carriages print cooling FANs ---
    variable_fan: 'fan' # carriage X1
    variable_fan1: 'fan1' # carriage X2
    #--- Other user define FANs ---
    variable_fan2: 'fan2'     
    variable_fan3: 'fan3'
    variable_fan4: 'fan4'  
    variable_fan5: 'fan5'
    
    
[gcode_macro M106]
description: Override "M106" to allow multiple extruders.
gcode:
    {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}
    {% set raw_speed = params.S|default(0)|float %}
    {% set fan_speed = (raw_speed / 255.0)|round(2) %}     
        
    {% set target_fan = params.P|default(fan_vars.active_fan)|int %}
    {% set default_fan = ('fan', 'fan1', 'fan2', 'fan3', 'fan4', 'fan5')[target_fan] %}     
    
    {% if target_fan in [0,1] %}
       ### carriages print cooling FAN   
        CARRIAGE_PRINT_FAN SPEED={fan_speed}
    {% else %}
       ### other user define FAN
        SET_FAN_SPEED FAN={default_fan} SPEED={fan_speed}
    {% endif %}

[gcode_macro M107]
description: Override "M107" to allow multiple extruders.
gcode:
    M106 S0

[gcode_macro CARRIAGE_PRINT_FAN]
description: Set automatically the print fan speed for dual carriages modes 
gcode:
    {% set fan_vars = printer["gcode_macro FAN_VARIABLE"] %}      
    
    {% if params.SPEED is defined %}
        {% set fan_speed = params.SPEED|float %}
    {% else %}
        ### read print fan speed from active carriage/extruder
        {% set fan_speed = printer["fan_generic " + fan_vars.fan].speed|float %}
        {% set fan1_speed = printer["fan_generic " + fan_vars.fan1].speed|float %}
        {% set fan_speed = [fan_speed, fan1_speed]|max %}
    {% endif %}
        
    {% if fan_vars.active_fan == 0 %}
        ### FAN on carriage X1
        SET_FAN_SPEED FAN={fan_vars.fan} SPEED={fan_speed}
        SET_FAN_SPEED FAN={fan_vars.fan1} SPEED=0
    {% elif fan_vars.active_fan == 1 %}
        ### FAN on carriage X2
        SET_FAN_SPEED FAN={fan_vars.fan} SPEED=0
        SET_FAN_SPEED FAN={fan_vars.fan1} SPEED={fan_speed}
    {% endif %}

```

---

<div class="post-metadata">

**Author:** ![DrumClock](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/drumclock/32/177_2.png) [@DrumClock](https://klipper.discourse.group/u/DrumClock)\
**Post date:** [May 21, 2023, 7:42am UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/11 "2023-05-21T07:42:58Z")

</div>

Hi, this is probably my first macro.  
I am currently using universal macros for various printer cfgs.  
Info here: [GitHub - DrumClock/my\_config](https://github.com/DrumClock/my_config)

The advantage is that the names of the fans are loaded from printer.cfg and also the switching logic for IDEX, which is dependent on the type of kinematics, is redesigned.

Try new macros, otherwise you’ll have to find the problem yourself because it doesn’t have your complete cfg.

-Petr

---

<div class="post-metadata">

**Author:** ![JuanMartin](https://avatars.discourse-cdn.com/v4/letter/j/a183cd/32.png) [@JuanMartin](https://klipper.discourse.group/u/JuanMartin)\
**Post date:** [November 12, 2024, 7:55pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/12 "2024-11-12T19:55:24Z")

</div>

It simply works 🤑

---

<div class="post-metadata">

**Author:** ![EddyMI3D](https://yyz2.discourse-cdn.com/free1/user_avatar/klipper.discourse.group/eddymi3d/32/1981_2.png) [@EddyMI3D](https://klipper.discourse.group/u/EddyMI3D)\
**Post date:** [November 12, 2024, 8:20pm UTC](https://klipper.discourse.group/t/idex-parts-cooling-fan-turned-off/2160/13 "2024-11-12T20:20:32Z")

</div>


