-
Notifications
You must be signed in to change notification settings - Fork 225
Environment Manager
- Hardware Config
- Parameter Config
- Drying Data Setup
- MMU_HEATER Command
- Single-Heater Mode Operation
- Per-Gate Heater Mode Operation
- Venting Macro
- Spool Rotation
- Status Variables
- Troubleshooting
Happy Hare includes an MMU Environment Manager that can control one heater (shared enclosure) or multiple heaters (one per gate) and provides a managed filament drying cycle. Drying can terminate on time or (if the sensor supports it) humidity. During drying the manager can optionally call a venting macro and, if an eSpooler is fitted, periodically rotate spools.
Two setups are supported:
-
Single-heater / shared enclosure
A single heater warms a shared chamber; a single environment sensor provides temperature (and optionally humidity). -
Per-gate heaters (e.g. EMU design)
Each gate has its own heater and environment sensor. A basic “power management” queue limits the number of simultaneously active heaters.
Configure a heater and an environment sensor:
# Example names only - use your actual configured objects
filament_heater: heater_generic mmu_heater
environment_sensor: temperature_sensor mmu_environmentConfigure a list of heaters and sensors, one per gate, plus a concurrency limit:
# One entry per gate. Empty entries may be left blank if a gate has no heater/sensor.
filament_heaters: heater_generic mmu_heater_0, heater_generic mmu_heater_1, heater_generic mmu_heater_2, heater_generic mmu_heater_3
environment_sensors: temperature_sensor env_0, temperature_sensor env_1, temperature_sensor env_2, temperature_sensor env_3
# Limit the number of simultaneously active heaters (power/PSU protection)
max_concurrent_heaters: 2Note
- Per-gate mode requires both
filament_heatersandenvironment_sensorsto be present. If either list is missing, the manager uses single-heater mode.
The manager uses the following parameters. Defaults are generally good starting points.
# Filament dryer defaults ----------------------------------------------------------------------------------------------
heater_default_dry_temp: 45 # °C default drying temperature
heater_default_dry_time: 300 # minutes default drying time
heater_default_humidity: 10 # %RH stop early if humidity <= this target (if sensor supports humidity)
# Optional venting macro ------------------------------------------------------------------------------------------------
heater_vent_macro: # macro name / gcode to run periodically during drying (blank disables)
heater_vent_interval: 0 # minutes. 0 disables venting
# Optional spool rotation (eSpooler) ------------------------------------------------------------------------------------
heater_rotate_interval: 5 # minutes between rotation attempts (min 1)Tip
- Most of these parameters are safe to tune without changing wiring/hardware.
- Venting and rotation are only active during a drying cycle.
The drying_data table defines recommended temperature and time per material. Keys are treated case-insensitively (internally normalized to uppercase).
drying_data: "{'PLA': (45, 240), 'PETG': (55, 300), 'NYLON': (65, 480)}"- Values are
(temperature_C, time_minutes) - Missing materials fall back to
heater_default_dry_tempandheater_default_dry_time
To print the configured table at runtime:
MMU_HEATER DRYING_DATA=1The MMU_HEATER command controls heater(s) and manages drying cycles.
MMU_HEATER [HELP=1]
[DRYING_DATA=1]
[STOP=1]
[DRY=1]
[TEMP=<degreesC>]
[TIMER=<minutes>]
[HUMIDITY=<percent>]
[GATES=x,y]
[VENT_INTERVAL=<minutes>]
[ROTATE=0|1]-
STOP – Stop drying and turn off heater(s). In per-gate mode,
GATES=cancels only those gates. - DRY – Start a drying cycle.
- TEMP – Override temperature for a cycle, or set raw heater temperature (no managed cycle).
- TIMER – Override drying time.
- HUMIDITY – End the drying cycle early once humidity <= target (if sensor supports humidity).
-
GATES – In per-gate mode selects which gates to control or dry. Required for
ROTATE=1. - VENT_INTERVAL – Override the configured vent interval for this drying cycle.
- ROTATE – Enable periodic eSpooler rotation during drying (if eSpooler is fitted).
Calling MMU_HEATER with no parameters prints a status report (drying state, temps/humidity, per-gate state in per-gate mode, venting/rotation state when applicable).
Single-heater mode is used when filament_heater + environment_sensor are configured (and per-gate lists are not).
MMU_HEATER DRY=1- If
TEMPis not specified, the manager selects a recommended temperature/time fromdrying_databased on current gate materials. - Recommended behavior is typically: lowest safe temp across selected materials, and longest time across selected materials.
Override defaults:
MMU_HEATER DRY=1 TEMP=50 TIMER=240 HUMIDITY=12MMU_HEATER STOP=1If the configured environment sensor supports humidity, drying can end early once humidity <= HUMIDITY.
Per-gate mode is used when both filament_heaters and environment_sensors lists are configured.
MMU_HEATER DRY=1 GATES=0,2,3- Each gate uses its own recommended temperature/time from
drying_dataunless overridden. - If
TEMPis specified, it overrides temperatures for all selected gates. - Each gate monitors humidity from its own environment sensor (if available).
If GATES is not supplied, the manager defaults to all non-empty gates.
Note
- When using
ROTATE=1, you must explicitly supplyGATES=.
If max_concurrent_heaters is less than the number of gates being dried, the manager:
- Starts drying on up to
max_concurrent_heatersgates - Queues remaining gates
- Starts the next queued gate when an active gate completes
This means the total wall-clock time may be longer than a single-gate timer.
To cancel only specific gates during an active per-gate cycle:
MMU_HEATER STOP=1 GATES=1,3- Active gates: heater turned off immediately and marked done
- Queued gates: removed from queue and marked done
If all selected gates are completed/cancelled, the overall cycle ends automatically.
To directly set per-gate heater targets (not a managed drying cycle):
MMU_HEATER TEMP=45 GATES=0,1Behavior when a managed cycle is running:
- If a gate is queued, only the target is updated; the heater is not turned on until the gate becomes active.
- If a gate is active, the heater is updated immediately.
- If a gate is not part of the current cycle, it is set immediately.
Venting is optional and runs only during a drying cycle.
Enable by setting:
heater_vent_macroheater_vent_interval > 0
Or override for a single run:
MMU_HEATER DRY=1 VENT_INTERVAL=10Behavior:
- Single-heater mode: macro runs with no args
- Per-gate mode: macro runs with
GATES=<currently active gates>
The manager can optionally rotate spools during drying if an eSpooler is fitted and the cycle is started with ROTATE=1.
MMU_HEATER DRY=1 ROTATE=1 GATES=1,3Rules:
-
GATES=must be explicitly provided whenROTATE=1 - On start, the manager warns if any specified gates are not EMPTY (drying still proceeds)
- Every
heater_rotate_intervalminutes, the manager:- re-checks the current gate status
- rotates only gates that are EMPTY at that moment (supports dynamic transitions to EMPTY)
Important
Filament must be removed from the MMU inlet and fastened to the spool. Rotation is only safe when the gate is EMPTY.
The manager exports structured status values for UI/clients:
-
drying_cycle– boolean: in drying cycle or not -
drying_per_gate– boolean: true if per-gate heaters are configured -
drying_active_gates– list[int]: gates currently active (heaters on) -
drying_pending_gates– list[int]: gates queued -
drying_completed_gates– list[int]: completed/cancelled gates
- The environment sensor may not support humidity, or humidity chip object may not be present.
- Drying will still run using time, but humidity early-termination will not occur.
-
heater_vent_macrois blank, orheater_vent_intervalis0. - If venting is enabled, check logs for macro errors.
- Gates may be queued due to
max_concurrent_heaters. - Total time = sum of per-gate timers when fully serialized by the queue.
- eSpooler not fitted (
has_espooler()false), or -
ROTATE=1not used, or - gates were not EMPTY at rotation tick (rotation only applies to EMPTY gates).
(\_/)
( *,*)
(")_(") Happy Hare ReadyCopyright (C) 2022-2026 Paul Morgan
1. Introduction
2. Installation
3. Essential Configuration
5. Operation
-- YOUR MMU IS READY TO PLAY WITH --
6. Slicer-MMU Setup
-- NOW YOU ARE READY TO PRINT! --
7. Tuning
8. Optional Feature Setup
9. Advanced Configuration
10. Advanced Concepts
- State Persistence
- Statistics and Counters
- Tool and Gate Maps
- Filament Bypass
- Runout/Clog Detection
- Consumption Counters
- Synchronized Gear/Extruder
11. Quick References
12. Troubleshooting
13. FAQ
14. MCU Board Reference 🆕
15. Change Log
Happy Hare Discord
Hardware Config
Power Management Queue