Opentrons Heater-Shaker Module - temperature control (37-95°C) with orbital mixing (200-3000 rpm) for cell culture, enzymatic reactions, and sample preparation requiring simultaneous heating and agitation
Install
npx skillscat add jkitchin/skillz/opentrons-heater-shaker Install via the SkillsCat registry.
We need to produce a 2-3 sentence plain-text summary, objective, factual, no marketing language, no superlatives, no calls to action. Must be at most 60 words. Provide only the summary text. We need to summarize the skill: Opentrons Heater-Shaker Module skill provides temperature control (37-95°C) and orbital shaking (200-3000 rpm) for protocols requiring simultaneous heating and mixing, such as cell culture, enzymatic reactions, sample prep. It solves the need to manually transfer samples between incubator and shaker, enabling automated temperature-sensitive mixing on deck.
Opentrons Heater-Shaker Module
Overview
The Heater-Shaker Module combines precise temperature control (37-95°C) with orbital shaking (200-3000 rpm) for automated protocols requiring simultaneous heating and mixing. Ideal for cell culture incubation, enzymatic reactions, bacterial transformations, and any workflow needing temperature-controlled agitation.
Core value: Automate temperature-sensitive mixing protocols with reproducible timing and conditions. Replace manual incubator transfers with on-deck temperature control.
When to Use
Use the Heater-Shaker skill when:
- Performing enzymatic reactions requiring temperature control and mixing
- Incubating cell cultures or bacterial transformations
- Conducting ELISA washing steps with temperature control
- Running temperature-sensitive binding or hybridization reactions
- Protocols requiring precise timing of heating + mixing cycles
- Resuspending beads or particles with controlled agitation
Don't use when:
- Only temperature control needed (use Temperature Module instead)
- Only mixing needed (consider manual shaking or alternative approaches)
- Temperature outside 37-95°C range (or <1.5°C above ambient)
Quick Reference
| Operation | Method | Key Parameters |
|---|---|---|
| Load module | protocol.load_module() |
"heaterShakerModuleV1", location |
| Set temperature (blocking) | set_and_wait_for_temperature() |
celsius (37-95) |
| Set temperature (non-blocking) | set_target_temperature() |
celsius |
| Wait for temperature | wait_for_temperature() |
- |
| Start shaking (blocking) | set_and_wait_for_shake_speed() |
rpm (200-3000) |
| Stop shaking | deactivate_shaker() |
- |
| Stop heating | deactivate_heater() |
- |
| Open latch | open_labware_latch() |
- |
| Close latch | close_labware_latch() |
- |
| Check status | .current_temperature, .current_speed |
- |
Platform Compatibility
Opentrons Flex
- Allowed slots: Column 1 or Column 3 (A1, B1, C1, D1, A3, B3, C3, D3)
- No adjacent restrictions - Full deck flexibility
OT-2
- Allowed slots: 1, 3, 4, 6, 7, or 10
- Adjacent slot restrictions:
- Keep adjacent slots clear or use only low-profile labware (<53mm height)
- 8-channel pipettes cannot pipette in adjacent slots (tip racks OK if front/back)
Loading the Module
Basic Loading
from opentrons import protocol_api
metadata = {'apiLevel': '2.19'}
def run(protocol: protocol_api.ProtocolContext):
# Load Heater-Shaker in deck slot
hs_mod = protocol.load_module("heaterShakerModuleV1", location="D1") # Flex
# hs_mod = protocol.load_module("heaterShakerModuleV1", location="1") # OT-2Loading Labware with Adapters
Two-step approach (recommended):
# Load adapter first, then labware
hs_adapter = hs_mod.load_adapter("opentrons_96_flat_bottom_adapter")
hs_plate = hs_adapter.load_labware("nest_96_wellplate_200ul_flat")Available adapters:
opentrons_96_flat_bottom_adapter- Universal flat-bottom platesopentrons_96_pcr_adapter- PCR plates and stripsopentrons_96_deep_well_adapter- Deep-well platesopentrons_universal_flat_adapter- Custom flat-bottom labware
Pre-configured combinations (legacy):
# Load labware directly (adapter implicit)
hs_plate = hs_mod.load_labware("nest_96_wellplate_200ul_flat")Latch Control
The labware latch MUST be closed for shaking operations.
# Close latch before shaking
hs_mod.close_labware_latch()
# Open latch for pipetting or gripper access
hs_mod.open_labware_latch()Important:
- Pipetting is possible with latch open or closed
- Shaking requires latch closed (method will error if open)
- Gripper access requires latch open
- Always open latch before gripper operations
Temperature Control
Blocking Temperature Control
Protocol waits until temperature is reached before continuing:
# Set temperature and wait
hs_mod.set_and_wait_for_temperature(celsius=37)
# Perform operations at target temperature
protocol.delay(minutes=10)
# Turn off heater
hs_mod.deactivate_heater()Temperature range:
- Minimum: 37°C or 1.5°C above ambient temperature (whichever is lower)
- Maximum: 95°C
- Resolution: 1°C
Non-Blocking Temperature Control
Set target temperature and continue with other operations while heating:
# Start heating (non-blocking)
hs_mod.set_target_temperature(celsius=75)
# Perform pipetting while heating
pipette.transfer(100, source, hs_plate.columns()[0])
# Wait for temperature before critical step
hs_mod.wait_for_temperature()
# Now at target temperature
protocol.delay(minutes=5)Use case: Parallel pipetting during heating to save time.
Checking Temperature Status
# Get current temperature
current_temp = hs_mod.current_temperature
# Log temperature
protocol.comment(f"Heater-Shaker at {current_temp}°C")Shaking Control
Basic Shaking
# Close latch first (required)
hs_mod.close_labware_latch()
# Start shaking and wait to reach speed
hs_mod.set_and_wait_for_shake_speed(rpm=500)
# Shake for specific duration
protocol.delay(minutes=5)
# Stop shaking
hs_mod.deactivate_shaker()
# Open latch for pipetting access
hs_mod.open_labware_latch()Speed range:
- Minimum: 200 rpm
- Maximum: 3000 rpm
Checking Shake Speed
# Get current speed
current_speed = hs_mod.current_speed
if current_speed > 0:
protocol.comment(f"Shaking at {current_speed} rpm")Shake Speed Guidelines
Recommended speeds by application:
- Gentle mixing: 200-500 rpm
- Cell culture: 300-600 rpm
- Enzymatic reactions: 400-800 rpm
- Vigorous mixing: 800-1500 rpm
- Aggressive agitation: 1500-3000 rpm
Note: Higher speeds increase risk of splashing and cross-contamination.
Combined Heating and Shaking
Sequential Approach
# Set temperature first
hs_mod.set_and_wait_for_temperature(celsius=37)
# Then start shaking
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
# Incubate with heating and shaking
protocol.delay(minutes=30)
# Stop shaking, then heating
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()Parallel Approach (Time-Optimized)
# Start heating (non-blocking)
hs_mod.set_target_temperature(celsius=42)
# Prepare samples while heating
pipette.transfer(100, samples, hs_plate.wells())
# Wait for temperature
hs_mod.wait_for_temperature()
# Start shaking
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=600)
# Incubate
protocol.delay(minutes=20)
# Cleanup
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()Common Patterns
Bacterial Transformation
# Heat shock protocol
hs_mod.set_and_wait_for_temperature(celsius=4)
protocol.delay(minutes=20) # Ice incubation
# Heat shock
hs_mod.set_and_wait_for_temperature(celsius=42)
protocol.delay(seconds=45)
# Recovery
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=300)
protocol.delay(minutes=60)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()Enzymatic Reaction
# Pre-warm to reaction temperature
hs_mod.set_and_wait_for_temperature(celsius=37)
# Add enzyme while at temperature
hs_mod.open_labware_latch()
pipette.transfer(10, enzyme, hs_plate.wells(), mix_after=(3, 50))
# Incubate with gentle mixing
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=300)
protocol.delay(minutes=30)
# Stop reaction by cooling
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.set_and_wait_for_temperature(celsius=4)
hs_mod.deactivate_heater()ELISA Wash with Incubation
# Incubate with antibody
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
protocol.delay(minutes=60)
# Stop for washing
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
# Wash steps
for _ in range(3):
# Remove liquid
pipette.transfer(200, hs_plate.wells(), waste, new_tip="always")
# Add wash buffer
pipette.transfer(200, wash_buffer, hs_plate.wells())
# Mix
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=500)
protocol.delay(seconds=30)
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
hs_mod.deactivate_heater()Bead Resuspension
# Resuspend magnetic beads
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=1200)
protocol.delay(minutes=2)
hs_mod.deactivate_shaker()
hs_mod.open_labware_latch()
# Transfer to magnetic module for separation
protocol.move_labware(hs_plate, mag_block, use_gripper=True)Advanced Techniques
Temperature Ramping
# Gradual temperature increase
for temp in [25, 35, 45, 55, 65]:
hs_mod.set_and_wait_for_temperature(temp)
protocol.delay(minutes=5)
hs_mod.deactivate_heater()Precise Timing with Manual Tracking
For holds requiring exact elapsed time:
import time
# Set conditions
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=500)
# Track elapsed time
start_time = time.monotonic()
# Perform operations
# ... your protocol steps ...
# Calculate remaining time
elapsed = time.monotonic() - start_time
remaining = max(0, (10 * 60) - elapsed) # 10 minutes total
# Complete the hold
protocol.delay(seconds=remaining)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()Integration with Gripper (Flex)
# Heat/shake on Heater-Shaker
hs_mod.set_and_wait_for_temperature(celsius=37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(rpm=400)
protocol.delay(minutes=30)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
# Open latch BEFORE gripper operation
hs_mod.open_labware_latch()
# Move plate to next module
protocol.move_labware(hs_plate, magnetic_block, use_gripper=True)OT-2 Specific Considerations
Deck Layout Restrictions
Height restrictions:
- Adjacent slots must be empty OR contain labware <53mm tall
- Tall labware (>53mm) in adjacent slots interferes with module
8-channel pipette restrictions:
- Cannot pipette in slots adjacent to Heater-Shaker
- Exception: Tip racks allowed if oriented front-to-back (not left-to-right)
Example valid OT-2 layout:
# Heater-Shaker in slot 4
hs_mod = protocol.load_module("heaterShakerModuleV1", "4")
# Adjacent slots 1, 5, 7 - keep empty or use tip racks
tips_1 = protocol.load_labware("opentrons_96_tiprack_300ul", "1") # OK
tips_5 = protocol.load_labware("opentrons_96_tiprack_300ul", "5") # OK
# Use non-adjacent slots for plates
plate_2 = protocol.load_labware("corning_96_wellplate_360ul_flat", "2")
plate_3 = protocol.load_labware("corning_96_wellplate_360ul_flat", "3")Best Practices
- Always open latch before gripper operations - Prevents gripper errors
- Deactivate shaker before heater - Safer shutdown sequence
- Use non-blocking temperature for parallel operations - Saves protocol time
- Close latch before shaking - Required for operation
- Allow temperature stabilization - Add brief delay after reaching target
- Monitor shake speed selection - Higher speeds risk splashing/contamination
- Consider ambient temperature - Affects minimum achievable temperature
- Plan deck layout (OT-2) - Account for adjacent slot restrictions
- Add protocol comments - Document temperature/shake conditions for reproducibility
- Deactivate at protocol end - Prevents equipment running indefinitely
Common Mistakes
❌ Shaking with open latch:
hs_mod.open_labware_latch()
hs_mod.set_and_wait_for_shake_speed(500) # Error: latch must be closed✅ Correct:
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(500)❌ Gripper movement without opening latch:
protocol.move_labware(hs_plate, "C1", use_gripper=True) # Error: latch closed✅ Correct:
hs_mod.open_labware_latch()
protocol.move_labware(hs_plate, "C1", use_gripper=True)❌ Not deactivating modules:
hs_mod.set_and_wait_for_temperature(37)
# Protocol ends - heater stays on!✅ Correct:
hs_mod.set_and_wait_for_temperature(37)
# ... operations ...
hs_mod.deactivate_heater()❌ Temperature out of range:
hs_mod.set_and_wait_for_temperature(celsius=25) # May error if ambient is >23.5°C✅ Correct:
# Use Temperature Module for temperatures <37°C
temp_mod.set_temperature(celsius=25)Troubleshooting
Module won't heat below 37°C:
- Check ambient temperature - minimum is 1.5°C above ambient
- Consider using Temperature Module for lower temperatures
Shaking command errors:
- Verify latch is closed
- Check shake speed is within 200-3000 rpm range
Pipette collisions (OT-2):
- Check adjacent slots for tall labware
- Move tall labware to non-adjacent slots
- Use only tip racks in adjacent slots for 8-channel pipetting
Temperature not stable:
- Allow additional time for equilibration
- Verify module is not in high-airflow environment
- Check labware is properly seated on adapter
Gripper cannot access:
- Ensure latch is open
- Verify module is in allowed deck slot (columns 1 or 3 for Flex)
Integration with Other Modules
With Magnetic Block (Flex)
# Incubate with beads on Heater-Shaker
hs_mod.set_and_wait_for_temperature(37)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(400)
protocol.delay(minutes=10)
hs_mod.deactivate_shaker()
hs_mod.deactivate_heater()
hs_mod.open_labware_latch()
# Move to Magnetic Block for separation
protocol.move_labware(hs_plate, mag_block, use_gripper=True)
protocol.delay(minutes=3) # Bead separation
# Pipette supernatant
pipette.transfer(150, hs_plate.wells(), waste.wells())
# Return to Heater-Shaker for resuspension
protocol.move_labware(hs_plate, hs_mod, use_gripper=True)With Temperature Module
# Cool samples on Temperature Module
temp_mod.set_temperature(4)
protocol.move_labware(cold_plate, temp_mod, use_gripper=True)
# Heat and shake on Heater-Shaker
hs_mod.set_and_wait_for_temperature(65)
hs_mod.close_labware_latch()
hs_mod.set_and_wait_for_shake_speed(600)
protocol.delay(minutes=15)API Version Requirements
- Minimum API version: 2.13
- Recommended: 2.19 or later for full feature support
- Flex compatibility: API 2.15+ with
robotType: "Flex"
Additional Resources
- Module Documentation: https://docs.opentrons.com/v2/modules/heater_shaker.html
- Opentrons Support: https://support.opentrons.com/
- Protocol Examples: https://protocols.opentrons.com/
Related Skills
opentrons- Main Opentrons Python API skillopentrons-temperature-module- Temperature-only control (4-95°C)opentrons-thermocycler- PCR thermal cyclingopentrons-magnetic-block- Magnetic bead separation (Flex)opentrons-gripper- Automated labware movement (Flex)