diff -pruN 3.13.1-1/.github/workflows/ci.yml 3.14.0-1/.github/workflows/ci.yml
--- 3.13.1-1/.github/workflows/ci.yml	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/.github/workflows/ci.yml	2025-07-26 19:25:13.000000000 +0000
@@ -79,7 +79,7 @@ jobs:
 
       - name: Python Semantic Release
         id: release
-        uses: python-semantic-release/python-semantic-release@v10.0.2
+        uses: python-semantic-release/python-semantic-release@v10.2.0
         with:
           github_token: ${{ secrets.GITHUB_TOKEN }}
 
@@ -88,7 +88,7 @@ jobs:
         if: steps.release.outputs.released == 'true'
 
       - name: Publish package to GitHub Release
-        uses: python-semantic-release/publish-action@v10.0.2
+        uses: python-semantic-release/publish-action@v10.2.0
         if: steps.release.outputs.released == 'true'
         with:
           github_token: ${{ secrets.GITHUB_TOKEN }}
diff -pruN 3.13.1-1/.pre-commit-config.yaml 3.14.0-1/.pre-commit-config.yaml
--- 3.13.1-1/.pre-commit-config.yaml	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/.pre-commit-config.yaml	2025-07-26 19:25:13.000000000 +0000
@@ -50,15 +50,15 @@ repos:
     hooks:
       - id: codespell
   - repo: https://github.com/PyCQA/flake8
-    rev: 7.2.0
+    rev: 7.3.0
     hooks:
       - id: flake8
   - repo: https://github.com/pre-commit/mirrors-mypy
-    rev: v1.16.0
+    rev: v1.16.1
     hooks:
       - id: mypy
   - repo: https://github.com/PyCQA/bandit
-    rev: 1.8.3
+    rev: 1.8.5
     hooks:
       - id: bandit
         args: [-x, tests]
diff -pruN 3.13.1-1/CHANGELOG.md 3.14.0-1/CHANGELOG.md
--- 3.13.1-1/CHANGELOG.md	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/CHANGELOG.md	2025-07-26 19:25:13.000000000 +0000
@@ -1,5 +1,43 @@
 # Changelog
 
