diff --git a/.github/workflows/builder.yml b/.github/workflows/builder.yml index cc100c48fd8..03c896cce1c 100644 --- a/.github/workflows/builder.yml +++ b/.github/workflows/builder.yml @@ -46,10 +46,10 @@ jobs: with: type: ${{ env.BUILD_TYPE }} - - name: Verify version - uses: home-assistant/actions/helpers/verify-version@master - with: - ignore-dev: true + # - name: Verify version + # uses: home-assistant/actions/helpers/verify-version@master + # with: + # ignore-dev: true - name: Fail if translations files are checked in run: | @@ -205,334 +205,3 @@ jobs: --cosign \ --target /data \ --generic ${{ needs.init.outputs.version }} - - build_machine: - name: Build ${{ matrix.machine }} machine core image - if: github.repository_owner == 'home-assistant' - needs: ["init", "build_base"] - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - id-token: write - strategy: - matrix: - machine: - - generic-x86-64 - - intel-nuc - - khadas-vim3 - - odroid-c2 - - odroid-c4 - - odroid-m1 - - odroid-n2 - - odroid-xu - - qemuarm - - qemuarm-64 - - qemux86 - - qemux86-64 - - raspberrypi - - raspberrypi2 - - raspberrypi3 - - raspberrypi3-64 - - raspberrypi4 - - raspberrypi4-64 - - raspberrypi5-64 - - tinker - - yellow - - green - steps: - - name: Checkout the repository - uses: actions/checkout@v4.2.2 - - - name: Set build additional args - run: | - # Create general tags - if [[ "${{ needs.init.outputs.version }}" =~ d ]]; then - echo "BUILD_ARGS=--additional-tag dev" >> $GITHUB_ENV - elif [[ "${{ needs.init.outputs.version }}" =~ b ]]; then - echo "BUILD_ARGS=--additional-tag beta" >> $GITHUB_ENV - else - echo "BUILD_ARGS=--additional-tag stable" >> $GITHUB_ENV - fi - - - name: Login to GitHub Container Registry - uses: docker/login-action@v3.3.0 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build base image - uses: home-assistant/builder@2024.08.2 - with: - args: | - $BUILD_ARGS \ - --target /data/machine \ - --cosign \ - --machine "${{ needs.init.outputs.version }}=${{ matrix.machine }}" - - publish_ha: - name: Publish version files - environment: ${{ needs.init.outputs.channel }} - if: github.repository_owner == 'home-assistant' - needs: ["init", "build_machine"] - runs-on: ubuntu-latest - steps: - - name: Checkout the repository - uses: actions/checkout@v4.2.2 - - - name: Initialize git - uses: home-assistant/actions/helpers/git-init@master - with: - name: ${{ secrets.GIT_NAME }} - email: ${{ secrets.GIT_EMAIL }} - token: ${{ secrets.GIT_TOKEN }} - - - name: Update version file - uses: home-assistant/actions/helpers/version-push@master - with: - key: "homeassistant[]" - key-description: "Home Assistant Core" - version: ${{ needs.init.outputs.version }} - channel: ${{ needs.init.outputs.channel }} - - - name: Update version file (stable -> beta) - if: needs.init.outputs.channel == 'stable' - uses: home-assistant/actions/helpers/version-push@master - with: - key: "homeassistant[]" - key-description: "Home Assistant Core" - version: ${{ needs.init.outputs.version }} - channel: beta - - publish_container: - name: Publish meta container for ${{ matrix.registry }} - environment: ${{ needs.init.outputs.channel }} - if: github.repository_owner == 'home-assistant' - needs: ["init", "build_base"] - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - id-token: write - strategy: - fail-fast: false - matrix: - registry: ["ghcr.io/home-assistant", "docker.io/homeassistant"] - steps: - - name: Checkout the repository - uses: actions/checkout@v4.2.2 - - - name: Install Cosign - uses: sigstore/cosign-installer@v3.7.0 - with: - cosign-release: "v2.2.3" - - - name: Login to DockerHub - if: matrix.registry == 'docker.io/homeassistant' - uses: docker/login-action@v3.3.0 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Login to GitHub Container Registry - if: matrix.registry == 'ghcr.io/home-assistant' - uses: docker/login-action@v3.3.0 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Meta Image - shell: bash - run: | - export DOCKER_CLI_EXPERIMENTAL=enabled - - function create_manifest() { - local tag_l=${1} - local tag_r=${2} - local registry=${{ matrix.registry }} - - docker manifest create "${registry}/home-assistant:${tag_l}" \ - "${registry}/amd64-homeassistant:${tag_r}" \ - "${registry}/i386-homeassistant:${tag_r}" \ - "${registry}/armhf-homeassistant:${tag_r}" \ - "${registry}/armv7-homeassistant:${tag_r}" \ - "${registry}/aarch64-homeassistant:${tag_r}" - - docker manifest annotate "${registry}/home-assistant:${tag_l}" \ - "${registry}/amd64-homeassistant:${tag_r}" \ - --os linux --arch amd64 - - docker manifest annotate "${registry}/home-assistant:${tag_l}" \ - "${registry}/i386-homeassistant:${tag_r}" \ - --os linux --arch 386 - - docker manifest annotate "${registry}/home-assistant:${tag_l}" \ - "${registry}/armhf-homeassistant:${tag_r}" \ - --os linux --arch arm --variant=v6 - - docker manifest annotate "${registry}/home-assistant:${tag_l}" \ - "${registry}/armv7-homeassistant:${tag_r}" \ - --os linux --arch arm --variant=v7 - - docker manifest annotate "${registry}/home-assistant:${tag_l}" \ - "${registry}/aarch64-homeassistant:${tag_r}" \ - --os linux --arch arm64 --variant=v8 - - docker manifest push --purge "${registry}/home-assistant:${tag_l}" - cosign sign --yes "${registry}/home-assistant:${tag_l}" - } - - function validate_image() { - local image=${1} - if ! cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com --certificate-identity-regexp https://github.com/home-assistant/core/.* "${image}"; then - echo "Invalid signature!" - exit 1 - fi - } - - function push_dockerhub() { - local image=${1} - local tag=${2} - - docker tag "ghcr.io/home-assistant/${image}:${tag}" "docker.io/homeassistant/${image}:${tag}" - docker push "docker.io/homeassistant/${image}:${tag}" - cosign sign --yes "docker.io/homeassistant/${image}:${tag}" - } - - # Pull images from github container registry and verify signature - docker pull "ghcr.io/home-assistant/amd64-homeassistant:${{ needs.init.outputs.version }}" - docker pull "ghcr.io/home-assistant/i386-homeassistant:${{ needs.init.outputs.version }}" - docker pull "ghcr.io/home-assistant/armhf-homeassistant:${{ needs.init.outputs.version }}" - docker pull "ghcr.io/home-assistant/armv7-homeassistant:${{ needs.init.outputs.version }}" - docker pull "ghcr.io/home-assistant/aarch64-homeassistant:${{ needs.init.outputs.version }}" - - validate_image "ghcr.io/home-assistant/amd64-homeassistant:${{ needs.init.outputs.version }}" - validate_image "ghcr.io/home-assistant/i386-homeassistant:${{ needs.init.outputs.version }}" - validate_image "ghcr.io/home-assistant/armhf-homeassistant:${{ needs.init.outputs.version }}" - validate_image "ghcr.io/home-assistant/armv7-homeassistant:${{ needs.init.outputs.version }}" - validate_image "ghcr.io/home-assistant/aarch64-homeassistant:${{ needs.init.outputs.version }}" - - if [[ "${{ matrix.registry }}" == "docker.io/homeassistant" ]]; then - # Upload images to dockerhub - push_dockerhub "amd64-homeassistant" "${{ needs.init.outputs.version }}" - push_dockerhub "i386-homeassistant" "${{ needs.init.outputs.version }}" - push_dockerhub "armhf-homeassistant" "${{ needs.init.outputs.version }}" - push_dockerhub "armv7-homeassistant" "${{ needs.init.outputs.version }}" - push_dockerhub "aarch64-homeassistant" "${{ needs.init.outputs.version }}" - fi - - # Create version tag - create_manifest "${{ needs.init.outputs.version }}" "${{ needs.init.outputs.version }}" - - # Create general tags - if [[ "${{ needs.init.outputs.version }}" =~ d ]]; then - create_manifest "dev" "${{ needs.init.outputs.version }}" - elif [[ "${{ needs.init.outputs.version }}" =~ b ]]; then - create_manifest "beta" "${{ needs.init.outputs.version }}" - create_manifest "rc" "${{ needs.init.outputs.version }}" - else - create_manifest "stable" "${{ needs.init.outputs.version }}" - create_manifest "latest" "${{ needs.init.outputs.version }}" - create_manifest "beta" "${{ needs.init.outputs.version }}" - create_manifest "rc" "${{ needs.init.outputs.version }}" - - # Create series version tag (e.g. 2021.6) - v="${{ needs.init.outputs.version }}" - create_manifest "${v%.*}" "${{ needs.init.outputs.version }}" - fi - - build_python: - name: Build PyPi package - environment: ${{ needs.init.outputs.channel }} - needs: ["init", "build_base"] - runs-on: ubuntu-latest - if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true' - steps: - - name: Checkout the repository - uses: actions/checkout@v4.2.2 - - - name: Set up Python ${{ env.DEFAULT_PYTHON }} - uses: actions/setup-python@v5.3.0 - with: - python-version: ${{ env.DEFAULT_PYTHON }} - - - name: Download translations - uses: actions/download-artifact@v4.1.8 - with: - name: translations - - - name: Extract translations - run: | - tar xvf translations.tar.gz - rm translations.tar.gz - - - name: Build package - shell: bash - run: | - # Remove dist, build, and homeassistant.egg-info - # when build locally for testing! - pip install twine build - python -m build - - - name: Upload package - shell: bash - run: | - export TWINE_USERNAME="__token__" - export TWINE_PASSWORD="${{ secrets.TWINE_TOKEN }}" - - twine upload dist/* --skip-existing - - hassfest-image: - name: Build and test hassfest image - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - attestations: write - id-token: write - needs: ["init"] - if: github.repository_owner == 'home-assistant' - env: - HASSFEST_IMAGE_NAME: ghcr.io/home-assistant/hassfest - HASSFEST_IMAGE_TAG: ghcr.io/home-assistant/hassfest:${{ needs.init.outputs.version }} - steps: - - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Login to GitHub Container Registry - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Docker image - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 - with: - context: . # So action will not pull the repository again - file: ./script/hassfest/docker/Dockerfile - load: true - tags: ${{ env.HASSFEST_IMAGE_TAG }} - - - name: Run hassfest against core - run: docker run --rm -v ${{ github.workspace }}/homeassistant:/github/workspace/homeassistant ${{ env.HASSFEST_IMAGE_TAG }} --core-integrations-path=/github/workspace/homeassistant/components - - - name: Push Docker image - if: needs.init.outputs.channel != 'dev' && needs.init.outputs.publish == 'true' - id: push - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 - with: - context: . # So action will not pull the repository again - file: ./script/hassfest/docker/Dockerfile - push: true - tags: ${{ env.HASSFEST_IMAGE_TAG }},${{ env.HASSFEST_IMAGE_NAME }}:latest - - - name: Generate artifact attestation - if: needs.init.outputs.channel != 'dev' && needs.init.outputs.publish == 'true' - uses: actions/attest-build-provenance@ef244123eb79f2f7a7e75d99086184180e6d0018 # v1.4.4 - with: - subject-name: ${{ env.HASSFEST_IMAGE_NAME }} - subject-digest: ${{ steps.push.outputs.digest }} - push-to-registry: true diff --git a/Dockerfile b/Dockerfile index 15574192093..10061485742 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,14 +25,14 @@ RUN \ --no-build \ -r homeassistant/requirements.txt -COPY requirements_all.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/ +COPY requirements_top.txt home_assistant_frontend-* home_assistant_intents-* homeassistant/ RUN \ if ls homeassistant/home_assistant_*.whl 1> /dev/null 2>&1; then \ uv pip install homeassistant/home_assistant_*.whl; \ fi \ && uv pip install \ --no-build \ - -r homeassistant/requirements_all.txt + -r homeassistant/requirements_top.txt ## Setup Home Assistant Core COPY . homeassistant/ diff --git a/requirements_top.txt b/requirements_top.txt new file mode 100644 index 00000000000..b8e04ab1e54 --- /dev/null +++ b/requirements_top.txt @@ -0,0 +1,1112 @@ +# Home Assistant Core, full dependency set +# Automatically generated by gen_requirements_all.py, do not edit + +-r requirements.txt + +# homeassistant.components.aemet +AEMET-OpenData==0.5.4 + +# homeassistant.components.honeywell +AIOSomecomfort==0.0.25 + +# homeassistant.components.doorbird +DoorBirdPy==3.0.8 + +# homeassistant.components.homekit +HAP-python==4.9.2 + +# homeassistant.components.tasmota +HATasmota==0.9.2 + +# homeassistant.components.doods +# homeassistant.components.generic +# homeassistant.components.image_upload +# homeassistant.components.matrix +# homeassistant.components.proxy +# homeassistant.components.qrcode +# homeassistant.components.seven_segments +# homeassistant.components.sighthound +# homeassistant.components.tensorflow +Pillow==11.0.0 + +# homeassistant.components.plex +PlexAPI==4.15.16 + +# homeassistant.components.cast +PyChromecast==14.0.5 + +# homeassistant.components.flume +PyFlume==0.6.5 + +# homeassistant.components.fronius +PyFronius==0.7.3 + +# homeassistant.components.met +# homeassistant.components.norway_air +PyMetno==0.13.0 + +# homeassistant.components.nina +PyNINA==0.3.3 + +# homeassistant.components.mobile_app +# homeassistant.components.owntracks +PyNaCl==1.5.0 + +# homeassistant.auth.mfa_modules.totp +# homeassistant.components.homekit +PyQRCode==1.2.1 + +# homeassistant.components.switchbot +PySwitchbot==0.51.0 + +# homeassistant.components.syncthru +PySyncThru==0.7.10 + +# homeassistant.components.camera +# homeassistant.components.stream +PyTurboJPEG==1.7.5 + +# homeassistant.components.vicare +PyViCare==2.35.0 + +# homeassistant.components.xiaomi_aqara +PyXiaomiGateway==0.14.3 + +# homeassistant.components.rachio +RachioPy==1.1.0 + +# homeassistant.components.python_script +RestrictedPython==7.4 + +# homeassistant.components.recorder +# homeassistant.components.sql +SQLAlchemy==2.0.31 + +# homeassistant.components.onvif +WSDiscovery==2.0.0 + +# homeassistant.components.accuweather +accuweather==3.0.0 + +# homeassistant.components.androidtv +adb-shell[async]==0.4.4 + +# homeassistant.components.adguard +adguardhome==0.7.0 + +# homeassistant.components.frontier_silicon +afsapi==0.2.7 + +# homeassistant.components.gdacs +aio-georss-gdacs==0.10 + +# homeassistant.components.ambient_network +# homeassistant.components.ambient_station +aioambient==2024.08.0 + +# homeassistant.components.apcupsd +aioapcaccess==0.4.2 + +# homeassistant.components.asuswrt +aioasuswrt==1.4.0 + +# homeassistant.components.husqvarna_automower +aioautomower==2024.10.3 + +# homeassistant.components.dhcp +aiodhcpwatcher==1.0.2 + +# homeassistant.components.dhcp +aiodiscover==2.1.0 + +# homeassistant.components.dnsip +aiodns==3.2.0 + +# homeassistant.components.ecowitt +aioecowitt==2024.2.1 + +# homeassistant.components.co2signal +aioelectricitymaps==0.4.0 + +# homeassistant.components.esphome +aioesphomeapi==27.0.1 + +# homeassistant.components.github +# homeassistant.components.iron_os +aiogithubapi==24.6.0 + +# homeassistant.components.harmony +aioharmony==0.2.10 + +# homeassistant.components.hassio +aiohasupervisor==0.2.1 + +# homeassistant.components.homekit_controller +aiohomekit==3.2.6 + +# homeassistant.components.hue +aiohue==4.7.3 + +# homeassistant.components.imap +aioimaplib==1.1.0 + +# homeassistant.components.lifx +aiolifx-effects==0.3.2 + +# homeassistant.components.lifx +aiolifx-themes==0.5.5 + +# homeassistant.components.lifx +aiolifx==1.1.1 + +# homeassistant.components.lyric +aiolyric==2.0.1 + +# homeassistant.components.yamaha_musiccast +aiomusiccast==0.14.8 + +# homeassistant.components.nanoleaf +aionanoleaf==0.2.1 + +# homeassistant.components.nut +aionut==4.3.3 + +# homeassistant.components.nmap_tracker +aiooui==0.1.7 + +# homeassistant.components.pvpc_hourly_pricing +aiopvpc==4.2.2 + +# homeassistant.components.lidarr +# homeassistant.components.radarr +# homeassistant.components.sonarr +aiopyarr==23.4.0 + +# homeassistant.components.shelly +aioshelly==12.0.1 + +# homeassistant.components.solaredge +aiosolaredge==0.2.0 + +# homeassistant.components.tankerkoenig +aiotankerkoenig==0.4.2 + +# homeassistant.components.tractive +aiotractive==0.6.0 + +# homeassistant.components.unifi +aiounifi==80 + +# homeassistant.components.vlc_telnet +aiovlc==0.5.1 + +# homeassistant.components.waqi +aiowaqi==3.1.0 + +# homeassistant.components.webostv +aiowebostv==0.4.2 + +# homeassistant.components.withings +aiowithings==3.1.3 + +# homeassistant.components.airthings_ble +airthings-ble==0.9.2 + +# homeassistant.components.airthings +airthings-cloud==0.2.0 + +# homeassistant.components.amcrest +amcrest==1.9.8 + +# homeassistant.components.androidtv +androidtv[async]==0.0.73 + +# homeassistant.components.androidtv_remote +androidtvremote2==0.1.2 + +# homeassistant.components.dlna_dmr +# homeassistant.components.dlna_dms +# homeassistant.components.samsungtv +# homeassistant.components.ssdp +# homeassistant.components.upnp +# homeassistant.components.yeelight +async-upnp-client==0.41.0 + +# homeassistant.components.sleepiq +asyncsleepiq==1.5.2 + +# homeassistant.components.aurora +auroranoaa==0.0.5 + +# homeassistant.components.generic +# homeassistant.components.stream +av==13.1.0 + +# homeassistant.components.axis +axis==63 + +# homeassistant.components.holiday +babel==2.15.0 + +# homeassistant.components.homekit +base36==0.1.1 + +# homeassistant.components.scrape +beautifulsoup4==4.12.3 + +# homeassistant.components.bmw_connected_drive +bimmer-connected[china]==0.16.4 + +# homeassistant.components.eq3btsmart +# homeassistant.components.esphome +bleak-esphome==1.1.0 + +# homeassistant.components.bluetooth +bleak-retry-connector==3.6.0 + +# homeassistant.components.bluetooth +bleak==0.22.3 + +# homeassistant.components.blink +blinkpy==0.23.0 + +# homeassistant.components.bluetooth +bluetooth-adapters==0.20.0 + +# homeassistant.components.bluetooth +bluetooth-auto-recovery==1.4.2 + +# homeassistant.components.bluetooth +# homeassistant.components.ld2410_ble +# homeassistant.components.led_ble +# homeassistant.components.private_ble_device +bluetooth-data-tools==1.20.0 + +# homeassistant.components.bond +bond-async==0.2.1 + +# homeassistant.components.bring +bring-api==0.9.1 + +# homeassistant.components.broadlink +broadlink==0.19.0 + +# homeassistant.components.brother +brother==4.3.1 + +# homeassistant.components.bthome +bthome-ble==3.9.1 + +# homeassistant.components.buienradar +buienradar==1.0.6 + +# homeassistant.components.dhcp +cached-ipaddress==0.8.0 + +# homeassistant.components.caldav +caldav==1.3.9 + +# homeassistant.components.xiaomi_miio +construct==2.10.68 + +# homeassistant.components.utility_meter +cronsim==2.6 + +# homeassistant.components.metoffice +datapoint==0.9.9 + +# homeassistant.components.bluetooth +dbus-fast==2.24.3 + +# homeassistant.components.ecovacs +deebot-client==8.4.1 + +# homeassistant.components.denonavr +denonavr==1.0.0 + +# homeassistant.components.devolo_home_network +devolo-plc-api==1.4.1 + +# homeassistant.components.dsmr +dsmr-parser==1.4.2 + +# homeassistant.components.dwd_weather_warnings +dwdwfsapi==1.0.7 + +# homeassistant.components.elgato +elgato==5.1.2 + +# homeassistant.components.emulated_roku +emulated-roku==0.3.0 + +# homeassistant.components.energyzero +energyzero==2.1.1 + +# homeassistant.components.environment_canada +env-canada==0.7.2 + +# homeassistant.components.season +ephem==4.1.6 + +# homeassistant.components.epic_games_store +epicstore-api==0.1.7 + +# homeassistant.components.esphome +esphome-dashboard-api==1.2.3 + +# homeassistant.components.evohome +evohome-async==0.4.20 + +# homeassistant.components.fastdotcom +fastdotcom==0.0.3 + +# homeassistant.components.feedreader +feedparser==6.0.11 + +# homeassistant.components.file +file-read-backwards==2.0.0 + +# homeassistant.components.flux_led +flux-led==1.0.4 + +# homeassistant.components.homekit +# homeassistant.components.recorder +fnv-hash-fast==1.0.2 + +# homeassistant.components.forecast_solar +forecast-solar==3.1.0 + +# homeassistant.components.freebox +freebox-api==1.1.0 + +# homeassistant.components.fritz +# homeassistant.components.fritzbox_callmonitor +fritzconnection[qr]==1.14.0 + +# homeassistant.components.google_translate +gTTS==2.2.4 + +# homeassistant.components.google_assistant_sdk +gassist-text==0.0.11 + +# homeassistant.components.google +gcal-sync==6.2.0 + +# homeassistant.components.dlna_dmr +# homeassistant.components.kef +# homeassistant.components.nmap_tracker +# homeassistant.components.samsungtv +# homeassistant.components.upnp +getmac==0.9.4 + +# homeassistant.components.glances +glances-api==0.8.0 + +# homeassistant.components.goodwe +goodwe==0.3.6 + +# homeassistant.components.google_mail +# homeassistant.components.google_tasks +google-api-python-client==2.71.0 + +# homeassistant.components.google_generative_ai_conversation +google-generativeai==0.8.2 + +# homeassistant.components.nest +google-nest-sdm==6.1.5 + +# homeassistant.components.google_travel_time +googlemaps==2.5.1 + +# homeassistant.components.govee_ble +govee-ble==0.40.0 + +# homeassistant.components.govee_light_local +govee-local-api==1.5.3 + +# homeassistant.components.gree +greeclimate==2.1.0 + +# homeassistant.components.growatt_server +growattServer==1.5.0 + +# homeassistant.components.google_sheets +gspread==5.5.0 + +# homeassistant.components.profiler +guppy3==3.1.4.post1;python_version<'3.13' + +# homeassistant.components.ffmpeg +ha-ffmpeg==3.2.2 + +# homeassistant.components.philips_js +ha-philipsjs==3.2.2 + +# homeassistant.components.bluetooth +habluetooth==3.6.0 + +# homeassistant.components.cloud +hass-nabucasa==0.84.0 + +# homeassistant.components.conversation +hassil==2.0.1 + +# homeassistant.components.pi_hole +hole==0.8.0 + +# homeassistant.components.holiday +# homeassistant.components.workday +holidays==0.60 + +# homeassistant.components.frontend +home-assistant-frontend==20241106.2 + +# homeassistant.components.conversation +home-assistant-intents==2024.11.13 + +# homeassistant.components.home_connect +homeconnect==0.8.0 + +# homeassistant.components.homematicip_cloud +homematicip==1.1.2 + +# homeassistant.components.hyperion +hyperion-py==0.7.5 + +# homeassistant.components.ibeacon +ibeacon-ble==1.2.0 + +# homeassistant.components.google +# homeassistant.components.local_calendar +# homeassistant.components.local_todo +ical==8.2.0 + +# homeassistant.components.ping +icmplib==3.0 + +# homeassistant.components.network +ifaddr==0.2.0 + +# homeassistant.components.influxdb +influxdb-client==1.24.0 + +# homeassistant.components.influxdb +influxdb==5.3.1 + +# homeassistant.components.inkbird +inkbird-ble==0.5.8 + +# homeassistant.components.insteon +insteon-frontend-home-assistant==0.5.0 + +# homeassistant.components.jellyfin +jellyfin-apiclient-python==1.9.2 + +# homeassistant.components.command_line +# homeassistant.components.rest +jsonpath==0.82.2 + +# homeassistant.components.knx +knx-frontend==2024.9.10.221729 + +# homeassistant.components.konnected +konnected==1.2.0 + +# homeassistant.components.ld2410_ble +ld2410-ble==0.1.1 + +# homeassistant.components.foscam +libpyfoscam==1.2.2 + +# homeassistant.components.mikrotik +librouteros==3.2.0 + +# homeassistant.components.soundtouch +libsoundtouch==0.8 + +# homeassistant.components.scrape +lxml==5.3.0 + +# homeassistant.components.minecraft_server +mcstatus==11.1.1 + +# homeassistant.components.meater +meater-python==0.0.8 + +# homeassistant.components.meteo_france +meteofrance-api==1.3.0 + +# homeassistant.components.xiaomi_miio +micloud==0.5 + +# homeassistant.components.mill +mill-local==0.3.0 + +# homeassistant.components.mill +millheater==0.12.2 + +# homeassistant.components.motion_blinds +motionblinds==0.6.25 + +# homeassistant.components.motioneye +motioneye-client==0.3.14 + +# homeassistant.components.tts +mutagen==1.47.0 + +# homeassistant.components.keenetic_ndms2 +ndms2-client==0.1.2 + +# homeassistant.components.nmap_tracker +netmap==0.7.0.2 + +# homeassistant.components.nextcloud +nextcloudmonitor==1.5.1 + +# homeassistant.components.discord +nextcord==2.6.0 + +# homeassistant.components.nfandroidtv +notifications-android-tv==0.1.5 + +# homeassistant.components.compensation +# homeassistant.components.iqvia +# homeassistant.components.stream +# homeassistant.components.tensorflow +# homeassistant.components.trend +numpy==2.1.3 + +# homeassistant.components.google +oauth2client==4.1.3 + +# homeassistant.components.profiler +objgraph==3.5.0 + +# homeassistant.components.ollama +ollama==0.3.3 + +# homeassistant.components.onvif +onvif-zeep-async==3.1.12 + +# homeassistant.components.open_meteo +open-meteo==0.3.1 + +# homeassistant.components.openai_conversation +openai==1.35.7 + +# homeassistant.components.opower +opower==0.8.6 + +# homeassistant.components.oralb +oralb-ble==0.17.6 + +# homeassistant.components.mqtt +paho-mqtt==1.6.1 + +# homeassistant.components.panasonic_viera +panasonic-viera==0.4.2 + +# homeassistant.components.plex +plexauth==0.0.6 + +# homeassistant.components.plex +plexwebsocket==0.0.14 + +# homeassistant.components.prometheus +prometheus-client==0.21.0 + +# homeassistant.components.proxmoxve +proxmoxer==2.0.1 + +# homeassistant.components.hardware +# homeassistant.components.recorder +# homeassistant.components.systemmonitor +psutil-home-assistant==0.0.1 + +# homeassistant.components.systemmonitor +psutil==6.1.0 + +# homeassistant.components.androidtv +pure-python-adb[async]==0.3.0.dev0 + +# homeassistant.components.pushbullet +pushbullet.py==0.11.0 + +# homeassistant.components.pushover +pushover_complete==1.1.1 + +# homeassistant.components.cpuspeed +py-cpuinfo==9.0.0 + +# homeassistant.components.ecovacs +py-sucks==0.9.10 + +# homeassistant.components.synology_dsm +py-synologydsm-api==2.5.3 + +# homeassistant.components.hikvision +pyHik==0.3.2 + +# homeassistant.components.rfxtrx +pyRFXtrx==0.31.1 + +# homeassistant.components.tibber +pyTibber==0.30.8 + +# homeassistant.components.airvisual +# homeassistant.components.airvisual_pro +pyairvisual==2023.08.1 + +# homeassistant.components.asuswrt +pyasuswrt==0.1.21 + +# homeassistant.components.netatmo +pyatmo==8.1.0 + +# homeassistant.components.apple_tv +pyatv==0.15.1 + +# homeassistant.components.braviatv +pybravia==0.3.4 + +# homeassistant.components.cloudflare +pycfdns==3.0.0 + +# homeassistant.components.radio_browser +pycountry==24.6.1 + +# homeassistant.components.daikin +pydaikin==2.13.7 + +# homeassistant.components.deconz +pydeconz==118 + +# homeassistant.components.hydrawise +pydrawise==2024.9.0 + +# homeassistant.components.android_ip_webcam +pydroid-ipcam==2.0.0 + +# homeassistant.components.econet +pyeconet==0.1.23 + +# homeassistant.components.onkyo +pyeiscp==0.0.7 + +# homeassistant.components.enphase_envoy +pyenphase==1.22.0 + +# homeassistant.components.ezviz +pyezviz==0.2.1.2 + +# homeassistant.components.fritzbox +pyfritzhome==0.6.12 + +# homeassistant.components.ifttt +pyfttt==0.3 + +# homeassistant.components.version +pyhaversion==22.8.0 + +# homeassistant.components.heos +pyheos==0.7.2 + +# homeassistant.components.hive +pyhiveapi==0.5.16 + +# homeassistant.components.homematic +pyhomematic==0.1.77 + +# homeassistant.components.icloud +pyicloud==1.0.0 + +# homeassistant.components.insteon +pyinsteon==1.6.3 + +# homeassistant.components.ipp +pyipp==0.17.0 + +# homeassistant.components.iss +pyiss==1.0.1 + +# homeassistant.components.kodi +pykodi==0.2.7 + +# homeassistant.components.kostal_plenticore +pykoplenti==1.2.2 + +# homeassistant.components.litterrobot +pylitterbot==2023.5.0 + +# homeassistant.components.lutron_caseta +pylutron-caseta==0.21.1 + +# homeassistant.components.melcloud +pymelcloud==2.5.9 + +# homeassistant.components.assist_pipeline +pymicro-vad==1.0.1 + +# homeassistant.components.modbus +pymodbus==3.6.9 + +# homeassistant.components.netgear +pynetgear==0.10.10 + +# homeassistant.components.nuki +pynuki==1.6.3 + +# homeassistant.components.nws +pynws[retry]==1.8.2 + +# homeassistant.components.octoprint +pyoctoprintapi==0.1.12 + +# homeassistant.components.openuv +pyopenuv==2023.02.0 + +# homeassistant.components.openweathermap +pyopenweathermap==0.2.1 + +# homeassistant.components.overkiz +pyoverkiz==1.14.1 + +# homeassistant.components.profiler +pyprof2calltree==1.4.5 + +# homeassistant.components.prusalink +pyprusalink==2.1.1 + +# homeassistant.components.ps4 +pyps4-2ndscreen==1.3.1 + +# homeassistant.components.rainbird +pyrainbird==6.0.1 + +# homeassistant.components.thread +pyroute2==0.7.5 + +# homeassistant.components.sabnzbd +pysabnzbd==1.1.1 + +# homeassistant.components.schlage +pyschlage==2024.8.0 + +# homeassistant.components.sensibo +pysensibo==1.1.0 + +# homeassistant.components.acer_projector +# homeassistant.components.crownstone +# homeassistant.components.usb +# homeassistant.components.zwave_js +pyserial==3.5 + +# homeassistant.components.seventeentrack +pyseventeentrack==1.0.1 + +# homeassistant.components.sma +pysma==0.7.3 + +# homeassistant.components.smartthings +pysmartapp==0.3.5 + +# homeassistant.components.smartthings +pysmartthings==0.7.8 + +# homeassistant.components.smlight +pysmlight==0.1.3 + +# homeassistant.components.assist_pipeline +pyspeex-noise==1.0.2 + +# homeassistant.components.squeezebox +pysqueezebox==0.10.0 + +# homeassistant.components.tautulli +pytautulli==23.1.1 + +# homeassistant.components.awair +python-awair==0.2.4 + +# homeassistant.components.ecobee +python-ecobee-api==0.2.20 + +# homeassistant.components.fully_kiosk +python-fullykiosk==0.0.14 + +# homeassistant.components.homewizard +python-homewizard-energy==v6.3.0 + +# homeassistant.components.tplink +python-kasa[speedups]==0.7.7 + +# homeassistant.components.linkplay +python-linkplay==0.0.20 + +# homeassistant.components.matter +python-matter-server==6.6.0 + +# homeassistant.components.xiaomi_miio +python-miio==0.5.12 + +# homeassistant.components.mpd +python-mpd2==3.1.1 + +# homeassistant.components.otbr +# homeassistant.components.thread +python-otbr-api==2.6.0 + +# homeassistant.components.roborock +python-roborock==2.7.2 + +# homeassistant.components.songpal +python-songpal==0.16.2 + +# homeassistant.components.tado +python-tado==0.17.7 + +# homeassistant.components.telegram_bot +python-telegram-bot[socks]==21.5 + +# homeassistant.components.tile +pytile==2023.12.0 + +# homeassistant.components.tomorrowio +pytomorrowio==0.3.6 + +# homeassistant.components.tradfri +pytradfri[async]==9.0.1 + +# homeassistant.components.usb +pyudev==0.24.1 + +# homeassistant.components.vesync +pyvesync==2.1.12 + +# homeassistant.components.vizio +pyvizio==0.1.61 + +# homeassistant.components.volumio +pyvolumio==0.1.5 + +# homeassistant.components.waze_travel_time +pywaze==1.0.2 + +# homeassistant.components.weatherflow +pyweatherflowudp==1.4.5 + +# homeassistant.components.html5 +pywebpush==1.14.1 + +# homeassistant.components.wemo +pywemo==1.4.0 + +# homeassistant.components.wiz +pywizlight==0.5.14 + +# homeassistant.components.qbittorrent +qbittorrent-api==2024.2.59 + +# homeassistant.components.qnap +qnapstats==0.4.0 + +# homeassistant.components.radio_browser +radios==0.3.2 + +# homeassistant.components.renault +renault-api==0.2.7 + +# homeassistant.components.reolink +reolink-aio==0.11.0 + +# homeassistant.components.ring +ring-doorbell==0.9.12 + +# homeassistant.components.roku +rokuecp==0.19.3 + +# homeassistant.components.roomba +roombapy==1.8.1 + +# homeassistant.components.rpi_power +rpi-bad-power==0.1.0 + +# homeassistant.components.rtsp_to_webrtc +rtsp-to-webrtc==0.5.1 + +# homeassistant.components.ruuvitag_ble +ruuvitag-ble==0.1.2 + +# homeassistant.components.samsungtv +samsungctl[websocket]==0.7.1 + +# homeassistant.components.samsungtv +samsungtvws[async,encrypted]==2.6.0 + +# homeassistant.components.backup +securetar==2024.2.1 + +# homeassistant.components.emulated_kasa +# homeassistant.components.sense +sense-energy==0.13.3 + +# homeassistant.components.sharkiq +sharkiq==1.0.2 + +# homeassistant.components.simplisafe +simplisafe-python==2024.01.0 + +# homeassistant.components.smhi +smhi-pkg==1.0.18 + +# homeassistant.components.sonos +soco==0.30.6 + +# homeassistant.components.sonos +sonos-websocket==0.1.3 + +# homeassistant.components.speedtestdotnet +speedtest-cli==2.1.3 + +# homeassistant.components.spotify +spotifyaio==0.8.8 + +# homeassistant.components.sql +sqlparse==0.5.0 + +# homeassistant.components.steam_online +steamodd==4.21 + +# homeassistant.components.huawei_lte +# homeassistant.components.solaredge +# homeassistant.components.traccar +stringcase==1.2.0 + +# homeassistant.components.surepetcare +surepy==0.9.0 + +# homeassistant.components.switchbot_cloud +switchbot-api==2.2.1 + +# homeassistant.components.tailscale +tailscale==0.6.1 + +# homeassistant.components.tesla_fleet +# homeassistant.components.teslemetry +# homeassistant.components.tessie +tesla-fleet-api==0.8.4 + +# homeassistant.components.powerwall +tesla-powerwall==0.5.2 + +# homeassistant.components.tesla_wall_connector +tesla-wall-connector==1.0.2 + +# homeassistant.components.thermopro +thermopro-ble==0.10.0 + +# homeassistant.components.lg_thinq +thinqconnect==1.0.0 + +# homeassistant.components.todoist +todoist-api-python==2.1.2 + +# homeassistant.components.tplink_omada +tplink-omada-client==1.4.3 + +# homeassistant.components.transmission +transmission-rpc==7.0.3 + +# homeassistant.components.twinkly +ttls==1.8.3 + +# homeassistant.components.tuya +tuya-device-sharing-sdk==0.2.1 + +# homeassistant.components.twilio +twilio==6.32.0 + +# homeassistant.components.unifiprotect +uiprotect==6.4.0 + +# homeassistant.components.unifiprotect +unifi-discovery==1.2.0 + +# homeassistant.components.zha +universal-silabs-flasher==0.0.24 + +# homeassistant.components.huawei_lte +# homeassistant.components.syncthru +# homeassistant.components.zwave_me +url-normalize==1.4.3 + +# homeassistant.components.roborock +vacuum-map-parser-roborock==0.1.2 + +# homeassistant.components.voip +voip-utils==0.1.0 + +# homeassistant.components.volvooncall +volvooncall==0.10.3 + +# homeassistant.components.verisure +vsure==2.6.7 + +# homeassistant.components.samsungtv +# homeassistant.components.wake_on_lan +wakeonlan==2.1.0 + +# homeassistant.components.wallbox +wallbox==0.7.0 + +# homeassistant.components.wled +wled==0.20.2 + +# homeassistant.components.wyoming +wyoming==1.5.4 + +# homeassistant.components.xbox +xbox-webapi==2.0.11 + +# homeassistant.components.xiaomi_ble +xiaomi-ble==0.33.0 + +# homeassistant.components.knx +xknx==3.3.0 + +# homeassistant.components.knx +xknxproject==3.8.1 + +# homeassistant.components.fritz +# homeassistant.components.rest +# homeassistant.components.startca +# homeassistant.components.ted5000 +# homeassistant.components.zestimate +xmltodict==0.13.0 + +# homeassistant.components.august +# homeassistant.components.yale +# homeassistant.components.yalexs_ble +yalexs-ble==2.5.0 + +# homeassistant.components.august +# homeassistant.components.yale +yalexs==8.10.0 + +# homeassistant.components.yeelight +yeelight==0.7.14 + +# homeassistant.components.yolink +yolink-api==0.4.7 + +# homeassistant.components.media_extractor +yt-dlp[default]==2024.11.04 + +# homeassistant.components.zeroconf +zeroconf==0.136.0 + +# homeassistant.components.zha +zha==0.0.37 + +# homeassistant.components.zwave_js +zwave-js-server-python==0.59.1 diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py index 7d53741c661..fd8c4f4b88e 100755 --- a/script/gen_requirements_all.py +++ b/script/gen_requirements_all.py @@ -3,6 +3,7 @@ from __future__ import annotations +import asyncio import difflib import importlib from operator import itemgetter @@ -13,6 +14,11 @@ import sys import tomllib from typing import Any +from python_homeassistant_analytics import ( + CurrentAnalytics, + HomeassistantAnalyticsClient, +) + from homeassistant.util.yaml.loader import load_yaml from script.hassfest.model import Config, Integration @@ -551,6 +557,11 @@ def diff_file(filename: str, content: str) -> list[str]: ) +async def _get_analytics() -> CurrentAnalytics: + client = HomeassistantAnalyticsClient() + return await client.get_current_analytics() + + def main(validate: bool, ci: bool) -> int: """Run the script.""" if not Path("requirements_all.txt").is_file(): @@ -587,6 +598,26 @@ def main(validate: bool, ci: bool) -> int: for action, reqs_all_file in reqs_all_action_files.items() ) + # Get analytics data + analytics = asyncio.get_event_loop().run_until_complete(_get_analytics()) + top_integrations = [f"homeassistant.components.{i}" for i, c in analytics.integrations.items() if c > 1000] + + top = top_integrations + + data_top = {} + + for req, integrations in data.items(): + for integration in integrations: + if integration in top: + data_top[req] = integrations + + files.append( + ( + "requirements_top.txt", + requirements_all_output(data_top), + ) + ) + if validate: errors = []