opentrons 8.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

Files changed (601) hide show
  1. opentrons/__init__.py +150 -0
  2. opentrons/_version.py +34 -0
  3. opentrons/calibration_storage/__init__.py +54 -0
  4. opentrons/calibration_storage/deck_configuration.py +62 -0
  5. opentrons/calibration_storage/encoder_decoder.py +31 -0
  6. opentrons/calibration_storage/file_operators.py +142 -0
  7. opentrons/calibration_storage/helpers.py +103 -0
  8. opentrons/calibration_storage/ot2/__init__.py +34 -0
  9. opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
  10. opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
  11. opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  12. opentrons/calibration_storage/ot2/models/v1.py +149 -0
  13. opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
  14. opentrons/calibration_storage/ot2/tip_length.py +281 -0
  15. opentrons/calibration_storage/ot3/__init__.py +31 -0
  16. opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
  17. opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
  18. opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  19. opentrons/calibration_storage/ot3/models/v1.py +122 -0
  20. opentrons/calibration_storage/ot3/module_offset.py +138 -0
  21. opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
  22. opentrons/calibration_storage/types.py +45 -0
  23. opentrons/cli/__init__.py +21 -0
  24. opentrons/cli/__main__.py +5 -0
  25. opentrons/cli/analyze.py +557 -0
  26. opentrons/config/__init__.py +631 -0
  27. opentrons/config/advanced_settings.py +871 -0
  28. opentrons/config/defaults_ot2.py +214 -0
  29. opentrons/config/defaults_ot3.py +499 -0
  30. opentrons/config/feature_flags.py +86 -0
  31. opentrons/config/gripper_config.py +55 -0
  32. opentrons/config/reset.py +203 -0
  33. opentrons/config/robot_configs.py +187 -0
  34. opentrons/config/types.py +183 -0
  35. opentrons/drivers/__init__.py +0 -0
  36. opentrons/drivers/absorbance_reader/__init__.py +11 -0
  37. opentrons/drivers/absorbance_reader/abstract.py +72 -0
  38. opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
  39. opentrons/drivers/absorbance_reader/driver.py +81 -0
  40. opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
  41. opentrons/drivers/absorbance_reader/simulator.py +84 -0
  42. opentrons/drivers/asyncio/__init__.py +0 -0
  43. opentrons/drivers/asyncio/communication/__init__.py +22 -0
  44. opentrons/drivers/asyncio/communication/async_serial.py +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
  47. opentrons/drivers/command_builder.py +102 -0
  48. opentrons/drivers/flex_stacker/__init__.py +13 -0
  49. opentrons/drivers/flex_stacker/abstract.py +214 -0
  50. opentrons/drivers/flex_stacker/driver.py +768 -0
  51. opentrons/drivers/flex_stacker/errors.py +68 -0
  52. opentrons/drivers/flex_stacker/simulator.py +309 -0
  53. opentrons/drivers/flex_stacker/types.py +367 -0
  54. opentrons/drivers/flex_stacker/utils.py +19 -0
  55. opentrons/drivers/heater_shaker/__init__.py +5 -0
  56. opentrons/drivers/heater_shaker/abstract.py +76 -0
  57. opentrons/drivers/heater_shaker/driver.py +204 -0
  58. opentrons/drivers/heater_shaker/simulator.py +94 -0
  59. opentrons/drivers/mag_deck/__init__.py +6 -0
  60. opentrons/drivers/mag_deck/abstract.py +44 -0
  61. opentrons/drivers/mag_deck/driver.py +208 -0
  62. opentrons/drivers/mag_deck/simulator.py +63 -0
  63. opentrons/drivers/rpi_drivers/__init__.py +33 -0
  64. opentrons/drivers/rpi_drivers/dev_types.py +94 -0
  65. opentrons/drivers/rpi_drivers/gpio.py +282 -0
  66. opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
  67. opentrons/drivers/rpi_drivers/interfaces.py +15 -0
  68. opentrons/drivers/rpi_drivers/types.py +364 -0
  69. opentrons/drivers/rpi_drivers/usb.py +102 -0
  70. opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
  71. opentrons/drivers/serial_communication.py +151 -0
  72. opentrons/drivers/smoothie_drivers/__init__.py +4 -0
  73. opentrons/drivers/smoothie_drivers/connection.py +51 -0
  74. opentrons/drivers/smoothie_drivers/constants.py +121 -0
  75. opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
  76. opentrons/drivers/smoothie_drivers/errors.py +49 -0
  77. opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
  78. opentrons/drivers/smoothie_drivers/simulator.py +99 -0
  79. opentrons/drivers/smoothie_drivers/types.py +16 -0
  80. opentrons/drivers/temp_deck/__init__.py +10 -0
  81. opentrons/drivers/temp_deck/abstract.py +54 -0
  82. opentrons/drivers/temp_deck/driver.py +197 -0
  83. opentrons/drivers/temp_deck/simulator.py +57 -0
  84. opentrons/drivers/thermocycler/__init__.py +12 -0
  85. opentrons/drivers/thermocycler/abstract.py +99 -0
  86. opentrons/drivers/thermocycler/driver.py +395 -0
  87. opentrons/drivers/thermocycler/simulator.py +126 -0
  88. opentrons/drivers/types.py +107 -0
  89. opentrons/drivers/utils.py +222 -0
  90. opentrons/execute.py +742 -0
  91. opentrons/hardware_control/__init__.py +65 -0
  92. opentrons/hardware_control/__main__.py +77 -0
  93. opentrons/hardware_control/adapters.py +98 -0
  94. opentrons/hardware_control/api.py +1347 -0
  95. opentrons/hardware_control/backends/__init__.py +7 -0
  96. opentrons/hardware_control/backends/controller.py +400 -0
  97. opentrons/hardware_control/backends/errors.py +9 -0
  98. opentrons/hardware_control/backends/estop_state.py +164 -0
  99. opentrons/hardware_control/backends/flex_protocol.py +497 -0
  100. opentrons/hardware_control/backends/ot3controller.py +1930 -0
  101. opentrons/hardware_control/backends/ot3simulator.py +900 -0
  102. opentrons/hardware_control/backends/ot3utils.py +664 -0
  103. opentrons/hardware_control/backends/simulator.py +442 -0
  104. opentrons/hardware_control/backends/status_bar_state.py +240 -0
  105. opentrons/hardware_control/backends/subsystem_manager.py +431 -0
  106. opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
  107. opentrons/hardware_control/backends/types.py +14 -0
  108. opentrons/hardware_control/constants.py +6 -0
  109. opentrons/hardware_control/dev_types.py +125 -0
  110. opentrons/hardware_control/emulation/__init__.py +0 -0
  111. opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
  112. opentrons/hardware_control/emulation/app.py +56 -0
  113. opentrons/hardware_control/emulation/connection_handler.py +38 -0
  114. opentrons/hardware_control/emulation/heater_shaker.py +150 -0
  115. opentrons/hardware_control/emulation/magdeck.py +60 -0
  116. opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
  117. opentrons/hardware_control/emulation/module_server/client.py +78 -0
  118. opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
  119. opentrons/hardware_control/emulation/module_server/models.py +31 -0
  120. opentrons/hardware_control/emulation/module_server/server.py +110 -0
  121. opentrons/hardware_control/emulation/parser.py +74 -0
  122. opentrons/hardware_control/emulation/proxy.py +241 -0
  123. opentrons/hardware_control/emulation/run_emulator.py +68 -0
  124. opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  125. opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
  126. opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
  127. opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
  128. opentrons/hardware_control/emulation/settings.py +119 -0
  129. opentrons/hardware_control/emulation/simulations.py +133 -0
  130. opentrons/hardware_control/emulation/smoothie.py +192 -0
  131. opentrons/hardware_control/emulation/tempdeck.py +69 -0
  132. opentrons/hardware_control/emulation/thermocycler.py +128 -0
  133. opentrons/hardware_control/emulation/types.py +10 -0
  134. opentrons/hardware_control/emulation/util.py +38 -0
  135. opentrons/hardware_control/errors.py +43 -0
  136. opentrons/hardware_control/execution_manager.py +164 -0
  137. opentrons/hardware_control/instruments/__init__.py +5 -0
  138. opentrons/hardware_control/instruments/instrument_abc.py +39 -0
  139. opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  140. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
  141. opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
  142. opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
  143. opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  144. opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
  145. opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
  146. opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
  147. opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
  148. opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
  149. opentrons/hardware_control/module_control.py +332 -0
  150. opentrons/hardware_control/modules/__init__.py +69 -0
  151. opentrons/hardware_control/modules/absorbance_reader.py +373 -0
  152. opentrons/hardware_control/modules/errors.py +7 -0
  153. opentrons/hardware_control/modules/flex_stacker.py +948 -0
  154. opentrons/hardware_control/modules/heater_shaker.py +426 -0
  155. opentrons/hardware_control/modules/lid_temp_status.py +35 -0
  156. opentrons/hardware_control/modules/magdeck.py +233 -0
  157. opentrons/hardware_control/modules/mod_abc.py +245 -0
  158. opentrons/hardware_control/modules/module_calibration.py +93 -0
  159. opentrons/hardware_control/modules/plate_temp_status.py +61 -0
  160. opentrons/hardware_control/modules/tempdeck.py +299 -0
  161. opentrons/hardware_control/modules/thermocycler.py +731 -0
  162. opentrons/hardware_control/modules/types.py +417 -0
  163. opentrons/hardware_control/modules/update.py +255 -0
  164. opentrons/hardware_control/modules/utils.py +73 -0
  165. opentrons/hardware_control/motion_utilities.py +318 -0
  166. opentrons/hardware_control/nozzle_manager.py +422 -0
  167. opentrons/hardware_control/ot3_calibration.py +1171 -0
  168. opentrons/hardware_control/ot3api.py +3227 -0
  169. opentrons/hardware_control/pause_manager.py +31 -0
  170. opentrons/hardware_control/poller.py +112 -0
  171. opentrons/hardware_control/protocols/__init__.py +106 -0
  172. opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
  173. opentrons/hardware_control/protocols/calibratable.py +45 -0
  174. opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
  175. opentrons/hardware_control/protocols/configurable.py +48 -0
  176. opentrons/hardware_control/protocols/event_sourcer.py +18 -0
  177. opentrons/hardware_control/protocols/execution_controllable.py +33 -0
  178. opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
  179. opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
  180. opentrons/hardware_control/protocols/gripper_controller.py +55 -0
  181. opentrons/hardware_control/protocols/hardware_manager.py +51 -0
  182. opentrons/hardware_control/protocols/identifiable.py +16 -0
  183. opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
  184. opentrons/hardware_control/protocols/liquid_handler.py +266 -0
  185. opentrons/hardware_control/protocols/module_provider.py +16 -0
  186. opentrons/hardware_control/protocols/motion_controller.py +243 -0
  187. opentrons/hardware_control/protocols/position_estimator.py +45 -0
  188. opentrons/hardware_control/protocols/simulatable.py +10 -0
  189. opentrons/hardware_control/protocols/stoppable.py +9 -0
  190. opentrons/hardware_control/protocols/types.py +27 -0
  191. opentrons/hardware_control/robot_calibration.py +224 -0
  192. opentrons/hardware_control/scripts/README.md +28 -0
  193. opentrons/hardware_control/scripts/__init__.py +1 -0
  194. opentrons/hardware_control/scripts/gripper_control.py +208 -0
  195. opentrons/hardware_control/scripts/ot3gripper +7 -0
  196. opentrons/hardware_control/scripts/ot3repl +7 -0
  197. opentrons/hardware_control/scripts/repl.py +187 -0
  198. opentrons/hardware_control/scripts/tc_control.py +97 -0
  199. opentrons/hardware_control/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,339 @@
