opentrons 8.6.0a1__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 (600) 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 +501 -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 +183 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +552 -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/simulator_setup.py +260 -0
  200. opentrons/hardware_control/thread_manager.py +431 -0
  201. opentrons/hardware_control/threaded_async_lock.py +97 -0
  202. opentrons/hardware_control/types.py +792 -0
  203. opentrons/hardware_control/util.py +234 -0
  204. opentrons/legacy_broker.py +53 -0
  205. opentrons/legacy_commands/__init__.py +1 -0
  206. opentrons/legacy_commands/commands.py +483 -0
  207. opentrons/legacy_commands/helpers.py +153 -0
  208. opentrons/legacy_commands/module_commands.py +215 -0
  209. opentrons/legacy_commands/protocol_commands.py +54 -0
  210. opentrons/legacy_commands/publisher.py +155 -0
  211. opentrons/legacy_commands/robot_commands.py +51 -0
  212. opentrons/legacy_commands/types.py +1115 -0
  213. opentrons/motion_planning/__init__.py +32 -0
  214. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  215. opentrons/motion_planning/deck_conflict.py +396 -0
  216. opentrons/motion_planning/errors.py +35 -0
  217. opentrons/motion_planning/types.py +42 -0
  218. opentrons/motion_planning/waypoints.py +218 -0
  219. opentrons/ordered_set.py +138 -0
  220. opentrons/protocol_api/__init__.py +105 -0
  221. opentrons/protocol_api/_liquid.py +157 -0
  222. opentrons/protocol_api/_liquid_properties.py +814 -0
  223. opentrons/protocol_api/_nozzle_layout.py +31 -0
  224. opentrons/protocol_api/_parameter_context.py +300 -0
  225. opentrons/protocol_api/_parameters.py +31 -0
  226. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  227. opentrons/protocol_api/_types.py +43 -0
  228. opentrons/protocol_api/config.py +23 -0
  229. opentrons/protocol_api/core/__init__.py +23 -0
  230. opentrons/protocol_api/core/common.py +33 -0
  231. opentrons/protocol_api/core/core_map.py +74 -0
  232. opentrons/protocol_api/core/engine/__init__.py +22 -0
  233. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  234. opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
  235. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  236. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  237. opentrons/protocol_api/core/engine/labware.py +238 -0
  238. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  239. opentrons/protocol_api/core/engine/module_core.py +1025 -0
  240. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  241. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  242. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  243. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  244. opentrons/protocol_api/core/engine/robot.py +139 -0
  245. opentrons/protocol_api/core/engine/stringify.py +74 -0
  246. opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
  247. opentrons/protocol_api/core/engine/well.py +241 -0
  248. opentrons/protocol_api/core/instrument.py +459 -0
  249. opentrons/protocol_api/core/labware.py +151 -0
  250. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  251. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  252. opentrons/protocol_api/core/legacy/deck.py +369 -0
  253. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  254. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  255. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  256. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  257. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  258. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  259. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  260. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  261. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  262. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  263. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  265. opentrons/protocol_api/core/module.py +484 -0
  266. opentrons/protocol_api/core/protocol.py +311 -0
  267. opentrons/protocol_api/core/robot.py +51 -0
  268. opentrons/protocol_api/core/well.py +116 -0
  269. opentrons/protocol_api/core/well_grid.py +45 -0
  270. opentrons/protocol_api/create_protocol_context.py +177 -0
  271. opentrons/protocol_api/deck.py +223 -0
  272. opentrons/protocol_api/disposal_locations.py +244 -0
  273. opentrons/protocol_api/instrument_context.py +3212 -0
  274. opentrons/protocol_api/labware.py +1579 -0
  275. opentrons/protocol_api/module_contexts.py +1425 -0
  276. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  277. opentrons/protocol_api/protocol_context.py +1688 -0
  278. opentrons/protocol_api/robot_context.py +303 -0
  279. opentrons/protocol_api/validation.py +761 -0
  280. opentrons/protocol_engine/__init__.py +155 -0
  281. opentrons/protocol_engine/actions/__init__.py +65 -0
  282. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  283. opentrons/protocol_engine/actions/action_handler.py +13 -0
  284. opentrons/protocol_engine/actions/actions.py +302 -0
  285. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  286. opentrons/protocol_engine/clients/__init__.py +5 -0
  287. opentrons/protocol_engine/clients/sync_client.py +174 -0
  288. opentrons/protocol_engine/clients/transports.py +197 -0
  289. opentrons/protocol_engine/commands/__init__.py +757 -0
  290. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  296. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  297. opentrons/protocol_engine/commands/aspirate.py +244 -0
  298. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  299. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  300. opentrons/protocol_engine/commands/blow_out.py +146 -0
  301. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  302. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  303. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  306. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  307. opentrons/protocol_engine/commands/command.py +308 -0
  308. opentrons/protocol_engine/commands/command_unions.py +974 -0
  309. opentrons/protocol_engine/commands/comment.py +57 -0
  310. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  311. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  312. opentrons/protocol_engine/commands/custom.py +67 -0
  313. opentrons/protocol_engine/commands/dispense.py +194 -0
  314. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  315. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  316. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  317. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  318. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  319. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  320. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  321. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  322. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  323. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  324. opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
  325. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  326. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  327. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  328. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  329. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  330. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  331. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  333. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  334. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  336. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  337. opentrons/protocol_engine/commands/home.py +100 -0
  338. opentrons/protocol_engine/commands/identify_module.py +86 -0
  339. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  340. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  341. opentrons/protocol_engine/commands/load_labware.py +210 -0
  342. opentrons/protocol_engine/commands/load_lid.py +154 -0
  343. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  344. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  345. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  346. opentrons/protocol_engine/commands/load_module.py +223 -0
  347. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  348. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  349. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  350. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  351. opentrons/protocol_engine/commands/move_labware.py +546 -0
  352. opentrons/protocol_engine/commands/move_relative.py +102 -0
  353. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  355. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  356. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  357. opentrons/protocol_engine/commands/movement_common.py +338 -0
  358. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  359. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  360. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  361. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  362. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  363. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  364. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  365. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  366. opentrons/protocol_engine/commands/robot/common.py +18 -0
  367. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  369. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  370. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  371. opentrons/protocol_engine/commands/save_position.py +109 -0
  372. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  373. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  374. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  375. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  376. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  377. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  378. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  379. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  380. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  381. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  384. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  386. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  388. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  390. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  391. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  392. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  401. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  402. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  403. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  404. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  405. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  406. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  407. opentrons/protocol_engine/engine_support.py +28 -0
  408. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  409. opentrons/protocol_engine/errors/__init__.py +191 -0
  410. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  411. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  412. opentrons/protocol_engine/execution/__init__.py +50 -0
  413. opentrons/protocol_engine/execution/command_executor.py +216 -0
  414. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  415. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  416. opentrons/protocol_engine/execution/equipment.py +819 -0
  417. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  418. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  419. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  420. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  421. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  422. opentrons/protocol_engine/execution/movement.py +349 -0
  423. opentrons/protocol_engine/execution/pipetting.py +607 -0
  424. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  425. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  426. opentrons/protocol_engine/execution/run_control.py +33 -0
  427. opentrons/protocol_engine/execution/status_bar.py +34 -0
  428. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  429. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  430. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  431. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  432. opentrons/protocol_engine/notes/__init__.py +17 -0
  433. opentrons/protocol_engine/notes/notes.py +59 -0
  434. opentrons/protocol_engine/plugins.py +104 -0
  435. opentrons/protocol_engine/protocol_engine.py +683 -0
  436. opentrons/protocol_engine/resources/__init__.py +26 -0
  437. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  438. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  439. opentrons/protocol_engine/resources/file_provider.py +161 -0
  440. opentrons/protocol_engine/resources/fixture_validation.py +58 -0
  441. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  442. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  443. opentrons/protocol_engine/resources/model_utils.py +32 -0
  444. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  445. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  446. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  447. opentrons/protocol_engine/slot_standardization.py +128 -0
  448. opentrons/protocol_engine/state/__init__.py +1 -0
  449. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  450. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  451. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  452. opentrons/protocol_engine/state/_move_types.py +83 -0
  453. opentrons/protocol_engine/state/_well_math.py +193 -0
  454. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  455. opentrons/protocol_engine/state/command_history.py +309 -0
  456. opentrons/protocol_engine/state/commands.py +1158 -0
  457. opentrons/protocol_engine/state/config.py +39 -0
  458. opentrons/protocol_engine/state/files.py +57 -0
  459. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  460. opentrons/protocol_engine/state/geometry.py +2359 -0
  461. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  462. opentrons/protocol_engine/state/labware.py +1459 -0
  463. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  464. opentrons/protocol_engine/state/liquids.py +73 -0
  465. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  466. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  467. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  468. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  469. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  471. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  472. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  473. opentrons/protocol_engine/state/modules.py +1500 -0
  474. opentrons/protocol_engine/state/motion.py +373 -0
  475. opentrons/protocol_engine/state/pipettes.py +905 -0
  476. opentrons/protocol_engine/state/state.py +421 -0
  477. opentrons/protocol_engine/state/state_summary.py +36 -0
  478. opentrons/protocol_engine/state/tips.py +420 -0
  479. opentrons/protocol_engine/state/update_types.py +904 -0
  480. opentrons/protocol_engine/state/wells.py +290 -0
  481. opentrons/protocol_engine/types/__init__.py +308 -0
  482. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  483. opentrons/protocol_engine/types/command_annotations.py +53 -0
  484. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  485. opentrons/protocol_engine/types/execution.py +96 -0
  486. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  487. opentrons/protocol_engine/types/instrument.py +47 -0
  488. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  489. opentrons/protocol_engine/types/labware.py +131 -0
  490. opentrons/protocol_engine/types/labware_movement.py +22 -0
  491. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  492. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  493. opentrons/protocol_engine/types/liquid.py +40 -0
  494. opentrons/protocol_engine/types/liquid_class.py +59 -0
  495. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  496. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  497. opentrons/protocol_engine/types/location.py +194 -0
  498. opentrons/protocol_engine/types/module.py +303 -0
  499. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  500. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  501. opentrons/protocol_engine/types/tip.py +18 -0
  502. opentrons/protocol_engine/types/util.py +21 -0
  503. opentrons/protocol_engine/types/well_position.py +124 -0
  504. opentrons/protocol_reader/__init__.py +37 -0
  505. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  506. opentrons/protocol_reader/file_format_validator.py +152 -0
  507. opentrons/protocol_reader/file_hasher.py +27 -0
  508. opentrons/protocol_reader/file_identifier.py +284 -0
  509. opentrons/protocol_reader/file_reader_writer.py +90 -0
  510. opentrons/protocol_reader/input_file.py +16 -0
  511. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  512. opentrons/protocol_reader/protocol_reader.py +188 -0
  513. opentrons/protocol_reader/protocol_source.py +124 -0
  514. opentrons/protocol_reader/role_analyzer.py +86 -0
  515. opentrons/protocol_runner/__init__.py +26 -0
  516. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  517. opentrons/protocol_runner/json_file_reader.py +55 -0
  518. opentrons/protocol_runner/json_translator.py +314 -0
  519. opentrons/protocol_runner/legacy_command_mapper.py +848 -0
  520. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  521. opentrons/protocol_runner/protocol_runner.py +530 -0
  522. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  523. opentrons/protocol_runner/run_orchestrator.py +496 -0
  524. opentrons/protocol_runner/task_queue.py +95 -0
  525. opentrons/protocols/__init__.py +6 -0
  526. opentrons/protocols/advanced_control/__init__.py +0 -0
  527. opentrons/protocols/advanced_control/common.py +38 -0
  528. opentrons/protocols/advanced_control/mix.py +60 -0
  529. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  530. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  531. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  532. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  533. opentrons/protocols/api_support/__init__.py +0 -0
  534. opentrons/protocols/api_support/constants.py +8 -0
  535. opentrons/protocols/api_support/deck_type.py +110 -0
  536. opentrons/protocols/api_support/definitions.py +18 -0
  537. opentrons/protocols/api_support/instrument.py +151 -0
  538. opentrons/protocols/api_support/labware_like.py +233 -0
  539. opentrons/protocols/api_support/tip_tracker.py +175 -0
  540. opentrons/protocols/api_support/types.py +32 -0
  541. opentrons/protocols/api_support/util.py +403 -0
  542. opentrons/protocols/bundle.py +89 -0
  543. opentrons/protocols/duration/__init__.py +4 -0
  544. opentrons/protocols/duration/errors.py +5 -0
  545. opentrons/protocols/duration/estimator.py +628 -0
  546. opentrons/protocols/execution/__init__.py +0 -0
  547. opentrons/protocols/execution/dev_types.py +181 -0
  548. opentrons/protocols/execution/errors.py +40 -0
  549. opentrons/protocols/execution/execute.py +84 -0
  550. opentrons/protocols/execution/execute_json_v3.py +275 -0
  551. opentrons/protocols/execution/execute_json_v4.py +359 -0
  552. opentrons/protocols/execution/execute_json_v5.py +28 -0
  553. opentrons/protocols/execution/execute_python.py +169 -0
  554. opentrons/protocols/execution/json_dispatchers.py +87 -0
  555. opentrons/protocols/execution/types.py +7 -0
  556. opentrons/protocols/geometry/__init__.py +0 -0
  557. opentrons/protocols/geometry/planning.py +297 -0
  558. opentrons/protocols/labware.py +312 -0
  559. opentrons/protocols/models/__init__.py +0 -0
  560. opentrons/protocols/models/json_protocol.py +679 -0
  561. opentrons/protocols/parameters/__init__.py +0 -0
  562. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  563. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  564. opentrons/protocols/parameters/exceptions.py +34 -0
  565. opentrons/protocols/parameters/parameter_definition.py +272 -0
  566. opentrons/protocols/parameters/types.py +17 -0
  567. opentrons/protocols/parameters/validation.py +267 -0
  568. opentrons/protocols/parse.py +671 -0
  569. opentrons/protocols/types.py +159 -0
  570. opentrons/py.typed +0 -0
  571. opentrons/resources/scripts/lpc21isp +0 -0
  572. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  573. opentrons/simulate.py +1065 -0
  574. opentrons/system/__init__.py +6 -0
  575. opentrons/system/camera.py +51 -0
  576. opentrons/system/log_control.py +59 -0
  577. opentrons/system/nmcli.py +856 -0
  578. opentrons/system/resin.py +24 -0
  579. opentrons/system/smoothie_update.py +15 -0
  580. opentrons/system/wifi.py +204 -0
  581. opentrons/tools/__init__.py +0 -0
  582. opentrons/tools/args_handler.py +22 -0
  583. opentrons/tools/write_pipette_memory.py +157 -0
  584. opentrons/types.py +618 -0
  585. opentrons/util/__init__.py +1 -0
  586. opentrons/util/async_helpers.py +166 -0
  587. opentrons/util/broker.py +84 -0
  588. opentrons/util/change_notifier.py +47 -0
  589. opentrons/util/entrypoint_util.py +278 -0
  590. opentrons/util/get_union_elements.py +26 -0
  591. opentrons/util/helpers.py +6 -0
  592. opentrons/util/linal.py +178 -0
  593. opentrons/util/logging_config.py +265 -0
  594. opentrons/util/logging_queue_handler.py +61 -0
  595. opentrons/util/performance_helpers.py +157 -0
  596. opentrons-8.6.0a1.dist-info/METADATA +37 -0
  597. opentrons-8.6.0a1.dist-info/RECORD +600 -0
  598. opentrons-8.6.0a1.dist-info/WHEEL +4 -0
  599. opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
  600. opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,464 @@
