about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/home-assistant
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
committerAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
commit99fcaeccb89621dd492203ce1f2d551c06f228ed (patch)
tree41cb730ae07383004789779b0f6e11cb3f4642a3 /nixpkgs/pkgs/servers/home-assistant
parent59c5f5ac8682acc13bb22bc29c7cf02f7d75f01f (diff)
parent75a5ebf473cd60148ba9aec0d219f72e5cf52519 (diff)
downloadnixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.gz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.bz2
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.lz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.xz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.zst
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.zip
Merge branch 'nixos-unstable' of https://github.com/NixOS/nixpkgs
Conflicts:
	nixpkgs/nixos/modules/config/console.nix
	nixpkgs/nixos/modules/services/mail/mailman.nix
	nixpkgs/nixos/modules/services/mail/public-inbox.nix
	nixpkgs/nixos/modules/services/mail/rss2email.nix
	nixpkgs/nixos/modules/services/networking/ssh/sshd.nix
	nixpkgs/pkgs/applications/networking/instant-messengers/dino/default.nix
	nixpkgs/pkgs/applications/networking/irc/weechat/default.nix
	nixpkgs/pkgs/applications/window-managers/sway/default.nix
	nixpkgs/pkgs/build-support/go/module.nix
	nixpkgs/pkgs/build-support/rust/build-rust-package/default.nix
	nixpkgs/pkgs/development/interpreters/python/default.nix
	nixpkgs/pkgs/development/node-packages/overrides.nix
	nixpkgs/pkgs/development/tools/b4/default.nix
	nixpkgs/pkgs/servers/dict/dictd-db.nix
	nixpkgs/pkgs/servers/mail/public-inbox/default.nix
	nixpkgs/pkgs/tools/security/pinentry/default.nix
	nixpkgs/pkgs/tools/text/unoconv/default.nix
	nixpkgs/pkgs/top-level/all-packages.nix
Diffstat (limited to 'nixpkgs/pkgs/servers/home-assistant')
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/appdaemon.nix20
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/cli.nix44
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/component-packages.nix1864
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/default.nix437
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/frontend.nix4
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/intents.nix72
-rwxr-xr-xnixpkgs/pkgs/servers/home-assistant/parse-requirements.py75
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch6
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/patches/wilight-import.patch52
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/stubs.nix49
-rw-r--r--nixpkgs/pkgs/servers/home-assistant/tests.nix64
-rwxr-xr-xnixpkgs/pkgs/servers/home-assistant/update.py263
-rwxr-xr-xnixpkgs/pkgs/servers/home-assistant/update.sh42
13 files changed, 2445 insertions, 547 deletions
diff --git a/nixpkgs/pkgs/servers/home-assistant/appdaemon.nix b/nixpkgs/pkgs/servers/home-assistant/appdaemon.nix
index 7af675de41fe..b104bb15997d 100644
--- a/nixpkgs/pkgs/servers/home-assistant/appdaemon.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/appdaemon.nix
@@ -5,21 +5,20 @@
 
 python3.pkgs.buildPythonApplication rec {
   pname = "appdaemon";
-  version = "4.0.8";
-  disabled = python3.pythonOlder "3.6";
+  version = "4.2.1";
+  format = "setuptools";
+
+  disabled = python3.pythonOlder "3.7";
 
   src = fetchFromGitHub {
     owner = "AppDaemon";
-    repo = pname;
-    rev = version;
-    sha256 = "04a4qx0rbx2vpkzpibmwkpy7fawa6dbgqlrllryrl7dchbrf703q";
+    repo = "appdaemon";
+    rev = "refs/tags/${version}";
+    hash = "sha256-4sN0optkMmyWb5Cd3F7AhcXYHh7aidJE/bieYMEKgSY=";
   };
 
-  # relax dependencies
   postPatch = ''
-    substituteInPlace requirements.txt \
-      --replace "deepdiff==5.2.3" "deepdiff" \
-      --replace "pygments==2.8.1" "pygments"
+    # relax dependencies
     sed -i 's/==/>=/' requirements.txt
   '';
 
@@ -34,7 +33,7 @@ python3.pkgs.buildPythonApplication rec {
     azure-mgmt-storage
     azure-storage-blob
     bcrypt
-    cchardet
+    faust-cchardet
     deepdiff
     feedparser
     iso8601
@@ -63,6 +62,7 @@ python3.pkgs.buildPythonApplication rec {
   meta = with lib; {
     description = "Sandboxed Python execution environment for writing automation apps for Home Assistant";
     homepage = "https://github.com/AppDaemon/appdaemon";
+    changelog = "https://github.com/AppDaemon/appdaemon/blob/${version}/docs/HISTORY.rst";
     license = licenses.mit;
     maintainers = teams.home-assistant.members;
   };
diff --git a/nixpkgs/pkgs/servers/home-assistant/cli.nix b/nixpkgs/pkgs/servers/home-assistant/cli.nix
index 18bc9c76da00..32f17178fb33 100644
--- a/nixpkgs/pkgs/servers/home-assistant/cli.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/cli.nix
@@ -1,28 +1,18 @@
 { lib
+, fetchFromGitHub
 , python3
 }:
 
-let
-  python = python3.override {
-    packageOverrides = self: super: {
-      click = super.click.overrideAttrs (oldAttrs: rec {
-        version = "8.0.4";
-        src = oldAttrs.src.override {
-          inherit version;
-          sha256 = "sha256-hFjXsSh8X7EoyQ4jOBz5nc3nS+r2x/9jhM6E1v4JCts=";
-        };
-      });
-    };
-  };
-in
-
-python.pkgs.buildPythonApplication rec {
+python3.pkgs.buildPythonApplication rec {
   pname = "homeassistant-cli";
-  version = "0.9.4";
-
-  src = python3.pkgs.fetchPypi {
-    inherit pname version;
-    sha256 = "03kiyqpp3zf8rg30d12h4fapihh0rqwpv5p8jfxb3iq0chfmjx2f";
+  version = "0.9.6";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant-ecosystem";
+    repo = "home-assistant-cli";
+    rev = version;
+    hash = "sha256-4OeHJ7icDZUOC5K4L0F0Nd9lbJPgdW4LCU0wniLvJ1Q=";
   };
 
   postPatch = ''
@@ -30,7 +20,7 @@ python.pkgs.buildPythonApplication rec {
     sed -i "s/'\(.*\)\(==\|>=\).*'/'\1'/g" setup.py
   '';
 
-  propagatedBuildInputs = with python.pkgs; [
+  propagatedBuildInputs = with python3.pkgs; [
     aiohttp
     click
     click-log
@@ -44,19 +34,25 @@ python.pkgs.buildPythonApplication rec {
     tabulate
   ];
 
-  # Completion needs to be ported to work with click > 8.0
-  # https://github.com/home-assistant-ecosystem/home-assistant-cli/issues/367
+  # TODO: Completion needs to be adapted after support for latest click was added
+  # $ source <(_HASS_CLI_COMPLETE=bash_source hass-cli) # for bash
+  # $ source <(_HASS_CLI_COMPLETE=zsh_source hass-cli)  # for zsh
+  # $ eval (_HASS_CLI_COMPLETE=fish_source hass-cli)    # for fish
   #postInstall = ''
   #  mkdir -p "$out/share/bash-completion/completions" "$out/share/zsh/site-functions"
   #  $out/bin/hass-cli completion bash > "$out/share/bash-completion/completions/hass-cli"
   #  $out/bin/hass-cli completion zsh > "$out/share/zsh/site-functions/_hass-cli"
   #'';
 
-  checkInputs = with python.pkgs; [
+  nativeCheckInputs = with python3.pkgs; [
     pytestCheckHook
     requests-mock
   ];
 
+  pythonImportsCheck = [
+    "homeassistant_cli"
+  ];
+
   meta = with lib; {
     description = "Command-line tool for Home Assistant";
     homepage = "https://github.com/home-assistant-ecosystem/home-assistant-cli";
diff --git a/nixpkgs/pkgs/servers/home-assistant/component-packages.nix b/nixpkgs/pkgs/servers/home-assistant/component-packages.nix
index 632e6a919d05..88fb52a14320 100644
--- a/nixpkgs/pkgs/servers/home-assistant/component-packages.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/component-packages.nix
@@ -2,10 +2,12 @@
 # Do not edit!
 
 {
-  version = "2022.8.5";
+  version = "2023.6.0";
   components = {
+    "3_day_blinds" = ps: with ps; [
+    ];
     "abode" = ps: with ps; [
-      abodepy
+      jaraco-abode
     ];
     "accuweather" = ps: with ps; [
       accuweather
@@ -48,18 +50,52 @@
     "airnow" = ps: with ps; [
       pyairnow
     ];
+    "airq" = ps: with ps; [
+      aioairq
+    ];
     "airthings" = ps: with ps; [
       airthings-cloud
     ];
+    "airthings_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      airthings-ble
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "airtouch4" = ps: with ps; [
       airtouch4pyapi
     ];
     "airvisual" = ps: with ps; [
       pyairvisual
     ];
+    "airvisual_pro" = ps: with ps; [
+      pyairvisual
+    ];
     "airzone" = ps: with ps; [
       aioairzone
     ];
+    "airzone_cloud" = ps: with ps; [
+      aioairzone-cloud
+    ];
     "aladdin_connect" = ps: with ps; [
       aioaladdinconnect
     ];
@@ -74,20 +110,12 @@
       pyturbojpeg
       aiohttp-cors
     ];
-    "almond" = ps: with ps; [
-      aiohttp-cors
-      pyalmond
-    ];
     "alpha_vantage" = ps: with ps; [
       alpha-vantage
     ];
     "amazon_polly" = ps: with ps; [
       boto3
     ];
-    "ambee" = ps: with ps; [
-      aiohttp-cors
-      ambee
-    ];
     "amberelectric" = ps: with ps; [
       amberelectric
     ];
@@ -102,12 +130,15 @@
       amcrest
       ha-ffmpeg
     ];
+    "amp_motorization" = ps: with ps; [
+    ];
     "ampio" = ps: with ps; [
       asmog
     ];
     "analytics" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "android_ip_webcam" = ps: with ps; [
@@ -121,11 +152,17 @@
     ++ adb-shell.optional-dependencies.async
     ++ androidtv.optional-dependencies.async
     ++ pure-python-adb.optional-dependencies.async;
+    "androidtv_remote" = ps: with ps; [
+      androidtvremote2
+    ];
     "anel_pwrctrl" = ps: with ps; [
     ]; # missing inputs: anel_pwrctrl-homeassistant
+    "anova" = ps: with ps; [
+    ]; # missing inputs: anova-wifi
     "anthemav" = ps: with ps; [
-      aiohttp-cors
     ]; # missing inputs: anthemav
+    "anwb_energie" = ps: with ps; [
+    ];
     "apache_kafka" = ps: with ps; [
       aiokafka
     ];
@@ -137,12 +174,18 @@
     ];
     "apple_tv" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
       pyatv
+      sqlalchemy
       zeroconf
     ];
     "application_credentials" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
     ];
     "apprise" = ps: with ps; [
       apprise
@@ -156,6 +199,31 @@
     ];
     "aquostv" = ps: with ps; [
     ]; # missing inputs: sharp_aquos_rc
+    "aranet" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      aranet4
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "arcam_fmj" = ps: with ps; [
       arcam-fmj
     ];
@@ -169,11 +237,19 @@
     ];
     "arwn" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "aseko_pool_live" = ps: with ps; [
       aioaseko
     ];
+    "assist_pipeline" = ps: with ps; [
+      aiohttp-cors
+      hassil
+      home-assistant-intents
+      mutagen
+      webrtcvad
+    ];
     "asterisk_cdr" = ps: with ps; [
       asterisk-mbox
     ];
@@ -193,8 +269,11 @@
       pyatome
     ];
     "august" = ps: with ps; [
+      yalexs-ble
       yalexs
     ];
+    "august_ble" = ps: with ps; [
+    ];
     "aurora" = ps: with ps; [
       auroranoaa
     ];
@@ -225,6 +304,7 @@
     "axis" = ps: with ps; [
       aiohttp-cors
       axis
+      janus
       paho-mqtt
     ];
     "azure_devops" = ps: with ps; [
@@ -238,7 +318,10 @@
     ];
     "backup" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       securetar
+      sqlalchemy
     ];
     "baf" = ps: with ps; [
     ]; # missing inputs: aiobafi6
@@ -271,12 +354,41 @@
       blinkpy
     ];
     "blinksticklight" = ps: with ps; [
-      BlinkStick
+      blinkstick
+    ];
+    "bliss_automation" = ps: with ps; [
+    ];
+    "bloc_blinds" = ps: with ps; [
     ];
     "blockchain" = ps: with ps; [
     ]; # missing inputs: python-blockchain-api
     "bloomsky" = ps: with ps; [
     ];
+    "bluemaestro" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluemaestro-ble
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "blueprint" = ps: with ps; [
     ];
     "bluesound" = ps: with ps; [
@@ -284,13 +396,65 @@
     ];
     "bluetooth" = ps: with ps; [
       aiohttp-cors
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      fnv-hash-fast
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+    ];
+    "bluetooth_adapters" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "bluetooth_le_tracker" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "bluetooth_tracker" = ps: with ps; [
       bt-proximity
@@ -305,11 +469,18 @@
     "bosch_shc" = ps: with ps; [
       aiohttp-cors
       boschshcpy
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
+    "brandt" = ps: with ps; [
+    ];
     "braviatv" = ps: with ps; [
-      bravia-tv
+      pybravia
+    ];
+    "brel_home" = ps: with ps; [
     ];
     "broadlink" = ps: with ps; [
       broadlink
@@ -326,12 +497,44 @@
       brunt
     ];
     "bsblan" = ps: with ps; [
-      bsblan
+      python-bsblan
+    ];
+    "bswitch" = ps: with ps; [
     ];
     "bt_home_hub_5" = ps: with ps; [
     ]; # missing inputs: bthomehub5-devicelist
     "bt_smarthub" = ps: with ps; [
-    ]; # missing inputs: btsmarthub_devicelist
+      btsmarthub_devicelist
+    ];
+    "bthome" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      bthome-ble
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
+    "bticino" = ps: with ps; [
+    ];
+    "bubendorff" = ps: with ps; [
+    ];
     "buienradar" = ps: with ps; [
       buienradar
     ];
@@ -354,13 +557,19 @@
     "cast" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
+      fnv-hash-fast
       hass-nabucasa
+      hassil
+      home-assistant-intents
       ifaddr
       mutagen
       plexapi
       plexauth
       plexwebsocket
-      PyChromecast
+      psutil-home-assistant
+      pychromecast
+      sqlalchemy
+      webrtcvad
       zeroconf
     ];
     "cert_expiry" = ps: with ps; [
@@ -390,16 +599,16 @@
     ];
     "clicksend_tts" = ps: with ps; [
     ];
-    "climacell" = ps: with ps; [
-      pyclimacell
-      pytomorrowio
-    ];
     "climate" = ps: with ps; [
     ];
     "cloud" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
+      webrtcvad
     ];
     "cloudflare" = ps: with ps; [
       pycfdns
@@ -436,17 +645,18 @@
     ];
     "conversation" = ps: with ps; [
       aiohttp-cors
+      hassil
+      home-assistant-intents
     ];
     "coolmaster" = ps: with ps; [
       pycoolmasternet-async
     ];
-    "coronavirus" = ps: with ps; [
-      coronavirus
-    ];
     "counter" = ps: with ps; [
     ];
     "cover" = ps: with ps; [
     ];
+    "cozytouch" = ps: with ps; [
+    ];
     "cppm_tracker" = ps: with ps; [
     ]; # missing inputs: clearpasspy
     "cpuspeed" = ps: with ps; [
@@ -457,26 +667,32 @@
       crownstone-cloud
       crownstone-sse
       crownstone-uart
+      fnv-hash-fast
+      psutil-home-assistant
       pyserial
       pyudev
+      sqlalchemy
     ];
     "cups" = ps: with ps; [
       pycups
     ];
     "currencylayer" = ps: with ps; [
     ];
+    "dacia" = ps: with ps; [
+    ];
     "daikin" = ps: with ps; [
       pydaikin
     ];
     "danfoss_air" = ps: with ps; [
       pydanfossair
     ];
-    "darksky" = ps: with ps; [
-      python-forecastio
-    ];
     "datadog" = ps: with ps; [
       datadog
     ];
+    "date" = ps: with ps; [
+    ];
+    "datetime" = ps: with ps; [
+    ];
     "ddwrt" = ps: with ps; [
     ];
     "debugpy" = ps: with ps; [
@@ -496,17 +712,30 @@
       aiodiscover
       aiohttp-cors
       async-upnp-client
+      bleak-retry-connector
       bleak
       bluetooth-adapters
-      fnvhash
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      fnv-hash-fast
+      av
       hass-nabucasa
+      hassil
       home-assistant-frontend
+      home-assistant-intents
       ifaddr
+      janus
+      mutagen
+      numpy
       pillow
+      psutil-home-assistant
       pyserial
       pyudev
       scapy
+      securetar
       sqlalchemy
+      webrtcvad
       zeroconf
     ];
     "delijn" = ps: with ps; [
@@ -517,8 +746,8 @@
     ];
     "demo" = ps: with ps; [
       aiohttp-cors
-      fnvhash
-      sqlalchemy
+      hassil
+      home-assistant-intents
     ];
     "denon" = ps: with ps; [
     ];
@@ -527,9 +756,6 @@
     ];
     "derivative" = ps: with ps; [
     ];
-    "deutsche_bahn" = ps: with ps; [
-      schiene
-    ];
     "device_automation" = ps: with ps; [
     ];
     "device_sun_light_trigger" = ps: with ps; [
@@ -541,7 +767,10 @@
     "devolo_home_control" = ps: with ps; [
       aiohttp-cors
       devolo-home-control-api
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "devolo_home_network" = ps: with ps; [
@@ -560,6 +789,10 @@
     "dialogflow" = ps: with ps; [
       aiohttp-cors
     ];
+    "diaz" = ps: with ps; [
+    ];
+    "digital_loggers" = ps: with ps; [
+    ];
     "digital_ocean" = ps: with ps; [
       digital-ocean
     ];
@@ -574,28 +807,38 @@
     ];
     "discovery" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
       netdisco
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "dlib_face_detect" = ps: with ps; [
-      face_recognition
+      face-recognition
     ];
     "dlib_face_identify" = ps: with ps; [
-      face_recognition
+      face-recognition
     ];
     "dlink" = ps: with ps; [
     ]; # missing inputs: pyW215
     "dlna_dmr" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
+      getmac
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "dlna_dms" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "dnsip" = ps: with ps; [
@@ -612,6 +855,33 @@
       aiohttp-cors
       doorbirdpy
     ];
+    "dooya" = ps: with ps; [
+    ];
+    "dormakaba_dkey" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      py-dormakaba-dkey
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "dovado" = ps: with ps; [
     ]; # missing inputs: dovado
     "downloader" = ps: with ps; [
@@ -621,6 +891,7 @@
     ];
     "dsmr_reader" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "dte_energy_bridge" = ps: with ps; [
@@ -638,11 +909,21 @@
     "dweet" = ps: with ps; [
     ]; # missing inputs: dweepy
     "dynalite" = ps: with ps; [
+      aiohttp-cors
       dynalite-devices
-    ];
+      fnv-hash-fast
+      home-assistant-frontend
+      janus
+      pillow
+      psutil-home-assistant
+      sqlalchemy
+    ]; # missing inputs: dynalite_panel
     "eafm" = ps: with ps; [
       aioeafm
     ];
+    "easyenergy" = ps: with ps; [
+      easyenergy
+    ];
     "ebox" = ps: with ps; [
     ]; # missing inputs: pyebox
     "ebusd" = ps: with ps; [
@@ -657,7 +938,11 @@
       pyeconet
     ];
     "ecovacs" = ps: with ps; [
-    ]; # missing inputs: sucks
+    ]; # missing inputs: py-sucks
+    "ecowitt" = ps: with ps; [
+      aioecowitt
+      aiohttp-cors
+    ];
     "eddystone_temperature" = ps: with ps; [
       construct
     ]; # missing inputs: beacontools
@@ -676,6 +961,8 @@
     "eight_sleep" = ps: with ps; [
       pyeight
     ];
+    "electrasmart" = ps: with ps; [
+    ]; # missing inputs: pyelectra
     "elgato" = ps: with ps; [
       elgato
     ];
@@ -685,7 +972,10 @@
     "elkm1" = ps: with ps; [
       aiohttp-cors
       elkm1-lib
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "elmax" = ps: with ps; [
       elmax-api
@@ -705,7 +995,10 @@
     ];
     "emulated_hue" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "emulated_kasa" = ps: with ps; [
       sense-energy
@@ -713,13 +1006,22 @@
     "emulated_roku" = ps: with ps; [
       aiohttp-cors
       emulated-roku
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
+    ];
+    "energie_vanons" = ps: with ps; [
     ];
     "energy" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
+    "energyzero" = ps: with ps; [
+      energyzero
+    ];
     "enigma2" = ps: with ps; [
       openwebifpy
     ];
@@ -747,21 +1049,87 @@
     "epsonworkforce" = ps: with ps; [
     ]; # missing inputs: epsonprinter
     "eq3btsmart" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
       construct
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ]; # missing inputs: python-eq3bt
+    "escea" = ps: with ps; [
+      pescea
+    ];
+    "esera_onewire" = ps: with ps; [
+    ];
     "esphome" = ps: with ps; [
       aioesphomeapi
       aiohttp-cors
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
       ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
       zeroconf
     ];
     "etherscan" = ps: with ps; [
     ]; # missing inputs: python-etherscan-api
     "eufy" = ps: with ps; [
-    ]; # missing inputs: lakeside
+      lakeside
+    ];
+    "eufylife_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      eufylife-ble-client
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "everlights" = ps: with ps; [
       pyeverlights
     ];
@@ -804,7 +1172,7 @@
       ha-ffmpeg
     ];
     "fibaro" = ps: with ps; [
-      fiblary3-fork
+      pyfibaro
     ];
     "fido" = ps: with ps; [
       pyfido
@@ -812,15 +1180,22 @@
     "file" = ps: with ps; [
       file-read-backwards
     ];
+    "file_upload" = ps: with ps; [
+      aiohttp-cors
+      janus
+    ];
     "filesize" = ps: with ps; [
     ];
     "filter" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "fints" = ps: with ps; [
       fints
     ];
+    "fire_tv" = ps: with ps; [
+    ];
     "fireservicerota" = ps: with ps; [
       pyfireservicerota
     ];
@@ -838,10 +1213,29 @@
       fixerio
     ];
     "fjaraskupan" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
       fjaraskupan
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "fleetgo" = ps: with ps; [
       ritassist
@@ -849,6 +1243,8 @@
     "flexit" = ps: with ps; [
       pymodbus
     ];
+    "flexom" = ps: with ps; [
+    ];
     "flic" = ps: with ps; [
       pyflic
     ];
@@ -866,16 +1262,15 @@
     "flume" = ps: with ps; [
       pyflume
     ];
-    "flunearyou" = ps: with ps; [
-      aiohttp-cors
-      pyflunearyou
-    ];
     "flux" = ps: with ps; [
     ];
     "flux_led" = ps: with ps; [
       aiohttp-cors
       flux-led
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "folder" = ps: with ps; [
     ];
@@ -889,6 +1284,11 @@
       forecast-solar
     ];
     "forked_daapd" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      spotipy
+      sqlalchemy
     ]; # missing inputs: pyforked-daapd pylibrespot-java
     "fortios" = ps: with ps; [
       fortiosapi
@@ -903,6 +1303,7 @@
     ]; # missing inputs: freesms
     "freebox" = ps: with ps; [
       freebox-api
+      ha-ffmpeg
     ];
     "freedns" = ps: with ps; [
     ];
@@ -911,8 +1312,11 @@
     ];
     "fritz" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       fritzconnection
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       xmltodict
     ];
     "fritzbox" = ps: with ps; [
@@ -926,21 +1330,28 @@
     ];
     "frontend" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
     "frontier_silicon" = ps: with ps; [
       afsapi
     ];
+    "fully_kiosk" = ps: with ps; [
+      python-fullykiosk
+    ];
     "futurenow" = ps: with ps; [
       pyfnip
     ];
     "garadget" = ps: with ps; [
     ];
     "garages_amsterdam" = ps: with ps; [
-      garages-amsterdam
+      odp-amsterdam
+    ];
+    "gaviota" = ps: with ps; [
     ];
     "gc100" = ps: with ps; [
     ]; # missing inputs: python-gc100
@@ -948,13 +1359,15 @@
       aio-georss-gdacs
     ];
     "generic" = ps: with ps; [
+      aiohttp-cors
       av
       pillow
     ];
     "generic_hygrostat" = ps: with ps; [
     ];
     "generic_thermostat" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "geniushub" = ps: with ps; [
@@ -970,7 +1383,10 @@
     ];
     "geocaching" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       geocachingapi