1
+ """Command models to retrieve a labware from a Flex Stacker."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Literal, TYPE_CHECKING, Any, Union
5
+ from typing_extensions import Type
6
+
7
+ from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
9
+
10
+ from opentrons_shared_data.errors.exceptions import (
11
+ FlexStackerStallError,
12
+ FlexStackerShuttleMissingError,
13
+ FlexStackerHopperLabwareError,
14
+ FlexStackerShuttleLabwareError,
15
+ FlexStackerShuttleNotEmptyError,
16
+ )
17
+
18
+ from ..command import (
19
+ AbstractCommandImpl,
20
+ BaseCommand,
21
+ BaseCommandCreate,
22
+ SuccessData,
23
+ DefinedErrorData,
24
+ )
25
+ from ...errors import (
26
+ ErrorOccurrence,
27
+ CannotPerformModuleAction,
28
+ LocationIsOccupiedError,
29
+ FlexStackerLabwarePoolNotYetDefinedError,
30
+ )
31
+ from ...resources import ModelUtils
32
+ from ...state import update_types
33
+ from ...types import (
34
+ ModuleLocation,
35
+ LabwareLocationSequence,
36
+ InStackerHopperLocation,
37
+ )
38
+ from .common import (
39
+ labware_locations_for_group,
40
+ build_retrieve_labware_move_updates,
41
+ FlexStackerStallOrCollisionError,
42
+ FlexStackerShuttleError,
43
+ FlexStackerHopperError,
44
+ FlexStackerLabwareRetrieveError,
45
+ FlexStackerShuttleOccupiedError,
46
+ primary_location_sequence,
47
+ adapter_location_sequence,
48
+ lid_location_sequence,
49
+ )
50
+
51
+ if TYPE_CHECKING:
52
+ from opentrons.protocol_engine.state.state import StateView
53
+ from opentrons.protocol_engine.execution import EquipmentHandler
54
+
55
+ RetrieveCommandType = Literal["flexStacker/retrieve"]
56
+
57
+ RecoverableExceptions = Union[
58
+ FlexStackerStallError,
59
+ FlexStackerShuttleMissingError,
60
+ FlexStackerHopperLabwareError,
61
+ FlexStackerShuttleLabwareError,
62
+ FlexStackerShuttleNotEmptyError,
63
+ ]
64
+
65
+
66
+ def _remove_default(s: dict[str, Any]) -> None:
67
+ s.pop("default", None)
68
+
69
+
70
+ class RetrieveParams(BaseModel):
71
+ """Input parameters for a labware retrieval command."""
72
+
73
+ moduleId: str = Field(
74
+ ...,
75
+ description="Unique ID of the Flex Stacker.",
76
+ )
77
+ labwareId: str | SkipJsonSchema[None] = Field(
78
+ None,
79
+ description="Do not use. Present for internal backward compatibility.",
80
+ json_schema_extra=_remove_default,
81
+ )
82
+ displayName: str | SkipJsonSchema[None] = Field(
83
+ None,
84
+ description="Do not use. Present for internal backward compatibility.",
85
+ json_schema_extra=_remove_default,
86
+ )
87
+ adapterId: str | SkipJsonSchema[None] = Field(
88
+ None,
89
+ description="Do not use. Present for internal backward compatibility.",
90
+ json_schema_extra=_remove_default,
91
+ )
92
+ lidId: str | SkipJsonSchema[None] = Field(
93
+ None,
94
+ description="Do not use. Present for internal backward compatibility.",
95
+ json_schema_extra=_remove_default,
96
+ )
97
+
98
+
99
+ class RetrieveResult(BaseModel):
100
+ """Result data from a labware retrieval command."""
101
+
102
+ labwareId: str = Field(
103
+ ...,
104
+ description="The labware ID of the primary retrieved labware.",
105
+ )
106
+ adapterId: str | SkipJsonSchema[None] = Field(
107
+ None,
108
+ description="The optional Adapter Labware ID of the adapter under a primary labware.",
109
+ )
110
+ lidId: str | SkipJsonSchema[None] = Field(
111
+ None,
112
+ description="The optional Lid Labware ID of the lid on a primary labware.",
113
+ )
114
+ primaryLocationSequence: LabwareLocationSequence = Field(
115
+ ..., description="The new location of the just-retrieved."
116
+ )
117
+ lidLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
118
+ None,
119
+ description="The new location of the just-retrieved adapter labware under a primary labware.",
120
+ )
121
+ adapterLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
122
+ None,
123
+ description="The new location of the just-retrieved lid labware on a primary labware.",
124
+ )
125
+ originalPrimaryLocationSequence: LabwareLocationSequence = Field(
126
+ ..., description="The original location of the just-retrieved primary labware"
127
+ )
128
+ originalAdapterLocationSequence: LabwareLocationSequence | SkipJsonSchema[
129
+ None
130
+ ] = Field(None, description="The original location of an adapter labware if any")
131
+ originalLidLocationSequence: LabwareLocationSequence | SkipJsonSchema[None] = Field(
132
+ None, description="The original location of a lid labware if any"
133
+ )
134
+ primaryLabwareURI: str = Field(
135
+ ...,
136
+ description="The labware definition URI of the primary labware.",
137
+ )
138
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
139
+ None,
140
+ description="The labware definition URI of the adapter labware.",
141
+ )
142
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
143
+ None,
144
+ description="The labware definition URI of the lid labware.",
145
+ )
146
+
147
+
148
+ _ExecuteReturn = Union[
149
+ SuccessData[RetrieveResult],
150
+ DefinedErrorData[FlexStackerStallOrCollisionError]
151
+ | DefinedErrorData[FlexStackerShuttleError]
152
+ | DefinedErrorData[FlexStackerHopperError]
153
+ | DefinedErrorData[FlexStackerLabwareRetrieveError]
154
+ | DefinedErrorData[FlexStackerShuttleOccupiedError],
155
+ ]
156
+
157
+
158
+ class RetrieveImpl(AbstractCommandImpl[RetrieveParams, _ExecuteReturn]):
159
+ """Implementation of a labware retrieval command."""
160
+
161
+ def __init__(
162
+ self,
163
+ state_view: StateView,
164
+ equipment: EquipmentHandler,
165
+ model_utils: ModelUtils,
166
+ **kwargs: object,
167
+ ) -> None:
168
+ self._state_view = state_view
169
+ self._equipment = equipment
170
+ self._model_utils = model_utils
171
+
172
+ def handle_recoverable_error(
173
+ self,
174
+ error: RecoverableExceptions,
175
+ intended_id: str,
176
+ state_update: update_types.StateUpdate,
177
+ ) -> (
178
+ DefinedErrorData[FlexStackerStallOrCollisionError]
179
+ | DefinedErrorData[FlexStackerShuttleError]
180
+ | DefinedErrorData[FlexStackerHopperError]
181
+ | DefinedErrorData[FlexStackerLabwareRetrieveError]
182
+ | DefinedErrorData[FlexStackerShuttleOccupiedError]
183
+ ):
184
+ """Handle a recoverable error raised during command execution."""
185
+ error_map = {
186
+ FlexStackerStallError: FlexStackerStallOrCollisionError,
187
+ FlexStackerShuttleMissingError: FlexStackerShuttleError,
188
+ FlexStackerHopperLabwareError: FlexStackerHopperError,
189
+ FlexStackerShuttleLabwareError: FlexStackerLabwareRetrieveError,
190
+ FlexStackerShuttleNotEmptyError: FlexStackerShuttleOccupiedError,
191
+ }
192
+ return DefinedErrorData(
193
+ public=error_map[type(error)](
194
+ id=self._model_utils.generate_id(),
195
+ createdAt=self._model_utils.get_timestamp(),
196
+ wrappedErrors=[
197
+ ErrorOccurrence.from_failed(
198
+ id=self._model_utils.generate_id(),
199
+ createdAt=self._model_utils.get_timestamp(),
200
+ error=error,
201
+ )
202
+ ],
203
+ errorInfo={"labwareId": intended_id},
204
+ ),
205
+ state_update_if_false_positive=state_update,
206
+ )
207
+
208
+ async def execute(self, params: RetrieveParams) -> _ExecuteReturn:
209
+ """Execute the labware retrieval command."""
210
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
211
+ params.moduleId
212
+ )
213
+ location = self._state_view.modules.get_location(params.moduleId)
214
+
215
+ if stacker_state.pool_primary_definition is None:
216
+ raise FlexStackerLabwarePoolNotYetDefinedError(
217
+ f"The Flex Stacker in {location} must be configured before labware can be retrieved."
218
+ )
219
+
220
+ if len(stacker_state.contained_labware_bottom_first) == 0:
221
+ raise CannotPerformModuleAction(
222
+ message=f"Cannot retrieve labware from Flex Stacker in {location} because it contains no labware"
223
+ )
224
+
225
+ stacker_loc = ModuleLocation(moduleId=params.moduleId)
226
+
227
+ try:
228
+ self._state_view.labware.raise_if_labware_in_location(stacker_loc)
229
+ except LocationIsOccupiedError:
230
+ raise CannotPerformModuleAction(
231
+ f"Cannot retrieve a labware from Flex Stacker in {location} if the carriage is occupied"
232
+ )
233
+
234
+ to_retrieve = stacker_state.contained_labware_bottom_first[0]
235
+ remaining = stacker_state.contained_labware_bottom_first[1:]
236
+
237
+ locations, offsets = build_retrieve_labware_move_updates(
238
+ to_retrieve, stacker_state, self._state_view
239
+ )
240
+
241
+ # Update the state to reflect the labware is now in the Flex Stacker slot
242
+ # todo(chb, 2025-02-19): This ModuleLocation piece should probably instead be an AddressableAreaLocation
243
+ # but that has implications for where labware are set by things like module.load_labware(..) and what
244
+ # happens when we move labware.
245
+ stacker_area = (
246
+ self._state_view.modules.ensure_and_convert_module_fixture_location(
247
+ deck_slot=self._state_view.modules.get_location(
248
+ params.moduleId
249
+ ).slotName,
250
+ model=self._state_view.modules.get(params.moduleId).model,
251
+ )
252
+ )
253
+ original_locations = labware_locations_for_group(
254
+ to_retrieve, [InStackerHopperLocation(moduleId=params.moduleId)]
255
+ )
256
+ new_locations = labware_locations_for_group(
257
+ to_retrieve,
258
+ self._state_view.geometry.get_predicted_location_sequence(
259
+ ModuleLocation(moduleId=params.moduleId)
260
+ ),
261
+ )
262
+
263
+ state_update = (
264
+ update_types.StateUpdate()
265
+ .set_batch_labware_location(
266
+ new_locations_by_id=locations, new_offset_ids_by_id=offsets
267
+ )
268
+ .update_flex_stacker_contained_labware(params.moduleId, remaining)
269
+ .set_addressable_area_used(stacker_area)
270
+ )
271
+
272
+ # Allow propagation of ModuleNotAttachedError.
273
+ stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
274
+ if stacker_hw is not None:
275
+ try:
276
+ stacker_hw.set_stacker_identify(True)
277
+ await stacker_hw.dispense_labware(
278
+ labware_height=stacker_state.get_pool_height_minus_overlap()
279
+ )
280
+ except (
281
+ FlexStackerStallError,
282
+ FlexStackerShuttleMissingError,
283
+ FlexStackerHopperLabwareError,
284
+ FlexStackerShuttleLabwareError,
285
+ FlexStackerShuttleNotEmptyError,
286
+ ) as e:
287
+ return self.handle_recoverable_error(
288
+ e, to_retrieve.primaryLabwareId, state_update
289
+ )
290
+
291
+ if stacker_hw is not None:
292
+ stacker_hw.set_stacker_identify(False)
293
+
294
+ return SuccessData(
295
+ public=RetrieveResult.model_construct(
296
+ labwareId=to_retrieve.primaryLabwareId,
297
+ adapterId=to_retrieve.adapterLabwareId,
298
+ lidId=to_retrieve.lidLabwareId,
299
+ primaryLocationSequence=primary_location_sequence(new_locations),
300
+ adapterLocationSequence=adapter_location_sequence(new_locations),
301
+ lidLocationSequence=lid_location_sequence(new_locations),
302
+ originalPrimaryLocationSequence=primary_location_sequence(
303
+ original_locations
304
+ ),
305
+ originalAdapterLocationSequence=adapter_location_sequence(
306
+ original_locations
307
+ ),
308
+ originalLidLocationSequence=lid_location_sequence(original_locations),
309
+ primaryLabwareURI=self._state_view.labware.get_uri_from_definition(
310
+ stacker_state.pool_primary_definition
311
+ ),
312
+ adapterLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
313
+ stacker_state.pool_adapter_definition
314
+ ),
315
+ lidLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
316
+ stacker_state.pool_lid_definition
317
+ ),
318
+ ),
319
+ state_update=state_update,
320
+ )
321
+
322
+
323
+ class Retrieve(BaseCommand[RetrieveParams, RetrieveResult, ErrorOccurrence]):
324
+ """A command to retrieve a labware from a Flex Stacker."""
325
+
326
+ commandType: RetrieveCommandType = "flexStacker/retrieve"
327
+ params: RetrieveParams
328
+ result: RetrieveResult | None = None
329
+
330
+ _ImplementationCls: Type[RetrieveImpl] = RetrieveImpl
331
+
332
+
333
+ class RetrieveCreate(BaseCommandCreate[RetrieveParams]):
334
+ """A request to execute a Flex Stacker retrieve command."""
335
+
336
+ commandType: RetrieveCommandType = "flexStacker/retrieve"
337
+ params: RetrieveParams
338
+
339
+ _CommandCls: Type[Retrieve] = Retrieve
@@ -0,0 +1,328 @@
1
+ """Command models to configure the stored labware pool of a Flex Stacker.."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
5
+ from typing_extensions import Type
6
+
7
+ from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
9
+
10
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
11
+
12
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
13
+ from ...errors import (
14
+ ErrorOccurrence,
15
+ )
16
+ from ...errors.exceptions import FlexStackerNotLogicallyEmptyError
17
+ from ...types import (
18
+ StackerStoredLabwareGroup,
19
+ LabwareLocationSequence,
20
+ NotOnDeckLocationSequenceComponent,
21
+ InStackerHopperLocation,
22
+ SYSTEM_LOCATION,
23
+ )
24
+ from .common import (
25
+ INITIAL_COUNT_DESCRIPTION,
26
+ INITIAL_STORED_LABWARE_DESCRIPTION,
27
+ build_ids_to_fill,
28
+ build_or_assign_labware_to_hopper,
29
+ labware_locations_for_group,
30
+ labware_location_base_sequence,
31
+ primary_location_sequences,
32
+ adapter_location_sequences_with_default,
33
+ lid_location_sequences_with_default,
34
+ )
35
+
36
+ if TYPE_CHECKING:
37
+ from opentrons.protocol_engine.state.state import StateView
38
+ from opentrons.protocol_engine.execution import EquipmentHandler
39
+ from opentrons.protocol_engine.resources import ModelUtils
40
+
41
+ SetStoredLabwareCommandType = Literal["flexStacker/setStoredLabware"]
42
+
43
+
44
+ class StackerStoredLabwareDetails(BaseModel):
45
+ """The parameters defining a labware to be stored in the stacker."""
46
+
47
+ loadName: str = Field(
48
+ ..., description="Name used to reference the definition of this labware."
49
+ )
50
+ namespace: str = Field(
51
+ ..., description="Namespace of the definition of this labware."
52
+ )
53
+ version: int = Field(..., description="Version of the definition of this labware.")
54
+
55
+
56
+ class SetStoredLabwareParams(BaseModel):
57
+ """Input parameters for a setStoredLabware command."""
58
+
59
+ moduleId: str = Field(
60
+ ...,
61
+ description="Unique ID of the Flex Stacker.",
62
+ )
63
+ primaryLabware: StackerStoredLabwareDetails = Field(
64
+ ...,
65
+ description="The details of the primary labware (i.e. not the lid or adapter, if any) stored in the stacker.",
66
+ )
67
+ lidLabware: StackerStoredLabwareDetails | SkipJsonSchema[None] = Field(
68
+ default=None,
69
+ description="The details of the lid on the primary labware, if any.",
70
+ )
71
+ adapterLabware: StackerStoredLabwareDetails | SkipJsonSchema[None] = Field(
72
+ default=None,
73
+ description="The details of the adapter under the primary labware, if any.",
74
+ )
75
+ initialCount: Optional[Annotated[int, Field(ge=0)]] = Field(
76
+ None,
77
+ description=INITIAL_COUNT_DESCRIPTION,
78
+ )
79
+ initialStoredLabware: list[StackerStoredLabwareGroup] | None = Field(
80
+ None,
81
+ description=INITIAL_STORED_LABWARE_DESCRIPTION,
82
+ )
83
+ poolOverlapOverride: Optional[float] = Field(
84
+ None,
85
+ description=(
86
+ "Override for the Z stacking overlap of the labware pool. If not "
87
+ "provided, the protocol engine will calculate the overlap based on "
88
+ "the stacking offsets provided in the labware definitions."
89
+ ),
90
+ )
91
+
92
+
93
+ class SetStoredLabwareResult(BaseModel):
94
+ """Result data from a setstoredlabware command."""
95
+
96
+ primaryLabwareDefinition: LabwareDefinition = Field(
97
+ ..., description="The definition of the primary labware."
98
+ )
99
+ lidLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = Field(
100
+ None, description="The definition of the lid on the primary labware, if any."
101
+ )
102
+ adapterLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = Field(
103
+ None,
104
+ description="The definition of the adapter under the primary labware, if any.",
105
+ )
106
+ storedLabware: list[StackerStoredLabwareGroup] = Field(
107
+ ..., description="The primary labware loaded into the stacker labware pool."
108
+ )
109
+ count: int = Field(
110
+ ..., description="The number of labware now stored in the hopper."
111
+ )
112
+ originalPrimaryLabwareLocationSequences: (
113
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
114
+ ) = Field(
115
+ None,
116
+ description="The previous position of each primary labware, in the same order as storedLabware.",
117
+ )
118
+ originalAdapterLabwareLocationSequences: (
119
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
120
+ ) = Field(
121
+ None,
122
+ description="The previous position of each adapter labware, in the same order as storedLabware. None if the pool does not specify an adapter.",
123
+ )
124
+ originalLidLabwareLocationSequences: (
125
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
126
+ ) = Field(
127
+ None,
128
+ description="The previous position of each lid labware, in the same order as storedLabware. None if the pool does not specify a lid.",
129
+ )
130
+ newPrimaryLabwareLocationSequences: (
131
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
132
+ ) = Field(
133
+ None,
134
+ description="The new position of each primary labware, in the same order as storedLabware.",
135
+ )
136
+ newAdapterLabwareLocationSequences: (
137
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
138
+ ) = Field(
139
+ None,
140
+ description="The new position of each adapter labware, in the same order as storedLabware. None if the pool does not specify an adapter.",
141
+ )
142
+ newLidLabwareLocationSequences: (
143
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
144
+ ) = Field(
145
+ None,
146
+ description="The new position of each lid labware, in the same order as storedLabware. None if the pool does not specify a lid labware.",
147
+ )
148
+
149
+
150
+ class SetStoredLabwareImpl(
151
+ AbstractCommandImpl[SetStoredLabwareParams, SuccessData[SetStoredLabwareResult]]
152
+ ):
153
+ """Implementation of a setstoredlabware command."""
154
+
155
+ def __init__(
156
+ self,
157
+ state_view: StateView,
158
+ equipment: EquipmentHandler,
159
+ model_utils: ModelUtils,
160
+ **kwargs: object,
161
+ ) -> None:
162
+ self._state_view = state_view
163
+ self._equipment = equipment
164
+ self._model_utils = model_utils
165
+
166
+ async def execute(
167
+ self, params: SetStoredLabwareParams
168
+ ) -> SuccessData[SetStoredLabwareResult]:
169
+ """Execute the setstoredlabwarecommand."""
170
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
171
+ params.moduleId
172
+ )
173
+ location = self._state_view.modules.get_location(params.moduleId)
174
+
175
+ if len(stacker_state.contained_labware_bottom_first) != 0:
176
+ # Note: this error catches if the protocol tells us the stacker is not empty, making this command
177
+ # invalid at this point in the protocol. This error is not recoverable and should occur during
178
+ # analysis; the protocol must be changed.
179
+
180
+ raise FlexStackerNotLogicallyEmptyError(
181
+ message=(
182
+ f"The Flex Stacker in {location} must be known to be empty before reconfiguring its labware pool, but it has "
183
+ f"{len(stacker_state.contained_labware_bottom_first)} labware"
184
+ )
185
+ )
186
+
187
+ labware_def, _ = await self._equipment.load_definition_for_details(
188
+ load_name=params.primaryLabware.loadName,
189
+ namespace=params.primaryLabware.namespace,
190
+ version=params.primaryLabware.version,
191
+ )
192
+ lid_def: LabwareDefinition | None = None
193
+ if params.lidLabware:
194
+ lid_def, _ = await self._equipment.load_definition_for_details(
195
+ load_name=params.lidLabware.loadName,
196
+ namespace=params.lidLabware.namespace,
197
+ version=params.lidLabware.version,
198
+ )
199
+ adapter_def: LabwareDefinition | None = None
200
+ if params.adapterLabware:
201
+ adapter_def, _ = await self._equipment.load_definition_for_details(
202
+ load_name=params.adapterLabware.loadName,
203
+ namespace=params.adapterLabware.namespace,
204
+ version=params.adapterLabware.version,
205
+ )
206
+
207
+ pool_definitions = (
208
+ self._state_view.labware.stacker_labware_pool_to_ordered_list(
209
+ labware_def, lid_def, adapter_def
210
+ )
211
+ )
212
+
213
+ pool_height = self._state_view.geometry.get_height_of_labware_stack(
214
+ pool_definitions
215
+ )
216
+
217
+ pool_overlap = (
218
+ params.poolOverlapOverride
219
+ if params.poolOverlapOverride
220
+ else self._state_view.labware.get_stacker_labware_overlap_offset(
221
+ pool_definitions
222
+ ).z
223
+ )
224
+
225
+ max_pool_count = self._state_view.modules.stacker_max_pool_count_by_height(
226
+ params.moduleId,
227
+ pool_height,
228
+ pool_overlap,
229
+ )
230
+ groups_to_load = build_ids_to_fill(
231
+ params.adapterLabware is not None,
232
+ params.lidLabware is not None,
233
+ params.initialStoredLabware,
234
+ params.initialCount,
235
+ max_pool_count,
236
+ 0,
237
+ self._model_utils,
238
+ )
239
+ state_update, new_contained_labware = await build_or_assign_labware_to_hopper(
240
+ labware_def,
241
+ adapter_def,
242
+ lid_def,
243
+ params.moduleId,
244
+ groups_to_load,
245
+ [],
246
+ self._equipment,
247
+ self._state_view,
248
+ )
249
+
250
+ state_update = state_update.update_flex_stacker_labware_pool_definition(
251
+ params.moduleId,
252
+ max_pool_count,
253
+ pool_overlap,
254
+ pool_height,
255
+ labware_def,
256
+ adapter_def,
257
+ lid_def,
258
+ )
259
+ original_location_sequences = [
260
+ labware_locations_for_group(
261
+ group,
262
+ labware_location_base_sequence(
263
+ group,
264
+ self._state_view,
265
+ [
266
+ NotOnDeckLocationSequenceComponent(
267
+ logicalLocationName=SYSTEM_LOCATION
268
+ )
269
+ ],
270
+ ),
271
+ )
272
+ for group in new_contained_labware
273
+ ]
274
+ new_location_sequences = [
275
+ labware_locations_for_group(
276
+ group, [InStackerHopperLocation(moduleId=params.moduleId)]
277
+ )
278
+ for group in new_contained_labware
279
+ ]
280
+ return SuccessData(
281
+ public=SetStoredLabwareResult.model_construct(
282
+ primaryLabwareDefinition=labware_def,
283
+ lidLabwareDefinition=lid_def,
284
+ adapterLabwareDefinition=adapter_def,
285
+ count=len(new_contained_labware),
286
+ storedLabware=new_contained_labware,
287
+ originalPrimaryLabwareLocationSequences=primary_location_sequences(
288
+ original_location_sequences
289
+ ),
290
+ originalAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
291
+ original_location_sequences, adapter_def
292
+ ),
293
+ originalLidLabwareLocationSequences=lid_location_sequences_with_default(
294
+ original_location_sequences, lid_def
295
+ ),
296
+ newPrimaryLabwareLocationSequences=primary_location_sequences(
297
+ new_location_sequences
298
+ ),
299
+ newAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
300
+ new_location_sequences, adapter_def
301
+ ),
302
+ newLidLabwareLocationSequences=lid_location_sequences_with_default(
303
+ new_location_sequences, lid_def
304
+ ),
305
+ ),
306
+ state_update=state_update,
307
+ )
308
+
309
+
310
+ class SetStoredLabware(
311
+ BaseCommand[SetStoredLabwareParams, SetStoredLabwareResult, ErrorOccurrence]
312
+ ):
313
+ """A command to setstoredlabware the Flex Stacker."""
314
+
315
+ commandType: SetStoredLabwareCommandType = "flexStacker/setStoredLabware"
316
+ params: SetStoredLabwareParams
317
+ result: Optional[SetStoredLabwareResult] = None
318
+
319
+ _ImplementationCls: Type[SetStoredLabwareImpl] = SetStoredLabwareImpl
320
+
321
+
322
+ class SetStoredLabwareCreate(BaseCommandCreate[SetStoredLabwareParams]):
323
+ """A request to execute a Flex Stacker SetStoredLabware command."""
324
+
325
+ commandType: SetStoredLabwareCommandType = "flexStacker/setStoredLabware"
326
+ params: SetStoredLabwareParams
327
+
328
+ _CommandCls: Type[SetStoredLabware] = SetStoredLabware