1
+ """The liquidProbe and tryLiquidProbe commands."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, NamedTuple, Optional, Type, Union, Any
5
+
6
+ from typing_extensions import Literal
7
+ from pydantic import Field
8
+ from pydantic.json_schema import SkipJsonSchema
9
+
10
+ from opentrons.protocol_engine.state import update_types
11
+ from opentrons.protocol_engine.errors.exceptions import (
12
+ MustHomeError,
13
+ PipetteNotReadyToAspirateError,
14
+ TipNotEmptyError,
15
+ IncompleteLabwareDefinitionError,
16
+ TipNotAttachedError,
17
+ )
18
+ from opentrons.types import MountType
19
+ from opentrons_shared_data.errors.exceptions import (
20
+ PipetteLiquidNotFoundError,
21
+ UnsupportedHardwareCommand,
22
+ PipetteOverpressureError,
23
+ )
24
+
25
+ from ..types import DeckPoint, LiquidTrackingType
26
+ from .pipetting_common import (
27
+ LiquidNotFoundError,
28
+ PipetteIdMixin,
29
+ OverpressureError,
30
+ )
31
+ from .movement_common import (
32
+ WellLocationMixin,
33
+ DestinationPositionResult,
34
+ StallOrCollisionError,
35
+ move_to_well,
36
+ )
37
+ from .command import (
38
+ AbstractCommandImpl,
39
+ BaseCommand,
40
+ BaseCommandCreate,
41
+ DefinedErrorData,
42
+ SuccessData,
43
+ )
44
+
45
+ from ..errors.error_occurrence import ErrorOccurrence
46
+
47
+ if TYPE_CHECKING:
48
+ from ..execution import MovementHandler, PipettingHandler, GantryMover
49
+ from ..resources import ModelUtils
50
+ from ..state.state import StateView
51
+
52
+
53
+ def _remove_default(s: dict[str, Any]) -> None:
54
+ s.pop("default", None)
55
+
56
+
57
+ LiquidProbeCommandType = Literal["liquidProbe"]
58
+ TryLiquidProbeCommandType = Literal["tryLiquidProbe"]
59
+
60
+
61
+ # Both command variants should have identical parameters.
62
+ # But we need two separate parameter model classes because
63
+ # `command_unions.CREATE_TYPES_BY_PARAMS_TYPE` needs to be a 1:1 mapping.
64
+ class _CommonParams(PipetteIdMixin, WellLocationMixin):
65
+ pass
66
+
67
+
68
+ class LiquidProbeParams(_CommonParams):
69
+ """Parameters required for a `liquidProbe` command."""
70
+
71
+ pass
72
+
73
+
74
+ class TryLiquidProbeParams(_CommonParams):
75
+ """Parameters required for a `tryLiquidProbe` command."""
76
+
77
+ pass
78
+
79
+
80
+ class LiquidProbeResult(DestinationPositionResult):
81
+ """Result data from the execution of a `liquidProbe` command."""
82
+
83
+ z_position: LiquidTrackingType = Field(
84
+ ..., description="The Z coordinate, in mm, of the found liquid in deck space."
85
+ )
86
+ # New fields should use camelCase. z_position is snake_case for historical reasons.
87
+
88
+
89
+ class TryLiquidProbeResult(DestinationPositionResult):
90
+ """Result data from the execution of a `tryLiquidProbe` command."""
91
+
92
+ z_position: Union[LiquidTrackingType, SkipJsonSchema[None]] = Field(
93
+ ...,
94
+ description=(
95
+ "The Z coordinate, in mm, of the found liquid in deck space."
96
+ " If no liquid was found, `null` or omitted."
97
+ ),
98
+ json_schema_extra=_remove_default,
99
+ )
100
+
101
+
102
+ _LiquidProbeExecuteReturn = Union[
103
+ SuccessData[LiquidProbeResult],
104
+ DefinedErrorData[LiquidNotFoundError]
105
+ | DefinedErrorData[StallOrCollisionError]
106
+ | DefinedErrorData[OverpressureError],
107
+ ]
108
+ _TryLiquidProbeExecuteReturn = (
109
+ SuccessData[TryLiquidProbeResult]
110
+ | DefinedErrorData[StallOrCollisionError]
111
+ | DefinedErrorData[OverpressureError]
112
+ )
113
+
114
+
115
+ class _ExecuteCommonResult(NamedTuple):
116
+ # If the probe succeeded, the z_pos that it returned.
117
+ # Or, if the probe found no liquid, the error representing that,
118
+ # so calling code can propagate those details up.
119
+ z_pos_or_error: LiquidTrackingType | PipetteLiquidNotFoundError | PipetteOverpressureError
120
+ state_update: update_types.StateUpdate
121
+ deck_point: DeckPoint
122
+
123
+
124
+ async def _execute_common( # noqa: C901
125
+ state_view: StateView,
126
+ movement: MovementHandler,
127
+ gantry_mover: GantryMover,
128
+ pipetting: PipettingHandler,
129
+ model_utils: ModelUtils,
130
+ params: _CommonParams,
131
+ ) -> _ExecuteCommonResult | DefinedErrorData[StallOrCollisionError] | DefinedErrorData[
132
+ OverpressureError
133
+ ]:
134
+ pipette_id = params.pipetteId
135
+ labware_id = params.labwareId
136
+ well_name = params.wellName
137
+ if (
138
+ "pressure"
139
+ not in state_view.pipettes.get_config(pipette_id).available_sensors.sensors
140
+ ):
141
+ raise UnsupportedHardwareCommand(
142
+ "Pressure sensor not available for this pipette"
143
+ )
144
+
145
+ if not state_view.pipettes.get_nozzle_configuration_supports_lld(pipette_id):
146
+ raise TipNotAttachedError(
147
+ "Either the front right or back left nozzle must have a tip attached to probe liquid height."
148
+ )
149
+
150
+ # May raise TipNotAttachedError.
151
+ aspirated_volume = state_view.pipettes.get_aspirated_volume(pipette_id)
152
+
153
+ if aspirated_volume is None:
154
+ # Theoretically, we could avoid raising an error by automatically preparing
155
+ # to aspirate above the well like AspirateImplementation does. However, the
156
+ # only way for this to happen is if someone tries to do a liquid probe with
157
+ # a tip that's previously held liquid, which they should avoid anyway.
158
+ raise PipetteNotReadyToAspirateError(
159
+ "The pipette cannot probe liquid because a previous dispense or blowout"
160
+ " pushed the plunger beyond the bottom position."
161
+ " The plunger must be reset while the tip is somewhere away from liquid."
162
+ )
163
+ elif aspirated_volume != 0:
164
+ raise TipNotEmptyError(
165
+ message="The pipette cannot probe for liquid when the tip has liquid in it."
166
+ )
167
+
168
+ if await movement.check_for_valid_position(mount=MountType.LEFT) is False:
169
+ raise MustHomeError(
170
+ message="Current position of pipette is invalid. Please home."
171
+ )
172
+
173
+ # liquid_probe process start position
174
+ move_result = await move_to_well(
175
+ movement=movement,
176
+ model_utils=model_utils,
177
+ pipette_id=pipette_id,
178
+ labware_id=labware_id,
179
+ well_name=well_name,
180
+ well_location=params.wellLocation,
181
+ )
182
+ if isinstance(move_result, DefinedErrorData):
183
+ return move_result
184
+ try:
185
+ current_position = await gantry_mover.get_position(params.pipetteId)
186
+ z_pos = await pipetting.liquid_probe_in_place(
187
+ pipette_id=pipette_id,
188
+ labware_id=labware_id,
189
+ well_name=well_name,
190
+ well_location=params.wellLocation,
191
+ )
192
+ state_view.geometry.validate_probed_height(
193
+ labware_id=labware_id,
194
+ well_name=well_name,
195
+ pipette_id=pipette_id,
196
+ probed_height=z_pos,
197
+ )
198
+ except PipetteLiquidNotFoundError as exception:
199
+ move_result.state_update.set_pipette_ready_to_aspirate(
200
+ pipette_id=pipette_id, ready_to_aspirate=True
201
+ )
202
+ return _ExecuteCommonResult(
203
+ z_pos_or_error=exception,
204
+ state_update=move_result.state_update,
205
+ deck_point=move_result.public.position,
206
+ )
207
+ except PipetteOverpressureError as e:
208
+ return DefinedErrorData(
209
+ public=OverpressureError(
210
+ id=model_utils.generate_id(),
211
+ createdAt=model_utils.get_timestamp(),
212
+ wrappedErrors=[
213
+ ErrorOccurrence.from_failed(
214
+ id=model_utils.generate_id(),
215
+ createdAt=model_utils.get_timestamp(),
216
+ error=e,
217
+ )
218
+ ],
219
+ errorInfo=(
220
+ {
221
+ # This is here bc its not optional in the type but we are not using the retry location for this case
222
+ "retryLocation": (
223
+ current_position.x,
224
+ current_position.y,
225
+ current_position.z,
226
+ )
227
+ }
228
+ ),
229
+ ),
230
+ state_update=move_result.state_update.set_fluid_unknown(
231
+ pipette_id=pipette_id
232
+ ),
233
+ )
234
+ else:
235
+ move_result.state_update.set_pipette_ready_to_aspirate(
236
+ pipette_id=pipette_id, ready_to_aspirate=True
237
+ )
238
+ return _ExecuteCommonResult(
239
+ z_pos_or_error=z_pos,
240
+ state_update=move_result.state_update,
241
+ deck_point=move_result.public.position,
242
+ )
243
+
244
+
245
+ class LiquidProbeImplementation(
246
+ AbstractCommandImpl[LiquidProbeParams, _LiquidProbeExecuteReturn]
247
+ ):
248
+ """The implementation of a `liquidProbe` command."""
249
+
250
+ def __init__(
251
+ self,
252
+ state_view: StateView,
253
+ movement: MovementHandler,
254
+ gantry_mover: GantryMover,
255
+ pipetting: PipettingHandler,
256
+ model_utils: ModelUtils,
257
+ **kwargs: object,
258
+ ) -> None:
259
+ self._state_view = state_view
260
+ self._movement = movement
261
+ self._gantry_mover = gantry_mover
262
+ self._pipetting = pipetting
263
+ self._model_utils = model_utils
264
+
265
+ async def execute(self, params: _CommonParams) -> _LiquidProbeExecuteReturn:
266
+ """Move to and liquid probe the requested well.
267
+
268
+ Return the z-position of the found liquid.
269
+ If no liquid is found, return a LiquidNotFoundError as a defined error.
270
+
271
+ Raises:
272
+ TipNotAttachedError: as an undefined error, if there is not tip attached to
273
+ the pipette.
274
+ TipNotEmptyError: as an undefined error, if the tip starts with liquid
275
+ in it.
276
+ PipetteNotReadyToAspirateError: as an undefined error, if the plunger is not
277
+ in a safe position to do the liquid probe.
278
+ MustHomeError: as an undefined error, if the plunger is not in a valid
279
+ position.
280
+ """
281
+ result = await _execute_common(
282
+ state_view=self._state_view,
283
+ movement=self._movement,
284
+ gantry_mover=self._gantry_mover,
285
+ pipetting=self._pipetting,
286
+ model_utils=self._model_utils,
287
+ params=params,
288
+ )
289
+ if isinstance(result, DefinedErrorData):
290
+ return result
291
+ z_pos_or_error, state_update, deck_point = result
292
+ if isinstance(
293
+ z_pos_or_error, (PipetteLiquidNotFoundError, PipetteOverpressureError)
294
+ ):
295
+ state_update.set_liquid_probed(
296
+ labware_id=params.labwareId,
297
+ well_name=params.wellName,
298
+ height=update_types.CLEAR,
299
+ volume=update_types.CLEAR,
300
+ last_probed=self._model_utils.get_timestamp(),
301
+ )
302
+ return DefinedErrorData(
303
+ public=LiquidNotFoundError(
304
+ id=self._model_utils.generate_id(),
305
+ createdAt=self._model_utils.get_timestamp(),
306
+ wrappedErrors=[
307
+ ErrorOccurrence.from_failed(
308
+ id=self._model_utils.generate_id(),
309
+ createdAt=self._model_utils.get_timestamp(),
310
+ error=z_pos_or_error,
311
+ )
312
+ ],
313
+ ),
314
+ state_update=state_update,
315
+ )
316
+ else:
317
+ try:
318
+ well_volume: Union[
319
+ LiquidTrackingType,
320
+ update_types.ClearType,
321
+ ] = self._state_view.geometry.get_well_volume_at_height(
322
+ labware_id=params.labwareId,
323
+ well_name=params.wellName,
324
+ height=z_pos_or_error,
325
+ )
326
+ except IncompleteLabwareDefinitionError:
327
+ well_volume = update_types.CLEAR
328
+ state_update.set_liquid_probed(
329
+ labware_id=params.labwareId,
330
+ well_name=params.wellName,
331
+ height=z_pos_or_error,
332
+ volume=well_volume,
333
+ last_probed=self._model_utils.get_timestamp(),
334
+ )
335
+ return SuccessData(
336
+ public=LiquidProbeResult(
337
+ z_position=z_pos_or_error, position=deck_point
338
+ ),
339
+ state_update=state_update,
340
+ )
341
+
342
+
343
+ class TryLiquidProbeImplementation(
344
+ AbstractCommandImpl[TryLiquidProbeParams, _TryLiquidProbeExecuteReturn]
345
+ ):
346
+ """The implementation of a `tryLiquidProbe` command."""
347
+
348
+ def __init__(
349
+ self,
350
+ state_view: StateView,
351
+ movement: MovementHandler,
352
+ gantry_mover: GantryMover,
353
+ pipetting: PipettingHandler,
354
+ model_utils: ModelUtils,
355
+ **kwargs: object,
356
+ ) -> None:
357
+ self._state_view = state_view
358
+ self._movement = movement
359
+ self._gantry_mover = gantry_mover
360
+ self._pipetting = pipetting
361
+ self._model_utils = model_utils
362
+
363
+ async def execute(self, params: _CommonParams) -> _TryLiquidProbeExecuteReturn:
364
+ """Execute a `tryLiquidProbe` command.
365
+
366
+ `tryLiquidProbe` is identical to `liquidProbe`, except that if no liquid is
367
+ found, `tryLiquidProbe` returns a success result with `z_position=null` instead
368
+ of a defined error.
369
+ """
370
+ result = await _execute_common(
371
+ state_view=self._state_view,
372
+ movement=self._movement,
373
+ gantry_mover=self._gantry_mover,
374
+ pipetting=self._pipetting,
375
+ model_utils=self._model_utils,
376
+ params=params,
377
+ )
378
+ if isinstance(result, DefinedErrorData):
379
+ return result
380
+ z_pos_or_error, state_update, deck_point = result
381
+
382
+ if isinstance(
383
+ z_pos_or_error, (PipetteLiquidNotFoundError, PipetteOverpressureError)
384
+ ):
385
+ z_pos = None
386
+ well_volume: Union[
387
+ LiquidTrackingType,
388
+ update_types.ClearType,
389
+ ] = update_types.CLEAR
390
+ else:
391
+ z_pos = z_pos_or_error
392
+ try:
393
+ well_volume = self._state_view.geometry.get_well_volume_at_height(
394
+ labware_id=params.labwareId, well_name=params.wellName, height=z_pos
395
+ )
396
+ except IncompleteLabwareDefinitionError:
397
+ well_volume = update_types.CLEAR
398
+
399
+ state_update.set_liquid_probed(
400
+ labware_id=params.labwareId,
401
+ well_name=params.wellName,
402
+ height=z_pos if z_pos is not None else update_types.CLEAR,
403
+ volume=well_volume,
404
+ last_probed=self._model_utils.get_timestamp(),
405
+ )
406
+ return SuccessData(
407
+ public=TryLiquidProbeResult(
408
+ z_position=z_pos,
409
+ position=deck_point,
410
+ ),
411
+ state_update=state_update,
412
+ )
413
+
414
+
415
+ class LiquidProbe(
416
+ BaseCommand[
417
+ LiquidProbeParams,
418
+ LiquidProbeResult,
419
+ LiquidNotFoundError | StallOrCollisionError | OverpressureError,
420
+ ]
421
+ ):
422
+ """The model for a full `liquidProbe` command."""
423
+
424
+ commandType: LiquidProbeCommandType = "liquidProbe"
425
+ params: LiquidProbeParams
426
+ result: Optional[LiquidProbeResult] = None
427
+
428
+ _ImplementationCls: Type[LiquidProbeImplementation] = LiquidProbeImplementation
429
+
430
+
431
+ class TryLiquidProbe(
432
+ BaseCommand[
433
+ TryLiquidProbeParams,
434
+ TryLiquidProbeResult,
435
+ StallOrCollisionError | OverpressureError,
436
+ ]
437
+ ):
438
+ """The model for a full `tryLiquidProbe` command."""
439
+
440
+ commandType: TryLiquidProbeCommandType = "tryLiquidProbe"
441
+ params: TryLiquidProbeParams
442
+ result: Optional[TryLiquidProbeResult] = None
443
+
444
+ _ImplementationCls: Type[
445
+ TryLiquidProbeImplementation
446
+ ] = TryLiquidProbeImplementation
447
+
448
+
449
+ class LiquidProbeCreate(BaseCommandCreate[LiquidProbeParams]):
450
+ """The request model for a `liquidProbe` command."""
451
+
452
+ commandType: LiquidProbeCommandType = "liquidProbe"
453
+ params: LiquidProbeParams
454
+
455
+ _CommandCls: Type[LiquidProbe] = LiquidProbe
456
+
457
+
458
+ class TryLiquidProbeCreate(BaseCommandCreate[TryLiquidProbeParams]):
459
+ """The request model for a `tryLiquidProbe` command."""
460
+
461
+ commandType: TryLiquidProbeCommandType = "tryLiquidProbe"
462
+ params: TryLiquidProbeParams
463
+
464
+ _CommandCls: Type[TryLiquidProbe] = TryLiquidProbe
@@ -0,0 +1,210 @@
1
+ """Load labware command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type, Any
5
+
6
+ from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+ from typing_extensions import Literal, TypeGuard
9
+
10
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
11
+
12
+ from ..errors import LabwareIsNotAllowedInLocationError
13
+ from ..resources import labware_validation, fixture_validation
14
+ from ..types import (
15
+ LoadableLabwareLocation,
16
+ ModuleLocation,
17
+ ModuleModel,
18
+ OnLabwareLocation,
19
+ DeckSlotLocation,
20
+ AddressableAreaLocation,
21
+ LoadedModule,
22
+ )
23
+
24
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
25
+ from .labware_handling_common import LabwarePositionResultMixin
26
+ from ..errors.error_occurrence import ErrorOccurrence
27
+ from ..state.update_types import StateUpdate
28
+
29
+ if TYPE_CHECKING:
30
+ from ..state.state import StateView
31
+ from ..execution import EquipmentHandler
32
+
33
+
34
+ LoadLabwareCommandType = Literal["loadLabware"]
35
+
36
+
37
+ def _remove_default(s: dict[str, Any]) -> None:
38
+ s.pop("default", None)
39
+
40
+
41
+ class LoadLabwareParams(BaseModel):
42
+ """Payload required to load a labware into a slot."""
43
+
44
+ location: LoadableLabwareLocation = Field(
45
+ ...,
46
+ description="Location the labware should be loaded into.",
47
+ )
48
+ loadName: str = Field(
49
+ ...,
50
+ description="Name used to reference a labware definition.",
51
+ )
52
+ namespace: str = Field(
53
+ ...,
54
+ description="The namespace the labware definition belongs to.",
55
+ )
56
+ version: int = Field(
57
+ ...,
58
+ description="The labware definition version.",
59
+ )
60
+ labwareId: str | SkipJsonSchema[None] = Field(
61
+ None,
62
+ description="An optional ID to assign to this labware. If None, an ID "
63
+ "will be generated.",
64
+ json_schema_extra=_remove_default,
65
+ )
66
+ displayName: str | SkipJsonSchema[None] = Field(
67
+ None,
68
+ description="An optional user-specified display name "
69
+ "or label for this labware.",
70
+ # NOTE: v4/5 JSON protocols will always have a displayName which will be the
71
+ # user-specified label OR the displayName property of the labware's definition.
72
+ # TODO: Make sure v6 JSON protocols don't do that.
73
+ json_schema_extra=_remove_default,
74
+ )
75
+
76
+
77
+ class LoadLabwareResult(LabwarePositionResultMixin):
78
+ """Result data from the execution of a LoadLabware command."""
79
+
80
+ definition: LabwareDefinition = Field(
81
+ ...,
82
+ description="The full definition data for this labware.",
83
+ )
84
+
85
+
86
+ class LoadLabwareImplementation(
87
+ AbstractCommandImpl[LoadLabwareParams, SuccessData[LoadLabwareResult]]
88
+ ):
89
+ """Load labware command implementation."""
90
+
91
+ def __init__(
92
+ self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object
93
+ ) -> None:
94
+ self._equipment = equipment
95
+ self._state_view = state_view
96
+
97
+ def _is_loading_to_module(
98
+ self, location: LoadableLabwareLocation, module_model: ModuleModel
99
+ ) -> TypeGuard[ModuleLocation]:
100
+ if not isinstance(location, ModuleLocation):
101
+ return False
102
+
103
+ module: LoadedModule = self._state_view.modules.get(location.moduleId)
104
+ return module.model == module_model
105
+
106
+ async def execute(
107
+ self, params: LoadLabwareParams
108
+ ) -> SuccessData[LoadLabwareResult]:
109
+ """Load definition and calibration data necessary for a labware."""
110
+ state_update = StateUpdate()
111
+
112
+ # TODO (tz, 8-15-2023): extend column validation to column 1 when working
113
+ # on https://opentrons.atlassian.net/browse/RSS-258 and completing
114
+ # https://opentrons.atlassian.net/browse/RSS-255
115
+ if (
116
+ labware_validation.is_flex_trash(params.loadName)
117
+ and isinstance(params.location, DeckSlotLocation)
118
+ and self._state_view.geometry.get_slot_column(params.location.slotName) != 3
119
+ ):
120
+ raise LabwareIsNotAllowedInLocationError(
121
+ f"{params.loadName} is not allowed in slot {params.location.slotName}"
122
+ )
123
+
124
+ if isinstance(params.location, AddressableAreaLocation):
125
+ area_name = params.location.addressableAreaName
126
+ if not (
127
+ fixture_validation.is_deck_slot(params.location.addressableAreaName)
128
+ or fixture_validation.is_abs_reader(params.location.addressableAreaName)
129
+ ):
130
+ raise LabwareIsNotAllowedInLocationError(
131
+ f"Cannot load {params.loadName} onto addressable area {area_name}"
132
+ )
133
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
134
+ area_name
135
+ )
136
+ state_update.set_addressable_area_used(area_name)
137
+ elif isinstance(params.location, DeckSlotLocation):
138
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
139
+ params.location.slotName.id
140
+ )
141
+ state_update.set_addressable_area_used(params.location.slotName.id)
142
+
143
+ verified_location = self._state_view.geometry.ensure_location_not_occupied(
144
+ params.location
145
+ )
146
+
147
+ loaded_labware = await self._equipment.load_labware(
148
+ load_name=params.loadName,
149
+ namespace=params.namespace,
150
+ version=params.version,
151
+ location=verified_location,
152
+ labware_id=params.labwareId,
153
+ )
154
+
155
+ state_update.set_loaded_labware(
156
+ labware_id=loaded_labware.labware_id,
157
+ offset_id=loaded_labware.offsetId,
158
+ definition=loaded_labware.definition,
159
+ location=verified_location,
160
+ display_name=params.displayName,
161
+ )
162
+
163
+ if isinstance(verified_location, OnLabwareLocation):
164
+ self._state_view.labware.raise_if_labware_cannot_be_stacked(
165
+ top_labware_definition=loaded_labware.definition,
166
+ bottom_labware_id=verified_location.labwareId,
167
+ )
168
+
169
+ # Validate labware for the absorbance reader
170
+ if self._is_loading_to_module(
171
+ params.location, ModuleModel.ABSORBANCE_READER_V1
172
+ ):
173
+ self._state_view.labware.raise_if_labware_incompatible_with_plate_reader(
174
+ loaded_labware.definition
175
+ )
176
+
177
+ self._state_view.labware.raise_if_labware_cannot_be_ondeck(
178
+ location=params.location, labware_definition=loaded_labware.definition
179
+ )
180
+
181
+ return SuccessData(
182
+ public=LoadLabwareResult(
183
+ labwareId=loaded_labware.labware_id,
184
+ definition=loaded_labware.definition,
185
+ offsetId=loaded_labware.offsetId,
186
+ locationSequence=self._state_view.geometry.get_predicted_location_sequence(
187
+ verified_location,
188
+ ),
189
+ ),
190
+ state_update=state_update,
191
+ )
192
+
193
+
194
+ class LoadLabware(BaseCommand[LoadLabwareParams, LoadLabwareResult, ErrorOccurrence]):
195
+ """Load labware command resource model."""
196
+
197
+ commandType: LoadLabwareCommandType = "loadLabware"
198
+ params: LoadLabwareParams
199
+ result: Optional[LoadLabwareResult] = None
200
+
201
+ _ImplementationCls: Type[LoadLabwareImplementation] = LoadLabwareImplementation
202
+
203
+
204
+ class LoadLabwareCreate(BaseCommandCreate[LoadLabwareParams]):
205
+ """Load labware command creation request."""
206
+
207
+ commandType: LoadLabwareCommandType = "loadLabware"
208
+ params: LoadLabwareParams
209
+
210
+ _CommandCls: Type[LoadLabware] = LoadLabware