+      psutil-home-assistant
+      sqlalchemy
     ];
     "geofency" = ps: with ps; [
       aiohttp-cors
@@ -995,8 +1411,6 @@
     "glances" = ps: with ps; [
       glances-api
     ];
-    "goalfeed" = ps: with ps; [
-    ]; # missing inputs: pysher
     "goalzero" = ps: with ps; [
       goalzero
     ];
@@ -1008,24 +1422,53 @@
     ];
     "google" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       gcal-sync
       oauth2client
+      psutil-home-assistant
+      sqlalchemy
     ];
     "google_assistant" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
     ];
+    "google_assistant_sdk" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      gassist-text
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "google_cloud" = ps: with ps; [
       google-cloud-texttospeech
     ];
     "google_domains" = ps: with ps; [
     ];
+    "google_generative_ai_conversation" = ps: with ps; [
+      aiohttp-cors
+      hassil
+      home-assistant-intents
+    ]; # missing inputs: google-generativeai
+    "google_mail" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      google-api-python-client
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "google_maps" = ps: with ps; [
       locationsharinglib
     ];
     "google_pubsub" = ps: with ps; [
       google-cloud-pubsub
     ];
+    "google_sheets" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      gspread
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "google_translate" = ps: with ps; [
       gtts
     ];
@@ -1035,10 +1478,29 @@
     "google_wifi" = ps: with ps; [
     ];
     "govee_ble" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
       govee-ble
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "gpsd" = ps: with ps; [
       gps3
@@ -1050,8 +1512,11 @@
     ];
     "gree" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       greeclimate
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "greeneye_monitor" = ps: with ps; [
       greeneye-monitor
@@ -1074,17 +1539,12 @@
     "habitica" = ps: with ps; [
       habitipy
     ];
-    "hangouts" = ps: with ps; [
-      hangups
-    ];
     "hardkernel" = ps: with ps; [
       aiohttp-cors
-      fnvhash
-      home-assistant-frontend
-      pillow
-      sqlalchemy
+      psutil-home-assistant
     ];
     "hardware" = ps: with ps; [
+      psutil-home-assistant
     ];
     "harman_kardon_avr" = ps: with ps; [
       hkavr
@@ -1094,10 +1554,8 @@
     ];
     "hassio" = ps: with ps; [
       aiohttp-cors
-      fnvhash
-      home-assistant-frontend
-      pillow
-      sqlalchemy
+    ];
+    "havana_shade" = ps: with ps; [
     ];
     "haveibeenpwned" = ps: with ps; [
     ];
@@ -1108,11 +1566,18 @@
     ];
     "heatmiser" = ps: with ps; [
     ]; # missing inputs: heatmiserV3
+    "heiwa" = ps: with ps; [
+    ];
     "heos" = ps: with ps; [
       pyheos
     ];
     "here_travel_time" = ps: with ps; [
-      herepy
+      here-routing
+      here-transit
+    ];
+    "hexaom" = ps: with ps; [
+    ];
+    "hi_kumo" = ps: with ps; [
     ];
     "hikvision" = ps: with ps; [
     ]; # missing inputs: pyhik
@@ -1124,11 +1589,13 @@
     ];
     "history" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "history_stats" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "hitron_coda" = ps: with ps; [
@@ -1141,7 +1608,10 @@
     ];
     "home_connect" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       homeconnect
+      psutil-home-assistant
+      sqlalchemy
     ];
     "home_plus_control" = ps: with ps; [
       aiohttp-cors
@@ -1150,14 +1620,60 @@
     "homeassistant" = ps: with ps; [
     ];
     "homeassistant_alerts" = ps: with ps; [
+    ];
+    "homeassistant_hardware" = ps: with ps; [
       aiohttp-cors
+      bellows
+      fnv-hash-fast
+      janus
+      pillow
+      psutil-home-assistant
+      pyserial-asyncio
+      pyserial
+      pyudev
+      sqlalchemy
+      zha-quirks
+      zigpy-deconz
+      zigpy-xbee
+      zigpy-zigate
+      zigpy-znp
+      zigpy
+    ];
+    "homeassistant_sky_connect" = ps: with ps; [
+      aiohttp-cors
+      bellows
+      fnv-hash-fast
+      janus
+      pillow
+      psutil-home-assistant
+      pyserial-asyncio
+      pyserial
+      pyudev
+      sqlalchemy
+      zha-quirks
+      zigpy-deconz
+      zigpy-xbee
+      zigpy-zigate
+      zigpy-znp
+      zigpy
     ];
     "homeassistant_yellow" = ps: with ps; [
       aiohttp-cors
-      fnvhash
-      home-assistant-frontend
+      bellows
+      fnv-hash-fast
+      janus
       pillow
+      psutil-home-assistant
+      pyserial-asyncio
+      pyserial
+      pyudev
       sqlalchemy
+      zha-quirks
+      zigpy-deconz
+      zigpy-xbee
+      zigpy-zigate
+      zigpy-znp
+      zigpy
     ];
     "homekit" = ps: with ps; [
       hap-python
@@ -1165,17 +1681,38 @@
       pyturbojpeg
       aiohttp-cors
       base36
-      fnvhash
+      fnv-hash-fast
       ha-ffmpeg
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "homekit_controller" = ps: with ps; [
+      aioesphomeapi
       aiohomekit
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
       ifaddr
+      mutagen
+      psutil-home-assistant
+      pyroute2
+      pyserial
+      python-otbr-api
+      pyudev
+      sqlalchemy
+      webrtcvad
       zeroconf
     ];
     "homematic" = ps: with ps; [
@@ -1191,7 +1728,7 @@
       pyhomeworks
     ];
     "honeywell" = ps: with ps; [
-      somecomfort
+      aiosomecomfort
     ];
     "horizon" = ps: with ps; [
     ]; # missing inputs: horimote
@@ -1214,13 +1751,15 @@
       aiohue
     ];
     "huisbaasje" = ps: with ps; [
-      huisbaasje-client
+      energyflip-client
     ];
     "humidifier" = ps: with ps; [
     ];
     "hunterdouglas_powerview" = ps: with ps; [
       aiopvapi
     ];
+    "hurrican_shutters_wholesale" = ps: with ps; [
+    ];
     "hvv_departures" = ps: with ps; [
       pygti
     ];
@@ -1236,8 +1775,34 @@
     "iammeter" = ps: with ps; [
     ]; # missing inputs: iammeter
     "iaqualink" = ps: with ps; [
+      h2
       iaqualink
     ];
+    "ibeacon" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ibeacon-ble
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "icloud" = ps: with ps; [
       pyicloud
     ];
@@ -1255,18 +1820,21 @@
     "ihc" = ps: with ps; [
       defusedxml
     ]; # missing inputs: ihcsdk
-    "image" = ps: with ps; [
-      aiohttp-cors
-      pillow
-    ];
     "image_processing" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
     ];
+    "image_upload" = ps: with ps; [
+      aiohttp-cors
+      pillow
+    ];
     "imap" = ps: with ps; [
+      aiohttp-cors
       aioimaplib
     ];
     "imap_email_content" = ps: with ps; [
+      aiohttp-cors
+      aioimaplib
     ];
     "incomfort" = ps: with ps; [
       incomfort-client
@@ -1276,10 +1844,29 @@
       influxdb
     ];
     "inkbird" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
       inkbird-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "input_boolean" = ps: with ps; [
     ];
@@ -1293,12 +1880,16 @@
     ];
     "input_text" = ps: with ps; [
     ];
+    "inspired_shades" = ps: with ps; [
+    ];
     "insteon" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
       insteon-frontend-home-assistant
+      janus
       pillow
+      psutil-home-assistant
       pyinsteon
       pyserial
       pyudev
@@ -1319,12 +1910,14 @@
     ];
     "ios" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "iotawatt" = ps: with ps; [
-      iotawattpy
-    ];
+    ]; # missing inputs: ha-iotawattpy
     "iperf3" = ps: with ps; [
     ]; # missing inputs: iperf3
     "ipma" = ps: with ps; [
@@ -1342,6 +1935,8 @@
     "islamic_prayer_times" = ps: with ps; [
       prayer-times-calculator
     ];
+    "ismartwindow" = ps: with ps; [
+    ];
     "iss" = ps: with ps; [
     ]; # missing inputs: pyiss
     "isy994" = ps: with ps; [
@@ -1365,14 +1960,21 @@
     "juicenet" = ps: with ps; [
       python-juicenet
     ];
+    "justnimbus" = ps: with ps; [
+      justnimbus
+    ];
+    "jvc_projector" = ps: with ps; [
+    ]; # missing inputs: pyjvcprojector
     "kaiterra" = ps: with ps; [
     ]; # missing inputs: kaiterra-async-client
     "kaleidescape" = ps: with ps; [
-    ]; # missing inputs: pykaleidescape
+      pykaleidescape
+    ];
     "kankun" = ps: with ps; [
     ];
     "keba" = ps: with ps; [
-    ]; # missing inputs: keba-kecontact
+      keba-kecontact
+    ];
     "keenetic_ndms2" = ps: with ps; [
       ndms2-client
     ];
