diff --git a/.github/workflows/app-test-build-deploy.yaml b/.github/workflows/app-test-build-deploy.yaml index 878a875bdfc..79a234eba14 100644 --- a/.github/workflows/app-test-build-deploy.yaml +++ b/.github/workflows/app-test-build-deploy.yaml @@ -96,7 +96,7 @@ jobs: backend-unit-test: strategy: matrix: - os: ['windows-2022', 'ubuntu-22.04', 'macos-11'] + os: ['windows-2022', 'ubuntu-22.04', 'macos-latest'] name: 'opentrons app backend unit tests on ${{matrix.os}}' runs-on: ${{ matrix.os }} steps: @@ -184,36 +184,57 @@ jobs: echo "both develop builds for edge" echo 'variants=["release", "internal-release"]' >> $GITHUB_OUTPUT echo 'type=develop' >> $GITHUB_OUTPUT - elif [ "${{ format('{0}', endsWith(github.ref, 'app-build-internal')) }}" = "true" ] ; then - echo "internal-release builds for app-build-internal suffixes" + elif [ "${{ format('{0}', contains(github.ref, 'app-build-internal')) }}" = "true" ] ; then + echo 'variants=["internal-release"]' >> $GITHUB_OUTPUT - echo 'type=develop' >> $GITHUB_OUTPUT - elif [ "${{ format('{0}', endsWith(github.ref, 'app-build')) }}" = "true" ] ; then - echo "release develop builds for app-build suffixes" + if [ "${{ format('{0}', contains(github.ref, 'as-release')) }}" = "true" ] ; then + echo "internal-release as-release builds for app-build-internal + as-release suffixes" + echo 'type=as-release' >> $GITHUB_OUTPUT + else + echo "internal-release develop builds for app-build-internal suffixes" + echo 'type=develop' >> $GITHUB_OUTPUT + fi + elif [ "${{ format('{0}', contains(github.ref, 'app-build')) }}" = "true" ] ; then echo 'variants=["release"]' >> $GITHUB_OUTPUT - echo 'type=develop' >> $GITHUB_OUTPUT - elif [ "${{ format('{0}', endsWith(github.ref, 'app-build-both')) }}" = "true" ] ; then - echo "Both develop builds for app-build-both suffixes" + if [ "${{ format('{0}', contains(github.ref, 'as-release')) }}" = "true" ] ; then + echo "release as-release builds for app-build + as-release suffixes" + echo 'type=as-release' >> $GITHUB_OUTPUT + else + echo "release develop builds for app-build suffixes" + echo 'type=develop' >> $GITHUB_OUTPUT + fi + elif [ "${{ format('{0}', contains(github.ref, 'app-build-both')) }}" = "true" ] ; then + echo 'variants=["release", "internal-release"]' >> $GITHUB_OUTPUT - echo 'type=develop' >> $GITHUB_OUTPUT + if [ "${{ format('{0}', contains(github.ref, 'as-release')) }}" = "true" ] ; then + echo "Both as-release builds for app-build-both + as-release suffixes" + echo 'type=as-release' >> $GITHUB_OUTPUT + else + echo "Both develop builds for app-build-both + as-release suffixes" + echo 'type=develop' >> $GITHUB_OUTPUT + fi else echo "No build for ref ${{github.ref}} and event ${{github.event_type}}" echo 'variants=[]' >> $GITHUB_OUTPUT echo 'type=develop' >> $GITHUB_OUTPUT fi + - name: set summary + run: | + echo 'Type: ${{steps.determine-build-type.outputs.type}} Variants: ${{steps.determine-build-type.outputs.variants}}' >> $GITHUB_STEP_SUMMARY + build-app: needs: [determine-build-type] if: needs.determine-build-type.outputs.variants != '[]' strategy: matrix: - os: ['windows-2022', 'ubuntu-22.04', 'macos-11'] + os: ['windows-2022', 'ubuntu-22.04', 'macos-latest'] variant: ${{fromJSON(needs.determine-build-type.outputs.variants)}} target: ['desktop', 'odd'] exclude: - os: 'windows-2022' target: 'odd' - - os: 'macos-11' + - os: 'macos-latest' target: 'odd' runs-on: ${{ matrix.os }} @@ -276,6 +297,34 @@ jobs: npm config set cache ${{ github.workspace }}/.npm-cache yarn config set cache-folder ${{ github.workspace }}/.yarn-cache make setup-js + + - name: 'Configure Windows code signing environment' + if: startsWith(matrix.os, 'windows') && contains(needs.determine-build-type.outputs.type, 'release') + shell: bash + run: | + echo "${{ secrets.SM_CLIENT_CERT_FILE_B64 }}" | base64 --decode > /d/Certificate_pkcs12.p12 + echo "${{ secrets.WINDOWS_CSC_B64}}" | base64 --decode > /d/opentrons_labworks_inc.crt + echo "C:\Program Files (x86)\Windows Kits\10\App Certification Kit" >> $GITHUB_PATH + echo "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools" >> $GITHUB_PATH + echo "C:\Program Files\DigiCert\DigiCert Keylocker Tools" >> $GITHUB_PATH + + - name: 'Setup Windows code signing helpers' + if: startsWith(matrix.os, 'windows') && contains(needs.determine-build-type.outputs.type, 'release') + shell: cmd + env: + SM_HOST: ${{ secrets.SM_HOST }} + SM_CLIENT_CERT_FILE: "D:\\Certificate_pkcs12.p12" + SM_CLIENT_CERT_PASSWORD: ${{secrets.SM_CLIENT_CERT_PASSWORD}} + SM_API_KEY: ${{secrets.SM_API_KEY}} + run: | + curl -X GET https://one.digicert.com/signingmanager/api-ui/v1/releases/Keylockertools-windows-x64.msi/download -H "x-api-key:${{secrets.SM_API_KEY}}" -o Keylockertools-windows-x64.msi + msiexec /i Keylockertools-windows-x64.msi /quiet /qn + smksp_registrar.exe list + smctl.exe keypair ls + C:\Windows\System32\certutil.exe -csp "DigiCert Signing Manager KSP" -key -user + smksp_cert_sync.exe + smctl.exe healthcheck --all + # build the desktop app and deploy it - name: 'build ${{matrix.variant}} app for ${{ matrix.os }}' if: matrix.target == 'desktop' @@ -283,8 +332,14 @@ jobs: env: OT_APP_MIXPANEL_ID: ${{ secrets.OT_APP_MIXPANEL_ID }} OT_APP_INTERCOM_ID: ${{ secrets.OT_APP_INTERCOM_ID }} - WIN_CSC_LINK: ${{ secrets.OT_APP_CSC_WINDOWS }} - WIN_CSC_KEY_PASSWORD: ${{ secrets.OT_APP_CSC_KEY_WINDOWS }} + WINDOWS_SIGN: ${{ format('{0}', contains(needs.determine-build-type.outputs.type, 'release')) }} + SM_HOST: ${{secrets.SM_HOST}} + SM_CLIENT_CERT_FILE: "D:\\Certificate_pkcs12.p12" + SM_CLIENT_CERT_PASSWORD: ${{secrets.SM_CLIENT_CERT_PASSWORD}} + SM_API_KEY: ${{secrets.SM_API_KEY}} + SM_CODE_SIGNING_CERT_SHA1_HASH: ${{secrets.SM_CODE_SIGNING_CERT_SHA1_HASH}} + SM_KEYPAIR_ALIAS: ${{secrets.SM_KEYPAIR_ALIAS}} + WINDOWS_CSC_FILEPATH: "D:\\opentrons_labworks_inc.crt" CSC_LINK: ${{ secrets.OT_APP_CSC_MACOS }} CSC_KEY_PASSWORD: ${{ secrets.OT_APP_CSC_KEY_MACOS }} APPLE_ID: ${{ secrets.OT_APP_APPLE_ID }} diff --git a/api/Pipfile b/api/Pipfile index e37e6e1c5f9..c59151f98e6 100755 --- a/api/Pipfile +++ b/api/Pipfile @@ -11,7 +11,7 @@ opentrons-shared-data = { editable = true, path = "../shared-data/python" } opentrons = { editable = true, path = "." } opentrons-hardware = { editable = true, path = "./../hardware", extras=["FLEX"] } numpy = "==1.22.3" -pyusb = "==1.2.1" +packaging = "==21.3" [dev-packages] # atomicwrites and colorama are pytest dependencies on windows, diff --git a/api/Pipfile.lock b/api/Pipfile.lock index b08815e2656..ce61a48fc72 100644 --- a/api/Pipfile.lock +++ b/api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8a1eb02e26b3ae9d690880546729375c7b74c8e53a8f1806eefdbeac5829dc67" + "sha256": "e1976802bb86d5fd07ba0b89826c63033785fb7d3a45bebcf638cd3555bdc1ec" }, "pipfile-spec": 6, "requires": {}, @@ -179,11 +179,12 @@ }, "packaging": { "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" ], - "markers": "python_version >= '3.7'", - "version": "==24.0" + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==21.3" }, "pydantic": { "hashes": [ @@ -228,6 +229,14 @@ "markers": "python_version >= '3.7'", "version": "==1.10.12" }, + "pyparsing": { + "hashes": [ + "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + ], + "markers": "python_full_version >= '3.6.8'", + "version": "==3.1.2" + }, "pyrsistent": { "hashes": [ "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", @@ -278,6 +287,7 @@ "sha256:6ad50f4613289f3c4d276b6d2ac8901d776dcb929994cce93f55a69e858c595f", "sha256:7eea9b81b0ff908000a825db024313f622895bd578e8a17433e0474cd7d2da83" ], + "markers": "python_version >= '3.7'", "version": "==4.2.2" }, "pyusb": { @@ -291,11 +301,11 @@ }, "setuptools": { "hashes": [ - "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", - "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], "markers": "python_version >= '3.8'", - "version": "==69.5.1" + "version": "==70.0.0" }, "sniffio": { "hashes": [ @@ -307,11 +317,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a", + "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.1" }, "wrapt": { "hashes": [ @@ -425,11 +435,11 @@ }, "backports.tarfile": { "hashes": [ - "sha256:73e0179647803d3726d82e76089d01d8549ceca9bace469953fcb4d97cf2d417", - "sha256:9c2ef9696cb73374f7164e17fc761389393ca76777036f5aad42e8b93fcd8009" + "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" ], "markers": "python_version < '3.12'", - "version": "==1.1.1" + "version": "==1.2.0" }, "black": { "hashes": [ @@ -463,11 +473,11 @@ }, "certifi": { "hashes": [ - "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", - "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" ], "markers": "python_version >= '3.6'", - "version": "==2024.2.2" + "version": "==2024.6.2" }, "charset-normalizer": { "hashes": [ @@ -772,51 +782,51 @@ }, "fonttools": { "hashes": [ - "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636", - "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce", - "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f", - "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1", - "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc", - "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f", - "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e", - "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716", - "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15", - "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77", - "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034", - "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba", - "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7", - "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55", - "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a", - "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0", - "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b", - "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671", - "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a", - "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039", - "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74", - "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836", - "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2", - "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308", - "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2", - "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5", - "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1", - "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438", - "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74", - "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f", - "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097", - "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e", - "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037", - "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1", - "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051", - "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b", - "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed", - "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68", - "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14", - "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5", - "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e", - "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936" + "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d", + "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64", + "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2", + "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4", + "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6", + "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b", + "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f", + "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380", + "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e", + "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749", + "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20", + "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0", + "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4", + "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5", + "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206", + "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9", + "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac", + "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1", + "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce", + "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4", + "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12", + "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca", + "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d", + "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068", + "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796", + "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec", + "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea", + "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f", + "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005", + "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2", + "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06", + "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109", + "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002", + "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9", + "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a", + "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68", + "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6", + "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161", + "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd", + "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d", + "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee", + "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af" ], "markers": "python_version >= '3.8'", - "version": "==4.51.0" + "version": "==4.53.0" }, "gprof2dot": { "hashes": [ @@ -1272,11 +1282,12 @@ }, "packaging": { "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" ], - "markers": "python_version >= '3.7'", - "version": "==24.0" + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==21.3" }, "pathspec": { "hashes": [ @@ -1367,19 +1378,19 @@ }, "pkginfo": { "hashes": [ - "sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097" + "sha256:6d4998d1cd42c297af72cc0eab5f5bab1d356fb8a55b828fa914173f8bc1ba05", + "sha256:dba885aa82e31e80d615119874384923f4e011c2a39b0c4b7104359e36cb7087" ], - "markers": "python_version >= '3.6'", - "version": "==1.10.0" + "markers": "python_version >= '3.8'", + "version": "==1.11.0" }, "platformdirs": { "hashes": [ - "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", - "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.1" + "version": "==4.2.2" }, "pluggy": { "hashes": [ @@ -1529,12 +1540,12 @@ }, "pytest-asyncio": { "hashes": [ - "sha256:68516fdd1018ac57b846c9846b954f0393b26f094764a28c955eabb0536a4e8a", - "sha256:ffe523a89c1c222598c76856e76852b787504ddb72dd5d9b6617ffa8aa2cde5f" + "sha256:009b48127fbe44518a547bddd25611551b0e43ccdbf1e67d12479f569832c20b", + "sha256:5f5c72948f4c49e7db4f29f2521d4031f1c27f86e57b046126654083d4770268" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.23.6" + "version": "==0.23.7" }, "pytest-cov": { "hashes": [ @@ -1585,7 +1596,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "readme-renderer": { @@ -1598,11 +1609,11 @@ }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], - "markers": "python_version >= '3.7'", - "version": "==2.31.0" + "markers": "python_version >= '3.8'", + "version": "==2.32.3" }, "requests-toolbelt": { "hashes": [ @@ -1633,7 +1644,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "snowballstemmer": { @@ -1784,11 +1795,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:6024b58b69089e5a89c347397254e35f1bf02a907728ec7fee9bf0fe837d203a", + "sha256:915f5e35ff76f56588223f15fdd5938f9a1cf9195c0de25130c627e4d597f6d1" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.1" }, "urllib3": { "hashes": [ @@ -1809,11 +1820,11 @@ }, "zipp": { "hashes": [ - "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", - "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" + "sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091", + "sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f" ], "markers": "python_version >= '3.8'", - "version": "==3.18.1" + "version": "==3.19.1" } } } diff --git a/api/release-notes.md b/api/release-notes.md index 737b4063c9c..a86a9fccf2e 100644 --- a/api/release-notes.md +++ b/api/release-notes.md @@ -6,6 +6,28 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr --- +## Opentrons Robot Software Changes in 7.5.0 + +Welcome to the v7.5.0 release of the Opentrons robot software! + +This release adds support for the latest Flex Gripper hardware and the [Opentrons Flex HEPA/UV Module](https://opentrons.com/products/opentrons-flex-hepa-uv-module). + +### Bug Fixes + +- Fixed certain string runtime parameter values being misinterpreted as an incorrect type. + +--- + +## Opentrons Robot Software Changes in 7.3.1 + +Welcome to the v7.3.1 release of the Opentrons robot software! + +### Improved Features + +- Updated values for how much a tip overlaps with the pipette nozzle when the pipette picks up tips, in order to make protocols more reliable. These new values only apply to JSON protocols and Python protocols specifying API version 2.19. + +--- + ## Opentrons Robot Software Changes in 7.3.0 Welcome to the v7.3.0 release of the Opentrons robot software! diff --git a/api/setup.py b/api/setup.py index 1811b6b4e2d..2e1fa5380f8 100755 --- a/api/setup.py +++ b/api/setup.py @@ -66,6 +66,7 @@ def get_version(): "typing-extensions>=4.0.0,<5", "click>=8.0.0,<9", 'importlib-metadata >= 1.0 ; python_version < "3.8"', + "packaging>=21.0", ] EXTRAS = { diff --git a/api/src/opentrons/config/gripper_config.py b/api/src/opentrons/config/gripper_config.py index 0c364bc749c..1de9be1de0b 100644 --- a/api/src/opentrons/config/gripper_config.py +++ b/api/src/opentrons/config/gripper_config.py @@ -24,7 +24,12 @@ def info_num_to_model(num: str) -> GripperModel: # PVT will now be 1.2 model_map = { "0": {"0": GripperModel.v1, "1": GripperModel.v1}, - "1": {"0": GripperModel.v1, "1": GripperModel.v1_1, "2": GripperModel.v1_2}, + "1": { + "0": GripperModel.v1, + "1": GripperModel.v1_1, + "2": GripperModel.v1_2, + "3": GripperModel.v1_3, + }, } return model_map[major_model][minor_model] diff --git a/api/src/opentrons/hardware_control/dev_types.py b/api/src/opentrons/hardware_control/dev_types.py index 6eb459fef0f..e6122bf86aa 100644 --- a/api/src/opentrons/hardware_control/dev_types.py +++ b/api/src/opentrons/hardware_control/dev_types.py @@ -84,6 +84,7 @@ class PipetteDict(InstrumentDict): tip_length: float working_volume: float tip_overlap: Dict[str, float] + versioned_tip_overlap: Dict[str, Dict[str, float]] available_volume: float return_tip_height: float default_aspirate_flow_rates: Dict[str, float] diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py index f8a9d48da60..be126f8513f 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette.py @@ -148,7 +148,7 @@ def __init__( self._active_tip_settings.default_blowout_flowrate.default ) - self._tip_overlap_lookup = self._liquid_class.tip_overlap_dictionary + self._tip_overlap_lookup = self._liquid_class.versioned_tip_overlap_dictionary if use_old_aspiration_functions: self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION @@ -216,7 +216,7 @@ def pipette_offset(self) -> PipetteOffsetByPipetteMount: return self._pipette_offset @property - def tip_overlap(self) -> Dict[str, float]: + def tip_overlap(self) -> Dict[str, Dict[str, float]]: return self._tip_overlap_lookup @property @@ -290,7 +290,7 @@ def reset_state(self) -> None: self.active_tip_settings.default_blowout_flowrate.default ) - self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary + self._tip_overlap_lookup = self.liquid_class.versioned_tip_overlap_dictionary self._nozzle_manager = ( nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) ) @@ -571,7 +571,8 @@ def as_dict(self) -> "Pipette.DictType": "default_dispense_flow_rates": self.dispense_flow_rates_lookup, "tip_length": self.current_tip_length, "return_tip_height": self.active_tip_settings.default_return_tip_height, - "tip_overlap": self.tip_overlap, + "tip_overlap": self.tip_overlap["v0"], + "versioned_tip_overlap": self.tip_overlap, "back_compat_names": self._config.pipette_backcompat_names, "supported_tips": self.liquid_class.supported_tips, } diff --git a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py index 35b38a1732a..e1d87f499a9 100644 --- a/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot2/pipette_handler.py @@ -212,6 +212,7 @@ def get_attached_instrument(self, mount: MountType) -> PipetteDict: "blow_out_flow_rate", "working_volume", "tip_overlap", + "versioned_tip_overlap", "available_volume", "return_tip_height", "default_aspirate_flow_rates", diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py index 7d72058d1ce..9372cf90ae1 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette.py @@ -133,7 +133,7 @@ def __init__( ) self._flow_acceleration = self._active_tip_settings.default_flow_acceleration - self._tip_overlap_lookup = self._liquid_class.tip_overlap_dictionary + self._tip_overlap_lookup = self._liquid_class.versioned_tip_overlap_dictionary if use_old_aspiration_functions: self._pipetting_function_version = PIPETTING_FUNCTION_FALLBACK_VERSION @@ -161,7 +161,7 @@ def backlash_distance(self) -> float: return self._backlash_distance @property - def tip_overlap(self) -> Dict[str, float]: + def tip_overlap(self) -> Dict[str, Dict[str, float]]: return self._tip_overlap_lookup @property @@ -254,7 +254,7 @@ def reset_state(self) -> None: ) self._flow_acceleration = self._active_tip_settings.default_flow_acceleration - self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary + self._tip_overlap_lookup = self.liquid_class.versioned_tip_overlap_dictionary self._nozzle_manager = ( nozzle_manager.NozzleConfigurationManager.build_from_config(self._config) ) @@ -560,7 +560,8 @@ def as_dict(self) -> "Pipette.DictType": "default_flow_acceleration": self.active_tip_settings.default_flow_acceleration, "tip_length": self.current_tip_length, "return_tip_height": self.active_tip_settings.default_return_tip_height, - "tip_overlap": self.tip_overlap, + "tip_overlap": self.tip_overlap["v0"], + "versioned_tip_overlap": self.tip_overlap, "back_compat_names": self._config.pipette_backcompat_names, "supported_tips": self.liquid_class.supported_tips, } @@ -655,7 +656,7 @@ def set_tip_type(self, tip_type: pip_types.PipetteTipType) -> None: self._flow_acceleration = self._active_tip_settings.default_flow_acceleration self._fallback_tip_length = self._active_tip_settings.default_tip_length - self._tip_overlap_lookup = self.liquid_class.tip_overlap_dictionary + self._tip_overlap_lookup = self.liquid_class.versioned_tip_overlap_dictionary self._working_volume = min(tip_type.value, self.liquid_class.max_volume) def get_pick_up_configuration_for_tip_count( diff --git a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py index 1dc40a4caa0..70d62156181 100644 --- a/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py +++ b/api/src/opentrons/hardware_control/instruments/ot3/pipette_handler.py @@ -228,6 +228,7 @@ def get_attached_instrument(self, mount: OT3Mount) -> PipetteDict: "blow_out_flow_rate", "working_volume", "tip_overlap", + "versioned_tip_overlap", "available_volume", "return_tip_height", "default_aspirate_flow_rates", diff --git a/api/src/opentrons/hardware_control/modules/mod_abc.py b/api/src/opentrons/hardware_control/modules/mod_abc.py index 9d5527991f6..b41315e6815 100644 --- a/api/src/opentrons/hardware_control/modules/mod_abc.py +++ b/api/src/opentrons/hardware_control/modules/mod_abc.py @@ -2,7 +2,7 @@ import asyncio import logging import re -from typing import ClassVar, Mapping, Optional, TypeVar +from typing import ClassVar, Mapping, Optional, TypeVar, cast from packaging.version import InvalidVersion, parse, Version from opentrons.config import IS_ROBOT, ROBOT_FIRMWARE_DIR from opentrons.drivers.rpi_drivers.types import USBPort @@ -18,9 +18,14 @@ def parse_fw_version(version: str) -> Version: try: device_version = parse(version) + # This is a patch for older versions of packaging - they would try and parse old + # kidns of versions and return a LegacyVersion object. We can't check for that + # explicitly because they removed it in modern versions of packaging. + if not isinstance(device_version, Version): + raise InvalidVersion() except InvalidVersion: device_version = parse("v0.0.0") - return device_version + return cast(Version, device_version) class AbstractModule(abc.ABC): diff --git a/api/src/opentrons/protocol_api/core/engine/instrument.py b/api/src/opentrons/protocol_api/core/engine/instrument.py index 485f45d0e94..d2057a7605d 100644 --- a/api/src/opentrons/protocol_api/core/engine/instrument.py +++ b/api/src/opentrons/protocol_api/core/engine/instrument.py @@ -34,7 +34,7 @@ from opentrons.protocol_api._nozzle_layout import NozzleLayout from opentrons.hardware_control.nozzle_manager import NozzleConfigurationType from opentrons.hardware_control.nozzle_manager import NozzleMap -from . import deck_conflict +from . import deck_conflict, overlap_versions from ..instrument import AbstractInstrument from .well import WellCore @@ -745,7 +745,11 @@ def set_flow_rate( def configure_for_volume(self, volume: float) -> None: self._engine_client.configure_for_volume( - pipette_id=self._pipette_id, volume=volume + pipette_id=self._pipette_id, + volume=volume, + tip_overlap_version=overlap_versions.overlap_for_api_version( + self._protocol_core.api_version + ), ) def prepare_to_aspirate(self) -> None: diff --git a/api/src/opentrons/protocol_api/core/engine/overlap_versions.py b/api/src/opentrons/protocol_api/core/engine/overlap_versions.py new file mode 100644 index 00000000000..ed14859ecd3 --- /dev/null +++ b/api/src/opentrons/protocol_api/core/engine/overlap_versions.py @@ -0,0 +1,16 @@ +"""Mappings between API versions and overlap versions.""" +from functools import lru_cache +from typing_extensions import Final +from opentrons.protocols.api_support.types import APIVersion + +_OVERLAP_VERSION_MAP: Final = {APIVersion(2, 0): "v0", APIVersion(2, 19): "v1"} + + +@lru_cache(1) +def overlap_for_api_version(api_version: APIVersion) -> str: + """Get the overlap version for a specific API version.""" + defined = list(reversed(sorted(_OVERLAP_VERSION_MAP.keys()))) + for version in defined: + if version <= api_version: + return _OVERLAP_VERSION_MAP[version] + return _OVERLAP_VERSION_MAP[APIVersion(2, 0)] diff --git a/api/src/opentrons/protocol_api/core/engine/protocol.py b/api/src/opentrons/protocol_api/core/engine/protocol.py index 4089dff4b4d..28fb0376c40 100644 --- a/api/src/opentrons/protocol_api/core/engine/protocol.py +++ b/api/src/opentrons/protocol_api/core/engine/protocol.py @@ -66,8 +66,7 @@ MagneticBlockCore, ) from .exceptions import InvalidModuleLocationError -from . import load_labware_params -from . import deck_conflict +from . import load_labware_params, deck_conflict, overlap_versions if TYPE_CHECKING: from ...labware import Labware @@ -498,7 +497,13 @@ def load_instrument( An instrument core configured to use the requested instrument. """ engine_mount = MountType[mount.name] - load_result = self._engine_client.load_pipette(instrument_name, engine_mount) + load_result = self._engine_client.load_pipette( + instrument_name, + engine_mount, + tip_overlap_version=overlap_versions.overlap_for_api_version( + self._api_version + ), + ) return InstrumentCore( pipette_id=load_result.pipetteId, diff --git a/api/src/opentrons/protocol_engine/clients/sync_client.py b/api/src/opentrons/protocol_engine/clients/sync_client.py index ed6a499090b..35ea6b9c14d 100644 --- a/api/src/opentrons/protocol_engine/clients/sync_client.py +++ b/api/src/opentrons/protocol_engine/clients/sync_client.py @@ -172,10 +172,15 @@ def load_pipette( self, pipette_name: PipetteNameType, mount: MountType, + tip_overlap_version: Optional[str] = None, ) -> commands.LoadPipetteResult: """Execute a LoadPipette command and return the result.""" request = commands.LoadPipetteCreate( - params=commands.LoadPipetteParams(mount=mount, pipetteName=pipette_name) + params=commands.LoadPipetteParams( + mount=mount, + pipetteName=pipette_name, + tipOverlapNotAfterVersion=tip_overlap_version, + ) ) result = self._transport.execute_command(request=request) @@ -376,12 +381,14 @@ def drop_tip_in_place( return cast(commands.DropTipInPlaceResult, result) def configure_for_volume( - self, pipette_id: str, volume: float + self, pipette_id: str, volume: float, tip_overlap_version: Optional[str] = None ) -> commands.ConfigureForVolumeResult: """Execute a ConfigureForVolume command.""" request = commands.ConfigureForVolumeCreate( params=commands.ConfigureForVolumeParams( - pipetteId=pipette_id, volume=volume + pipetteId=pipette_id, + volume=volume, + tipOverlapNotAfterVersion=tip_overlap_version, ) ) result = self._transport.execute_command(request=request) diff --git a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py index 9a84e16dc45..8415c401fe7 100644 --- a/api/src/opentrons/protocol_engine/commands/configure_for_volume.py +++ b/api/src/opentrons/protocol_engine/commands/configure_for_volume.py @@ -25,6 +25,13 @@ class ConfigureForVolumeParams(PipetteIdMixin): "than a pipette-specific maximum volume.", ge=0, ) + tipOverlapNotAfterVersion: Optional[str] = Field( + None, + description="A version of tip overlap data to not exceed. The highest-versioned " + "tip overlap data that does not exceed this version will be used. Versions are " + "expressed as vN where N is an integer, counting up from v0. If None, the current " + "highest version will be used.", + ) class ConfigureForVolumePrivateResult(PipetteConfigUpdateResultMixin): @@ -57,6 +64,7 @@ async def execute( pipette_result = await self._equipment.configure_for_volume( pipette_id=params.pipetteId, volume=params.volume, + tip_overlap_version=params.tipOverlapNotAfterVersion, ) return SuccessData( diff --git a/api/src/opentrons/protocol_engine/commands/load_pipette.py b/api/src/opentrons/protocol_engine/commands/load_pipette.py index ea7ac60bad3..5b3d1c22693 100644 --- a/api/src/opentrons/protocol_engine/commands/load_pipette.py +++ b/api/src/opentrons/protocol_engine/commands/load_pipette.py @@ -49,6 +49,13 @@ class LoadPipetteParams(BaseModel): description="An optional ID to assign to this pipette. If None, an ID " "will be generated.", ) + tipOverlapNotAfterVersion: Optional[str] = Field( + None, + description="A version of tip overlap data to not exceed. The highest-versioned " + "tip overlap data that does not exceed this version will be used. Versions are " + "expressed as vN where N is an integer, counting up from v0. If None, the current " + "highest version will be used.", + ) class LoadPipetteResult(BaseModel): @@ -109,6 +116,7 @@ async def execute( pipette_name=params.pipetteName, mount=params.mount, pipette_id=params.pipetteId, + tip_overlap_version=params.tipOverlapNotAfterVersion, ) return SuccessData( diff --git a/api/src/opentrons/protocol_engine/execution/equipment.py b/api/src/opentrons/protocol_engine/execution/equipment.py index 7dc2f3bcfaa..d6898ef0863 100644 --- a/api/src/opentrons/protocol_engine/execution/equipment.py +++ b/api/src/opentrons/protocol_engine/execution/equipment.py @@ -203,6 +203,7 @@ async def load_pipette( pipette_name: PipetteNameType, mount: MountType, pipette_id: Optional[str], + tip_overlap_version: Optional[str], ) -> LoadedPipetteData: """Ensure the requested pipette is attached. @@ -211,6 +212,8 @@ async def load_pipette( mount: The mount on which pipette must be attached. pipette_id: An optional identifier to assign the pipette. If None, an identifier will be generated. + tip_overlap_version: An optional specifier for the version of tip overlap data to use. + If None, defaults to v0. Does not need to be format checked - this function does it. Returns: A LoadedPipetteData object. @@ -225,6 +228,11 @@ async def load_pipette( if isinstance(pipette_name, PipetteNameType) else pipette_name ) + sanitized_overlap_version = ( + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_version + ) + ) pipette_id = pipette_id or self._model_utils.generate_id() if not use_virtual_pipettes: @@ -257,14 +265,16 @@ async def load_pipette( serial_number = pipette_dict["pipette_id"] static_pipette_config = pipette_data_provider.get_pipette_static_config( - pipette_dict + pipette_dict=pipette_dict, tip_overlap_version=sanitized_overlap_version ) else: serial_number = self._model_utils.generate_id(prefix="fake-serial-number-") static_pipette_config = ( self._virtual_pipette_data_provider.get_virtual_pipette_static_config( - pipette_name_value, pipette_id + pipette_name=pipette_name_value, + pipette_id=pipette_id, + tip_overlap_version=sanitized_overlap_version, ) ) serial = serial_number or "" @@ -367,9 +377,7 @@ async def load_module( ) async def configure_for_volume( - self, - pipette_id: str, - volume: float, + self, pipette_id: str, volume: float, tip_overlap_version: Optional[str] ) -> LoadedConfigureForVolumeData: """Ensure the requested volume can be configured for the given pipette. @@ -381,6 +389,11 @@ async def configure_for_volume( A LoadedConfiguredVolumeData object. """ use_virtual_pipettes = self._state_store.config.use_virtual_pipettes + sanitized_overlap_version = ( + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_version + ) + ) if not use_virtual_pipettes: mount = self._state_store.pipettes.get_mount(pipette_id).to_hw_mount() @@ -390,7 +403,7 @@ async def configure_for_volume( serial_number = pipette_dict["pipette_id"] static_pipette_config = pipette_data_provider.get_pipette_static_config( - pipette_dict + pipette_dict=pipette_dict, tip_overlap_version=sanitized_overlap_version ) else: @@ -401,7 +414,9 @@ async def configure_for_volume( serial_number = self._model_utils.generate_id(prefix="fake-serial-number-") static_pipette_config = self._virtual_pipette_data_provider.get_virtual_pipette_static_config_by_model_string( - model, pipette_id + pipette_model_string=model, + pipette_id=pipette_id, + tip_overlap_version=sanitized_overlap_version, ) return LoadedConfigureForVolumeData( diff --git a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py index d2a674516ff..3357b7d591d 100644 --- a/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py +++ b/api/src/opentrons/protocol_engine/resources/pipette_data_provider.py @@ -1,6 +1,7 @@ """Pipette config data providers.""" from dataclasses import dataclass -from typing import Dict, Optional +from typing import Dict, Optional, Sequence +import re from opentrons_shared_data.pipette.dev_types import PipetteName, PipetteModel from opentrons_shared_data.pipette import ( @@ -10,16 +11,40 @@ pipette_definition, ) - from opentrons.hardware_control.dev_types import PipetteDict from opentrons.hardware_control.nozzle_manager import ( NozzleConfigurationManager, NozzleMap, ) +from ..errors.exceptions import InvalidLoadPipetteSpecsError from ..types import FlowRates from ...types import Point +_TIP_OVERLAP_VERSION_RE = re.compile(r"^v\d+$") + + +def validate_and_default_tip_overlap_version(version_spec: Optional[str]) -> str: + """Validate and sanitize tip overlap versions for later consumption. + + Something that comes out of this function will be of the correct format, but a given kind of + pipette may not have this version of data. + """ + if version_spec is None: + return f"v{pipette_definition.TIP_OVERLAP_VERSION_MAXIMUM}" + valid = _TIP_OVERLAP_VERSION_RE.match(version_spec) + if not valid: + raise InvalidLoadPipetteSpecsError( + f"Tip overlap version specification {version_spec} is invalid." + ) + try: + _ = int(version_spec[1:]) + except ValueError: + raise InvalidLoadPipetteSpecsError( + f"Tip overlap version specification {version_spec} is invalid." + ) + return version_spec + @dataclass(frozen=True) class LoadedStaticPipetteData: @@ -104,14 +129,14 @@ def get_nozzle_layout_for_pipette(self, pipette_id: str) -> NozzleMap: return self._nozzle_manager_layout_by_id[pipette_id].current_configuration def get_virtual_pipette_static_config_by_model_string( - self, pipette_model_string: str, pipette_id: str + self, pipette_model_string: str, pipette_id: str, tip_overlap_version: str ) -> LoadedStaticPipetteData: """Get the config of a pipette when you know its model string (e.g. from state).""" pipette_model = pipette_load_name.convert_pipette_model( PipetteModel(pipette_model_string) ) return self._get_virtual_pipette_static_config_by_model( - pipette_model, pipette_id + pipette_model, pipette_id, tip_overlap_version ) def _get_virtual_pipette_full_config_by_model_string( @@ -128,7 +153,10 @@ def _get_virtual_pipette_full_config_by_model_string( ) def _get_virtual_pipette_static_config_by_model( - self, pipette_model: pipette_definition.PipetteModelVersionType, pipette_id: str + self, + pipette_model: pipette_definition.PipetteModelVersionType, + pipette_id: str, + tip_overlap_version: str, ) -> LoadedStaticPipetteData: if pipette_id not in self._liquid_class_by_id: self._liquid_class_by_id[pipette_id] = pip_types.LiquidClasses.default @@ -173,9 +201,10 @@ def _get_virtual_pipette_static_config_by_model( default_aspirate=tip_configuration.default_aspirate_flowrate.values_by_api_level, default_dispense=tip_configuration.default_dispense_flowrate.values_by_api_level, ), - nominal_tip_overlap=config.liquid_properties[ - liquid_class - ].tip_overlap_dictionary, + nominal_tip_overlap=get_latest_tip_overlap_before_version( + config.liquid_properties[liquid_class].versioned_tip_overlap_dictionary, + tip_overlap_version, + ), nozzle_map=nozzle_manager.current_configuration, back_left_corner_offset=Point( pip_back_left[0], pip_back_left[1], pip_back_left[2] @@ -186,16 +215,18 @@ def _get_virtual_pipette_static_config_by_model( ) def get_virtual_pipette_static_config( - self, pipette_name: PipetteName, pipette_id: str + self, pipette_name: PipetteName, pipette_id: str, tip_overlap_version: str ) -> LoadedStaticPipetteData: """Get the config for a virtual pipette, given only the pipette name.""" pipette_model = pipette_load_name.convert_pipette_name(pipette_name) return self._get_virtual_pipette_static_config_by_model( - pipette_model, pipette_id + pipette_model, pipette_id, tip_overlap_version ) -def get_pipette_static_config(pipette_dict: PipetteDict) -> LoadedStaticPipetteData: +def get_pipette_static_config( + pipette_dict: PipetteDict, tip_overlap_version: str +) -> LoadedStaticPipetteData: """Get the config for a pipette, given the state/config object from the HW API.""" back_left_offset = pipette_dict["pipette_bounding_box_offsets"].back_left_corner front_right_offset = pipette_dict["pipette_bounding_box_offsets"].front_right_corner @@ -213,7 +244,9 @@ def get_pipette_static_config(pipette_dict: PipetteDict) -> LoadedStaticPipetteD tip_configuration_lookup_table={ k.value: v for k, v in pipette_dict["supported_tips"].items() }, - nominal_tip_overlap=pipette_dict["tip_overlap"], + nominal_tip_overlap=get_latest_tip_overlap_before_version( + pipette_dict["versioned_tip_overlap"], tip_overlap_version + ), # TODO(mc, 2023-02-28): these two values are not present in PipetteDict # https://opentrons.atlassian.net/browse/RCORE-655 home_position=0, @@ -226,3 +259,26 @@ def get_pipette_static_config(pipette_dict: PipetteDict) -> LoadedStaticPipetteD front_right_offset[0], front_right_offset[1], front_right_offset[2] ), ) + + +def get_latest_tip_overlap_before_version( + overlap: Dict[str, Dict[str, float]], version: str +) -> Dict[str, float]: + """Get the latest tip overlap definitions that are equal or older than the version.""" + # TODO: make this less awful + def _numeric(versionstr: str) -> int: + return int(versionstr[1:]) + + def _latest(versions: Sequence[int], target: int) -> int: + last = 0 + for version in versions: + if version > target: + return last + last = version + return last + + numeric_target = _numeric(version) + numeric_versions = sorted([_numeric(k) for k in overlap.keys()]) + found_numeric_version = _latest(numeric_versions, numeric_target) + found_version = f"v{found_numeric_version}" + return overlap[found_version] diff --git a/api/src/opentrons/protocol_runner/legacy_command_mapper.py b/api/src/opentrons/protocol_runner/legacy_command_mapper.py index ababa892616..3b4d24ad26d 100644 --- a/api/src/opentrons/protocol_runner/legacy_command_mapper.py +++ b/api/src/opentrons/protocol_runner/legacy_command_mapper.py @@ -692,7 +692,10 @@ def _map_instrument_load( pipette_id=pipette_id, serial_number=serial, config=pipette_data_provider.get_pipette_static_config( - instrument_load_info.pipette_dict + # Compatibility note - this is the version of tip overlap data, it stays at 0 + # so protocol behavior does not change when you run a legacy JSON protocol + instrument_load_info.pipette_dict, + "v0", ), ) queue_action = pe_actions.QueueCommandAction( diff --git a/api/src/opentrons/protocols/api_support/definitions.py b/api/src/opentrons/protocols/api_support/definitions.py index 01fbddbc41f..483f95f4801 100644 --- a/api/src/opentrons/protocols/api_support/definitions.py +++ b/api/src/opentrons/protocols/api_support/definitions.py @@ -1,6 +1,6 @@ from .types import APIVersion -MAX_SUPPORTED_VERSION = APIVersion(2, 18) +MAX_SUPPORTED_VERSION = APIVersion(2, 19) """The maximum supported protocol API version in this release.""" MIN_SUPPORTED_VERSION = APIVersion(2, 0) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py index 6ac0e9aaaf0..b7e77a44d63 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_instrument_core.py @@ -47,6 +47,8 @@ from opentrons.protocols.api_support.types import APIVersion from opentrons.types import Location, Mount, MountType, Point +from ... import versions_below, versions_at_or_above + @pytest.fixture def mock_engine_client(decoy: Decoy) -> EngineClient: @@ -1171,3 +1173,39 @@ def test_is_tip_tracking_available( mock_engine_client.state.pipettes.get_primary_nozzle(subject.pipette_id) ).then_return(primary_nozzle) assert subject.is_tip_tracking_available() == expected_result + + +@pytest.mark.parametrize("version", versions_below(APIVersion(2, 19), flex_only=False)) +def test_configure_for_volume_pre_219( + decoy: Decoy, + mock_engine_client: EngineClient, + mock_protocol_core: ProtocolCore, + subject: InstrumentCore, + version: APIVersion, +) -> None: + """Configure_for_volume should specify overlap version.""" + decoy.when(mock_protocol_core.api_version).then_return(version) + subject.configure_for_volume(123.0) + decoy.verify( + mock_engine_client.configure_for_volume( + pipette_id=subject.pipette_id, volume=123.0, tip_overlap_version="v0" + ) + ) + + +@pytest.mark.parametrize("version", versions_at_or_above(APIVersion(2, 19))) +def test_configure_for_volume_post_219( + decoy: Decoy, + mock_engine_client: EngineClient, + mock_protocol_core: ProtocolCore, + subject: InstrumentCore, + version: APIVersion, +) -> None: + """Configure_for_volume should specify overlap version.""" + decoy.when(mock_protocol_core.api_version).then_return(version) + subject.configure_for_volume(123.0) + decoy.verify( + mock_engine_client.configure_for_volume( + pipette_id=subject.pipette_id, volume=123.0, tip_overlap_version="v1" + ) + ) diff --git a/api/tests/opentrons/protocol_api/core/engine/test_overlap_versions.py b/api/tests/opentrons/protocol_api/core/engine/test_overlap_versions.py new file mode 100644 index 00000000000..9d41a431026 --- /dev/null +++ b/api/tests/opentrons/protocol_api/core/engine/test_overlap_versions.py @@ -0,0 +1,26 @@ +"""Test the tip overlap selection logic in the API core.""" +import pytest + +from opentrons.protocol_api.core.engine.overlap_versions import overlap_for_api_version +from opentrons.protocols.api_support.types import APIVersion + +from ... import versions_below, versions_at_or_above + + +@pytest.mark.parametrize( + "api_version", versions_below(APIVersion(2, 19), flex_only=False) +) +def test_all_below_219_use_v0(api_version: APIVersion) -> None: + """Versions below 2.19 should use v0.""" + assert overlap_for_api_version(api_version) == "v0" + + +@pytest.mark.parametrize("api_version", versions_at_or_above(APIVersion(2, 19))) +def test_all_above_219_use_v1(api_version: APIVersion) -> None: + """Versions above 2.19 should use v1.""" + assert overlap_for_api_version(api_version) == "v1" + + +def test_future_api_version_uses_v1() -> None: + """Future versions should use v1.""" + assert overlap_for_api_version(APIVersion(2, 99)) == "v1" diff --git a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py index 8f6589b1104..dfe29bc10d0 100644 --- a/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py +++ b/api/tests/opentrons/protocol_api/core/engine/test_protocol_core.py @@ -86,6 +86,8 @@ STANDARD_OT3_DECK, ) +from ... import versions_below, versions_at_or_above + @pytest.fixture(scope="session") def ot2_standard_deck_def() -> DeckDefinitionV5: @@ -235,7 +237,44 @@ def test_get_slot_item_empty( assert subject.get_slot_item(DeckSlotName.SLOT_1) is None -def test_load_instrument( +@pytest.mark.parametrize( + "api_version", versions_below(APIVersion(2, 19), flex_only=False) +) +def test_load_instrument_pre_219( + decoy: Decoy, + mock_sync_hardware_api: SyncHardwareAPI, + mock_engine_client: EngineClient, + subject: ProtocolCore, +) -> None: + """It should issue a LoadPipette command.""" + decoy.when( + mock_engine_client.load_pipette( + pipette_name=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + tip_overlap_version="v0", + ) + ).then_return(commands.LoadPipetteResult(pipetteId="cool-pipette")) + + decoy.when( + mock_engine_client.state.pipettes.get_flow_rates("cool-pipette") + ).then_return( + FlowRates( + default_aspirate={"1.1": 22}, + default_dispense={"3.3": 44}, + default_blow_out={"5.5": 66}, + ), + ) + + result = subject.load_instrument( + instrument_name=PipetteNameType.P300_SINGLE, mount=Mount.LEFT + ) + + assert isinstance(result, InstrumentCore) + assert result.pipette_id == "cool-pipette" + + +@pytest.mark.parametrize("api_version", versions_at_or_above(APIVersion(2, 19))) +def test_load_instrument_post_219( decoy: Decoy, mock_sync_hardware_api: SyncHardwareAPI, mock_engine_client: EngineClient, @@ -244,7 +283,9 @@ def test_load_instrument( """It should issue a LoadPipette command.""" decoy.when( mock_engine_client.load_pipette( - pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT + pipette_name=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + tip_overlap_version="v1", ) ).then_return(commands.LoadPipetteResult(pipetteId="cool-pipette")) diff --git a/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py b/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py index 0bd683fc1fe..7a9aefd8e5d 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py +++ b/api/tests/opentrons/protocol_engine/commands/test_configure_for_volume.py @@ -1,4 +1,5 @@ """Test load pipette commands.""" +import pytest from decoy import Decoy from opentrons.protocol_engine.execution import ( @@ -22,18 +23,26 @@ from opentrons.types import Point +@pytest.mark.parametrize( + "data", + [ + ConfigureForVolumeParams( + pipetteId="some id", + volume=1, + ), + ConfigureForVolumeParams( + pipetteId="some id", + volume=1, + tipOverlapNotAfterVersion="v3", + ), + ], +) async def test_configure_for_volume_implementation( - decoy: Decoy, - equipment: EquipmentHandler, + decoy: Decoy, equipment: EquipmentHandler, data: ConfigureForVolumeParams ) -> None: """A ConfigureForVolume command should have an execution implementation.""" subject = ConfigureForVolumeImplementation(equipment=equipment) - data = ConfigureForVolumeParams( - pipetteId="some id", - volume=1, - ) - config = LoadedStaticPipetteData( model="some-model", display_name="Hello", @@ -56,6 +65,7 @@ async def test_configure_for_volume_implementation( await equipment.configure_for_volume( pipette_id="some id", volume=1, + tip_overlap_version=data.tipOverlapNotAfterVersion, ) ).then_return( LoadedConfigureForVolumeData( diff --git a/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py b/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py index cb1913da0bb..c93122efccc 100644 --- a/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py +++ b/api/tests/opentrons/protocol_engine/commands/test_load_pipette.py @@ -23,10 +23,27 @@ from ..pipette_fixtures import get_default_nozzle_map +@pytest.mark.parametrize( + "data", + [ + LoadPipetteParams( + pipetteName=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + pipetteId="some id", + ), + LoadPipetteParams( + pipetteName=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + pipetteId="some id", + tipOverlapNotAfterVersion="v2", + ), + ], +) async def test_load_pipette_implementation( decoy: Decoy, equipment: EquipmentHandler, state_view: StateView, + data: LoadPipetteParams, ) -> None: """A LoadPipette command should have an execution implementation.""" subject = LoadPipetteImplementation(equipment=equipment, state_view=state_view) @@ -47,17 +64,13 @@ async def test_load_pipette_implementation( back_left_corner_offset=Point(x=1, y=2, z=3), front_right_corner_offset=Point(x=4, y=5, z=6), ) - data = LoadPipetteParams( - pipetteName=PipetteNameType.P300_SINGLE, - mount=MountType.LEFT, - pipetteId="some id", - ) decoy.when( await equipment.load_pipette( pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, pipette_id="some id", + tip_overlap_version=data.tipOverlapNotAfterVersion, ) ).then_return( LoadedPipetteData( @@ -113,6 +126,7 @@ async def test_load_pipette_implementation_96_channel( pipette_name=PipetteNameType.P1000_96, mount=MountType.LEFT, pipette_id="some id", + tip_overlap_version=None, ) ).then_return( LoadedPipetteData( diff --git a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py index 1177894e977..c8db4b3191f 100644 --- a/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py +++ b/api/tests/opentrons/protocol_engine/execution/test_equipment_handler.py @@ -1,9 +1,10 @@ """Test equipment command execution side effects.""" import pytest +from _pytest.fixtures import SubRequest import inspect from datetime import datetime from decoy import Decoy, matchers -from typing import Any, Optional, cast +from typing import Any, Optional, cast, Dict from opentrons_shared_data.pipette.dev_types import PipetteNameType from opentrons_shared_data.pipette import pipette_definition @@ -121,9 +122,16 @@ async def temp_module_v2(decoy: Decoy) -> TempDeck: return temp_mod +@pytest.fixture(params=["v0", "v1", "v3"]) +def tip_overlap_versions(request: SubRequest) -> str: + """Get a series of tip overlap versions.""" + return cast(str, request.param) + + @pytest.fixture def loaded_static_pipette_data( supported_tip_fixture: pipette_definition.SupportedTipsDefinition, + target_tip_overlap_data: Dict[str, float], ) -> LoadedStaticPipetteData: """Get a pipette config data value object.""" return LoadedStaticPipetteData( @@ -138,7 +146,7 @@ def loaded_static_pipette_data( default_dispense={"c": 7.89}, ), tip_configuration_lookup_table={4.56: supported_tip_fixture}, - nominal_tip_overlap={"default": 9.87}, + nominal_tip_overlap=target_tip_overlap_data, home_position=10.11, nozzle_offset_z=12.13, nozzle_map=get_default_nozzle_map(PipetteNameType.P300_SINGLE), @@ -147,6 +155,12 @@ def loaded_static_pipette_data( ) +@pytest.fixture +def target_tip_overlap_data(tip_overlap_versions: str) -> Dict[str, float]: + """Get the corresponding overlap data for the version.""" + return {"default": 2.13 * int(tip_overlap_versions[1:])} + + @pytest.fixture def virtual_pipette_data_provider( decoy: Decoy, @@ -606,6 +620,7 @@ async def test_load_pipette( hardware_api: HardwareControlAPI, state_store: StateStore, loaded_static_pipette_data: LoadedStaticPipetteData, + tip_overlap_versions: str, subject: EquipmentHandler, ) -> None: """It should load pipette data, check attachment, and generate an ID.""" @@ -621,7 +636,14 @@ async def test_load_pipette( ) decoy.when( - pipette_data_provider.get_pipette_static_config(pipette_dict) + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_versions + ) + ).then_return(tip_overlap_versions) + decoy.when( + pipette_data_provider.get_pipette_static_config( + pipette_dict=pipette_dict, tip_overlap_version=tip_overlap_versions + ), ).then_return(loaded_static_pipette_data) decoy.when(hardware_api.get_instrument_max_height(mount=HwMount.LEFT)).then_return( @@ -632,6 +654,7 @@ async def test_load_pipette( pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, pipette_id=None, + tip_overlap_version=tip_overlap_versions, ) assert result == LoadedPipetteData( @@ -656,6 +679,7 @@ async def test_load_pipette_96_channels( hardware_api: HardwareControlAPI, state_store: StateStore, loaded_static_pipette_data: LoadedStaticPipetteData, + tip_overlap_versions: str, subject: EquipmentHandler, ) -> None: """It should load pipette data, check attachment, and generate an ID.""" @@ -667,7 +691,14 @@ async def test_load_pipette_96_channels( pipette_dict ) decoy.when( - pipette_data_provider.get_pipette_static_config(pipette_dict) + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_versions + ) + ).then_return(tip_overlap_versions) + decoy.when( + pipette_data_provider.get_pipette_static_config( + pipette_dict=pipette_dict, tip_overlap_version=tip_overlap_versions + ) ).then_return(loaded_static_pipette_data) decoy.when(hardware_api.get_instrument_max_height(mount=HwMount.LEFT)).then_return( @@ -678,6 +709,7 @@ async def test_load_pipette_96_channels( pipette_name=PipetteNameType.P1000_96, mount=MountType.LEFT, pipette_id=None, + tip_overlap_version=tip_overlap_versions, ) assert result == LoadedPipetteData( @@ -692,6 +724,7 @@ async def test_load_pipette_uses_provided_id( hardware_api: HardwareControlAPI, state_store: StateStore, loaded_static_pipette_data: LoadedStaticPipetteData, + tip_overlap_versions: str, subject: EquipmentHandler, ) -> None: """It should use the provided ID rather than generating an ID for the pipette.""" @@ -702,13 +735,21 @@ async def test_load_pipette_uses_provided_id( pipette_dict ) decoy.when( - pipette_data_provider.get_pipette_static_config(pipette_dict) + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_versions + ) + ).then_return(tip_overlap_versions) + decoy.when( + pipette_data_provider.get_pipette_static_config( + pipette_dict=pipette_dict, tip_overlap_version=tip_overlap_versions + ) ).then_return(loaded_static_pipette_data) result = await subject.load_pipette( pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, pipette_id="my-pipette-id", + tip_overlap_version=tip_overlap_versions, ) assert result == LoadedPipetteData( @@ -724,6 +765,7 @@ async def test_load_pipette_use_virtual( state_store: StateStore, loaded_static_pipette_data: LoadedStaticPipetteData, subject: EquipmentHandler, + tip_overlap_versions: str, virtual_pipette_data_provider: pipette_data_provider.VirtualPipetteDataProvider, ) -> None: """It should use the provided ID rather than generating an ID for the pipette.""" @@ -733,15 +775,22 @@ async def test_load_pipette_use_virtual( decoy.when(model_utils.generate_id(prefix="fake-serial-number-")).then_return( "fake-serial" ) - + decoy.when( + pipette_data_provider.validate_and_default_tip_overlap_version( + tip_overlap_versions + ) + ).then_return(tip_overlap_versions) decoy.when( virtual_pipette_data_provider.get_virtual_pipette_static_config( - PipetteNameType.P300_SINGLE.value, "unique-id" + PipetteNameType.P300_SINGLE.value, "unique-id", tip_overlap_versions ) ).then_return(loaded_static_pipette_data) result = await subject.load_pipette( - pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, pipette_id=None + pipette_name=PipetteNameType.P300_SINGLE, + mount=MountType.LEFT, + pipette_id=None, + tip_overlap_version=tip_overlap_versions, ) assert result == LoadedPipetteData( @@ -781,6 +830,7 @@ async def test_load_pipette_raises_if_pipette_not_attached( pipette_name=PipetteNameType.P300_SINGLE, mount=MountType.LEFT, pipette_id=None, + tip_overlap_version="v9999", ) diff --git a/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py b/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py index 049441da52a..61d177ba42f 100644 --- a/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py +++ b/api/tests/opentrons/protocol_engine/resources/test_pipette_data_provider.py @@ -1,9 +1,12 @@ """Test pipette data provider.""" +from typing import Dict +from sys import maxsize import pytest from opentrons_shared_data.pipette.dev_types import PipetteNameType, PipetteModel from opentrons_shared_data.pipette import pipette_definition, types as pip_types from opentrons_shared_data.pipette.pipette_definition import ( PipetteBoundingBoxOffsetDefinition, + TIP_OVERLAP_VERSION_MAXIMUM, ) from opentrons.hardware_control.dev_types import PipetteDict @@ -11,9 +14,12 @@ from opentrons.protocol_engine.resources.pipette_data_provider import ( LoadedStaticPipetteData, VirtualPipetteDataProvider, + validate_and_default_tip_overlap_version, + get_latest_tip_overlap_before_version, ) from opentrons.protocol_engine.resources import pipette_data_provider as subject +from opentrons.protocol_engine.errors.exceptions import InvalidLoadPipetteSpecsError from ..pipette_fixtures import get_default_nozzle_map from opentrons.types import Point @@ -29,7 +35,7 @@ def test_get_virtual_pipette_static_config( ) -> None: """It should return config data given a pipette name.""" result = subject_instance.get_virtual_pipette_static_config( - PipetteNameType.P20_SINGLE_GEN2.value, "some-id" + PipetteNameType.P20_SINGLE_GEN2.value, "some-id", "v0" ) assert result == LoadedStaticPipetteData( @@ -66,7 +72,7 @@ def test_configure_virtual_pipette_for_volume( ) -> None: """It should return an updated config if the liquid class changes.""" result1 = subject_instance.get_virtual_pipette_static_config( - PipetteNameType.P50_SINGLE_FLEX.value, "my-pipette" + PipetteNameType.P50_SINGLE_FLEX.value, "my-pipette", "v0" ) assert result1 == LoadedStaticPipetteData( model="p50_single_v3.6", @@ -91,7 +97,7 @@ def test_configure_virtual_pipette_for_volume( "my-pipette", 1, result1.model ) result2 = subject_instance.get_virtual_pipette_static_config( - PipetteNameType.P50_SINGLE_FLEX.value, "my-pipette" + PipetteNameType.P50_SINGLE_FLEX.value, "my-pipette", "v0" ) assert result2 == LoadedStaticPipetteData( model="p50_single_v3.6", @@ -119,7 +125,7 @@ def test_load_virtual_pipette_by_model_string( ) -> None: """It should return config data given a pipette model.""" result = subject_instance.get_virtual_pipette_static_config_by_model_string( - "p300_multi_v2.1", "my-pipette" + "p300_multi_v2.1", "my-pipette", "v0" ) assert result == LoadedStaticPipetteData( model="p300_multi_v2.1", @@ -180,12 +186,12 @@ def test_load_virtual_pipette_nozzle_layout( assert result.configuration.value == "COLUMN" -def test_get_pipette_static_config( +@pytest.fixture +def pipette_dict( supported_tip_fixture: pipette_definition.SupportedTipsDefinition, -) -> None: - """It should return config data given a PipetteDict.""" - dummy_nozzle_map = get_default_nozzle_map(PipetteNameType.P300_SINGLE_GEN2) - pipette_dict: PipetteDict = { +) -> PipetteDict: + """Get a pipette dict.""" + return { "name": "p300_single_gen2", "min_volume": 20, "max_volume": 300, @@ -204,6 +210,12 @@ def test_get_pipette_static_config( "opentrons/opentrons_96_tiprack_300ul/1": 8.2, "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2, }, + "versioned_tip_overlap": { + "v0": { + "default": 8.2, + }, + "v2": {"default": 9.3}, + }, "available_volume": 300.0, "return_tip_height": 0.5, "default_aspirate_flow_rates": {"2.0": 46.43, "2.1": 92.86}, @@ -220,14 +232,31 @@ def test_get_pipette_static_config( "default_aspirate_speeds": {"2.0": 5.021202, "2.6": 10.042404}, "default_push_out_volume": 3, "supported_tips": {pip_types.PipetteTipType.t300: supported_tip_fixture}, - "current_nozzle_map": dummy_nozzle_map, + "current_nozzle_map": get_default_nozzle_map(PipetteNameType.P300_SINGLE_GEN2), "pipette_bounding_box_offsets": PipetteBoundingBoxOffsetDefinition( backLeftCorner=[10, 20, 30], frontRightCorner=[40, 50, 60], ), } - result = subject.get_pipette_static_config(pipette_dict) + +@pytest.mark.parametrize( + "tip_overlap_version,overlap_data", + [ + ("v0", {"default": 8.2}), + ("v1", {"default": 8.2}), + ("v2", {"default": 9.3}), + ("v10000", {"default": 9.3}), + ], +) +def test_get_pipette_static_config( + supported_tip_fixture: pipette_definition.SupportedTipsDefinition, + pipette_dict: PipetteDict, + tip_overlap_version: str, + overlap_data: Dict[str, float], +) -> None: + """It should return config data given a PipetteDict.""" + result = subject.get_pipette_static_config(pipette_dict, tip_overlap_version) assert result == LoadedStaticPipetteData( model="p300_single_v2.0", @@ -241,16 +270,62 @@ def test_get_pipette_static_config( default_blow_out={"2.0": 46.43, "2.2": 92.86}, ), tip_configuration_lookup_table={300: supported_tip_fixture}, - nominal_tip_overlap={ - "default": 8.2, - "opentrons/opentrons_96_tiprack_300ul/1": 8.2, - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2, - }, + nominal_tip_overlap=overlap_data, # TODO(mc, 2023-02-28): these two values are not present in PipetteDict # https://opentrons.atlassian.net/browse/RCORE-655 nozzle_offset_z=0, home_position=0, - nozzle_map=dummy_nozzle_map, + nozzle_map=get_default_nozzle_map(PipetteNameType.P300_SINGLE_GEN2), back_left_corner_offset=Point(10, 20, 30), front_right_corner_offset=Point(40, 50, 60), ) + + +@pytest.mark.parametrize( + "version", + [ + "", + "qwe", + "v", + "v-1", + "vab", + ], +) +def test_validate_bad_tip_overlap_versions(version: str) -> None: + """Raise for bad tip overlap version specs.""" + with pytest.raises(InvalidLoadPipetteSpecsError): + validate_and_default_tip_overlap_version(version) + + +def test_default_tip_overlap_versions() -> None: + """Default None tip overlap version specs.""" + assert ( + validate_and_default_tip_overlap_version(None) + == f"v{TIP_OVERLAP_VERSION_MAXIMUM}" + ) + + +@pytest.mark.parametrize("version", ["v0", "v1", f"v{maxsize+1}"]) +def test_pass_valid_tip_overlap_versions(version: str) -> None: + """Pass valid tip overlap specs.""" + assert validate_and_default_tip_overlap_version(version) == version + + +@pytest.mark.parametrize( + "version,target_data", + [ + ("v0", {"default": 123.0}), + ("v1", {"default": 321.1}), + ("v3", {"default": 333.5}), + ("v9999", {"default": 4414.99}), + ], +) +def test_get_latest_tip_overlap(version: str, target_data: Dict[str, float]) -> None: + """Test the search function for latest offset.""" + overlap = { + "v0": {"default": 123.0}, + "v1": {"default": 321.1}, + "v2": {"default": 333.5}, + "v1231": {"default": 4414.99}, + } + assert get_latest_tip_overlap_before_version(overlap, version) == target_data diff --git a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py index ada52714ee6..ccf8d7c2567 100644 --- a/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py +++ b/api/tests/opentrons/protocol_runner/test_legacy_command_mapper.py @@ -342,7 +342,7 @@ def test_map_instrument_load(decoy: Decoy) -> None: pipette_config = cast(LoadedStaticPipetteData, {"config": True}) decoy.when( - pipette_data_provider.get_pipette_static_config(pipette_dict) + pipette_data_provider.get_pipette_static_config(pipette_dict, "v0"), ).then_return(pipette_config) expected_id_and_key = "commands.LOAD_PIPETTE-0" diff --git a/app-shell/Makefile b/app-shell/Makefile index 88bbf74b9ad..df7cac39cf6 100644 --- a/app-shell/Makefile +++ b/app-shell/Makefile @@ -122,7 +122,7 @@ dist-posix: package-deps .PHONY: dist-osx dist-osx: package-deps - $(builder) --mac + $(builder) --mac --x64 $(MAKE) _dist-collect-artifacts .PHONY: dist-linux @@ -145,9 +145,6 @@ dist-ot3: package-deps .PHONY: dist-macos-latest dist-macos-latest: dist-osx -.PHONY: dist-macos-11 -dist-macos-11: dist-osx - .PHONY: dist-ubuntu-latest dist-ubuntu-latest: dist-linux diff --git a/app-shell/build/release-notes.md b/app-shell/build/release-notes.md index 78aa19b0142..68a9ff23c45 100644 --- a/app-shell/build/release-notes.md +++ b/app-shell/build/release-notes.md @@ -6,6 +6,26 @@ log][]. For a list of currently known issues, please see the [Opentrons issue tr --- +## Opentrons App Changes in 7.5.0 + +Welcome to the v7.5.0 release of the Opentrons App! + +There are no changes to the Opentrons App in v7.5.0, but it is required for updating the robot software to support the latest Flex Gripper hardware and the [Opentrons Flex HEPA/UV Module](https://opentrons.com/products/opentrons-flex-hepa-uv-module). + +--- + +## Opentrons App Changes in 7.3.1 + +Welcome to the v7.3.1 release of the Opentrons App! + +There are no changes to the Opentrons App in v7.3.1, but it is required for updating the robot software to improve some features. + +### Known Issue + +- Robots that have completed a run won't appear as available until you clear the run completion notification. This appears as a banner on the protocol run screen in the app, or as a splash screen on the Flex touchscreen. + +--- + ## Opentrons App Changes in 7.3.0 Welcome to the v7.3.0 release of the Opentrons App! This release adds support for Python protocols with runtime parameters, letting you change the behavior of a protocol each time you run it. diff --git a/app-shell/electron-builder.config.js b/app-shell/electron-builder.config.js index aa61720338b..2e66f01690c 100644 --- a/app-shell/electron-builder.config.js +++ b/app-shell/electron-builder.config.js @@ -8,6 +8,7 @@ const { } = process.env const DEV_MODE = process.env.NODE_ENV !== 'production' const USE_PYTHON = process.env.NO_PYTHON !== 'true' +const WINDOWS_SIGN = process.env.WINDOWS_SIGN === 'true' const project = process.env.OPENTRONS_PROJECT ?? 'robot-stack' // this will generate either @@ -72,6 +73,11 @@ module.exports = async () => ({ target: ['nsis'], publisherName: 'Opentrons Labworks Inc.', icon: project === 'robot-stack' ? 'build/icon.ico' : 'build/three.ico', + forceCodeSigning: WINDOWS_SIGN, + rfc3161TimeStampServer: 'http://timestamp.digicert.com', + sign: 'scripts/windows-custom-sign.js', + signDlls: true, + signingHashAlgorithms: ['sha256'], }, nsis: { oneClick: false, diff --git a/app-shell/scripts/before-pack.js b/app-shell/scripts/before-pack.js index 6e96609786f..bb5e2d45485 100644 --- a/app-shell/scripts/before-pack.js +++ b/app-shell/scripts/before-pack.js @@ -118,7 +118,16 @@ module.exports = function beforeBuild(context) { // TODO(mc, 2022-05-16): explore virtualenvs for a more reliable // implementation of this install - return execa(HOST_PYTHON, [ + console.log( + `Installing python native deps using ${path.join( + PYTHON_DESTINATION, + 'python3.10' + )}` + ) + const invokablePython = platformName.includes('darwin') + ? path.join(PYTHON_DESTINATION, 'python/bin/python3.10') + : HOST_PYTHON + return execa(invokablePython, [ '-m', 'pip', 'install', diff --git a/app-shell/scripts/windows-custom-sign.js b/app-shell/scripts/windows-custom-sign.js new file mode 100644 index 00000000000..90d7927ab6a --- /dev/null +++ b/app-shell/scripts/windows-custom-sign.js @@ -0,0 +1,62 @@ +// from https://github.com/electron-userland/electron-builder/issues/7605 + +'use strict' + +const { execSync } = require('node:child_process') + +exports.default = async configuration => { + const signCmd = `smctl sign --keypair-alias="${String( + process.env.SM_KEYPAIR_ALIAS + )}" --input "${String(configuration.path)}" --certificate="${String( + process.env.WINDOWS_CSC_FILEPATH + )}" --exit-non-zero-on-fail --failfast --verbose` + console.log(signCmd) + try { + const signProcess = execSync(signCmd, { + stdio: 'pipe', + }) + console.log(`Sign success!`) + console.log( + `Sign stdout: ${signProcess?.stdout?.toString() ?? ''}` + ) + console.log( + `Sign stderr: ${signProcess?.stderr?.toString() ?? ''}` + ) + console.log(`Sign code: ${signProcess.code}`) + } catch (err) { + console.error(`Exception running sign: ${err.status}! +Process stdout: + ${err?.stdout?.toString() ?? ''} +------------- +Process stderr: +${err?.stdout?.toString() ?? ''} +------------- +`) + throw err + } + const verifyCmd = `smctl sign verify --fingerprint="${String( + process.env.SM_CODE_SIGNING_CERT_SHA1_HASH + )}" --input="${String(configuration.path)}" --verbose` + console.log(verifyCmd) + try { + const verifyProcess = execSync(verifyCmd, { stdio: 'pipe' }) + console.log(`Verify success!`) + console.log( + `Verify stdout: ${verifyProcess?.stdout?.toString() ?? ''}` + ) + console.log( + `Verify stderr: ${verifyProcess?.stderr?.toString() ?? ''}` + ) + } catch (err) { + console.error(` +Exception running verification: ${err.status}! +Process stdout: + ${err?.stdout?.toString() ?? ''} +-------------- +Process stderr: + ${err?.stderr?.toString() ?? ''} +-------------- +`) + throw err + } +} diff --git a/hardware/opentrons_hardware/firmware_bindings/constants.py b/hardware/opentrons_hardware/firmware_bindings/constants.py index f569b0d8ff4..848107cdc8b 100644 --- a/hardware/opentrons_hardware/firmware_bindings/constants.py +++ b/hardware/opentrons_hardware/firmware_bindings/constants.py @@ -4,6 +4,7 @@ by default. Please do not unconditionally import things outside the python standard library. """ + from enum import Enum, unique from typing import Union, Dict, List @@ -294,6 +295,7 @@ class ErrorCode(int, Enum): door_open = 0x0E reed_open = 0x0F motor_driver_error_detected = 0x10 + safety_relay_inactive = 0x11 @unique diff --git a/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py b/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py index 49845c8820d..af6fd6cf3e7 100644 --- a/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py +++ b/hardware/opentrons_hardware/firmware_bindings/messages/payloads.py @@ -1,4 +1,5 @@ """Payloads of can bus messages.""" + # TODO (amit, 2022-01-26): Figure out why using annotations import ruins # dataclass fields interpretation. # from __future__ import annotations @@ -685,6 +686,7 @@ class GetHepaUVStatePayloadResponse(EmptyPayload): uv_light_on: utils.UInt8Field remaining_time_s: utils.UInt32Field uv_current_ma: utils.UInt16Field + safety_relay_active: utils.UInt8Field @dataclass(eq=False) diff --git a/hardware/opentrons_hardware/hardware_control/hepa_uv_settings.py b/hardware/opentrons_hardware/hardware_control/hepa_uv_settings.py index e51e48fd8ad..602efc53dcf 100644 --- a/hardware/opentrons_hardware/hardware_control/hepa_uv_settings.py +++ b/hardware/opentrons_hardware/hardware_control/hepa_uv_settings.py @@ -1,4 +1,5 @@ """Utilities for controlling the hepa/uv extension module.""" + import logging import asyncio from typing import Optional @@ -46,6 +47,7 @@ class HepaUVState: uv_duration_s: int remaining_time_s: int uv_current_ma: int + safety_relay_active: bool async def set_hepa_fan_state( @@ -136,6 +138,7 @@ def _listener(message: MessageDefinition, arb_id: ArbitrationId) -> None: uv_duration_s=int(message.payload.uv_duration_s.value), remaining_time_s=int(message.payload.remaining_time_s.value), uv_current_ma=int(message.payload.uv_current_ma.value), + safety_relay_active=bool(message.payload.safety_relay_active.value), ) def _filter(arb_id: ArbitrationId) -> bool: diff --git a/hardware/tests/opentrons_hardware/hardware_control/test_hepauv_settings.py b/hardware/tests/opentrons_hardware/hardware_control/test_hepauv_settings.py index dcaf85a8653..ad188bd153c 100644 --- a/hardware/tests/opentrons_hardware/hardware_control/test_hepauv_settings.py +++ b/hardware/tests/opentrons_hardware/hardware_control/test_hepauv_settings.py @@ -55,6 +55,7 @@ def create_hepa_uv_state_response( duration: int, remaining_time: int, uv_current: int, + safety_relay_active: bool, ) -> MessageDefinition: """Create a GetHepaUVStateResponse.""" return md.GetHepaUVStateResponse( @@ -63,6 +64,7 @@ def create_hepa_uv_state_response( uv_duration_s=UInt32Field(duration), remaining_time_s=UInt32Field(remaining_time), uv_current_ma=UInt16Field(uv_current), + safety_relay_active=UInt8Field(safety_relay_active), ) ) @@ -162,12 +164,29 @@ def responder( [ ( NodeId.host, - create_hepa_uv_state_response(True, 900, 300, 3300), + create_hepa_uv_state_response(True, 900, 300, 3300, True), + NodeId.hepa_uv, + ), + ( + NodeId.host, + create_hepa_uv_state_response(True, 0, 0, 33000, True), + NodeId.hepa_uv, + ), + ( + NodeId.host, + create_hepa_uv_state_response(True, 0, 0, 33000, False), + NodeId.hepa_uv, + ), + ( + NodeId.host, + create_hepa_uv_state_response(False, 0, 0, 0, True), + NodeId.hepa_uv, + ), + ( + NodeId.host, + create_hepa_uv_state_response(False, 900, 0, 0, False), NodeId.hepa_uv, ), - (NodeId.host, create_hepa_uv_state_response(True, 0, 0, 33000), NodeId.hepa_uv), - (NodeId.host, create_hepa_uv_state_response(False, 0, 0, 0), NodeId.hepa_uv), - (NodeId.host, create_hepa_uv_state_response(False, 900, 0, 0), NodeId.hepa_uv), ], ) async def test_get_hepa_uv_state( @@ -202,6 +221,7 @@ def responder( int(payload.uv_duration_s.value), int(payload.remaining_time_s.value), int(payload.uv_current_ma.value), + bool(payload.safety_relay_active.value), ) == res ) diff --git a/robot-server/robot_server/robot/calibration/check/user_flow.py b/robot-server/robot_server/robot/calibration/check/user_flow.py index 1366c0054ed..bdd343b8c7c 100644 --- a/robot-server/robot_server/robot/calibration/check/user_flow.py +++ b/robot-server/robot_server/robot/calibration/check/user_flow.py @@ -851,8 +851,8 @@ def _get_tip_length(self) -> float: self.active_tiprack._core.get_definition(), ).tipLength except cal_types.TipLengthCalNotFound: - tip_overlap = self.hw_pipette.tip_overlap.get( - self.active_tiprack.uri, self.hw_pipette.tip_overlap["default"] + tip_overlap = self.hw_pipette.tip_overlap["v0"].get( + self.active_tiprack.uri, self.hw_pipette.tip_overlap["v0"]["default"] ) tip_length = self.active_tiprack.tip_length return tip_length - tip_overlap diff --git a/robot-server/robot_server/robot/calibration/deck/user_flow.py b/robot-server/robot_server/robot/calibration/deck/user_flow.py index 55ed1351f84..a857e593820 100644 --- a/robot-server/robot_server/robot/calibration/deck/user_flow.py +++ b/robot-server/robot_server/robot/calibration/deck/user_flow.py @@ -365,7 +365,7 @@ def _get_tip_length(self) -> float: self._tip_rack._core.get_definition(), ).tipLength except cal_types.TipLengthCalNotFound: - tip_overlap = self._hw_pipette.tip_overlap.get(self._tip_rack.uri, 0) + tip_overlap = self._hw_pipette.tip_overlap["v0"].get(self._tip_rack.uri, 0) tip_length = self._tip_rack.tip_length return tip_length - tip_overlap diff --git a/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py b/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py index 695e8428634..c68255ce2f3 100644 --- a/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py +++ b/robot-server/robot_server/robot/calibration/pipette_offset/user_flow.py @@ -328,7 +328,7 @@ def _get_stored_pipette_offset_cal( def _get_tip_length(self) -> float: stored_tip_length_cal = self._get_stored_tip_length_cal() if stored_tip_length_cal is None or self._should_perform_tip_length: - tip_overlap = self._hw_pipette.tip_overlap.get(self._tip_rack.uri, 0) + tip_overlap = self._hw_pipette.tip_overlap["v0"].get(self._tip_rack.uri, 0) tip_length = self._tip_rack.tip_length return tip_length - tip_overlap else: diff --git a/robot-server/robot_server/robot/calibration/tip_length/user_flow.py b/robot-server/robot_server/robot/calibration/tip_length/user_flow.py index fec0fa42639..282c1feb6f0 100644 --- a/robot-server/robot_server/robot/calibration/tip_length/user_flow.py +++ b/robot-server/robot_server/robot/calibration/tip_length/user_flow.py @@ -200,7 +200,7 @@ async def save_offset(self): def _get_default_tip_length(self) -> float: tiprack: labware.Labware = self._deck[TIP_RACK_SLOT] # type: ignore full_length = tiprack.tip_length - overlap_dict: Dict[str, float] = self._hw_pipette.tip_overlap + overlap_dict: Dict[str, float] = self._hw_pipette.tip_overlap["v0"] overlap = overlap_dict.get(tiprack.uri, 0) return full_length - overlap diff --git a/scripts/python_build_utils.py b/scripts/python_build_utils.py index a0daeabc8b9..e8b9f0ce246 100644 --- a/scripts/python_build_utils.py +++ b/scripts/python_build_utils.py @@ -55,9 +55,18 @@ def normalize_version(package, project, extra_tag='', git_dir=None): # the way they vendor dependencies, like the packaging module that # provides the way to normalize version numbers for wheel file names. So # we try all the possible ways to find it. + # Since 71.0.0 they have removed the need for extern + # So depending on the version of 3.10 you're building on you may or may not + # need to use the extern or import it directly try: - # new way - from setuptools.extern import packaging + import setuptools + major, minor, patch = [int(x, 10) for x in setuptools.__version__.split('.')] + if major < 71: + # new way + from setuptools.extern import packaging + else: + # new new way + import packaging except ImportError: # old way from pkg_resources.extern import packaging diff --git a/shared-data/command/schemas/8.json b/shared-data/command/schemas/8.json index 5aea97fe94f..b25a4e0ac6f 100644 --- a/shared-data/command/schemas/8.json +++ b/shared-data/command/schemas/8.json @@ -489,6 +489,11 @@ "description": "Amount of liquid in uL. Must be at least 0 and no greater than a pipette-specific maximum volume.", "minimum": 0, "type": "number" + }, + "tipOverlapNotAfterVersion": { + "title": "Tipoverlapnotafterversion", + "description": "A version of tip overlap data to not exceed. The highest-versioned tip overlap data that does not exceed this version will be used. Versions are expressed as vN where N is an integer, counting up from v0. If None, the current highest version will be used.", + "type": "string" } }, "required": ["pipetteId", "volume"] @@ -1634,6 +1639,11 @@ "title": "Pipetteid", "description": "An optional ID to assign to this pipette. If None, an ID will be generated.", "type": "string" + }, + "tipOverlapNotAfterVersion": { + "title": "Tipoverlapnotafterversion", + "description": "A version of tip overlap data to not exceed. The highest-versioned tip overlap data that does not exceed this version will be used. Versions are expressed as vN where N is an integer, counting up from v0. If None, the current highest version will be used.", + "type": "string" } }, "required": ["pipetteName", "mount"] diff --git a/shared-data/gripper/definitions/1/gripperV1.3.json b/shared-data/gripper/definitions/1/gripperV1.3.json new file mode 100644 index 00000000000..ef26cc062ba --- /dev/null +++ b/shared-data/gripper/definitions/1/gripperV1.3.json @@ -0,0 +1,29 @@ +{ + "$otSharedSchema": "gripper/schemas/1", + "model": "gripperV1.3", + "schemaVersion": 1, + "displayName": "Flex Gripper", + "gripForceProfile": { + "polynomial": [ + [0, 3.759869], + [1, 0.81005], + [2, 0.04597701] + ], + "defaultGripForce": 15.0, + "defaultIdleForce": 10.0, + "defaultHomeForce": 12.0, + "min": 2.0, + "max": 30.0 + }, + "geometry": { + "baseOffsetFromMount": [19.5, -74.325, -94.825], + "jawCenterOffsetFromBase": [0.0, 0.0, -86.475], + "pinOneOffsetFromBase": [6.0, -54.0, -98.475], + "pinTwoOffsetFromBase": [6.0, 54.0, -98.475], + "jawWidth": { + "min": 60.0, + "max": 92.0 + }, + "maxAllowedGripError": 3.0 + } +} diff --git a/shared-data/js/__tests__/pipettes.test.ts b/shared-data/js/__tests__/pipettes.test.ts index 91f0e8f9d69..f8da7a34a41 100644 --- a/shared-data/js/__tests__/pipettes.test.ts +++ b/shared-data/js/__tests__/pipettes.test.ts @@ -82,14 +82,25 @@ describe('pipette data accessors', () => { default: { $otSharedSchema: '#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json', - defaultTipOverlapDictionary: { - default: 10.5, - 'opentrons/opentrons_flex_96_tiprack_1000ul/1': 9.65, - 'opentrons/opentrons_flex_96_tiprack_200ul/1': 9.76, - 'opentrons/opentrons_flex_96_tiprack_50ul/1': 10.09, - 'opentrons/opentrons_flex_96_filtertiprack_1000ul/1': 9.65, - 'opentrons/opentrons_flex_96_filtertiprack_200ul/1': 9.76, - 'opentrons/opentrons_flex_96_filtertiprack_50ul/1': 10.09, + versionedTipOverlapDictionary: { + v0: { + default: 10.5, + 'opentrons/opentrons_flex_96_tiprack_1000ul/1': 10.5, + 'opentrons/opentrons_flex_96_tiprack_200ul/1': 10.5, + 'opentrons/opentrons_flex_96_tiprack_50ul/1': 10.5, + 'opentrons/opentrons_flex_96_filtertiprack_1000ul/1': 10.5, + 'opentrons/opentrons_flex_96_filtertiprack_200ul/1': 10.5, + 'opentrons/opentrons_flex_96_filtertiprack_50ul/1': 10.5, + }, + v1: { + default: 10.5, + 'opentrons/opentrons_flex_96_tiprack_1000ul/1': 9.65, + 'opentrons/opentrons_flex_96_tiprack_200ul/1': 9.76, + 'opentrons/opentrons_flex_96_tiprack_50ul/1': 10.09, + 'opentrons/opentrons_flex_96_filtertiprack_1000ul/1': 9.65, + 'opentrons/opentrons_flex_96_filtertiprack_200ul/1': 9.76, + 'opentrons/opentrons_flex_96_filtertiprack_50ul/1': 10.09, + }, }, defaultTipracks: [ 'opentrons/opentrons_flex_96_tiprack_1000ul/1', @@ -148,10 +159,17 @@ describe('pipette data accessors', () => { const mockLiquidDefault = { $otSharedSchema: '#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json', - defaultTipOverlapDictionary: { - default: 10.5, - [tiprackFilter50uL]: 10.5, - [tiprack50uL]: 10.5, + versionedTipOverlapDictionary: { + v0: { + default: 10.5, + [tiprackFilter50uL]: 10.5, + [tiprack50uL]: 10.5, + }, + v1: { + default: 10.5, + [tiprackFilter50uL]: 10.09, + [tiprack50uL]: 10.09, + }, }, defaultTipracks: [tiprack50uL, tiprackFilter50uL], maxVolume: 50, @@ -196,10 +214,17 @@ describe('pipette data accessors', () => { } as PipetteV2LiquidSpecs const mockLiquidLowVolume = { $otSharedSchema: '#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json', - defaultTipOverlapDictionary: { - default: 10.5, - [tiprackFilter50uL]: 10.5, - [tiprack50uL]: 10.5, + versionedTipOverlapDictionary: { + v0: { + default: 10.5, + [tiprackFilter50uL]: 10.5, + [tiprack50uL]: 10.5, + }, + v1: { + default: 10.5, + [tiprackFilter50uL]: 10.09, + [tiprack50uL]: 10.09, + }, }, defaultTipracks: [tiprack50uL, tiprackFilter50uL], maxVolume: 30, diff --git a/shared-data/js/constants.ts b/shared-data/js/constants.ts index 71b4813c07e..0ba54d36fad 100644 --- a/shared-data/js/constants.ts +++ b/shared-data/js/constants.ts @@ -47,7 +47,13 @@ export const MAGNETIC_BLOCK_V1: 'magneticBlockV1' = 'magneticBlockV1' export const GRIPPER_V1: 'gripperV1' = 'gripperV1' export const GRIPPER_V1_1: 'gripperV1.1' = 'gripperV1.1' export const GRIPPER_V1_2: 'gripperV1.2' = 'gripperV1.2' -export const GRIPPER_MODELS = [GRIPPER_V1, GRIPPER_V1_1, GRIPPER_V1_2] +export const GRIPPER_V1_3: 'gripperV1.3' = 'gripperV1.3' +export const GRIPPER_MODELS = [ + GRIPPER_V1, + GRIPPER_V1_1, + GRIPPER_V1_2, + GRIPPER_V1_3, +] // robot display name export const OT2_DISPLAY_NAME: 'Opentrons OT-2' = 'Opentrons OT-2' diff --git a/shared-data/js/gripper.ts b/shared-data/js/gripper.ts index 15c1d3f7f7b..9bc8282421e 100644 --- a/shared-data/js/gripper.ts +++ b/shared-data/js/gripper.ts @@ -1,8 +1,14 @@ import gripperV1 from '../gripper/definitions/1/gripperV1.json' import gripperV1_1 from '../gripper/definitions/1/gripperV1.1.json' import gripperV1_2 from '../gripper/definitions/1/gripperV1.2.json' +import gripperV1_3 from '../gripper/definitions/1/gripperV1.3.json' -import { GRIPPER_V1, GRIPPER_V1_1, GRIPPER_V1_2 } from './constants' +import { + GRIPPER_V1, + GRIPPER_V1_1, + GRIPPER_V1_2, + GRIPPER_V1_3, +} from './constants' import type { GripperModel, GripperDefinition } from './types' @@ -16,6 +22,8 @@ export const getGripperDef = ( return gripperV1_1 as GripperDefinition case GRIPPER_V1_2: return gripperV1_2 as GripperDefinition + case GRIPPER_V1_3: + return gripperV1_3 as GripperDefinition default: console.warn( `Could not find a gripper with model ${gripperModel}, falling back to most recent definition: ${GRIPPER_V1_2}` diff --git a/shared-data/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap b/shared-data/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap index 96ac3e3853b..fdfdd6cd42a 100644 --- a/shared-data/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +++ b/shared-data/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap @@ -1,5 +1,3 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`test createIrregularLabware function > failing to validate against labware schema throws w/o "strict" 1`] = `[Error: Generated labware failed to validate, please check your inputs]`; - -exports[`test createIrregularLabware function failing to validate against labware schema throws w/o "strict" 1`] = `"Generated labware failed to validate, please check your inputs"`; diff --git a/shared-data/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap b/shared-data/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap index 122b6a3894e..85c5aa8c451 100644 --- a/shared-data/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +++ b/shared-data/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap @@ -1,5 +1,3 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`createLabware > failing to validate against labware schema throws w/o "strict" 1`] = `[Error: Generated labware failed to validate, please check your inputs]`; - -exports[`createLabware failing to validate against labware schema throws w/o "strict" 1`] = `"Generated labware failed to validate, please check your inputs"`; diff --git a/shared-data/js/types.ts b/shared-data/js/types.ts index 5eab9ebaa08..7edac70edf2 100644 --- a/shared-data/js/types.ts +++ b/shared-data/js/types.ts @@ -22,6 +22,7 @@ import type { GRIPPER_V1, GRIPPER_V1_1, GRIPPER_V1_2, + GRIPPER_V1_3, EXTENSION, MAGNETIC_BLOCK_V1, } from './constants' @@ -230,6 +231,7 @@ export type GripperModel = | typeof GRIPPER_V1 | typeof GRIPPER_V1_1 | typeof GRIPPER_V1_2 + | typeof GRIPPER_V1_3 export type ModuleModelWithLegacy = | ModuleModel @@ -502,7 +504,7 @@ export interface SupportedTips { export interface PipetteV2LiquidSpecs { $otSharedSchema: string supportedTips: SupportedTips - defaultTipOverlapDictionary: Record + versionedTipOverlapDictionary: Record> maxVolume: number minVolume: number defaultTipracks: string[] diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_0.json index c781ed5fb1b..18168db370b 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_0.json @@ -41,18 +41,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_3.json index c781ed5fb1b..18168db370b 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_3.json @@ -41,18 +41,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_4.json index c781ed5fb1b..18168db370b 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_4.json @@ -41,18 +41,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_5.json index c26f9dd3367..c85651098be 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_5.json @@ -30,18 +30,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_6.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_6.json index ca296630314..ab677f49573 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_6.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p10/default/1_6.json @@ -38,18 +38,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/1_0.json index c9a72f83aca..f24a3792d77 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/1_0.json @@ -340,17 +340,19 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_1000ul/1", "opentrons/opentrons_flex_96_tiprack_200ul/1", "opentrons/opentrons_flex_96_tiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_0.json index 12736030d8e..4a0c70e6d0a 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_0.json @@ -340,15 +340,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -358,5 +349,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_3.json index fd4f29a83bb..55c25038afa 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_3.json @@ -343,15 +343,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -361,5 +352,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_4.json index dcc9d533490..3840097c460 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_4.json @@ -343,15 +343,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -361,5 +352,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.42, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 9.67, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.42, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 9.67 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json index 83026842153..a56e09e6cd5 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p1000/default/3_5.json @@ -223,15 +223,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -241,5 +232,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.17, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.1, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.17 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.42, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 9.67, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.42, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 9.67 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_0.json index bc9f6ec8de9..c5bf6a66ded 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_0.json @@ -290,15 +290,6 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.25, - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25, - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3 - }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ @@ -307,5 +298,16 @@ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_1.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_1.json index aa83a2e5bda..826c245b8a3 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p20/default/2_1.json @@ -172,15 +172,6 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.25, - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3, - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 - }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ @@ -189,5 +180,16 @@ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_0.json index 0b997a3d6ca..61a5db14e5e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_0.json @@ -52,16 +52,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_3.json index a1a35a727e2..a5dda0f58bb 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_3.json @@ -52,16 +52,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_4.json index 0b997a3d6ca..61a5db14e5e 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_4.json @@ -52,16 +52,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_5.json index a1a35a727e2..a5dda0f58bb 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/1_5.json @@ -52,16 +52,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_0.json index 161e8ef45dd..9b7bae09f76 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_0.json @@ -176,15 +176,17 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.2, - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2, - "opentrons/opentrons_96_tiprack_300ul/1": 8.2 - }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_1.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_1.json index 4fee623f602..3b8f0b1fb18 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p300/default/2_1.json @@ -178,15 +178,17 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.2, - "opentrons/opentrons_96_tiprack_300ul/1": 8.2, - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 - }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_0.json index 3714335cbe8..018253e2aa2 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_0.json @@ -113,16 +113,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_3.json index 3714335cbe8..018253e2aa2 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_3.json @@ -113,16 +113,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_4.json index 0d02b181a20..1c128049acb 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_4.json @@ -113,16 +113,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_5.json index 11b13cae38f..d81e15c0feb 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/1_5.json @@ -95,16 +95,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_0.json index ac12e0bea1e..ae16ef8ccb6 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_0.json @@ -88,15 +88,17 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_3.json index 38a4b01df80..7a299357e1c 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_3.json @@ -89,15 +89,17 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_4.json index f1c15ddae49..4086001aea0 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_4.json @@ -89,15 +89,22 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_5.json index 80763fd4b6c..8c48705f3fd 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/default/3_5.json @@ -81,15 +81,22 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_0.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_0.json index 870ff5f594d..08ca230aa12 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_0.json @@ -83,15 +83,17 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_3.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_3.json index cc629f28316..c845aa1f3d0 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_3.json @@ -79,15 +79,17 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_4.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_4.json index 0e9284b04e6..81f6528ae5d 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_4.json @@ -79,15 +79,22 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_5.json b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_5.json index 0e9284b04e6..81f6528ae5d 100644 --- a/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/eight_channel/p50/lowVolumeDefault/3_5.json @@ -79,15 +79,22 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.05, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.05 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 9.27, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 9.27 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/1_0.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/1_0.json index 0f3f56f6494..b3995eeebbb 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/1_0.json @@ -139,10 +139,10 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, @@ -162,25 +162,16 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -190,5 +181,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_0.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_0.json index 0f3f56f6494..b3995eeebbb 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_0.json @@ -139,10 +139,10 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, @@ -162,25 +162,16 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -190,5 +181,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_3.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_3.json index 899d08aeaee..36a7ee32a35 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_3.json @@ -142,10 +142,10 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, @@ -165,25 +165,16 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -193,5 +184,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_4.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_4.json index 899d08aeaee..58c10652179 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_4.json @@ -142,10 +142,10 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, @@ -165,25 +165,16 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -193,5 +184,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.16, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.21, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.74, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.21, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.74, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.16 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_5.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_5.json index 1b9c88edf92..0ba6ba1ec99 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_5.json @@ -142,10 +142,10 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, @@ -165,25 +165,16 @@ [436.984286, 0.000322, 15.303634], [632.861429, 0.000208, 15.353582], [828.952857, 0.00013, 15.402544], - [976.118571, 0.000095, 15.431673], - [1005.275714, -0.000067, 15.589843], - [1024.768571, -0.000021, 15.543681], - [1049.145714, -0.000013, 15.535884] + [976.118571, 9.5e-5, 15.431673], + [1005.275714, -6.7e-5, 15.589843], + [1024.768571, -2.1e-5, 15.543681], + [1049.145714, -1.3e-5, 15.535884] ] } }, "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -193,5 +184,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.16, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.21, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.74, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.21, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.74, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.16 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_6.json b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_6.json index cd27abd81f0..d1461ca5553 100644 --- a/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_6.json +++ b/shared-data/pipette/definitions/2/liquid/ninety_six_channel/p1000/default/3_6.json @@ -175,17 +175,25 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_1000ul/1", "opentrons/opentrons_flex_96_tiprack_200ul/1", "opentrons/opentrons_flex_96_tiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.16, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.21, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.74 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_0.json index bcba2e228bb..d307a7a8bd7 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_0.json @@ -44,16 +44,18 @@ }, "maxVolume": 10, "minVolume": 1.0, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_3.json index 7c94504d9bb..d307a7a8bd7 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_3.json @@ -42,18 +42,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_4.json index caeac6e5709..d95e809716d 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_4.json @@ -39,18 +39,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_5.json index 32bde854b93..360e1c2b849 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p10/default/1_5.json @@ -37,18 +37,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 - }, "maxVolume": 10, "minVolume": 1.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_0.json index 5edc982ed29..35c185edab8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_0.json @@ -31,18 +31,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.95, - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_3.json index 5edc982ed29..35c185edab8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_3.json @@ -31,18 +31,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.95, - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_4.json index 5edc982ed29..35c185edab8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_4.json @@ -31,18 +31,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.95, - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_5.json index 5edc982ed29..35c185edab8 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/1_5.json @@ -31,18 +31,20 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.95, - "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, - "opentrons/geb_96_tiprack_1000ul/1": 11.2, - "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.95, + "opentrons/opentrons_96_tiprack_1000ul/1": 7.95, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 7.95, + "opentrons/geb_96_tiprack_1000ul/1": 11.2, + "opentrons/eppendorf_96_tiprack_1000ul_eptips/1": 0.0 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_0.json index 8417c5a36dd..b4ec3129371 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_0.json @@ -89,17 +89,19 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 9.7, - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_1.json index 46563177001..4bcc0f7f7c1 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_1.json @@ -92,17 +92,19 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 9.7, - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_2.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_2.json index bfb9c6e83e8..fdb589c933f 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_2.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/2_2.json @@ -92,17 +92,19 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 9.7, - "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, - "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, - "opentrons/geb_96_tiprack_1000ul/1": 9.5 - }, "maxVolume": 1000, "minVolume": 100.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_1000ul/1", "opentrons/opentrons_96_filtertiprack_1000ul/1", "opentrons/geb_96_tiprack_1000ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 9.7, + "opentrons/opentrons_96_tiprack_1000ul/1": 11.5, + "opentrons/opentrons_96_filtertiprack_1000ul/1": 11.5, + "opentrons/geb_96_tiprack_1000ul/1": 9.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_0.json index 476cb96cc69..e61789bf4e1 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_0.json @@ -340,15 +340,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -358,5 +349,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_3.json index e4e765c999c..6a29f93afe1 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_3.json @@ -343,15 +343,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -361,5 +352,16 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_4.json index f48e41f37f2..d56e4fb7318 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_4.json @@ -269,15 +269,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -287,5 +278,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json index 9c939ba9c7c..82909a73807 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_5.json @@ -191,15 +191,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -209,5 +200,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json index 72187981c26..9cabfe93441 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p1000/default/3_6.json @@ -191,15 +191,6 @@ "defaultPushOutVolume": 20 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 1000, "minVolume": 5, "defaultTipracks": [ @@ -209,5 +200,25 @@ "opentrons/opentrons_flex_96_filtertiprack_1000ul/1", "opentrons/opentrons_flex_96_filtertiprack_200ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 9.65, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 9.76, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_0.json index a2b76f0cfb2..b06e3b7682b 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_0.json @@ -410,15 +410,6 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.25, - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3, - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 - }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ @@ -427,5 +418,16 @@ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_1.json index e10b9ba735d..d4a7f36aa49 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_1.json @@ -234,20 +234,22 @@ }, "maxVolume": 20, "minVolume": 1.0, - "defaultTipOverlapDictionary": { - "default": 8.25, - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3, - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_20ul/1", "opentrons/opentrons_96_filtertiprack_20ul/1", "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_2.json b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_2.json index eba2ed05cb1..9bae68e3b36 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_2.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p20/default/2_2.json @@ -292,15 +292,6 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.25, - "opentrons/opentrons_96_tiprack_10ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, - "opentrons/geb_96_tiprack_10ul/1": 8.3, - "opentrons/opentrons_96_tiprack_20ul/1": 8.25, - "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 - }, "maxVolume": 20, "minVolume": 1.0, "defaultTipracks": [ @@ -309,5 +300,16 @@ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", "opentrons/geb_96_tiprack_10ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.25, + "opentrons/opentrons_96_tiprack_10ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_10ul/1": 8.25, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 8.4, + "opentrons/geb_96_tiprack_10ul/1": 8.3, + "opentrons/opentrons_96_tiprack_20ul/1": 8.25, + "opentrons/opentrons_96_filtertiprack_20ul/1": 8.25 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_0.json index 68ba4f899f2..19ac0424c19 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_0.json @@ -84,16 +84,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_3.json index 68ba4f899f2..19ac0424c19 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_3.json @@ -84,16 +84,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_4.json index 68ba4f899f2..19ac0424c19 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_4.json @@ -84,16 +84,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_5.json index 3c5222ee994..2cd22952f6b 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/1_5.json @@ -60,16 +60,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47 - }, "maxVolume": 300, "minVolume": 30.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_0.json index 0cb69ad19ed..b73dd0dba7a 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_0.json @@ -174,15 +174,17 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.2, - "opentrons/opentrons_96_tiprack_300ul/1": 8.2, - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 - }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_1.json b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_1.json index 0478ea9c0e5..5c5244153f6 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_1.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p300/default/2_1.json @@ -176,15 +176,17 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 8.2, - "opentrons/opentrons_96_tiprack_300ul/1": 8.2, - "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 - }, "maxVolume": 300, "minVolume": 20.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 8.2, + "opentrons/opentrons_96_tiprack_300ul/1": 8.2, + "opentrons/opentrons_96_filtertiprack_200ul/1": 8.2 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_0.json index b2b8e2a3227..d3158dbd670 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_0.json @@ -104,16 +104,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_3.json index 483e4593741..55091aa9045 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_3.json @@ -113,16 +113,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_4.json index 483e4593741..55091aa9045 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_4.json @@ -113,16 +113,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_5.json index 55e70afee0a..fbc6c41571b 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/1_5.json @@ -89,16 +89,18 @@ "defaultPushOutVolume": 0 } }, - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 - }, "maxVolume": 50, "minVolume": 5.0, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_0.json index f5492d8809a..dc41dc80d05 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_0.json @@ -88,15 +88,17 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_3.json index a5d87c485ba..ff042100dcb 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_3.json @@ -89,15 +89,17 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_4.json index 24da0837138..6a95e423e18 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_4.json @@ -91,15 +91,22 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json index 0077dcf4c76..bf6f93b6d43 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_5.json @@ -71,15 +71,22 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_6.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_6.json index 0077dcf4c76..bf6f93b6d43 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_6.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/default/3_6.json @@ -71,15 +71,22 @@ "defaultPushOutVolume": 2 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 50, "minVolume": 5, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_0.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_0.json index 2a292477578..a164bf8dad0 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_0.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_0.json @@ -68,15 +68,17 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_3.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_3.json index deae3998fe9..d5e57b4f4b0 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_3.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_3.json @@ -69,15 +69,17 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_4.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_4.json index 397dc63b230..9eac17173ce 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_4.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_4.json @@ -69,15 +69,22 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json index e1b92133bd6..ea3d08790c7 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_5.json @@ -67,15 +67,22 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_6.json b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_6.json index e1b92133bd6..ea3d08790c7 100644 --- a/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_6.json +++ b/shared-data/pipette/definitions/2/liquid/single_channel/p50/lowVolumeDefault/3_6.json @@ -67,15 +67,22 @@ "defaultPushOutVolume": 7 } }, - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 - }, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_50ul/1", "opentrons/opentrons_flex_96_filtertiprack_50ul/1" - ] + ], + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5 + }, + "v1": { + "default": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.09, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.09 + } + } } diff --git a/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json b/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json index a4ba8e659f1..9acd92453f5 100644 --- a/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json +++ b/shared-data/pipette/schemas/2/pipetteLiquidPropertiesSchema.json @@ -42,7 +42,7 @@ "minVolume", "defaultTipracks", "supportedTips", - "defaultTipOverlapDictionary" + "versionedTipOverlapDictionary" ], "additionalProperties": false, "properties": { @@ -106,15 +106,23 @@ } } }, - "defaultTipOverlapDictionary": { + "versionedTipOverlapDictionary": { "type": "object", - "description": "Map of tip overlap values with defaults", - "required": ["default"], - "$comment": "Other keys in here should be labware URIs", - "properties": { - "default": { "type": "number" } + "description": "Map by version of tip overlap values with defaults", + "required": ["v0"], + "patternProperties": { + "^v\\d+$": { + "type": "object", + "description": "Map of tip overlap values with defaults", + "required": ["default"], + "$comment": "Other keys in here should be labware URIs", + "properties": { + "default": { "type": "number" } + }, + "additionalProperties": { "type": "number" } + } }, - "additionalProperties": { "type": "number" } + "additionalProperties": false }, "maxVolume": { "$ref": "#/definitions/positiveNumber" }, "minVolume": { "$ref": "#/definitions/positiveNumber" }, diff --git a/shared-data/python/opentrons_shared_data/gripper/gripper_definition.py b/shared-data/python/opentrons_shared_data/gripper/gripper_definition.py index 4c4c30c623b..707d960a9ba 100644 --- a/shared-data/python/opentrons_shared_data/gripper/gripper_definition.py +++ b/shared-data/python/opentrons_shared_data/gripper/gripper_definition.py @@ -24,6 +24,7 @@ class GripperModel(str, Enum): v1 = "gripperV1" v1_1 = "gripperV1.1" v1_2 = "gripperV1.2" + v1_3 = "gripperV1.3" def __str__(self) -> str: """Model name.""" @@ -31,6 +32,7 @@ def __str__(self) -> str: self.__class__.v1: "gripperV1", self.__class__.v1_1: "gripperV1.1", self.__class__.v1_2: "gripperV1.2", + self.__class__.v1_3: "gripperV1.3", } return enum_to_str[self] diff --git a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py index a7b43663884..8b9ada8c06f 100644 --- a/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py +++ b/shared-data/python/opentrons_shared_data/pipette/pipette_definition.py @@ -6,6 +6,10 @@ from . import types as pip_types, dev_types +# The highest and lowest existing overlap version values. +TIP_OVERLAP_VERSION_MINIMUM = 0 +TIP_OVERLAP_VERSION_MAXIMUM = 1 + PLUNGER_CURRENT_MINIMUM = 0.1 PLUNGER_CURRENT_MAXIMUM = 1.5 @@ -436,10 +440,10 @@ class PipetteLiquidPropertiesDefinition(BaseModel): supported_tips: Dict[pip_types.PipetteTipType, SupportedTipsDefinition] = Field( ..., alias="supportedTips" ) - tip_overlap_dictionary: Dict[str, float] = Field( + versioned_tip_overlap_dictionary: Dict[str, Dict[str, float]] = Field( ..., - description="The default tip overlap associated with this tip type.", - alias="defaultTipOverlapDictionary", + description="A versioned map of tip overlaps for tips associated with this tip type.", + alias="versionedTipOverlapDictionary", ) max_volume: int = Field( ..., diff --git a/shared-data/python/tests/pipette/test_pipette_definition.py b/shared-data/python/tests/pipette/test_pipette_definition.py index 2b1f31e4fe4..9fd134ec059 100644 --- a/shared-data/python/tests/pipette/test_pipette_definition.py +++ b/shared-data/python/tests/pipette/test_pipette_definition.py @@ -45,7 +45,7 @@ def get_liquid_definition_for( } ) }, - "defaultTipOverlapDictionary": {}, + "versionedTipOverlapDictionary": {"v0": {}}, "maxVolume": 30, "minVolume": 1, "defaultTipracks": [], @@ -78,7 +78,7 @@ def get_liquid_definition_for( } ) }, - "defaultTipOverlapDictionary": {}, + "versionedTipOverlapDictionary": {"v0": {}}, "maxVolume": 100, "minVolume": 5, "defaultTipracks": [], diff --git a/shared-data/python/tests/pipette/test_validate_schema.py b/shared-data/python/tests/pipette/test_validate_schema.py index a7f6c6d0e06..333618ef225 100644 --- a/shared-data/python/tests/pipette/test_validate_schema.py +++ b/shared-data/python/tests/pipette/test_validate_schema.py @@ -1,7 +1,12 @@ import os +from typing import Iterator from opentrons_shared_data import get_shared_data_root -from opentrons_shared_data.pipette.pipette_definition import PipetteConfigurations +from opentrons_shared_data.pipette.pipette_definition import ( + PipetteConfigurations, + TIP_OVERLAP_VERSION_MINIMUM, + TIP_OVERLAP_VERSION_MAXIMUM, +) from opentrons_shared_data.pipette.load_data import load_definition from opentrons_shared_data.pipette.pipette_load_name_conversions import ( convert_pipette_model, @@ -9,62 +14,83 @@ from opentrons_shared_data.pipette.dev_types import PipetteModel -def test_check_all_models_are_valid() -> None: - paths_to_validate = ( - get_shared_data_root() / "pipette" / "definitions" / "2" / "general" - ) +def iterate_models() -> Iterator[PipetteModel]: + """Get an iterator of all pipette models.""" _channel_model_str = { "single_channel": "single", "ninety_six_channel": "96", "eight_channel": "multi", } - assert os.listdir(paths_to_validate), "You have a path wrong" - for channel_dir in os.listdir(paths_to_validate): - for model_dir in os.listdir(paths_to_validate / channel_dir): - for version_file in os.listdir(paths_to_validate / channel_dir / model_dir): - version_list = version_file.split(".json")[0].split("_") - built_model: PipetteModel = PipetteModel( - f"{model_dir}_{_channel_model_str[channel_dir]}_v{version_list[0]}.{version_list[1]}" - ) + defn_root = get_shared_data_root() / "pipette" / "definitions" / "2" / "liquid" + assert os.listdir(defn_root), "A path is wrong" + for channel_dir in defn_root.iterdir(): + for model_dir in channel_dir.iterdir(): + for lc_dir in model_dir.iterdir(): + for version_file in lc_dir.iterdir(): + version_list = version_file.stem.split("_") + yield PipetteModel( + f"{model_dir.stem}_{_channel_model_str[channel_dir.stem]}_v{version_list[0]}.{version_list[1]}" + ) + - model_version = convert_pipette_model(built_model) - loaded_model = load_definition( - model_version.pipette_type, - model_version.pipette_channels, - model_version.pipette_version, - ) +def test_check_all_models_are_valid() -> None: + """Make sure each model can be loaded.""" + for model in iterate_models(): + model_version = convert_pipette_model(model) + loaded_model = load_definition( + model_version.pipette_type, + model_version.pipette_channels, + model_version.pipette_version, + ) - assert isinstance(loaded_model, PipetteConfigurations) + assert isinstance(loaded_model, PipetteConfigurations) def test_pick_up_configs_tip_count_keys() -> None: """Verify that speed, distance & current of pickUpTipConfigurations have same tip count keys.""" - paths_to_validate = ( - get_shared_data_root() / "pipette" / "definitions" / "2" / "general" - ) - _channel_model_str = { - "single_channel": "single", - "ninety_six_channel": "96", - "eight_channel": "multi", - } - assert os.listdir(paths_to_validate), "You have a path wrong" - for channel_dir in os.listdir(paths_to_validate): - for model_dir in os.listdir(paths_to_validate / channel_dir): - for version_file in os.listdir(paths_to_validate / channel_dir / model_dir): - version_list = version_file.split(".json")[0].split("_") - built_model: PipetteModel = PipetteModel( - f"{model_dir}_{_channel_model_str[channel_dir]}_v{version_list[0]}.{version_list[1]}" - ) - model_version = convert_pipette_model(built_model) - loaded_model = load_definition( - model_version.pipette_type, - model_version.pipette_channels, - model_version.pipette_version, - ) - pick_up_tip_configs = loaded_model.pick_up_tip_configurations.press_fit + for model in iterate_models(): + model_version = convert_pipette_model(model) + loaded_model = load_definition( + model_version.pipette_type, + model_version.pipette_channels, + model_version.pipette_version, + ) + pick_up_tip_configs = loaded_model.pick_up_tip_configurations.press_fit + assert ( + pick_up_tip_configs.distance_by_tip_count.keys() + == pick_up_tip_configs.speed_by_tip_count.keys() + == pick_up_tip_configs.current_by_tip_count.keys() + ) + + +def test_tip_overlap_version_extrema_cover_definitions() -> None: + """Check that tip overlap versions are up to date.""" + found_max = False + for model in iterate_models(): + model_version = convert_pipette_model(model) + loaded_model = load_definition( + model_version.pipette_type, + model_version.pipette_channels, + model_version.pipette_version, + ) + for lc_name, lc_value in loaded_model.liquid_properties.items(): + found_min = False + for version in lc_value.versioned_tip_overlap_dictionary.keys(): + version_number = int(version[1:]) + assert ( + version_number >= TIP_OVERLAP_VERSION_MINIMUM + ), f"{model} / {lc_name} has tip overlap version {version} (below min)" assert ( - pick_up_tip_configs.distance_by_tip_count.keys() - == pick_up_tip_configs.speed_by_tip_count.keys() - == pick_up_tip_configs.current_by_tip_count.keys() - ) + version_number <= TIP_OVERLAP_VERSION_MAXIMUM + ), f"{model} / {lc_name} has tip overlap version {version} (above max)" + if version_number == TIP_OVERLAP_VERSION_MINIMUM: + found_min = True + if version_number == TIP_OVERLAP_VERSION_MAXIMUM: + found_max = True + assert ( + found_min + ), f"{model} / {lc_name} has no entry for minimum tip overlap version {TIP_OVERLAP_VERSION_MINIMUM}" + assert ( + found_max + ), f"No tip overlap data for version {TIP_OVERLAP_VERSION_MAXIMUM} found" diff --git a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap index 57b519dba68..6fb985f6e08 100644 --- a/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap +++ b/step-generation/src/__tests__/__snapshots__/fixtureGeneration.test.ts.snap @@ -9128,15 +9128,6 @@ exports[`snapshot tests > makeContext 1`] = ` "liquids": { "default": { "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", - "defaultTipOverlapDictionary": { - "default": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, - "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, - }, "defaultTipracks": [ "opentrons/opentrons_flex_96_tiprack_1000ul/1", "opentrons/opentrons_flex_96_tiprack_200ul/1", @@ -9657,6 +9648,17 @@ exports[`snapshot tests > makeContext 1`] = ` }, }, }, + "versionedTipOverlapDictionary": { + "v0": { + "default": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_filtertiprack_50ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_1000ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_200ul/1": 10.5, + "opentrons/opentrons_flex_96_tiprack_50ul/1": 10.5, + }, + }, }, }, "model": "p1000", @@ -11706,13 +11708,6 @@ exports[`snapshot tests > makeContext 1`] = ` "liquids": { "default": { "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", @@ -11815,6 +11810,15 @@ exports[`snapshot tests > makeContext 1`] = ` }, }, }, + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + }, + }, }, }, "model": "p10", @@ -13170,13 +13174,6 @@ exports[`snapshot tests > makeContext 1`] = ` "liquids": { "default": { "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", - "defaultTipOverlapDictionary": { - "default": 3.29, - "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, - "opentrons/geb_96_tiprack_10ul/1": 6.2, - "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, - "opentrons/opentrons_96_tiprack_10ul/1": 3.29, - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_10ul/1", "opentrons/opentrons_96_filtertiprack_10ul/1", @@ -13284,6 +13281,15 @@ exports[`snapshot tests > makeContext 1`] = ` }, }, }, + "versionedTipOverlapDictionary": { + "v0": { + "default": 3.29, + "opentrons/eppendorf_96_tiprack_10ul_eptips/1": 1, + "opentrons/geb_96_tiprack_10ul/1": 6.2, + "opentrons/opentrons_96_filtertiprack_10ul/1": 3.29, + "opentrons/opentrons_96_tiprack_10ul/1": 3.29, + }, + }, }, }, "model": "p10", @@ -14525,12 +14531,6 @@ exports[`snapshot tests > makeContext 1`] = ` "liquids": { "default": { "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1", @@ -14637,6 +14637,14 @@ exports[`snapshot tests > makeContext 1`] = ` }, }, }, + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + }, + }, }, }, "model": "p300", @@ -15986,12 +15994,6 @@ exports[`snapshot tests > makeContext 1`] = ` "liquids": { "default": { "$otSharedSchema": "#/pipette/schemas/2/pipetteLiquidPropertiesSchema.json", - "defaultTipOverlapDictionary": { - "default": 7.47, - "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, - "opentrons/opentrons_96_tiprack_300ul/1": 7.47, - "opentrons/tipone_96_tiprack_200ul/1": 6.1, - }, "defaultTipracks": [ "opentrons/opentrons_96_tiprack_300ul/1", "opentrons/opentrons_96_filtertiprack_200ul/1", @@ -16206,6 +16208,14 @@ exports[`snapshot tests > makeContext 1`] = ` }, }, }, + "versionedTipOverlapDictionary": { + "v0": { + "default": 7.47, + "opentrons/opentrons_96_filtertiprack_200ul/1": 7.47, + "opentrons/opentrons_96_tiprack_300ul/1": 7.47, + "opentrons/tipone_96_tiprack_200ul/1": 6.1, + }, + }, }, }, "model": "p300",