diff options
author | Alyssa Ross <hi@alyssa.is> | 2023-06-16 06:56:35 +0000 |
---|---|---|
committer | Alyssa Ross <hi@alyssa.is> | 2023-06-16 06:56:35 +0000 |
commit | 99fcaeccb89621dd492203ce1f2d551c06f228ed (patch) | |
tree | 41cb730ae07383004789779b0f6e11cb3f4642a3 /nixpkgs/pkgs/servers/home-assistant | |
parent | 59c5f5ac8682acc13bb22bc29c7cf02f7d75f01f (diff) | |
parent | 75a5ebf473cd60148ba9aec0d219f72e5cf52519 (diff) | |
download | nixlib-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.nix | 20 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/cli.nix | 44 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/component-packages.nix | 1864 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/default.nix | 437 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/frontend.nix | 4 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/intents.nix | 72 | ||||
-rwxr-xr-x | nixpkgs/pkgs/servers/home-assistant/parse-requirements.py | 75 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/patches/ffmpeg-path.patch | 6 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/patches/wilight-import.patch | 52 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/stubs.nix | 49 | ||||
-rw-r--r-- | nixpkgs/pkgs/servers/home-assistant/tests.nix | 64 | ||||
-rwxr-xr-x | nixpkgs/pkgs/servers/home-assistant/update.py | 263 | ||||
-rwxr-xr-x | nixpkgs/pkgs/servers/home-assistant/update.sh | 42 |
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}" |