@@ -1380,22 +1982,87 @@
       aiokef
       getmac
     ];
+    "kegtron" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      kegtron-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "keyboard" = ps: with ps; [
     ]; # missing inputs: pyuserinput
     "keyboard_remote" = ps: with ps; [
       aionotify
       evdev
     ];
+    "keymitt_ble" = ps: with ps; [
+      pymicrobot
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "kira" = ps: with ps; [
       pykira
     ];
+    "kitchen_sink" = ps: with ps; [
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "kiwi" = ps: with ps; [
-    ]; # missing inputs: kiwiki-client
+      kiwiki-client
+    ];
     "kmtronic" = ps: with ps; [
       pykmtronic
     ];
     "knx" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      home-assistant-frontend
+      janus
+      knx-frontend
+      pillow
+      psutil-home-assistant
+      sqlalchemy
       xknx
+      xknxproject
     ];
     "kodi" = ps: with ps; [
       aiohttp-cors
@@ -1406,7 +2073,8 @@
       konnected
     ];
     "kostal_plenticore" = ps: with ps; [
-    ]; # missing inputs: kostal_plenticore
+      pykoplenti
+    ];
     "kraken" = ps: with ps; [
       krakenex
       pykrakenapi
@@ -1420,8 +2088,23 @@
     "lacrosse" = ps: with ps; [
       pylacrosse
     ];
+    "lacrosse_view" = ps: with ps; [
+    ]; # missing inputs: lacrosse-view
     "lametric" = ps: with ps; [
-      lmnotify
+      aiohttp-cors
+      demetriek
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
+    ];
+    "landisgyr_heat_meter" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      ultraheat-api
     ];
     "lannouncer" = ps: with ps; [
     ];
@@ -1437,21 +2120,79 @@
     "lcn" = ps: with ps; [
       pypck
     ];
+    "ld2410_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      ld2410-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
+    "led_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      led-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
+    "legrand" = ps: with ps; [
+    ];
     "lg_netcast" = ps: with ps; [
       pylgnetcast
     ];
     "lg_soundbar" = ps: with ps; [
       temescal
     ];
+    "lidarr" = ps: with ps; [
+      aiopyarr
+    ];
     "life360" = ps: with ps; [
       life360
     ];
     "lifx" = ps: with ps; [
       aiohttp-cors
-      aiolifx-connection
       aiolifx
       aiolifx-effects
+      aiolifx-themes
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "lifx_cloud" = ps: with ps; [
     ];
@@ -1478,13 +2219,22 @@
     "litterrobot" = ps: with ps; [
       pylitterbot
     ];
+    "livisi" = ps: with ps; [
+      aiolivisi
+    ];
     "llamalab_automate" = ps: with ps; [
     ];
+    "local_calendar" = ps: with ps; [
+      ical
+    ];
     "local_file" = ps: with ps; [
     ];
     "local_ip" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "locative" = ps: with ps; [
       aiohttp-cors
@@ -1493,9 +2243,11 @@
     ];
     "logbook" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
     "logentries" = ps: with ps; [
@@ -1531,14 +2283,17 @@
     "lutron_caseta" = ps: with ps; [
       pylutron-caseta
     ];
+    "luxaflex" = ps: with ps; [
+    ];
     "lw12wifi" = ps: with ps; [
     ]; # missing inputs: lw12
     "lyric" = ps: with ps; [
       aiohttp-cors
       aiolyric
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
     ];
-    "magicseaweed" = ps: with ps; [
-    ]; # missing inputs: magicseaweed
     "mailbox" = ps: with ps; [
       aiohttp-cors
     ];
@@ -1550,15 +2305,22 @@
     ];
     "manual_mqtt" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "map" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
+    "marantz" = ps: with ps; [
+    ];
+    "martec" = ps: with ps; [
+    ];
     "marytts" = ps: with ps; [
     ]; # missing inputs: speak2mary
     "mastodon" = ps: with ps; [
@@ -1567,6 +2329,13 @@
     "matrix" = ps: with ps; [
       matrix-client
     ];
+    "matter" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      python-matter-server
+      sqlalchemy
+    ];
     "maxcube" = ps: with ps; [
       maxcube-api
     ];
@@ -1594,6 +2363,30 @@
     ];
     "melissa" = ps: with ps; [
     ]; # missing inputs: py-melissa-climate
+    "melnor" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ]; # missing inputs: melnor-bluetooth
     "meraki" = ps: with ps; [
       aiohttp-cors
     ];
@@ -1635,7 +2428,8 @@
       aiohttp-cors
     ];
     "miflora" = ps: with ps; [
-      aiohttp-cors
+    ];
+    "mijndomein_energie" = ps: with ps; [
     ];
     "mikrotik" = ps: with ps; [
       librouteros
@@ -1655,22 +2449,47 @@
       minio
     ];
     "mitemp_bt" = ps: with ps; [
-      aiohttp-cors
     ];
     "mjpeg" = ps: with ps; [
     ];
     "moat" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
       moat-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "mobile_app" = ps: with ps; [
       pynacl
       pyturbojpeg
       aiohttp-cors
+      fnv-hash-fast
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
       pillow
+      psutil-home-assistant
+      sqlalchemy
+      webrtcvad
     ];
     "mochad" = ps: with ps; [
     ]; # missing inputs: pymochad
@@ -1679,9 +2498,12 @@
     ];
     "modem_callerid" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       phone-modem
+      psutil-home-assistant
       pyserial
       pyudev
+      sqlalchemy
     ];
     "modern_forms" = ps: with ps; [
       aiomodernforms
@@ -1690,14 +2512,44 @@
     ]; # missing inputs: moehlenhoff-alpha2
     "mold_indicator" = ps: with ps; [
     ];
+    "monessen" = ps: with ps; [
+    ];
     "monoprice" = ps: with ps; [
     ]; # missing inputs: pymonoprice
     "moon" = ps: with ps; [
     ];
+    "mopeka" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mopeka-iot-ble
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "motion_blinds" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
       motionblinds
+      psutil-home-assistant
+      sqlalchemy
     ];
     "motioneye" = ps: with ps; [
       aiohttp-cors
@@ -1708,22 +2560,27 @@
     ];
     "mqtt" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "mqtt_eventstream" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "mqtt_json" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "mqtt_room" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "mqtt_statestream" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "msteams" = ps: with ps; [
@@ -1736,22 +2593,23 @@
       mutesync
     ];
     "mvglive" = ps: with ps; [
-      PyMVGLive
+      pymvglive
     ];
     "my" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
-    "mycroft" = ps: with ps; [
-    ]; # missing inputs: mycroftapi
     "myq" = ps: with ps; [
       pymyq
     ];
     "mysensors" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
       pymysensors
     ];
@@ -1776,7 +2634,10 @@
     ];
     "neato" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       pybotvac
+      sqlalchemy
     ];
     "nederlandse_spoorwegen" = ps: with ps; [
       nsapi
@@ -1786,15 +2647,25 @@
     ];
     "nest" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       google-nest-sdm
       ha-ffmpeg
+      psutil-home-assistant
       python-nest
+      sqlalchemy
     ];
     "netatmo" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
+      fnv-hash-fast
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
+      psutil-home-assistant
       pyatmo
+      sqlalchemy
+      webrtcvad
     ];
     "netdata" = ps: with ps; [
       netdata
@@ -1810,13 +2681,18 @@
     ]; # missing inputs: pynetio
     "network" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "neurio_energy" = ps: with ps; [
     ]; # missing inputs: neurio
     "nexia" = ps: with ps; [
       nexia
     ];
+    "nexity" = ps: with ps; [
+    ];
     "nextbus" = ps: with ps; [
       py-nextbusnext
     ];
@@ -1827,7 +2703,11 @@
       nextdns
     ];
     "nfandroidtv" = ps: with ps; [
-    ]; # missing inputs: notifications-android-tv
+      notifications-android-tv
+    ];
+    "nibe_heatpump" = ps: with ps; [
+      nibe
+    ];
     "nightscout" = ps: with ps; [
       py-nightscout
     ];
@@ -1845,16 +2725,23 @@
     ];
     "nmap_tracker" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       getmac
       ifaddr
+      mac-vendor-lookup
       netmap
-    ]; # missing inputs: mac-vendor-lookup
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "nmbs" = ps: with ps; [
     ]; # missing inputs: pyrail
     "no_ip" = ps: with ps; [
     ];
     "noaa_tides" = ps: with ps; [
     ]; # missing inputs: noaa-coops
+    "nobo_hub" = ps: with ps; [
+      pynobo
+    ];
     "norway_air" = ps: with ps; [
       pymetno
     ];
@@ -1872,8 +2759,10 @@
       aio-geojson-nsw-rfs-incidents
     ];
     "nuheat" = ps: with ps; [
-    ]; # missing inputs: nuheat
+      nuheat
+    ];
     "nuki" = ps: with ps; [
+      aiohttp-cors
       pynuki
     ];
     "numato" = ps: with ps; [
@@ -1883,6 +2772,8 @@
     "nut" = ps: with ps; [
       pynut2
     ];
+    "nutrichef" = ps: with ps; [
+    ];
     "nws" = ps: with ps; [
       pynws
     ];
@@ -1914,9 +2805,9 @@
     ];
     "onboarding" = ps: with ps; [
       aiohttp-cors
-      fnvhash
-      home-assistant-frontend
+      fnv-hash-fast
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
     "oncue" = ps: with ps; [
@@ -1940,10 +2831,13 @@
     "open_meteo" = ps: with ps; [
       open-meteo
     ];
-    "openalpr_cloud" = ps: with ps; [
-    ];
-    "openalpr_local" = ps: with ps; [
+    "openai_conversation" = ps: with ps; [
       aiohttp-cors
+      hassil
+      home-assistant-intents
+      openai
+    ];
+    "openalpr_cloud" = ps: with ps; [
     ];
     "opencv" = ps: with ps; [
       numpy
@@ -1955,6 +2849,7 @@
       openevsewifi
     ];
     "openexchangerates" = ps: with ps; [
+      aioopenexchangerates
     ];
     "opengarage" = ps: with ps; [
       open-garage
@@ -1968,7 +2863,7 @@
       opensensemap-api
     ];
     "opensky" = ps: with ps; [
-    ];
+    ]; # missing inputs: python-opensky
     "opentherm_gw" = ps: with ps; [
       pyotgw
     ];
@@ -1984,6 +2879,31 @@
     "opple" = ps: with ps; [
       pyoppleio
     ];
+    "oralb" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      oralb-ble
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "oru" = ps: with ps; [
     ]; # missing inputs: oru
     "orvibo" = ps: with ps; [
@@ -1991,6 +2911,28 @@
     ];
     "osramlightify" = ps: with ps; [
     ]; # missing inputs: lightify
+    "otbr" = ps: with ps; [
+      aiohttp-cors
+      bellows
+      fnv-hash-fast
+      ifaddr
+      janus
+      pillow
+      psutil-home-assistant
+      pyroute2
+      pyserial-asyncio
+      pyserial
+      python-otbr-api
+      pyudev
+      sqlalchemy
+      zeroconf
+      zha-quirks
+      zigpy-deconz
+      zigpy-xbee
+      zigpy-zigate
+      zigpy-znp
+      zigpy
+    ];
     "otp" = ps: with ps; [
       pyotp
     ];
@@ -2005,7 +2947,12 @@
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      janus
+      mutagen
       paho-mqtt
+      webrtcvad
     ];
     "p1_monitor" = ps: with ps; [
       p1monitor
@@ -2021,18 +2968,24 @@
     ];
     "panel_custom" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
     "panel_iframe" = ps: with ps; [
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       home-assistant-frontend
+      janus
       pillow
+      psutil-home-assistant
       sqlalchemy
     ];
+    "pcs_lighting" = ps: with ps; [
+    ];
     "peco" = ps: with ps; [
       peco
     ];
@@ -2063,16 +3016,23 @@
     ];
     "pioneer" = ps: with ps; [
     ];
+    "piper" = ps: with ps; [
+    ];
     "pjlink" = ps: with ps; [
     ]; # missing inputs: pypjlink2
     "plaato" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
       pyplaato
+      webrtcvad
     ];
     "plant" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "plex" = ps: with ps; [
@@ -2125,6 +3085,9 @@
     "proxy" = ps: with ps; [
       pillow
     ];
+    "prusalink" = ps: with ps; [
+      pyprusalink
+    ];
     "ps4" = ps: with ps; [
     ]; # missing inputs: pyps4-2ndscreen
     "pulseaudio_loopback" = ps: with ps; [
@@ -2133,11 +3096,14 @@
     "pure_energie" = ps: with ps; [
       gridnet
     ];
+    "purpleair" = ps: with ps; [
+      aiopurpleair
+    ];
     "push" = ps: with ps; [
       aiohttp-cors
     ];
     "pushbullet" = ps: with ps; [
-      pushbullet
+      pushbullet-py
     ];
     "pushover" = ps: with ps; [
       pushover-complete
@@ -2157,6 +3123,31 @@
     ];
     "qbittorrent" = ps: with ps; [
     ]; # missing inputs: python-qbittorrent
+    "qingping" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      qingping-ble
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "qld_bushfire" = ps: with ps; [
       georss-qld-bushfire-alert-client
     ];
@@ -2170,6 +3161,8 @@
       pillow
       pyzbar
     ];
+    "quadrafire" = ps: with ps; [
+    ];
     "quantum_gateway" = ps: with ps; [
       quantum-gateway
     ];
@@ -2177,20 +3170,25 @@
       pyqvrpro
     ];
     "qwikswitch" = ps: with ps; [
-    ]; # missing inputs: pyqwikswitch
+      pyqwikswitch
+    ];
     "rachio" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
       rachiopy
+      webrtcvad
     ];
     "radarr" = ps: with ps; [
+      aiopyarr
     ];
     "radio_browser" = ps: with ps; [
       radios
     ];
     "radiotherm" = ps: with ps; [
-      aiohttp-cors
       radiotherm
     ];
     "rainbird" = ps: with ps; [
@@ -2208,15 +3206,39 @@
     ];
     "random" = ps: with ps; [
     ];
-    "raspberry_pi" = ps: with ps; [
+    "rapt_ble" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
-      fnvhash
-      home-assistant-frontend
-      pillow
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      rapt-ble
       sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
+    "raspberry_pi" = ps: with ps; [
+      aiohttp-cors
+      psutil-home-assistant
     ];
     "raspyrfm" = ps: with ps; [
     ]; # missing inputs: raspyrfm-client
+    "raven_rock_mfg" = ps: with ps; [
+    ];
     "rdw" = ps: with ps; [
       vehicle
     ];
@@ -2224,7 +3246,8 @@
       aiorecollect
     ];
     "recorder" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "recswitch" = ps: with ps; [
@@ -2246,6 +3269,10 @@
     "renault" = ps: with ps; [
       renault-api
     ];
+    "reolink" = ps: with ps; [
+      aiohttp-cors
+      reolink-aio
+    ];
     "repairs" = ps: with ps; [
       aiohttp-cors
     ];
@@ -2257,6 +3284,8 @@
     ];
     "rest_command" = ps: with ps; [
     ];
+    "rexel" = ps: with ps; [
+    ];
     "rflink" = ps: with ps; [
       rflink
     ];
@@ -2284,6 +3313,9 @@
     "rmvtransport" = ps: with ps; [
       pyrmvtransport
     ];
+    "roborock" = ps: with ps; [
+      python-roborock
+    ];
     "rocketchat" = ps: with ps; [
     ]; # missing inputs: rocketchat-API
     "roku" = ps: with ps; [
@@ -2323,17 +3355,65 @@
     ]; # missing inputs: russound_rio
     "russound_rnet" = ps: with ps; [
     ]; # missing inputs: russound
+    "ruuvi_gateway" = ps: with ps; [
+      aiohttp-cors
+      aioruuvigateway
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      fnv-hash-fast
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+    ];
+    "ruuvitag_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      ruuvitag-ble
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
+    "rympro" = ps: with ps; [
+    ]; # missing inputs: pyrympro
     "sabnzbd" = ps: with ps; [
       pysabnzbd
     ];
     "safe_mode" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
-      fnvhash
+      fnv-hash-fast
       hass-nabucasa
+      hassil
       home-assistant-frontend
+      home-assistant-intents
+      janus
+      mutagen
       pillow
+      psutil-home-assistant
       sqlalchemy
+      webrtcvad
     ];
     "saj" = ps: with ps; [
       pysaj
@@ -2341,10 +3421,13 @@
     "samsungtv" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       getmac
       ifaddr
+      psutil-home-assistant
       samsungctl
       samsungtvws
+      sqlalchemy
       wakeonlan
       zeroconf
     ]
