about summary refs log tree commit diff
path: root/pkgs/servers/home-assistant/custom-components
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers/home-assistant/custom-components')
-rw-r--r--pkgs/servers/home-assistant/custom-components/README.md2
-rw-r--r--pkgs/servers/home-assistant/custom-components/adaptive_lighting/default.nix4
-rw-r--r--pkgs/servers/home-assistant/custom-components/alarmo/default.nix31
-rw-r--r--pkgs/servers/home-assistant/custom-components/average/default.nix25
-rw-r--r--pkgs/servers/home-assistant/custom-components/awtrix/default.nix30
-rw-r--r--pkgs/servers/home-assistant/custom-components/better_thermostat/default.nix22
-rw-r--r--pkgs/servers/home-assistant/custom-components/bodymiscale/default.nix35
-rw-r--r--pkgs/servers/home-assistant/custom-components/default.nix38
-rw-r--r--pkgs/servers/home-assistant/custom-components/dwd/default.nix34
-rw-r--r--pkgs/servers/home-assistant/custom-components/elevenlabs_tts/default.nix26
-rw-r--r--pkgs/servers/home-assistant/custom-components/epex_spot/default.nix8
-rw-r--r--pkgs/servers/home-assistant/custom-components/frigate/default.nix19
-rw-r--r--pkgs/servers/home-assistant/custom-components/garmin_connect/default.nix35
-rw-r--r--pkgs/servers/home-assistant/custom-components/govee-lan/default.nix22
-rw-r--r--pkgs/servers/home-assistant/custom-components/homematicip_local/default.nix4
-rw-r--r--pkgs/servers/home-assistant/custom-components/indego/default.nix15
-rw-r--r--pkgs/servers/home-assistant/custom-components/localtuya/default.nix6
-rw-r--r--pkgs/servers/home-assistant/custom-components/mass/default.nix45
-rw-r--r--pkgs/servers/home-assistant/custom-components/midea_ac/default.nix31
-rw-r--r--pkgs/servers/home-assistant/custom-components/midea_ac_lan/default.nix25
-rw-r--r--pkgs/servers/home-assistant/custom-components/miele/default.nix2
-rw-r--r--pkgs/servers/home-assistant/custom-components/moonraker/default.nix4
-rw-r--r--pkgs/servers/home-assistant/custom-components/ntfy/default.nix30
-rw-r--r--pkgs/servers/home-assistant/custom-components/omnik_inverter/default.nix2
-rw-r--r--pkgs/servers/home-assistant/custom-components/prometheus_sensor/default.nix4
-rw-r--r--pkgs/servers/home-assistant/custom-components/samsungtv-smart/default.nix37
-rw-r--r--pkgs/servers/home-assistant/custom-components/smartir/default.nix24
-rw-r--r--pkgs/servers/home-assistant/custom-components/smartthinq-sensors/default.nix4
-rw-r--r--pkgs/servers/home-assistant/custom-components/solax_modbus/default.nix29
-rw-r--r--pkgs/servers/home-assistant/custom-components/solis-sensor/default.nix29
-rw-r--r--pkgs/servers/home-assistant/custom-components/somweb/default.nix29
-rw-r--r--pkgs/servers/home-assistant/custom-components/spook/default.nix38
-rw-r--r--pkgs/servers/home-assistant/custom-components/spook/remove-sub-integration-symlink-hack.patch109
-rw-r--r--pkgs/servers/home-assistant/custom-components/tuya_local/default.nix34
-rw-r--r--pkgs/servers/home-assistant/custom-components/volkswagen_we_connect_id/default.nix36
-rw-r--r--pkgs/servers/home-assistant/custom-components/volkswagencarnet/default.nix38
-rw-r--r--pkgs/servers/home-assistant/custom-components/waste_collection_schedule/default.nix17
-rw-r--r--pkgs/servers/home-assistant/custom-components/xiaomi_gateway3/default.nix22
-rw-r--r--pkgs/servers/home-assistant/custom-components/xiaomi_miot/default.nix26
-rw-r--r--pkgs/servers/home-assistant/custom-components/yassi/default.nix6
40 files changed, 881 insertions, 96 deletions
diff --git a/pkgs/servers/home-assistant/custom-components/README.md b/pkgs/servers/home-assistant/custom-components/README.md
index 6b942df8b9429..238c320ba2797 100644
--- a/pkgs/servers/home-assistant/custom-components/README.md
+++ b/pkgs/servers/home-assistant/custom-components/README.md
@@ -20,7 +20,7 @@ versions into the Python environment.
 
 ```nix
 { lib
-, buildHomeAssistantcomponent
+, buildHomeAssistantComponent
 , fetchFromGitHub
 }:
 
diff --git a/pkgs/servers/home-assistant/custom-components/adaptive_lighting/default.nix b/pkgs/servers/home-assistant/custom-components/adaptive_lighting/default.nix
index 1d2ae2228a5b2..9c35395d3e98e 100644
--- a/pkgs/servers/home-assistant/custom-components/adaptive_lighting/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/adaptive_lighting/default.nix
@@ -7,13 +7,13 @@
 buildHomeAssistantComponent rec {
   owner = "basnijholt";
   domain = "adaptive_lighting";
-  version = "1.19.1";
+  version = "1.22.0";
 
   src = fetchFromGitHub {
     owner = "basnijholt";
     repo = "adaptive-lighting";
     rev = "refs/tags/${version}";
-    hash = "sha256-AZsloE1vNQ9o2pg878J6I5qYXyI4fqYEvr18SrTocWo=";
+    hash = "sha256-k5pCgPM5xjVfWjOcr0UDFzYl/8z7yUwgYdBmC3+2F5k=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/servers/home-assistant/custom-components/alarmo/default.nix b/pkgs/servers/home-assistant/custom-components/alarmo/default.nix
new file mode 100644
index 0000000000000..ace6633a8c6ed
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/alarmo/default.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "nielsfaber";
+  domain = "alarmo";
+  version = "1.10.4";
+
+  postInstall = ''
+    cd $out/custom_components/alarmo/frontend
+    ls . | grep -v dist | xargs rm -rf
+  '';
+
+  src = fetchFromGitHub {
+    owner = "nielsfaber";
+    repo = "alarmo";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-/hNzGPckLHUX0mrBF3ugAXstrOc1mWdati+nRJCwldc=";
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/nielsfaber/alarmo/releases/tag/v${version}";
+    description = "Alarm System for Home Assistant";
+    homepage = "https://github.com/nielsfaber/alarmo";
+    maintainers = with maintainers; [ mindstorms6 ];
+    license = licenses.unfree;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/average/default.nix b/pkgs/servers/home-assistant/custom-components/average/default.nix
new file mode 100644
index 0000000000000..be381233a116c
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/average/default.nix
@@ -0,0 +1,25 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "Limych";
+  domain = "average";
+  version = "2.3.4";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "ha-average";
+    rev = version;
+    hash = "sha256-PfN2F1/ScVScXfh5jKQDZ6rK4XlqD9+YW8k4f4i3bk0=";
+  };
+
+  meta = with lib; {
+    description = "Average Sensor for Home Assistant";
+    homepage = "https://github.com/Limych/ha-average";
+    maintainers = with maintainers; [ matthiasbeyer ];
+    license = licenses.cc-by-nc-40;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/awtrix/default.nix b/pkgs/servers/home-assistant/custom-components/awtrix/default.nix
new file mode 100644
index 0000000000000..738dbbea5dbca
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/awtrix/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, buildHomeAssistantComponent
+, requests
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "10der";
+  domain = "awtrix";
+  version = "unstable-2024-05-26";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "homeassistant-custom_components-awtrix";
+    rev = "329d8eec28478574b9f34778f96b5768f30be2ab";
+    hash = "sha256-ucSaQWMS6ZwXHnw5Ct/STxpl1JjBRua3edrLvBAsdyw=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  meta = with lib; {
+    description = "Home-assistant integration for awtrix";
+    homepage = "https://github.com/10der/homeassistant-custom_components-awtrix";
+    maintainers = with maintainers; [ pinpox ];
+    license = licenses.mit;
+  };
+}
+
diff --git a/pkgs/servers/home-assistant/custom-components/better_thermostat/default.nix b/pkgs/servers/home-assistant/custom-components/better_thermostat/default.nix
index 5557e11761dfd..414449cabb38f 100644
--- a/pkgs/servers/home-assistant/custom-components/better_thermostat/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/better_thermostat/default.nix
@@ -1,24 +1,26 @@
-{ lib, fetchFromGitHub, buildHomeAssistantComponent }:
+{
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  lib,
+}:
 
 buildHomeAssistantComponent rec {
   owner = "KartoffelToby";
   domain = "better_thermostat";
-  version = "1.5.0";
+  version = "1.6.0";
 
   src = fetchFromGitHub {
     owner = "KartoffelToby";
     repo = "better_thermostat";
     rev = "refs/tags/${version}";
-    hash = "sha256-noo96Uks+MHtTbwIoU5gnekp/IwMry0U18X4I1qe4LQ=";
+    hash = "sha256-9iwrGKk3/m38ghDVGzKODWo9vzzZxJ91413/KWnULJU=";
   };
 
-  meta = with lib; {
-    changelog =
-      "https://github.com/KartoffelToby/better_thermostat/releases/tag/${version}";
-    description =
-      "Smart TRV control integrates room-temp sensors, window/door sensors, weather forecasts, and ambient probes for efficient heating and calibration, enhancing energy savings and comfort.";
+  meta = {
+    changelog = "https://github.com/KartoffelToby/better_thermostat/releases/tag/${version}";
+    description = "Smart TRV control integrates room-temp sensors, window/door sensors, weather forecasts, and ambient probes for efficient heating and calibration, enhancing energy savings and comfort";
     homepage = "https://better-thermostat.org/";
-    maintainers = with maintainers; [ mguentner ];
-    license = licenses.agpl3Only;
+    maintainers = with lib.maintainers; [ mguentner ];
+    license = lib.licenses.agpl3Only;
   };
 }
diff --git a/pkgs/servers/home-assistant/custom-components/bodymiscale/default.nix b/pkgs/servers/home-assistant/custom-components/bodymiscale/default.nix
new file mode 100644
index 0000000000000..e2b23891db94d
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/bodymiscale/default.nix
@@ -0,0 +1,35 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+
+  cachetools,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "dckiller51";
+  domain = "bodymiscale";
+  version = "2024.6.0";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = domain;
+    rev = version;
+    hash = "sha256-6bYKqU9yucISjTrmCUx1bNn9kqvT9jW1OBrqAa4ayEQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace custom_components/bodymiscale/manifest.json --replace-fail 'cachetools==5.3.0' 'cachetools>=5.3.0'
+  '';
+
+  propagatedBuildInputs = [
+    cachetools
+  ];
+
+  meta = {
+    description = "Home Assistant custom component providing body metrics for Xiaomi Mi Scale 1 and 2";
+    homepage = "https://github.com/dckiller51/bodymiscale";
+    license = with lib.licenses; [ asl20 ];
+    maintainers = with lib.maintainers; [ justinas ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/default.nix b/pkgs/servers/home-assistant/custom-components/default.nix
index acfcf038f20ef..55e9b7d39ff04 100644
--- a/pkgs/servers/home-assistant/custom-components/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/default.nix
@@ -4,16 +4,30 @@
 {
   adaptive_lighting = callPackage ./adaptive_lighting {};
 
+  alarmo = callPackage ./alarmo {};
+
   auth-header = callPackage ./auth-header {};
 
+  awtrix = callPackage ./awtrix {};
+
+  average = callPackage ./average {};
+
   better_thermostat = callPackage ./better_thermostat {};
 
+  bodymiscale = callPackage ./bodymiscale { };
+
+  dwd = callPackage ./dwd { };
+
+  elevenlabs_tts = callPackage ./elevenlabs_tts {};
+
   emporia_vue = callPackage ./emporia_vue {};
 
   epex_spot = callPackage ./epex_spot {};
 
   frigate = callPackage ./frigate {};
 
+  garmin_connect = callPackage ./garmin_connect {};
+
   govee-lan = callPackage ./govee-lan {};
 
   gpio = callPackage ./gpio {};
@@ -26,22 +40,46 @@
 
   localtuya = callPackage ./localtuya {};
 
+  mass = callPackage ./mass { };
+
+  midea_ac = callPackage ./midea_ac { };
+
+  midea_ac_lan = callPackage ./midea_ac_lan {};
+
   midea-air-appliances-lan = callPackage ./midea-air-appliances-lan {};
 
   miele = callPackage ./miele {};
 
   moonraker = callPackage ./moonraker {};
 
+  ntfy = callPackage ./ntfy {};
+
   omnik_inverter = callPackage ./omnik_inverter {};
 
   prometheus_sensor = callPackage ./prometheus_sensor {};
 
+  samsungtv-smart = callPackage ./samsungtv-smart {};
+
   sensi = callPackage ./sensi {};
 
   smartir = callPackage ./smartir {};
 
   smartthinq-sensors = callPackage ./smartthinq-sensors {};
 
+  solax_modbus = callPackage ./solax_modbus {};
+
+  solis-sensor = callPackage ./solis-sensor {};
+
+  somweb = callPackage ./somweb {};
+
+  spook = callPackage ./spook {};
+
+  tuya_local = callPackage ./tuya_local {};
+
+  volkswagen_we_connect_id = callPackage ./volkswagen_we_connect_id { };
+
+  volkswagencarnet = callPackage ./volkswagencarnet { };
+
   waste_collection_schedule = callPackage ./waste_collection_schedule {};
 
   xiaomi_gateway3 = callPackage ./xiaomi_gateway3 {};
diff --git a/pkgs/servers/home-assistant/custom-components/dwd/default.nix b/pkgs/servers/home-assistant/custom-components/dwd/default.nix
new file mode 100644
index 0000000000000..5d8cba11f2d78
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/dwd/default.nix
@@ -0,0 +1,34 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+  defusedxml,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "hg1337";
+  domain = "dwd";
+  version = "2024.9.0";
+
+  src = fetchFromGitHub {
+    owner = "hg1337";
+    repo = "homeassistant-dwd";
+    rev = version;
+    hash = "sha256-9zS6ufy7tYt1KwFeqdg0Az8xz3x5UzU9ZO9aOyWjdQE=";
+  };
+
+  dependencies = [ defusedxml ];
+
+  # defusedxml version mismatch
+  dontCheckManifest = true;
+
+  meta = with lib; {
+    description = "Custom component for Home Assistant that integrates weather data (measurements and forecasts) of Deutscher Wetterdienst";
+    homepage = "https://github.com/hg1337/homeassistant-dwd";
+    license = licenses.asl20;
+    maintainers = with maintainers; [
+      hexa
+      emilylange
+    ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/elevenlabs_tts/default.nix b/pkgs/servers/home-assistant/custom-components/elevenlabs_tts/default.nix
new file mode 100644
index 0000000000000..f69117f215476
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/elevenlabs_tts/default.nix
@@ -0,0 +1,26 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "carleeno";
+  domain = "elevenlabs_tts";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "carleeno";
+    repo = "elevenlabs_tts";
+    rev = "refs/tags/${version}";
+    hash = "sha256-7/Di3K7b0IzxatqBXqgVeMziRwalOVmIJ5IuEWJVjkE=";
+  };
+
+  meta = with lib; {
+    changelog = "https://github.com/carleeno/elevenlabs_tts/releases/tag/${version}";
+    description = "Home Assistant Eleven Labs TTS Integration";
+    homepage = "https://github.com/carleeno/elevenlabs_tts";
+    maintainers = with maintainers; [ mindstorms6 ];
+    license = licenses.asl20;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/epex_spot/default.nix b/pkgs/servers/home-assistant/custom-components/epex_spot/default.nix
index e655a0d788d9d..136c36010442d 100644
--- a/pkgs/servers/home-assistant/custom-components/epex_spot/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/epex_spot/default.nix
@@ -7,23 +7,19 @@
 buildHomeAssistantComponent rec {
   owner = "mampfes";
   domain = "epex_spot";
-  version = "2.3.5";
+  version = "2.3.8";
 
   src = fetchFromGitHub {
     owner = "mampfes";
     repo = "ha_epex_spot";
     rev = "refs/tags/${version}";
-    hash = "sha256-WmPsFfQm8ChEr41XVgKi2BGwta5aKH9GDz4iIfTAPK4=";
+    hash = "sha256-BwNDI2OMF6bXqFcdr0AJgj9Gb6Uz8BWOfE7M4jqzQJc=";
   };
 
   propagatedBuildInputs = [
     beautifulsoup4
   ];
 
-  postPatch = ''
-    substituteInPlace custom_components/epex_spot/manifest.json --replace-fail 'bs4' 'beautifulsoup4'
-  '';
-
   #skip phases without activity
   dontConfigure = true;
   doCheck = false;
diff --git a/pkgs/servers/home-assistant/custom-components/frigate/default.nix b/pkgs/servers/home-assistant/custom-components/frigate/default.nix
index 0065c94b6ebcf..e54cab3c6e4a1 100644
--- a/pkgs/servers/home-assistant/custom-components/frigate/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/frigate/default.nix
@@ -1,24 +1,23 @@
-{ lib
-, fetchFromGitHub
-, buildHomeAssistantComponent
-, pytz
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+  pytz,
 }:
 
 buildHomeAssistantComponent rec {
-  owner = "presto8";
+  owner = "blakeblackshear";
   domain = "frigate";
-  version = "5.1.0";
+  version = "5.3.0";
 
   src = fetchFromGitHub {
     owner = "blakeblackshear";
     repo = "frigate-hass-integration";
     rev = "v${version}";
-    hash = "sha256-6W9U0Q0wW36RsErvtFQo1sc1AF7js6MMHxgMQcDFexw=";
+    hash = "sha256-0eTEgRDgm4+Om2uqrt24Gj7dSdA6OJs/0oi5J5SHOyI=";
   };
 
-  propagatedBuildInputs = [
-    pytz
-  ];
+  dependencies = [ pytz ];
 
   dontBuild = true;
 
diff --git a/pkgs/servers/home-assistant/custom-components/garmin_connect/default.nix b/pkgs/servers/home-assistant/custom-components/garmin_connect/default.nix
new file mode 100644
index 0000000000000..1ad5adfbd3bce
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/garmin_connect/default.nix
@@ -0,0 +1,35 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  garminconnect,
+  tzlocal,
+}:
+
+buildHomeAssistantComponent {
+  owner = "cyberjunky";
+  domain = "garmin_connect";
+  version = "unstable-2024-08-31";
+
+  src = fetchFromGitHub {
+    owner = "cyberjunky";
+    repo = "home-assistant-garmin_connect";
+    rev = "d42edcabc67ba6a7f960e849c8aaec1aabef87c0";
+    hash = "sha256-KqbP6TpH9B0/AjtsW5TcWSNgUhND+w8rO6X8fHqtsDI=";
+  };
+
+  propagatedBuildInputs = [
+    garminconnect
+    tzlocal
+  ];
+
+  meta = with lib; {
+    description = "The Garmin Connect integration allows you to expose data from Garmin Connect to Home Assistant";
+    homepage = "https://github.com/cyberjunky/home-assistant-garmin_connect";
+    maintainers = with maintainers; [
+      matthiasbeyer
+      dmadisetti
+    ];
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/govee-lan/default.nix b/pkgs/servers/home-assistant/custom-components/govee-lan/default.nix
index 60c58bb85850d..6d66dc8fe357f 100644
--- a/pkgs/servers/home-assistant/custom-components/govee-lan/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/govee-lan/default.nix
@@ -1,7 +1,11 @@
 { lib
 , buildHomeAssistantComponent
 , fetchFromGitHub
+, fetchpatch2
 , govee-led-wez
+, pytest-cov-stub
+, pytest-homeassistant-custom-component
+, pytestCheckHook
 }:
 
 buildHomeAssistantComponent {
@@ -16,19 +20,27 @@ buildHomeAssistantComponent {
     hash = "sha256-ZhrxEPBEi+Z+2ZOAQ1amhO0tqvhM6tyFQgoRIVNDtXY=";
   };
 
+  patches = [
+    (fetchpatch2 {
+      url = "https://github.com/wez/govee-lan-hass/commit/b4cecac5ae00d95c49fcfe3bbfc405cbfc5dd84c.patch";
+      hash = "sha256-+MPO4kxxE1nZ/+sIY7v8WukHMrVowgMMBVfRDw2uv8o=";
+    })
+  ];
+
   dontBuild = true;
 
   propagatedBuildInputs = [
     govee-led-wez
   ];
 
-  # enable when pytest-homeassistant-custom-component is packaged
+  # AttributeError: 'async_generator' object has no attribute 'config'
   doCheck = false;
 
-  # nativeCheckInputs = [
-  #   pytest-homeassistant-custom-component
-  #   pytestCheckHook
-  # ];
+  nativeCheckInputs = [
+    pytest-cov-stub
+    pytest-homeassistant-custom-component
+    pytestCheckHook
+  ];
 
   meta = with lib; {
     description = "Control Govee lights via the LAN API from Home Assistant";
diff --git a/pkgs/servers/home-assistant/custom-components/homematicip_local/default.nix b/pkgs/servers/home-assistant/custom-components/homematicip_local/default.nix
index f6dcd994719b4..75778c6434c89 100644
--- a/pkgs/servers/home-assistant/custom-components/homematicip_local/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/homematicip_local/default.nix
@@ -7,13 +7,13 @@
 buildHomeAssistantComponent rec {
   owner = "danielperna84";
   domain = "homematicip_local";
-  version = "1.60.1";
+  version = "1.65.0";
 
   src = fetchFromGitHub {
     owner = "danielperna84";
     repo = "custom_homematic";
     rev = "refs/tags/${version}";
-    hash = "sha256-EJj9zmDdJ+T7yrANmRJuLRCSwvGLy2CkIBsO9H3LIs4=";
+    hash = "sha256-rUiesrVpGZMMo8JSboFTDE2oE0Q9hNYR4AvA/GR5+MY=";
   };
 
   dependencies = [
diff --git a/pkgs/servers/home-assistant/custom-components/indego/default.nix b/pkgs/servers/home-assistant/custom-components/indego/default.nix
index 657d8b80a862f..6f185dd718c58 100644
--- a/pkgs/servers/home-assistant/custom-components/indego/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/indego/default.nix
@@ -6,25 +6,24 @@
 }:
 
 buildHomeAssistantComponent rec {
-  owner = "jm-73";
+  owner = "sander1988";
   domain = "indego";
-  version = "5.5.0";
+  version = "5.7.4";
 
   src = fetchFromGitHub {
-    owner = "jm-73";
+    owner = "sander1988";
     repo = "Indego";
     rev = "refs/tags/${version}";
-    hash = "sha256-ur6KOqU6KAseABL0ibpGJ6109wSSZq9HWSVbMIrRSqc=";
+    hash = "sha256-SiYjducy0NP5bF3STVzhBdnJraNjHywHfD7OmAnYmr0=";
   };
 
   dependencies = [ pyindego ];
 
   meta = with lib; {
     description = "Bosch Indego lawn mower component";
-    changelog = "https://github.com/jm-73/Indego/releases/tag/${version}";
-    homepage = "https://github.com/jm-73/Indego";
-    # https://github.com/jm-73/pyIndego/issues/125
-    license = licenses.unfree;
+    changelog = "https://github.com/sander1988/Indego/releases/tag/${version}";
+    homepage = "https://github.com/sander1988/Indego";
+    license = licenses.asl20;
     maintainers = with maintainers; [ hexa ];
   };
 }
diff --git a/pkgs/servers/home-assistant/custom-components/localtuya/default.nix b/pkgs/servers/home-assistant/custom-components/localtuya/default.nix
index 3e3c17a33cdfa..8773f981e45f6 100644
--- a/pkgs/servers/home-assistant/custom-components/localtuya/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/localtuya/default.nix
@@ -6,18 +6,18 @@
 buildHomeAssistantComponent rec {
   owner = "rospogrigio";
   domain = "localtuya";
-  version = "5.2.1";
+  version = "5.2.2";
 
   src = fetchFromGitHub {
     owner = "rospogrigio";
     repo = "localtuya";
     rev = "v${version}";
-    hash = "sha256-hA/1FxH0wfM0jz9VqGCT95rXlrWjxV5oIkSiBf0G0ac=";
+    hash = "sha256-GexGUu4hevRDGF7gv7Jklr5YZJV+QH3kZN7p+eK9HlM=";
   };
 
   meta = with lib; {
     changelog = "https://github.com/rospogrigio/localtuya/releases/tag/${version}";
-    description = "A Home Assistant custom Integration for local handling of Tuya-based devices";
+    description = "Home Assistant custom Integration for local handling of Tuya-based devices";
     homepage = "https://github.com/rospogrigio/localtuya";
     maintainers = with maintainers; [ rhoriguchi ];
     license = licenses.gpl3Only;
diff --git a/pkgs/servers/home-assistant/custom-components/mass/default.nix b/pkgs/servers/home-assistant/custom-components/mass/default.nix
new file mode 100644
index 0000000000000..2e0d893d60560
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/mass/default.nix
@@ -0,0 +1,45 @@
+{ lib
+, buildHomeAssistantComponent
+, fetchFromGitHub
+, toPythonModule
+, async-timeout
+, music-assistant
+, pytestCheckHook
+, pytest-asyncio
+, pytest-cov-stub
+, pytest-homeassistant-custom-component
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "music-assistant";
+  domain = "mass";
+  version = "2024.8.1";
+
+  src = fetchFromGitHub {
+    owner = "music-assistant";
+    repo = "hass-music-assistant";
+    rev = version;
+    hash = "sha256-lrJx2wsVY0aJ+iVBxbZryC6QRvaXdxjBsTma/4ptl4o=";
+  };
+
+  dependencies = [
+    async-timeout
+    (toPythonModule music-assistant)
+  ];
+
+  dontCheckManifest = true; # expects music-assistant 2.0.6, we have 2.0.7
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    pytest-asyncio
+    pytest-cov-stub
+    pytest-homeassistant-custom-component
+  ];
+
+  meta = with lib; {
+    description = "Turn your Home Assistant instance into a jukebox, hassle free streaming of your favorite media to Home Assistant media players";
+    homepage = "https://github.com/music-assistant/hass-music-assistant";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/midea_ac/default.nix b/pkgs/servers/home-assistant/custom-components/midea_ac/default.nix
new file mode 100644
index 0000000000000..f188355099f9e
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/midea_ac/default.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  msmart-ng,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "mill1000";
+  domain = "midea_ac";
+  version = "2024.9.2";
+
+  src = fetchFromGitHub {
+    owner = "mill1000";
+    repo = "midea-ac-py";
+    rev = version;
+    hash = "sha256-PVR3yuyWMilmyOS341pS73c9ocOrFfJ9dwiKEYqCtM4=";
+  };
+
+  dependencies = [ msmart-ng ];
+
+  meta = with lib; {
+    description = "Home Assistant custom integration to control Midea (and associated brands) air conditioners via LAN";
+    homepage = "https://github.com/mill1000/midea-ac-py";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      hexa
+      emilylange
+    ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/midea_ac_lan/default.nix b/pkgs/servers/home-assistant/custom-components/midea_ac_lan/default.nix
new file mode 100644
index 0000000000000..7123389e8bc19
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/midea_ac_lan/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildHomeAssistantComponent
+, fetchFromGitHub
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "georgezhao2010";
+  domain = "midea_ac_lan";
+  version = "0.3.22";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = domain;
+    rev = "v${version}";
+    hash = "sha256-xTnbA4GztHOE61QObEJbzUSdbuSrhbcJ280DUDdM+n4=";
+  };
+
+  meta = with lib; {
+    description = "Auto-configure and then control your Midea M-Smart devices (Air conditioner, Fan, Water heater, Washer, etc) via local area network";
+    homepage = "https://github.com/georgezhao2010/midea_ac_lan/";
+    changelog = "https://github.com/georgezhao2010/midea_ac_lan/releases/tag/v${version}";
+    maintainers = with maintainers; [ k900 ];
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/miele/default.nix b/pkgs/servers/home-assistant/custom-components/miele/default.nix
index 3ebdc6283c035..408530620548d 100644
--- a/pkgs/servers/home-assistant/custom-components/miele/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/miele/default.nix
@@ -27,7 +27,7 @@ buildHomeAssistantComponent rec {
 
   meta = with lib; {
     changelog = "https://github.com/astrandb/miele/releases/tag/v${version}";
-    description = "A modern integration for Miele devices in Home Assistant";
+    description = "Modern integration for Miele devices in Home Assistant";
     homepage = "https://github.com/astrandb/miele";
     maintainers = with maintainers; [jamiemagee];
     license = licenses.mit;
diff --git a/pkgs/servers/home-assistant/custom-components/moonraker/default.nix b/pkgs/servers/home-assistant/custom-components/moonraker/default.nix
index efe0654d01cbe..e975b7515b0e2 100644
--- a/pkgs/servers/home-assistant/custom-components/moonraker/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/moonraker/default.nix
@@ -7,13 +7,13 @@
 buildHomeAssistantComponent rec {
   owner = "marcolivierarsenault";
   domain = "moonraker";
-  version = "1.2.0";
+  version = "1.3.5";
 
   src = fetchFromGitHub {
     owner = "marcolivierarsenault";
     repo = "moonraker-home-assistant";
     rev = "refs/tags/${version}";
-    hash = "sha256-oFHV9+5byWCOUxUhOvGHNilCZaoOp2xxb33nF8+CYjE=";
+    hash = "sha256-DufryUG4+tT77ErD6IzEkClnNJ4Rzz0ojkCZuZzhAlU=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/servers/home-assistant/custom-components/ntfy/default.nix b/pkgs/servers/home-assistant/custom-components/ntfy/default.nix
new file mode 100644
index 0000000000000..43920dbaef9e8
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/ntfy/default.nix
@@ -0,0 +1,30 @@
+{ lib
+, fetchFromGitHub
+, buildHomeAssistantComponent
+, requests
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "hbrennhaeuser";
+  domain = "ntfy";
+  version = "1.1.0-pre.2";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "homeassistant_integration_ntfy";
+    rev = "v${version}";
+    hash = "sha256-OGCAJsAsnUjwaLR8lCBdU+ghVOGFF0mT73t5JtcngUA=";
+  };
+
+  propagatedBuildInputs = [
+    requests
+  ];
+
+  meta = with lib; {
+    description = "Send notifications with ntfy.sh and selfhosted ntfy-servers";
+    homepage = "https://github.com/hbrennhaeuser/homeassistant_integration_ntfy";
+    maintainers = with maintainers; [ koral ];
+    license = licenses.gpl3;
+  };
+}
+
diff --git a/pkgs/servers/home-assistant/custom-components/omnik_inverter/default.nix b/pkgs/servers/home-assistant/custom-components/omnik_inverter/default.nix
index a0a33f644bac9..38dd56feb0000 100644
--- a/pkgs/servers/home-assistant/custom-components/omnik_inverter/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/omnik_inverter/default.nix
@@ -24,7 +24,7 @@ buildHomeAssistantComponent rec {
 
   meta = with lib; {
     changelog = "https://github.com/robbinjanssen/home-assistant-omnik-inverter/releases/tag/v${version}";
-    description = "The Omnik Inverter integration will scrape data from an Omnik inverter connected to your local network";
+    description = "Omnik Inverter integration will scrape data from an Omnik inverter connected to your local network";
     homepage = "https://github.com/robbinjanssen/home-assistant-omnik-inverter";
     maintainers = with maintainers; [ _9R ];
     license = licenses.mit;
diff --git a/pkgs/servers/home-assistant/custom-components/prometheus_sensor/default.nix b/pkgs/servers/home-assistant/custom-components/prometheus_sensor/default.nix
index 2368d85552b25..769e01bff5b2d 100644
--- a/pkgs/servers/home-assistant/custom-components/prometheus_sensor/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/prometheus_sensor/default.nix
@@ -6,13 +6,13 @@
 buildHomeAssistantComponent rec {
   owner = "mweinelt";
   domain = "prometheus_sensor";
-  version = "1.0.0";
+  version = "1.1.0";
 
   src = fetchFromGitHub {
     owner = "mweinelt";
     repo = "ha-prometheus-sensor";
     rev = "refs/tags/${version}";
-    hash = "sha256-10COLFXvmpm8ONLyx5c0yiQdtuP0SC2NKq/ZYHro9II=";
+    hash = "sha256-xfLAfTBgJjrRU1EFcbRvzUSq4m+dd6izaxP9DMisz/0=";
   };
 
   dontBuild = true;
diff --git a/pkgs/servers/home-assistant/custom-components/samsungtv-smart/default.nix b/pkgs/servers/home-assistant/custom-components/samsungtv-smart/default.nix
new file mode 100644
index 0000000000000..fea99dce2ef6c
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/samsungtv-smart/default.nix
@@ -0,0 +1,37 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+  aiofiles,
+  casttube,
+  websocket-client,
+  wakeonlan,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "ollo69";
+  domain = "samsungtv_smart";
+  version = "0.13.5";
+
+  src = fetchFromGitHub {
+    owner = "ollo69";
+    repo = "ha-samsungtv-smart";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-12wx8HaTEFQZOnxfcuAKFOXPdDpfAl608N1E6gmWqBI=";
+  };
+
+  dependencies = [
+    aiofiles
+    casttube
+    websocket-client
+    wakeonlan
+  ];
+
+  meta = with lib; {
+    changelog = "https://github.com/ollo69/ha-samsungtv-smart/releases/tag/v${version}";
+    description = "Home Assistant Samsung TV Integration";
+    homepage = "https://github.com/ollo69/ha-samsungtv-smart";
+    maintainers = with maintainers; [ mindstorms6 ];
+    license = licenses.asl20;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/smartir/default.nix b/pkgs/servers/home-assistant/custom-components/smartir/default.nix
index 5dc9eb2473d72..876579639b647 100644
--- a/pkgs/servers/home-assistant/custom-components/smartir/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/smartir/default.nix
@@ -1,8 +1,11 @@
-{ lib
-, buildHomeAssistantComponent
-, fetchFromGitHub
-, aiofiles
-, broadlink
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  fetchpatch,
+  aiofiles,
+  broadlink,
+  nix-update-script,
 }:
 
 buildHomeAssistantComponent rec {
@@ -17,6 +20,15 @@ buildHomeAssistantComponent rec {
     hash = "sha256-E6TM761cuaeQzlbjA+oZ+wt5HTJAfkF2J3i4P1Wbuic=";
   };
 
+  patches = [
+    # Replace distutils.version.StrictVersion with packaging.version.Version
+    # https://github.com/smartHomeHub/SmartIR/pull/1250
+    (fetchpatch {
+      url = "https://github.com/smartHomeHub/SmartIR/commit/1ed8ef23a8f7b9dcae75721eeab8d5f79013b851.patch";
+      hash = "sha256-IhdnTDtUa7mS+Vw/+BqfqWIKK4hbshbVgJNjfKjgAvI=";
+    })
+  ];
+
   propagatedBuildInputs = [
     aiofiles
     broadlink
@@ -28,6 +40,8 @@ buildHomeAssistantComponent rec {
     cp -r codes $out/custom_components/smartir/
   '';
 
+  passthru.updateScript = nix-update-script { };
+
   meta = with lib; {
     changelog = "https://github.com/smartHomeHub/SmartIR/releases/tag/v${version}";
     description = "Integration for Home Assistant to control climate, TV and fan devices via IR/RF controllers (Broadlink, Xiaomi, MQTT, LOOKin, ESPHome)";
diff --git a/pkgs/servers/home-assistant/custom-components/smartthinq-sensors/default.nix b/pkgs/servers/home-assistant/custom-components/smartthinq-sensors/default.nix
index 3ebb482939dcb..4e118bb3e24e9 100644
--- a/pkgs/servers/home-assistant/custom-components/smartthinq-sensors/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/smartthinq-sensors/default.nix
@@ -9,13 +9,13 @@
 buildHomeAssistantComponent rec {
   owner = "ollo69";
   domain = "smartthinq_sensors";
-  version = "0.39.0";
+  version = "0.39.2";
 
   src = fetchFromGitHub {
     inherit owner;
     repo = "ha-smartthinq-sensors";
     rev = "v${version}";
-    hash = "sha256-mt5/XHDAUeoMUA1jWdCNXTUgZBQkqabL5Y4MxwxcweY=";
+    hash = "sha256-tLq4sqeKmjEDDaowA8ouH/mI7jQfq49kkt/a8+40rhQ=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/servers/home-assistant/custom-components/solax_modbus/default.nix b/pkgs/servers/home-assistant/custom-components/solax_modbus/default.nix
new file mode 100644
index 0000000000000..8780ce2fa2565
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/solax_modbus/default.nix
@@ -0,0 +1,29 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  pymodbus,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "wills106";
+  domain = "solax_modbus";
+  version = "2024.09.5";
+
+  src = fetchFromGitHub {
+    owner = "wills106";
+    repo = "homeassistant-solax-modbus";
+    rev = "refs/tags/${version}";
+    hash = "sha256-mpsa+9LBnDfvMbOuEwctoPSg8IHRmkrFalVyg+1KR00=x";
+  };
+
+  dependencies = [ pymodbus ];
+
+  meta = {
+    changelog = "https://github.com/wills106/homeassistant-solax-modbus/releases/tag/${version}";
+    description = "SolaX Power Modbus custom_component for Home Assistant (Supports some Ginlong Solis, Growatt, Sofar Solar, TIGO TSI & Qcells Q.Volt Hyb)";
+    homepage = "https://github.com/wills106/homeassistant-solax-modbus";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ Luflosi ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/solis-sensor/default.nix b/pkgs/servers/home-assistant/custom-components/solis-sensor/default.nix
new file mode 100644
index 0000000000000..2a370fc9de114
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/solis-sensor/default.nix
@@ -0,0 +1,29 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+  aiofiles,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "hultenvp";
+  domain = "solis";
+  version = "3.7.0";
+
+  src = fetchFromGitHub {
+    owner = "hultenvp";
+    repo = "solis-sensor";
+    rev = "v${version}";
+    sha256 = "sha256-bKe8c+gQj9jvZKlqcbLiD6NhPDJVy/2mxRM8jjlOPnI=";
+  };
+
+  dependencies = [ aiofiles ];
+
+  meta = with lib; {
+    description = "Home Assistant integration for the SolisCloud PV Monitoring portal via SolisCloud API";
+    changelog = "https://github.com/hultenvp/solis-sensor/releases/tag/v${version}";
+    homepage = "https://github.com/hultenvp/solis-sensor";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jnsgruk ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/somweb/default.nix b/pkgs/servers/home-assistant/custom-components/somweb/default.nix
new file mode 100644
index 0000000000000..90b1661389142
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/somweb/default.nix
@@ -0,0 +1,29 @@
+{
+  lib,
+  fetchFromGitHub,
+  buildHomeAssistantComponent,
+  somweb,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "taarskog";
+  domain = "somweb";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "home-assistant-component-somweb";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-anOcpaGeblFVaP2EFVuxx1EuXnNgxy/QoYqvYJMv1Fo=";
+  };
+
+  dependencies = [ somweb ];
+
+  meta = with lib; {
+    changelog = "https://github.com/taarskog/home-assistant-component-somweb/releases/tag/v${version}";
+    description = "Custom component for Home Assistant to manage garage doors and gates by Sommer through SOMweb";
+    homepage = "https://github.com/taarskog/home-assistant-component-somweb";
+    maintainers = with maintainers; [ uvnikita ];
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/spook/default.nix b/pkgs/servers/home-assistant/custom-components/spook/default.nix
new file mode 100644
index 0000000000000..280f7b9491b2a
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/spook/default.nix
@@ -0,0 +1,38 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  pillow,
+  fnv-hash-fast,
+  psutil-home-assistant,
+  sqlalchemy,
+}:
+buildHomeAssistantComponent rec {
+  owner = "frenck";
+  domain = "spook";
+  version = "3.0.1";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = domain;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-ChHsevryWuim8BEFqXVkCOW9fGMrt5vol+B2SreMUws=";
+  };
+
+  patches = [./remove-sub-integration-symlink-hack.patch];
+
+  dependencies = [
+    pillow
+    fnv-hash-fast
+    psutil-home-assistant
+    sqlalchemy
+  ];
+
+  meta = {
+    changelog = "https://github.com/frenck/spook/releases/tag/v${version}";
+    description = "Toolbox for Home Assistant";
+    homepage = "https://spook.boo/";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [kkoniuszy];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/spook/remove-sub-integration-symlink-hack.patch b/pkgs/servers/home-assistant/custom-components/spook/remove-sub-integration-symlink-hack.patch
new file mode 100644
index 0000000000000..4756e4a2c389a
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/spook/remove-sub-integration-symlink-hack.patch
@@ -0,0 +1,109 @@
+diff --git a/custom_components/spook/__init__.py b/custom_components/spook/__init__.py
+index 213fb2c..c7dc299 100644
+--- a/custom_components/spook/__init__.py
++++ b/custom_components/spook/__init__.py
+@@ -23,8 +23,6 @@ from .templating import SpookTemplateFunctionManager
+ from .util import (
+     async_ensure_template_environments_exists,
+     async_forward_setup_entry,
+-    link_sub_integrations,
+-    unlink_sub_integrations,
+ )
+
+ if TYPE_CHECKING:
+@@ -34,48 +32,6 @@ if TYPE_CHECKING:
+
+ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
+     """Set up from a config entry."""
+-    # Symlink all sub integrations from Spook to the parent integrations folder
+-    # if one is missing, we have to restart Home Assistant.
+-    # This is a workaround for the fact that Home Assistant doesn't support
+-    # sub integrations.
+-    if await hass.async_add_executor_job(link_sub_integrations, hass):
+-        LOGGER.debug("Newly symlinked sub integrations, restarting Home Assistant")
+-
+-        @callback
+-        def _restart(_: Event | None = None) -> None:
+-            """Restart Home Assistant."""
+-            hass.data["homeassistant_stop"] = asyncio.create_task(
+-                hass.async_stop(RESTART_EXIT_CODE),
+-            )
+-
+-        # User asked to restart Home Assistant in the config flow.
+-        if hass.data.get(DOMAIN) == "Boo!":
+-            _restart()
+-            return False
+-
+-        # Should be OK to restart. Better to do it before anything else started.
+-        if hass.state == CoreState.starting:
+-            _restart()
+-            return False
+-
+-        # If all other fails, but we are not running yet... wait for it.
+-        if hass.state == CoreState.not_running:
+-            # Listen to both... just in case.
+-            hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, _restart)
+-            hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, _restart)
+-            return False
+-
+-        LOGGER.info(
+-            "Home Assistant needs to be restarted in for Spook to complete setting up",
+-        )
+-        ir.async_create_issue(
+-            hass=hass,
+-            domain=DOMAIN,
+-            issue_id="restart_required",
+-            is_fixable=True,
+-            severity=ir.IssueSeverity.WARNING,
+-            translation_key="restart_required",
+-        )
+
+     # Ensure template environments exists
+     async_ensure_template_environments_exists(hass)
+@@ -120,4 +76,3 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
+
+ async def async_remove_entry(hass: HomeAssistant, _: ConfigEntry) -> None:
+     """Remove a config entry."""
+-    await hass.async_add_executor_job(unlink_sub_integrations, hass)
+diff --git a/custom_components/spook/util.py b/custom_components/spook/util.py
+index 32e9bd2..845d463 100644
+--- a/custom_components/spook/util.py
++++ b/custom_components/spook/util.py
+@@ -104,37 +104,6 @@ async def async_forward_platform_entry_setups_to_ectoplasm(
+     )
+
+
+-def link_sub_integrations(hass: HomeAssistant) -> bool:
+-    """Link Spook sub integrations."""
+-    LOGGER.debug("Linking up Spook sub integrations")
+-
+-    changes = False
+-    for manifest in Path(__file__).parent.rglob("integrations/*/manifest.json"):
+-        LOGGER.debug("Linking Spook sub integration: %s", manifest.parent.name)
+-        dest = Path(hass.config.config_dir) / "custom_components" / manifest.parent.name
+-        if not dest.exists():
+-            src = (
+-                Path(hass.config.config_dir)
+-                / "custom_components"
+-                / DOMAIN
+-                / "integrations"
+-                / manifest.parent.name
+-            )
+-            dest.symlink_to(src)
+-            changes = True
+-    return changes
+-
+-
+-def unlink_sub_integrations(hass: HomeAssistant) -> None:
+-    """Unlink Spook sub integrations."""
+-    LOGGER.debug("Unlinking Spook sub integrations")
+-    for manifest in Path(__file__).parent.rglob("integrations/*/manifest.json"):
+-        LOGGER.debug("Unlinking Spook sub integration: %s", manifest.parent.name)
+-        dest = Path(hass.config.config_dir) / "custom_components" / manifest.parent.name
+-        if dest.exists():
+-            dest.unlink()
+-
+-
+ @callback
+ def async_ensure_template_environments_exists(hass: HomeAssistant) -> None:
+     """Ensure default template environments exist.
diff --git a/pkgs/servers/home-assistant/custom-components/tuya_local/default.nix b/pkgs/servers/home-assistant/custom-components/tuya_local/default.nix
new file mode 100644
index 0000000000000..a097dac5d6efe
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/tuya_local/default.nix
@@ -0,0 +1,34 @@
+{ lib
+, buildHomeAssistantComponent
+, fetchFromGitHub
+
+# dependencies
+, tinytuya
+, tuya-device-sharing-sdk
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "make-all";
+  domain = "tuya_local";
+  version = "2024.8.0";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "tuya-local";
+    rev = "refs/tags/${version}";
+    hash = "sha256-IHTWcNxmNXJk7SNnrLNFbaXJQSg6VYkAgAVmyt3JmRw=";
+  };
+
+  dependencies = [
+    tinytuya
+    tuya-device-sharing-sdk
+  ];
+
+  meta = with lib; {
+    description = "Local support for Tuya devices in Home Assistant";
+    homepage = "https://github.com/make-all/tuya-local";
+    changelog = "https://github.com/make-all/tuya-local/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ pathob ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/volkswagen_we_connect_id/default.nix b/pkgs/servers/home-assistant/custom-components/volkswagen_we_connect_id/default.nix
new file mode 100644
index 0000000000000..b87b8c7aa738e
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/volkswagen_we_connect_id/default.nix
@@ -0,0 +1,36 @@
+{
+  ascii-magic,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  lib,
+  weconnect,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "mitch-dc";
+  domain = "volkswagen_we-connect_id";
+  version = "0.2.0";
+
+  src = fetchFromGitHub {
+    inherit owner;
+    repo = "volkswagen_we_connect_id";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-Pmx1jXWXYta/kY51Ih1YRB+QeIfklVvBKcUYU5bHbsQ=";
+  };
+
+  dependencies = [
+    ascii-magic
+    weconnect
+  ];
+
+  # upstream has no tests
+  doCheck = false;
+
+  meta = {
+    changelog = "https://github.com/mitch-dc/volkswagen_we_connect_id/releases/tag/v${version}";
+    description = "Statistics from the Volkswagen ID API";
+    homepage = "https://github.com/mitch-dc/volkswagen_we_connect_id";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/volkswagencarnet/default.nix b/pkgs/servers/home-assistant/custom-components/volkswagencarnet/default.nix
new file mode 100644
index 0000000000000..d39c5f3481dce
--- /dev/null
+++ b/pkgs/servers/home-assistant/custom-components/volkswagencarnet/default.nix
@@ -0,0 +1,38 @@
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  volkswagencarnet,
+  pytest-homeassistant-custom-component,
+  pytestCheckHook,
+}:
+
+buildHomeAssistantComponent rec {
+  owner = "robinostlund";
+  domain = "volkswagencarnet";
+  version = "5.0.3";
+
+  src = fetchFromGitHub {
+    owner = "robinostlund";
+    repo = "homeassistant-volkswagencarnet";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-3wykS2TYjr9hoQSPc1F3m5aDiLW1tzvQfjfjnr4N2Y0=";
+  };
+
+  dependencies = [ volkswagencarnet ];
+
+  nativeCheckInputs = [
+    pytest-homeassistant-custom-component
+    pytestCheckHook
+  ];
+
+  # https://github.com/robinostlund/homeassistant-volkswagencarnet/issues/651
+  doCheck = false;
+
+  meta = {
+    description = "Volkswagen Connect component for Home Assistant";
+    homepage = "https://github.com/robinostlund/homeassistant-volkswagencarnet";
+    license = lib.licenses.gpl3Only;
+    maintainers = with lib.maintainers; [ dotlambda ];
+  };
+}
diff --git a/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/default.nix b/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/default.nix
index 513d593ce51d3..7e911c14f1d0c 100644
--- a/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/waste_collection_schedule/default.nix
@@ -1,39 +1,32 @@
 { lib
 , buildHomeAssistantComponent
 , fetchFromGitHub
-, fetchpatch
 , beautifulsoup4
 , icalendar
 , icalevents
 , lxml
+, pycryptodome
 , recurring-ical-events
 }:
 
 buildHomeAssistantComponent rec {
   owner = "mampfes";
   domain = "waste_collection_schedule";
-  version = "1.44.0";
+  version = "2.2.0";
 
   src = fetchFromGitHub {
     inherit owner;
     repo = "hacs_${domain}";
     rev = "refs/tags/${version}";
-    hash = "sha256-G1x7HtgdtK+IaPAfxT+7xsDJi5FnXN4Pg3q7T5Xr8lA=";
+    hash = "sha256-XzHShFM0H8F/erc/XiCMDotCfN/JJoO5SWX+O9Fqxkw=";
   };
 
-  patches = [
-    # Corrects a dependency on beautifulsoup4
-    (fetchpatch {
-      url = "https://github.com/mampfes/hacs_waste_collection_schedule/pull/1515.patch";
-      hash = "sha256-dvmicKTjolEcCrKRtZfpN0M/9RQCEQkFk+M6E+qCqfQ=";
-    })
-  ];
-
-  propagatedBuildInputs = [
+  dependencies = [
     beautifulsoup4
     icalendar
     icalevents
     lxml
+    pycryptodome
     recurring-ical-events
   ];
 
diff --git a/pkgs/servers/home-assistant/custom-components/xiaomi_gateway3/default.nix b/pkgs/servers/home-assistant/custom-components/xiaomi_gateway3/default.nix
index fd453e0d321c0..fc659ba68e471 100644
--- a/pkgs/servers/home-assistant/custom-components/xiaomi_gateway3/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/xiaomi_gateway3/default.nix
@@ -1,29 +1,31 @@
-{ lib
-, buildHomeAssistantComponent
-, fetchFromGitHub
-, zigpy
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  zigpy,
+  nix-update-script,
 }:
 
 buildHomeAssistantComponent rec {
   owner = "AlexxIT";
   domain = "xiaomi_gateway3";
-  version = "4.0.3";
+  version = "4.0.6";
 
   src = fetchFromGitHub {
     owner = "AlexxIT";
     repo = "XiaomiGateway3";
     rev = "v${version}";
-    hash = "sha256-YGaVQaz3A0yM8AIC02CvMKWMJ3tW3OADYgKY8ViIt5U=";
+    hash = "sha256-E3BekX0Xbp1R36+dYmOlsI2BTrdGjFsMoYYRIiBi1qU=";
   };
 
-  propagatedBuildInputs = [
-    zigpy
-  ];
+  propagatedBuildInputs = [ zigpy ];
 
   dontBuild = true;
 
+  passthru.updateScript = nix-update-script { };
+
   meta = with lib; {
-    changelog = "https://github.com/AlexxIT/XiaomiGateway3/releases/tag/v{version}";
+    changelog = "https://github.com/AlexxIT/XiaomiGateway3/releases/tag/v${version}";
     description = "Home Assistant custom component for control Xiaomi Multimode Gateway (aka Gateway 3), Xiaomi Multimode Gateway 2, Aqara Hub E1 on default firmwares over LAN";
     homepage = "https://github.com/AlexxIT/XiaomiGateway3";
     maintainers = with maintainers; [ azuwis ];
diff --git a/pkgs/servers/home-assistant/custom-components/xiaomi_miot/default.nix b/pkgs/servers/home-assistant/custom-components/xiaomi_miot/default.nix
index 0c64655d76df5..4dba1f70bdef3 100644
--- a/pkgs/servers/home-assistant/custom-components/xiaomi_miot/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/xiaomi_miot/default.nix
@@ -1,22 +1,24 @@
-{ lib
-, buildHomeAssistantComponent
-, fetchFromGitHub
-, hap-python
-, micloud
-, pyqrcode
-, python-miio
+{
+  lib,
+  buildHomeAssistantComponent,
+  fetchFromGitHub,
+  hap-python,
+  micloud,
+  pyqrcode,
+  python-miio,
+  nix-update-script,
 }:
 
 buildHomeAssistantComponent rec {
   owner = "al-one";
   domain = "xiaomi_miot";
-  version = "0.7.17";
+  version = "0.7.20";
 
   src = fetchFromGitHub {
     owner = "al-one";
     repo = "hass-xiaomi-miot";
     rev = "v${version}";
-    hash = "sha256-IpL4e2mKCdtNu8NtI+xpx4FPW/uj1M5Rk6DswXmSJBk=";
+    hash = "sha256-wR5N6a+g4TE9cRv1k4zExCWiui7ZHwK54j0oUxnhcR0=";
   };
 
   propagatedBuildInputs = [
@@ -28,9 +30,11 @@ buildHomeAssistantComponent rec {
 
   dontBuild = true;
 
+  passthru.updateScript = nix-update-script { };
+
   meta = with lib; {
-    changelog = "https://github.com/al-one/hass-xiaomi-miot/releases/tag/${version}";
-    description = "Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices.";
+    changelog = "https://github.com/al-one/hass-xiaomi-miot/releases/tag/v${version}";
+    description = "Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices";
     homepage = "https://github.com/al-one/hass-xiaomi-miot";
     maintainers = with maintainers; [ azuwis ];
     license = licenses.asl20;
diff --git a/pkgs/servers/home-assistant/custom-components/yassi/default.nix b/pkgs/servers/home-assistant/custom-components/yassi/default.nix
index 266d926b086b7..39d8cd5145b52 100644
--- a/pkgs/servers/home-assistant/custom-components/yassi/default.nix
+++ b/pkgs/servers/home-assistant/custom-components/yassi/default.nix
@@ -7,19 +7,19 @@
 buildHomeAssistantComponent rec {
   owner = "samuelspagl";
   domain = "samsung_soundbar";
-  version = "0.4.0b2";
+  version = "0.4.0";
 
   src = fetchFromGitHub {
     inherit owner;
     repo = "ha_samsung_soundbar";
     rev = version;
-    hash = "sha256-htAUCQe8mpk+GFwxXkPVnWS0m3mZd2hUt+f4qES+W4U=";
+    hash = "sha256-pkwkXI05zDMEXPoE90YJBxoPYlzmSHH/BLExq0J1JrQ=";
   };
 
   propagatedBuildInputs = [ pysmartthings ];
 
   meta = with lib; {
-    description = "A HomeAssistant integration for Samsung Soundbars";
+    description = "HomeAssistant integration for Samsung Soundbars";
     homepage = "https://ha-samsung-soundbar.vercel.app/";
     changelog = "https://github.com/samuelspagl/ha_samsung_soundbar/releases/tag/${version}";
     maintainers = with maintainers; [ k900 ];