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,13 @@
1
+ """Protocol engine types to do with liquid handling."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Dict
5
+
6
+
7
+ @dataclass
8
+ class FlowRates:
9
+ """Default and current flow rates for a pipette."""
10
+
11
+ default_blow_out: Dict[str, float]
12
+ default_aspirate: Dict[str, float]
13
+ default_dispense: Dict[str, float]
@@ -0,0 +1,191 @@
1
+ """Protocol Engine types to do with liquid level detection."""
2
+
3
+ from __future__ import annotations
4
+ from dataclasses import dataclass
5
+ from datetime import datetime
6
+ from typing import Optional, List, Any
7
+ from pydantic import BaseModel, model_serializer, model_validator
8
+
9
+
10
+ class SimulatedProbeResult(BaseModel):
11
+ """A sentinel value to substitute for the resulting volume/height of a liquid probe during simulation."""
12
+
13
+ operations_after_probe: List[float] = []
14
+ net_liquid_exchanged_after_probe: float = 0.0
15
+
16
+ @model_serializer
17
+ def serialize_model(self) -> str:
18
+ """Serialize instances of this class as a string."""
19
+ return "SimulatedProbeResult"
20
+
21
+ @model_validator(mode="before")
22
+ @classmethod
23
+ def validate_model(cls, data: object) -> Any:
24
+ """Handle deserializing from a simulated probe result."""
25
+ if isinstance(data, str) and data == "SimulatedProbeResult":
26
+ return {}
27
+ return data
28
+
29
+ def __add__(
30
+ self, other: float | int | SimulatedProbeResult
31
+ ) -> float | SimulatedProbeResult:
32
+ """Bypass addition and just return self."""
33
+ return self
34
+
35
+ def __sub__(
36
+ self, other: float | int | SimulatedProbeResult
37
+ ) -> float | SimulatedProbeResult:
38
+ """Bypass subtraction and just return self."""
39
+ return self
40
+
41
+ def __radd__(
42
+ self, other: float | int | SimulatedProbeResult
43
+ ) -> float | SimulatedProbeResult:
44
+ """Bypass addition and just return self."""
45
+ return self
46
+
47
+ def __rsub__(
48
+ self, other: float | int | SimulatedProbeResult
49
+ ) -> float | SimulatedProbeResult:
50
+ """Bypass subtraction and just return self."""
51
+ return self
52
+
53
+ def __mul__(
54
+ self, other: float | int | SimulatedProbeResult
55
+ ) -> float | SimulatedProbeResult:
56
+ """Bypass multiplication and just return self."""
57
+ return self
58
+
59
+ def __rmul__(
60
+ self, other: float | int | SimulatedProbeResult
61
+ ) -> float | SimulatedProbeResult:
62
+ """Bypass multiplication and just return self."""
63
+ return self
64
+
65
+ def __truediv__(
66
+ self, other: float | int | SimulatedProbeResult
67
+ ) -> float | SimulatedProbeResult:
68
+ """Bypass division and just return self."""
69
+ return self
70
+
71
+ def __rtruediv__(
72
+ self, other: float | int | SimulatedProbeResult
73
+ ) -> float | SimulatedProbeResult:
74
+ """Bypass division and just return self."""
75
+ return self
76
+
77
+ def __pow__(
78
+ self, other: float | int | SimulatedProbeResult
79
+ ) -> float | SimulatedProbeResult:
80
+ """Bypass exponent math and just return self."""
81
+ return self
82
+
83
+ def __rpow__(
84
+ self, other: float | int | SimulatedProbeResult
85
+ ) -> float | SimulatedProbeResult:
86
+ """Bypass exponent math and just return self."""
87
+ return self
88
+
89
+ def __mod__(
90
+ self, other: float | int | SimulatedProbeResult
91
+ ) -> float | SimulatedProbeResult:
92
+ """Bypass modulus and just return self."""
93
+ return self
94
+
95
+ def __rmod__(
96
+ self, other: float | int | SimulatedProbeResult
97
+ ) -> float | SimulatedProbeResult:
98
+ """Bypass modulus and just return self."""
99
+ return self
100
+
101
+ def __floordiv__(
102
+ self, other: float | int | SimulatedProbeResult
103
+ ) -> float | SimulatedProbeResult:
104
+ """Bypass floor division and just return self."""
105
+ return self
106
+
107
+ def __rfloordiv__(
108
+ self, other: float | int | SimulatedProbeResult
109
+ ) -> float | SimulatedProbeResult:
110
+ """Bypass floor division and just return self."""
111
+ return self
112
+
113
+ def __gt__(self, other: float | int | SimulatedProbeResult) -> bool:
114
+ """Bypass 'greater than' and just return self."""
115
+ return True
116
+
117
+ def __lt__(self, other: float | int | SimulatedProbeResult) -> bool:
118
+ """Bypass 'less than' and just return self."""
119
+ return False
120
+
121
+ def __ge__(self, other: float | int | SimulatedProbeResult) -> bool:
122
+ """Bypass 'greater than or eaqual to' and just return self."""
123
+ return True
124
+
125
+ def __le__(self, other: float | int | SimulatedProbeResult) -> bool:
126
+ """Bypass 'less than or equal to' and just return self."""
127
+ return False
128
+
129
+ def __eq__(self, other: object) -> bool:
130
+ """A SimulatedProbeResult should only be equal to the same instance of its class."""
131
+ if not isinstance(other, SimulatedProbeResult):
132
+ return False
133
+ return self is other
134
+
135
+ def __neq__(self, other: object) -> bool:
136
+ """A SimulatedProbeResult should only be equal to the same instance of its class."""
137
+ if not isinstance(other, SimulatedProbeResult):
138
+ return True
139
+ return self is not other
140
+
141
+ def simulate_probed_aspirate_dispense(self, volume: float) -> None:
142
+ """Record the current state of aspirate/dispense calls."""
143
+ self.net_liquid_exchanged_after_probe += volume
144
+ self.operations_after_probe.append(volume)
145
+
146
+
147
+ # Work around https://github.com/pydantic/pydantic/issues/6830 - do not change the order of
148
+ # this union
149
+ LiquidTrackingType = float | SimulatedProbeResult
150
+
151
+
152
+ class LoadedVolumeInfo(BaseModel):
153
+ """A well's liquid volume, initialized by a LoadLiquid, updated by Aspirate and Dispense."""
154
+
155
+ volume: LiquidTrackingType | None = None
156
+ last_loaded: datetime
157
+ operations_since_load: int
158
+
159
+
160
+ class ProbedHeightInfo(BaseModel):
161
+ """A well's liquid height, initialized by a LiquidProbe, cleared by Aspirate and Dispense."""
162
+
163
+ height: LiquidTrackingType | None = None
164
+ last_probed: datetime
165
+
166
+
167
+ class ProbedVolumeInfo(BaseModel):
168
+ """A well's liquid volume, initialized by a LiquidProbe, updated by Aspirate and Dispense."""
169
+
170
+ volume: LiquidTrackingType | None = None
171
+ last_probed: datetime
172
+ operations_since_probe: int
173
+
174
+
175
+ class WellInfoSummary(BaseModel):
176
+ """Payload for a well's liquid info in StateSummary."""
177
+
178
+ labware_id: str
179
+ well_name: str
180
+ loaded_volume: Optional[float] = None
181
+ probed_height: LiquidTrackingType | None = None
182
+ probed_volume: LiquidTrackingType | None = None
183
+
184
+
185
+ @dataclass
186
+ class WellLiquidInfo:
187
+ """Tracked and sensed information about liquid in a well."""
188
+
189
+ probed_height: Optional[ProbedHeightInfo]
190
+ loaded_volume: Optional[LoadedVolumeInfo]
191
+ probed_volume: Optional[ProbedVolumeInfo]
@@ -0,0 +1,194 @@
1
+ """Protocol engine types to deal with locating things on the deck."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Literal, Union, TypeGuard
5
+
6
+ from pydantic import BaseModel, Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+
9
+ from opentrons.types import DeckSlotName, StagingSlotName
10
+
11
+
12
+ class DeckSlotLocation(BaseModel):
13
+ """The location of something placed in a single deck slot."""
14
+
15
+ slotName: DeckSlotName = Field(
16
+ ...,
17
+ description=(
18
+ # This description should be kept in sync with LegacyLabwareOffsetLocation.slotName.
19
+ "A slot on the robot's deck."
20
+ "\n\n"
21
+ 'The plain numbers like `"5"` are for the OT-2,'
22
+ ' and the coordinates like `"C2"` are for the Flex.'
23
+ "\n\n"
24
+ "When you provide one of these values, you can use either style."
25
+ " It will automatically be converted to match the robot."
26
+ "\n\n"
27
+ "When one of these values is returned, it will always match the robot."
28
+ ),
29
+ )
30
+
31
+
32
+ class StagingSlotLocation(BaseModel):
33
+ """The location of something placed in a single staging slot."""
34
+
35
+ slotName: StagingSlotName = Field(
36
+ ...,
37
+ description=(
38
+ # This description should be kept in sync with LegacyLabwareOffsetLocation.slotName.
39
+ "A slot on the robot's staging area."
40
+ "\n\n"
41
+ "These apply only to the Flex. The OT-2 has no staging slots."
42
+ ),
43
+ )
44
+
45
+
46
+ class AddressableAreaLocation(BaseModel):
47
+ """The location of something place in an addressable area. This is a superset of deck slots."""
48
+
49
+ addressableAreaName: str = Field(
50
+ ...,
51
+ description=(
52
+ "The name of the addressable area that you want to use."
53
+ " Valid values are the `id`s of `addressableArea`s in the"
54
+ " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
55
+ ),
56
+ )
57
+
58
+
59
+ class ModuleLocation(BaseModel):
60
+ """The location of something placed atop a hardware module."""
61
+
62
+ moduleId: str = Field(
63
+ ...,
64
+ description="The ID of a loaded module from a prior `loadModule` command.",
65
+ )
66
+
67
+
68
+ class OnLabwareLocation(BaseModel):
69
+ """The location of something placed atop another labware."""
70
+
71
+ labwareId: str = Field(
72
+ ...,
73
+ description="The ID of a loaded Labware from a prior `loadLabware` command.",
74
+ )
75
+
76
+
77
+ class InStackerHopperLocation(BaseModel):
78
+ """The location of a labware in a stacker hopper."""
79
+
80
+ kind: Literal["inStackerHopper"] = "inStackerHopper"
81
+ moduleId: str = Field(
82
+ ..., description="The ID of the stacker in which this labware is."
83
+ )
84
+
85
+
86
+ _OffDeckLocationType = Literal["offDeck"]
87
+ _SystemLocationType = Literal["systemLocation"]
88
+ OFF_DECK_LOCATION: _OffDeckLocationType = "offDeck"
89
+ SYSTEM_LOCATION: _SystemLocationType = "systemLocation"
90
+
91
+
92
+ def labware_location_is_off_deck(
93
+ location: LabwareLocation,
94
+ ) -> TypeGuard[_OffDeckLocationType]:
95
+ """Check if a location is an off deck location."""
96
+ return isinstance(location, str) and location == OFF_DECK_LOCATION
97
+
98
+
99
+ def labware_location_is_system(
100
+ location: LabwareLocation,
101
+ ) -> TypeGuard[_SystemLocationType]:
102
+ """Check if a location is the system location."""
103
+ return isinstance(location, str) and location == SYSTEM_LOCATION
104
+
105
+
106
+ class OnLabwareLocationSequenceComponent(BaseModel):
107
+ """Labware on another labware."""
108
+
109
+ kind: Literal["onLabware"] = "onLabware"
110
+ labwareId: str
111
+ lidId: str | SkipJsonSchema[None] = Field(None)
112
+
113
+
114
+ class OnModuleLocationSequenceComponent(BaseModel):
115
+ """Labware on a module."""
116
+
117
+ kind: Literal["onModule"] = "onModule"
118
+ moduleId: str
119
+
120
+
121
+ class OnAddressableAreaLocationSequenceComponent(BaseModel):
122
+ """Labware on an addressable area."""
123
+
124
+ kind: Literal["onAddressableArea"] = "onAddressableArea"
125
+ addressableAreaName: str
126
+
127
+
128
+ class OnCutoutFixtureLocationSequenceComponent(BaseModel):
129
+ """Something on a deck cutout fixture."""
130
+
131
+ kind: Literal["onCutoutFixture"] = "onCutoutFixture"
132
+ possibleCutoutFixtureIds: list[str]
133
+ cutoutId: str
134
+
135
+
136
+ class NotOnDeckLocationSequenceComponent(BaseModel):
137
+ """Labware on a system location."""
138
+
139
+ kind: Literal["notOnDeck"] = "notOnDeck"
140
+ logicalLocationName: _OffDeckLocationType | _SystemLocationType
141
+
142
+
143
+ LabwareLocationSequence = list[
144
+ OnLabwareLocationSequenceComponent
145
+ | OnModuleLocationSequenceComponent
146
+ | OnAddressableAreaLocationSequenceComponent
147
+ | NotOnDeckLocationSequenceComponent
148
+ | OnCutoutFixtureLocationSequenceComponent
149
+ | InStackerHopperLocation
150
+ ]
151
+ """Labware location specifier."""
152
+
153
+ LabwareLocation = Union[
154
+ DeckSlotLocation,
155
+ ModuleLocation,
156
+ OnLabwareLocation,
157
+ _OffDeckLocationType,
158
+ _SystemLocationType,
159
+ AddressableAreaLocation,
160
+ InStackerHopperLocation,
161
+ ]
162
+ """Union of all locations where it's legal to keep a labware."""
163
+
164
+ LoadableLabwareLocation = Union[
165
+ DeckSlotLocation,
166
+ ModuleLocation,
167
+ OnLabwareLocation,
168
+ _OffDeckLocationType,
169
+ _SystemLocationType,
170
+ AddressableAreaLocation,
171
+ ]
172
+ """Union of all locations where it's legal to load a labware."""
173
+
174
+ OnDeckLabwareLocation = Union[
175
+ DeckSlotLocation, ModuleLocation, OnLabwareLocation, AddressableAreaLocation
176
+ ]
177
+
178
+ NonStackedLocation = Union[
179
+ DeckSlotLocation,
180
+ AddressableAreaLocation,
181
+ ModuleLocation,
182
+ _OffDeckLocationType,
183
+ _SystemLocationType,
184
+ ]
185
+ """Union of all locations where it's legal to keep a labware that can't be stacked on another labware"""
186
+
187
+
188
+ # TODO(mm, 2022-11-07): Deduplicate with Vec3f.
189
+ class DeckPoint(BaseModel):
190
+ """Coordinates of a point in deck space."""
191
+
192
+ x: float
193
+ y: float
194
+ z: float
@@ -0,0 +1,310 @@
1
+ """Protocol engine types to do with modules."""
2
+
3
+ from __future__ import annotations
4
+ from dataclasses import dataclass
5
+ from enum import Enum
6
+ from typing import (
7
+ TypeGuard,
8
+ Literal,
9
+ Optional,
10
+ List,
11
+ Dict,
12
+ Any,
13
+ NamedTuple,
14
+ )
15
+
16
+ from pydantic import BaseModel, Field
17
+ from pydantic.json_schema import SkipJsonSchema
18
+
19
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition, Extents
20
+ from opentrons_shared_data.labware.types import LocatingFeatures
21
+
22
+ from opentrons.hardware_control.modules import (
23
+ ModuleType as ModuleType,
24
+ )
25
+
26
+ from .location import DeckSlotLocation
27
+ from .labware_offset_vector import LabwareOffsetVector
28
+ from .labware_movement import LabwareMovementOffsetData
29
+
30
+
31
+ # TODO(mc, 2022-01-18): use opentrons_shared_data.module.types.ModuleModel
32
+ class ModuleModel(str, Enum):
33
+ """All available modules' models."""
34
+
35
+ TEMPERATURE_MODULE_V1 = "temperatureModuleV1"
36
+ TEMPERATURE_MODULE_V2 = "temperatureModuleV2"
37
+ MAGNETIC_MODULE_V1 = "magneticModuleV1"
38
+ MAGNETIC_MODULE_V2 = "magneticModuleV2"
39
+ THERMOCYCLER_MODULE_V1 = "thermocyclerModuleV1"
40
+ THERMOCYCLER_MODULE_V2 = "thermocyclerModuleV2"
41
+ HEATER_SHAKER_MODULE_V1 = "heaterShakerModuleV1"
42
+ MAGNETIC_BLOCK_V1 = "magneticBlockV1"
43
+ ABSORBANCE_READER_V1 = "absorbanceReaderV1"
44
+ FLEX_STACKER_MODULE_V1 = "flexStackerModuleV1"
45
+
46
+ def as_type(self) -> ModuleType:
47
+ """Get the ModuleType of this model."""
48
+ if ModuleModel.is_temperature_module_model(self):
49
+ return ModuleType.TEMPERATURE
50
+ elif ModuleModel.is_magnetic_module_model(self):
51
+ return ModuleType.MAGNETIC
52
+ elif ModuleModel.is_thermocycler_module_model(self):
53
+ return ModuleType.THERMOCYCLER
54
+ elif ModuleModel.is_heater_shaker_module_model(self):
55
+ return ModuleType.HEATER_SHAKER
56
+ elif ModuleModel.is_magnetic_block(self):
57
+ return ModuleType.MAGNETIC_BLOCK
58
+ elif ModuleModel.is_absorbance_reader(self):
59
+ return ModuleType.ABSORBANCE_READER
60
+ elif ModuleModel.is_flex_stacker(self):
61
+ return ModuleType.FLEX_STACKER
62
+
63
+ assert False, f"Invalid ModuleModel {self}"
64
+
65
+ @classmethod
66
+ def is_temperature_module_model(
67
+ cls, model: ModuleModel
68
+ ) -> TypeGuard[TemperatureModuleModel]:
69
+ """Whether a given model is a Temperature Module."""
70
+ return model in [cls.TEMPERATURE_MODULE_V1, cls.TEMPERATURE_MODULE_V2]
71
+
72
+ @classmethod
73
+ def is_magnetic_module_model(
74
+ cls, model: ModuleModel
75
+ ) -> TypeGuard[MagneticModuleModel]:
76
+ """Whether a given model is a Magnetic Module."""
77
+ return model in [cls.MAGNETIC_MODULE_V1, cls.MAGNETIC_MODULE_V2]
78
+
79
+ @classmethod
80
+ def is_thermocycler_module_model(
81
+ cls, model: ModuleModel
82
+ ) -> TypeGuard[ThermocyclerModuleModel]:
83
+ """Whether a given model is a Thermocycler Module."""
84
+ return model in [cls.THERMOCYCLER_MODULE_V1, cls.THERMOCYCLER_MODULE_V2]
85
+
86
+ @classmethod
87
+ def is_heater_shaker_module_model(
88
+ cls, model: ModuleModel
89
+ ) -> TypeGuard[HeaterShakerModuleModel]:
90
+ """Whether a given model is a Heater-Shaker Module."""
91
+ return model == cls.HEATER_SHAKER_MODULE_V1
92
+
93
+ @classmethod
94
+ def is_magnetic_block(cls, model: ModuleModel) -> TypeGuard[MagneticBlockModel]:
95
+ """Whether a given model is a Magnetic block."""
96
+ return model == cls.MAGNETIC_BLOCK_V1
97
+
98
+ @classmethod
99
+ def is_absorbance_reader(
100
+ cls, model: ModuleModel
101
+ ) -> TypeGuard[AbsorbanceReaderModel]:
102
+ """Whether a given model is an Absorbance Plate Reader."""
103
+ return model == cls.ABSORBANCE_READER_V1
104
+
105
+ @classmethod
106
+ def is_flex_stacker(cls, model: ModuleModel) -> TypeGuard[FlexStackerModuleModel]:
107
+ """Whether a given model is a Flex Stacker.."""
108
+ return model == cls.FLEX_STACKER_MODULE_V1
109
+
110
+
111
+ TemperatureModuleModel = Literal[
112
+ ModuleModel.TEMPERATURE_MODULE_V1, ModuleModel.TEMPERATURE_MODULE_V2
113
+ ]
114
+ MagneticModuleModel = Literal[
115
+ ModuleModel.MAGNETIC_MODULE_V1, ModuleModel.MAGNETIC_MODULE_V2
116
+ ]
117
+ ThermocyclerModuleModel = Literal[
118
+ ModuleModel.THERMOCYCLER_MODULE_V1, ModuleModel.THERMOCYCLER_MODULE_V2
119
+ ]
120
+ HeaterShakerModuleModel = Literal[ModuleModel.HEATER_SHAKER_MODULE_V1]
121
+ MagneticBlockModel = Literal[ModuleModel.MAGNETIC_BLOCK_V1]
122
+ AbsorbanceReaderModel = Literal[ModuleModel.ABSORBANCE_READER_V1]
123
+ FlexStackerModuleModel = Literal[ModuleModel.FLEX_STACKER_MODULE_V1]
124
+
125
+
126
+ class ModuleDimensions(BaseModel):
127
+ """Dimension type for modules."""
128
+
129
+ bareOverallHeight: float
130
+ overLabwareHeight: float
131
+ labwareInterfaceXDimension: Optional[float] = None
132
+ labwareInterfaceYDimension: Optional[float] = None
133
+ lidHeight: Optional[float] = None
134
+ maxStackerFillHeight: Optional[float] = None
135
+ maxStackerRetrievableHeight: Optional[float] = None
136
+
137
+
138
+ # TODO(mm, 2022-11-07): Deduplicate with Vec3f.
139
+ class ModuleCalibrationPoint(BaseModel):
140
+ """Calibration Point type for module definition."""
141
+
142
+ x: float
143
+ y: float
144
+ z: float
145
+
146
+
147
+ # TODO(mm, 2023-04-13): Move to shared-data, so this binding can be maintained alongside the JSON
148
+ # schema that it's sourced from. We already do that for labware definitions and JSON protocols.
149
+
150
+
151
+ # See underlying JSON schema for documentation.
152
+ class ModuleDefinition(BaseModel):
153
+ """A module definition conforming to module definition schema v3."""
154
+
155
+ # Note: This field is misleading.
156
+ #
157
+ # This class only models v3 definitions ("module/schemas/3"), not v2 ("module/schemas/2").
158
+ # labwareOffset is required to have a z-component, for example.
159
+ #
160
+ # When parsing from a schema v3 JSON definition into this model,
161
+ # the definition's `"$otSharedSchema": "module/schemas/3"` field will be thrown away
162
+ # because it has a dollar sign, which doesn't match this field.
163
+ # Then, this field will default to "module/schemas/2", because no value was provided.
164
+ #
165
+ # We should fix this field once Jira RSS-221 is resolved. RSS-221 makes it difficult to fix
166
+ # because robot-server has been storing and loading these bad fields in its database.
167
+ otSharedSchema: str = Field("module/schemas/2", description="The current schema.")
168
+
169
+ moduleType: ModuleType = Field(...)
170
+
171
+ model: ModuleModel = Field(...)
172
+
173
+ labwareOffset: LabwareOffsetVector = Field(...)
174
+
175
+ dimensions: ModuleDimensions = Field(...)
176
+
177
+ calibrationPoint: ModuleCalibrationPoint = Field(
178
+ ...,
179
+ )
180
+
181
+ displayName: str = Field(...)
182
+
183
+ quirks: List[str] = Field(...)
184
+
185
+ # In releases prior to https://github.com/Opentrons/opentrons/pull/11873 (v6.3.0),
186
+ # the matrices in slotTransforms were 3x3.
187
+ # After, they are 4x4, even though there was no schema version bump.
188
+ #
189
+ # Because old objects of this class, with the 3x3 matrices, were stored in robot-server's
190
+ # database, this field needs to stay typed loosely enough to support both sizes.
191
+ # We can fix this once Jira RSS-221 is resolved.
192
+ slotTransforms: Dict[str, Any] = Field(
193
+ ...,
194
+ )
195
+
196
+ compatibleWith: List[ModuleModel] = Field(
197
+ ...,
198
+ )
199
+ gripperOffsets: Optional[Dict[str, LabwareMovementOffsetData]] = Field(
200
+ default_factory=lambda: {},
201
+ )
202
+
203
+ features: LocatingFeatures = Field(
204
+ ...,
205
+ )
206
+
207
+ extents: Extents = Field(
208
+ ...,
209
+ )
210
+
211
+
212
+ class LoadedModule(BaseModel):
213
+ """A module that has been loaded."""
214
+
215
+ id: str
216
+ model: ModuleModel
217
+ location: Optional[DeckSlotLocation] = None
218
+ serialNumber: Optional[str] = None
219
+
220
+
221
+ class SpeedRange(NamedTuple):
222
+ """Minimum and maximum allowed speeds for a shaking module."""
223
+
224
+ min: int
225
+ max: int
226
+
227
+
228
+ class TemperatureRange(NamedTuple):
229
+ """Minimum and maximum allowed temperatures for a heating module."""
230
+
231
+ min: float
232
+ max: float
233
+
234
+
235
+ class HeaterShakerLatchStatus(Enum):
236
+ """Heater-Shaker latch status for determining pipette and labware movement errors."""
237
+
238
+ CLOSED = "closed"
239
+ OPEN = "open"
240
+ UNKNOWN = "unknown"
241
+
242
+
243
+ @dataclass(frozen=True)
244
+ class HeaterShakerMovementRestrictors:
245
+ """Shaking status, latch status and slot location for determining movement restrictions."""
246
+
247
+ plate_shaking: bool
248
+ latch_status: HeaterShakerLatchStatus
249
+ deck_slot: int
250
+
251
+
252
+ ABSMeasureMode = Literal["single", "multi"]
253
+
254
+
255
+ # TODO(mm, 2022-11-07): Deduplicate with Vec3f.
256
+ class ModuleOffsetVector(BaseModel):
257
+ """Offset, in deck coordinates, from nominal to actual position of labware on a module."""
258
+
259
+ x: float
260
+ y: float
261
+ z: float
262
+
263
+
264
+ @dataclass
265
+ class ModuleOffsetData:
266
+ """Module calibration offset data."""
267
+
268
+ moduleOffsetVector: ModuleOffsetVector
269
+ location: DeckSlotLocation
270
+
271
+
272
+ class StackerFillEmptyStrategy(str, Enum):
273
+ """Strategy to use for filling or emptying a stacker."""
274
+
275
+ MANUAL_WITH_PAUSE = "manualWithPause"
276
+ LOGICAL = "logical"
277
+
278
+
279
+ class StackerLabwareMovementStrategy(str, Enum):
280
+ """Strategy to retrieve or store labware."""
281
+
282
+ AUTOMATIC = "automatic"
283
+ MANUAL = "manual"
284
+
285
+
286
+ class StackerStoredLabwareGroup(BaseModel):
287
+ """Represents one group of labware stored in a stacker hopper."""
288
+
289
+ primaryLabwareId: str
290
+ adapterLabwareId: str | SkipJsonSchema[None] = None
291
+ lidLabwareId: str | SkipJsonSchema[None] = None
292
+
293
+
294
+ @dataclass
295
+ class StackerPoolDefinition:
296
+ """Represents an internal configuraiton of stored labware."""
297
+
298
+ primaryLabwareDefinition: LabwareDefinition
299
+ adapterLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = None
300
+ lidLabwareDefinition: LabwareDefinition | SkipJsonSchema[None] = None
301
+
302
+
303
+ class IdentifyColor(str, Enum):
304
+ """Module identify color."""
305
+
306
+ WHITE = "white"
307
+ RED = "red"
308
+ GREEN = "green"
309
+ BLUE = "blue"
310
+ YELLOW = "yellow"