From 3957a12e9d51489a11e64d4c5d64bfb263beac25 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 04:51:49 +0200 Subject: [PATCH 01/11] python3Packages.pygatt: split off GATTTOOL extra --- pkgs/development/python-modules/pygatt/default.nix | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/pygatt/default.nix b/pkgs/development/python-modules/pygatt/default.nix index 9d596e17236e..8d6f67a4c751 100644 --- a/pkgs/development/python-modules/pygatt/default.nix +++ b/pkgs/development/python-modules/pygatt/default.nix @@ -22,15 +22,19 @@ buildPythonPackage rec { }; propagatedBuildInputs = [ - pexpect pyserial ]; + passthru.extras-require.GATTTOOL = [ + pexpect + ]; + checkInputs = [ mock nose pytestCheckHook - ]; + ] + ++ passthru.extras-require.GATTTOOL; postPatch = '' # Not support for Python < 3.4 From 7e2881905c9c7af1e7a9f73fbebfc154370b9f5e Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 04:58:48 +0200 Subject: [PATCH 02/11] python3Packages.py3rijndael: init at 0.3.3 --- .../python-modules/py3rijndael/default.nix | 30 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 ++ 2 files changed, 32 insertions(+) create mode 100644 pkgs/development/python-modules/py3rijndael/default.nix diff --git a/pkgs/development/python-modules/py3rijndael/default.nix b/pkgs/development/python-modules/py3rijndael/default.nix new file mode 100644 index 000000000000..be098df6a6a8 --- /dev/null +++ b/pkgs/development/python-modules/py3rijndael/default.nix @@ -0,0 +1,30 @@ +{ lib +, buildPythonPackage +, fetchPypi +, pytestCheckHook +}: + +let + pname = "py3rijndael"; + version = "0.3.3"; +in +buildPythonPackage { + inherit pname version; + format = "setuptools"; + + src = fetchPypi { + inherit pname version; + hash = "sha256-tmVaPr/zoQVA6u0EnoeI7qOsk9a3GzpqwrACJLvs6ag="; + }; + + checkInputs = [ + pytestCheckHook + ]; + + meta = with lib; { + description = "Rijndael algorithm library"; + homepage = "https://github.com/meyt/py3rijndael"; + license = licenses.mit; + maintainers = with maintainers; [ hexa ]; + }; +} diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index b675f9355377..176f61539985 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -6679,6 +6679,8 @@ in { py3exiv2 = callPackage ../development/python-modules/py3exiv2 { }; + py3rijndael = callPackage ../development/python-modules/py3rijndael { }; + py3status = callPackage ../development/python-modules/py3status { }; py3to2 = callPackage ../development/python-modules/3to2 { }; From 7b12ac7d5813513c658770e2ca1d3d57662369f1 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:02:38 +0200 Subject: [PATCH 03/11] python3Packages.samsungtvws: enable tests, split off extras --- .../python-modules/samsungtvws/default.nix | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/pkgs/development/python-modules/samsungtvws/default.nix b/pkgs/development/python-modules/samsungtvws/default.nix index 05dc36947650..383841caffa4 100644 --- a/pkgs/development/python-modules/samsungtvws/default.nix +++ b/pkgs/development/python-modules/samsungtvws/default.nix @@ -1,29 +1,62 @@ -{ lib, buildPythonPackage, fetchPypi, isPy27 -, aiohttp +{ lib +, buildPythonPackage +, fetchFromGitHub +, isPy27 + +# propagates: , requests , websocket-client + +# extras: async +, aiohttp , websockets + +# extras: encrypted +, cryptography +, py3rijndael + +# tests +, aioresponses +, pytest-asyncio +, pytestCheckHook }: buildPythonPackage rec { pname = "samsungtvws"; version = "2.5.0"; + format = "setuptools"; disabled = isPy27; - src = fetchPypi { - inherit pname version; - sha256 = "sha256-AFCN1b80GZ24g3oWe1qqc72yWQy4+/sorL8zwOYM7vo="; + src = fetchFromGitHub { + owner = "xchwarze"; + repo = "samsung-tv-ws-api"; + rev = "v${version}"; + hash = "sha256-AimG5tyTRBETpivC2BwCuoR4o7y98YT6u5sogJlcmoo="; }; propagatedBuildInputs = [ - aiohttp requests websocket-client - websockets ]; - # no tests - doCheck = false; + passthru.extras-require = { + async = [ + aiohttp + websockets + ]; + encrypted = [ + cryptography + py3rijndael + ]; + }; + + checkInputs = [ + aioresponses + pytest-asyncio + pytestCheckHook + ] + ++ passthru.extras-require.async + ++ passthru.extras-require.encrypted; pythonImportsCheck = [ "samsungtvws" ]; From 7d4be895ad489fcabc68831eceecc645d5d626e0 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:08:10 +0200 Subject: [PATCH 04/11] python3Packages.samsungctl: split off websocket extra --- .../python-modules/samsungctl/default.nix | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pkgs/development/python-modules/samsungctl/default.nix b/pkgs/development/python-modules/samsungctl/default.nix index 174af9023512..f917c265973a 100644 --- a/pkgs/development/python-modules/samsungctl/default.nix +++ b/pkgs/development/python-modules/samsungctl/default.nix @@ -1,4 +1,8 @@ -{ lib, buildPythonPackage, fetchPypi +{ lib +, buildPythonPackage +, fetchPypi + +# extra: websocket , websocket-client }: @@ -11,9 +15,12 @@ buildPythonPackage rec { sha256 = "0ipz3fd65rqkxlb02sql0awc3vnslrwb2pfrsnpfnf8bfgxpbh9g"; }; - propagatedBuildInputs = [ - websocket-client - ]; + passthru.extras-require = { + websocket = [ + websocket-client + ]; + # interactive_ui requires curses package + }; # no tests doCheck = false; From e365a5bc06b466245b5d206f4e7ad6ff423de2c7 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:11:15 +0200 Subject: [PATCH 05/11] python3Packages.pytradfri: split off async extra --- .../python-modules/pytradfri/default.nix | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/pkgs/development/python-modules/pytradfri/default.nix b/pkgs/development/python-modules/pytradfri/default.nix index e1c74b084613..70f9acd0380f 100644 --- a/pkgs/development/python-modules/pytradfri/default.nix +++ b/pkgs/development/python-modules/pytradfri/default.nix @@ -21,14 +21,17 @@ buildPythonPackage rec { hash = "sha256-12ol+2CnoPfkxmDGJJAkoafHGpQuWC4lh0N7lSvx2DE="; }; - propagatedBuildInputs = [ - aiocoap - dtlssocket - ]; + passthru.extras-require = { + async = [ + aiocoap + dtlssocket + ]; + }; checkInputs = [ pytestCheckHook - ]; + ] + ++ passthru.extras-require.async; pythonImportsCheck = [ "pytradfri" From aa90072fc9ed83aa646a947ef3ca741beb11f702 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:15:13 +0200 Subject: [PATCH 06/11] python3Packages.adb-shell: split off extra requires --- .../python-modules/adb-shell/default.nix | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pkgs/development/python-modules/adb-shell/default.nix b/pkgs/development/python-modules/adb-shell/default.nix index 907cf155ea10..792729da1fac 100644 --- a/pkgs/development/python-modules/adb-shell/default.nix +++ b/pkgs/development/python-modules/adb-shell/default.nix @@ -28,18 +28,27 @@ buildPythonPackage rec { }; propagatedBuildInputs = [ - aiofiles cryptography - libusb1 pyasn1 rsa ]; + passthru.extras-require = { + async = [ + aiofiles + ]; + usb = [ + libusb1 + ]; + }; + checkInputs = [ mock pycryptodome pytestCheckHook - ]; + ] + ++ passthru.extras-require.async + ++ passthru.extras-require.usb; disabledTests = lib.optionals (pythonAtLeast "3.10") [ # Tests are failing with Python 3.10 From 83f634c4e4a39352465ada45c4c90b4f4ee28dbe Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:17:30 +0200 Subject: [PATCH 07/11] python3Packages.androidtv: split off extra requires --- .../development/python-modules/androidtv/default.nix | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/androidtv/default.nix b/pkgs/development/python-modules/androidtv/default.nix index 2ea8dc5bad5b..f116cef3dc75 100644 --- a/pkgs/development/python-modules/androidtv/default.nix +++ b/pkgs/development/python-modules/androidtv/default.nix @@ -25,14 +25,22 @@ buildPythonPackage rec { propagatedBuildInputs = [ adb-shell - aiofiles pure-python-adb ]; + passthru.extras-require = { + async = [ + aiofiles + ]; + inherit (adb-shell.extras-require) usb; + }; + checkInputs = [ mock pytestCheckHook - ]; + ] + ++ passthru.extras-require.async + ++ passthru.extras-require.usb; disabledTests = [ # Requires git but fails anyway From 139ba48b97da3e3dcbd7bc4bd946e89fb711ec83 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:22:48 +0200 Subject: [PATCH 08/11] python3Packages.pure-python-adb: split off async requirements --- .../pure-python-adb/default.nix | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/pkgs/development/python-modules/pure-python-adb/default.nix b/pkgs/development/python-modules/pure-python-adb/default.nix index c562f20e5ecb..d6e8bbdf6831 100644 --- a/pkgs/development/python-modules/pure-python-adb/default.nix +++ b/pkgs/development/python-modules/pure-python-adb/default.nix @@ -1,4 +1,10 @@ -{ aiofiles, buildPythonPackage, fetchPypi, lib, pythonOlder }: +{ aiofiles +, buildPythonPackage +, fetchPypi +, lib +, pythonOlder +, pytestCheckHook +}: buildPythonPackage rec { pname = "pure-python-adb"; @@ -11,11 +17,21 @@ buildPythonPackage rec { sha256 = "0kdr7w2fhgjpcf1k3l6an9im583iqkr6v8hb4q1zw30nh3bqkk0f"; }; - propagatedBuildInputs = [ aiofiles ]; - # Disable tests as they require docker, docker-compose and a dedicated - # android emulator - doCheck = false; - pythonImportsCheck = [ "ppadb.client" "ppadb.client_async" ]; + passthru.extras-require = { + async = [ + aiofiles + ]; + }; + + checkInputs = [ + pytestCheckHook + ] + ++ passthru.extras-require.async; + + pythonImportsCheck = [ + "ppadb.client" + "ppadb.client_async" + ]; meta = with lib; { description = "Pure python implementation of the adb client"; From 612a4ba51fb02e5e61d556bdfa67561c9e000600 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Mon, 11 Apr 2022 22:43:50 +0200 Subject: [PATCH 09/11] python310Packages.pure-python-adb: disable tests All tests result in RuntimeError. Make the pythonImportsCheck for the async parts conditional on doCheck, as checkInput only works when doCheck is true. --- pkgs/development/python-modules/pure-python-adb/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/development/python-modules/pure-python-adb/default.nix b/pkgs/development/python-modules/pure-python-adb/default.nix index d6e8bbdf6831..cb054feaf10f 100644 --- a/pkgs/development/python-modules/pure-python-adb/default.nix +++ b/pkgs/development/python-modules/pure-python-adb/default.nix @@ -23,6 +23,8 @@ buildPythonPackage rec { ]; }; + doCheck = pythonOlder "3.10"; # all tests result in RuntimeError on 3.10 + checkInputs = [ pytestCheckHook ] @@ -30,6 +32,7 @@ buildPythonPackage rec { pythonImportsCheck = [ "ppadb.client" + ] ++ lib.optionals doCheck [ "ppadb.client_async" ]; From ce697cdfa8776187760033cc3d46151c010d9991 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:24:06 +0200 Subject: [PATCH 10/11] home-assistant: allow requirements parser to deal with extras --- .../home-assistant/parse-requirements.py | 56 ++++++++++++++++--- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/pkgs/servers/home-assistant/parse-requirements.py b/pkgs/servers/home-assistant/parse-requirements.py index 0e3d5d5553e7..c9fc53401ef4 100755 --- a/pkgs/servers/home-assistant/parse-requirements.py +++ b/pkgs/servers/home-assistant/parse-requirements.py @@ -98,13 +98,37 @@ def get_reqs(components: Dict[str, Dict[str, Any]], component: str, processed: S return requirements +def repository_root() -> str: + return os.path.abspath(sys.argv[0] + "/../../../..") + + +# For a package attribute and and an extra, check if the package exposes it via passthru.extras-require +def has_extra(package: str, extra: str): + cmd = [ + "nix-instantiate", + repository_root(), + "-A", + f"{package}.extras-require.{extra}", + ] + try: + subprocess.run( + cmd, + check=True, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + except subprocess.CalledProcessError: + return False + return True + + def dump_packages() -> Dict[str, Dict[str, str]]: # Store a JSON dump of Nixpkgs' python3Packages output = subprocess.check_output( [ "nix-env", "-f", - os.path.dirname(sys.argv[0]) + "/../../..", + repository_root(), "-qa", "-A", PKG_SET, @@ -158,6 +182,7 @@ def main() -> None: outdated = {} for component in sorted(components.keys()): attr_paths = [] + extra_attrs = [] missing_reqs = [] reqs = sorted(get_reqs(components, component, set())) for req in reqs: @@ -165,9 +190,10 @@ 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) - # Remove extra_require from name, e.g. samsungctl instead of - # samsungctl[websocket] + # 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): @@ -178,11 +204,20 @@ def main() -> None: } if attr_path is not None: # Add attribute path without "python3Packages." prefix - attr_paths.append(attr_path[len(PKG_SET + ".") :]) + pname = attr_path[len(PKG_SET + "."):] + attr_paths.append(pname) + for extra in extras: + # Check if package advertises extra requirements + extra_attr = f"{pname}.extras-require.{extra}" + if has_extra(attr_path, extra): + extra_attrs.append(extra_attr) + else: + missing_reqs.append(extra_attr) + else: missing_reqs.append(name) else: - build_inputs[component] = (attr_paths, missing_reqs) + build_inputs[component] = (attr_paths, extra_attrs, missing_reqs) with open(os.path.dirname(sys.argv[0]) + "/component-packages.nix", "w") as f: f.write("# Generated by parse-requirements.py\n") @@ -191,11 +226,14 @@ def main() -> None: f.write(f' version = "{version}";\n') f.write(" components = {\n") for component, deps in build_inputs.items(): - available, missing = deps + available, extras, missing = deps f.write(f' "{component}" = ps: with ps; [') if available: - f.write(" " + " ".join(available)) - f.write(" ];") + f.write("\n " + "\n ".join(available)) + f.write("\n ]") + if extras: + f.write("\n ++ " + "\n ++ ".join(extras)) + f.write(";") if len(missing) > 0: f.write(f" # missing inputs: {' '.join(missing)}") f.write("\n") @@ -203,7 +241,7 @@ def main() -> None: f.write(" # components listed in tests/components for which all dependencies are packaged\n") f.write(" supportedComponentsWithTests = [\n") for component, deps in build_inputs.items(): - available, missing = deps + available, extras, missing = deps if len(missing) == 0 and component in components_with_tests: f.write(f' "{component}"' + "\n") f.write(" ];\n") From 3966e8d69d6817b5a327d0f26a1f6666b6b25868 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 7 Apr 2022 05:24:11 +0200 Subject: [PATCH 11/11] home-assistant: update component packages --- .../home-assistant/component-packages.nix | 4119 +++++++++++++---- 1 file changed, 3107 insertions(+), 1012 deletions(-) diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix index d28507247eec..20218f4f256d 100644 --- a/pkgs/servers/home-assistant/component-packages.nix +++ b/pkgs/servers/home-assistant/component-packages.nix @@ -4,1018 +4,3113 @@ { version = "2022.4.0"; components = { - "abode" = ps: with ps; [ abodepy ]; - "accuweather" = ps: with ps; [ accuweather ]; - "acer_projector" = ps: with ps; [ pyserial ]; - "acmeda" = ps: with ps; [ aiopulse ]; - "actiontec" = ps: with ps; [ ]; - "adax" = ps: with ps; [ adax-local adax ]; - "adguard" = ps: with ps; [ adguardhome ]; - "ads" = ps: with ps; [ pyads ]; - "advantage_air" = ps: with ps; [ advantage-air ]; - "aemet" = ps: with ps; [ aemet-opendata ]; - "aftership" = ps: with ps; [ pyaftership ]; - "agent_dvr" = ps: with ps; [ agent-py ]; - "air_quality" = ps: with ps; [ ]; - "airly" = ps: with ps; [ airly ]; - "airnow" = ps: with ps; [ pyairnow ]; - "airthings" = ps: with ps; [ airthings-cloud ]; - "airtouch4" = ps: with ps; [ airtouch4pyapi ]; - "airvisual" = ps: with ps; [ pyairvisual ]; - "airzone" = ps: with ps; [ aioairzone ]; - "aladdin_connect" = ps: with ps; [ aladdin-connect ]; - "alarm_control_panel" = ps: with ps; [ ]; - "alarmdecoder" = ps: with ps; [ adext ]; - "alert" = ps: with ps; [ ]; - "alexa" = ps: with ps; [ 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; [ ambee ]; - "amberelectric" = ps: with ps; [ amberelectric ]; - "ambiclimate" = ps: with ps; [ aiohttp-cors ambiclimate ]; - "ambient_station" = ps: with ps; [ aioambient ]; - "amcrest" = ps: with ps; [ amcrest ha-ffmpeg ]; - "ampio" = ps: with ps; [ asmog ]; - "analytics" = ps: with ps; [ aiohttp-cors fnvhash lru-dict sqlalchemy ]; - "android_ip_webcam" = ps: with ps; [ pydroid-ipcam ]; - "androidtv" = ps: with ps; [ adb-shell androidtv pure-python-adb ]; - "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant - "anthemav" = ps: with ps; [ ]; # missing inputs: anthemav - "apache_kafka" = ps: with ps; [ aiokafka ]; - "apcupsd" = ps: with ps; [ apcaccess ]; - "api" = ps: with ps; [ aiohttp-cors ]; - "apple_tv" = ps: with ps; [ aiohttp-cors ifaddr pyatv zeroconf ]; - "apprise" = ps: with ps; [ apprise ]; - "aprs" = ps: with ps; [ aprslib geopy ]; - "aqualogic" = ps: with ps; [ aqualogic ]; - "aquostv" = ps: with ps; [ ]; # missing inputs: sharp_aquos_rc - "arcam_fmj" = ps: with ps; [ arcam-fmj ]; - "arest" = ps: with ps; [ ]; - "arlo" = ps: with ps; [ ha-ffmpeg pyarlo ]; - "arris_tg2492lg" = ps: with ps; [ ]; # missing inputs: arris-tg2492lg - "aruba" = ps: with ps; [ pexpect ]; - "arwn" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "aseko_pool_live" = ps: with ps; [ aioaseko ]; - "asterisk_cdr" = ps: with ps; [ asterisk-mbox ]; - "asterisk_mbox" = ps: with ps; [ asterisk-mbox ]; - "asuswrt" = ps: with ps; [ aioasuswrt ]; - "atag" = ps: with ps; [ pyatag ]; - "aten_pe" = ps: with ps; [ atenpdu ]; - "atome" = ps: with ps; [ pyatome ]; - "august" = ps: with ps; [ yalexs ]; - "aurora" = ps: with ps; [ auroranoaa ]; - "aurora_abb_powerone" = ps: with ps; [ aurorapy ]; - "aussie_broadband" = ps: with ps; [ pyaussiebb ]; - "auth" = ps: with ps; [ aiohttp-cors ]; - "automation" = ps: with ps; [ aiohttp-cors ]; - "avea" = ps: with ps; [ avea ]; - "avion" = ps: with ps; [ avion ]; - "awair" = ps: with ps; [ python-awair ]; - "aws" = ps: with ps; [ aiobotocore ]; - "axis" = ps: with ps; [ aiohttp-cors axis paho-mqtt ]; - "azure_devops" = ps: with ps; [ aioazuredevops ]; - "azure_event_hub" = ps: with ps; [ azure-eventhub ]; - "azure_service_bus" = ps: with ps; [ azure-servicebus ]; - "backup" = ps: with ps; [ aiohttp-cors ]; # missing inputs: securetar - "baidu" = ps: with ps; [ ]; # missing inputs: baidu-aip - "balboa" = ps: with ps; [ pybalboa ]; - "bayesian" = ps: with ps; [ ]; - "bbox" = ps: with ps; [ ]; # missing inputs: pybbox - "beewi_smartclim" = ps: with ps; [ ]; # missing inputs: beewi_smartclim - "binary_sensor" = ps: with ps; [ ]; - "bitcoin" = ps: with ps; [ blockchain ]; - "bizkaibus" = ps: with ps; [ bizkaibus ]; - "blackbird" = ps: with ps; [ pyblackbird ]; - "blebox" = ps: with ps; [ blebox-uniapi ]; - "blink" = ps: with ps; [ blinkpy ]; - "blinksticklight" = ps: with ps; [ BlinkStick ]; - "blockchain" = ps: with ps; [ ]; # missing inputs: python-blockchain-api - "bloomsky" = ps: with ps; [ ]; - "blueprint" = ps: with ps; [ ]; - "bluesound" = ps: with ps; [ xmltodict ]; - "bluetooth_le_tracker" = ps: with ps; [ pygatt ]; - "bluetooth_tracker" = ps: with ps; [ bt-proximity pybluez ]; - "bmw_connected_drive" = ps: with ps; [ bimmer-connected ]; - "bond" = ps: with ps; [ bond-api ]; - "bosch_shc" = ps: with ps; [ aiohttp-cors boschshcpy ifaddr zeroconf ]; - "braviatv" = ps: with ps; [ bravia-tv ]; - "broadlink" = ps: with ps; [ broadlink ]; - "brother" = ps: with ps; [ brother ]; - "brottsplatskartan" = ps: with ps; [ brottsplatskartan ]; - "browser" = ps: with ps; [ ]; - "brunt" = ps: with ps; [ ]; # missing inputs: brunt - "bsblan" = ps: with ps; [ bsblan ]; - "bt_home_hub_5" = ps: with ps; [ ]; # missing inputs: bthomehub5-devicelist - "bt_smarthub" = ps: with ps; [ ]; # missing inputs: btsmarthub_devicelist - "buienradar" = ps: with ps; [ buienradar ]; - "button" = ps: with ps; [ ]; - "caldav" = ps: with ps; [ caldav ]; - "calendar" = ps: with ps; [ aiohttp-cors ]; - "camera" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "canary" = ps: with ps; [ ha-ffmpeg py-canary ]; - "cast" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa ifaddr mutagen plexapi plexauth plexwebsocket PyChromecast zeroconf ]; - "cert_expiry" = ps: with ps; [ ]; - "channels" = ps: with ps; [ pychannels ]; - "circuit" = ps: with ps; [ circuit-webhook ]; - "cisco_ios" = ps: with ps; [ pexpect ]; - "cisco_mobility_express" = ps: with ps; [ ciscomobilityexpress ]; - "cisco_webex_teams" = ps: with ps; [ webexteamssdk ]; - "citybikes" = ps: with ps; [ ]; - "clementine" = ps: with ps; [ ]; # missing inputs: python-clementine-remote - "clickatell" = ps: with ps; [ ]; - "clicksend" = ps: with ps; [ ]; - "clicksend_tts" = ps: with ps; [ ]; - "climacell" = ps: with ps; [ pyclimacell ]; # missing inputs: pytomorrowio - "climate" = ps: with ps; [ ]; - "cloud" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa ]; - "cloudflare" = ps: with ps; [ pycfdns ]; - "cmus" = ps: with ps; [ ]; # missing inputs: pycmus - "co2signal" = ps: with ps; [ co2signal ]; - "coinbase" = ps: with ps; [ ]; # missing inputs: coinbase - "color_extractor" = ps: with ps; [ colorthief ]; - "comed_hourly_pricing" = ps: with ps; [ ]; - "comfoconnect" = ps: with ps; [ pycomfoconnect ]; - "command_line" = ps: with ps; [ ]; - "compensation" = ps: with ps; [ numpy ]; - "concord232" = ps: with ps; [ ]; # missing inputs: concord232 - "config" = ps: with ps; [ aiohttp-cors ]; - "configurator" = ps: with ps; [ ]; - "control4" = ps: with ps; [ pycontrol4 ]; - "conversation" = ps: with ps; [ aiohttp-cors ]; - "coolmaster" = ps: with ps; [ pycoolmasternet-async ]; - "coronavirus" = ps: with ps; [ coronavirus ]; - "counter" = ps: with ps; [ ]; - "cover" = ps: with ps; [ ]; - "cppm_tracker" = ps: with ps; [ ]; # missing inputs: clearpasspy - "cpuspeed" = ps: with ps; [ py-cpuinfo ]; - "crownstone" = ps: with ps; [ aiohttp-cors crownstone-cloud crownstone-sse crownstone-uart pyserial pyudev ]; - "cups" = ps: with ps; [ pycups ]; - "currencylayer" = 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 ]; - "ddwrt" = ps: with ps; [ ]; - "debugpy" = ps: with ps; [ debugpy ]; - "deconz" = ps: with ps; [ pydeconz ]; - "decora" = ps: with ps; [ bluepy ]; # missing inputs: decora - "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi - "default_config" = ps: with ps; [ pynacl pyturbojpeg aiodiscover aiohttp-cors async-upnp-client fnvhash hass-nabucasa home-assistant-frontend ifaddr lru-dict pillow pyserial pyudev scapy sqlalchemy zeroconf ]; - "delijn" = ps: with ps; [ pydelijn ]; - "deluge" = ps: with ps; [ deluge-client ]; - "demo" = ps: with ps; [ aiohttp-cors fnvhash lru-dict sqlalchemy ]; - "denon" = ps: with ps; [ ]; - "denonavr" = ps: with ps; [ denonavr ]; - "derivative" = ps: with ps; [ ]; - "deutsche_bahn" = ps: with ps; [ schiene ]; - "device_automation" = ps: with ps; [ ]; - "device_sun_light_trigger" = ps: with ps; [ aiohttp-cors pillow ]; - "device_tracker" = ps: with ps; [ ]; - "devolo_home_control" = ps: with ps; [ aiohttp-cors devolo-home-control-api ifaddr zeroconf ]; - "devolo_home_network" = ps: with ps; [ devolo-plc-api ]; - "dexcom" = ps: with ps; [ pydexcom ]; - "dhcp" = ps: with ps; [ aiodiscover scapy ]; - "diagnostics" = ps: with ps; [ aiohttp-cors ]; - "dialogflow" = ps: with ps; [ aiohttp-cors ]; - "digital_ocean" = ps: with ps; [ digital-ocean ]; - "digitalloggers" = ps: with ps; [ ]; # missing inputs: dlipower - "directv" = ps: with ps; [ directv ]; - "discogs" = ps: with ps; [ discogs-client ]; - "discord" = ps: with ps; [ nextcord ]; - "discovery" = ps: with ps; [ aiohttp-cors ifaddr netdisco zeroconf ]; - "dlib_face_detect" = ps: with ps; [ face_recognition ]; - "dlib_face_identify" = ps: with ps; [ face_recognition ]; - "dlink" = ps: with ps; [ ]; # missing inputs: pyW215 - "dlna_dmr" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr zeroconf ]; - "dlna_dms" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr zeroconf ]; - "dnsip" = ps: with ps; [ aiodns ]; - "dominos" = ps: with ps; [ aiohttp-cors ]; # missing inputs: pizzapi - "doods" = ps: with ps; [ pillow pydoods ]; - "doorbird" = ps: with ps; [ aiohttp-cors doorbirdpy ]; - "dovado" = ps: with ps; [ ]; # missing inputs: dovado - "downloader" = ps: with ps; [ ]; - "dsmr" = ps: with ps; [ dsmr-parser ]; - "dsmr_reader" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "dte_energy_bridge" = ps: with ps; [ ]; - "dublin_bus_transport" = ps: with ps; [ ]; - "duckdns" = ps: with ps; [ ]; - "dunehd" = ps: with ps; [ pdunehd ]; - "dwd_weather_warnings" = ps: with ps; [ dwdwfsapi ]; - "dweet" = ps: with ps; [ ]; # missing inputs: dweepy - "dynalite" = ps: with ps; [ dynalite-devices ]; - "eafm" = ps: with ps; [ aioeafm ]; - "ebox" = ps: with ps; [ ]; # missing inputs: pyebox - "ebusd" = ps: with ps; [ ]; # missing inputs: ebusdpy - "ecoal_boiler" = ps: with ps; [ ecoaliface ]; - "ecobee" = ps: with ps; [ python-ecobee-api ]; - "econet" = ps: with ps; [ pyeconet ]; - "ecovacs" = ps: with ps; [ ]; # missing inputs: sucks - "eddystone_temperature" = ps: with ps; [ construct ]; # missing inputs: beacontools - "edimax" = ps: with ps; [ pyedimax ]; - "edl21" = ps: with ps; [ pysml ]; - "efergy" = ps: with ps; [ pyefergy ]; - "egardia" = ps: with ps; [ pythonegardia ]; - "eight_sleep" = ps: with ps; [ pyeight ]; - "elgato" = ps: with ps; [ elgato ]; - "eliqonline" = ps: with ps; [ eliqonline ]; - "elkm1" = ps: with ps; [ aiohttp-cors elkm1-lib ifaddr ]; - "elmax" = ps: with ps; [ elmax-api ]; - "elv" = ps: with ps; [ pypca ]; - "emby" = ps: with ps; [ pyemby ]; - "emoncms" = ps: with ps; [ ]; - "emoncms_history" = ps: with ps; [ ]; - "emonitor" = ps: with ps; [ aioemonitor ]; - "emulated_hue" = ps: with ps; [ aiohttp-cors ifaddr ]; - "emulated_kasa" = ps: with ps; [ sense-energy ]; - "emulated_roku" = ps: with ps; [ aiohttp-cors emulated-roku ifaddr ]; - "energy" = ps: with ps; [ aiohttp-cors fnvhash lru-dict sqlalchemy ]; - "enigma2" = ps: with ps; [ openwebifpy ]; - "enocean" = ps: with ps; [ enocean ]; - "enphase_envoy" = ps: with ps; [ envoy-reader ]; - "entur_public_transport" = ps: with ps; [ enturclient ]; - "environment_canada" = ps: with ps; [ env-canada ]; - "envisalink" = ps: with ps; [ pyenvisalink ]; - "ephember" = ps: with ps; [ pyephember ]; - "epson" = ps: with ps; [ epson-projector ]; - "epsonworkforce" = ps: with ps; [ ]; # missing inputs: epsonprinter - "eq3btsmart" = ps: with ps; [ construct ]; # missing inputs: python-eq3bt - "esphome" = ps: with ps; [ aioesphomeapi aiohttp-cors ifaddr zeroconf ]; - "etherscan" = ps: with ps; [ ]; # missing inputs: python-etherscan-api - "eufy" = ps: with ps; [ ]; # missing inputs: lakeside - "everlights" = ps: with ps; [ pyeverlights ]; - "evil_genius_labs" = ps: with ps; [ pyevilgenius ]; - "evohome" = ps: with ps; [ evohome-async ]; - "ezviz" = ps: with ps; [ ha-ffmpeg pyezviz ]; - "faa_delays" = ps: with ps; [ faadelays ]; - "facebook" = ps: with ps; [ ]; - "facebox" = ps: with ps; [ ]; - "fail2ban" = ps: with ps; [ ]; - "familyhub" = ps: with ps; [ ]; # missing inputs: python-family-hub-local - "fan" = ps: with ps; [ ]; - "fastdotcom" = ps: with ps; [ ]; # missing inputs: fastdotcom - "feedreader" = ps: with ps; [ feedparser ]; - "ffmpeg" = ps: with ps; [ ha-ffmpeg ]; - "ffmpeg_motion" = ps: with ps; [ ha-ffmpeg ]; - "ffmpeg_noise" = ps: with ps; [ ha-ffmpeg ]; - "fibaro" = ps: with ps; [ fiblary3-fork ]; - "fido" = ps: with ps; [ pyfido ]; - "file" = ps: with ps; [ ]; - "filesize" = ps: with ps; [ ]; - "filter" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "fints" = ps: with ps; [ fints ]; - "fireservicerota" = ps: with ps; [ pyfireservicerota ]; - "firmata" = ps: with ps; [ pymata-express ]; - "fitbit" = ps: with ps; [ aiohttp-cors fitbit ]; - "fivem" = ps: with ps; [ ]; # missing inputs: fivem-api - "fixer" = ps: with ps; [ fixerio ]; - "fjaraskupan" = ps: with ps; [ fjaraskupan ]; - "fleetgo" = ps: with ps; [ ritassist ]; - "flexit" = ps: with ps; [ pymodbus ]; - "flic" = ps: with ps; [ pyflic ]; - "flick_electric" = ps: with ps; [ pyflick ]; - "flipr" = ps: with ps; [ flipr-api ]; - "flo" = ps: with ps; [ aioflo ]; - "flock" = ps: with ps; [ ]; - "flume" = ps: with ps; [ pyflume ]; - "flunearyou" = ps: with ps; [ pyflunearyou ]; - "flux" = ps: with ps; [ ]; - "flux_led" = ps: with ps; [ aiohttp-cors flux-led ifaddr ]; - "folder" = ps: with ps; [ ]; - "folder_watcher" = ps: with ps; [ watchdog ]; - "foobot" = ps: with ps; [ foobot-async ]; - "forecast_solar" = ps: with ps; [ forecast-solar ]; - "forked_daapd" = ps: with ps; [ ]; # missing inputs: pyforked-daapd pylibrespot-java - "fortios" = ps: with ps; [ fortiosapi ]; - "foscam" = ps: with ps; [ libpyfoscam ]; - "foursquare" = ps: with ps; [ aiohttp-cors ]; - "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms - "freebox" = ps: with ps; [ freebox-api ]; - "freedns" = ps: with ps; [ ]; - "freedompro" = ps: with ps; [ pyfreedompro ]; - "fritz" = ps: with ps; [ aiohttp-cors fritzconnection ifaddr xmltodict ]; - "fritzbox" = ps: with ps; [ pyfritzhome ]; - "fritzbox_callmonitor" = ps: with ps; [ fritzconnection ]; - "fronius" = ps: with ps; [ pyfronius ]; - "frontend" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "frontier_silicon" = ps: with ps; [ afsapi ]; - "futurenow" = ps: with ps; [ pyfnip ]; - "garadget" = ps: with ps; [ ]; - "garages_amsterdam" = ps: with ps; [ garages-amsterdam ]; - "gc100" = ps: with ps; [ ]; # missing inputs: python-gc100 - "gdacs" = ps: with ps; [ aio-georss-gdacs ]; - "generic" = ps: with ps; [ av pillow ]; - "generic_hygrostat" = ps: with ps; [ ]; - "generic_thermostat" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "geniushub" = ps: with ps; [ geniushub-client ]; - "geo_json_events" = ps: with ps; [ ]; # missing inputs: aio_geojson_generic_client - "geo_location" = ps: with ps; [ ]; - "geo_rss_events" = ps: with ps; [ georss-generic-client ]; - "geofency" = ps: with ps; [ aiohttp-cors ]; - "geonetnz_quakes" = ps: with ps; [ aio-geojson-geonetnz-quakes ]; - "geonetnz_volcano" = ps: with ps; [ aio-geojson-geonetnz-volcano ]; - "gios" = ps: with ps; [ gios ]; - "github" = ps: with ps; [ aiogithubapi ]; - "gitlab_ci" = ps: with ps; [ python-gitlab ]; - "gitter" = ps: with ps; [ ]; # missing inputs: gitterpy - "glances" = ps: with ps; [ glances-api ]; - "goalfeed" = ps: with ps; [ ]; # missing inputs: pysher - "goalzero" = ps: with ps; [ goalzero ]; - "gogogate2" = ps: with ps; [ ismartgate ]; - "goodwe" = ps: with ps; [ goodwe ]; - "google" = ps: with ps; [ aiohttp-cors google-api-python-client httplib2 oauth2client ]; - "google_assistant" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "google_cloud" = ps: with ps; [ google-cloud-texttospeech ]; - "google_domains" = ps: with ps; [ ]; - "google_maps" = ps: with ps; [ locationsharinglib ]; - "google_pubsub" = ps: with ps; [ google-cloud-pubsub ]; - "google_translate" = ps: with ps; [ gtts ]; - "google_travel_time" = ps: with ps; [ googlemaps ]; - "google_wifi" = ps: with ps; [ ]; - "gpsd" = ps: with ps; [ gps3 ]; - "gpslogger" = ps: with ps; [ aiohttp-cors ]; - "graphite" = ps: with ps; [ ]; - "gree" = ps: with ps; [ greeclimate ]; - "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor - "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality - "group" = ps: with ps; [ ]; - "growatt_server" = ps: with ps; [ growattserver ]; - "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player - "gtfs" = ps: with ps; [ pygtfs ]; - "guardian" = ps: with ps; [ aioguardian ]; - "habitica" = ps: with ps; [ habitipy ]; - "hangouts" = ps: with ps; [ hangups ]; - "harman_kardon_avr" = ps: with ps; [ ]; # missing inputs: hkavr - "harmony" = ps: with ps; [ aioharmony ]; - "hassio" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "haveibeenpwned" = ps: with ps; [ ]; - "hddtemp" = ps: with ps; [ ]; - "hdmi_cec" = ps: with ps; [ pycec ]; - "heatmiser" = ps: with ps; [ ]; # missing inputs: heatmiserV3 - "heos" = ps: with ps; [ pyheos ]; - "here_travel_time" = ps: with ps; [ herepy ]; - "hikvision" = ps: with ps; [ ]; # missing inputs: pyhik - "hikvisioncam" = ps: with ps; [ hikvision ]; - "hisense_aehw4a1" = ps: with ps; [ pyaehw4a1 ]; - "history" = ps: with ps; [ aiohttp-cors fnvhash lru-dict sqlalchemy ]; - "history_stats" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "hitron_coda" = ps: with ps; [ ]; - "hive" = ps: with ps; [ pyhiveapi ]; - "hlk_sw16" = ps: with ps; [ hlk-sw16 ]; - "home_connect" = ps: with ps; [ aiohttp-cors homeconnect ]; - "home_plus_control" = ps: with ps; [ aiohttp-cors homepluscontrol ]; - "homeassistant" = ps: with ps; [ ]; - "homekit" = ps: with ps; [ hap-python pyqrcode pyturbojpeg aiohttp-cors base36 fnvhash ha-ffmpeg ifaddr zeroconf ]; - "homekit_controller" = ps: with ps; [ aiohomekit aiohttp-cors ifaddr zeroconf ]; - "homematic" = ps: with ps; [ pyhomematic ]; - "homematicip_cloud" = ps: with ps; [ homematicip ]; - "homewizard" = ps: with ps; [ aiohwenergy ]; - "homeworks" = ps: with ps; [ pyhomeworks ]; - "honeywell" = ps: with ps; [ somecomfort ]; - "horizon" = ps: with ps; [ ]; # missing inputs: horimote - "hp_ilo" = ps: with ps; [ python-hpilo ]; - "html5" = ps: with ps; [ aiohttp-cors pywebpush ]; - "http" = ps: with ps; [ aiohttp-cors ]; - "huawei_lte" = ps: with ps; [ huawei-lte-api stringcase url-normalize ]; - "hue" = ps: with ps; [ aiohue ]; - "huisbaasje" = ps: with ps; [ huisbaasje-client ]; - "humidifier" = ps: with ps; [ ]; - "hunterdouglas_powerview" = ps: with ps; [ aiopvapi ]; - "hvv_departures" = ps: with ps; [ pygti ]; - "hydrawise" = ps: with ps; [ hydrawiser ]; - "hyperion" = ps: with ps; [ hyperion-py ]; - "ialarm" = ps: with ps; [ pyialarm ]; - "iammeter" = ps: with ps; [ ]; # missing inputs: iammeter - "iaqualink" = ps: with ps; [ iaqualink ]; - "icloud" = ps: with ps; [ pyicloud ]; - "idteck_prox" = ps: with ps; [ ]; # missing inputs: rfk101py - "ifttt" = ps: with ps; [ aiohttp-cors pyfttt ]; - "iglo" = ps: with ps; [ ]; # missing inputs: iglo - "ign_sismologia" = ps: with ps; [ georss-ign-sismologia-client ]; - "ihc" = ps: with ps; [ defusedxml ]; # missing inputs: ihcsdk - "image" = ps: with ps; [ aiohttp-cors pillow ]; - "image_processing" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "imap" = ps: with ps; [ aioimaplib ]; - "imap_email_content" = ps: with ps; [ ]; - "incomfort" = ps: with ps; [ incomfort-client ]; - "influxdb" = ps: with ps; [ influxdb-client influxdb ]; - "input_boolean" = ps: with ps; [ ]; - "input_button" = ps: with ps; [ ]; - "input_datetime" = ps: with ps; [ ]; - "input_number" = ps: with ps; [ ]; - "input_select" = ps: with ps; [ ]; - "input_text" = ps: with ps; [ ]; - "insteon" = ps: with ps; [ pyinsteon ]; - "integration" = ps: with ps; [ ]; - "intellifire" = ps: with ps; [ intellifire4py ]; - "intent" = ps: with ps; [ aiohttp-cors ]; - "intent_script" = ps: with ps; [ ]; - "intesishome" = ps: with ps; [ pyintesishome ]; - "ios" = ps: with ps; [ aiohttp-cors ifaddr zeroconf ]; - "iotawatt" = ps: with ps; [ iotawattpy ]; - "iperf3" = ps: with ps; [ ]; # missing inputs: iperf3 - "ipma" = ps: with ps; [ pyipma ]; - "ipp" = ps: with ps; [ pyipp ]; - "iqvia" = ps: with ps; [ numpy pyiqvia ]; - "irish_rail_transport" = ps: with ps; [ ]; # missing inputs: pyirishrail - "islamic_prayer_times" = ps: with ps; [ prayer-times-calculator ]; - "iss" = ps: with ps; [ ]; # missing inputs: pyiss - "isy994" = ps: with ps; [ pyisy ]; - "itach" = ps: with ps; [ ]; # missing inputs: pyitachip2ir - "itunes" = ps: with ps; [ ]; - "izone" = ps: with ps; [ python-izone ]; - "jellyfin" = ps: with ps; [ jellyfin-apiclient-python ]; - "jewish_calendar" = ps: with ps; [ hdate ]; - "joaoapps_join" = ps: with ps; [ ]; # missing inputs: python-join-api - "juicenet" = ps: with ps; [ python-juicenet ]; - "kaiterra" = ps: with ps; [ ]; # missing inputs: kaiterra-async-client - "kaleidescape" = ps: with ps; [ ]; # missing inputs: pykaleidescape - "kankun" = ps: with ps; [ ]; - "keba" = ps: with ps; [ ]; # missing inputs: keba-kecontact - "keenetic_ndms2" = ps: with ps; [ ndms2-client ]; - "kef" = ps: with ps; [ aiokef getmac ]; - "keyboard" = ps: with ps; [ ]; # missing inputs: pyuserinput - "keyboard_remote" = ps: with ps; [ aionotify evdev ]; - "kira" = ps: with ps; [ pykira ]; - "kiwi" = ps: with ps; [ ]; # missing inputs: kiwiki-client - "kmtronic" = ps: with ps; [ pykmtronic ]; - "knx" = ps: with ps; [ xknx ]; - "kodi" = ps: with ps; [ aiohttp-cors pykodi ]; - "konnected" = ps: with ps; [ aiohttp-cors konnected ]; - "kostal_plenticore" = ps: with ps; [ ]; # missing inputs: kostal_plenticore - "kraken" = ps: with ps; [ krakenex pykrakenapi ]; - "kulersky" = ps: with ps; [ pykulersky ]; - "kwb" = ps: with ps; [ ]; # missing inputs: pykwb - "lacrosse" = ps: with ps; [ pylacrosse ]; - "lametric" = ps: with ps; [ lmnotify ]; - "lannouncer" = ps: with ps; [ ]; - "lastfm" = ps: with ps; [ pylast ]; - "launch_library" = ps: with ps; [ pylaunches ]; - "lcn" = ps: with ps; [ pypck ]; - "lg_netcast" = ps: with ps; [ pylgnetcast ]; - "lg_soundbar" = ps: with ps; [ temescal ]; - "life360" = ps: with ps; [ life360 ]; - "lifx" = ps: with ps; [ aiolifx aiolifx-effects ]; - "lifx_cloud" = ps: with ps; [ ]; - "light" = ps: with ps; [ ]; - "lightwave" = ps: with ps; [ lightwave ]; - "limitlessled" = ps: with ps; [ limitlessled ]; - "linksys_smart" = ps: with ps; [ ]; - "linode" = ps: with ps; [ linode-api ]; - "linux_battery" = ps: with ps; [ batinfo ]; - "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc - "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet - "litterrobot" = ps: with ps; [ pylitterbot ]; - "llamalab_automate" = ps: with ps; [ ]; - "local_file" = ps: with ps; [ ]; - "local_ip" = ps: with ps; [ aiohttp-cors ifaddr ]; - "locative" = ps: with ps; [ aiohttp-cors ]; - "lock" = ps: with ps; [ ]; - "logbook" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "logentries" = ps: with ps; [ ]; - "logger" = ps: with ps; [ ]; - "logi_circle" = ps: with ps; [ aiohttp-cors ha-ffmpeg ]; # missing inputs: logi_circle - "london_air" = ps: with ps; [ ]; - "london_underground" = ps: with ps; [ ]; # missing inputs: london-tube-status - "lookin" = ps: with ps; [ aiolookin ]; - "lovelace" = ps: with ps; [ ]; - "luci" = ps: with ps; [ openwrt-luci-rpc ]; - "luftdaten" = ps: with ps; [ luftdaten ]; - "lupusec" = ps: with ps; [ lupupy ]; - "lutron" = ps: with ps; [ pylutron ]; - "lutron_caseta" = ps: with ps; [ pylutron-caseta ]; - "lw12wifi" = ps: with ps; [ ]; # missing inputs: lw12 - "lyric" = ps: with ps; [ aiohttp-cors aiolyric ]; - "magicseaweed" = ps: with ps; [ ]; # missing inputs: magicseaweed - "mailbox" = ps: with ps; [ aiohttp-cors ]; - "mailgun" = ps: with ps; [ aiohttp-cors ]; # missing inputs: pymailgunner - "manual" = ps: with ps; [ ]; - "manual_mqtt" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "map" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "marytts" = ps: with ps; [ ]; # missing inputs: speak2mary - "mastodon" = ps: with ps; [ mastodon-py ]; - "matrix" = ps: with ps; [ matrix-client ]; - "maxcube" = ps: with ps; [ maxcube-api ]; - "mazda" = ps: with ps; [ pymazda ]; - "media_extractor" = ps: with ps; [ aiohttp-cors youtube-dl-light ]; - "media_player" = ps: with ps; [ aiohttp-cors ]; - "media_source" = ps: with ps; [ aiohttp-cors ]; - "mediaroom" = ps: with ps; [ pymediaroom ]; - "melcloud" = ps: with ps; [ pymelcloud ]; - "melissa" = ps: with ps; [ ]; # missing inputs: py-melissa-climate - "meraki" = ps: with ps; [ aiohttp-cors ]; - "message_bird" = ps: with ps; [ ]; # missing inputs: messagebird - "met" = ps: with ps; [ pymetno ]; - "met_eireann" = ps: with ps; [ pymeteireann ]; - "meteo_france" = ps: with ps; [ ]; # missing inputs: meteofrance-api - "meteoalarm" = ps: with ps; [ meteoalertapi ]; - "meteoclimatic" = ps: with ps; [ pymeteoclimatic ]; - "metoffice" = ps: with ps; [ ]; # missing inputs: datapoint - "mfi" = ps: with ps; [ ]; # missing inputs: mficlient - "microsoft" = ps: with ps; [ ]; # missing inputs: pycsspeechtts - "microsoft_face" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "microsoft_face_detect" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "microsoft_face_identify" = ps: with ps; [ pyturbojpeg aiohttp-cors ]; - "miflora" = ps: with ps; [ bluepy ]; # missing inputs: miflora - "mikrotik" = ps: with ps; [ librouteros ]; - "mill" = ps: with ps; [ mill-local millheater ]; - "min_max" = ps: with ps; [ ]; - "minecraft_server" = ps: with ps; [ aiodns getmac mcstatus ]; - "minio" = ps: with ps; [ minio ]; - "mitemp_bt" = ps: with ps; [ ]; # missing inputs: mitemp_bt - "mjpeg" = ps: with ps; [ ]; - "mobile_app" = ps: with ps; [ pynacl pyturbojpeg aiohttp-cors hass-nabucasa pillow ]; - "mochad" = ps: with ps; [ ]; # missing inputs: pymochad - "modbus" = ps: with ps; [ pymodbus ]; - "modem_callerid" = ps: with ps; [ aiohttp-cors phone-modem pyserial pyudev ]; - "modern_forms" = ps: with ps; [ aiomodernforms ]; - "moehlenhoff_alpha2" = ps: with ps; [ ]; # missing inputs: moehlenhoff-alpha2 - "mold_indicator" = ps: with ps; [ ]; - "monoprice" = ps: with ps; [ ]; # missing inputs: pymonoprice - "moon" = ps: with ps; [ ]; - "motion_blinds" = ps: with ps; [ aiohttp-cors ifaddr motionblinds ]; - "motioneye" = ps: with ps; [ aiohttp-cors motioneye-client ]; - "mpd" = ps: with ps; [ mpd2 ]; - "mqtt" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "mqtt_eventstream" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "mqtt_json" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "mqtt_room" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "mqtt_statestream" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "msteams" = ps: with ps; [ pymsteams ]; - "mullvad" = ps: with ps; [ mullvad-api ]; - "mutesync" = ps: with ps; [ mutesync ]; - "mvglive" = ps: with ps; [ PyMVGLive ]; - "my" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "mycroft" = ps: with ps; [ ]; # missing inputs: mycroftapi - "myq" = ps: with ps; [ pymyq ]; - "mysensors" = ps: with ps; [ aiohttp-cors paho-mqtt pymysensors ]; - "mystrom" = ps: with ps; [ aiohttp-cors python-mystrom ]; - "mythicbeastsdns" = ps: with ps; [ mbddns ]; - "nad" = ps: with ps; [ nad-receiver ]; - "nam" = ps: with ps; [ nettigo-air-monitor ]; - "namecheapdns" = ps: with ps; [ defusedxml ]; - "nanoleaf" = ps: with ps; [ aionanoleaf ]; - "neato" = ps: with ps; [ aiohttp-cors pybotvac ]; - "nederlandse_spoorwegen" = ps: with ps; [ nsapi ]; - "ness_alarm" = ps: with ps; [ nessclient ]; - "nest" = ps: with ps; [ aiohttp-cors google-nest-sdm ha-ffmpeg python-nest ]; - "netatmo" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa pyatmo ]; - "netdata" = ps: with ps; [ netdata ]; - "netgear" = ps: with ps; [ pynetgear ]; - "netgear_lte" = ps: with ps; [ eternalegypt ]; - "netio" = ps: with ps; [ aiohttp-cors ]; # missing inputs: pynetio - "network" = ps: with ps; [ aiohttp-cors ifaddr ]; - "neurio_energy" = ps: with ps; [ ]; # missing inputs: neurio - "nexia" = ps: with ps; [ nexia ]; - "nextbus" = ps: with ps; [ ]; # missing inputs: py_nextbusnext - "nextcloud" = ps: with ps; [ nextcloudmonitor ]; - "nfandroidtv" = ps: with ps; [ ]; # missing inputs: notifications-android-tv - "nightscout" = ps: with ps; [ py-nightscout ]; - "niko_home_control" = ps: with ps; [ niko-home-control ]; - "nilu" = ps: with ps; [ niluclient ]; - "nina" = ps: with ps; [ pynina ]; - "nissan_leaf" = ps: with ps; [ pycarwings2 ]; - "nmap_tracker" = ps: with ps; [ aiohttp-cors getmac ifaddr netmap ]; # missing inputs: mac-vendor-lookup - "nmbs" = ps: with ps; [ ]; # missing inputs: pyrail - "no_ip" = ps: with ps; [ ]; - "noaa_tides" = ps: with ps; [ ]; # missing inputs: noaa-coops - "norway_air" = ps: with ps; [ pymetno ]; - "notify" = ps: with ps; [ ]; - "notify_events" = ps: with ps; [ ]; # missing inputs: notify-events - "notion" = ps: with ps; [ aionotion ]; - "nsw_fuel_station" = ps: with ps; [ ]; # missing inputs: nsw-fuel-api-client - "nsw_rural_fire_service_feed" = ps: with ps; [ aio-geojson-nsw-rfs-incidents ]; - "nuheat" = ps: with ps; [ ]; # missing inputs: nuheat - "nuki" = ps: with ps; [ pynuki ]; - "numato" = ps: with ps; [ ]; # missing inputs: numato-gpio - "number" = ps: with ps; [ ]; - "nut" = ps: with ps; [ pynut2 ]; - "nws" = ps: with ps; [ pynws ]; - "nx584" = ps: with ps; [ pynx584 ]; - "nzbget" = ps: with ps; [ ]; # missing inputs: pynzbgetapi - "oasa_telematics" = ps: with ps; [ ]; # missing inputs: oasatelematics - "obihai" = ps: with ps; [ pyobihai ]; - "octoprint" = ps: with ps; [ pyoctoprintapi ]; - "oem" = ps: with ps; [ oemthermostat ]; - "ohmconnect" = ps: with ps; [ defusedxml ]; - "ombi" = ps: with ps; [ pyombi ]; - "omnilogic" = ps: with ps; [ omnilogic ]; - "onboarding" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "oncue" = ps: with ps; [ aiooncue ]; - "ondilo_ico" = ps: with ps; [ aiohttp-cors ondilo ]; - "onewire" = ps: with ps; [ pi1wire pyownet ]; - "onkyo" = ps: with ps; [ onkyo-eiscp ]; - "onvif" = ps: with ps; [ wsdiscovery ha-ffmpeg onvif-zeep-async ]; - "open_meteo" = ps: with ps; [ open-meteo ]; - "openalpr_cloud" = ps: with ps; [ ]; - "openalpr_local" = ps: with ps; [ ]; - "opencv" = ps: with ps; [ numpy ]; # missing inputs: opencv-python-headless - "openerz" = ps: with ps; [ openerz-api ]; - "openevse" = ps: with ps; [ openevsewifi ]; - "openexchangerates" = ps: with ps; [ ]; - "opengarage" = ps: with ps; [ open-garage ]; - "openhardwaremonitor" = ps: with ps; [ ]; - "openhome" = ps: with ps; [ openhomedevice ]; - "opensensemap" = ps: with ps; [ opensensemap-api ]; - "opensky" = ps: with ps; [ ]; - "opentherm_gw" = ps: with ps; [ pyotgw ]; - "openuv" = ps: with ps; [ pyopenuv ]; - "openweathermap" = ps: with ps; [ pyowm ]; - "opnsense" = ps: with ps; [ pyopnsense ]; - "opple" = ps: with ps; [ ]; # missing inputs: pyoppleio - "oru" = ps: with ps; [ ]; # missing inputs: oru - "orvibo" = ps: with ps; [ orvibo ]; - "osramlightify" = ps: with ps; [ ]; # missing inputs: lightify - "otp" = ps: with ps; [ pyotp ]; - "overkiz" = ps: with ps; [ pyoverkiz ]; - "ovo_energy" = ps: with ps; [ ovoenergy ]; - "owntracks" = ps: with ps; [ pynacl pyturbojpeg aiohttp-cors hass-nabucasa paho-mqtt ]; - "p1_monitor" = ps: with ps; [ p1monitor ]; - "panasonic_bluray" = ps: with ps; [ panacotta ]; - "panasonic_viera" = ps: with ps; [ ]; # missing inputs: panasonic_viera - "pandora" = ps: with ps; [ pexpect ]; - "panel_custom" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "panel_iframe" = ps: with ps; [ aiohttp-cors fnvhash home-assistant-frontend lru-dict pillow sqlalchemy ]; - "peco" = ps: with ps; [ ]; # missing inputs: peco - "pencom" = ps: with ps; [ ]; # missing inputs: pencompy - "persistent_notification" = ps: with ps; [ ]; - "person" = ps: with ps; [ aiohttp-cors pillow ]; - "philips_js" = ps: with ps; [ ha-philipsjs ]; - "pi_hole" = ps: with ps; [ hole ]; - "picnic" = ps: with ps; [ python-picnic-api ]; - "picotts" = ps: with ps; [ ]; - "pilight" = ps: with ps; [ ]; # missing inputs: pilight - "ping" = ps: with ps; [ icmplib ]; - "pioneer" = ps: with ps; [ ]; - "pjlink" = ps: with ps; [ ]; # missing inputs: pypjlink2 - "plaato" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa pyplaato ]; - "plant" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "plex" = ps: with ps; [ aiohttp-cors plexapi plexauth plexwebsocket ]; - "plugwise" = ps: with ps; [ plugwise ]; - "plum_lightpad" = ps: with ps; [ ]; # missing inputs: plumlightpad - "pocketcasts" = ps: with ps; [ ]; # missing inputs: pycketcasts - "point" = ps: with ps; [ aiohttp-cors pypoint ]; - "poolsense" = ps: with ps; [ poolsense ]; - "powerwall" = ps: with ps; [ ]; # missing inputs: tesla-powerwall - "profiler" = ps: with ps; [ guppy3 objgraph pyprof2calltree ]; - "progettihwsw" = ps: with ps; [ ]; # missing inputs: progettihwsw - "proliphix" = ps: with ps; [ ]; # missing inputs: proliphix - "prometheus" = ps: with ps; [ aiohttp-cors prometheus-client ]; - "prosegur" = ps: with ps; [ pyprosegur ]; - "prowl" = ps: with ps; [ ]; - "proximity" = ps: with ps; [ ]; - "proxmoxve" = ps: with ps; [ proxmoxer ]; - "proxy" = ps: with ps; [ pillow ]; - "ps4" = ps: with ps; [ ]; # missing inputs: pyps4-2ndscreen - "pulseaudio_loopback" = ps: with ps; [ pulsectl ]; - "pure_energie" = ps: with ps; [ gridnet ]; - "push" = ps: with ps; [ aiohttp-cors ]; - "pushbullet" = ps: with ps; [ pushbullet ]; - "pushover" = ps: with ps; [ pushover-complete ]; - "pushsafer" = ps: with ps; [ ]; - "pvoutput" = ps: with ps; [ pvo ]; - "pvpc_hourly_pricing" = ps: with ps; [ aiopvpc ]; - "pyload" = ps: with ps; [ ]; - "python_script" = ps: with ps; [ restrictedpython ]; - "qbittorrent" = ps: with ps; [ ]; # missing inputs: python-qbittorrent - "qld_bushfire" = ps: with ps; [ georss-qld-bushfire-alert-client ]; - "qnap" = ps: with ps; [ ]; # missing inputs: qnapstats - "qrcode" = ps: with ps; [ pillow pyzbar ]; - "quantum_gateway" = ps: with ps; [ quantum-gateway ]; - "qvr_pro" = ps: with ps; [ pyqvrpro ]; - "qwikswitch" = ps: with ps; [ ]; # missing inputs: pyqwikswitch - "rachio" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa rachiopy ]; - "radarr" = ps: with ps; [ ]; - "radio_browser" = ps: with ps; [ radios ]; - "radiotherm" = ps: with ps; [ radiotherm ]; - "rainbird" = ps: with ps; [ ]; # missing inputs: pyrainbird - "raincloud" = ps: with ps; [ ]; # missing inputs: raincloudy - "rainforest_eagle" = ps: with ps; [ aioeagle ueagle ]; - "rainmachine" = ps: with ps; [ regenmaschine ]; - "random" = ps: with ps; [ ]; - "raspyrfm" = ps: with ps; [ ]; # missing inputs: raspyrfm-client - "rdw" = ps: with ps; [ vehicle ]; - "recollect_waste" = ps: with ps; [ aiorecollect ]; - "recorder" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "recswitch" = ps: with ps; [ ]; # missing inputs: pyrecswitch - "reddit" = ps: with ps; [ praw ]; - "rejseplanen" = ps: with ps; [ ]; # missing inputs: rjpl - "remember_the_milk" = ps: with ps; [ httplib2 ]; # missing inputs: RtmAPI - "remote" = ps: with ps; [ ]; - "remote_rpi_gpio" = ps: with ps; [ ]; # missing inputs: gpiozero - "renault" = ps: with ps; [ renault-api ]; - "repetier" = ps: with ps; [ ]; # missing inputs: pyrepetierng - "rest" = ps: with ps; [ jsonpath xmltodict ]; - "rest_command" = ps: with ps; [ ]; - "rflink" = ps: with ps; [ rflink ]; - "rfxtrx" = ps: with ps; [ pyrfxtrx ]; - "ridwell" = ps: with ps; [ aioridwell ]; - "ring" = ps: with ps; [ ha-ffmpeg ring-doorbell ]; - "ripple" = ps: with ps; [ ]; # missing inputs: python-ripple-api - "risco" = ps: with ps; [ pyrisco ]; - "rituals_perfume_genie" = ps: with ps; [ pyrituals ]; - "rmvtransport" = ps: with ps; [ pyrmvtransport ]; - "rocketchat" = ps: with ps; [ ]; # missing inputs: rocketchat-API - "roku" = ps: with ps; [ rokuecp ]; - "roomba" = ps: with ps; [ roombapy ]; - "roon" = ps: with ps; [ roonapi ]; - "route53" = ps: with ps; [ boto3 ]; - "rova" = ps: with ps; [ ]; # missing inputs: rova - "rpi_camera" = ps: with ps; [ ]; - "rpi_gpio" = ps: with ps; [ ]; # missing inputs: RPi.GPIO - "rpi_power" = ps: with ps; [ rpi-bad-power ]; - "rss_feed_template" = ps: with ps; [ aiohttp-cors ]; - "rtorrent" = ps: with ps; [ ]; - "rtsp_to_webrtc" = ps: with ps; [ pyturbojpeg aiohttp-cors rtsp-to-webrtc ]; - "ruckus_unleashed" = ps: with ps; [ pyruckus ]; - "russound_rio" = ps: with ps; [ ]; # missing inputs: russound_rio - "russound_rnet" = ps: with ps; [ ]; # missing inputs: russound - "sabnzbd" = ps: with ps; [ aiohttp-cors ifaddr netdisco zeroconf ]; # missing inputs: pysabnzbd - "safe_mode" = ps: with ps; [ pyturbojpeg aiohttp-cors fnvhash hass-nabucasa home-assistant-frontend lru-dict pillow sqlalchemy ]; - "saj" = ps: with ps; [ ]; # missing inputs: pysaj - "samsungtv" = ps: with ps; [ aiohttp-cors async-upnp-client getmac ifaddr samsungctl samsungtvws wakeonlan zeroconf ]; - "satel_integra" = ps: with ps; [ ]; # missing inputs: satel_integra - "scene" = ps: with ps; [ ]; - "schluter" = ps: with ps; [ ]; # missing inputs: py-schluter - "scrape" = ps: with ps; [ beautifulsoup4 jsonpath xmltodict ]; - "screenlogic" = ps: with ps; [ screenlogicpy ]; - "script" = ps: with ps; [ ]; - "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate - "search" = ps: with ps; [ aiohttp-cors ]; - "season" = ps: with ps; [ ephem ]; - "select" = ps: with ps; [ ]; - "sendgrid" = ps: with ps; [ sendgrid ]; - "sense" = ps: with ps; [ sense-energy ]; - "senseme" = ps: with ps; [ aiosenseme ]; - "sensibo" = ps: with ps; [ ]; # missing inputs: pysensibo - "sensor" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "sentry" = ps: with ps; [ sentry-sdk ]; - "serial" = ps: with ps; [ pyserial-asyncio ]; - "serial_pm" = ps: with ps; [ pmsensor ]; - "sesame" = ps: with ps; [ ]; # missing inputs: pysesame2 - "seven_segments" = ps: with ps; [ pillow ]; - "seventeentrack" = ps: with ps; [ py17track ]; - "sharkiq" = ps: with ps; [ ]; # missing inputs: sharkiq - "shell_command" = ps: with ps; [ ]; - "shelly" = ps: with ps; [ aioshelly ]; - "shiftr" = ps: with ps; [ paho-mqtt ]; - "shodan" = ps: with ps; [ shodan ]; - "shopping_list" = ps: with ps; [ aiohttp-cors ]; - "sia" = ps: with ps; [ pysiaalarm ]; - "sigfox" = ps: with ps; [ ]; - "sighthound" = ps: with ps; [ pillow simplehound ]; - "signal_messenger" = ps: with ps; [ pysignalclirestapi ]; - "simplepush" = ps: with ps; [ ]; # missing inputs: simplepush - "simplisafe" = ps: with ps; [ simplisafe-python ]; - "simulated" = ps: with ps; [ ]; - "sinch" = ps: with ps; [ ]; # missing inputs: clx-sdk-xms - "siren" = ps: with ps; [ ]; - "sisyphus" = ps: with ps; [ ]; # missing inputs: sisyphus-control - "sky_hub" = ps: with ps; [ pyskyqhub ]; - "skybeacon" = ps: with ps; [ pygatt ]; - "skybell" = ps: with ps; [ skybellpy ]; - "slack" = ps: with ps; [ slackclient ]; - "sleepiq" = ps: with ps; [ asyncsleepiq ]; - "slide" = ps: with ps; [ ]; # missing inputs: goslide-api - "sma" = ps: with ps; [ pysma ]; - "smappee" = ps: with ps; [ aiohttp-cors pysmappee ]; - "smart_meter_texas" = ps: with ps; [ smart-meter-texas ]; - "smartthings" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa pysmartapp pysmartthings ]; - "smarttub" = ps: with ps; [ python-smarttub ]; - "smarty" = ps: with ps; [ ]; # missing inputs: pysmarty - "smhi" = ps: with ps; [ smhi-pkg ]; - "sms" = ps: with ps; [ python-gammu ]; - "smtp" = ps: with ps; [ ]; - "snapcast" = ps: with ps; [ snapcast ]; - "snips" = ps: with ps; [ aiohttp-cors paho-mqtt ]; - "snmp" = ps: with ps; [ pysnmp ]; - "solaredge" = ps: with ps; [ solaredge stringcase ]; - "solaredge_local" = ps: with ps; [ ]; # missing inputs: solaredge-local - "solarlog" = ps: with ps; [ sunwatcher ]; - "solax" = ps: with ps; [ solax ]; - "soma" = ps: with ps; [ pysoma ]; - "somfy" = ps: with ps; [ aiohttp-cors pymfy ]; - "somfy_mylink" = ps: with ps; [ somfy-mylink-synergy ]; - "sonarr" = ps: with ps; [ aiopyarr ]; - "songpal" = ps: with ps; [ python-songpal ]; - "sonos" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr plexapi plexauth plexwebsocket soco spotipy zeroconf ]; - "sony_projector" = ps: with ps; [ pysdcp ]; - "soundtouch" = ps: with ps; [ aiohttp-cors ifaddr libsoundtouch zeroconf ]; - "spaceapi" = ps: with ps; [ aiohttp-cors ]; - "spc" = ps: with ps; [ pyspcwebgw ]; - "speedtestdotnet" = ps: with ps; [ speedtest-cli ]; - "spider" = ps: with ps; [ spiderpy ]; - "splunk" = ps: with ps; [ ]; # missing inputs: hass_splunk - "spotify" = ps: with ps; [ aiohttp-cors spotipy ]; - "sql" = ps: with ps; [ sqlalchemy ]; - "squeezebox" = ps: with ps; [ pysqueezebox ]; - "srp_energy" = ps: with ps; [ srpenergy ]; - "ssdp" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr zeroconf ]; - "starline" = ps: with ps; [ starline ]; - "starlingbank" = ps: with ps; [ ]; # missing inputs: starlingbank - "startca" = ps: with ps; [ xmltodict ]; - "statistics" = ps: with ps; [ fnvhash lru-dict sqlalchemy ]; - "statsd" = ps: with ps; [ statsd ]; - "steam_online" = ps: with ps; [ ]; # missing inputs: steamodd - "steamist" = ps: with ps; [ aiohttp-cors aiosteamist discovery30303 ifaddr ]; - "stiebel_eltron" = ps: with ps; [ pymodbus ]; # missing inputs: pystiebeleltron - "stookalert" = ps: with ps; [ ]; # missing inputs: stookalert - "stream" = ps: with ps; [ pyturbojpeg aiohttp-cors av ]; - "streamlabswater" = ps: with ps; [ streamlabswater ]; - "stt" = ps: with ps; [ aiohttp-cors ]; - "subaru" = ps: with ps; [ subarulink ]; - "suez_water" = ps: with ps; [ ]; # missing inputs: pysuez - "sun" = ps: with ps; [ ]; - "supervisord" = ps: with ps; [ ]; - "supla" = ps: with ps; [ ]; # missing inputs: asyncpysupla - "surepetcare" = ps: with ps; [ surepy ]; - "swiss_hydrological_data" = ps: with ps; [ swisshydrodata ]; - "swiss_public_transport" = ps: with ps; [ python-opendata-transport ]; - "swisscom" = ps: with ps; [ ]; - "switch" = ps: with ps; [ ]; - "switch_as_x" = ps: with ps; [ ]; - "switchbot" = ps: with ps; [ pyswitchbot ]; - "switcher_kis" = ps: with ps; [ aioswitcher ]; - "switchmate" = ps: with ps; [ ]; # missing inputs: pySwitchmate - "syncthing" = ps: with ps; [ aiosyncthing ]; - "syncthru" = ps: with ps; [ pysyncthru url-normalize ]; - "synology_chat" = ps: with ps; [ ]; - "synology_dsm" = ps: with ps; [ py-synologydsm-api ]; - "synology_srm" = ps: with ps; [ ]; # missing inputs: synology-srm - "syslog" = ps: with ps; [ ]; - "system_bridge" = ps: with ps; [ aiohttp-cors ifaddr systembridge zeroconf ]; - "system_health" = ps: with ps; [ aiohttp-cors ]; - "system_log" = ps: with ps; [ ]; - "systemmonitor" = ps: with ps; [ psutil ]; - "tado" = ps: with ps; [ python-tado ]; - "tag" = ps: with ps; [ ]; - "tailscale" = ps: with ps; [ tailscale ]; - "tank_utility" = ps: with ps; [ ]; # missing inputs: tank_utility - "tankerkoenig" = ps: with ps; [ pytankerkoenig ]; - "tapsaff" = ps: with ps; [ ]; # missing inputs: tapsaff - "tasmota" = ps: with ps; [ aiohttp-cors hatasmota paho-mqtt ]; - "tautulli" = ps: with ps; [ pytautulli ]; - "tcp" = ps: with ps; [ ]; - "ted5000" = ps: with ps; [ xmltodict ]; - "telegram" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ]; - "telegram_bot" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ]; - "tellduslive" = ps: with ps; [ tellduslive ]; - "tellstick" = ps: with ps; [ ]; # missing inputs: tellcore-net tellcore-py - "telnet" = ps: with ps; [ ]; - "temper" = ps: with ps; [ ]; # missing inputs: temperusb - "template" = ps: with ps; [ ]; - "tensorflow" = ps: with ps; [ numpy pillow pycocotools tensorflow ]; # missing inputs: tf-models-official - "tesla_wall_connector" = ps: with ps; [ tesla-wall-connector ]; - "tfiac" = ps: with ps; [ ]; # missing inputs: pytfiac - "thermoworks_smoke" = ps: with ps; [ stringcase ]; # missing inputs: thermoworks_smoke - "thethingsnetwork" = ps: with ps; [ ]; - "thingspeak" = ps: with ps; [ ]; # missing inputs: thingspeak - "thinkingcleaner" = ps: with ps; [ ]; # missing inputs: pythinkingcleaner - "thomson" = ps: with ps; [ ]; - "threshold" = ps: with ps; [ ]; - "tibber" = ps: with ps; [ fnvhash lru-dict pytibber sqlalchemy ]; - "tikteck" = ps: with ps; [ ]; # missing inputs: tikteck - "tile" = ps: with ps; [ pytile ]; - "time_date" = ps: with ps; [ ]; - "timer" = ps: with ps; [ ]; - "tmb" = ps: with ps; [ tmb ]; - "tod" = ps: with ps; [ ]; - "todoist" = ps: with ps; [ todoist ]; - "tolo" = ps: with ps; [ tololib ]; - "tomato" = ps: with ps; [ ]; - "tomorrowio" = ps: with ps; [ ]; # missing inputs: pytomorrowio - "toon" = ps: with ps; [ pyturbojpeg aiohttp-cors hass-nabucasa toonapi ]; - "torque" = ps: with ps; [ aiohttp-cors ]; - "totalconnect" = ps: with ps; [ total-connect-client ]; - "touchline" = ps: with ps; [ ]; # missing inputs: pytouchline - "tplink" = ps: with ps; [ aiohttp-cors ifaddr python-kasa ]; - "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected - "traccar" = ps: with ps; [ aiohttp-cors pytraccar stringcase ]; - "trace" = ps: with ps; [ ]; - "tractive" = ps: with ps; [ aiotractive ]; - "tradfri" = ps: with ps; [ pytradfri ]; - "trafikverket_train" = ps: with ps; [ pytrafikverket ]; - "trafikverket_weatherstation" = ps: with ps; [ pytrafikverket ]; - "transmission" = ps: with ps; [ transmissionrpc ]; - "transport_nsw" = ps: with ps; [ pytransportnsw ]; - "travisci" = ps: with ps; [ ]; # missing inputs: TravisPy - "trend" = ps: with ps; [ numpy ]; - "tts" = ps: with ps; [ aiohttp-cors mutagen ]; - "tuya" = ps: with ps; [ ha-ffmpeg tuya-iot-py-sdk ]; - "twentemilieu" = ps: with ps; [ twentemilieu ]; - "twilio" = ps: with ps; [ aiohttp-cors twilio ]; - "twilio_call" = ps: with ps; [ aiohttp-cors twilio ]; - "twilio_sms" = ps: with ps; [ aiohttp-cors twilio ]; - "twinkly" = ps: with ps; [ ttls ]; - "twitch" = ps: with ps; [ twitchapi ]; - "twitter" = ps: with ps; [ twitterapi ]; - "ubus" = ps: with ps; [ openwrt-ubus-rpc ]; - "ue_smart_radio" = ps: with ps; [ ]; - "uk_transport" = ps: with ps; [ ]; - "unifi" = ps: with ps; [ aiounifi ]; - "unifi_direct" = ps: with ps; [ pexpect ]; - "unifiled" = ps: with ps; [ unifiled ]; - "unifiprotect" = ps: with ps; [ aiohttp-cors ]; # missing inputs: pyunifiprotect unifi-discovery - "universal" = ps: with ps; [ ]; - "upb" = ps: with ps; [ upb-lib ]; - "upc_connect" = ps: with ps; [ connect-box ]; - "upcloud" = ps: with ps; [ upcloud-api ]; - "update" = ps: with ps; [ ]; - "updater" = ps: with ps; [ ]; - "upnp" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr zeroconf ]; - "uptime" = ps: with ps; [ ]; - "uptimerobot" = ps: with ps; [ pyuptimerobot ]; - "usb" = ps: with ps; [ aiohttp-cors pyserial pyudev ]; - "uscis" = ps: with ps; [ ]; # missing inputs: uscisstatus - "usgs_earthquakes_feed" = ps: with ps; [ geojson-client ]; - "utility_meter" = ps: with ps; [ croniter ]; - "uvc" = ps: with ps; [ uvcclient ]; - "vacuum" = ps: with ps; [ ]; - "vallox" = ps: with ps; [ ]; # missing inputs: vallox-websocket-api - "vasttrafik" = ps: with ps; [ ]; # missing inputs: vtjp - "velbus" = ps: with ps; [ aiohttp-cors pyserial pyudev velbus-aio ]; - "velux" = ps: with ps; [ pyvlx ]; - "venstar" = ps: with ps; [ venstarcolortouch ]; - "vera" = ps: with ps; [ pyvera ]; - "verisure" = ps: with ps; [ vsure ]; - "versasense" = ps: with ps; [ pyversasense ]; - "version" = ps: with ps; [ pyhaversion ]; - "vesync" = ps: with ps; [ pyvesync ]; - "viaggiatreno" = ps: with ps; [ ]; - "vicare" = ps: with ps; [ pyvicare ]; - "vilfo" = ps: with ps; [ vilfo-api-client ]; - "vivotek" = ps: with ps; [ libpyvivotek ]; - "vizio" = ps: with ps; [ pyvizio ]; - "vlc" = ps: with ps; [ python-vlc ]; - "vlc_telnet" = ps: with ps; [ aiovlc ]; - "voicerss" = ps: with ps; [ ]; - "volkszaehler" = ps: with ps; [ volkszaehler ]; - "volumio" = ps: with ps; [ pyvolumio ]; - "volvooncall" = ps: with ps; [ volvooncall ]; - "vulcan" = ps: with ps; [ vulcan-api ]; - "vultr" = ps: with ps; [ vultr ]; - "w800rf32" = ps: with ps; [ ]; # missing inputs: pyW800rf32 - "wake_on_lan" = ps: with ps; [ wakeonlan ]; - "wallbox" = ps: with ps; [ wallbox ]; - "waqi" = ps: with ps; [ waqiasync ]; - "water_heater" = ps: with ps; [ ]; - "waterfurnace" = ps: with ps; [ waterfurnace ]; - "watson_iot" = ps: with ps; [ ]; # missing inputs: ibmiotf - "watson_tts" = ps: with ps; [ ibm-watson ]; - "watttime" = ps: with ps; [ aiowatttime ]; - "waze_travel_time" = ps: with ps; [ wazeroutecalculator ]; - "weather" = ps: with ps; [ ]; - "webhook" = ps: with ps; [ aiohttp-cors ]; - "webostv" = ps: with ps; [ aiowebostv ]; - "websocket_api" = ps: with ps; [ aiohttp-cors ]; - "wemo" = ps: with ps; [ pywemo ]; - "whirlpool" = ps: with ps; [ whirlpool-sixth-sense ]; - "whois" = ps: with ps; [ whois ]; - "wiffi" = ps: with ps; [ wiffi ]; - "wilight" = ps: with ps; [ pywilight ]; - "wirelesstag" = ps: with ps; [ ]; # missing inputs: wirelesstagpy - "withings" = ps: with ps; [ aiohttp-cors ]; # missing inputs: withings-api - "wiz" = ps: with ps; [ aiohttp-cors ifaddr pywizlight ]; - "wled" = ps: with ps; [ wled ]; - "wolflink" = ps: with ps; [ ]; # missing inputs: wolf_smartset - "workday" = ps: with ps; [ holidays ]; - "worldclock" = ps: with ps; [ ]; - "worldtidesinfo" = ps: with ps; [ ]; - "worxlandroid" = ps: with ps; [ ]; - "wsdot" = ps: with ps; [ ]; - "x10" = ps: with ps; [ ]; - "xbox" = ps: with ps; [ aiohttp-cors xbox-webapi ]; - "xbox_live" = ps: with ps; [ xboxapi ]; - "xeoma" = ps: with ps; [ pyxeoma ]; - "xiaomi" = ps: with ps; [ ha-ffmpeg ]; - "xiaomi_aqara" = ps: with ps; [ pyxiaomigateway aiohttp-cors ifaddr netdisco zeroconf ]; - "xiaomi_miio" = ps: with ps; [ construct micloud python-miio ]; - "xiaomi_tv" = ps: with ps; [ pymitv ]; - "xmpp" = ps: with ps; [ slixmpp ]; - "xs1" = ps: with ps; [ ]; # missing inputs: xs1-api-client - "yale_smart_alarm" = ps: with ps; [ yalesmartalarmclient ]; - "yamaha" = ps: with ps; [ rxv ]; - "yamaha_musiccast" = ps: with ps; [ aiohttp-cors aiomusiccast async-upnp-client ifaddr zeroconf ]; - "yandex_transport" = ps: with ps; [ aioymaps ]; - "yandextts" = ps: with ps; [ ]; - "yeelight" = ps: with ps; [ aiohttp-cors async-upnp-client ifaddr yeelight zeroconf ]; - "yeelightsunflower" = ps: with ps; [ ]; # missing inputs: yeelightsunflower - "yi" = ps: with ps; [ aioftp ha-ffmpeg ]; - "youless" = ps: with ps; [ youless-api ]; - "zabbix" = ps: with ps; [ py-zabbix ]; - "zamg" = ps: with ps; [ ]; - "zengge" = ps: with ps; [ bluepy ]; # missing inputs: zengge - "zeroconf" = ps: with ps; [ aiohttp-cors ifaddr zeroconf ]; - "zerproc" = ps: with ps; [ pyzerproc ]; - "zestimate" = ps: with ps; [ xmltodict ]; - "zha" = ps: with ps; [ aiohttp-cors bellows ifaddr pyserial-asyncio pyserial pyudev zeroconf zha-quirks zigpy-deconz zigpy-xbee zigpy-zigate zigpy-znp zigpy ]; - "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac - "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl - "zodiac" = ps: with ps; [ ]; - "zone" = ps: with ps; [ ]; - "zoneminder" = ps: with ps; [ zm-py ]; - "zwave_js" = ps: with ps; [ aiohttp-cors pyserial pyudev zwave-js-server-python ]; - "zwave_me" = ps: with ps; [ aiohttp-cors ifaddr url-normalize zeroconf ]; # missing inputs: zwave_me_ws + "abode" = ps: with ps; [ + abodepy + ]; + "accuweather" = ps: with ps; [ + accuweather + ]; + "acer_projector" = ps: with ps; [ + pyserial + ]; + "acmeda" = ps: with ps; [ + aiopulse + ]; + "actiontec" = ps: with ps; [ + ]; + "adax" = ps: with ps; [ + adax-local + adax + ]; + "adguard" = ps: with ps; [ + adguardhome + ]; + "ads" = ps: with ps; [ + pyads + ]; + "advantage_air" = ps: with ps; [ + advantage-air + ]; + "aemet" = ps: with ps; [ + aemet-opendata + ]; + "aftership" = ps: with ps; [ + pyaftership + ]; + "agent_dvr" = ps: with ps; [ + agent-py + ]; + "air_quality" = ps: with ps; [ + ]; + "airly" = ps: with ps; [ + airly + ]; + "airnow" = ps: with ps; [ + pyairnow + ]; + "airthings" = ps: with ps; [ + airthings-cloud + ]; + "airtouch4" = ps: with ps; [ + airtouch4pyapi + ]; + "airvisual" = ps: with ps; [ + pyairvisual + ]; + "airzone" = ps: with ps; [ + aioairzone + ]; + "aladdin_connect" = ps: with ps; [ + aladdin-connect + ]; + "alarm_control_panel" = ps: with ps; [ + ]; + "alarmdecoder" = ps: with ps; [ + adext + ]; + "alert" = ps: with ps; [ + ]; + "alexa" = ps: with ps; [ + 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; [ + ambee + ]; + "amberelectric" = ps: with ps; [ + amberelectric + ]; + "ambiclimate" = ps: with ps; [ + aiohttp-cors + ambiclimate + ]; + "ambient_station" = ps: with ps; [ + aioambient + ]; + "amcrest" = ps: with ps; [ + amcrest + ha-ffmpeg + ]; + "ampio" = ps: with ps; [ + asmog + ]; + "analytics" = ps: with ps; [ + aiohttp-cors + fnvhash + lru-dict + sqlalchemy + ]; + "android_ip_webcam" = ps: with ps; [ + pydroid-ipcam + ]; + "androidtv" = ps: with ps; [ + adb-shell + androidtv + pure-python-adb + ] + ++ adb-shell.extras-require.async + ++ androidtv.extras-require.async + ++ pure-python-adb.extras-require.async; + "anel_pwrctrl" = ps: with ps; [ + ]; # missing inputs: anel_pwrctrl-homeassistant + "anthemav" = ps: with ps; [ + ]; # missing inputs: anthemav + "apache_kafka" = ps: with ps; [ + aiokafka + ]; + "apcupsd" = ps: with ps; [ + apcaccess + ]; + "api" = ps: with ps; [ + aiohttp-cors + ]; + "apple_tv" = ps: with ps; [ + aiohttp-cors + ifaddr + pyatv + zeroconf + ]; + "apprise" = ps: with ps; [ + apprise + ]; + "aprs" = ps: with ps; [ + aprslib + geopy + ]; + "aqualogic" = ps: with ps; [ + aqualogic + ]; + "aquostv" = ps: with ps; [ + ]; # missing inputs: sharp_aquos_rc + "arcam_fmj" = ps: with ps; [ + arcam-fmj + ]; + "arest" = ps: with ps; [ + ]; + "arlo" = ps: with ps; [ + ha-ffmpeg + pyarlo + ]; + "arris_tg2492lg" = ps: with ps; [ + ]; # missing inputs: arris-tg2492lg + "aruba" = ps: with ps; [ + pexpect + ]; + "arwn" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "aseko_pool_live" = ps: with ps; [ + aioaseko + ]; + "asterisk_cdr" = ps: with ps; [ + asterisk-mbox + ]; + "asterisk_mbox" = ps: with ps; [ + asterisk-mbox + ]; + "asuswrt" = ps: with ps; [ + aioasuswrt + ]; + "atag" = ps: with ps; [ + pyatag + ]; + "aten_pe" = ps: with ps; [ + atenpdu + ]; + "atome" = ps: with ps; [ + pyatome + ]; + "august" = ps: with ps; [ + yalexs + ]; + "aurora" = ps: with ps; [ + auroranoaa + ]; + "aurora_abb_powerone" = ps: with ps; [ + aurorapy + ]; + "aussie_broadband" = ps: with ps; [ + pyaussiebb + ]; + "auth" = ps: with ps; [ + aiohttp-cors + ]; + "automation" = ps: with ps; [ + aiohttp-cors + ]; + "avea" = ps: with ps; [ + avea + ]; + "avion" = ps: with ps; [ + avion + ]; + "awair" = ps: with ps; [ + python-awair + ]; + "aws" = ps: with ps; [ + aiobotocore + ]; + "axis" = ps: with ps; [ + aiohttp-cors + axis + paho-mqtt + ]; + "azure_devops" = ps: with ps; [ + aioazuredevops + ]; + "azure_event_hub" = ps: with ps; [ + azure-eventhub + ]; + "azure_service_bus" = ps: with ps; [ + azure-servicebus + ]; + "backup" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: securetar + "baidu" = ps: with ps; [ + ]; # missing inputs: baidu-aip + "balboa" = ps: with ps; [ + pybalboa + ]; + "bayesian" = ps: with ps; [ + ]; + "bbox" = ps: with ps; [ + ]; # missing inputs: pybbox + "beewi_smartclim" = ps: with ps; [ + ]; # missing inputs: beewi_smartclim + "binary_sensor" = ps: with ps; [ + ]; + "bitcoin" = ps: with ps; [ + blockchain + ]; + "bizkaibus" = ps: with ps; [ + bizkaibus + ]; + "blackbird" = ps: with ps; [ + pyblackbird + ]; + "blebox" = ps: with ps; [ + blebox-uniapi + ]; + "blink" = ps: with ps; [ + blinkpy + ]; + "blinksticklight" = ps: with ps; [ + BlinkStick + ]; + "blockchain" = ps: with ps; [ + ]; # missing inputs: python-blockchain-api + "bloomsky" = ps: with ps; [ + ]; + "blueprint" = ps: with ps; [ + ]; + "bluesound" = ps: with ps; [ + xmltodict + ]; + "bluetooth_le_tracker" = ps: with ps; [ + pygatt + ] + ++ pygatt.extras-require.GATTTOOL; + "bluetooth_tracker" = ps: with ps; [ + bt-proximity + pybluez + ]; + "bmw_connected_drive" = ps: with ps; [ + bimmer-connected + ]; + "bond" = ps: with ps; [ + bond-api + ]; + "bosch_shc" = ps: with ps; [ + aiohttp-cors + boschshcpy + ifaddr + zeroconf + ]; + "braviatv" = ps: with ps; [ + bravia-tv + ]; + "broadlink" = ps: with ps; [ + broadlink + ]; + "brother" = ps: with ps; [ + brother + ]; + "brottsplatskartan" = ps: with ps; [ + brottsplatskartan + ]; + "browser" = ps: with ps; [ + ]; + "brunt" = ps: with ps; [ + ]; # missing inputs: brunt + "bsblan" = ps: with ps; [ + bsblan + ]; + "bt_home_hub_5" = ps: with ps; [ + ]; # missing inputs: bthomehub5-devicelist + "bt_smarthub" = ps: with ps; [ + ]; # missing inputs: btsmarthub_devicelist + "buienradar" = ps: with ps; [ + buienradar + ]; + "button" = ps: with ps; [ + ]; + "caldav" = ps: with ps; [ + caldav + ]; + "calendar" = ps: with ps; [ + aiohttp-cors + ]; + "camera" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "canary" = ps: with ps; [ + ha-ffmpeg + py-canary + ]; + "cast" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + ifaddr + mutagen + plexapi + plexauth + plexwebsocket + PyChromecast + zeroconf + ]; + "cert_expiry" = ps: with ps; [ + ]; + "channels" = ps: with ps; [ + pychannels + ]; + "circuit" = ps: with ps; [ + circuit-webhook + ]; + "cisco_ios" = ps: with ps; [ + pexpect + ]; + "cisco_mobility_express" = ps: with ps; [ + ciscomobilityexpress + ]; + "cisco_webex_teams" = ps: with ps; [ + webexteamssdk + ]; + "citybikes" = ps: with ps; [ + ]; + "clementine" = ps: with ps; [ + ]; # missing inputs: python-clementine-remote + "clickatell" = ps: with ps; [ + ]; + "clicksend" = ps: with ps; [ + ]; + "clicksend_tts" = ps: with ps; [ + ]; + "climacell" = ps: with ps; [ + pyclimacell + ]; # missing inputs: pytomorrowio + "climate" = ps: with ps; [ + ]; + "cloud" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + ]; + "cloudflare" = ps: with ps; [ + pycfdns + ]; + "cmus" = ps: with ps; [ + ]; # missing inputs: pycmus + "co2signal" = ps: with ps; [ + co2signal + ]; + "coinbase" = ps: with ps; [ + ]; # missing inputs: coinbase + "color_extractor" = ps: with ps; [ + colorthief + ]; + "comed_hourly_pricing" = ps: with ps; [ + ]; + "comfoconnect" = ps: with ps; [ + pycomfoconnect + ]; + "command_line" = ps: with ps; [ + ]; + "compensation" = ps: with ps; [ + numpy + ]; + "concord232" = ps: with ps; [ + ]; # missing inputs: concord232 + "config" = ps: with ps; [ + aiohttp-cors + ]; + "configurator" = ps: with ps; [ + ]; + "control4" = ps: with ps; [ + pycontrol4 + ]; + "conversation" = ps: with ps; [ + aiohttp-cors + ]; + "coolmaster" = ps: with ps; [ + pycoolmasternet-async + ]; + "coronavirus" = ps: with ps; [ + coronavirus + ]; + "counter" = ps: with ps; [ + ]; + "cover" = ps: with ps; [ + ]; + "cppm_tracker" = ps: with ps; [ + ]; # missing inputs: clearpasspy + "cpuspeed" = ps: with ps; [ + py-cpuinfo + ]; + "crownstone" = ps: with ps; [ + aiohttp-cors + crownstone-cloud + crownstone-sse + crownstone-uart + pyserial + pyudev + ]; + "cups" = ps: with ps; [ + pycups + ]; + "currencylayer" = 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 + ]; + "ddwrt" = ps: with ps; [ + ]; + "debugpy" = ps: with ps; [ + debugpy + ]; + "deconz" = ps: with ps; [ + pydeconz + ]; + "decora" = ps: with ps; [ + bluepy + ]; # missing inputs: decora + "decora_wifi" = ps: with ps; [ + ]; # missing inputs: decora_wifi + "default_config" = ps: with ps; [ + pynacl + pyturbojpeg + aiodiscover + aiohttp-cors + async-upnp-client + fnvhash + hass-nabucasa + home-assistant-frontend + ifaddr + lru-dict + pillow + pyserial + pyudev + scapy + sqlalchemy + zeroconf + ]; + "delijn" = ps: with ps; [ + pydelijn + ]; + "deluge" = ps: with ps; [ + deluge-client + ]; + "demo" = ps: with ps; [ + aiohttp-cors + fnvhash + lru-dict + sqlalchemy + ]; + "denon" = ps: with ps; [ + ]; + "denonavr" = ps: with ps; [ + denonavr + ]; + "derivative" = ps: with ps; [ + ]; + "deutsche_bahn" = ps: with ps; [ + schiene + ]; + "device_automation" = ps: with ps; [ + ]; + "device_sun_light_trigger" = ps: with ps; [ + aiohttp-cors + pillow + ]; + "device_tracker" = ps: with ps; [ + ]; + "devolo_home_control" = ps: with ps; [ + aiohttp-cors + devolo-home-control-api + ifaddr + zeroconf + ]; + "devolo_home_network" = ps: with ps; [ + devolo-plc-api + ]; + "dexcom" = ps: with ps; [ + pydexcom + ]; + "dhcp" = ps: with ps; [ + aiodiscover + scapy + ]; + "diagnostics" = ps: with ps; [ + aiohttp-cors + ]; + "dialogflow" = ps: with ps; [ + aiohttp-cors + ]; + "digital_ocean" = ps: with ps; [ + digital-ocean + ]; + "digitalloggers" = ps: with ps; [ + ]; # missing inputs: dlipower + "directv" = ps: with ps; [ + directv + ]; + "discogs" = ps: with ps; [ + discogs-client + ]; + "discord" = ps: with ps; [ + nextcord + ]; + "discovery" = ps: with ps; [ + aiohttp-cors + ifaddr + netdisco + zeroconf + ]; + "dlib_face_detect" = ps: with ps; [ + face_recognition + ]; + "dlib_face_identify" = ps: with ps; [ + face_recognition + ]; + "dlink" = ps: with ps; [ + ]; # missing inputs: pyW215 + "dlna_dmr" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + zeroconf + ]; + "dlna_dms" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + zeroconf + ]; + "dnsip" = ps: with ps; [ + aiodns + ]; + "dominos" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: pizzapi + "doods" = ps: with ps; [ + pillow + pydoods + ]; + "doorbird" = ps: with ps; [ + aiohttp-cors + doorbirdpy + ]; + "dovado" = ps: with ps; [ + ]; # missing inputs: dovado + "downloader" = ps: with ps; [ + ]; + "dsmr" = ps: with ps; [ + dsmr-parser + ]; + "dsmr_reader" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "dte_energy_bridge" = ps: with ps; [ + ]; + "dublin_bus_transport" = ps: with ps; [ + ]; + "duckdns" = ps: with ps; [ + ]; + "dunehd" = ps: with ps; [ + pdunehd + ]; + "dwd_weather_warnings" = ps: with ps; [ + dwdwfsapi + ]; + "dweet" = ps: with ps; [ + ]; # missing inputs: dweepy + "dynalite" = ps: with ps; [ + dynalite-devices + ]; + "eafm" = ps: with ps; [ + aioeafm + ]; + "ebox" = ps: with ps; [ + ]; # missing inputs: pyebox + "ebusd" = ps: with ps; [ + ]; # missing inputs: ebusdpy + "ecoal_boiler" = ps: with ps; [ + ecoaliface + ]; + "ecobee" = ps: with ps; [ + python-ecobee-api + ]; + "econet" = ps: with ps; [ + pyeconet + ]; + "ecovacs" = ps: with ps; [ + ]; # missing inputs: sucks + "eddystone_temperature" = ps: with ps; [ + construct + ]; # missing inputs: beacontools + "edimax" = ps: with ps; [ + pyedimax + ]; + "edl21" = ps: with ps; [ + pysml + ]; + "efergy" = ps: with ps; [ + pyefergy + ]; + "egardia" = ps: with ps; [ + pythonegardia + ]; + "eight_sleep" = ps: with ps; [ + pyeight + ]; + "elgato" = ps: with ps; [ + elgato + ]; + "eliqonline" = ps: with ps; [ + eliqonline + ]; + "elkm1" = ps: with ps; [ + aiohttp-cors + elkm1-lib + ifaddr + ]; + "elmax" = ps: with ps; [ + elmax-api + ]; + "elv" = ps: with ps; [ + pypca + ]; + "emby" = ps: with ps; [ + pyemby + ]; + "emoncms" = ps: with ps; [ + ]; + "emoncms_history" = ps: with ps; [ + ]; + "emonitor" = ps: with ps; [ + aioemonitor + ]; + "emulated_hue" = ps: with ps; [ + aiohttp-cors + ifaddr + ]; + "emulated_kasa" = ps: with ps; [ + sense-energy + ]; + "emulated_roku" = ps: with ps; [ + aiohttp-cors + emulated-roku + ifaddr + ]; + "energy" = ps: with ps; [ + aiohttp-cors + fnvhash + lru-dict + sqlalchemy + ]; + "enigma2" = ps: with ps; [ + openwebifpy + ]; + "enocean" = ps: with ps; [ + enocean + ]; + "enphase_envoy" = ps: with ps; [ + envoy-reader + ]; + "entur_public_transport" = ps: with ps; [ + enturclient + ]; + "environment_canada" = ps: with ps; [ + env-canada + ]; + "envisalink" = ps: with ps; [ + pyenvisalink + ]; + "ephember" = ps: with ps; [ + pyephember + ]; + "epson" = ps: with ps; [ + epson-projector + ]; + "epsonworkforce" = ps: with ps; [ + ]; # missing inputs: epsonprinter + "eq3btsmart" = ps: with ps; [ + construct + ]; # missing inputs: python-eq3bt + "esphome" = ps: with ps; [ + aioesphomeapi + aiohttp-cors + ifaddr + zeroconf + ]; + "etherscan" = ps: with ps; [ + ]; # missing inputs: python-etherscan-api + "eufy" = ps: with ps; [ + ]; # missing inputs: lakeside + "everlights" = ps: with ps; [ + pyeverlights + ]; + "evil_genius_labs" = ps: with ps; [ + pyevilgenius + ]; + "evohome" = ps: with ps; [ + evohome-async + ]; + "ezviz" = ps: with ps; [ + ha-ffmpeg + pyezviz + ]; + "faa_delays" = ps: with ps; [ + faadelays + ]; + "facebook" = ps: with ps; [ + ]; + "facebox" = ps: with ps; [ + ]; + "fail2ban" = ps: with ps; [ + ]; + "familyhub" = ps: with ps; [ + ]; # missing inputs: python-family-hub-local + "fan" = ps: with ps; [ + ]; + "fastdotcom" = ps: with ps; [ + ]; # missing inputs: fastdotcom + "feedreader" = ps: with ps; [ + feedparser + ]; + "ffmpeg" = ps: with ps; [ + ha-ffmpeg + ]; + "ffmpeg_motion" = ps: with ps; [ + ha-ffmpeg + ]; + "ffmpeg_noise" = ps: with ps; [ + ha-ffmpeg + ]; + "fibaro" = ps: with ps; [ + fiblary3-fork + ]; + "fido" = ps: with ps; [ + pyfido + ]; + "file" = ps: with ps; [ + ]; + "filesize" = ps: with ps; [ + ]; + "filter" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "fints" = ps: with ps; [ + fints + ]; + "fireservicerota" = ps: with ps; [ + pyfireservicerota + ]; + "firmata" = ps: with ps; [ + pymata-express + ]; + "fitbit" = ps: with ps; [ + aiohttp-cors + fitbit + ]; + "fivem" = ps: with ps; [ + ]; # missing inputs: fivem-api + "fixer" = ps: with ps; [ + fixerio + ]; + "fjaraskupan" = ps: with ps; [ + fjaraskupan + ]; + "fleetgo" = ps: with ps; [ + ritassist + ]; + "flexit" = ps: with ps; [ + pymodbus + ]; + "flic" = ps: with ps; [ + pyflic + ]; + "flick_electric" = ps: with ps; [ + pyflick + ]; + "flipr" = ps: with ps; [ + flipr-api + ]; + "flo" = ps: with ps; [ + aioflo + ]; + "flock" = ps: with ps; [ + ]; + "flume" = ps: with ps; [ + pyflume + ]; + "flunearyou" = ps: with ps; [ + pyflunearyou + ]; + "flux" = ps: with ps; [ + ]; + "flux_led" = ps: with ps; [ + aiohttp-cors + flux-led + ifaddr + ]; + "folder" = ps: with ps; [ + ]; + "folder_watcher" = ps: with ps; [ + watchdog + ]; + "foobot" = ps: with ps; [ + foobot-async + ]; + "forecast_solar" = ps: with ps; [ + forecast-solar + ]; + "forked_daapd" = ps: with ps; [ + ]; # missing inputs: pyforked-daapd pylibrespot-java + "fortios" = ps: with ps; [ + fortiosapi + ]; + "foscam" = ps: with ps; [ + libpyfoscam + ]; + "foursquare" = ps: with ps; [ + aiohttp-cors + ]; + "free_mobile" = ps: with ps; [ + ]; # missing inputs: freesms + "freebox" = ps: with ps; [ + freebox-api + ]; + "freedns" = ps: with ps; [ + ]; + "freedompro" = ps: with ps; [ + pyfreedompro + ]; + "fritz" = ps: with ps; [ + aiohttp-cors + fritzconnection + ifaddr + xmltodict + ]; + "fritzbox" = ps: with ps; [ + pyfritzhome + ]; + "fritzbox_callmonitor" = ps: with ps; [ + fritzconnection + ]; + "fronius" = ps: with ps; [ + pyfronius + ]; + "frontend" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "frontier_silicon" = ps: with ps; [ + afsapi + ]; + "futurenow" = ps: with ps; [ + pyfnip + ]; + "garadget" = ps: with ps; [ + ]; + "garages_amsterdam" = ps: with ps; [ + garages-amsterdam + ]; + "gc100" = ps: with ps; [ + ]; # missing inputs: python-gc100 + "gdacs" = ps: with ps; [ + aio-georss-gdacs + ]; + "generic" = ps: with ps; [ + av + pillow + ]; + "generic_hygrostat" = ps: with ps; [ + ]; + "generic_thermostat" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "geniushub" = ps: with ps; [ + geniushub-client + ]; + "geo_json_events" = ps: with ps; [ + ]; # missing inputs: aio_geojson_generic_client + "geo_location" = ps: with ps; [ + ]; + "geo_rss_events" = ps: with ps; [ + georss-generic-client + ]; + "geofency" = ps: with ps; [ + aiohttp-cors + ]; + "geonetnz_quakes" = ps: with ps; [ + aio-geojson-geonetnz-quakes + ]; + "geonetnz_volcano" = ps: with ps; [ + aio-geojson-geonetnz-volcano + ]; + "gios" = ps: with ps; [ + gios + ]; + "github" = ps: with ps; [ + aiogithubapi + ]; + "gitlab_ci" = ps: with ps; [ + python-gitlab + ]; + "gitter" = ps: with ps; [ + ]; # missing inputs: gitterpy + "glances" = ps: with ps; [ + glances-api + ]; + "goalfeed" = ps: with ps; [ + ]; # missing inputs: pysher + "goalzero" = ps: with ps; [ + goalzero + ]; + "gogogate2" = ps: with ps; [ + ismartgate + ]; + "goodwe" = ps: with ps; [ + goodwe + ]; + "google" = ps: with ps; [ + aiohttp-cors + google-api-python-client + httplib2 + oauth2client + ]; + "google_assistant" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "google_cloud" = ps: with ps; [ + google-cloud-texttospeech + ]; + "google_domains" = ps: with ps; [ + ]; + "google_maps" = ps: with ps; [ + locationsharinglib + ]; + "google_pubsub" = ps: with ps; [ + google-cloud-pubsub + ]; + "google_translate" = ps: with ps; [ + gtts + ]; + "google_travel_time" = ps: with ps; [ + googlemaps + ]; + "google_wifi" = ps: with ps; [ + ]; + "gpsd" = ps: with ps; [ + gps3 + ]; + "gpslogger" = ps: with ps; [ + aiohttp-cors + ]; + "graphite" = ps: with ps; [ + ]; + "gree" = ps: with ps; [ + greeclimate + ]; + "greeneye_monitor" = ps: with ps; [ + ]; # missing inputs: greeneye_monitor + "greenwave" = ps: with ps; [ + ]; # missing inputs: greenwavereality + "group" = ps: with ps; [ + ]; + "growatt_server" = ps: with ps; [ + growattserver + ]; + "gstreamer" = ps: with ps; [ + ]; # missing inputs: gstreamer-player + "gtfs" = ps: with ps; [ + pygtfs + ]; + "guardian" = ps: with ps; [ + aioguardian + ]; + "habitica" = ps: with ps; [ + habitipy + ]; + "hangouts" = ps: with ps; [ + hangups + ]; + "harman_kardon_avr" = ps: with ps; [ + ]; # missing inputs: hkavr + "harmony" = ps: with ps; [ + aioharmony + ]; + "hassio" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "haveibeenpwned" = ps: with ps; [ + ]; + "hddtemp" = ps: with ps; [ + ]; + "hdmi_cec" = ps: with ps; [ + pycec + ]; + "heatmiser" = ps: with ps; [ + ]; # missing inputs: heatmiserV3 + "heos" = ps: with ps; [ + pyheos + ]; + "here_travel_time" = ps: with ps; [ + herepy + ]; + "hikvision" = ps: with ps; [ + ]; # missing inputs: pyhik + "hikvisioncam" = ps: with ps; [ + hikvision + ]; + "hisense_aehw4a1" = ps: with ps; [ + pyaehw4a1 + ]; + "history" = ps: with ps; [ + aiohttp-cors + fnvhash + lru-dict + sqlalchemy + ]; + "history_stats" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "hitron_coda" = ps: with ps; [ + ]; + "hive" = ps: with ps; [ + pyhiveapi + ]; + "hlk_sw16" = ps: with ps; [ + hlk-sw16 + ]; + "home_connect" = ps: with ps; [ + aiohttp-cors + homeconnect + ]; + "home_plus_control" = ps: with ps; [ + aiohttp-cors + homepluscontrol + ]; + "homeassistant" = ps: with ps; [ + ]; + "homekit" = ps: with ps; [ + hap-python + pyqrcode + pyturbojpeg + aiohttp-cors + base36 + fnvhash + ha-ffmpeg + ifaddr + zeroconf + ]; + "homekit_controller" = ps: with ps; [ + aiohomekit + aiohttp-cors + ifaddr + zeroconf + ]; + "homematic" = ps: with ps; [ + pyhomematic + ]; + "homematicip_cloud" = ps: with ps; [ + homematicip + ]; + "homewizard" = ps: with ps; [ + aiohwenergy + ]; + "homeworks" = ps: with ps; [ + pyhomeworks + ]; + "honeywell" = ps: with ps; [ + somecomfort + ]; + "horizon" = ps: with ps; [ + ]; # missing inputs: horimote + "hp_ilo" = ps: with ps; [ + python-hpilo + ]; + "html5" = ps: with ps; [ + aiohttp-cors + pywebpush + ]; + "http" = ps: with ps; [ + aiohttp-cors + ]; + "huawei_lte" = ps: with ps; [ + huawei-lte-api + stringcase + url-normalize + ]; + "hue" = ps: with ps; [ + aiohue + ]; + "huisbaasje" = ps: with ps; [ + huisbaasje-client + ]; + "humidifier" = ps: with ps; [ + ]; + "hunterdouglas_powerview" = ps: with ps; [ + aiopvapi + ]; + "hvv_departures" = ps: with ps; [ + pygti + ]; + "hydrawise" = ps: with ps; [ + hydrawiser + ]; + "hyperion" = ps: with ps; [ + hyperion-py + ]; + "ialarm" = ps: with ps; [ + pyialarm + ]; + "iammeter" = ps: with ps; [ + ]; # missing inputs: iammeter + "iaqualink" = ps: with ps; [ + iaqualink + ]; + "icloud" = ps: with ps; [ + pyicloud + ]; + "idteck_prox" = ps: with ps; [ + ]; # missing inputs: rfk101py + "ifttt" = ps: with ps; [ + aiohttp-cors + pyfttt + ]; + "iglo" = ps: with ps; [ + ]; # missing inputs: iglo + "ign_sismologia" = ps: with ps; [ + georss-ign-sismologia-client + ]; + "ihc" = ps: with ps; [ + defusedxml + ]; # missing inputs: ihcsdk + "image" = ps: with ps; [ + aiohttp-cors + pillow + ]; + "image_processing" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "imap" = ps: with ps; [ + aioimaplib + ]; + "imap_email_content" = ps: with ps; [ + ]; + "incomfort" = ps: with ps; [ + incomfort-client + ]; + "influxdb" = ps: with ps; [ + influxdb-client + influxdb + ]; + "input_boolean" = ps: with ps; [ + ]; + "input_button" = ps: with ps; [ + ]; + "input_datetime" = ps: with ps; [ + ]; + "input_number" = ps: with ps; [ + ]; + "input_select" = ps: with ps; [ + ]; + "input_text" = ps: with ps; [ + ]; + "insteon" = ps: with ps; [ + pyinsteon + ]; + "integration" = ps: with ps; [ + ]; + "intellifire" = ps: with ps; [ + intellifire4py + ]; + "intent" = ps: with ps; [ + aiohttp-cors + ]; + "intent_script" = ps: with ps; [ + ]; + "intesishome" = ps: with ps; [ + pyintesishome + ]; + "ios" = ps: with ps; [ + aiohttp-cors + ifaddr + zeroconf + ]; + "iotawatt" = ps: with ps; [ + iotawattpy + ]; + "iperf3" = ps: with ps; [ + ]; # missing inputs: iperf3 + "ipma" = ps: with ps; [ + pyipma + ]; + "ipp" = ps: with ps; [ + pyipp + ]; + "iqvia" = ps: with ps; [ + numpy + pyiqvia + ]; + "irish_rail_transport" = ps: with ps; [ + ]; # missing inputs: pyirishrail + "islamic_prayer_times" = ps: with ps; [ + prayer-times-calculator + ]; + "iss" = ps: with ps; [ + ]; # missing inputs: pyiss + "isy994" = ps: with ps; [ + pyisy + ]; + "itach" = ps: with ps; [ + ]; # missing inputs: pyitachip2ir + "itunes" = ps: with ps; [ + ]; + "izone" = ps: with ps; [ + python-izone + ]; + "jellyfin" = ps: with ps; [ + jellyfin-apiclient-python + ]; + "jewish_calendar" = ps: with ps; [ + hdate + ]; + "joaoapps_join" = ps: with ps; [ + ]; # missing inputs: python-join-api + "juicenet" = ps: with ps; [ + python-juicenet + ]; + "kaiterra" = ps: with ps; [ + ]; # missing inputs: kaiterra-async-client + "kaleidescape" = ps: with ps; [ + ]; # missing inputs: pykaleidescape + "kankun" = ps: with ps; [ + ]; + "keba" = ps: with ps; [ + ]; # missing inputs: keba-kecontact + "keenetic_ndms2" = ps: with ps; [ + ndms2-client + ]; + "kef" = ps: with ps; [ + aiokef + getmac + ]; + "keyboard" = ps: with ps; [ + ]; # missing inputs: pyuserinput + "keyboard_remote" = ps: with ps; [ + aionotify + evdev + ]; + "kira" = ps: with ps; [ + pykira + ]; + "kiwi" = ps: with ps; [ + ]; # missing inputs: kiwiki-client + "kmtronic" = ps: with ps; [ + pykmtronic + ]; + "knx" = ps: with ps; [ + xknx + ]; + "kodi" = ps: with ps; [ + aiohttp-cors + pykodi + ]; + "konnected" = ps: with ps; [ + aiohttp-cors + konnected + ]; + "kostal_plenticore" = ps: with ps; [ + ]; # missing inputs: kostal_plenticore + "kraken" = ps: with ps; [ + krakenex + pykrakenapi + ]; + "kulersky" = ps: with ps; [ + pykulersky + ]; + "kwb" = ps: with ps; [ + ]; # missing inputs: pykwb + "lacrosse" = ps: with ps; [ + pylacrosse + ]; + "lametric" = ps: with ps; [ + lmnotify + ]; + "lannouncer" = ps: with ps; [ + ]; + "lastfm" = ps: with ps; [ + pylast + ]; + "launch_library" = ps: with ps; [ + pylaunches + ]; + "lcn" = ps: with ps; [ + pypck + ]; + "lg_netcast" = ps: with ps; [ + pylgnetcast + ]; + "lg_soundbar" = ps: with ps; [ + temescal + ]; + "life360" = ps: with ps; [ + life360 + ]; + "lifx" = ps: with ps; [ + aiolifx + aiolifx-effects + ]; + "lifx_cloud" = ps: with ps; [ + ]; + "light" = ps: with ps; [ + ]; + "lightwave" = ps: with ps; [ + lightwave + ]; + "limitlessled" = ps: with ps; [ + limitlessled + ]; + "linksys_smart" = ps: with ps; [ + ]; + "linode" = ps: with ps; [ + linode-api + ]; + "linux_battery" = ps: with ps; [ + batinfo + ]; + "lirc" = ps: with ps; [ + ]; # missing inputs: python-lirc + "litejet" = ps: with ps; [ + ]; # missing inputs: pylitejet + "litterrobot" = ps: with ps; [ + pylitterbot + ]; + "llamalab_automate" = ps: with ps; [ + ]; + "local_file" = ps: with ps; [ + ]; + "local_ip" = ps: with ps; [ + aiohttp-cors + ifaddr + ]; + "locative" = ps: with ps; [ + aiohttp-cors + ]; + "lock" = ps: with ps; [ + ]; + "logbook" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "logentries" = ps: with ps; [ + ]; + "logger" = ps: with ps; [ + ]; + "logi_circle" = ps: with ps; [ + aiohttp-cors + ha-ffmpeg + ]; # missing inputs: logi_circle + "london_air" = ps: with ps; [ + ]; + "london_underground" = ps: with ps; [ + ]; # missing inputs: london-tube-status + "lookin" = ps: with ps; [ + aiolookin + ]; + "lovelace" = ps: with ps; [ + ]; + "luci" = ps: with ps; [ + openwrt-luci-rpc + ]; + "luftdaten" = ps: with ps; [ + luftdaten + ]; + "lupusec" = ps: with ps; [ + lupupy + ]; + "lutron" = ps: with ps; [ + pylutron + ]; + "lutron_caseta" = ps: with ps; [ + pylutron-caseta + ]; + "lw12wifi" = ps: with ps; [ + ]; # missing inputs: lw12 + "lyric" = ps: with ps; [ + aiohttp-cors + aiolyric + ]; + "magicseaweed" = ps: with ps; [ + ]; # missing inputs: magicseaweed + "mailbox" = ps: with ps; [ + aiohttp-cors + ]; + "mailgun" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: pymailgunner + "manual" = ps: with ps; [ + ]; + "manual_mqtt" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "map" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "marytts" = ps: with ps; [ + ]; # missing inputs: speak2mary + "mastodon" = ps: with ps; [ + mastodon-py + ]; + "matrix" = ps: with ps; [ + matrix-client + ]; + "maxcube" = ps: with ps; [ + maxcube-api + ]; + "mazda" = ps: with ps; [ + pymazda + ]; + "media_extractor" = ps: with ps; [ + aiohttp-cors + youtube-dl-light + ]; + "media_player" = ps: with ps; [ + aiohttp-cors + ]; + "media_source" = ps: with ps; [ + aiohttp-cors + ]; + "mediaroom" = ps: with ps; [ + pymediaroom + ]; + "melcloud" = ps: with ps; [ + pymelcloud + ]; + "melissa" = ps: with ps; [ + ]; # missing inputs: py-melissa-climate + "meraki" = ps: with ps; [ + aiohttp-cors + ]; + "message_bird" = ps: with ps; [ + ]; # missing inputs: messagebird + "met" = ps: with ps; [ + pymetno + ]; + "met_eireann" = ps: with ps; [ + pymeteireann + ]; + "meteo_france" = ps: with ps; [ + ]; # missing inputs: meteofrance-api + "meteoalarm" = ps: with ps; [ + meteoalertapi + ]; + "meteoclimatic" = ps: with ps; [ + pymeteoclimatic + ]; + "metoffice" = ps: with ps; [ + ]; # missing inputs: datapoint + "mfi" = ps: with ps; [ + ]; # missing inputs: mficlient + "microsoft" = ps: with ps; [ + ]; # missing inputs: pycsspeechtts + "microsoft_face" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "microsoft_face_detect" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "microsoft_face_identify" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + ]; + "miflora" = ps: with ps; [ + bluepy + ]; # missing inputs: miflora + "mikrotik" = ps: with ps; [ + librouteros + ]; + "mill" = ps: with ps; [ + mill-local + millheater + ]; + "min_max" = ps: with ps; [ + ]; + "minecraft_server" = ps: with ps; [ + aiodns + getmac + mcstatus + ]; + "minio" = ps: with ps; [ + minio + ]; + "mitemp_bt" = ps: with ps; [ + ]; # missing inputs: mitemp_bt + "mjpeg" = ps: with ps; [ + ]; + "mobile_app" = ps: with ps; [ + pynacl + pyturbojpeg + aiohttp-cors + hass-nabucasa + pillow + ]; + "mochad" = ps: with ps; [ + ]; # missing inputs: pymochad + "modbus" = ps: with ps; [ + pymodbus + ]; + "modem_callerid" = ps: with ps; [ + aiohttp-cors + phone-modem + pyserial + pyudev + ]; + "modern_forms" = ps: with ps; [ + aiomodernforms + ]; + "moehlenhoff_alpha2" = ps: with ps; [ + ]; # missing inputs: moehlenhoff-alpha2 + "mold_indicator" = ps: with ps; [ + ]; + "monoprice" = ps: with ps; [ + ]; # missing inputs: pymonoprice + "moon" = ps: with ps; [ + ]; + "motion_blinds" = ps: with ps; [ + aiohttp-cors + ifaddr + motionblinds + ]; + "motioneye" = ps: with ps; [ + aiohttp-cors + motioneye-client + ]; + "mpd" = ps: with ps; [ + mpd2 + ]; + "mqtt" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "mqtt_eventstream" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "mqtt_json" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "mqtt_room" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "mqtt_statestream" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "msteams" = ps: with ps; [ + pymsteams + ]; + "mullvad" = ps: with ps; [ + mullvad-api + ]; + "mutesync" = ps: with ps; [ + mutesync + ]; + "mvglive" = ps: with ps; [ + PyMVGLive + ]; + "my" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "mycroft" = ps: with ps; [ + ]; # missing inputs: mycroftapi + "myq" = ps: with ps; [ + pymyq + ]; + "mysensors" = ps: with ps; [ + aiohttp-cors + paho-mqtt + pymysensors + ]; + "mystrom" = ps: with ps; [ + aiohttp-cors + python-mystrom + ]; + "mythicbeastsdns" = ps: with ps; [ + mbddns + ]; + "nad" = ps: with ps; [ + nad-receiver + ]; + "nam" = ps: with ps; [ + nettigo-air-monitor + ]; + "namecheapdns" = ps: with ps; [ + defusedxml + ]; + "nanoleaf" = ps: with ps; [ + aionanoleaf + ]; + "neato" = ps: with ps; [ + aiohttp-cors + pybotvac + ]; + "nederlandse_spoorwegen" = ps: with ps; [ + nsapi + ]; + "ness_alarm" = ps: with ps; [ + nessclient + ]; + "nest" = ps: with ps; [ + aiohttp-cors + google-nest-sdm + ha-ffmpeg + python-nest + ]; + "netatmo" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + pyatmo + ]; + "netdata" = ps: with ps; [ + netdata + ]; + "netgear" = ps: with ps; [ + pynetgear + ]; + "netgear_lte" = ps: with ps; [ + eternalegypt + ]; + "netio" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: pynetio + "network" = ps: with ps; [ + aiohttp-cors + ifaddr + ]; + "neurio_energy" = ps: with ps; [ + ]; # missing inputs: neurio + "nexia" = ps: with ps; [ + nexia + ]; + "nextbus" = ps: with ps; [ + ]; # missing inputs: py_nextbusnext + "nextcloud" = ps: with ps; [ + nextcloudmonitor + ]; + "nfandroidtv" = ps: with ps; [ + ]; # missing inputs: notifications-android-tv + "nightscout" = ps: with ps; [ + py-nightscout + ]; + "niko_home_control" = ps: with ps; [ + niko-home-control + ]; + "nilu" = ps: with ps; [ + niluclient + ]; + "nina" = ps: with ps; [ + pynina + ]; + "nissan_leaf" = ps: with ps; [ + pycarwings2 + ]; + "nmap_tracker" = ps: with ps; [ + aiohttp-cors + getmac + ifaddr + netmap + ]; # missing inputs: mac-vendor-lookup + "nmbs" = ps: with ps; [ + ]; # missing inputs: pyrail + "no_ip" = ps: with ps; [ + ]; + "noaa_tides" = ps: with ps; [ + ]; # missing inputs: noaa-coops + "norway_air" = ps: with ps; [ + pymetno + ]; + "notify" = ps: with ps; [ + ]; + "notify_events" = ps: with ps; [ + ]; # missing inputs: notify-events + "notion" = ps: with ps; [ + aionotion + ]; + "nsw_fuel_station" = ps: with ps; [ + ]; # missing inputs: nsw-fuel-api-client + "nsw_rural_fire_service_feed" = ps: with ps; [ + aio-geojson-nsw-rfs-incidents + ]; + "nuheat" = ps: with ps; [ + ]; # missing inputs: nuheat + "nuki" = ps: with ps; [ + pynuki + ]; + "numato" = ps: with ps; [ + ]; # missing inputs: numato-gpio + "number" = ps: with ps; [ + ]; + "nut" = ps: with ps; [ + pynut2 + ]; + "nws" = ps: with ps; [ + pynws + ]; + "nx584" = ps: with ps; [ + pynx584 + ]; + "nzbget" = ps: with ps; [ + ]; # missing inputs: pynzbgetapi + "oasa_telematics" = ps: with ps; [ + ]; # missing inputs: oasatelematics + "obihai" = ps: with ps; [ + pyobihai + ]; + "octoprint" = ps: with ps; [ + pyoctoprintapi + ]; + "oem" = ps: with ps; [ + oemthermostat + ]; + "ohmconnect" = ps: with ps; [ + defusedxml + ]; + "ombi" = ps: with ps; [ + pyombi + ]; + "omnilogic" = ps: with ps; [ + omnilogic + ]; + "onboarding" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "oncue" = ps: with ps; [ + aiooncue + ]; + "ondilo_ico" = ps: with ps; [ + aiohttp-cors + ondilo + ]; + "onewire" = ps: with ps; [ + pi1wire + pyownet + ]; + "onkyo" = ps: with ps; [ + onkyo-eiscp + ]; + "onvif" = ps: with ps; [ + wsdiscovery + ha-ffmpeg + onvif-zeep-async + ]; + "open_meteo" = ps: with ps; [ + open-meteo + ]; + "openalpr_cloud" = ps: with ps; [ + ]; + "openalpr_local" = ps: with ps; [ + ]; + "opencv" = ps: with ps; [ + numpy + ]; # missing inputs: opencv-python-headless + "openerz" = ps: with ps; [ + openerz-api + ]; + "openevse" = ps: with ps; [ + openevsewifi + ]; + "openexchangerates" = ps: with ps; [ + ]; + "opengarage" = ps: with ps; [ + open-garage + ]; + "openhardwaremonitor" = ps: with ps; [ + ]; + "openhome" = ps: with ps; [ + openhomedevice + ]; + "opensensemap" = ps: with ps; [ + opensensemap-api + ]; + "opensky" = ps: with ps; [ + ]; + "opentherm_gw" = ps: with ps; [ + pyotgw + ]; + "openuv" = ps: with ps; [ + pyopenuv + ]; + "openweathermap" = ps: with ps; [ + pyowm + ]; + "opnsense" = ps: with ps; [ + pyopnsense + ]; + "opple" = ps: with ps; [ + ]; # missing inputs: pyoppleio + "oru" = ps: with ps; [ + ]; # missing inputs: oru + "orvibo" = ps: with ps; [ + orvibo + ]; + "osramlightify" = ps: with ps; [ + ]; # missing inputs: lightify + "otp" = ps: with ps; [ + pyotp + ]; + "overkiz" = ps: with ps; [ + pyoverkiz + ]; + "ovo_energy" = ps: with ps; [ + ovoenergy + ]; + "owntracks" = ps: with ps; [ + pynacl + pyturbojpeg + aiohttp-cors + hass-nabucasa + paho-mqtt + ]; + "p1_monitor" = ps: with ps; [ + p1monitor + ]; + "panasonic_bluray" = ps: with ps; [ + panacotta + ]; + "panasonic_viera" = ps: with ps; [ + ]; # missing inputs: panasonic_viera + "pandora" = ps: with ps; [ + pexpect + ]; + "panel_custom" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "panel_iframe" = ps: with ps; [ + aiohttp-cors + fnvhash + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "peco" = ps: with ps; [ + ]; # missing inputs: peco + "pencom" = ps: with ps; [ + ]; # missing inputs: pencompy + "persistent_notification" = ps: with ps; [ + ]; + "person" = ps: with ps; [ + aiohttp-cors + pillow + ]; + "philips_js" = ps: with ps; [ + ha-philipsjs + ]; + "pi_hole" = ps: with ps; [ + hole + ]; + "picnic" = ps: with ps; [ + python-picnic-api + ]; + "picotts" = ps: with ps; [ + ]; + "pilight" = ps: with ps; [ + ]; # missing inputs: pilight + "ping" = ps: with ps; [ + icmplib + ]; + "pioneer" = ps: with ps; [ + ]; + "pjlink" = ps: with ps; [ + ]; # missing inputs: pypjlink2 + "plaato" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + pyplaato + ]; + "plant" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "plex" = ps: with ps; [ + aiohttp-cors + plexapi + plexauth + plexwebsocket + ]; + "plugwise" = ps: with ps; [ + plugwise + ]; + "plum_lightpad" = ps: with ps; [ + ]; # missing inputs: plumlightpad + "pocketcasts" = ps: with ps; [ + ]; # missing inputs: pycketcasts + "point" = ps: with ps; [ + aiohttp-cors + pypoint + ]; + "poolsense" = ps: with ps; [ + poolsense + ]; + "powerwall" = ps: with ps; [ + ]; # missing inputs: tesla-powerwall + "profiler" = ps: with ps; [ + guppy3 + objgraph + pyprof2calltree + ]; + "progettihwsw" = ps: with ps; [ + ]; # missing inputs: progettihwsw + "proliphix" = ps: with ps; [ + ]; # missing inputs: proliphix + "prometheus" = ps: with ps; [ + aiohttp-cors + prometheus-client + ]; + "prosegur" = ps: with ps; [ + pyprosegur + ]; + "prowl" = ps: with ps; [ + ]; + "proximity" = ps: with ps; [ + ]; + "proxmoxve" = ps: with ps; [ + proxmoxer + ]; + "proxy" = ps: with ps; [ + pillow + ]; + "ps4" = ps: with ps; [ + ]; # missing inputs: pyps4-2ndscreen + "pulseaudio_loopback" = ps: with ps; [ + pulsectl + ]; + "pure_energie" = ps: with ps; [ + gridnet + ]; + "push" = ps: with ps; [ + aiohttp-cors + ]; + "pushbullet" = ps: with ps; [ + pushbullet + ]; + "pushover" = ps: with ps; [ + pushover-complete + ]; + "pushsafer" = ps: with ps; [ + ]; + "pvoutput" = ps: with ps; [ + pvo + ]; + "pvpc_hourly_pricing" = ps: with ps; [ + aiopvpc + ]; + "pyload" = ps: with ps; [ + ]; + "python_script" = ps: with ps; [ + restrictedpython + ]; + "qbittorrent" = ps: with ps; [ + ]; # missing inputs: python-qbittorrent + "qld_bushfire" = ps: with ps; [ + georss-qld-bushfire-alert-client + ]; + "qnap" = ps: with ps; [ + ]; # missing inputs: qnapstats + "qrcode" = ps: with ps; [ + pillow + pyzbar + ]; + "quantum_gateway" = ps: with ps; [ + quantum-gateway + ]; + "qvr_pro" = ps: with ps; [ + pyqvrpro + ]; + "qwikswitch" = ps: with ps; [ + ]; # missing inputs: pyqwikswitch + "rachio" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + rachiopy + ]; + "radarr" = ps: with ps; [ + ]; + "radio_browser" = ps: with ps; [ + radios + ]; + "radiotherm" = ps: with ps; [ + radiotherm + ]; + "rainbird" = ps: with ps; [ + ]; # missing inputs: pyrainbird + "raincloud" = ps: with ps; [ + ]; # missing inputs: raincloudy + "rainforest_eagle" = ps: with ps; [ + aioeagle + ueagle + ]; + "rainmachine" = ps: with ps; [ + regenmaschine + ]; + "random" = ps: with ps; [ + ]; + "raspyrfm" = ps: with ps; [ + ]; # missing inputs: raspyrfm-client + "rdw" = ps: with ps; [ + vehicle + ]; + "recollect_waste" = ps: with ps; [ + aiorecollect + ]; + "recorder" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "recswitch" = ps: with ps; [ + ]; # missing inputs: pyrecswitch + "reddit" = ps: with ps; [ + praw + ]; + "rejseplanen" = ps: with ps; [ + ]; # missing inputs: rjpl + "remember_the_milk" = ps: with ps; [ + httplib2 + ]; # missing inputs: RtmAPI + "remote" = ps: with ps; [ + ]; + "remote_rpi_gpio" = ps: with ps; [ + ]; # missing inputs: gpiozero + "renault" = ps: with ps; [ + renault-api + ]; + "repetier" = ps: with ps; [ + ]; # missing inputs: pyrepetierng + "rest" = ps: with ps; [ + jsonpath + xmltodict + ]; + "rest_command" = ps: with ps; [ + ]; + "rflink" = ps: with ps; [ + rflink + ]; + "rfxtrx" = ps: with ps; [ + pyrfxtrx + ]; + "ridwell" = ps: with ps; [ + aioridwell + ]; + "ring" = ps: with ps; [ + ha-ffmpeg + ring-doorbell + ]; + "ripple" = ps: with ps; [ + ]; # missing inputs: python-ripple-api + "risco" = ps: with ps; [ + pyrisco + ]; + "rituals_perfume_genie" = ps: with ps; [ + pyrituals + ]; + "rmvtransport" = ps: with ps; [ + pyrmvtransport + ]; + "rocketchat" = ps: with ps; [ + ]; # missing inputs: rocketchat-API + "roku" = ps: with ps; [ + rokuecp + ]; + "roomba" = ps: with ps; [ + roombapy + ]; + "roon" = ps: with ps; [ + roonapi + ]; + "route53" = ps: with ps; [ + boto3 + ]; + "rova" = ps: with ps; [ + ]; # missing inputs: rova + "rpi_camera" = ps: with ps; [ + ]; + "rpi_gpio" = ps: with ps; [ + ]; # missing inputs: RPi.GPIO + "rpi_power" = ps: with ps; [ + rpi-bad-power + ]; + "rss_feed_template" = ps: with ps; [ + aiohttp-cors + ]; + "rtorrent" = ps: with ps; [ + ]; + "rtsp_to_webrtc" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + rtsp-to-webrtc + ]; + "ruckus_unleashed" = ps: with ps; [ + pyruckus + ]; + "russound_rio" = ps: with ps; [ + ]; # missing inputs: russound_rio + "russound_rnet" = ps: with ps; [ + ]; # missing inputs: russound + "sabnzbd" = ps: with ps; [ + aiohttp-cors + ifaddr + netdisco + zeroconf + ]; # missing inputs: pysabnzbd + "safe_mode" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + fnvhash + hass-nabucasa + home-assistant-frontend + lru-dict + pillow + sqlalchemy + ]; + "saj" = ps: with ps; [ + ]; # missing inputs: pysaj + "samsungtv" = ps: with ps; [ + aiohttp-cors + async-upnp-client + getmac + ifaddr + samsungctl + samsungtvws + wakeonlan + zeroconf + ] + ++ samsungctl.extras-require.websocket + ++ samsungtvws.extras-require.async + ++ samsungtvws.extras-require.encrypted; + "satel_integra" = ps: with ps; [ + ]; # missing inputs: satel_integra + "scene" = ps: with ps; [ + ]; + "schluter" = ps: with ps; [ + ]; # missing inputs: py-schluter + "scrape" = ps: with ps; [ + beautifulsoup4 + jsonpath + xmltodict + ]; + "screenlogic" = ps: with ps; [ + screenlogicpy + ]; + "script" = ps: with ps; [ + ]; + "scsgate" = ps: with ps; [ + ]; # missing inputs: scsgate + "search" = ps: with ps; [ + aiohttp-cors + ]; + "season" = ps: with ps; [ + ephem + ]; + "select" = ps: with ps; [ + ]; + "sendgrid" = ps: with ps; [ + sendgrid + ]; + "sense" = ps: with ps; [ + sense-energy + ]; + "senseme" = ps: with ps; [ + aiosenseme + ]; + "sensibo" = ps: with ps; [ + ]; # missing inputs: pysensibo + "sensor" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "sentry" = ps: with ps; [ + sentry-sdk + ]; + "serial" = ps: with ps; [ + pyserial-asyncio + ]; + "serial_pm" = ps: with ps; [ + pmsensor + ]; + "sesame" = ps: with ps; [ + ]; # missing inputs: pysesame2 + "seven_segments" = ps: with ps; [ + pillow + ]; + "seventeentrack" = ps: with ps; [ + py17track + ]; + "sharkiq" = ps: with ps; [ + ]; # missing inputs: sharkiq + "shell_command" = ps: with ps; [ + ]; + "shelly" = ps: with ps; [ + aioshelly + ]; + "shiftr" = ps: with ps; [ + paho-mqtt + ]; + "shodan" = ps: with ps; [ + shodan + ]; + "shopping_list" = ps: with ps; [ + aiohttp-cors + ]; + "sia" = ps: with ps; [ + pysiaalarm + ]; + "sigfox" = ps: with ps; [ + ]; + "sighthound" = ps: with ps; [ + pillow + simplehound + ]; + "signal_messenger" = ps: with ps; [ + pysignalclirestapi + ]; + "simplepush" = ps: with ps; [ + ]; # missing inputs: simplepush + "simplisafe" = ps: with ps; [ + simplisafe-python + ]; + "simulated" = ps: with ps; [ + ]; + "sinch" = ps: with ps; [ + ]; # missing inputs: clx-sdk-xms + "siren" = ps: with ps; [ + ]; + "sisyphus" = ps: with ps; [ + ]; # missing inputs: sisyphus-control + "sky_hub" = ps: with ps; [ + pyskyqhub + ]; + "skybeacon" = ps: with ps; [ + pygatt + ] + ++ pygatt.extras-require.GATTTOOL; + "skybell" = ps: with ps; [ + skybellpy + ]; + "slack" = ps: with ps; [ + slackclient + ]; + "sleepiq" = ps: with ps; [ + asyncsleepiq + ]; + "slide" = ps: with ps; [ + ]; # missing inputs: goslide-api + "sma" = ps: with ps; [ + pysma + ]; + "smappee" = ps: with ps; [ + aiohttp-cors + pysmappee + ]; + "smart_meter_texas" = ps: with ps; [ + smart-meter-texas + ]; + "smartthings" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + pysmartapp + pysmartthings + ]; + "smarttub" = ps: with ps; [ + python-smarttub + ]; + "smarty" = ps: with ps; [ + ]; # missing inputs: pysmarty + "smhi" = ps: with ps; [ + smhi-pkg + ]; + "sms" = ps: with ps; [ + python-gammu + ]; + "smtp" = ps: with ps; [ + ]; + "snapcast" = ps: with ps; [ + snapcast + ]; + "snips" = ps: with ps; [ + aiohttp-cors + paho-mqtt + ]; + "snmp" = ps: with ps; [ + pysnmp + ]; + "solaredge" = ps: with ps; [ + solaredge + stringcase + ]; + "solaredge_local" = ps: with ps; [ + ]; # missing inputs: solaredge-local + "solarlog" = ps: with ps; [ + sunwatcher + ]; + "solax" = ps: with ps; [ + solax + ]; + "soma" = ps: with ps; [ + pysoma + ]; + "somfy" = ps: with ps; [ + aiohttp-cors + pymfy + ]; + "somfy_mylink" = ps: with ps; [ + somfy-mylink-synergy + ]; + "sonarr" = ps: with ps; [ + aiopyarr + ]; + "songpal" = ps: with ps; [ + python-songpal + ]; + "sonos" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + plexapi + plexauth + plexwebsocket + soco + spotipy + zeroconf + ]; + "sony_projector" = ps: with ps; [ + pysdcp + ]; + "soundtouch" = ps: with ps; [ + aiohttp-cors + ifaddr + libsoundtouch + zeroconf + ]; + "spaceapi" = ps: with ps; [ + aiohttp-cors + ]; + "spc" = ps: with ps; [ + pyspcwebgw + ]; + "speedtestdotnet" = ps: with ps; [ + speedtest-cli + ]; + "spider" = ps: with ps; [ + spiderpy + ]; + "splunk" = ps: with ps; [ + ]; # missing inputs: hass_splunk + "spotify" = ps: with ps; [ + aiohttp-cors + spotipy + ]; + "sql" = ps: with ps; [ + sqlalchemy + ]; + "squeezebox" = ps: with ps; [ + pysqueezebox + ]; + "srp_energy" = ps: with ps; [ + srpenergy + ]; + "ssdp" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + zeroconf + ]; + "starline" = ps: with ps; [ + starline + ]; + "starlingbank" = ps: with ps; [ + ]; # missing inputs: starlingbank + "startca" = ps: with ps; [ + xmltodict + ]; + "statistics" = ps: with ps; [ + fnvhash + lru-dict + sqlalchemy + ]; + "statsd" = ps: with ps; [ + statsd + ]; + "steam_online" = ps: with ps; [ + ]; # missing inputs: steamodd + "steamist" = ps: with ps; [ + aiohttp-cors + aiosteamist + discovery30303 + ifaddr + ]; + "stiebel_eltron" = ps: with ps; [ + pymodbus + ]; # missing inputs: pystiebeleltron + "stookalert" = ps: with ps; [ + ]; # missing inputs: stookalert + "stream" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + av + ]; + "streamlabswater" = ps: with ps; [ + streamlabswater + ]; + "stt" = ps: with ps; [ + aiohttp-cors + ]; + "subaru" = ps: with ps; [ + subarulink + ]; + "suez_water" = ps: with ps; [ + ]; # missing inputs: pysuez + "sun" = ps: with ps; [ + ]; + "supervisord" = ps: with ps; [ + ]; + "supla" = ps: with ps; [ + ]; # missing inputs: asyncpysupla + "surepetcare" = ps: with ps; [ + surepy + ]; + "swiss_hydrological_data" = ps: with ps; [ + swisshydrodata + ]; + "swiss_public_transport" = ps: with ps; [ + python-opendata-transport + ]; + "swisscom" = ps: with ps; [ + ]; + "switch" = ps: with ps; [ + ]; + "switch_as_x" = ps: with ps; [ + ]; + "switchbot" = ps: with ps; [ + pyswitchbot + ]; + "switcher_kis" = ps: with ps; [ + aioswitcher + ]; + "switchmate" = ps: with ps; [ + ]; # missing inputs: pySwitchmate + "syncthing" = ps: with ps; [ + aiosyncthing + ]; + "syncthru" = ps: with ps; [ + pysyncthru + url-normalize + ]; + "synology_chat" = ps: with ps; [ + ]; + "synology_dsm" = ps: with ps; [ + py-synologydsm-api + ]; + "synology_srm" = ps: with ps; [ + ]; # missing inputs: synology-srm + "syslog" = ps: with ps; [ + ]; + "system_bridge" = ps: with ps; [ + aiohttp-cors + ifaddr + systembridge + zeroconf + ]; + "system_health" = ps: with ps; [ + aiohttp-cors + ]; + "system_log" = ps: with ps; [ + ]; + "systemmonitor" = ps: with ps; [ + psutil + ]; + "tado" = ps: with ps; [ + python-tado + ]; + "tag" = ps: with ps; [ + ]; + "tailscale" = ps: with ps; [ + tailscale + ]; + "tank_utility" = ps: with ps; [ + ]; # missing inputs: tank_utility + "tankerkoenig" = ps: with ps; [ + pytankerkoenig + ]; + "tapsaff" = ps: with ps; [ + ]; # missing inputs: tapsaff + "tasmota" = ps: with ps; [ + aiohttp-cors + hatasmota + paho-mqtt + ]; + "tautulli" = ps: with ps; [ + pytautulli + ]; + "tcp" = ps: with ps; [ + ]; + "ted5000" = ps: with ps; [ + xmltodict + ]; + "telegram" = ps: with ps; [ + pysocks + aiohttp-cors + python-telegram-bot + ]; + "telegram_bot" = ps: with ps; [ + pysocks + aiohttp-cors + python-telegram-bot + ]; + "tellduslive" = ps: with ps; [ + tellduslive + ]; + "tellstick" = ps: with ps; [ + ]; # missing inputs: tellcore-net tellcore-py + "telnet" = ps: with ps; [ + ]; + "temper" = ps: with ps; [ + ]; # missing inputs: temperusb + "template" = ps: with ps; [ + ]; + "tensorflow" = ps: with ps; [ + numpy + pillow + pycocotools + tensorflow + ]; # missing inputs: tf-models-official + "tesla_wall_connector" = ps: with ps; [ + tesla-wall-connector + ]; + "tfiac" = ps: with ps; [ + ]; # missing inputs: pytfiac + "thermoworks_smoke" = ps: with ps; [ + stringcase + ]; # missing inputs: thermoworks_smoke + "thethingsnetwork" = ps: with ps; [ + ]; + "thingspeak" = ps: with ps; [ + ]; # missing inputs: thingspeak + "thinkingcleaner" = ps: with ps; [ + ]; # missing inputs: pythinkingcleaner + "thomson" = ps: with ps; [ + ]; + "threshold" = ps: with ps; [ + ]; + "tibber" = ps: with ps; [ + fnvhash + lru-dict + pytibber + sqlalchemy + ]; + "tikteck" = ps: with ps; [ + ]; # missing inputs: tikteck + "tile" = ps: with ps; [ + pytile + ]; + "time_date" = ps: with ps; [ + ]; + "timer" = ps: with ps; [ + ]; + "tmb" = ps: with ps; [ + tmb + ]; + "tod" = ps: with ps; [ + ]; + "todoist" = ps: with ps; [ + todoist + ]; + "tolo" = ps: with ps; [ + tololib + ]; + "tomato" = ps: with ps; [ + ]; + "tomorrowio" = ps: with ps; [ + ]; # missing inputs: pytomorrowio + "toon" = ps: with ps; [ + pyturbojpeg + aiohttp-cors + hass-nabucasa + toonapi + ]; + "torque" = ps: with ps; [ + aiohttp-cors + ]; + "totalconnect" = ps: with ps; [ + total-connect-client + ]; + "touchline" = ps: with ps; [ + ]; # missing inputs: pytouchline + "tplink" = ps: with ps; [ + aiohttp-cors + ifaddr + python-kasa + ]; + "tplink_lte" = ps: with ps; [ + ]; # missing inputs: tp-connected + "traccar" = ps: with ps; [ + aiohttp-cors + pytraccar + stringcase + ]; + "trace" = ps: with ps; [ + ]; + "tractive" = ps: with ps; [ + aiotractive + ]; + "tradfri" = ps: with ps; [ + pytradfri + ] + ++ pytradfri.extras-require.async; + "trafikverket_train" = ps: with ps; [ + pytrafikverket + ]; + "trafikverket_weatherstation" = ps: with ps; [ + pytrafikverket + ]; + "transmission" = ps: with ps; [ + transmissionrpc + ]; + "transport_nsw" = ps: with ps; [ + pytransportnsw + ]; + "travisci" = ps: with ps; [ + ]; # missing inputs: TravisPy + "trend" = ps: with ps; [ + numpy + ]; + "tts" = ps: with ps; [ + aiohttp-cors + mutagen + ]; + "tuya" = ps: with ps; [ + ha-ffmpeg + tuya-iot-py-sdk + ]; + "twentemilieu" = ps: with ps; [ + twentemilieu + ]; + "twilio" = ps: with ps; [ + aiohttp-cors + twilio + ]; + "twilio_call" = ps: with ps; [ + aiohttp-cors + twilio + ]; + "twilio_sms" = ps: with ps; [ + aiohttp-cors + twilio + ]; + "twinkly" = ps: with ps; [ + ttls + ]; + "twitch" = ps: with ps; [ + twitchapi + ]; + "twitter" = ps: with ps; [ + twitterapi + ]; + "ubus" = ps: with ps; [ + openwrt-ubus-rpc + ]; + "ue_smart_radio" = ps: with ps; [ + ]; + "uk_transport" = ps: with ps; [ + ]; + "unifi" = ps: with ps; [ + aiounifi + ]; + "unifi_direct" = ps: with ps; [ + pexpect + ]; + "unifiled" = ps: with ps; [ + unifiled + ]; + "unifiprotect" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: pyunifiprotect unifi-discovery + "universal" = ps: with ps; [ + ]; + "upb" = ps: with ps; [ + upb-lib + ]; + "upc_connect" = ps: with ps; [ + connect-box + ]; + "upcloud" = ps: with ps; [ + upcloud-api + ]; + "update" = ps: with ps; [ + ]; + "updater" = ps: with ps; [ + ]; + "upnp" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + zeroconf + ]; + "uptime" = ps: with ps; [ + ]; + "uptimerobot" = ps: with ps; [ + pyuptimerobot + ]; + "usb" = ps: with ps; [ + aiohttp-cors + pyserial + pyudev + ]; + "uscis" = ps: with ps; [ + ]; # missing inputs: uscisstatus + "usgs_earthquakes_feed" = ps: with ps; [ + geojson-client + ]; + "utility_meter" = ps: with ps; [ + croniter + ]; + "uvc" = ps: with ps; [ + uvcclient + ]; + "vacuum" = ps: with ps; [ + ]; + "vallox" = ps: with ps; [ + ]; # missing inputs: vallox-websocket-api + "vasttrafik" = ps: with ps; [ + ]; # missing inputs: vtjp + "velbus" = ps: with ps; [ + aiohttp-cors + pyserial + pyudev + velbus-aio + ]; + "velux" = ps: with ps; [ + pyvlx + ]; + "venstar" = ps: with ps; [ + venstarcolortouch + ]; + "vera" = ps: with ps; [ + pyvera + ]; + "verisure" = ps: with ps; [ + vsure + ]; + "versasense" = ps: with ps; [ + pyversasense + ]; + "version" = ps: with ps; [ + pyhaversion + ]; + "vesync" = ps: with ps; [ + pyvesync + ]; + "viaggiatreno" = ps: with ps; [ + ]; + "vicare" = ps: with ps; [ + pyvicare + ]; + "vilfo" = ps: with ps; [ + vilfo-api-client + ]; + "vivotek" = ps: with ps; [ + libpyvivotek + ]; + "vizio" = ps: with ps; [ + pyvizio + ]; + "vlc" = ps: with ps; [ + python-vlc + ]; + "vlc_telnet" = ps: with ps; [ + aiovlc + ]; + "voicerss" = ps: with ps; [ + ]; + "volkszaehler" = ps: with ps; [ + volkszaehler + ]; + "volumio" = ps: with ps; [ + pyvolumio + ]; + "volvooncall" = ps: with ps; [ + volvooncall + ]; + "vulcan" = ps: with ps; [ + vulcan-api + ]; + "vultr" = ps: with ps; [ + vultr + ]; + "w800rf32" = ps: with ps; [ + ]; # missing inputs: pyW800rf32 + "wake_on_lan" = ps: with ps; [ + wakeonlan + ]; + "wallbox" = ps: with ps; [ + wallbox + ]; + "waqi" = ps: with ps; [ + waqiasync + ]; + "water_heater" = ps: with ps; [ + ]; + "waterfurnace" = ps: with ps; [ + waterfurnace + ]; + "watson_iot" = ps: with ps; [ + ]; # missing inputs: ibmiotf + "watson_tts" = ps: with ps; [ + ibm-watson + ]; + "watttime" = ps: with ps; [ + aiowatttime + ]; + "waze_travel_time" = ps: with ps; [ + wazeroutecalculator + ]; + "weather" = ps: with ps; [ + ]; + "webhook" = ps: with ps; [ + aiohttp-cors + ]; + "webostv" = ps: with ps; [ + aiowebostv + ]; + "websocket_api" = ps: with ps; [ + aiohttp-cors + ]; + "wemo" = ps: with ps; [ + pywemo + ]; + "whirlpool" = ps: with ps; [ + whirlpool-sixth-sense + ]; + "whois" = ps: with ps; [ + whois + ]; + "wiffi" = ps: with ps; [ + wiffi + ]; + "wilight" = ps: with ps; [ + pywilight + ]; + "wirelesstag" = ps: with ps; [ + ]; # missing inputs: wirelesstagpy + "withings" = ps: with ps; [ + aiohttp-cors + ]; # missing inputs: withings-api + "wiz" = ps: with ps; [ + aiohttp-cors + ifaddr + pywizlight + ]; + "wled" = ps: with ps; [ + wled + ]; + "wolflink" = ps: with ps; [ + ]; # missing inputs: wolf_smartset + "workday" = ps: with ps; [ + holidays + ]; + "worldclock" = ps: with ps; [ + ]; + "worldtidesinfo" = ps: with ps; [ + ]; + "worxlandroid" = ps: with ps; [ + ]; + "wsdot" = ps: with ps; [ + ]; + "x10" = ps: with ps; [ + ]; + "xbox" = ps: with ps; [ + aiohttp-cors + xbox-webapi + ]; + "xbox_live" = ps: with ps; [ + xboxapi + ]; + "xeoma" = ps: with ps; [ + pyxeoma + ]; + "xiaomi" = ps: with ps; [ + ha-ffmpeg + ]; + "xiaomi_aqara" = ps: with ps; [ + pyxiaomigateway + aiohttp-cors + ifaddr + netdisco + zeroconf + ]; + "xiaomi_miio" = ps: with ps; [ + construct + micloud + python-miio + ]; + "xiaomi_tv" = ps: with ps; [ + pymitv + ]; + "xmpp" = ps: with ps; [ + slixmpp + ]; + "xs1" = ps: with ps; [ + ]; # missing inputs: xs1-api-client + "yale_smart_alarm" = ps: with ps; [ + yalesmartalarmclient + ]; + "yamaha" = ps: with ps; [ + rxv + ]; + "yamaha_musiccast" = ps: with ps; [ + aiohttp-cors + aiomusiccast + async-upnp-client + ifaddr + zeroconf + ]; + "yandex_transport" = ps: with ps; [ + aioymaps + ]; + "yandextts" = ps: with ps; [ + ]; + "yeelight" = ps: with ps; [ + aiohttp-cors + async-upnp-client + ifaddr + yeelight + zeroconf + ]; + "yeelightsunflower" = ps: with ps; [ + ]; # missing inputs: yeelightsunflower + "yi" = ps: with ps; [ + aioftp + ha-ffmpeg + ]; + "youless" = ps: with ps; [ + youless-api + ]; + "zabbix" = ps: with ps; [ + py-zabbix + ]; + "zamg" = ps: with ps; [ + ]; + "zengge" = ps: with ps; [ + bluepy + ]; # missing inputs: zengge + "zeroconf" = ps: with ps; [ + aiohttp-cors + ifaddr + zeroconf + ]; + "zerproc" = ps: with ps; [ + pyzerproc + ]; + "zestimate" = ps: with ps; [ + xmltodict + ]; + "zha" = ps: with ps; [ + aiohttp-cors + bellows + ifaddr + pyserial-asyncio + pyserial + pyudev + zeroconf + zha-quirks + zigpy-deconz + zigpy-xbee + zigpy-zigate + zigpy-znp + zigpy + ]; + "zhong_hong" = ps: with ps; [ + ]; # missing inputs: zhong_hong_hvac + "ziggo_mediabox_xl" = ps: with ps; [ + ]; # missing inputs: ziggo-mediabox-xl + "zodiac" = ps: with ps; [ + ]; + "zone" = ps: with ps; [ + ]; + "zoneminder" = ps: with ps; [ + zm-py + ]; + "zwave_js" = ps: with ps; [ + aiohttp-cors + pyserial + pyudev + zwave-js-server-python + ]; + "zwave_me" = ps: with ps; [ + aiohttp-cors + ifaddr + url-normalize + zeroconf + ]; # missing inputs: zwave_me_ws }; # components listed in tests/components for which all dependencies are packaged supportedComponentsWithTests = [