diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 2e1df49549efa7d3c55c4a64a864e157a9a82983..c20886f23425fab5608d401fed5a2dc65a89727c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -36,6 +36,7 @@ env:
   CACHE_VERSION: 5
   PIP_CACHE_VERSION: 4
   MYPY_CACHE_VERSION: 4
+  BLACK_CACHE_VERSION: 1
   HA_SHORT_VERSION: "2023.10"
   DEFAULT_PYTHON: "3.11"
   ALL_PYTHON_VERSIONS: "['3.11']"
@@ -55,6 +56,7 @@ env:
   POSTGRESQL_VERSIONS: "['postgres:12.14','postgres:15.2']"
   PRE_COMMIT_CACHE: ~/.cache/pre-commit
   PIP_CACHE: /tmp/pip-cache
+  BLACK_CACHE: /tmp/black-cache
   SQLALCHEMY_WARN_20: 1
   PYTHONASYNCIODEBUG: 1
   HASS_CI: 1
@@ -272,6 +274,13 @@ jobs:
         with:
           python-version: ${{ env.DEFAULT_PYTHON }}
           check-latest: true
+      - name: Generate partial black restore key
+        id: generate-black-key
+        run: |
+          black_version=$(cat requirements_test_pre_commit.txt | grep black | cut -d '=' -f 3)
+          echo "version=$black_version" >> $GITHUB_OUTPUT
+          echo "key=black-${{ env.BLACK_CACHE_VERSION }}-$black_version-${{
+            env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
       - name: Restore base Python virtual environment
         id: cache-venv
         uses: actions/cache/restore@v3.3.2
@@ -290,14 +299,28 @@ jobs:
           key: >-
             ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
               needs.info.outputs.pre-commit_cache_key }}
+      - name: Restore black cache
+        uses: actions/cache@v3.3.2
+        with:
+          path: ${{ env.BLACK_CACHE }}
+          key: >-
+            ${{ runner.os }}-${{ steps.python.outputs.python-version }}-${{
+            steps.generate-black-key.outputs.key }}
+          restore-keys: |
+            ${{ runner.os }}-${{ steps.python.outputs.python-version }}-black-${{
+            env.BLACK_CACHE_VERSION }}-${{ steps.generate-black-key.outputs.version }}-${{
+            env.HA_SHORT_VERSION }}-
       - name: Run black (fully)
-        if: needs.info.outputs.test_full_suite == 'true'
+        env:
+          BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
         run: |
           . venv/bin/activate
           pre-commit run --hook-stage manual black --all-files --show-diff-on-failure
       - name: Run black (partially)
         if: needs.info.outputs.test_full_suite == 'false'
         shell: bash
+        env:
+          BLACK_CACHE_DIR: ${{ env.BLACK_CACHE }}
         run: |
           . venv/bin/activate
           shopt -s globstar