@@ -2355,6 +3438,8 @@
     ]; # missing inputs: satel_integra
     "scene" = ps: with ps; [
     ];
+    "schedule" = ps: with ps; [
+    ];
     "schluter" = ps: with ps; [
     ]; # missing inputs: py-schluter
     "scrape" = ps: with ps; [
@@ -2363,6 +3448,8 @@
       lxml
       xmltodict
     ];
+    "screenaway" = ps: with ps; [
+    ];
     "screenlogic" = ps: with ps; [
       screenlogicpy
     ];
@@ -2372,6 +3459,9 @@
     ]; # missing inputs: scsgate
     "search" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
     ];
     "season" = ps: with ps; [
       ephem
@@ -2390,15 +3480,87 @@
     "sensibo" = ps: with ps; [
       pysensibo
     ];
+    "sensirion_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sensirion-ble
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "sensor" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
+    ];
+    "sensorblue" = ps: with ps; [
+    ];
+    "sensorpro" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sensorpro-ble
       sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "sensorpush" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
       sensorpush-ble
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "sentry" = ps: with ps; [
       sentry-sdk
@@ -2406,6 +3568,9 @@
     "senz" = ps: with ps; [
       aiohttp-cors
       aiosenz
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
     ];
     "serial" = ps: with ps; [
       pyserial-asyncio
@@ -2421,13 +3586,28 @@
     "seventeentrack" = ps: with ps; [
       py17track
     ];
+    "sfr_box" = ps: with ps; [
+      sfrbox-api
+    ];
     "sharkiq" = ps: with ps; [
       sharkiq
     ];
     "shell_command" = ps: with ps; [
     ];
     "shelly" = ps: with ps; [
+      aiohttp-cors
       aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      fnv-hash-fast
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
     ];
     "shiftr" = ps: with ps; [
       paho-mqtt
@@ -2451,11 +3631,14 @@
       pysignalclirestapi
     ];
     "simplepush" = ps: with ps; [
-      aiohttp-cors
     ]; # missing inputs: simplepush
     "simplisafe" = ps: with ps; [
       simplisafe-python
     ];
+    "simply_automated" = ps: with ps; [
+    ];
+    "simu" = ps: with ps; [
+    ];
     "simulated" = ps: with ps; [
     ];
     "sinch" = ps: with ps; [
@@ -2463,7 +3646,8 @@
     "siren" = ps: with ps; [
     ];
     "sisyphus" = ps: with ps; [
-    ]; # missing inputs: sisyphus-control
+      sisyphus-control
+    ];
     "sky_hub" = ps: with ps; [
       pyskyqhub
     ];
@@ -2494,21 +3678,29 @@
       aiohttp-cors
       pysmappee
     ];
+    "smart_blinds" = ps: with ps; [
+    ];
+    "smart_home" = ps: with ps; [
+    ];
     "smart_meter_texas" = ps: with ps; [
       smart-meter-texas
     ];
+    "smarther" = ps: with ps; [
+    ];
     "smartthings" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
       pysmartapp
       pysmartthings
+      webrtcvad
     ];
     "smarttub" = ps: with ps; [
       python-smarttub
     ];
-    "smarty" = ps: with ps; [
-    ]; # missing inputs: pysmarty
     "smhi" = ps: with ps; [
       smhi-pkg
     ];
@@ -2522,11 +3714,37 @@
     ];
     "snips" = ps: with ps; [
       aiohttp-cors
+      janus
       paho-mqtt
     ];
     "snmp" = ps: with ps; [
       pysnmplib
     ];
+    "snooz" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pysnooz
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
+    ];
     "solaredge" = ps: with ps; [
       solaredge
       stringcase
@@ -2542,6 +3760,8 @@
     "soma" = ps: with ps; [
       pysoma
     ];
+    "somfy" = ps: with ps; [
+    ];
     "somfy_mylink" = ps: with ps; [
       somfy-mylink-synergy
     ];
@@ -2554,19 +3774,22 @@
     "sonos" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       ifaddr
       plexapi
       plexauth
       plexwebsocket
+      psutil-home-assistant
       soco
+      sonos-websocket
       spotipy
+      sqlalchemy
       zeroconf
     ];
     "sony_projector" = ps: with ps; [
       pysdcp
     ];
     "soundtouch" = ps: with ps; [
-      aiohttp-cors
       libsoundtouch
     ];
     "spaceapi" = ps: with ps; [
@@ -2585,7 +3808,10 @@
     ]; # missing inputs: hass_splunk
     "spotify" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       spotipy
+      sqlalchemy
     ];
     "sql" = ps: with ps; [
       sqlalchemy
@@ -2599,7 +3825,10 @@
     "ssdp" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "starline" = ps: with ps; [
@@ -2607,25 +3836,30 @@
     ];
     "starlingbank" = ps: with ps; [
     ]; # missing inputs: starlingbank
+    "starlink" = ps: with ps; [
+    ]; # missing inputs: starlink-grpc-core
     "startca" = ps: with ps; [
       xmltodict
     ];
     "statistics" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       sqlalchemy
     ];
     "statsd" = ps: with ps; [
       statsd
     ];
     "steam_online" = ps: with ps; [
-      aiohttp-cors
       steamodd
     ];
     "steamist" = ps: with ps; [
       aiohttp-cors
       aiosteamist
       discovery30303
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
     ];
     "stiebel_eltron" = ps: with ps; [
       pymodbus
@@ -2633,10 +3867,13 @@
     "stookalert" = ps: with ps; [
       stookalert
     ];
+    "stookwijzer" = ps: with ps; [
+    ]; # missing inputs: stookwijzer
     "stream" = ps: with ps; [
       pyturbojpeg
       aiohttp-cors
       av
+      numpy
     ];
     "streamlabswater" = ps: with ps; [
       streamlabswater
@@ -2670,17 +3907,41 @@
     ];
     "switch_as_x" = ps: with ps; [
     ];
+    "switchbee" = ps: with ps; [
+      pyswitchbee
+    ];
     "switchbot" = ps: with ps; [
       pyswitchbot
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      zeroconf
     ];
     "switcher_kis" = ps: with ps; [
       aioswitcher
     ];
     "switchmate" = ps: with ps; [
     ]; # missing inputs: pySwitchmate
+    "symfonisk" = ps: with ps; [
+    ];
     "syncthing" = ps: with ps; [
       aiosyncthing
     ];
@@ -2691,6 +3952,7 @@
     "synology_chat" = ps: with ps; [
     ];
     "synology_dsm" = ps: with ps; [
+      aiohttp-cors
       py-synologydsm-api
     ];
     "synology_srm" = ps: with ps; [
@@ -2699,7 +3961,10 @@
     ];
     "system_bridge" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ]; # missing inputs: systembridgeconnector
     "system_health" = ps: with ps; [
@@ -2719,7 +3984,8 @@
       tailscale
     ];
     "tank_utility" = ps: with ps; [
-    ]; # missing inputs: tank_utility
+      tank-utility
+    ];
     "tankerkoenig" = ps: with ps; [
       pytankerkoenig
     ];
@@ -2728,6 +3994,7 @@
     "tasmota" = ps: with ps; [
       aiohttp-cors
       hatasmota
+      janus
       paho-mqtt
     ];
     "tautulli" = ps: with ps; [
@@ -2756,7 +4023,8 @@
     "telnet" = ps: with ps; [
     ];
     "temper" = ps: with ps; [
-    ]; # missing inputs: temperusb
+      temperusb
+    ];
     "template" = ps: with ps; [
     ];
     "tensorflow" = ps: with ps; [
@@ -2768,8 +4036,62 @@
     "tesla_wall_connector" = ps: with ps; [
       tesla-wall-connector
     ];
+    "text" = ps: with ps; [
+    ];
     "tfiac" = ps: with ps; [
     ]; # missing inputs: pytfiac
+    "thermobeacon" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      thermobeacon-ble
+      webrtcvad
+      zeroconf
+    ];
+    "thermoplus" = ps: with ps; [
+    ];
+    "thermopro" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      thermopro-ble
+      webrtcvad
+      zeroconf
+    ];
     "thermoworks_smoke" = ps: with ps; [
       stringcase
     ]; # missing inputs: thermoworks_smoke
@@ -2781,10 +4103,21 @@
     ]; # missing inputs: pythinkingcleaner
     "thomson" = ps: with ps; [
     ];
+    "thread" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      ifaddr
+      psutil-home-assistant
+      pyroute2
+      python-otbr-api
+      sqlalchemy
+      zeroconf
+    ];
     "threshold" = ps: with ps; [
     ];
     "tibber" = ps: with ps; [
-      fnvhash
+      fnv-hash-fast
+      psutil-home-assistant
       pytibber
       sqlalchemy
     ];
@@ -2793,6 +4126,33 @@
     "tile" = ps: with ps; [
       pytile
     ];
+    "tilt_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      tilt-ble
+      webrtcvad
+      zeroconf
+    ];
+    "time" = ps: with ps; [
+    ];
     "time_date" = ps: with ps; [
     ];
     "timer" = ps: with ps; [
@@ -2803,7 +4163,7 @@
     "tod" = ps: with ps; [
     ];
     "todoist" = ps: with ps; [
-      todoist
+      todoist-api-python
     ];
     "tolo" = ps: with ps; [
       tololib
@@ -2817,7 +4177,11 @@
       pyturbojpeg
       aiohttp-cors
       hass-nabucasa
+      hassil
+      home-assistant-intents
+      mutagen
       toonapi
+      webrtcvad
     ];
     "torque" = ps: with ps; [
       aiohttp-cors
@@ -2829,11 +4193,17 @@
     ]; # missing inputs: pytouchline
     "tplink" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
       python-kasa
+      sqlalchemy
     ];
     "tplink_lte" = ps: with ps; [
     ]; # missing inputs: tp-connected
+    "tplink_omada" = ps: with ps; [
+      tplink-omada-client
+    ];
     "traccar" = ps: with ps; [
       aiohttp-cors
       pytraccar
@@ -2858,7 +4228,7 @@
       pytrafikverket
     ];
     "transmission" = ps: with ps; [
-      transmissionrpc
+      transmission-rpc
     ];
     "transport_nsw" = ps: with ps; [
       pytransportnsw
@@ -2900,6 +4270,8 @@
     "twitter" = ps: with ps; [
       twitterapi
     ];
+    "ubiwizz" = ps: with ps; [
+    ];
     "ubus" = ps: with ps; [
       openwrt-ubus-rpc
     ];
@@ -2910,6 +4282,8 @@
     "ukraine_alarm" = ps: with ps; [
       uasiren
     ];
+    "ultraloq" = ps: with ps; [
+    ];
     "unifi" = ps: with ps; [
       aiounifi
     ];
@@ -2940,10 +4314,15 @@
     "upnp" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       getmac
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
+    "uprise_smart_shades" = ps: with ps; [
+    ];
     "uptime" = ps: with ps; [
     ];
     "uptimerobot" = ps: with ps; [
@@ -2951,12 +4330,12 @@
     ];
     "usb" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       pyserial
       pyudev
+      sqlalchemy
     ];
-    "uscis" = ps: with ps; [
-      aiohttp-cors
-    ]; # missing inputs: uscisstatus
     "usgs_earthquakes_feed" = ps: with ps; [
       aio-geojson-usgs-earthquakes
     ];
@@ -2975,8 +4354,11 @@
     ]; # missing inputs: vtjp
     "velbus" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       pyserial
       pyudev
+      sqlalchemy
       velbus-aio
     ];
     "velux" = ps: with ps; [
@@ -2991,6 +4373,8 @@
     "verisure" = ps: with ps; [
       vsure
     ];
+    "vermont_castings" = ps: with ps; [
+    ];
     "versasense" = ps: with ps; [
       pyversasense
     ];
@@ -3022,6 +4406,13 @@
     ];
     "voicerss" = ps: with ps; [
     ];
+    "voip" = ps: with ps; [
+      aiohttp-cors
+      hassil
+      home-assistant-intents
+      mutagen
+      webrtcvad
+    ]; # missing inputs: voip-utils
     "volkszaehler" = ps: with ps; [
       volkszaehler
     ];
@@ -3055,9 +4446,6 @@
     ];
     "watson_iot" = ps: with ps; [
     ]; # missing inputs: ibmiotf
-    "watson_tts" = ps: with ps; [
-      ibm-watson
-    ];
     "watttime" = ps: with ps; [
       aiowatttime
     ];
@@ -3074,6 +4462,9 @@
     ];
     "websocket_api" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
     ];
     "wemo" = ps: with ps; [
       pywemo
@@ -3081,6 +4472,8 @@
     "whirlpool" = ps: with ps; [
       whirlpool-sixth-sense
     ];
+    "whisper" = ps: with ps; [
+    ];
     "whois" = ps: with ps; [
       whois
     ];
@@ -3094,11 +4487,18 @@
     ]; # missing inputs: wirelesstagpy
     "withings" = ps: with ps; [
       aiohttp-cors
-    ]; # missing inputs: withings-api
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
+      withings-api
+    ];
     "wiz" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
       pywizlight
+      sqlalchemy
     ];
     "wled" = ps: with ps; [
       wled
@@ -3119,15 +4519,18 @@
     ];
     "wsdot" = ps: with ps; [
     ];
+    "wyoming" = ps: with ps; [
+      wyoming
+    ];
     "x10" = ps: with ps; [
     ];
     "xbox" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
       xbox-webapi
     ];
-    "xbox_live" = ps: with ps; [
-      xboxapi
-    ];
     "xeoma" = ps: with ps; [
       pyxeoma
     ];
@@ -3137,15 +4540,37 @@
     "xiaomi_aqara" = ps: with ps; [
       pyxiaomigateway
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
       netdisco
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "xiaomi_ble" = ps: with ps; [
+      aioesphomeapi
       aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
       bleak
       bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
       xiaomi-ble
+      zeroconf
     ];
     "xiaomi_miio" = ps: with ps; [
       construct
@@ -3160,9 +4585,36 @@
     ];
     "xs1" = ps: with ps; [
     ]; # missing inputs: xs1-api-client
+    "yale_home" = ps: with ps; [
+    ];
     "yale_smart_alarm" = ps: with ps; [
       yalesmartalarmclient
     ];
+    "yalexs_ble" = ps: with ps; [
+      aioesphomeapi
+      aiohttp-cors
+      aioruuvigateway
+      aioshelly
+      bleak-retry-connector
+      bleak
+      bluetooth-adapters
+      bluetooth-auto-recovery
+      bluetooth-data-tools
+      dbus-fast
+      esphome-dashboard-api
+      fnv-hash-fast
+      hassil
+      home-assistant-intents
+      ifaddr
+      mutagen
+      psutil-home-assistant
+      pyserial
+      pyudev
+      sqlalchemy
+      webrtcvad
+      yalexs-ble
+      zeroconf
+    ];
     "yamaha" = ps: with ps; [
       rxv
     ];
@@ -3170,7 +4622,10 @@
       aiohttp-cors
       aiomusiccast
       async-upnp-client
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "yandex_transport" = ps: with ps; [
@@ -3181,7 +4636,10 @@
     "yeelight" = ps: with ps; [
       aiohttp-cors
       async-upnp-client
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       yeelight
       zeroconf
     ];
@@ -3193,22 +4651,36 @@
     ];
     "yolink" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
+      sqlalchemy
       yolink-api
     ];
     "youless" = ps: with ps; [
       youless-api
     ];