+## v3.14.0 (2025-07-26)
+
+### Features
+
+
+- Add revolutions per minute (rpm) data type ([`67511c8`](https://github.com/Bluetooth-Devices/bthome-ble/commit/67511c848d0fd4ce2000f87b196f8cf260c57551))
+
+
+- Add revolutions per minute (rpm) data type ([`67511c8`](https://github.com/Bluetooth-Devices/bthome-ble/commit/67511c848d0fd4ce2000f87b196f8cf260c57551))
+
+
+### Chores
+
+
+- Bump the github-actions group with 2 updates ([`91d4f91`](https://github.com/Bluetooth-Devices/bthome-ble/commit/91d4f9142e1713551cec4030feb667f4247fedac))
+
+
+- Bump bluetooth-data-tools from 1.28.1 to 1.28.2 ([`1d0c4da`](https://github.com/Bluetooth-Devices/bthome-ble/commit/1d0c4dadc716e7653f38390afd80987d4744d185))
+
+
+- Bump pytest from 8.4.0 to 8.4.1 ([`96f50a2`](https://github.com/Bluetooth-Devices/bthome-ble/commit/96f50a2c8055a88fee9c02348ae25121419ec25c))
+
+
+- Bump cryptography from 45.0.4 to 45.0.5 ([`be86d48`](https://github.com/Bluetooth-Devices/bthome-ble/commit/be86d482ad24d8e89ff257c1ed2d1ba1e655aa40))
+
+
+- Bump urllib3 from 2.3.0 to 2.5.0 ([`1c3d0ab`](https://github.com/Bluetooth-Devices/bthome-ble/commit/1c3d0aba9c54cdab02c81d49899369b437f5e26c))
+
+
+- Bump cryptography from 45.0.3 to 45.0.4 ([`3b8289a`](https://github.com/Bluetooth-Devices/bthome-ble/commit/3b8289ac550523a0c044a1b941589b4d07e0bad3))
+
+
+- Pre-commit autoupdate ([`ccc6ae1`](https://github.com/Bluetooth-Devices/bthome-ble/commit/ccc6ae18643926a6f9818b799aabc2eaa93ebef4))
+
+
+- Bump pytest-cov from 6.1.1 to 6.2.1 ([`44b3daf`](https://github.com/Bluetooth-Devices/bthome-ble/commit/44b3daf0c30191c450bcd0abb55cba63a2a282c4))
+
+
 ## v3.13.1 (2025-06-15)
 
 ### Chores
diff -pruN 3.13.1-1/debian/changelog 3.14.0-1/debian/changelog
--- 3.13.1-1/debian/changelog	2025-07-03 11:56:21.000000000 +0000
+++ 3.14.0-1/debian/changelog	2025-07-28 05:58:42.000000000 +0000
@@ -1,3 +1,10 @@
+bthome-ble (3.14.0-1) unstable; urgency=medium
+
+  * New upstream release.
+  * Requires sensor-state-data 2.19.0 or later.
+
+ -- Edward Betts <edward@4angle.com>  Mon, 28 Jul 2025 06:58:42 +0100
+
 bthome-ble (3.13.1-1) unstable; urgency=medium
 
   * New upstream release.
diff -pruN 3.13.1-1/debian/control 3.14.0-1/debian/control
--- 3.13.1-1/debian/control	2025-07-03 11:54:35.000000000 +0000
+++ 3.14.0-1/debian/control	2025-07-28 05:58:42.000000000 +0000
@@ -19,7 +19,7 @@ Build-Depends-Indep:
  python3-myst-parser <!nodoc>,
  python3-pytest <!nocheck>,
  python3-pytest-cov <!nocheck>,
- python3-sensor-state-data <!nocheck>,
+ python3-sensor-state-data (>= 2.19.0) <!nocheck>,
  python3-sphinx <!nodoc>,
  python3-sphinx-rtd-theme <!nodoc>,
 Rules-Requires-Root: no
@@ -33,6 +33,7 @@ Package: python3-bthome-ble
 Architecture: all
 Depends:
  python3-home-assistant-bluetooth,
+ python3-sensor-state-data (>= 2.19.0),
  ${misc:Depends},
  ${python3:Depends},
  ${sphinxdoc:Depends},
diff -pruN 3.13.1-1/poetry.lock 3.14.0-1/poetry.lock
--- 3.13.1-1/poetry.lock	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/poetry.lock	2025-07-26 19:25:13.000000000 +0000
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
 
 [[package]]
 name = "aiooui"
@@ -106,7 +106,7 @@ description = "Python WinRT bindings for
 optional = false
 python-versions = "*"
 groups = ["main"]
-markers = "platform_system == \"Windows\" and python_version < \"3.12\""
+markers = "platform_system == \"Windows\" and python_version == \"3.11\""
 files = [
     {file = "bleak-winrt-1.2.0.tar.gz", hash = "sha256:0577d070251b9354fc6c45ffac57e39341ebb08ead014b1bdbd43e211d2ce1d6"},
     {file = "bleak_winrt-1.2.0-cp310-cp310-win32.whl", hash = "sha256:a2ae3054d6843ae0cfd3b94c83293a1dfd5804393977dd69bde91cb5099fc47c"},
@@ -166,62 +166,62 @@ docs = ["Sphinx (>=5,<8)", "myst-parser
 
 [[package]]
 name = "bluetooth-data-tools"
-version = "1.28.1"
+version = "1.28.2"
 description = "Tools for converting bluetooth data and packets"
 optional = false
 python-versions = ">=3.10"
 groups = ["main"]
 files = [
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3a1d77ec99e4a3d8d7fc64f7a0891440ecd8b88d2bbdfbf5367e1d9beddcff41"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:539b6578885b4fb71186035e0c49e616cdd5ef84afa2d6a3f5fab18e7b8ea52d"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3389f6f3d4e2dfc1708b179a113a60290c8a33710a7b02534978a6cef42f9cca"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a77c7ba723ae1b97e0d9b260d77bb0f578e7356a87a9f74b319e9277f7df602"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:965c1bf9c89e61a3055524c20c468c2953fb6a9ab5b40bb6369767855920fbbc"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:961e145e71c3266705ade6da069ecc34896cb2759a1b5638db15cf18ec2ef0b4"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c5671ec965aff0b6e22de150b221413fb5d195429b73e623cd8935391652127f"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:8ff4cefe9734145e3ddd7f21709c82e7b569ec674f252c35ac4a45a947399f40"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d204b2508214ea895daabd5b6428e71949eefe4cc30fbe1be0feda960767bb9"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ef02152ab79226bd7909a1a48d4c4c8797f9e83b56a6b233fc5c4f56e8670154"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-win32.whl", hash = "sha256:5fc8d37470c841999695f68932a3956aea90cfbac2781a6bce8d81c083f76802"},
-    {file = "bluetooth_data_tools-1.28.1-cp310-cp310-win_amd64.whl", hash = "sha256:4fa7db50ca5ad66d0578b6af4a9e82502c6f1248db8d856b18d5490a6b90bc99"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e711e28b1d7bf07dea4a47d9dfd46355b30fb903607f5075339d9b98a074dbe"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:590b65a2a3b72c31ab37c103bc1fb0727880672783c33c857e6e95dd9233fe8e"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:349fb3c30d1839c74485efa142be565103b9b821e1d3c35cdd4a1f268e4e3809"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:825568201917b102f0204b22351bc854c77f530b26269c291e5f2d868e88349d"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4225ff50c81f5b282e2967f7de6338a34e725f28a5769372e1dd4c1fbaa5f622"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:88c72a520456004c415cc3b5802636c129c230c23a078a495531e1b3894fec06"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95735992c0df6f4259d76bea825f685484c4fa937184847377d1f2b69730b3a3"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e2d235d8b2c3ebf05df32df18db93e25dd8102d1c495a6010788bb7d15e60f16"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4218206a57db713d889f79aa6db11cd36df678532995ab4314a276142c9393af"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9061d8725a5681cf8ec8911282673f63a25dfb6c5d8134b84e916b0831e46f9c"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-win32.whl", hash = "sha256:4ca9c4ce92233ad2415fd33142914490c104abf2fbe2a220326f12810e5575a9"},
-    {file = "bluetooth_data_tools-1.28.1-cp311-cp311-win_amd64.whl", hash = "sha256:93f6466c2ad2945d6f2ccdad2a291efa46f5f0eab6c353830f5944d44b46c168"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae766a43303b897be1739d3c740d2bd59981c8f9c0681b316c3b9102787aa332"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13ebe3d99edf00ac0474f0252d364321be970f509c3c91d985459ba7de32b57b"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828c74ac6b41b2044eb26b282aacc2d04d8845409fe0c09b934cf5d436818516"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:593bf0e67575c6c3624df8761d15912429745704c901de27e643976a07e3d247"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cb050054c2cb33ccb2898873da9b35c529d77622c95dc381a64b540fd6997"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91fdd90d4cc2c25b1cf9e5d420b63daa7c32b56337851d7a6d91738fbc0308e9"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c884e73f32ee68bafbb0e05339f850649daa745a22fba5818b7845c91c0e162"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a8bd5a430451977ca08f8dbd4ca7a1bb016ba70c1f4126831466999fd547be2f"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e9812fa5c50672898d4da1e901f736f6452437edc8788f674dc024595b0f4254"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:beaf78826e2b01aed00bdc66fc2d2a841899d57fbb7c1776cf1e7f4ee6ade9a0"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-win32.whl", hash = "sha256:e20634afd47cc80edcf5975892ea1d3a25f1d8f0fc9c45617c2e2f5db5e5ebe9"},
-    {file = "bluetooth_data_tools-1.28.1-cp312-cp312-win_amd64.whl", hash = "sha256:5b4e6329b26a3562e770bb1ce0f5b7a6e03d749f18d39ea8c3e7ff491d10f550"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c75802ff3576bd1f1e78934aed3f8bab3d3138d77b4ba47e024f4cb9c4e638f0"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e41d6643f2bfad77944515ad9a8d673539beca5bcccb3d9367255e452dd0c04e"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8249a8ffba384c2f3cfa464497d900b3040ca0fb94acaed7e7d43c963b8579"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1255c0c93846ab25ee9beab0670ca1a1aaee7912492cf74d2f77e54b61d81dda"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4598bf2d8eacca632c15b3c95e9a1bcc74bec392b823f1484df3e6f3df6d2024"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b08d346fa13846312082e5a7ada84ef4d4f9f24ff710da1e328edc04faa1d9c8"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-manylinux_2_36_x86_64.whl", hash = "sha256:39f913ba76ce17a7664617941bab688597a7391c4065580de3fe354ddd71eb7b"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:493240081f1331e362c84b8a2c369e3f2c8cc35e3ffdf9eccd1366bed86565e6"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:76f72f64816352ecd3fd20c569e4ced1fd47fec5c2c5302b5560117d09085d14"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b28673e1b55664ed2bf475d9f985f3e860a03d697e59f43238b3457bef7776fb"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0d5b738088f0fc593e69817b3404dbf09b559842fab6027f7176eeca0438e831"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-win32.whl", hash = "sha256:1e96114fd3ad87d12631ba591c8b942ff27383ad4b310a2df230b2bbc2863532"},
-    {file = "bluetooth_data_tools-1.28.1-cp313-cp313-win_amd64.whl", hash = "sha256:0e3a7331fcd837025bb294af6790c7f61b56fd4aa0886434660dffab35ef422c"},
-    {file = "bluetooth_data_tools-1.28.1.tar.gz", hash = "sha256:47156468b220f4c7b3ed2e29b189fd782785b7a551ad5c61fecfe023dc4f6430"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:59de191b17a6d7ab23f00b375638667556424c53f08efd288fc9694cf347edb8"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12498ee9387680205aaa856f964d70517a1ac2d4d64bbb78c35cb1f152137bf1"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a559839fc1fd5f84439608b3df598ed583354a671306ff2cd4ef9e667cba855"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:191b8e40b35cfd4201f01d7638bd9e845cb42479a6cc6943fd3cbcd2c978d434"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52b7bb1268d5e56a658efd666242a0b7b407f460a3257512b77a2fd3ed0bd9f7"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04d2d0310eae1577554edf2b3306f9ed18b9621edff57e153204430cfa83a541"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:82283c317e465dd998af4ddb5553f79992213b4c1055d0ed1977e6786a5401d8"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d26a2398886c37771e35fa4f2c36e965da771fe3e984e76c078a98bcc5eb3733"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ab975c1567aa3fd20e787c8ddc9d55984d0883a251c7d65c55dc3a173f9ef796"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0c8454962e005d48e23af3fe240235e16c81590805dfe0b27b08b82337df16a8"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-win32.whl", hash = "sha256:8e492b786ac561f628bf964f522d669259b608d1f434102d003afdc46dcab473"},
+    {file = "bluetooth_data_tools-1.28.2-cp310-cp310-win_amd64.whl", hash = "sha256:567dae42c2e1d7da5aeca1ef181bd660db8fc2f3fe3af7e999e82a030a1a422d"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4042b36f1c50bcdc0afb6be78a0bac11a8be6a73a3284825502ce6e82661423e"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:728cfb9fd366b01eec9eaa226353cdd43e099288974f6e9273dc90a577fc970a"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e3a2c9fba041b8486f1a4d4098b40241168a2d79ab0f5cdbccafadac7e41747"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d3cd8bb926742f01ced40b635a860c1cf5a6b82c3ce88e8431ee77e1062b7d6"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a791a07d60ae70e2fc174688abd1e28fdc54a0c337b6306ce6c6a66c06e41db7"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2049946c4a489db86c7f5cc32ef50894952244be07a5919a58f8b4b03f742b1"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b3344421a012641f21ffbc7e3d5955dbc19150ad48d800b4b61a7a2cb4ee0d87"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9e068aa7b0c147f8bae735298c041058693e8ee3763d769ca6cbd938210ed715"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0eed475d3dfe8af519348047f150b52dcaa5aa84c5a5bae023a6df3005fe95b1"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dfffdaab077173886c64c5c89329d00c7140302fd7f537e3f7bd00d8b851c9d8"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-win32.whl", hash = "sha256:02045a0dc566122f3e30e4ac5861f35c5749cd52eda4abd5a3918c27bfff28fb"},
+    {file = "bluetooth_data_tools-1.28.2-cp311-cp311-win_amd64.whl", hash = "sha256:ed619bb4fd4a3794c9c11c140c59a727bb1f63d0888e135da8382d2dbc8c18f9"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8eef61057a754293e2ca54e153ba804bc313257881bd8360de091524b3dffc0"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c1567e45ed6b4987db1e70e7f59d7499a57f8eec2e4a38131eeedd8c5b52bc81"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:094a6a4aeaf82a6e939318f716294fa7d65a8f025f8b10471e2145320a57b412"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:59398ab013e33539a08cc0dcf19f0fc4a7dc6311d5dc5bfb7af03906fc3a902f"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:010564351a0b269371b5f5dc4ed1084b9524028f106cce49208db5b1bc236e84"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:639f89a57936fb65a881ea7dd60dc6d8bc5b859e740d2c4e699f28f28f3da992"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60dac54c9fe308a9dc4b7bc5c94d174c6e93931ac27cdfba8b2cd5c19d73f126"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:50493246908a5aaa305d00df86a83d915a00cc1a783e05d6666ea3ff293cc137"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7fcbf974dc3a7d1a00cebacc424dcf1d18d4eac4bccecba1d8ff5a1e8eb0b348"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a5e9eb874c9823d330dd0eadca9176a8a713395908f865c19156a233da7b5c2"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-win32.whl", hash = "sha256:d3346ef76577f5060955a80c46ae16004f76673d844f8c44a416bd8177d6695c"},
+    {file = "bluetooth_data_tools-1.28.2-cp312-cp312-win_amd64.whl", hash = "sha256:872c31ba9042ed614aad459fd0358893554c67e2fa5c2d78d525cd96af3e31da"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:71df3e6221ee472cb38fd625cecc6e0a8733e093e40c08e80638e9387349b43b"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2925335caf40bb9872a8733d823bb8e97bac2bc7ce988a695452e4a39507e29"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:535c037b3ccd86a5df890b338b901eea3e974692ae07b591c1f99e787d629170"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:080668765dc7d04d6b78a7bc0feaffd14b45ccee58b5c005a22b78e3730934fd"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c2947f86112fc308973df735f030ede800473dd61f9e32d62d55bfb5c00748"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-manylinux_2_31_armv7l.manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d74c6b9187b444e548cd01ce56c74eb0c1ba592043b9a1f48a9c2ed19a8a236a"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-manylinux_2_36_x86_64.whl", hash = "sha256:ad09f0dbc343e51c34f32672aa877373d747eebe956c640117ce9472c86f1cb2"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c833481774fe319ef239351bb8a028cc2efe44ad7cf23681bd2cd2a4dfb71599"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a989a4a5e8e4d70410fd9bba7b03f970bed7b8f79531087565931314437420be"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6f30e619ca3b46716a7f8c2bde35776d36e6b98e1922f0642034618e1056b3b3"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cf3714c9e27aaa7db0800816bf766919cd1ac18080bac0102c2ad466db02f47a"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-win32.whl", hash = "sha256:8f28eeee5fecaebeb9fc1012e4220bc3c1ee6ee82bf8a17b9183995933f6d938"},
+    {file = "bluetooth_data_tools-1.28.2-cp313-cp313-win_amd64.whl", hash = "sha256:e748587be85a8133b0a43e34e2c6f65dbf5113765a03d4f89c26039b8289decb"},
+    {file = "bluetooth_data_tools-1.28.2.tar.gz", hash = "sha256:2afa97695fc61c8d55d19ffa9485a498051410f399a183852d1bf29f675c3537"},
 ]
 
 [package.dependencies]
@@ -272,9 +272,10 @@ test = ["coverage", "pycodestyle"]
 name = "certifi"
 version = "2025.1.31"
 description = "Python package for providing Mozilla's CA Bundle."
-optional = false
+optional = true
 python-versions = ">=3.6"
 groups = ["main"]
+markers = "extra == \"docs\""
 files = [
     {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
     {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
@@ -365,9 +366,10 @@ pycparser = "*"
 name = "charset-normalizer"
 version = "3.4.1"
 description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
+optional = true
 python-versions = ">=3.7"
 groups = ["main"]
+markers = "extra == \"docs\""
 files = [
     {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
     {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
@@ -554,49 +556,49 @@ toml = ["tomli ; python_full_version <=
 
 [[package]]
 name = "cryptography"
-version = "45.0.3"
+version = "45.0.5"
 description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
 optional = false
 python-versions = "!=3.9.0,!=3.9.1,>=3.7"
 groups = ["main"]
 files = [
-    {file = "cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca"},
-    {file = "cryptography-45.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1"},
-    {file = "cryptography-45.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578"},
-    {file = "cryptography-45.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497"},
-    {file = "cryptography-45.0.3-cp311-abi3-win32.whl", hash = "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710"},
-    {file = "cryptography-45.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490"},
-    {file = "cryptography-45.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b"},
-    {file = "cryptography-45.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782"},
-    {file = "cryptography-45.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65"},
-    {file = "cryptography-45.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b"},
-    {file = "cryptography-45.0.3-cp37-abi3-win32.whl", hash = "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab"},
-    {file = "cryptography-45.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed43d396f42028c1f47b5fec012e9e12631266e3825e95c00e3cf94d472dac49"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fed5aaca1750e46db870874c9c273cd5182a9e9deb16f06f7bdffdb5c2bde4b9"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:00094838ecc7c6594171e8c8a9166124c1197b074cfca23645cee573910d76bc"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:92d5f428c1a0439b2040435a1d6bc1b26ebf0af88b093c3628913dd464d13fa1"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:ec64ee375b5aaa354b2b273c921144a660a511f9df8785e6d1c942967106438e"},
-    {file = "cryptography-45.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:71320fbefd05454ef2d457c481ba9a5b0e540f3753354fff6f780927c25d19b0"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c"},
-    {file = "cryptography-45.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19"},
-    {file = "cryptography-45.0.3.tar.gz", hash = "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899"},
+    {file = "cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9"},
+    {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27"},
+    {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e"},
+    {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174"},
+    {file = "cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9"},
+    {file = "cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63"},
+    {file = "cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42"},
+    {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492"},
+    {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0"},
+    {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a"},
+    {file = "cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f"},
+    {file = "cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e"},
+    {file = "cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1"},
+    {file = "cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f"},
+    {file = "cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a"},
 ]
 
 [package.dependencies]
@@ -609,7 +611,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=
 pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
 sdist = ["build (>=1.0.0)"]
 ssh = ["bcrypt (>=3.1.5)"]
-test = ["certifi (>=2024)", "cryptography-vectors (==45.0.3)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
+test = ["certifi (>=2024)", "cryptography-vectors (==45.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
 test-randomorder = ["pytest-randomly"]
 
 [[package]]
@@ -742,9 +744,10 @@ dbus-fast = {version = ">=2.30.2", marke
 name = "idna"
 version = "3.10"
 description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
+optional = true
 python-versions = ">=3.6"
 groups = ["main"]
+markers = "extra == \"docs\""
 files = [
     {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
     {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
@@ -1116,14 +1119,14 @@ files = [
 
 [[package]]
 name = "pytest"
-version = "8.4.0"
+version = "8.4.1"
 description = "pytest: simple powerful testing with Python"
 optional = false
 python-versions = ">=3.9"
 groups = ["dev"]
 files = [
-    {file = "pytest-8.4.0-py3-none-any.whl", hash = "sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e"},
-    {file = "pytest-8.4.0.tar.gz", hash = "sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6"},
+    {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"},
+    {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"},
 ]
 
 [package.dependencies]
@@ -1138,19 +1141,20 @@ dev = ["argcomplete", "attrs (>=19.2)",
 
 [[package]]
 name = "pytest-cov"
-version = "6.1.1"
+version = "6.2.1"
 description = "Pytest plugin for measuring coverage."
 optional = false
 python-versions = ">=3.9"
 groups = ["dev"]
 files = [
-    {file = "pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde"},
-    {file = "pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a"},
+    {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"},
+    {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"},
 ]
 
 [package.dependencies]
 coverage = {version = ">=7.5", extras = ["toml"]}
-pytest = ">=4.6"
+pluggy = ">=1.2"
+pytest = ">=6.2.5"
 
 [package.extras]
 testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"]
@@ -1223,9 +1227,10 @@ files = [
 name = "requests"
 version = "2.32.4"
 description = "Python HTTP for Humans."
-optional = false
+optional = true
 python-versions = ">=3.8"
 groups = ["main"]
+markers = "extra == \"docs\""
 files = [
     {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"},
     {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"},
@@ -1260,18 +1265,18 @@ test = ["pytest (>=8)"]
 
 [[package]]
 name = "sensor-state-data"
-version = "2.18.1"
+version = "2.19.0"
 description = "Models for storing and converting Sensor Data state"
 optional = false
 python-versions = "<4.0,>=3.9"
 groups = ["main"]
 files = [
-    {file = "sensor_state_data-2.18.1-py3-none-any.whl", hash = "sha256:45a223acf5d4aefde45c028fa810c7925db6448984097aa1b500fe4f206d113f"},
-    {file = "sensor_state_data-2.18.1.tar.gz", hash = "sha256:25f17ed98748ae006ddab82d5013cf30301daaf23526d1992f99c4dc0beb49c3"},
+    {file = "sensor_state_data-2.19.0-py3-none-any.whl", hash = "sha256:79313cf595aa3d71d65ac349804eedae5bff5e9f17614732d6268041cb6b5043"},
+    {file = "sensor_state_data-2.19.0.tar.gz", hash = "sha256:d125c27eff7b4d56816c10e4af8866d1a9d419192eda1a0c8b40d87e6246cca5"},
 ]
 
 [package.extras]
-docs = ["Sphinx (>=5.0,<6.0)", "myst-parser (>=0.18,<0.19)", "sphinx-rtd-theme (>=1.0,<2.0)"]
+docs = ["Sphinx (>=5,<8)", "myst-parser (>=0.18,<3.1)", "sphinx-rtd-theme (>=1,<4)"]
 
 [[package]]
 name = "snowballstemmer"
@@ -1473,7 +1478,7 @@ description = "Backported and Experiment
 optional = false
 python-versions = ">=3.8"
 groups = ["main"]
-markers = "python_version < \"3.12\""
+markers = "python_version == \"3.11\""
 files = [
     {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"},
     {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"},
@@ -1493,14 +1498,15 @@ files = [
 
 [[package]]
 name = "urllib3"
-version = "2.3.0"
+version = "2.5.0"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
+optional = true
 python-versions = ">=3.9"
 groups = ["main"]
+markers = "extra == \"docs\""
 files = [
-    {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
-    {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+    {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
+    {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
 ]
 
 [package.extras]
@@ -1785,4 +1791,4 @@ docs = ["Sphinx", "myst-parser", "sphinx
 [metadata]
 lock-version = "2.1"
 python-versions = "^3.11,<3.14"
-content-hash = "9c94e293a573ef2dda90a1505c66abbe2b2436f395cd2903645724c5ec590597"
+content-hash = "fb937e187cdc5f419cafe9b891036d921de99d5d6aabbb17666de4c1caeb7b89"
diff -pruN 3.13.1-1/pyproject.toml 3.14.0-1/pyproject.toml
--- 3.13.1-1/pyproject.toml	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/pyproject.toml	2025-07-26 19:25:13.000000000 +0000
@@ -1,6 +1,6 @@
 [project]
 name = "bthome-ble"
-version = "3.13.1"
+version = "3.14.0"
 description = "BThome BLE support"
 authors = [{ name = "Ernst Klamer", email = "e.klamer@gmail.com" }]
 license = "MIT"
@@ -48,7 +48,7 @@ docs = [
 
 [tool.poetry.group.dev.dependencies]
 pytest = "^8.4"
-pytest-cov = "^6.1"
+pytest-cov = "^6.2"
 
 [tool.semantic_release]
 branch = "main"
diff -pruN 3.13.1-1/src/bthome_ble/const.py 3.14.0-1/src/bthome_ble/const.py
--- 3.13.1-1/src/bthome_ble/const.py	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/src/bthome_ble/const.py	2025-07-26 19:25:13.000000000 +0000
@@ -46,6 +46,9 @@ class ExtendedSensorDeviceClass(BaseDevi
     # Precipitation
     PRECIPITATION = "precipitation"
 
+    # Rotational speed
+    ROTATIONAL_SPEED = "rotational_speed"
+
 
 class ExtendedSensorLibrary(SensorLibrary):
     """Sensor Library for additional sensors (compared to sensor-state-data)."""
@@ -74,11 +77,17 @@ class ExtendedSensorLibrary(SensorLibrar
         device_class=ExtendedSensorDeviceClass.PRECIPITATION,
         native_unit_of_measurement=Units.LENGTH_MILLIMETERS,
     )
+
     CHANNEL__NONE = description.BaseSensorDescription(
         device_class=ExtendedSensorDeviceClass.CHANNEL,
         native_unit_of_measurement=None,
     )
 
+    ROTATIONAL_SPEED__REVOLUTIONS_PER_MINUTE = description.BaseSensorDescription(
+        device_class=ExtendedSensorDeviceClass.ROTATIONAL_SPEED,
+        native_unit_of_measurement=Units.REVOLUTIONS_PER_MINUTE,
+    )
+
 
 MEAS_TYPES: dict[int, MeasTypes] = {
     0x00: MeasTypes(meas_format=SensorLibrary.PACKET_ID__NONE),
@@ -484,4 +493,8 @@ MEAS_TYPES: dict[int, MeasTypes] = {
         factor=0.1,
     ),
     0x60: MeasTypes(meas_format=ExtendedSensorLibrary.CHANNEL__NONE),
+    0x61: MeasTypes(
+        meas_format=ExtendedSensorLibrary.ROTATIONAL_SPEED__REVOLUTIONS_PER_MINUTE,
+        data_length=2,
+    ),
 }
diff -pruN 3.13.1-1/tests/test_parser_v2.py 3.14.0-1/tests/test_parser_v2.py
--- 3.13.1-1/tests/test_parser_v2.py	2025-06-15 07:41:35.000000000 +0000
+++ 3.14.0-1/tests/test_parser_v2.py	2025-07-26 19:25:13.000000000 +0000
@@ -4021,3 +4021,47 @@ def test_bthome_channel(caplog):
             ),
         },
     )
+
+
+def test_bthome_revolutions_per_minute(caplog):
+    """Test BTHome parser for Revolutions Per Minute(0x61) without encryption."""
+    data_string = b"\x40\x61\xac\x0d"
+    advertisement = bytes_to_service_info(
+        data_string, local_name="TEST DEVICE", address="A4:C1:38:8D:18:B2"
+    )
+
+    device = BTHomeBluetoothDeviceData()
+    assert device.update(advertisement) == SensorUpdate(
+        title="TEST DEVICE 18B2",
+        devices={
+            None: SensorDeviceInfo(
+                name="TEST DEVICE 18B2",
+                manufacturer=None,
+                model="BTHome sensor",
+                sw_version="BTHome BLE v2",
+                hw_version=None,
+            )
+        },
+        entity_descriptions={
+            DeviceKey(key="rotational_speed", device_id=None): SensorDescription(
+                device_key=DeviceKey(key="rotational_speed", device_id=None),
+                device_class=ExtendedSensorDeviceClass.ROTATIONAL_SPEED,
+                native_unit_of_measurement=Units.REVOLUTIONS_PER_MINUTE,
+            ),
+            KEY_SIGNAL_STRENGTH: SensorDescription(
+                device_key=KEY_SIGNAL_STRENGTH,
+                device_class=SensorDeviceClass.SIGNAL_STRENGTH,
+                native_unit_of_measurement=Units.SIGNAL_STRENGTH_DECIBELS_MILLIWATT,
+            ),
+        },
+        entity_values={
+            DeviceKey(key="rotational_speed", device_id=None): SensorValue(
+                device_key=DeviceKey(key="rotational_speed", device_id=None),
+                name="Rotational Speed",
+                native_value=3500,
+            ),
+            KEY_SIGNAL_STRENGTH: SensorValue(
+                device_key=KEY_SIGNAL_STRENGTH, name="Signal Strength", native_value=-60
+            ),
+        },
+    )
