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,154 @@
1
+ """Load lid command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from pydantic import BaseModel, Field
5
+ from typing import TYPE_CHECKING, Optional, Type
6
+ from typing_extensions import Literal
7
+
8
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
9
+
10
+ from ..errors import LabwareCannotBeStackedError, LabwareIsNotAllowedInLocationError
11
+ from ..resources import labware_validation
12
+ from ..types import (
13
+ LoadableLabwareLocation,
14
+ OnLabwareLocation,
15
+ OnLabwareLocationSequenceComponent,
16
+ )
17
+
18
+ from .labware_handling_common import LabwareHandlingResultMixin
19
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
20
+ from ..errors.error_occurrence import ErrorOccurrence
21
+ from ..state.update_types import StateUpdate
22
+
23
+ if TYPE_CHECKING:
24
+ from ..state.state import StateView
25
+ from ..execution import EquipmentHandler
26
+
27
+
28
+ LoadLidCommandType = Literal["loadLid"]
29
+
30
+
31
+ class LoadLidParams(BaseModel):
32
+ """Payload required to load a lid onto a labware."""
33
+
34
+ location: LoadableLabwareLocation = Field(
35
+ ...,
36
+ description="Labware the lid should be loaded onto.",
37
+ )
38
+ loadName: str = Field(
39
+ ...,
40
+ description="Name used to reference a lid labware definition.",
41
+ )
42
+ namespace: str = Field(
43
+ ...,
44
+ description="The namespace the lid labware definition belongs to.",
45
+ )
46
+ version: int = Field(
47
+ ...,
48
+ description="The lid labware definition version.",
49
+ )
50
+
51
+
52
+ class LoadLidResult(LabwareHandlingResultMixin):
53
+ """Result data from the execution of a LoadLabware command."""
54
+
55
+ definition: LabwareDefinition = Field(
56
+ ...,
57
+ description="The full definition data for this lid labware.",
58
+ )
59
+
60
+
61
+ class LoadLidImplementation(
62
+ AbstractCommandImpl[LoadLidParams, SuccessData[LoadLidResult]]
63
+ ):
64
+ """Load lid command implementation."""
65
+
66
+ def __init__(
67
+ self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object
68
+ ) -> None:
69
+ self._equipment = equipment
70
+ self._state_view = state_view
71
+
72
+ async def execute(self, params: LoadLidParams) -> SuccessData[LoadLidResult]:
73
+ """Load definition and calibration data necessary for a lid."""
74
+ if not isinstance(params.location, OnLabwareLocation):
75
+ raise LabwareIsNotAllowedInLocationError(
76
+ "Lid Labware is only allowed to be loaded on top of a labware. Try `load_lid_stack(...)` to load lids without parent labware."
77
+ )
78
+
79
+ verified_location = self._state_view.geometry.ensure_location_not_occupied(
80
+ params.location
81
+ )
82
+ loaded_labware = await self._equipment.load_labware(
83
+ load_name=params.loadName,
84
+ namespace=params.namespace,
85
+ version=params.version,
86
+ location=verified_location,
87
+ labware_id=None,
88
+ )
89
+
90
+ if not labware_validation.validate_definition_is_lid(loaded_labware.definition):
91
+ raise LabwareCannotBeStackedError(
92
+ f"Labware {params.loadName} is not a Lid and cannot be loaded onto {self._state_view.labware.get_display_name(params.location.labwareId)}."
93
+ )
94
+
95
+ state_update = StateUpdate()
96
+
97
+ # In the case of lids being loaded on top of other labware, set the parent labware's lid
98
+ state_update.set_lids(
99
+ parent_labware_ids=[params.location.labwareId],
100
+ lid_ids=[loaded_labware.labware_id],
101
+ )
102
+
103
+ state_update.set_loaded_labware(
104
+ labware_id=loaded_labware.labware_id,
105
+ offset_id=loaded_labware.offsetId,
106
+ definition=loaded_labware.definition,
107
+ location=verified_location,
108
+ display_name=None,
109
+ )
110
+
111
+ if isinstance(verified_location, OnLabwareLocation):
112
+ self._state_view.labware.raise_if_labware_cannot_be_stacked(
113
+ top_labware_definition=loaded_labware.definition,
114
+ bottom_labware_id=verified_location.labwareId,
115
+ )
116
+
117
+ return SuccessData(
118
+ public=LoadLidResult(
119
+ labwareId=loaded_labware.labware_id,
120
+ definition=loaded_labware.definition,
121
+ # Note: the lid is not yet loaded and therefore won't be found as the lid id for the
122
+ # labware onto which we're loading it, so build that part of the location sequence
123
+ # here and then build the rest of the sequence from the parent labware
124
+ locationSequence=[
125
+ OnLabwareLocationSequenceComponent(
126
+ labwareId=params.location.labwareId,
127
+ lidId=loaded_labware.labware_id,
128
+ )
129
+ ]
130
+ + self._state_view.geometry.get_location_sequence(
131
+ params.location.labwareId
132
+ ),
133
+ ),
134
+ state_update=state_update,
135
+ )
136
+
137
+
138
+ class LoadLid(BaseCommand[LoadLidParams, LoadLidResult, ErrorOccurrence]):
139
+ """Load lid command resource model."""
140
+
141
+ commandType: LoadLidCommandType = "loadLid"
142
+ params: LoadLidParams
143
+ result: Optional[LoadLidResult] = None
144
+
145
+ _ImplementationCls: Type[LoadLidImplementation] = LoadLidImplementation
146
+
147
+
148
+ class LoadLidCreate(BaseCommandCreate[LoadLidParams]):
149
+ """Load lid command creation request."""
150
+
151
+ commandType: LoadLidCommandType = "loadLid"
152
+ params: LoadLidParams
153
+
154
+ _CommandCls: Type[LoadLid] = LoadLid
@@ -0,0 +1,272 @@
1
+ """Load lid stack command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from pydantic import BaseModel, Field
5
+ from typing import TYPE_CHECKING, Optional, Type, List, Any
6
+ from pydantic.json_schema import SkipJsonSchema
7
+ from typing_extensions import Literal
8
+
9
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
10
+
11
+ from ..errors import LabwareIsNotAllowedInLocationError, ProtocolEngineError
12
+ from ..resources import fixture_validation, labware_validation
13
+ from ..types import (
14
+ LoadableLabwareLocation,
15
+ SYSTEM_LOCATION,
16
+ OnLabwareLocation,
17
+ DeckSlotLocation,
18
+ AddressableAreaLocation,
19
+ LabwareLocationSequence,
20
+ OnLabwareLocationSequenceComponent,
21
+ )
22
+
23
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
24
+ from ..errors.error_occurrence import ErrorOccurrence
25
+ from ..state.update_types import StateUpdate
26
+
27
+ if TYPE_CHECKING:
28
+ from ..state.state import StateView
29
+ from ..execution import LoadedLabwareData, EquipmentHandler
30
+
31
+
32
+ LoadLidStackCommandType = Literal["loadLidStack"]
33
+
34
+
35
+ def _remove_default(s: dict[str, Any]) -> None:
36
+ s.pop("default", None)
37
+
38
+
39
+ _LID_STACK_PE_LABWARE = "protocol_engine_lid_stack_object"
40
+ _LID_STACK_PE_NAMESPACE = "opentrons"
41
+ _LID_STACK_PE_VERSION = 1
42
+
43
+
44
+ class LoadLidStackParams(BaseModel):
45
+ """Payload required to load a lid stack onto a location."""
46
+
47
+ location: LoadableLabwareLocation = Field(
48
+ ...,
49
+ description="Location the lid stack should be loaded into.",
50
+ )
51
+ loadName: str = Field(
52
+ ...,
53
+ description="Name used to reference a lid labware definition.",
54
+ )
55
+ namespace: str = Field(
56
+ ...,
57
+ description="The namespace the lid labware definition belongs to.",
58
+ )
59
+ version: int = Field(
60
+ ...,
61
+ description="The lid labware definition version.",
62
+ )
63
+ stackLabwareId: str | SkipJsonSchema[None] = Field(
64
+ None,
65
+ description="An optional ID to assign to the lid stack labware object created."
66
+ "If None, an ID will be generated.",
67
+ json_schema_extra=_remove_default,
68
+ )
69
+ labwareIds: List[str] | SkipJsonSchema[None] = Field(
70
+ None,
71
+ description="An optional list of IDs to assign to the lids in the stack."
72
+ "If None, an ID will be generated.",
73
+ json_schema_extra=_remove_default,
74
+ )
75
+ quantity: int = Field(
76
+ ...,
77
+ description="The quantity of lids to load.",
78
+ )
79
+
80
+
81
+ class LoadLidStackResult(BaseModel):
82
+ """Result data from the execution of a LoadLidStack command."""
83
+
84
+ stackLabwareId: str = Field(
85
+ ...,
86
+ description="An ID to reference the lid stack labware object created.",
87
+ )
88
+ labwareIds: List[str] = Field(
89
+ ...,
90
+ description="A list of lid labware IDs to reference the lids in this stack by. The first ID is the bottom of the stack.",
91
+ )
92
+ definition: LabwareDefinition | None = Field(
93
+ ...,
94
+ description="The full definition data for this lid labware.",
95
+ )
96
+ location: LoadableLabwareLocation = Field(
97
+ ..., description="The Location that the stack of lid labware has been loaded."
98
+ )
99
+ lidStackDefinition: LabwareDefinition | None = Field(
100
+ None,
101
+ description="The definition of the lid stack object. Optional for backwards-compatibility.",
102
+ )
103
+ stackLocationSequence: LabwareLocationSequence | None = Field(
104
+ None,
105
+ description="The location sequence for the lid stack labware object created.",
106
+ )
107
+ locationSequences: List[LabwareLocationSequence] | None = Field(
108
+ None,
109
+ description="The location sequences for the lids just loaded into the stack. These are in the same order as labwareIds.",
110
+ )
111
+
112
+
113
+ class LoadLidStackImplementation(
114
+ AbstractCommandImpl[LoadLidStackParams, SuccessData[LoadLidStackResult]]
115
+ ):
116
+ """Load lid stack command implementation."""
117
+
118
+ def __init__(
119
+ self, equipment: EquipmentHandler, state_view: StateView, **kwargs: object
120
+ ) -> None:
121
+ self._equipment = equipment
122
+ self._state_view = state_view
123
+
124
+ def _validate_location(self, params: LoadLidStackParams) -> LoadableLabwareLocation:
125
+ if isinstance(params.location, AddressableAreaLocation):
126
+ area_name = params.location.addressableAreaName
127
+ if not (
128
+ fixture_validation.is_deck_slot(params.location.addressableAreaName)
129
+ or fixture_validation.is_abs_reader(params.location.addressableAreaName)
130
+ ):
131
+ raise LabwareIsNotAllowedInLocationError(
132
+ f"Cannot load {params.loadName} onto addressable area {area_name}"
133
+ )
134
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
135
+ area_name
136
+ )
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
+ if params.quantity <= 0 and params.location != SYSTEM_LOCATION:
142
+ raise ProtocolEngineError(
143
+ message="Lid Stack Labware Object with quantity 0 must be loaded onto System Location."
144
+ )
145
+ return self._state_view.geometry.ensure_location_not_occupied(params.location)
146
+
147
+ def _format_results(
148
+ self,
149
+ verified_location: LoadableLabwareLocation,
150
+ lid_stack_object: LoadedLabwareData,
151
+ loaded_lid_labwares: list[LoadedLabwareData],
152
+ lid_labware_definition: LabwareDefinition | None,
153
+ ) -> SuccessData[LoadLidStackResult]:
154
+ stack_location_sequence = (
155
+ self._state_view.geometry.get_predicted_location_sequence(verified_location)
156
+ )
157
+ loaded_lid_locations_by_id: dict[str, OnLabwareLocation] = {}
158
+ loaded_lid_ids_ordered: list[str] = []
159
+ loaded_lid_location_sequences_ordered: list[LabwareLocationSequence] = []
160
+ lid_location_sequence_accumulated: LabwareLocationSequence = [
161
+ OnLabwareLocationSequenceComponent(
162
+ labwareId=lid_stack_object.labware_id, lidId=None
163
+ )
164
+ ] + stack_location_sequence
165
+ load_location = OnLabwareLocation(labwareId=lid_stack_object.labware_id)
166
+ last_lid_id: str | None = None
167
+ for loaded_lid in loaded_lid_labwares:
168
+ loaded_lid_locations_by_id[loaded_lid.labware_id] = load_location
169
+ loaded_lid_ids_ordered.append(loaded_lid.labware_id)
170
+ if last_lid_id is None:
171
+ last_lid_id = loaded_lid.labware_id
172
+ else:
173
+ lid_location_sequence_accumulated = [
174
+ OnLabwareLocationSequenceComponent(
175
+ labwareId=last_lid_id, lidId=None
176
+ )
177
+ ] + lid_location_sequence_accumulated
178
+ last_lid_id = loaded_lid.labware_id
179
+ loaded_lid_location_sequences_ordered.append(
180
+ [loc for loc in lid_location_sequence_accumulated]
181
+ )
182
+ load_location = OnLabwareLocation(labwareId=loaded_lid.labware_id)
183
+
184
+ state_update = StateUpdate()
185
+ state_update.set_loaded_lid_stack(
186
+ stack_id=lid_stack_object.labware_id,
187
+ stack_object_definition=lid_stack_object.definition,
188
+ stack_location=verified_location,
189
+ locations=loaded_lid_locations_by_id,
190
+ labware_definition=lid_labware_definition,
191
+ )
192
+
193
+ return SuccessData(
194
+ public=LoadLidStackResult(
195
+ stackLabwareId=lid_stack_object.labware_id,
196
+ lidStackDefinition=lid_stack_object.definition,
197
+ labwareIds=loaded_lid_ids_ordered,
198
+ definition=lid_labware_definition,
199
+ location=verified_location,
200
+ stackLocationSequence=stack_location_sequence,
201
+ locationSequences=loaded_lid_location_sequences_ordered,
202
+ ),
203
+ state_update=state_update,
204
+ )
205
+
206
+ async def execute(
207
+ self, params: LoadLidStackParams
208
+ ) -> SuccessData[LoadLidStackResult]:
209
+ """Load definition and calibration data necessary for a lid stack."""
210
+ verified_location = self._validate_location(params)
211
+
212
+ lid_stack_object = await self._equipment.load_labware(
213
+ load_name=_LID_STACK_PE_LABWARE,
214
+ namespace=_LID_STACK_PE_NAMESPACE,
215
+ version=_LID_STACK_PE_VERSION,
216
+ location=verified_location,
217
+ labware_id=params.stackLabwareId,
218
+ )
219
+
220
+ if not labware_validation.validate_definition_is_system(
221
+ lid_stack_object.definition
222
+ ):
223
+ raise ProtocolEngineError(
224
+ message="Lid Stack Labware Object Labware Definition does not contain required allowed role 'system'."
225
+ )
226
+
227
+ loaded_lid_labwares: list[LoadedLabwareData] = []
228
+ lid_labware_definition: LabwareDefinition | None = None
229
+
230
+ if params.quantity > 0:
231
+ loaded_lid_labwares = await self._equipment.load_lids(
232
+ load_name=params.loadName,
233
+ namespace=params.namespace,
234
+ version=params.version,
235
+ location=OnLabwareLocation(labwareId=lid_stack_object.labware_id),
236
+ quantity=params.quantity,
237
+ labware_ids=params.labwareIds,
238
+ )
239
+ lid_labware_definition = loaded_lid_labwares[-1].definition
240
+ if isinstance(verified_location, OnLabwareLocation):
241
+ self._state_view.labware.raise_if_labware_cannot_be_stacked(
242
+ top_labware_definition=lid_labware_definition,
243
+ bottom_labware_id=verified_location.labwareId,
244
+ )
245
+
246
+ return self._format_results(
247
+ verified_location,
248
+ lid_stack_object,
249
+ loaded_lid_labwares,
250
+ lid_labware_definition,
251
+ )
252
+
253
+
254
+ class LoadLidStack(
255
+ BaseCommand[LoadLidStackParams, LoadLidStackResult, ErrorOccurrence]
256
+ ):
257
+ """Load lid stack command resource model."""
258
+
259
+ commandType: LoadLidStackCommandType = "loadLidStack"
260
+ params: LoadLidStackParams
261
+ result: Optional[LoadLidStackResult] = None
262
+
263
+ _ImplementationCls: Type[LoadLidStackImplementation] = LoadLidStackImplementation
264
+
265
+
266
+ class LoadLidStackCreate(BaseCommandCreate[LoadLidStackParams]):
267
+ """Load lid stack command creation request."""
268
+
269
+ commandType: LoadLidStackCommandType = "loadLidStack"
270
+ params: LoadLidStackParams
271
+
272
+ _CommandCls: Type[LoadLidStack] = LoadLidStack
@@ -0,0 +1,95 @@
1
+ """Load liquid command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+ from pydantic import BaseModel, Field
4
+ from typing import Optional, Type, Dict, TYPE_CHECKING
5
+ from typing_extensions import Literal
6
+
7
+ from opentrons.protocol_engine.state.update_types import StateUpdate
8
+ from opentrons.protocol_engine.types import LiquidId
9
+ from opentrons.protocol_engine.errors import InvalidLiquidError
10
+
11
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
12
+ from ..errors.error_occurrence import ErrorOccurrence
13
+
14
+ if TYPE_CHECKING:
15
+ from ..state.state import StateView
16
+ from ..resources import ModelUtils
17
+
18
+ LoadLiquidCommandType = Literal["loadLiquid"]
19
+
20
+
21
+ class LoadLiquidParams(BaseModel):
22
+ """Payload required to load a liquid into a well."""
23
+
24
+ liquidId: LiquidId = Field(
25
+ ...,
26
+ description="Unique identifier of the liquid to load. If this is the sentinel value EMPTY, all values of volumeByWell must be 0.",
27
+ )
28
+ labwareId: str = Field(
29
+ ...,
30
+ description="Unique identifier of labware to load liquid into.",
31
+ )
32
+ volumeByWell: Dict[str, float] = Field(
33
+ ...,
34
+ description="Volume of liquid, in µL, loaded into each well by name, in this labware. If the liquid id is the sentinel value EMPTY, all volumes must be 0.",
35
+ )
36
+
37
+
38
+ class LoadLiquidResult(BaseModel):
39
+ """Result data from the execution of a LoadLiquid command."""
40
+
41
+ pass
42
+
43
+
44
+ class LoadLiquidImplementation(
45
+ AbstractCommandImpl[LoadLiquidParams, SuccessData[LoadLiquidResult]]
46
+ ):
47
+ """Load liquid command implementation."""
48
+
49
+ def __init__(
50
+ self, state_view: StateView, model_utils: ModelUtils, **kwargs: object
51
+ ) -> None:
52
+ self._state_view = state_view
53
+ self._model_utils = model_utils
54
+
55
+ async def execute(self, params: LoadLiquidParams) -> SuccessData[LoadLiquidResult]:
56
+ """Load data necessary for a liquid."""
57
+ self._state_view.liquid.validate_liquid_id(params.liquidId)
58
+
59
+ self._state_view.labware.validate_liquid_allowed_in_labware(
60
+ labware_id=params.labwareId, wells=params.volumeByWell
61
+ )
62
+ if params.liquidId == "EMPTY":
63
+ for well_name, volume in params.volumeByWell.items():
64
+ if volume != 0.0:
65
+ raise InvalidLiquidError(
66
+ 'loadLiquid commands that specify the special liquid "EMPTY" must set volume to be 0.0, but the volume for {well_name} is {volume}'
67
+ )
68
+
69
+ state_update = StateUpdate()
70
+ state_update.set_liquid_loaded(
71
+ labware_id=params.labwareId,
72
+ volumes=params.volumeByWell,
73
+ last_loaded=self._model_utils.get_timestamp(),
74
+ )
75
+
76
+ return SuccessData(public=LoadLiquidResult(), state_update=state_update)
77
+
78
+
79
+ class LoadLiquid(BaseCommand[LoadLiquidParams, LoadLiquidResult, ErrorOccurrence]):
80
+ """Load liquid command resource model."""
81
+
82
+ commandType: LoadLiquidCommandType = "loadLiquid"
83
+ params: LoadLiquidParams
84
+ result: Optional[LoadLiquidResult] = None
85
+
86
+ _ImplementationCls: Type[LoadLiquidImplementation] = LoadLiquidImplementation
87
+
88
+
89
+ class LoadLiquidCreate(BaseCommandCreate[LoadLiquidParams]):
90
+ """Load liquid command creation request."""
91
+
92
+ commandType: LoadLiquidCommandType = "loadLiquid"
93
+ params: LoadLiquidParams
94
+
95
+ _CommandCls: Type[LoadLiquid] = LoadLiquid
@@ -0,0 +1,144 @@
1
+ """LoadLiquidClass stores the liquid class settings used for a transfer into the Protocol Engine."""
2
+ from __future__ import annotations
3
+
4
+ from typing import Optional, Type, TYPE_CHECKING, Any
5
+
6
+ from typing_extensions import Literal
7
+ from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
9
+
10
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
11
+ from ..errors import LiquidClassDoesNotExistError
12
+ from ..errors.error_occurrence import ErrorOccurrence
13
+ from ..errors.exceptions import LiquidClassRedefinitionError
14
+ from ..state.update_types import LiquidClassLoadedUpdate, StateUpdate
15
+ from ..types import LiquidClassRecord
16
+
17
+ if TYPE_CHECKING:
18
+ from ..state.state import StateView
19
+ from ..resources import ModelUtils
20
+
21
+ LoadLiquidClassCommandType = Literal["loadLiquidClass"]
22
+
23
+
24
+ def _remove_default(s: dict[str, Any]) -> None:
25
+ s.pop("default", None)
26
+
27
+
28
+ class LoadLiquidClassParams(BaseModel):
29
+ """The liquid class transfer properties to store."""
30
+
31
+ liquidClassId: str | SkipJsonSchema[None] = Field(
32
+ None,
33
+ description="Unique identifier for the liquid class to store. "
34
+ "If you do not supply a liquidClassId, we will generate one.",
35
+ json_schema_extra=_remove_default,
36
+ )
37
+ liquidClassRecord: LiquidClassRecord = Field(
38
+ ...,
39
+ description="The liquid class to store.",
40
+ )
41
+
42
+
43
+ class LoadLiquidClassResult(BaseModel):
44
+ """Result from execution of LoadLiquidClass command."""
45
+
46
+ liquidClassId: str = Field(
47
+ ...,
48
+ description="The ID for the liquid class that was loaded, either the one you "
49
+ "supplied or the one we generated.",
50
+ )
51
+
52
+
53
+ class LoadLiquidClassImplementation(
54
+ AbstractCommandImpl[LoadLiquidClassParams, SuccessData[LoadLiquidClassResult]]
55
+ ):
56
+ """Load Liquid Class command implementation."""
57
+
58
+ def __init__(
59
+ self, state_view: StateView, model_utils: ModelUtils, **kwargs: object
60
+ ) -> None:
61
+ self._state_view = state_view
62
+ self._model_utils = model_utils
63
+
64
+ async def execute(
65
+ self, params: LoadLiquidClassParams
66
+ ) -> SuccessData[LoadLiquidClassResult]:
67
+ """Store the liquid class in the Protocol Engine."""
68
+ liquid_class_id: Optional[str]
69
+ already_loaded = False
70
+
71
+ if params.liquidClassId:
72
+ liquid_class_id = params.liquidClassId
73
+ if self._liquid_class_id_already_loaded(
74
+ liquid_class_id, params.liquidClassRecord
75
+ ):
76
+ already_loaded = True
77
+ else:
78
+ liquid_class_id = (
79
+ self._state_view.liquid_classes.get_id_for_liquid_class_record(
80
+ params.liquidClassRecord
81
+ ) # if liquidClassRecord was already loaded, reuse the existing ID
82
+ )
83
+ if liquid_class_id:
84
+ already_loaded = True
85
+ else:
86
+ liquid_class_id = self._model_utils.generate_id()
87
+
88
+ if already_loaded:
89
+ state_update = StateUpdate() # liquid class already loaded, do nothing
90
+ else:
91
+ state_update = StateUpdate(
92
+ liquid_class_loaded=LiquidClassLoadedUpdate(
93
+ liquid_class_id=liquid_class_id,
94
+ liquid_class_record=params.liquidClassRecord,
95
+ )
96
+ )
97
+
98
+ return SuccessData(
99
+ public=LoadLiquidClassResult(liquidClassId=liquid_class_id),
100
+ state_update=state_update,
101
+ )
102
+
103
+ def _liquid_class_id_already_loaded(
104
+ self, liquid_class_id: str, liquid_class_record: LiquidClassRecord
105
+ ) -> bool:
106
+ """Check if the liquid_class_id has already been loaded.
107
+
108
+ If it has, make sure that liquid_class_record matches the previously loaded definition.
109
+ """
110
+ try:
111
+ existing_liquid_class_record = self._state_view.liquid_classes.get(
112
+ liquid_class_id
113
+ )
114
+ except LiquidClassDoesNotExistError:
115
+ return False
116
+
117
+ if liquid_class_record != existing_liquid_class_record:
118
+ raise LiquidClassRedefinitionError(
119
+ f"Liquid class {liquid_class_id} conflicts with previously loaded definition."
120
+ )
121
+ return True
122
+
123
+
124
+ class LoadLiquidClass(
125
+ BaseCommand[LoadLiquidClassParams, LoadLiquidClassResult, ErrorOccurrence]
126
+ ):
127
+ """Load Liquid Class command resource model."""
128
+
129
+ commandType: LoadLiquidClassCommandType = "loadLiquidClass"
130
+ params: LoadLiquidClassParams
131
+ result: Optional[LoadLiquidClassResult] = None
132
+
133
+ _ImplementationCls: Type[
134
+ LoadLiquidClassImplementation
135
+ ] = LoadLiquidClassImplementation
136
+
137
+
138
+ class LoadLiquidClassCreate(BaseCommandCreate[LoadLiquidClassParams]):
139
+ """Load Liquid Class command creation request."""
140
+
141
+ commandType: LoadLiquidClassCommandType = "loadLiquidClass"
142
+ params: LoadLiquidClassParams
143
+
144
+ _CommandCls: Type[LoadLiquidClass] = LoadLiquidClass