+    "youtube" = ps: with ps; [
+      aiohttp-cors
+      fnv-hash-fast
+      google-api-python-client
+      psutil-home-assistant
+      sqlalchemy
+    ];
     "zabbix" = ps: with ps; [
       py-zabbix
     ];
     "zamg" = ps: with ps; [
+      zamg
     ];
     "zengge" = ps: with ps; [
       bluepy
     ]; # missing inputs: zengge
     "zeroconf" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       zeroconf
     ];
     "zerproc" = ps: with ps; [
@@ -3217,18 +4689,19 @@
     "zestimate" = ps: with ps; [
       xmltodict
     ];
+    "zeversolar" = ps: with ps; [
+    ]; # missing inputs: zeversolar
     "zha" = ps: with ps; [
       aiohttp-cors
       bellows
-      fnvhash
-      home-assistant-frontend
-      ifaddr
+      fnv-hash-fast
+      janus
       pillow
+      psutil-home-assistant
       pyserial-asyncio
       pyserial
       pyudev
       sqlalchemy
-      zeroconf
       zha-quirks
       zigpy-deconz
       zigpy-xbee
@@ -3249,13 +4722,19 @@
     ];
     "zwave_js" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
+      psutil-home-assistant
       pyserial
       pyudev
+      sqlalchemy
       zwave-js-server-python
     ];
     "zwave_me" = ps: with ps; [
       aiohttp-cors
+      fnv-hash-fast
       ifaddr
+      psutil-home-assistant
+      sqlalchemy
       url-normalize
       zeroconf
       zwave-me-ws
@@ -3274,30 +4753,37 @@
     "air_quality"
     "airly"
     "airnow"
+    "airq"
     "airthings"
+    "airthings_ble"
     "airtouch4"
     "airvisual"
+    "airvisual_pro"
     "airzone"
+    "airzone_cloud"
     "aladdin_connect"
     "alarm_control_panel"
     "alarmdecoder"
     "alert"
     "alexa"
-    "almond"
-    "ambee"
     "amberelectric"
     "ambiclimate"
     "ambient_station"
     "analytics"
+    "android_ip_webcam"
     "androidtv"
+    "androidtv_remote"
     "apache_kafka"
+    "apcupsd"
     "api"
     "apple_tv"
     "application_credentials"
     "apprise"
     "aprs"
+    "aranet"
     "arcam_fmj"
     "aseko_pool_live"
+    "assist_pipeline"
     "asuswrt"
     "atag"
     "august"
@@ -3318,8 +4804,10 @@
     "blackbird"
     "blebox"
     "blink"
+    "bluemaestro"
     "blueprint"
     "bluetooth"
+    "bluetooth_adapters"
     "bluetooth_le_tracker"
     "bmw_connected_drive"
     "bond"
@@ -3327,8 +4815,10 @@
     "braviatv"
     "broadlink"
     "brother"
+    "brottsplatskartan"
     "brunt"
     "bsblan"
+    "bthome"
     "buienradar"
     "button"
     "caldav"
@@ -3337,7 +4827,7 @@
     "canary"
     "cast"
     "cert_expiry"
-    "climacell"
+    "clicksend_tts"
     "climate"
     "cloud"
     "cloudflare"
@@ -3351,14 +4841,14 @@
     "control4"
     "conversation"
     "coolmaster"
-    "coronavirus"
     "counter"
     "cover"
     "cpuspeed"
     "crownstone"
     "daikin"
-    "darksky"
     "datadog"
+    "date"
+    "datetime"
     "debugpy"
     "deconz"
     "default_config"
@@ -3382,14 +4872,19 @@
     "dlna_dms"
     "dnsip"
     "doorbird"
+    "dormakaba_dkey"
     "dsmr"
+    "dsmr_reader"
     "dte_energy_bridge"
     "duckdns"
     "dunehd"
-    "dynalite"
+    "dwd_weather_warnings"
     "eafm"
+    "easyenergy"
     "ecobee"
     "econet"
+    "ecowitt"
+    "edl21"
     "efergy"
     "eight_sleep"
     "elgato"
@@ -3400,11 +4895,14 @@
     "emulated_kasa"
     "emulated_roku"
     "energy"
+    "energyzero"
     "enocean"
     "enphase_envoy"
     "environment_canada"
     "epson"
+    "escea"
     "esphome"
+    "eufylife_ble"
     "everlights"
     "evil_genius_labs"
     "ezviz"
@@ -3418,6 +4916,7 @@
     "fibaro"
     "fido"
     "file"
+    "file_upload"
     "filesize"
     "filter"
     "fireservicerota"
@@ -3429,7 +4928,6 @@
     "flipr"
     "flo"
     "flume"
-    "flunearyou"
     "flux"
     "flux_led"
     "folder"
@@ -3445,6 +4943,8 @@
     "fritzbox_callmonitor"
     "fronius"
     "frontend"
+    "frontier_silicon"
+    "fully_kiosk"
     "garages_amsterdam"
     "gdacs"
     "generic"
@@ -3465,8 +4965,11 @@
     "goodwe"
     "google"
     "google_assistant"
+    "google_assistant_sdk"
     "google_domains"
+    "google_mail"
     "google_pubsub"
+    "google_sheets"
     "google_translate"
     "google_travel_time"
     "google_wifi"
@@ -3479,12 +4982,12 @@
     "growatt_server"
     "guardian"
     "habitica"
-    "hangouts"
     "hardkernel"
     "hardware"
     "harmony"
     "hassio"
     "hddtemp"
+    "hdmi_cec"
     "heos"
     "here_travel_time"
     "hisense_aehw4a1"
@@ -3496,6 +4999,8 @@
     "home_plus_control"
     "homeassistant"
     "homeassistant_alerts"
+    "homeassistant_hardware"
+    "homeassistant_sky_connect"
     "homeassistant_yellow"
     "homekit"
     "homekit_controller"
@@ -3514,11 +5019,13 @@
     "hyperion"
     "ialarm"
     "iaqualink"
+    "ibeacon"
     "icloud"
     "ifttt"
     "ign_sismologia"
-    "image"
     "image_processing"
+    "image_upload"
+    "imap"
     "imap_email_content"
     "influxdb"
     "inkbird"
@@ -3534,7 +5041,6 @@
     "intent"
     "intent_script"
     "ios"
-    "iotawatt"
     "ipma"
     "ipp"
     "iqvia"
@@ -3544,23 +5050,36 @@
     "jellyfin"
     "jewish_calendar"
     "juicenet"
+    "justnimbus"
+    "kaleidescape"
     "keenetic_ndms2"
+    "kegtron"
+    "keymitt_ble"
     "kira"
+    "kitchen_sink"
     "kmtronic"
     "knx"
     "kodi"
     "konnected"
+    "kostal_plenticore"
     "kraken"
     "kulersky"
+    "lametric"
+    "landisgyr_heat_meter"
     "lastfm"
     "launch_library"
     "laundrify"
     "lcn"
+    "ld2410_ble"
+    "led_ble"
     "lg_soundbar"
+    "lidarr"
     "life360"
     "lifx"
     "light"
     "litterrobot"
+    "livisi"
+    "local_calendar"
     "local_file"
     "local_ip"
     "locative"
@@ -3579,6 +5098,7 @@
     "mailgun"
     "manual"
     "manual_mqtt"
+    "matter"
     "maxcube"
     "mazda"
     "meater"
@@ -3607,6 +5127,7 @@
     "modern_forms"
     "mold_indicator"
     "moon"
+    "mopeka"
     "motion_blinds"
     "motioneye"
     "mqtt"
@@ -3631,19 +5152,26 @@
     "network"
     "nexia"
     "nextbus"
+    "nextcloud"
     "nextdns"
+    "nfandroidtv"
+    "nibe_heatpump"
     "nightscout"
     "nina"
+    "nmap_tracker"
     "no_ip"
+    "nobo_hub"
     "notify"
     "notify_events"
     "notion"
     "nsw_rural_fire_service_feed"
+    "nuheat"
     "nuki"
     "number"
     "nut"
     "nws"
     "nx584"
+    "obihai"
     "octoprint"
     "omnilogic"
     "onboarding"
@@ -3652,14 +5180,18 @@
     "onewire"
     "onvif"
     "open_meteo"
+    "openai_conversation"
     "openalpr_cloud"
     "openerz"
+    "openexchangerates"
     "opengarage"
     "openhardwaremonitor"
     "opentherm_gw"
     "openuv"
     "openweathermap"
     "opnsense"
+    "oralb"
+    "otbr"
     "overkiz"
     "ovo_energy"
     "owntracks"
@@ -3685,21 +5217,28 @@
     "prometheus"
     "prosegur"
     "proximity"
+    "prusalink"
     "pure_energie"
+    "purpleair"
     "push"
     "pushbullet"
+    "pushover"
     "pvoutput"
     "pvpc_hourly_pricing"
     "python_script"
+    "qingping"
     "qld_bushfire"
     "qnap_qsw"
+    "qwikswitch"
     "rachio"
     "radarr"
     "radio_browser"
     "radiotherm"
+    "rainbird"
     "rainforest_eagle"
     "rainmachine"
     "random"
+    "rapt_ble"
     "raspberry_pi"
     "rdw"
     "recollect_waste"
@@ -3707,6 +5246,7 @@
     "reddit"
     "remote"
     "renault"
+    "reolink"
     "repairs"
     "rest"
     "rest_command"
@@ -3718,6 +5258,7 @@
     "risco"
     "rituals_perfume_genie"
     "rmvtransport"
+    "roborock"
     "roku"
     "roomba"
     "roon"
@@ -3725,10 +5266,13 @@
     "rss_feed_template"
     "rtsp_to_webrtc"
     "ruckus_unleashed"
+    "ruuvi_gateway"
+    "ruuvitag_ble"
     "sabnzbd"
     "safe_mode"
     "samsungtv"
     "scene"
+    "schedule"
     "scrape"
     "screenlogic"
     "script"
@@ -3738,11 +5282,14 @@
     "sense"
     "senseme"
     "sensibo"
+    "sensirion_ble"
     "sensor"
+    "sensorpro"
     "sensorpush"
     "sentry"
     "senz"
     "seventeentrack"
+    "sfr_box"
     "sharkiq"
     "shell_command"
     "shelly"
@@ -3765,8 +5312,10 @@
     "smarttub"
     "smhi"
     "smtp"
+    "snapcast"
     "snips"
     "snmp"
+    "snooz"
     "solaredge"
     "solarlog"
     "solax"
@@ -3799,6 +5348,7 @@
     "surepetcare"
     "switch"
     "switch_as_x"
+    "switchbee"
     "switchbot"
     "switcher_kis"
     "syncthing"
@@ -3816,11 +5366,18 @@
     "telegram"
     "telegram_bot"
     "tellduslive"
+    "temper"
     "template"
     "tesla_wall_connector"
+    "text"
+    "thermobeacon"
+    "thermopro"
+    "thread"
     "threshold"
     "tibber"
     "tile"
+    "tilt_ble"
+    "time"
     "time_date"
     "timer"
     "tod"
@@ -3831,6 +5388,7 @@
     "toon"
     "totalconnect"
     "tplink"
+    "tplink_omada"
     "traccar"
     "trace"
     "tractive"
@@ -3877,6 +5435,7 @@
     "vlc_telnet"
     "voicerss"
     "volumio"
+    "volvooncall"
     "vulcan"
     "vultr"
     "wake_on_lan"
@@ -3893,18 +5452,21 @@
     "whois"
     "wiffi"
     "wilight"
+    "withings"
     "wiz"
     "wled"
     "workday"
     "worldclock"
     "ws66i"
     "wsdot"
+    "wyoming"
     "xbox"
     "xiaomi"
     "xiaomi_aqara"
     "xiaomi_ble"
     "xiaomi_miio"
     "yale_smart_alarm"
+    "yalexs_ble"
     "yamaha"
     "yamaha_musiccast"
     "yandex_transport"
@@ -3912,6 +5474,8 @@
     "yeelight"
     "yolink"
     "youless"
+    "youtube"
+    "zamg"
     "zeroconf"
     "zerproc"
     "zha"
diff --git a/nixpkgs/pkgs/servers/home-assistant/default.nix b/nixpkgs/pkgs/servers/home-assistant/default.nix
index aa37f8833bed..b186ea46bb32 100644
--- a/nixpkgs/pkgs/servers/home-assistant/default.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/default.nix
@@ -2,12 +2,14 @@
 , lib
 , callPackage
 , fetchFromGitHub
-, fetchpatch
-, python3
+, fetchPypi
+, python311
 , substituteAll
-, ffmpeg
+, ffmpeg-headless
 , inetutils
 , nixosTests
+, home-assistant
+, testers
 
 # Look up dependencies of specified components in component-packages.nix
 , extraComponents ? [ ]
@@ -15,9 +17,6 @@
 # Additional packages to add to propagatedBuildInputs
 , extraPackages ? ps: []
 
-# Write out info about included extraComponents and extraPackages
-, writeText
-
 # Override Python packages using
 # self: super: { pkg = super.pkg.overridePythonAttrs (oldAttrs: { ... }); }
 # Applied after defaultOverrides
@@ -31,262 +30,256 @@ let
     # Override the version of some packages pinned in Home Assistant's setup.py and requirements_all.txt
 
     (self: super: {
-      advantage-air = super.advantage-air.overridePythonAttrs (oldAttrs: rec {
-        version = "0.3.1";
-        src = super.fetchPypi {
-          pname = "advantage_air";
-          inherit version;
-          hash = "sha256-C+cB6oHmbr9mHZKnbls42yenQy3+L8huLk9wKazIWfU=";
+      aiowatttime = super.aiowatttime.overridePythonAttrs (oldAttrs: rec {
+        version = "0.1.1";
+        src = fetchFromGitHub {
+          owner = "bachya";
+          repo = "aiowatttime";
+          rev = "refs/tags/${version}";
+          hash = "sha256-tWnxGLJT+CRFvkhxFamHxnLXBvoR8tfOvzH1o1i5JJg=";
         };
       });
-    })
 
-    (self: super: {
-      backoff = super.backoff.overridePythonAttrs (oldAttrs: rec {
-        version = "1.11.1";
+      astral = super.astral.overridePythonAttrs (oldAttrs: rec {
+        pname = "astral";
+        version = "2.2";
+        src = fetchPypi {
+          inherit pname version;
+          hash = "sha256-5B2ZZ9XEi+QhNGVS8PTe2tQ/85qDV09f8q0ytmJ7b74=";
+        };
+        postPatch = ''
+          substituteInPlace pyproject.toml \
+            --replace "poetry.masonry" "poetry.core.masonry"
+        '';
+        propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ [
+          self.pytz
+        ];
+      });
+
+      dsmr-parser = super.dsmr-parser.overridePythonAttrs (oldAttrs: rec {
+        version = "0.33";
         src = fetchFromGitHub {
-          owner = "litl";
-          repo = "backoff";
-          rev = "v${version}";
-          hash = "sha256-87IMcLaoCn0Vns8Ub/AFmv0gXtS0aPZX0cSt7+lOPm4=";
+          owner = "ndokter";
+          repo = "dsmr_parser";
+          rev = "refs/tags/v${version}";
+          hash = "sha256-Phx8Yqx6beTzkQv0fU8Pfs2btPgKVARdO+nMcne1S+w=";
         };
       });
-    })
 
-    (self: super: {
-      bsblan = super.bsblan.overridePythonAttrs (oldAttrs: rec {
-        version = "0.5.0";
-        postPatch = null;
-        propagatedBuildInputs = oldAttrs.propagatedBuildInputs ++ [ super.cattrs ];
+      geojson = super.geojson.overridePythonAttrs (oldAttrs: rec {
+        version = "2.5.0";
         src = fetchFromGitHub {
-          owner = "liudger";
-          repo = "python-bsblan";
-          rev = "v.${version}";
-          hash = "sha256-yzlHcIb5QlG+jAgEtKlAcY7rESiUY7nD1YwqK63wgcg=";
+          inherit (oldAttrs.src) owner repo;
+          rev = "refs/tags/${version}";
+          hash = "sha256-AcImffYki1gnIaZp/1eacNjdDgjn6qinPJXq9jYtoRg=";
         };
+        doCheck = false;
       });
-    })
 
-    (self: super: {
-      gridnet = super.gridnet.overridePythonAttrs (oldAttrs: rec {
-        version = "4.0.0";
+      jaraco-abode = super.jaraco-abode.overridePythonAttrs (oldAttrs: rec {
+        version = "3.3.0";
         src = fetchFromGitHub {
-          owner = "klaasnicolaas";
-          repo = "python-gridnet";
+          inherit (oldAttrs.src) owner repo;
           rev = "refs/tags/v${version}";
-          hash = "sha256-Ihs8qUx50tAUcRBsVArRhzoLcQUi1vbYh8sPyK75AEk=";
+          hash = "sha256-LnbWzIST+GMtdsHDKg67WWt9GmHUcSuGZ5Spei3nEio=";
         };
       });
-    })
 
-    (self: super: {
-      p1monitor = super.p1monitor.overridePythonAttrs (oldAttrs: rec {
-        version = "1.0.1";
+      # Pinned due to API changes in 10.0
+      mcstatus = super.mcstatus.overridePythonAttrs (oldAttrs: rec {
+        version = "9.3.0";
         src = fetchFromGitHub {
-          owner = "klaasnicolaas";
-          repo = "python-p1monitor";
+          owner = "py-mine";
+          repo = "mcstatus";
           rev = "refs/tags/v${version}";
-          hash = "sha256-g3isA2gF2AD+VVzTqpnD+YiJQ9Kcl0VKvwd5l5Yx/Uo=";
+          hash = "sha256-kNThVElEDqhbCitktBv5tQkjMaU4IsX0dJk63hvLhb0=";
         };
       });
-    })
 
-    # pytest-aiohttp>0.3.0 breaks home-assistant tests
-    (self: super: {
-      pytest-aiohttp = super.pytest-aiohttp.overridePythonAttrs (oldAttrs: rec {
-        version = "0.3.0";
-        src = oldAttrs.src.override {
-          inherit version;
-          hash = "sha256-ySmFQzljeXc3WDhwO2L+9jUoWYvAqdRRY566lfSqpE8=";
-        };
-        propagatedBuildInputs = with python3.pkgs; [ aiohttp pytest ];
+      # moto tests are a nuissance
+      moto = super.moto.overridePythonAttrs (_: {
         doCheck = false;
-        patches = [];
-      });
-      aiohomekit = super.aiohomekit.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires aiohttp>=1.0.0
-      });
-      gcal-sync = super.gcal-sync.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires aiohttp>=1.0.0
-      });
-      hass-nabucasa = super.hass-nabucasa.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires aiohttp>=1.0.0
-      });
-      pynws = super.pynws.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires pytest-aiohttp>=1.0.0
       });
-      pytomorrowio = super.pytomorrowio.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires pytest-aiohttp>=1.0.0
-      });
-      rtsp-to-webrtc = super.rtsp-to-webrtc.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires pytest-aiohttp>=1.0.0
-      });
-      snitun = super.snitun.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires aiohttp>=1.0.0
-      });
-      zwave-js-server-python = super.zwave-js-server-python.overridePythonAttrs (oldAttrs: {
-        doCheck = false; # requires aiohttp>=1.0.0
+
+      notifications-android-tv = super.notifications-android-tv.overridePythonAttrs (oldAttrs: rec {
+        version = "0.1.5";
+        format = "setuptools";
+
+        src = fetchFromGitHub {
+          owner = "engrbm87";
+          repo = "notifications_android_tv";
+          rev = "refs/tags/${version}";
+          hash = "sha256-adkcUuPl0jdJjkBINCTW4Kmc16C/HzL+jaRZB/Qr09A=";
+        };
+
+        nativeBuildInputs = with super; [
+          setuptools
+        ];
+
+        propagatedBuildInputs = with super; [
+          requests
+        ];
+
+        doCheck = false; # no tests
       });
-    })
 
-    (self: super: {
-      plugwise = super.plugwise.overridePythonAttrs (oldAttrs: rec {
-        version = "0.20.1";
+      # Pinned due to API changes in 1.3.0
+      ovoenergy = super.ovoenergy.overridePythonAttrs (oldAttrs: rec {
+        version = "1.2.0";
         src = fetchFromGitHub {
-          owner = "plugwise";
-          repo = "python-plugwise";
+          owner = "timmo001";
+          repo = "ovoenergy";
           rev = "refs/tags/v${version}";
-          hash = "sha256-Sk7L0JPwn7IXVl5GeERxrG/vrHXeNwUjW1mgm4g40Ng=";
+          hash = "sha256-OSK74uvpHuEtWgbLVFrz1NO7lvtHbt690smGQ+GlsOI=";
         };
       });
-    })
 
-    # Pinned due to API changes in 0.1.0
-    (mkOverride "poolsense" "0.0.8" "sha256-17MHrYRmqkH+1QLtgq2d6zaRtqvb9ju9dvPt9gB2xCc=")
+      # Pinned due to API changes in 0.1.0
+      poolsense = super.poolsense.overridePythonAttrs (oldAttrs: rec {
+        version = "0.0.8";
+        src = fetchPypi {
+          pname = "poolsense";
+          inherit version;
+          hash = "sha256-17MHrYRmqkH+1QLtgq2d6zaRtqvb9ju9dvPt9gB2xCc=";
+        };
+      });
 
-    # Pinned due to API changes >0.3.5.3
-    (self: super: {
-      pyatag = super.pyatag.overridePythonAttrs (oldAttrs: rec {
-        version = "0.3.5.3";
+      p1monitor = super.p1monitor.overridePythonAttrs (oldAttrs: rec {
+        version = "2.1.1";
         src = fetchFromGitHub {
-          owner = "MatsNl";
-          repo = "pyatag";
-          rev = version;
-          sha256 = "00ly4injmgrj34p0lyx7cz2crgnfcijmzc0540gf7hpwha0marf6";
+          inherit (oldAttrs.src) owner repo;
+          rev = "refs/tags/v${version}";
+          hash = "sha256-VHY5AWxt5BZd1NQKzsgubEZBLKAlDNm8toyEazPUnDU=";
         };
       });
-    })
 
-    (self: super: {
-      pyatmo = super.pyatmo.overridePythonAttrs (oldAttrs: rec {
-        version = "6.2.4";
+      py-synologydsm-api = super.py-synologydsm-api.overridePythonAttrs (oldAttrs: rec {
+        version = "2.1.4";
         src = fetchFromGitHub {
-          owner = "jabesq";
-          repo = "pyatmo";
+          owner = "mib1185";
+          repo = "py-synologydsm-api";
           rev = "refs/tags/v${version}";
-          hash = "sha256-VXkQByaNA02fwBO2yuf7w1ZF/oJwd/h21de1EQlCu2U=";
+          hash = "sha256-37JzdhMny6YDTBO9NRzfrZJAVAOPnpcr95fOKxisbTg=";
         };
-        checkInputs = [ super.freezegun ];
       });
-    })
 
-    # pyunifiprotect excludes pydantic==1.9.1
-    (self: super: {
-      pydantic = super.pydantic.overridePythonAttrs (oldAttrs: rec {
-        version = "1.9.0";
+      # Pinned due to API changes >0.3.5.3
+      pyatag = super.pyatag.overridePythonAttrs (oldAttrs: rec {
+        version = "0.3.5.3";
         src = fetchFromGitHub {
-          owner = "samuelcolvin";
-          repo = "pydantic";
-          rev = "refs/tags/v${version}";
-          hash = "sha256-C4WP8tiMRFmkDkQRrvP3yOSM2zN8pHJmX9cdANIckpM=";
+          owner = "MatsNl";
+          repo = "pyatag";
+          rev = version;
+          sha256 = "00ly4injmgrj34p0lyx7cz2crgnfcijmzc0540gf7hpwha0marf6";
         };
       });
-    })
 
-    (self: super: {
-      pydeconz = super.pydeconz.overridePythonAttrs (oldAttrs: rec {
-        version = "102";
+      pykaleidescape = super.pykaleidescape.overridePythonAttrs (oldAttrs: rec {
+        version = "1.0.1";
         src = fetchFromGitHub {
-          owner = "Kane610";
-          repo = "deconz";
+          inherit (oldAttrs.src) owner repo;
           rev = "refs/tags/v${version}";
-          hash = "sha256-Dbhp/+xyyWhFcYp2VRnivn5d1JMR5hBctdArIzLKIjM=";
+          hash = "sha256-KM/gtpsQ27QZz2uI1t/yVN5no0zp9LZag1duAJzK55g=";
         };
-        doCheck = false; # requires pytest-aiohttp>=1.0.0
       });
-    })
-
 
-    (self: super: {
       python-slugify = super.python-slugify.overridePythonAttrs (oldAttrs: rec {
         pname = "python-slugify";
         version = "4.0.1";
-        src = super.fetchPypi {
+        src = fetchPypi {
           inherit pname version;
           hash = "sha256-aaUXdm4AwSaOW7/A0BCgqFCN4LGNMK1aH/NX+K5yQnA=";
         };
       });
-    })
 
-    (self: super: {
       pytradfri = super.pytradfri.overridePythonAttrs (oldAttrs: rec {
-        version = "9.0.0";
+        version = "9.0.1";
         src = fetchFromGitHub {
           owner = "home-assistant-libs";
           repo = "pytradfri";
           rev = "refs/tags/${version}";
-          hash = "sha256-12ol+2CnoPfkxmDGJJAkoafHGpQuWC4lh0N7lSvx2DE=";
+          hash = "sha256-xOdTzG0bF5p1QpkXv2btwrVugQRjSwdAj8bXcC0IoQg=";
         };
       });
-    })
 
-    (self: super: {
-      solax = super.solax.overridePythonAttrs (oldAttrs: rec {
-        version = "0.2.9";
-        src = super.fetchPypi {
-          pname = "solax";
-          inherit version;
-          hash = "sha256-5m2wxdTshAsEfldPAyXqAYYtH1VjqERRBUGzX6pV85I=";
+      python-telegram-bot = super.python-telegram-bot.overridePythonAttrs (oldAttrs: rec {
+        version = "13.15";
+        src = fetchFromGitHub {
+          owner = "python-telegram-bot";
+          repo = "python-telegram-bot";
+          rev = "v${version}";
+          hash = "sha256-EViSjr/nnuJIDTwV8j/O50hJkWV3M5aTNnWyzrinoyg=";
         };
+        propagatedBuildInputs = [
+          self.apscheduler
+          self.cachetools
+          self.certifi
+          self.cryptography
+          self.decorator
+          self.future
+          self.tornado
+          self.urllib3
+        ];
+        setupPyGlobalFlags = [ "--with-upstream-urllib3" ];
+        postPatch = ''
+          rm -r telegram/vendor
+          substituteInPlace requirements.txt \
+            --replace "APScheduler==3.6.3" "APScheduler" \
+            --replace "cachetools==4.2.2" "cachetools" \
+            --replace "tornado==6.1" "tornado"
+        '';
+        doCheck = false;
       });
-    })
 
-    (self: super: {
-      pysoma = super.pysoma.overridePythonAttrs (oldAttrs: rec {
-        version = "0.0.10";
-        src = super.fetchPypi {
-          pname = "pysoma";
+      sqlalchemy = super.sqlalchemy.overridePythonAttrs (oldAttrs: rec {
+        version = "2.0.12";
+        src = fetchPypi {
+          pname = "SQLAlchemy";
           inherit version;
-          hash = "sha256-sU1qHbAjdIUu0etjate8+U1zvunbw3ddBtDVUU10CuE=";
+          hash = "sha256-vd/FvR3uXbD93J2rJvgAwoPzJD5ygbvxByAP7TASX5w=";
         };
       });
-    })
 
-    # Pinned due to API changes in 0.4.0
-    (self: super: {
-      vilfo-api-client = super.vilfo-api-client.overridePythonAttrs (oldAttrs: rec {
-        version = "0.3.3";
+      # Pinned due to API changes in 0.3.0
+      tailscale = super.tailscale.overridePythonAttrs (oldAttrs: rec {
+        version = "0.2.0";
         src = fetchFromGitHub {
-          owner = "ManneW";
-          repo = "vilfo-api-client-python";
-          rev = "v${version}";
-          sha256 = "1gy5gpsg99rcm1cc3m30232za00r9i46sp74zpd12p3vzz1wyyqf";
+          owner = "frenck";
+          repo = "python-tailscale";
+          rev = "refs/tags/v${version}";
+          hash = "sha256-/tS9ZMUWsj42n3MYPZJYJELzX3h02AIHeRZmD2SuwWE=";
         };
       });
-    })
 
-    # Pinned due to API changes ~1.0
-    (self: super: {
+      # Pinned due to API changes ~1.0
       vultr = super.vultr.overridePythonAttrs (oldAttrs: rec {
         version = "0.1.2";
         src = fetchFromGitHub {
           owner = "spry-group";
           repo = "python-vultr";
-          rev = "v${version}";
-          sha256 = "1qjvvr2v9gfnwskdl0ayazpcmiyw9zlgnijnhgq9mcri5gq9jw5h";
+          rev = version;
+          hash = "sha256-sHCZ8Csxs5rwg1ZG++hP3MfK7ldeAdqm5ta9tEXeW+I=";
         };
       });
-    })
 
-    # home-assistant-frontend does not exist in python3.pkgs
-    (self: super: {
+      websockets = super.websockets.overridePythonAttrs (oldAttrs: rec {
+        version = "11.0.1";
+        src = fetchFromGitHub {
+          owner = "aaugustin";
+          repo = "websockets";
+          rev = "refs/tags/${version}";
+          hash = "sha256-cD8pC7n2OGS8AjG0VdjNXi8jXxvN7yKkadNR0GCqc90=";
+        };
+      });
+
+      # internal python packages only consumed by home-assistant itself
       home-assistant-frontend = self.callPackage ./frontend.nix { };
+      home-assistant-intents = self.callPackage ./intents.nix { };
     })
   ];
 
-  mkOverride = attrName: version: hash:
-    self: super: {
-      ${attrName} = super.${attrName}.overridePythonAttrs (oldAttrs: {
-        inherit version;
-        src = oldAttrs.src.override {
-          inherit version hash;
-        };
-      });
-    };
-
-  python = python3.override {
-    # Put packageOverrides at the start so they are applied after defaultOverrides
-    packageOverrides = lib.foldr lib.composeExtensions (self: super: { }) ([ packageOverrides ] ++ defaultOverrides);
+  python = python311.override {
+    packageOverrides = lib.composeManyExtensions (defaultOverrides ++ [ packageOverrides ]);
   };
 
   componentPackages = import ./component-packages.nix;
@@ -302,12 +295,8 @@ let
   # Ensure that we are using a consistent package set
   extraBuildInputs = extraPackages python.pkgs;
 
-  # Create info about included packages and components
-  extraComponentsFile = writeText "home-assistant-components" (lib.concatStringsSep "\n" extraComponents);
-  extraPackagesFile = writeText "home-assistant-packages" (lib.concatMapStringsSep "\n" (pkg: pkg.pname) extraBuildInputs);
-
   # Don't forget to run parse-requirements.py after updating
-  hassVersion = "2022.8.5";
+  hassVersion = "2023.6.0";
 
 in python.pkgs.buildPythonApplication rec {
   pname = "homeassistant";
@@ -315,40 +304,62 @@ in python.pkgs.buildPythonApplication rec {
   format = "pyproject";
 
   # check REQUIRED_PYTHON_VER in homeassistant/const.py
-  disabled = python.pythonOlder "3.9";
+  disabled = python.pythonOlder "3.10";
 
   # don't try and fail to strip 6600+ python files, it takes minutes!
   dontStrip = true;
 
-  # PyPI tarball is missing tests/ directory
-  src = fetchFromGitHub {
+  # Primary source is the pypi sdist, because it contains translations
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-dEszA95EIwGMR2Ztpe7P8weh4FbqGJBkso7nCvTkPDc=";
+  };
+
+  # Secondary source is git for tests
+  gitSrc = fetchFromGitHub {
     owner = "home-assistant";
     repo = "core";
-    rev = version;
-    hash = "sha256-cPoXL9YQolU5o/R9XhxfTDAwutzgksrsonitwjvxGM0=";
+    rev = "refs/tags/${version}";
+    hash = "sha256-0rhjh/mIevRdisWvTSx9QQjHdY7nMVpuGyTr9sChipk=";
   };
 
+  nativeBuildInputs = with python.pkgs; [
+    setuptools
+  ];
+
+  # copy tests early, so patches apply as they would to the git repo
+  prePatch = ''
+    cp --no-preserve=mode --recursive ${gitSrc}/tests ./
+    chmod u+x tests/auth/providers/test_command_line_cmd.sh
+  '';
+
   # leave this in, so users don't have to constantly update their downstream patch handling
   patches = [
     (substituteAll {
       src = ./patches/ffmpeg-path.patch;
-      ffmpeg = "${lib.getBin ffmpeg}/bin/ffmpeg";
+      ffmpeg = "${lib.getBin ffmpeg-headless}/bin/ffmpeg";
     })
-    ./patches/wilight-import.patch
   ];
 
   postPatch = let
     relaxedConstraints = [
+      "aiohttp"
       "attrs"
       "awesomeversion"
       "bcrypt"
+      "ciso8601"
       "cryptography"
       "home-assistant-bluetooth"
       "httpx"
       "ifaddr"
       "orjson"
+      "pip"
       "PyJWT"
+      "pyOpenSSL"
       "requests"
+      "typing-extensions"
+      "voluptuous-serialize"
+      "yarl"
     ];
   in ''
     sed -r -i \
@@ -360,7 +371,7 @@ in python.pkgs.buildPythonApplication rec {
   '';
 
   propagatedBuildInputs = with python.pkgs; [
-    # Only packages required in setup.py
+    # Only packages required in pyproject.toml
     aiohttp
     astral
     async-timeout
@@ -378,43 +389,52 @@ in python.pkgs.buildPythonApplication rec {
     lru-dict
     orjson
     pip
+    pyopenssl
     pyjwt
     python-slugify
     pyyaml
     requests
+    ulid-transform
     voluptuous
     voluptuous-serialize
     yarl
-    # Not in setup.py, but used in homeassistant/util/package.py
+    # Implicit dependency via homeassistant/requirements.py
     setuptools
-    # Not in setup.py, but uncounditionally imported via tests/conftest.py
-    paho-mqtt
-  ] ++ componentBuildInputs ++ extraBuildInputs;
+  ];
 
   makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";
 
   # upstream only tests on Linux, so do we.
   doCheck = stdenv.isLinux;
 
-  checkInputs = with python.pkgs; [
+  nativeCheckInputs = with python.pkgs; [
     # test infrastructure (selectively from requirement_test.txt)
     freezegun
+    pytest-asyncio
     pytest-aiohttp
-    pytest-freezegun
+    pytest-freezer
     pytest-mock
     pytest-rerunfailures
     pytest-socket
+    pytest-timeout
+    pytest-unordered
     pytest-xdist
     pytestCheckHook
     requests-mock
     respx
     stdlib-list
-    # required by tests/auth/mfa_modules
+    syrupy
+    tomli
+    # required through tests/auth/mfa_modules/test_otp.py
     pyotp
+    # Sneakily imported in tests/conftest.py
+    paho-mqtt
   ] ++ lib.concatMap (component: getPackages component python.pkgs) [
     # some components are needed even if tests in tests/components are disabled
     "default_config"
     "hue"
+    # for tests/test_config.py::test_merge_id_schema
+    "qwikswitch"
   ];
 
   pytestFlagsArray = [
@@ -425,8 +445,10 @@ in python.pkgs.buildPythonApplication rec {
     "--only-rerun RuntimeError"
     # enable full variable printing on error
     "--showlocals"
-    # helpers/test_system_info.py: AssertionError: assert 'Unknown' == 'Home Assistant Container'
-    "--deselect tests/helpers/test_system_info.py::test_container_installationtype"
+    # AssertionError: assert 1 == 0
+    "--deselect tests/test_config.py::test_merge"
+    # AssertionError: assert 2 == 1
+    "--deselect=tests/helpers/test_translation.py::test_caching"
     # tests are located in tests/
     "tests"
   ];
@@ -438,17 +460,6 @@ in python.pkgs.buildPythonApplication rec {
     "tests/pylint"
     # don't bulk test all components
     "tests/components"
-    # pyotp since v2.4.0 complains about the short mock keys, hass pins v2.3.0
-    "tests/auth/mfa_modules/test_notify.py"
-  ];
-
-  disabledTests = [
-    # AssertionError: assert 1 == 0
-    "test_merge"
-    # Tests are flaky
-    "test_config_platform_valid"
-    # Test requires pylint>=2.13.0
-    "test_invalid_discovery_info"
   ];
 
   preCheck = ''
@@ -461,11 +472,6 @@ in python.pkgs.buildPythonApplication rec {
     export PATH=${inetutils}/bin:$PATH
   '';
 
-  postInstall = ''
-    cp -v ${extraComponentsFile} $out/extra_components
-    cp -v ${extraPackagesFile} $out/extra_packages
-  '';
-
   passthru = {
     inherit
       availableComponents
@@ -473,9 +479,16 @@ in python.pkgs.buildPythonApplication rec {
       getPackages
       python
       supportedComponentsWithTests;
+    pythonPath = python.pkgs.makePythonPath (componentBuildInputs ++ extraBuildInputs);
+    frontend = python.pkgs.home-assistant-frontend;
+    intents = python.pkgs.home-assistant-intents;
     tests = {
       nixos = nixosTests.home-assistant;
       components = callPackage ./tests.nix { };
+      version = testers.testVersion {
+        package = home-assistant;
+        command = "hass --version";
+      };
     };
   };
 
diff --git a/nixpkgs/pkgs/servers/home-assistant/frontend.nix b/nixpkgs/pkgs/servers/home-assistant/frontend.nix
index 868b8359e7de..ff33cc8cee91 100644
--- a/nixpkgs/pkgs/servers/home-assistant/frontend.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/frontend.nix
@@ -4,7 +4,7 @@ buildPythonPackage rec {
   # the frontend version corresponding to a specific home-assistant version can be found here
   # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json
   pname = "home-assistant-frontend";
-  version = "20220802.0";
+  version = "20230607.0";
   format = "wheel";
 
   src = fetchPypi {
@@ -12,7 +12,7 @@ buildPythonPackage rec {
     pname = "home_assistant_frontend";
     dist = "py3";
     python = "py3";
-    sha256 = "sha256-vUK/apsaJLaR/i6I2EWPxyohps+EazOr9ZuBKoRcyCI=";
+    hash = "sha256-O3hAF3QgZHm6q+manxlqWZLlSDxHMr86B3GdwMClxEk=";
   };
 
   # there is nothing to strip in this package
diff --git a/nixpkgs/pkgs/servers/home-assistant/intents.nix b/nixpkgs/pkgs/servers/home-assistant/intents.nix
new file mode 100644
index 000000000000..ae247b9e7a08
--- /dev/null
+++ b/nixpkgs/pkgs/servers/home-assistant/intents.nix
@@ -0,0 +1,72 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, pythonOlder
+, setuptools
+
+# build
+, hassil
+, jinja2
+, pyyaml
+, regex
+, voluptuous
+, python
+
+# tests
+, pytest-xdist
+, pytestCheckHook
+}:
+
+buildPythonPackage rec {
+  pname = "home-assistant-intents";
+  version = "2023.6.5";
+  format = "pyproject";
+
+  disabled = pythonOlder "3.9";
+
+  src = fetchFromGitHub {
+    owner = "home-assistant";
+    repo = "intents";
+    rev = "refs/tags/${version}";
+    hash = "sha256-ZfPOxTFPQNdZ3Tq8p410RHlLGej+FOqhafD+91MRbRo=";
+  };
+
+  sourceRoot = "source/package";
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace "2023.4.26" "${version}"
+  '';
+
+  nativeBuildInputs = [
+    hassil
+    jinja2
+    pyyaml
+    regex
+    setuptools
+    voluptuous
+  ];
+
+  postInstall = ''
+    pushd ..
+    # https://github.com/home-assistant/intents/blob/main/script/package#L18
+    ${python.pythonForBuild.interpreter} -m script.intentfest merged_output $out/${python.sitePackages}/home_assistant_intents/data
+    popd
+  '';
+
+  checkInputs = [
+    pytest-xdist
+    pytestCheckHook
+  ];
+
+  pytestFlagsArray = [
+    "../tests"
+  ];
+
+  meta = with lib; {
+    description = "Intents to be used with Home Assistant";
+    homepage = "https://github.com/home-assistant/intents";
+    license = licenses.cc-by-40;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py b/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
index b7bf2937a297..142f09163428 100755
--- a/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
+++ b/nixpkgs/pkgs/servers/home-assistant/parse-requirements.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env nix-shell
-#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ mypy attrs packaging rich ])
+#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ packaging rich ])" -p nodePackages.pyright ruff isort"
 #
 # This script downloads Home Assistant's source tarball.
 # Inside the homeassistant/components directory, each integration has an associated manifest.json,
@@ -25,9 +25,11 @@ import tarfile
 import tempfile
 from functools import reduce
 from io import BytesIO
-from typing import Dict, Optional, Set, Any
+from typing import Any, Dict, List, Optional, Set
 from urllib.request import urlopen
+
 from packaging import version as Version
+from packaging.version import InvalidVersion
 from rich.console import Console
 from rich.table import Table
 
@@ -37,24 +39,40 @@ PKG_SET = "home-assistant.python.pkgs"
 # If some requirements are matched by multiple or no Python packages, the
 # following can be used to choose the correct one
 PKG_PREFERENCES = {
+    "fiblary3": "fiblary3-fork",  # https://github.com/home-assistant/core/issues/66466
     "ha-av": "av",
-    "youtube_dl": "youtube-dl-light",
+    "HAP-python": "hap-python",
     "tensorflow": "tensorflow",
-    "fiblary3": "fiblary3-fork", # https://github.com/home-assistant/core/issues/66466
+    "youtube_dl": "youtube-dl-light",
+}
+
+# Some dependencies are loaded dynamically at runtime, and are not
+# mentioned in the manifest files.
+EXTRA_COMPONENT_DEPS = {
+    "conversation": [
+        "intent"
+    ],
+    "default_config": [
+        "backup",
+    ],
 }
 
 
-def run_mypy() -> None:
-    cmd = ["mypy", "--ignore-missing-imports", __file__]
+
+def run_sync(cmd: List[str]) -> None:
     print(f"$ {' '.join(cmd)}")
-    subprocess.run(cmd, check=True)
+    process = subprocess.run(cmd)
 
+    if process.returncode != 0:
+        sys.exit(1)
 
-def get_version():
+
+def get_version() -> str:
     with open(os.path.dirname(sys.argv[0]) + "/default.nix") as f:
         # A version consists of digits, dots, and possibly a "b" (for beta)
-        m = re.search('hassVersion = "([\\d\\.b]+)";', f.read())
-        return m.group(1)
+        if match := re.search('hassVersion = "([\\d\\.b]+)";', f.read()):
+            return match.group(1)
+        raise RuntimeError("hassVersion not in default.nix")
 
 
 def parse_components(version: str = "master"):
@@ -73,7 +91,7 @@ def parse_components(version: str = "master"):
                 components_with_tests.append(entry.name)
 
         sys.path.append(core_path)
-        from script.hassfest.model import Integration
+        from script.hassfest.model import Integration  # type: ignore
         integrations = Integration.load_dir(
             pathlib.Path(
                 os.path.join(core_path, "homeassistant/components")
@@ -81,6 +99,8 @@ def parse_components(version: str = "master"):
         )
         for domain in sorted(integrations):
             integration = integrations[domain]
+            if extra_deps := EXTRA_COMPONENT_DEPS.get(integration.domain):
+                integration.dependencies.extend(extra_deps)
             if not integration.disabled:
                 components[domain] = integration.manifest
 
@@ -167,8 +187,8 @@ def name_to_attr_path(req: str, packages: Dict[str, Dict[str, str]]) -> Optional
         return None
 
 
-def get_pkg_version(package: str, packages: Dict[str, Dict[str, str]]) -> Optional[str]:
-    pkg = packages.get(f"{PKG_SET}.{package}", None)
+def get_pkg_version(attr_path: str, packages: Dict[str, Dict[str, str]]) -> Optional[str]:
+    pkg = packages.get(attr_path, None)
     if not pkg:
         return None
     return pkg["version"]
@@ -191,18 +211,31 @@ def main() -> None:
             # Therefore, if there's a "#" in the line, only take the part after it
             req = req[req.find("#") + 1 :]
             name, required_version = req.split("==", maxsplit=1)
+            # Strip conditions off version constraints e.g. "1.0; python<3.11"
+            required_version = required_version.split(";").pop(0)
             # Split package name and extra requires
             extras = []
             if name.endswith("]"):
                 extras = name[name.find("[")+1:name.find("]")].split(",")
                 name = name[:name.find("[")]
             attr_path = name_to_attr_path(name, packages)
-            if our_version := get_pkg_version(name, packages):
-                if Version.parse(our_version) < Version.parse(required_version):
-                    outdated[name] = {
-                      'wanted': required_version,
-                      'current': our_version
-                    }
+            if attr_path:
+                if our_version := get_pkg_version(attr_path, packages):
+                    attr_name = attr_path.split(".")[-1]
+                    attr_outdated = False
+                    try:
+                        Version.parse(our_version)
+                    except InvalidVersion:
+                        print(f"Attribute {attr_name} has invalid version specifier {our_version}", file=sys.stderr)
+                        attr_outdated = True
+                    else:
+                        attr_outdated = Version.parse(our_version) < Version.parse(required_version)
+                    finally:
+                        if attr_outdated:
+                            outdated[attr_name] = {
+                              'wanted': required_version,
+                              'current': our_version
+                            }
             if attr_path is not None:
                 # Add attribute path without "python3Packages." prefix
                 pname = attr_path[len(PKG_SET + "."):]
@@ -267,5 +300,7 @@ def main() -> None:
 
 
 if __name__ == "__main__":
-    run_mypy()
+    run_sync(["pyright", __file__])
+    run_sync(["ruff", "--ignore=E501", __file__])
+    run_sync(["isort", __file__])
     main()
diff --git a/nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch b/nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch
index a72674ff7a5f..a4177a35f484 100644
--- a/nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch
+++ b/nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch
@@ -1,8 +1,8 @@
 diff --git a/homeassistant/components/ffmpeg/__init__.py b/homeassistant/components/ffmpeg/__init__.py
-index 74c826f47d..91f359da2a 100644
+index a98766c78c..1c47bb1f80 100644
 --- a/homeassistant/components/ffmpeg/__init__.py
 +++ b/homeassistant/components/ffmpeg/__init__.py
-@@ -40,7 +40,7 @@ CONF_FFMPEG_BIN = "ffmpeg_bin"
+@@ -41,7 +41,7 @@ CONF_FFMPEG_BIN = "ffmpeg_bin"
  CONF_EXTRA_ARGUMENTS = "extra_arguments"
  CONF_OUTPUT = "output"
  
@@ -12,7 +12,7 @@ index 74c826f47d..91f359da2a 100644
  CONFIG_SCHEMA = vol.Schema(
      {
 diff --git a/tests/components/ffmpeg/test_init.py b/tests/components/ffmpeg/test_init.py
-index e1730ffdab..e9cd7934fd 100644
+index 521ac732e5..ab8a56934f 100644
 --- a/tests/components/ffmpeg/test_init.py
 +++ b/tests/components/ffmpeg/test_init.py
 @@ -87,7 +87,7 @@ class TestFFmpegSetup:
diff --git a/nixpkgs/pkgs/servers/home-assistant/patches/wilight-import.patch b/nixpkgs/pkgs/servers/home-assistant/patches/wilight-import.patch
deleted file mode 100644
index 2d6626b97438..000000000000
--- a/nixpkgs/pkgs/servers/home-assistant/patches/wilight-import.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-diff --git a/homeassistant/components/wilight/__init__.py b/homeassistant/components/wilight/__init__.py
-index 2cdcf20c1e..37b034c9ae 100644
---- a/homeassistant/components/wilight/__init__.py
-+++ b/homeassistant/components/wilight/__init__.py
-@@ -2,7 +2,7 @@
- 
- from typing import Any
- 
--from pywilight.wilight_device import Device as PyWiLightDevice
-+from pywilight.wilight_device import PyWiLightDevice
- 
- from homeassistant.config_entries import ConfigEntry
- from homeassistant.const import Platform
-diff --git a/homeassistant/components/wilight/fan.py b/homeassistant/components/wilight/fan.py
-index c598e6db39..3d0c6d0ff3 100644
---- a/homeassistant/components/wilight/fan.py
-+++ b/homeassistant/components/wilight/fan.py
-@@ -13,7 +13,7 @@ from pywilight.const import (
-     WL_SPEED_LOW,
-     WL_SPEED_MEDIUM,
- )
--from pywilight.wilight_device import Device as PyWiLightDevice
-+from pywilight.wilight_device import PyWiLightDevice
- 
- from homeassistant.components.fan import DIRECTION_FORWARD, FanEntity, FanEntityFeature
- from homeassistant.config_entries import ConfigEntry
-diff --git a/homeassistant/components/wilight/light.py b/homeassistant/components/wilight/light.py
-index ea9e19dcb3..2509dc5073 100644
---- a/homeassistant/components/wilight/light.py
-+++ b/homeassistant/components/wilight/light.py
-@@ -4,7 +4,7 @@ from __future__ import annotations
- from typing import Any
- 
- from pywilight.const import ITEM_LIGHT, LIGHT_COLOR, LIGHT_DIMMER, LIGHT_ON_OFF
--from pywilight.wilight_device import Device as PyWiLightDevice
-+from pywilight.wilight_device import PyWiLightDevice
- 
- from homeassistant.components.light import (
-     ATTR_BRIGHTNESS,
-diff --git a/homeassistant/components/wilight/parent_device.py b/homeassistant/components/wilight/parent_device.py
-index 17a33fef63..8091e78cc7 100644
---- a/homeassistant/components/wilight/parent_device.py
-+++ b/homeassistant/components/wilight/parent_device.py
-@@ -5,7 +5,7 @@ import asyncio
- import logging
- 
- import pywilight
--from pywilight.wilight_device import Device as PyWiLightDevice
-+from pywilight.wilight_device import PyWiLightDevice
- import requests
- 
- from homeassistant.config_entries import ConfigEntry
diff --git a/nixpkgs/pkgs/servers/home-assistant/stubs.nix b/nixpkgs/pkgs/servers/home-assistant/stubs.nix
new file mode 100644
index 000000000000..90168a5a8698
--- /dev/null
+++ b/nixpkgs/pkgs/servers/home-assistant/stubs.nix
@@ -0,0 +1,49 @@
+{ lib
+, buildPythonPackage
+, fetchFromGitHub
+, poetry-core
+, home-assistant
+, python
+}:
+
+buildPythonPackage rec {
+  pname = "homeassistant-stubs";
+  version = "2023.6.0";
+  format = "pyproject";
+
+  disabled = python.version != home-assistant.python.version;
+
+  src = fetchFromGitHub {
+    owner = "KapJI";
+    repo = "homeassistant-stubs";
+    rev = "refs/tags/${version}";
+    hash = "sha256-efwrTHWc4m4biP7b39OU1GRifoKm49hEUTtIfrNGUeA=";
+  };
+
+  nativeBuildInputs = [
+    poetry-core
+    home-assistant
+  ];
+
+  postPatch = ''
+    # Relax constraint to year and month
+    substituteInPlace pyproject.toml --replace \
+      'homeassistant = "${version}"' \
+      'homeassistant = "~${lib.versions.majorMinor home-assistant.version}"'
+    cat pyproject.toml
+  '';
+
+  pythonImportsCheck = [
+    "homeassistant-stubs"
+  ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Typing stubs for Home Assistant Core";
+    homepage = "https://github.com/KapJI/homeassistant-stubs";
+    changelog = "https://github.com/KapJI/homeassistant-stubs/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = teams.home-assistant.members;
+  };
+}
diff --git a/nixpkgs/pkgs/servers/home-assistant/tests.nix b/nixpkgs/pkgs/servers/home-assistant/tests.nix
index 77bb02662bc4..91a902a8a2d7 100644
--- a/nixpkgs/pkgs/servers/home-assistant/tests.nix
+++ b/nixpkgs/pkgs/servers/home-assistant/tests.nix
@@ -7,18 +7,28 @@ let
   extraCheckInputs = with home-assistant.python.pkgs; {
     alexa = [ av ];
     bluetooth = [ pyswitchbot ];
+    bthome = [ xiaomi-ble ];
     camera = [ av ];
     cloud = [ mutagen ];
     config = [ pydispatcher ];
     generic = [ av ];
     google_translate = [ mutagen ];
+    google_sheets = [ oauth2client ];
+    govee_ble = [ ibeacon-ble ];
+    hassio = [ bellows zha-quirks zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp ];
+    homeassistant_sky_connect = [ bellows zha-quirks zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp zwave-js-server-python ];
     homeassistant_yellow = [ bellows zha-quirks zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp ];
-    lovelace = [ PyChromecast ];
+    lovelace = [ pychromecast ];
+    mopeka = [ pyswitchbot ];
     nest = [ av ];
     onboarding = [ pymetno radios rpi-bad-power ];
+    otbr = [ bellows zha-quirks zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp ];
     raspberry_pi = [ rpi-bad-power ];
+    shelly = [ pyswitchbot ];
+    tilt_ble = [ govee-ble ibeacon-ble ];
     tomorrowio = [ pyclimacell ];
     version = [ aioaseko ];
+    xiaomi_miio = [ arrow ];
     voicerss = [ mutagen ];
     yandextts = [ mutagen ];
     zha = [ pydeconz ];
@@ -26,63 +36,57 @@ let
   };
 
   extraDisabledTestPaths = {
-    tado = [
-      # tado/test_{climate,water_heater}.py: Tries to connect to my.tado.com
-      "tests/components/tado/test_climate.py"
-      "tests/components/tado/test_water_heater.py"
-    ];
   };
 
   extraDisabledTests = {
-    roku = [
-      # homeassistant.components.roku.media_player:media_player.py:428 Media type music is not supported with format None (mime: audio/x-matroska)
-      "test_services_play_media_audio"
-    ];
-    rfxtrx = [
-      # bytearrray mismatch
-      "test_rfy_cover"
+    vesync = [
+      # homeassistant.components.vesync:config_validation.py:863 The 'vesync' option has been removed, please remove it from your configuration
+      "test_async_get_config_entry_diagnostics__single_humidifier"
+      "test_async_get_device_diagnostics__single_fan"
     ];
   };
 
   extraPytestFlagsArray = {
-    asuswrt = [
-      # Sandbox network limitations, fails with unexpected error
-      "--deselect tests/components/asuswrt/test_config_flow.py::test_on_connect_failed"
+    dnsip = [
+      # Tries to resolve DNS entries
+      "--deselect tests/components/dnsip/test_config_flow.py::test_options_flow"
     ];
     history_stats = [
       # Flaky: AssertionError: assert '0.0' == '12.0'
       "--deselect tests/components/history_stats/test_sensor.py::test_end_time_with_microseconds_zeroed"
     ];
-    skybell = [
-      # Sandbox network limitations: Cannot connect to host cloud.myskybell.com:443
-      "--deselect tests/components/skybell/test_config_flow.py::test_flow_user_unknown_error"
+    modbus = [
+      # homeassistant.components.modbus.modbus:modbus.py:317 Pymodbus: modbusTest: Modbus Error: test connect exception
+      "--deselect tests/components/modbus/test_init.py::test_pymodbus_connect_fail"
+    ];
+    modem_callerid = [
+      # aioserial mock produces wrong state
+      "--deselect tests/components/modem_callerid/test_init.py::test_setup_entry"
     ];
-    stream = [
-      # Tries to write to /example and gets "Permission denied"
-      "--deselect tests/components/stream/test_recorder.py::test_record_lookback"
-      "--deselect tests/components/stream/test_recorder.py::test_recorder_log"
-      "--deselect tests/components/stream/test_worker.py::test_get_image"
+    unifiprotect = [
+      # "TypeError: object Mock can't be used in 'await' expression
+      "--deselect tests/components/unifiprotect/test_repairs.py::test_ea_warning_fix"
     ];
   };
 in lib.listToAttrs (map (component: lib.nameValuePair component (
   home-assistant.overridePythonAttrs (old: {
     pname = "homeassistant-test-${component}";
+    format = "other";
 
     dontBuild = true;
     dontInstall = true;
 
-    checkInputs = old.checkInputs
+    nativeCheckInputs = old.nativeCheckInputs
       ++ home-assistant.getPackages component home-assistant.python.pkgs
       ++ extraCheckInputs.${component} or [ ];
 
-    disabledTests = old.disabledTests ++ extraDisabledTests.${component} or [];
-    disabledTestPaths = old.disabledTestPaths ++ extraDisabledTestPaths.${component} or [ ];
+    disabledTests = old.disabledTests or [] ++ extraDisabledTests.${component} or [];
+    disabledTestPaths = old.disabledTestPaths or [] ++ extraDisabledTestPaths.${component} or [ ];
 
     # components are more often racy than the core
     dontUsePytestXdist = true;
 
     pytestFlagsArray = lib.remove "tests" old.pytestFlagsArray
-      ++ [ "--numprocesses=4" ]
       ++ extraPytestFlagsArray.${component} or [ ]
       ++ [ "tests/components/${component}" ];
 
@@ -92,10 +96,6 @@ in lib.listToAttrs (map (component: lib.nameValuePair component (
 
     meta = old.meta // {
       broken = lib.elem component [
-        "blebox" # all tests fail with: AttributeError: Mock object has no attribute 'async_from_host'
-        "dnsip"
-        "ssdp"
-        "subaru"
       ];
       # upstream only tests on Linux, so do we.
       platforms = lib.platforms.linux;
diff --git a/nixpkgs/pkgs/servers/home-assistant/update.py b/nixpkgs/pkgs/servers/home-assistant/update.py
new file mode 100755
index 000000000000..c914979e28bd
--- /dev/null
+++ b/nixpkgs/pkgs/servers/home-assistant/update.py
@@ -0,0 +1,263 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -I nixpkgs=channel:nixpkgs-unstable -i python3 -p "python3.withPackages (ps: with ps; [ aiohttp packaging ])" -p git nurl nodePackages.pyright ruff isort
+
+import asyncio
+import json
+import os
+import re
+import sys
+from subprocess import check_output, run
+from typing import Dict, Final, List, Optional, Union
+
+import aiohttp
+from aiohttp import ClientSession
+from packaging.version import Version
+
+ROOT: Final = check_output([
+    "git",
+    "rev-parse",
+    "--show-toplevel",
+]).decode().strip()
+
+
+def run_sync(cmd: List[str]) -> None:
+    print(f"$ {' '.join(cmd)}")
+    process = run(cmd)
+
+    if process.returncode != 0:
+        sys.exit(1)
+
+
+async def check_async(cmd: List[str]) -> str:
+    print(f"$ {' '.join(cmd)}")
+    process = await asyncio.create_subprocess_exec(
+        *cmd,
+        stdout=asyncio.subprocess.PIPE,
+        stderr=asyncio.subprocess.PIPE
+    )
+    stdout, stderr = await process.communicate()
+
+    if process.returncode != 0:
+        error = stderr.decode()
+        raise RuntimeError(f"{cmd[0]} failed: {error}")
+
+    return stdout.decode().strip()
+
+
+async def run_async(cmd: List[str]):
+    print(f"$ {' '.join(cmd)}")
+
+    process = await asyncio.create_subprocess_exec(
+        *cmd,
+        stdout=asyncio.subprocess.PIPE,
+        stderr=asyncio.subprocess.PIPE,
+    )
+    stdout, stderr = await process.communicate()
+
+    print(stdout.decode())
+
+    if process.returncode != 0:
+        error = stderr.decode()
+        raise RuntimeError(f"{cmd[0]} failed: {error}")
+
+
+class File:
+    def __init__(self, path: str):
+        self.path = os.path.join(ROOT, path)
+
+    def __enter__(self):
+        with open(self.path, "r") as handle:
+            self.text = handle.read()
+        return self
+
+    def get_exact_match(self, attr: str, value: str):
+        matches = re.findall(
+            rf'{re.escape(attr)}\s+=\s+\"?{re.escape(value)}\"?',
+            self.text
+        )
+
+        n = len(matches)
+        if n > 1:
+            raise ValueError(f"multiple occurrences found for {attr}={value}")
+        elif n == 1:
+            return matches.pop()
+        else:
+            raise ValueError(f"no occurrence found for {attr}={value}")
+
+    def substitute(self, attr: str, old_value: str, new_value: str) -> None:
+        old_line = self.get_exact_match(attr, old_value)
+        new_line = old_line.replace(old_value, new_value)
+        self.text = self.text.replace(old_line, new_line)
+        print(f"Substitute `{attr}` value `{old_value}` with `{new_value}`")
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        with open(self.path, "w") as handle:
+            handle.write(self.text)
+
+class Nurl:
+    @classmethod
+    async def prefetch(cls, url: str, version: str, *extra_args: str) -> str:
+        cmd = [
+            "nurl",
+            "--hash",
+            url,
+            version,
+        ]
+        cmd.extend(extra_args)
+        return await check_async(cmd)
+
+
+class Nix:
+    base_cmd: Final = [
+        "nix",
+        "--show-trace",
+        "--extra-experimental-features", "nix-command"
+    ]
+
+    @classmethod
+    async def _run(cls, args: List[str]) -> Optional[str]:
+        return await check_async(cls.base_cmd + args)
+
+    @classmethod
+    async def eval(cls, expr: str) -> Union[List, Dict, int, float, str, bool]:
+        response = await cls._run([
+            "eval",
+            "-f", f"{ROOT}/default.nix",
+            "--json",
+            expr
+        ])
+        if response is None:
+            raise RuntimeError("Nix eval expression returned no response")
+        try:
+            return json.loads(response)
+        except (TypeError, ValueError):
+            raise RuntimeError("Nix eval response could not be parsed from JSON")
+
+    @classmethod
+    async def hash_to_sri(cls, algorithm: str, value: str) -> Optional[str]:
+        return await cls._run([
+            "hash",
+            "to-sri",
+            "--type", algorithm,
+            value
+        ])
+
+
+class HomeAssistant:
+    def __init__(self, session: ClientSession):
+        self._session = session
+
+    async def get_latest_core_version(
+        self,
+        owner: str = "home-assistant",
+        repo: str = "core"
+    ) -> str:
+        async with self._session.get(
+            f"https://api.github.com/repos/{owner}/{repo}/releases/latest"
+        ) as response:
+            document = await response.json()
+        try:
+            return str(document.get("name"))
+        except KeyError:
+            raise RuntimeError("No tag name in response document")
+
+
+    async def get_latest_frontend_version(
+        self,
+        core_version: str
+    ) -> str:
+        async with self._session.get(
+            f"https://raw.githubusercontent.com/home-assistant/core/{core_version}/homeassistant/components/frontend/manifest.json"
+        ) as response:
+            document = await response.json(content_type="text/plain")
+
+        requirements = [
+            requirement
+            for requirement in document.get("requirements", [])
+            if requirement.startswith("home-assistant-frontend==")
+        ]
+
+        if len(requirements) > 1:
+            raise RuntimeError(
+                "Found more than one version specifier for the frontend package"
+            )
+        elif len(requirements) == 1:
+            requirement = requirements.pop()
+            _, version = requirement.split("==", maxsplit=1)
+            return str(version)
+        else:
+            raise RuntimeError(
+                "Found no version specifier for frontend package"
+            )
+
+
+    async def update_core(self, old_version: str, new_version: str) -> None:
+        old_sdist_hash = str(await Nix.eval("home-assistant.src.outputHash"))
+        new_sdist_hash = await Nurl.prefetch("https://pypi.org/project/homeassistant/", new_version)
+        print(f"sdist: {old_sdist_hash} -> {new_sdist_hash}")
+
+        old_git_hash = str(await Nix.eval("home-assistant.gitSrc.outputHash"))
+        new_git_hash = await Nurl.prefetch("https://github.com/home-assistant/core/", new_version)
+        print(f"git: {old_git_hash} -> {new_git_hash}")
+
+        with File("pkgs/servers/home-assistant/default.nix") as file:
+            file.substitute("hassVersion", old_version, new_version)
+            file.substitute("hash", old_sdist_hash, new_sdist_hash)
+            file.substitute("hash", old_git_hash, new_git_hash)
+
+    async def update_frontend(self, old_version: str, new_version: str) -> None:
+        old_hash = str(await Nix.eval("home-assistant.frontend.src.outputHash"))
+        new_hash = await Nurl.prefetch(
+            "https://pypi.org/project/home_assistant_frontend/",
+            new_version,
+            "-A", "format", "wheel",
+            "-A", "dist", "py3",
+            "-A", "python", "py3"
+        )
+        print(f"frontend: {old_hash} -> {new_hash}")
+
+        with File("pkgs/servers/home-assistant/frontend.nix") as file:
+            file.substitute("version", old_version, new_version)
+            file.substitute("hash", old_hash, new_hash)
+
+    async def update_components(self):
+        await run_async([
+            f"{ROOT}/pkgs/servers/home-assistant/parse-requirements.py"
+        ])
+
+
+async def main():
+    headers = {}
+    if token := os.environ.get("GITHUB_TOKEN", None):
+        headers.update({"GITHUB_TOKEN": token})
+
+    async with aiohttp.ClientSession(headers=headers) as client:
+        hass = HomeAssistant(client)
+
+        core_current = str(await Nix.eval("home-assistant.version"))
+        core_latest = await hass.get_latest_core_version()
+
+        if Version(core_latest) > Version(core_current):
+            print(f"New Home Assistant version {core_latest} is available")
+            await hass.update_core(str(core_current), str(core_latest))
+
+            frontend_current = str(await Nix.eval("home-assistant.frontend.version"))
+            frontend_latest = await hass.get_latest_frontend_version(str(core_latest))
+
+            if Version(frontend_latest) > Version(frontend_current):
+                await hass.update_frontend(str(frontend_current), str(frontend_latest))
+
+            await hass.update_components()
+
+        else:
+            print(f"Home Assistant {core_current} is still the latest version.")
+
+        # wait for async client sessions to close
+        # https://docs.aiohttp.org/en/stable/client_advanced.html#graceful-shutdown
+        await asyncio.sleep(0)
+
+if __name__ == "__main__":
+    run_sync(["pyright", __file__])
+    run_sync(["ruff", "--ignore=E501", __file__])
+    run_sync(["isort", __file__])
+    asyncio.run(main())
diff --git a/nixpkgs/pkgs/servers/home-assistant/update.sh b/nixpkgs/pkgs/servers/home-assistant/update.sh
deleted file mode 100755
index 05f2e93dfe46..000000000000
--- a/nixpkgs/pkgs/servers/home-assistant/update.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env nix-shell
-#!nix-shell -p nix -p jq -p curl -p bash -p git -p nix-update -i bash
-
-set -eux
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-cd "$DIR"
-
-CURRENT_VERSION=$(nix-instantiate ../../.. --eval --strict -A home-assistant.version | tr -d '"')
-TARGET_VERSION=$(curl https://api.github.com/repos/home-assistant/core/releases/latest | jq -r '.name')
-MANIFEST=$(curl https://raw.githubusercontent.com/home-assistant/core/${TARGET_VERSION}/homeassistant/components/frontend/manifest.json)
-FRONTEND_VERSION=$(echo $MANIFEST | jq -r '.requirements[] | select(startswith("home-assistant-frontend")) | sub(".*==(?<vers>.*)"; .vers)')
-
-if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" ]]; then
-    echo "home-assistant is up-to-date: ${CURRENT_VERSION}"
-    exit 0
-fi
-
-
-sed -i -e "s/version =.*/version = \"${TARGET_VERSION}\";/" \
-    component-packages.nix
-
-sed -i -e "s/hassVersion =.*/hassVersion = \"${TARGET_VERSION}\";/" \
-    default.nix
-
-(
-    # update the frontend before running parse-requirements, so it doesn't get shown as outdated
-    cd ../../..
-    nix-update --version "$FRONTEND_VERSION" home-assistant.python.pkgs.home-assistant-frontend
-)
-
-./parse-requirements.py
-
-read
-
-(
-    cd ../../..
-    nix-update --version "$TARGET_VERSION" --build home-assistant
-)
-
-#git add ./component-packages.nix ./default.nix ./frontend.nix
-#git commit -m "home-assistant: ${CURRENT_VERSION} -> ${TARGET_VERSION}"