summary refs log tree commit diff
path: root/pkgs/servers/home-assistant
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers/home-assistant')
-rw-r--r--pkgs/servers/home-assistant/0001-setup.py-relax-dependencies.patch48
-rw-r--r--pkgs/servers/home-assistant/component-packages.nix165
-rw-r--r--pkgs/servers/home-assistant/default.nix26
-rw-r--r--pkgs/servers/home-assistant/esphome.nix61
-rw-r--r--pkgs/servers/home-assistant/frontend.nix4
-rwxr-xr-xpkgs/servers/home-assistant/parse-requirements.py11
-rw-r--r--pkgs/servers/home-assistant/relax-dependencies.patch21
-rw-r--r--pkgs/servers/home-assistant/test-timeout.patch13
-rwxr-xr-xpkgs/servers/home-assistant/update.sh34
9 files changed, 181 insertions, 202 deletions
diff --git a/pkgs/servers/home-assistant/0001-setup.py-relax-dependencies.patch b/pkgs/servers/home-assistant/0001-setup.py-relax-dependencies.patch
deleted file mode 100644
index 0b9dd3e447d..00000000000
--- a/pkgs/servers/home-assistant/0001-setup.py-relax-dependencies.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 9d730514540929dc95a7313bdb385bab95d9a28c Mon Sep 17 00:00:00 2001
-From: Martin Weinelt <hexa@darmstadt.ccc.de>
-Date: Wed, 20 May 2020 23:23:23 +0200
-Subject: [PATCH] setup.py: relax dependencies
-
----
- setup.py | 14 +++++++-------
- 1 file changed, 7 insertions(+), 7 deletions(-)
-
-diff --git a/setup.py b/setup.py
-index 1473fd1f5f..149af58b3a 100755
---- a/setup.py
-+++ b/setup.py
-@@ -32,24 +32,24 @@ PROJECT_URLS = {
- PACKAGES = find_packages(exclude=["tests", "tests.*"])
- 
- REQUIRES = [
--    "aiohttp==3.6.1",
-+    "aiohttp>=3.6.1",
-     "astral==1.10.1",
-     "async_timeout==3.0.1",
-     "attrs==19.3.0",
-     "bcrypt==3.1.7",
-     "certifi>=2020.4.5.1",
-     "ciso8601==2.1.3",
--    "importlib-metadata==1.6.0",
-+    "importlib-metadata>=1.5.0",
-     "jinja2>=2.11.1",
-     "PyJWT==1.7.1",
-     # PyJWT has loose dependency. We want the latest one.
--    "cryptography==2.9.2",
-+    "cryptography>=2.9",
-     "pip>=8.0.3",
-     "python-slugify==4.0.0",
--    "pytz>=2020.1",
--    "pyyaml==5.3.1",
--    "requests==2.23.0",
--    "ruamel.yaml==0.15.100",
-+    "pytz>=2019.03",
-+    "pyyaml>=5.2",
-+    "requests>=2.22",
-+    "ruamel.yaml>=0.15.100",
-     "voluptuous==0.11.7",
-     "voluptuous-serialize==2.3.0",
- ]
--- 
-2.26.2
-
diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix
index aff2e9dc0cb..4290599cbf8 100644
--- a/pkgs/servers/home-assistant/component-packages.nix
+++ b/pkgs/servers/home-assistant/component-packages.nix
@@ -2,10 +2,12 @@
 # Do not edit!
 
 {
-  version = "0.110.1";
+  version = "0.114.2";
   components = {
     "abode" = ps: with ps; [ ]; # missing inputs: abodepy
+    "accuweather" = ps: with ps; [ ]; # missing inputs: accuweather
     "acer_projector" = ps: with ps; [ pyserial];
+    "acmeda" = ps: with ps; [ ]; # missing inputs: aiopulse
     "actiontec" = ps: with ps; [ ];
     "adguard" = ps: with ps; [ ]; # missing inputs: adguardhome
     "ads" = ps: with ps; [ ]; # missing inputs: pyads
@@ -16,7 +18,7 @@
     "airvisual" = ps: with ps; [ pyairvisual];
     "aladdin_connect" = ps: with ps; [ ]; # missing inputs: aladdin_connect
     "alarm_control_panel" = ps: with ps; [ ];
-    "alarmdecoder" = ps: with ps; [ alarmdecoder];
+    "alarmdecoder" = ps: with ps; [ ]; # missing inputs: adext
     "alert" = ps: with ps; [ ];
     "alexa" = ps: with ps; [ aiohttp-cors];
     "almond" = ps: with ps; [ aiohttp-cors]; # missing inputs: pyalmond
@@ -27,14 +29,14 @@
     "amcrest" = ps: with ps; [ ha-ffmpeg]; # missing inputs: amcrest
     "ampio" = ps: with ps; [ ]; # missing inputs: asmog
     "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam
-    "androidtv" = ps: with ps; [ ]; # missing inputs: adb-shell androidtv pure-python-adb
+    "androidtv" = ps: with ps; [ ]; # missing inputs: adb-shell[async] androidtv[async] 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; [ ]; # missing inputs: apcaccess
     "api" = ps: with ps; [ aiohttp-cors];
     "apns" = ps: with ps; [ ]; # missing inputs: apns2
-    "apple_tv" = ps: with ps; [ pyatv];
+    "apple_tv" = ps: with ps; [ aiohttp-cors netdisco pyatv zeroconf];
     "apprise" = ps: with ps; [ apprise];
     "aprs" = ps: with ps; [ ]; # missing inputs: aprslib geopy
     "aqualogic" = ps: with ps; [ ]; # missing inputs: aqualogic
@@ -45,7 +47,7 @@
     "arlo" = ps: with ps; [ ha-ffmpeg]; # missing inputs: pyarlo
     "arris_tg2492lg" = ps: with ps; [ ]; # missing inputs: arris-tg2492lg
     "aruba" = ps: with ps; [ pexpect];
-    "arwn" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "arwn" = ps: with ps; [ aiohttp-cors paho-mqtt];
     "asterisk_cdr" = ps: with ps; [ ]; # missing inputs: asterisk_mbox
     "asterisk_mbox" = ps: with ps; [ ]; # missing inputs: asterisk_mbox
     "asuswrt" = ps: with ps; [ ]; # missing inputs: aioasuswrt
@@ -56,14 +58,14 @@
     "aurora" = ps: with ps; [ ];
     "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy
     "auth" = ps: with ps; [ aiohttp-cors];
-    "automatic" = ps: with ps; [ aiohttp-cors]; # missing inputs: aioautomatic
-    "automation" = ps: with ps; [ ];
+    "automation" = ps: with ps; [ aiohttp-cors];
     "avea" = ps: with ps; [ ]; # missing inputs: avea
     "avion" = ps: with ps; [ ]; # missing inputs: avion
-    "avri" = ps: with ps; [ ]; # missing inputs: avri-api
+    "avri" = ps: with ps; [ pycountry]; # missing inputs: avri-api
     "awair" = ps: with ps; [ ]; # missing inputs: python_awair
     "aws" = ps: with ps; [ ]; # missing inputs: aiobotocore
-    "axis" = ps: with ps; [ ]; # missing inputs: axis
+    "axis" = ps: with ps; [ aiohttp-cors paho-mqtt]; # missing inputs: axis
+    "azure_devops" = ps: with ps; [ ]; # missing inputs: aioazuredevops
     "azure_event_hub" = ps: with ps; [ ]; # missing inputs: azure-eventhub
     "azure_service_bus" = ps: with ps; [ azure-servicebus];
     "baidu" = ps: with ps; [ ]; # missing inputs: baidu-aip
@@ -90,9 +92,10 @@
     "bmp280" = ps: with ps; [ ]; # missing inputs: RPi.GPIO adafruit-circuitpython-bmp280
     "bmw_connected_drive" = ps: with ps; [ ]; # missing inputs: bimmer_connected
     "bom" = ps: with ps; [ ]; # missing inputs: bomradarloop
+    "bond" = ps: with ps; [ ]; # missing inputs: bond-api
     "braviatv" = ps: with ps; [ bravia-tv];
     "broadlink" = ps: with ps; [ broadlink];
-    "brother" = ps: with ps; [ ]; # missing inputs: brother
+    "brother" = ps: with ps; [ brother];
     "brottsplatskartan" = ps: with ps; [ ]; # missing inputs: brottsplatskartan
     "browser" = ps: with ps; [ ];
     "brunt" = ps: with ps; [ ]; # missing inputs: brunt
@@ -104,9 +107,10 @@
     "calendar" = ps: with ps; [ aiohttp-cors];
     "camera" = ps: with ps; [ aiohttp-cors];
     "canary" = ps: with ps; [ ha-ffmpeg]; # missing inputs: py-canary
-    "cast" = ps: with ps; [ PyChromecast];
+    "cast" = ps: with ps; [ aiohttp-cors hass-nabucasa PyChromecast zeroconf];
     "cert_expiry" = ps: with ps; [ ];
     "channels" = ps: with ps; [ ]; # missing inputs: pychannels
+    "circuit" = ps: with ps; [ ]; # missing inputs: circuit-webhook
     "cisco_ios" = ps: with ps; [ pexpect];
     "cisco_mobility_express" = ps: with ps; [ ]; # missing inputs: ciscomobilityexpress
     "cisco_webex_teams" = ps: with ps; [ ]; # missing inputs: webexteamssdk
@@ -128,6 +132,7 @@
     "concord232" = ps: with ps; [ ]; # missing inputs: concord232
     "config" = ps: with ps; [ aiohttp-cors];
     "configurator" = ps: with ps; [ ];
+    "control4" = ps: with ps; [ ]; # missing inputs: pyControl4
     "conversation" = ps: with ps; [ aiohttp-cors];
     "coolmaster" = ps: with ps; [ ]; # missing inputs: pycoolmasternet
     "coronavirus" = ps: with ps; [ ]; # missing inputs: coronavirus
@@ -143,21 +148,23 @@
     "darksky" = ps: with ps; [ python-forecastio];
     "datadog" = ps: with ps; [ datadog];
     "ddwrt" = ps: with ps; [ ];
+    "debugpy" = ps: with ps; [ debugpy];
     "deconz" = ps: with ps; [ ]; # missing inputs: pydeconz
     "decora" = ps: with ps; [ bluepy]; # missing inputs: decora
     "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi
-    "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro hass-nabucasa netdisco sqlalchemy zeroconf]; # missing inputs: home-assistant-frontend
+    "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro emoji hass-nabucasa netdisco sqlalchemy zeroconf]; # missing inputs: home-assistant-frontend
     "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn
     "deluge" = ps: with ps; [ deluge-client];
     "demo" = ps: with ps; [ aiohttp-cors];
     "denon" = ps: with ps; [ ];
-    "denonavr" = ps: with ps; [ denonavr];
+    "denonavr" = ps: with ps; [ denonavr getmac];
     "derivative" = ps: with ps; [ ];
     "deutsche_bahn" = ps: with ps; [ ]; # missing inputs: schiene
-    "device_automation" = ps: with ps; [ aiohttp-cors];
+    "device_automation" = ps: with ps; [ ];
     "device_sun_light_trigger" = ps: with ps; [ ];
     "device_tracker" = ps: with ps; [ ];
     "devolo_home_control" = ps: with ps; [ ]; # missing inputs: devolo-home-control-api
+    "dexcom" = ps: with ps; [ ]; # missing inputs: pydexcom
     "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT
     "dialogflow" = ps: with ps; [ aiohttp-cors];
     "digital_ocean" = ps: with ps; [ digital-ocean];
@@ -165,27 +172,27 @@
     "directv" = ps: with ps; [ ]; # missing inputs: directv
     "discogs" = ps: with ps; [ discogs_client];
     "discord" = ps: with ps; [ discordpy];
-    "discovery" = ps: with ps; [ netdisco];
+    "discovery" = ps: with ps; [ aiohttp-cors 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; [ ]; # missing inputs: async-upnp-client
+    "dlna_dmr" = ps: with ps; [ async-upnp-client];
     "dnsip" = ps: with ps; [ aiodns];
     "dominos" = ps: with ps; [ aiohttp-cors]; # missing inputs: pizzapi
     "doods" = ps: with ps; [ pillow]; # missing inputs: pydoods
-    "doorbird" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: doorbirdpy home-assistant-frontend
+    "doorbird" = ps: with ps; [ aiohttp-cors]; # missing inputs: doorbirdpy
     "dovado" = ps: with ps; [ ]; # missing inputs: dovado
     "downloader" = ps: with ps; [ ];
     "dsmr" = ps: with ps; [ ]; # missing inputs: dsmr_parser
-    "dsmr_reader" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "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; [ ]; # missing inputs: pdunehd
-    "dwd_weather_warnings" = ps: with ps; [ ];
+    "dwd_weather_warnings" = ps: with ps; [ jsonpath xmltodict];
     "dweet" = ps: with ps; [ ]; # missing inputs: dweepy
     "dynalite" = ps: with ps; [ ]; # missing inputs: dynalite_devices
-    "dyson" = ps: with ps; [ ]; # missing inputs: libpurecool
+    "dyson" = ps: with ps; [ aiohttp-cors zeroconf]; # missing inputs: libpurecool
     "ebox" = ps: with ps; [ ]; # missing inputs: pyebox
     "ebusd" = ps: with ps; [ ]; # missing inputs: ebusdpy
     "ecoal_boiler" = ps: with ps; [ ]; # missing inputs: ecoaliface
@@ -208,7 +215,7 @@
     "emoncms_history" = ps: with ps; [ ];
     "emulated_hue" = ps: with ps; [ aiohttp-cors];
     "emulated_roku" = ps: with ps; [ ]; # missing inputs: emulated_roku
-    "enigma2" = ps: with ps; [ ]; # missing inputs: openwebifpy
+    "enigma2" = ps: with ps; [ openwebifpy];
     "enocean" = ps: with ps; [ ]; # missing inputs: enocean
     "enphase_envoy" = ps: with ps; [ ]; # missing inputs: envoy_reader
     "entur_public_transport" = ps: with ps; [ ]; # missing inputs: enturclient
@@ -242,6 +249,7 @@
     "filesize" = ps: with ps; [ ];
     "filter" = ps: with ps; [ aiohttp-cors sqlalchemy];
     "fints" = ps: with ps; [ fints];
+    "firmata" = ps: with ps; [ ]; # missing inputs: pymata-express
     "fitbit" = ps: with ps; [ aiohttp-cors fitbit];
     "fixer" = ps: with ps; [ ]; # missing inputs: fixerio
     "fleetgo" = ps: with ps; [ ]; # missing inputs: ritassist
@@ -257,15 +265,14 @@
     "folder_watcher" = ps: with ps; [ watchdog];
     "foobot" = ps: with ps; [ ]; # missing inputs: foobot_async
     "forked_daapd" = ps: with ps; [ ]; # missing inputs: pyforked-daapd pylibrespot-java
-    "fortigate" = ps: with ps; [ ]; # missing inputs: pyfgt
     "fortios" = ps: with ps; [ ]; # missing inputs: fortiosapi
     "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam
     "foursquare" = ps: with ps; [ aiohttp-cors];
     "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms
-    "freebox" = ps: with ps; [ ]; # missing inputs: aiofreepybox
+    "freebox" = ps: with ps; [ aiohttp-cors netdisco zeroconf]; # missing inputs: aiofreepybox
     "freedns" = ps: with ps; [ ];
     "fritz" = ps: with ps; [ fritzconnection];
-    "fritzbox" = ps: with ps; [ ]; # missing inputs: pyfritzhome
+    "fritzbox" = ps: with ps; [ pyfritzhome];
     "fritzbox_callmonitor" = ps: with ps; [ fritzconnection];
     "fritzbox_netmonitor" = ps: with ps; [ fritzconnection];
     "fronius" = ps: with ps; [ ]; # missing inputs: pyfronius
@@ -276,7 +283,6 @@
     "garmin_connect" = ps: with ps; [ ]; # missing inputs: garminconnect
     "gc100" = ps: with ps; [ ]; # missing inputs: python-gc100
     "gdacs" = ps: with ps; [ ]; # missing inputs: aio_georss_gdacs
-    "gearbest" = ps: with ps; [ ]; # missing inputs: gearbest_parser
     "geizhals" = ps: with ps; [ ]; # missing inputs: geizhals
     "generic" = ps: with ps; [ ];
     "generic_thermostat" = ps: with ps; [ ];
@@ -294,7 +300,7 @@
     "glances" = ps: with ps; [ ]; # missing inputs: glances_api
     "gntp" = ps: with ps; [ ]; # missing inputs: gntp
     "goalfeed" = ps: with ps; [ ]; # missing inputs: pysher
-    "gogogate2" = ps: with ps; [ ]; # missing inputs: pygogogate2
+    "gogogate2" = ps: with ps; [ ]; # missing inputs: gogogate2-api
     "google" = ps: with ps; [ google_api_python_client httplib2 oauth2client];
     "google_assistant" = ps: with ps; [ aiohttp-cors];
     "google_cloud" = ps: with ps; [ google_cloud_texttospeech];
@@ -315,11 +321,12 @@
     "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer
     "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player
     "gtfs" = ps: with ps; [ ]; # missing inputs: pygtfs
+    "guardian" = ps: with ps; [ ]; # missing inputs: aioguardian
     "habitica" = ps: with ps; [ ]; # missing inputs: habitipy
     "hangouts" = ps: with ps; [ ]; # missing inputs: hangups
     "harman_kardon_avr" = ps: with ps; [ ]; # missing inputs: hkavr
     "harmony" = ps: with ps; [ aioharmony];
-    "hassio" = ps: with ps; [ aiohttp-cors];
+    "hassio" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
     "haveibeenpwned" = ps: with ps; [ ];
     "hddtemp" = ps: with ps; [ ];
     "hdmi_cec" = ps: with ps; [ ]; # missing inputs: pyCEC
@@ -336,8 +343,8 @@
     "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16
     "home_connect" = ps: with ps; [ aiohttp-cors]; # missing inputs: homeconnect
     "homeassistant" = ps: with ps; [ ];
-    "homekit" = ps: with ps; [ HAP-python pyqrcode aiohttp-cors ha-ffmpeg]; # missing inputs: PyTurboJPEG base36 fnvhash
-    "homekit_controller" = ps: with ps; [ ]; # missing inputs: aiohomekit[IP]
+    "homekit" = ps: with ps; [ HAP-python pyqrcode aiohttp-cors ha-ffmpeg zeroconf]; # missing inputs: PyTurboJPEG base36 fnvhash
+    "homekit_controller" = ps: with ps; [ aiohttp-cors zeroconf]; # missing inputs: aiohomekit[IP]
     "homematic" = ps: with ps; [ pyhomematic];
     "homematicip_cloud" = ps: with ps; [ ]; # missing inputs: homematicip
     "homeworks" = ps: with ps; [ ]; # missing inputs: pyhomeworks
@@ -350,7 +357,9 @@
     "huawei_lte" = ps: with ps; [ getmac stringcase]; # missing inputs: huawei-lte-api url-normalize
     "huawei_router" = ps: with ps; [ ];
     "hue" = ps: with ps; [ aiohue];
+    "humidifier" = ps: with ps; [ ];
     "hunterdouglas_powerview" = ps: with ps; [ ]; # missing inputs: aiopvapi
+    "hvv_departures" = ps: with ps; [ ]; # missing inputs: pygti
     "hydrawise" = ps: with ps; [ ]; # missing inputs: hydrawiser
     "hyperion" = ps: with ps; [ ];
     "ialarm" = ps: with ps; [ ]; # missing inputs: pyialarm
@@ -366,13 +375,13 @@
     "imap" = ps: with ps; [ ]; # missing inputs: aioimaplib
     "imap_email_content" = ps: with ps; [ ];
     "incomfort" = ps: with ps; [ ]; # missing inputs: incomfort-client
-    "influxdb" = ps: with ps; [ influxdb];
+    "influxdb" = ps: with ps; [ influxdb-client influxdb];
     "input_boolean" = 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; [ ]; # missing inputs: insteonplm
+    "insteon" = ps: with ps; [ ]; # missing inputs: pyinsteon
     "integration" = ps: with ps; [ ];
     "intent" = ps: with ps; [ aiohttp-cors];
     "intent_script" = ps: with ps; [ ];
@@ -381,7 +390,7 @@
     "iota" = ps: with ps; [ ]; # missing inputs: pyota
     "iperf3" = ps: with ps; [ ]; # missing inputs: iperf3
     "ipma" = ps: with ps; [ ]; # missing inputs: pyipma
-    "ipp" = ps: with ps; [ ]; # missing inputs: pyipp
+    "ipp" = ps: with ps; [ pyipp];
     "iqvia" = ps: with ps; [ numpy]; # missing inputs: pyiqvia
     "irish_rail_transport" = ps: with ps; [ ]; # missing inputs: pyirishrail
     "islamic_prayer_times" = ps: with ps; [ ]; # missing inputs: prayer_times_calculator
@@ -422,7 +431,6 @@
     "lightwave" = ps: with ps; [ ]; # missing inputs: lightwave
     "limitlessled" = ps: with ps; [ limitlessled];
     "linksys_smart" = ps: with ps; [ ];
-    "linky" = ps: with ps; [ ]; # missing inputs: pylinky
     "linode" = ps: with ps; [ linode-api];
     "linux_battery" = ps: with ps; [ batinfo];
     "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc
@@ -432,7 +440,6 @@
     "local_ip" = ps: with ps; [ ];
     "locative" = ps: with ps; [ aiohttp-cors];
     "lock" = ps: with ps; [ ];
-    "lockitron" = ps: with ps; [ ];
     "logbook" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: home-assistant-frontend
     "logentries" = ps: with ps; [ ];
     "logger" = ps: with ps; [ ];
@@ -452,7 +459,7 @@
     "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 hbmqtt paho-mqtt];
+    "manual_mqtt" = ps: with ps; [ aiohttp-cors paho-mqtt];
     "map" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
     "marytts" = ps: with ps; [ ]; # missing inputs: speak2mary
     "mastodon" = ps: with ps; [ ]; # missing inputs: Mastodon.py
@@ -467,7 +474,7 @@
     "meraki" = ps: with ps; [ aiohttp-cors];
     "message_bird" = ps: with ps; [ ]; # missing inputs: messagebird
     "met" = ps: with ps; [ pymetno];
-    "meteo_france" = ps: with ps; [ ]; # missing inputs: meteofrance vigilancemeteo
+    "meteo_france" = ps: with ps; [ ]; # missing inputs: meteofrance-api
     "meteoalarm" = ps: with ps; [ ]; # missing inputs: meteoalertapi
     "metoffice" = ps: with ps; [ ]; # missing inputs: datapoint
     "mfi" = ps: with ps; [ ]; # missing inputs: mficlient
@@ -484,7 +491,7 @@
     "minio" = ps: with ps; [ minio];
     "mitemp_bt" = ps: with ps; [ ]; # missing inputs: mitemp_bt
     "mjpeg" = ps: with ps; [ ];
-    "mobile_app" = ps: with ps; [ pynacl aiohttp-cors];
+    "mobile_app" = ps: with ps; [ pynacl aiohttp-cors emoji hass-nabucasa];
     "mochad" = ps: with ps; [ ]; # missing inputs: pymochad
     "modbus" = ps: with ps; [ ]; # missing inputs: pymodbus
     "modem_callerid" = ps: with ps; [ ]; # missing inputs: basicmodem
@@ -493,17 +500,17 @@
     "moon" = ps: with ps; [ ];
     "mpchc" = ps: with ps; [ ];
     "mpd" = ps: with ps; [ mpd2];
-    "mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
-    "mqtt_eventstream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
-    "mqtt_json" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
-    "mqtt_room" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
-    "mqtt_statestream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "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; [ ]; # missing inputs: pymsteams
     "mvglive" = ps: with ps; [ PyMVGLive];
     "mychevy" = ps: with ps; [ ]; # missing inputs: mychevy
     "mycroft" = ps: with ps; [ ]; # missing inputs: mycroftapi
     "myq" = ps: with ps; [ ]; # missing inputs: pymyq
-    "mysensors" = ps: with ps; [ ]; # missing inputs: pymysensors
+    "mysensors" = ps: with ps; [ aiohttp-cors paho-mqtt]; # missing inputs: pymysensors
     "mystrom" = ps: with ps; [ aiohttp-cors]; # missing inputs: python-mystrom
     "mythicbeastsdns" = ps: with ps; [ ]; # missing inputs: mbddns
     "n26" = ps: with ps; [ ]; # missing inputs: n26
@@ -515,7 +522,7 @@
     "nello" = ps: with ps; [ ]; # missing inputs: pynello
     "ness_alarm" = ps: with ps; [ ]; # missing inputs: nessclient
     "nest" = ps: with ps; [ ]; # missing inputs: python-nest
-    "netatmo" = ps: with ps; [ aiohttp-cors pyatmo];
+    "netatmo" = ps: with ps; [ aiohttp-cors hass-nabucasa pyatmo];
     "netdata" = ps: with ps; [ ]; # missing inputs: netdata
     "netgear" = ps: with ps; [ ]; # missing inputs: pynetgear
     "netgear_lte" = ps: with ps; [ ]; # missing inputs: eternalegypt
@@ -534,6 +541,7 @@
     "noaa_tides" = ps: with ps; [ ]; # missing inputs: py_noaa
     "norway_air" = ps: with ps; [ pymetno];
     "notify" = ps: with ps; [ ];
+    "notify_events" = ps: with ps; [ ]; # missing inputs: notify-events
     "notion" = ps: with ps; [ ]; # missing inputs: aionotion
     "nsw_fuel_station" = ps: with ps; [ ]; # missing inputs: nsw-fuel-api-client
     "nsw_rural_fire_service_feed" = ps: with ps; [ ]; # missing inputs: aio_geojson_nsw_rfs_incidents
@@ -547,7 +555,7 @@
     "nzbget" = ps: with ps; [ ]; # missing inputs: pynzbgetapi
     "oasa_telematics" = ps: with ps; [ ]; # missing inputs: oasatelematics
     "obihai" = ps: with ps; [ ]; # missing inputs: pyobihai
-    "octoprint" = ps: with ps; [ ];
+    "octoprint" = ps: with ps; [ aiohttp-cors netdisco zeroconf];
     "oem" = ps: with ps; [ ]; # missing inputs: oemthermostat
     "ohmconnect" = ps: with ps; [ defusedxml];
     "ombi" = ps: with ps; [ ]; # missing inputs: pyombi
@@ -576,8 +584,9 @@
     "orvibo" = ps: with ps; [ ]; # missing inputs: orvibo
     "osramlightify" = ps: with ps; [ ]; # missing inputs: lightify
     "otp" = ps: with ps; [ pyotp];
-    "owntracks" = ps: with ps; [ pynacl aiohttp-cors];
-    "ozw" = ps: with ps; [ ]; # missing inputs: python-openzwave-mqtt
+    "ovo_energy" = ps: with ps; [ ]; # missing inputs: ovoenergy
+    "owntracks" = ps: with ps; [ pynacl aiohttp-cors hass-nabucasa paho-mqtt];
+    "ozw" = ps: with ps; [ aiohttp-cors paho-mqtt]; # missing inputs: python-openzwave-mqtt
     "panasonic_bluray" = ps: with ps; [ ]; # missing inputs: panacotta
     "panasonic_viera" = ps: with ps; [ ]; # missing inputs: panasonic_viera
     "pandora" = ps: with ps; [ pexpect];
@@ -597,12 +606,13 @@
     "pioneer" = ps: with ps; [ ];
     "pjlink" = ps: with ps; [ ]; # missing inputs: pypjlink2
     "plaato" = ps: with ps; [ aiohttp-cors];
-    "plant" = ps: with ps; [ ];
-    "plex" = ps: with ps; [ aiohttp-cors plexapi plexauth plexwebsocket];
-    "plugwise" = ps: with ps; [ ]; # missing inputs: haanna
+    "plant" = ps: with ps; [ sqlalchemy];
+    "plex" = ps: with ps; [ aiohttp-cors plexapi plexauth plexwebsocket pysonos];
+    "plugwise" = ps: with ps; [ ]; # missing inputs: Plugwise_Smile
     "plum_lightpad" = ps: with ps; [ ]; # missing inputs: plumlightpad
     "pocketcasts" = ps: with ps; [ ]; # missing inputs: pocketcasts
     "point" = ps: with ps; [ aiohttp-cors]; # missing inputs: pypoint
+    "poolsense" = ps: with ps; [ ]; # missing inputs: poolsense
     "powerwall" = ps: with ps; [ ]; # missing inputs: tesla-powerwall
     "prezzibenzina" = ps: with ps; [ ]; # missing inputs: prezzibenzina-py
     "proliphix" = ps: with ps; [ ]; # missing inputs: proliphix
@@ -618,7 +628,7 @@
     "pushbullet" = ps: with ps; [ pushbullet];
     "pushover" = ps: with ps; [ pushover-complete];
     "pushsafer" = ps: with ps; [ ];
-    "pvoutput" = ps: with ps; [ ];
+    "pvoutput" = ps: with ps; [ jsonpath xmltodict];
     "pvpc_hourly_pricing" = ps: with ps; [ ]; # missing inputs: aiopvpc
     "pyload" = ps: with ps; [ ];
     "python_script" = ps: with ps; [ restrictedpython];
@@ -629,7 +639,7 @@
     "quantum_gateway" = ps: with ps; [ ]; # missing inputs: quantum-gateway
     "qvr_pro" = ps: with ps; [ ]; # missing inputs: pyqvrpro
     "qwikswitch" = ps: with ps; [ ]; # missing inputs: pyqwikswitch
-    "rachio" = ps: with ps; [ aiohttp-cors]; # missing inputs: rachiopy
+    "rachio" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: rachiopy
     "radarr" = ps: with ps; [ ];
     "radiotherm" = ps: with ps; [ ]; # missing inputs: radiotherm
     "rainbird" = ps: with ps; [ ]; # missing inputs: pyrainbird
@@ -654,11 +664,11 @@
     "rfxtrx" = ps: with ps; [ ]; # missing inputs: pyRFXtrx
     "ring" = ps: with ps; [ ha-ffmpeg]; # missing inputs: ring_doorbell
     "ripple" = ps: with ps; [ ]; # missing inputs: python-ripple-api
-    "rmvtransport" = ps: with ps; [ ]; # missing inputs: PyRMVtransport
+    "rmvtransport" = ps: with ps; [ PyRMVtransport];
     "rocketchat" = ps: with ps; [ ]; # missing inputs: rocketchat-API
     "roku" = ps: with ps; [ ]; # missing inputs: rokuecp
     "roomba" = ps: with ps; [ ]; # missing inputs: roombapy
-    "route53" = ps: with ps; [ boto3]; # missing inputs: ipify
+    "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
@@ -669,7 +679,7 @@
     "rtorrent" = ps: with ps; [ ];
     "russound_rio" = ps: with ps; [ ]; # missing inputs: russound_rio
     "russound_rnet" = ps: with ps; [ ]; # missing inputs: russound
-    "sabnzbd" = ps: with ps; [ ]; # missing inputs: pysabnzbd
+    "sabnzbd" = ps: with ps; [ aiohttp-cors netdisco zeroconf]; # missing inputs: pysabnzbd
     "safe_mode" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: home-assistant-frontend
     "saj" = ps: with ps; [ ]; # missing inputs: pysaj
     "salt" = ps: with ps; [ ]; # missing inputs: saltbox
@@ -677,7 +687,7 @@
     "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];
+    "scrape" = ps: with ps; [ beautifulsoup4 jsonpath xmltodict];
     "script" = ps: with ps; [ ];
     "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate
     "search" = ps: with ps; [ aiohttp-cors];
@@ -706,22 +716,22 @@
     "simulated" = ps: with ps; [ ];
     "sinch" = ps: with ps; [ ]; # missing inputs: clx-sdk-xms
     "sisyphus" = ps: with ps; [ ]; # missing inputs: sisyphus-control
-    "sky_hub" = ps: with ps; [ ];
+    "sky_hub" = ps: with ps; [ ]; # missing inputs: pyskyqhub
     "skybeacon" = ps: with ps; [ ]; # missing inputs: pygatt[GATTTOOL]
     "skybell" = ps: with ps; [ ]; # missing inputs: skybellpy
     "slack" = ps: with ps; [ ]; # missing inputs: slackclient
     "sleepiq" = ps: with ps; [ ]; # missing inputs: sleepyq
     "slide" = ps: with ps; [ ]; # missing inputs: goslide-api
     "sma" = ps: with ps; [ ]; # missing inputs: pysma
-    "smappee" = ps: with ps; [ ]; # missing inputs: smappy
+    "smappee" = ps: with ps; [ aiohttp-cors]; # missing inputs: pysmappee
     "smarthab" = ps: with ps; [ ]; # missing inputs: smarthab
-    "smartthings" = ps: with ps; [ aiohttp-cors]; # missing inputs: pysmartapp pysmartthings
+    "smartthings" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: pysmartapp pysmartthings
     "smarty" = ps: with ps; [ ]; # missing inputs: pysmarty
     "smhi" = ps: with ps; [ ]; # missing inputs: smhi-pkg
     "sms" = ps: with ps; [ ]; # missing inputs: python-gammu
     "smtp" = ps: with ps; [ ];
     "snapcast" = ps: with ps; [ snapcast];
-    "snips" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "snips" = ps: with ps; [ aiohttp-cors paho-mqtt];
     "snmp" = ps: with ps; [ pysnmp];
     "sochain" = ps: with ps; [ ]; # missing inputs: python-sochain-api
     "socialblade" = ps: with ps; [ ]; # missing inputs: socialbladeclient
@@ -732,11 +742,11 @@
     "soma" = ps: with ps; [ ]; # missing inputs: pysoma
     "somfy" = ps: with ps; [ aiohttp-cors]; # missing inputs: pymfy
     "somfy_mylink" = ps: with ps; [ ]; # missing inputs: somfy-mylink-synergy
-    "sonarr" = ps: with ps; [ ];
+    "sonarr" = ps: with ps; [ ]; # missing inputs: sonarr
     "songpal" = ps: with ps; [ ]; # missing inputs: python-songpal
     "sonos" = ps: with ps; [ pysonos];
     "sony_projector" = ps: with ps; [ ]; # missing inputs: pysdcp
-    "soundtouch" = ps: with ps; [ libsoundtouch];
+    "soundtouch" = ps: with ps; [ aiohttp-cors libsoundtouch zeroconf];
     "spaceapi" = ps: with ps; [ aiohttp-cors];
     "spc" = ps: with ps; [ ]; # missing inputs: pyspcwebgw
     "speedtestdotnet" = ps: with ps; [ speedtest-cli];
@@ -746,11 +756,11 @@
     "spotify" = ps: with ps; [ aiohttp-cors spotipy];
     "sql" = ps: with ps; [ sqlalchemy];
     "squeezebox" = ps: with ps; [ ]; # missing inputs: pysqueezebox
-    "ssdp" = ps: with ps; [ defusedxml netdisco];
+    "ssdp" = ps: with ps; [ aiohttp-cors defusedxml netdisco zeroconf];
     "starline" = ps: with ps; [ ]; # missing inputs: starline
     "starlingbank" = ps: with ps; [ ]; # missing inputs: starlingbank
     "startca" = ps: with ps; [ xmltodict];
-    "statistics" = ps: with ps; [ ];
+    "statistics" = ps: with ps; [ sqlalchemy];
     "statsd" = ps: with ps; [ statsd];
     "steam_online" = ps: with ps; [ ]; # missing inputs: steamodd
     "stiebel_eltron" = ps: with ps; [ ]; # missing inputs: pymodbus pystiebeleltron
@@ -770,7 +780,7 @@
     "switchbot" = ps: with ps; [ ]; # missing inputs: PySwitchbot
     "switcher_kis" = ps: with ps; [ ]; # missing inputs: aioswitcher
     "switchmate" = ps: with ps; [ ]; # missing inputs: pySwitchmate
-    "syncthru" = ps: with ps; [ ]; # missing inputs: pysyncthru
+    "syncthru" = ps: with ps; [ ]; # missing inputs: pysyncthru url-normalize
     "synology" = ps: with ps; [ ]; # missing inputs: py-synology
     "synology_chat" = ps: with ps; [ ];
     "synology_dsm" = ps: with ps; [ ]; # missing inputs: python-synology
@@ -795,7 +805,7 @@
     "telnet" = ps: with ps; [ ];
     "temper" = ps: with ps; [ ]; # missing inputs: temperusb
     "template" = ps: with ps; [ ];
-    "tensorflow" = ps: with ps; [ numpy pillow protobuf tensorflow];
+    "tensorflow" = ps: with ps; [ numpy pillow protobuf]; # missing inputs: pycocotools tensorflow tf-models-official tf-slim
     "tesla" = ps: with ps; [ ]; # missing inputs: teslajsonpy
     "tfiac" = ps: with ps; [ ]; # missing inputs: pytfiac
     "thermoworks_smoke" = ps: with ps; [ stringcase]; # missing inputs: thermoworks_smoke
@@ -814,11 +824,11 @@
     "todoist" = ps: with ps; [ todoist];
     "tof" = ps: with ps; [ ]; # missing inputs: RPi.GPIO VL53L1X2
     "tomato" = ps: with ps; [ ];
-    "toon" = ps: with ps; [ ]; # missing inputs: toonapilib
+    "toon" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: toonapi
     "torque" = ps: with ps; [ aiohttp-cors];
     "totalconnect" = ps: with ps; [ ]; # missing inputs: total_connect_client
     "touchline" = ps: with ps; [ ]; # missing inputs: pytouchline
-    "tplink" = ps: with ps; [ ]; # missing inputs: pyHS100
+    "tplink" = ps: with ps; [ pyhs100];
     "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected
     "traccar" = ps: with ps; [ aiohttp-cors stringcase]; # missing inputs: pytraccar
     "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr
@@ -849,13 +859,13 @@
     "upc_connect" = ps: with ps; [ ]; # missing inputs: connect-box
     "upcloud" = ps: with ps; [ ]; # missing inputs: upcloud-api
     "updater" = ps: with ps; [ distro];
-    "upnp" = ps: with ps; [ ]; # missing inputs: async-upnp-client
+    "upnp" = ps: with ps; [ async-upnp-client];
     "uptime" = ps: with ps; [ ];
     "uptimerobot" = ps: with ps; [ ]; # missing inputs: pyuptimerobot
     "uscis" = ps: with ps; [ ]; # missing inputs: uscisstatus
     "usgs_earthquakes_feed" = ps: with ps; [ ]; # missing inputs: geojson_client
     "utility_meter" = ps: with ps; [ ];
-    "uvc" = ps: with ps; [ ]; # missing inputs: uvcclient
+    "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
@@ -876,7 +886,7 @@
     "vlc_telnet" = ps: with ps; [ ]; # missing inputs: python-telnet-vlc
     "voicerss" = ps: with ps; [ ];
     "volkszaehler" = ps: with ps; [ ]; # missing inputs: volkszaehler
-    "volumio" = ps: with ps; [ ];
+    "volumio" = ps: with ps; [ ]; # missing inputs: pyvolumio
     "volvooncall" = ps: with ps; [ ]; # missing inputs: volvooncall
     "vultr" = ps: with ps; [ vultr];
     "w800rf32" = ps: with ps; [ ]; # missing inputs: pyW800rf32
@@ -898,20 +908,20 @@
     "wirelesstag" = ps: with ps; [ ]; # missing inputs: wirelesstagpy
     "withings" = ps: with ps; [ aiohttp-cors]; # missing inputs: withings-api
     "wled" = ps: with ps; [ ]; # missing inputs: 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; [ ];
     "wunderground" = ps: with ps; [ ];
-    "wunderlist" = ps: with ps; [ ]; # missing inputs: wunderpy2
-    "wwlln" = ps: with ps; [ ]; # missing inputs: aiowwlln
     "x10" = ps: with ps; [ ];
+    "xbee" = ps: with ps; [ ]; # missing inputs: xbee-helper
     "xbox_live" = ps: with ps; [ ]; # missing inputs: xboxapi
     "xeoma" = ps: with ps; [ ]; # missing inputs: pyxeoma
     "xfinity" = ps: with ps; [ ]; # missing inputs: xfinity-gateway
     "xiaomi" = ps: with ps; [ ha-ffmpeg];
-    "xiaomi_aqara" = ps: with ps; [ ]; # missing inputs: PyXiaomiGateway
+    "xiaomi_aqara" = ps: with ps; [ aiohttp-cors netdisco zeroconf]; # missing inputs: PyXiaomiGateway
     "xiaomi_miio" = ps: with ps; [ construct python-miio];
     "xiaomi_tv" = ps: with ps; [ ]; # missing inputs: pymitv
     "xmpp" = ps: with ps; [ slixmpp];
@@ -919,9 +929,9 @@
     "yale_smart_alarm" = ps: with ps; [ ]; # missing inputs: yalesmartalarmclient
     "yamaha" = ps: with ps; [ rxv];
     "yamaha_musiccast" = ps: with ps; [ ]; # missing inputs: pymusiccast
-    "yandex_transport" = ps: with ps; [ ]; # missing inputs: ya_ma
+    "yandex_transport" = ps: with ps; [ ]; # missing inputs: aioymaps
     "yandextts" = ps: with ps; [ ];
-    "yeelight" = ps: with ps; [ ]; # missing inputs: yeelight
+    "yeelight" = ps: with ps; [ aiohttp-cors netdisco zeroconf]; # missing inputs: yeelight
     "yeelightsunflower" = ps: with ps; [ ]; # missing inputs: yeelightsunflower
     "yessssms" = ps: with ps; [ ]; # missing inputs: YesssSMS
     "yi" = ps: with ps; [ aioftp ha-ffmpeg];
@@ -932,9 +942,8 @@
     "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf];
     "zerproc" = ps: with ps; [ ]; # missing inputs: pyzerproc
     "zestimate" = ps: with ps; [ xmltodict];
-    "zha" = ps: with ps; [ pyserial zha-quirks zigpy-deconz]; # missing inputs: bellows zigpy-cc zigpy-xbee zigpy-zigate zigpy
+    "zha" = ps: with ps; [ bellows pyserial zha-quirks zigpy-cc zigpy-deconz zigpy-xbee zigpy-zigate zigpy];
     "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac
-    "zigbee" = ps: with ps; [ ]; # missing inputs: xbee-helper
     "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl
     "zone" = ps: with ps; [ ];
     "zoneminder" = ps: with ps; [ zm-py];
diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix
index 2d6d7347455..f0a664dd635 100644
--- a/pkgs/servers/home-assistant/default.nix
+++ b/pkgs/servers/home-assistant/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchurl, fetchFromGitHub, fetchpatch, python3, protobuf3_6
+{ stdenv, nixosTests, lib, fetchurl, fetchFromGitHub, fetchpatch, python3, protobuf3_6
 
 # Look up dependencies of specified components in component-packages.nix
 , extraComponents ? [ ]
@@ -22,10 +22,15 @@ let
   defaultOverrides = [
     # Override the version of some packages pinned in Home Assistant's setup.py
 
-    # used by check_config script
-    # can be unpinned once https://github.com/home-assistant/home-assistant/issues/11917 is resolved
-    (mkOverride "colorlog" "4.0.2"
-      "3cf31b25cbc8f86ec01fef582ef3b840950dea414084ed19ab922c8b493f9b42")
+    # required by the sun/moon plugins
+    # https://github.com/home-assistant/core/issues/36636
+    (mkOverride "astral" "1.10.1"
+      "d2a67243c4503131c856cafb1b1276de52a86e5b8a1d507b7e08bee51cb67bf1")
+
+    # We have 3.x in nixpkgs which is incompatible with home-assistant atm:
+    # https://github.com/home-assistant/core/blob/dev/requirements_all.txt
+    (mkOverride "pyowm" "2.10.0"
+      "1xvcv3sbcn9na8cwz21nnjlixysfk5lymnf65d1nqkbgacc1mm4g")
 
     # required by aioesphomeapi
     (self: super: {
@@ -67,7 +72,7 @@ let
   extraBuildInputs = extraPackages py.pkgs;
 
   # Don't forget to run parse-requirements.py after updating
-  hassVersion = "0.110.1";
+  hassVersion = "0.114.2";
 
 in with py.pkgs; buildPythonApplication rec {
   pname = "homeassistant";
@@ -76,7 +81,7 @@ in with py.pkgs; buildPythonApplication rec {
   disabled = pythonOlder "3.5";
 
   patches = [
-    ./0001-setup.py-relax-dependencies.patch
+    ./relax-dependencies.patch
   ];
 
   inherit availableComponents;
@@ -86,7 +91,7 @@ in with py.pkgs; buildPythonApplication rec {
     owner = "home-assistant";
     repo = "core";
     rev = version;
-    sha256 = "1495kl997mvk9k11lk1ahv5w0yc0185qmxwa1h51j6d0zyqwz749";
+    sha256 = "0llyf3icdgb9mh7x02309m35hxhinzsbd6i31mmb9fjfzp0d27q9";
   };
 
   propagatedBuildInputs = [
@@ -123,12 +128,15 @@ in with py.pkgs; buildPythonApplication rec {
 
   passthru = {
     inherit (py.pkgs) hass-frontend;
+    tests = {
+      inherit (nixosTests) home-assistant;
+    };
   };
 
   meta = with lib; {
     homepage = "https://home-assistant.io/";
     description = "Open-source home automation platform running on Python 3";
     license = licenses.asl20;
-    maintainers = with maintainers; [ dotlambda globin mic92 ];
+    maintainers = with maintainers; [ dotlambda globin mic92 hexa ];
   };
 }
diff --git a/pkgs/servers/home-assistant/esphome.nix b/pkgs/servers/home-assistant/esphome.nix
deleted file mode 100644
index 2dc023df5a2..00000000000
--- a/pkgs/servers/home-assistant/esphome.nix
+++ /dev/null
@@ -1,61 +0,0 @@
-{ lib, python3, platformio, esptool, git, protobuf3_10, fetchpatch }:
-
-let
-  python = python3.override {
-    packageOverrides = self: super: {
-      protobuf = super.protobuf.override {
-        protobuf = protobuf3_10;
-      };
-      pyyaml = super.pyyaml.overridePythonAttrs (oldAttrs: rec {
-        version = "5.1.2";
-        src = oldAttrs.src.override {
-          inherit version;
-          sha256 = "1r5faspz73477hlbjgilw05xsms0glmsa371yqdd26znqsvg1b81";
-        };
-      });
-    };
-  };
-
-in python.pkgs.buildPythonApplication rec {
-  pname = "esphome";
-  version = "1.14.3";
-
-  src = python.pkgs.fetchPypi {
-    inherit pname version;
-    sha256 = "0xnsl000c5a2li9qw9anrzzq437qn1n4hcfc24i4rfq37awzmig7";
-  };
-
-  ESPHOME_USE_SUBPROCESS = "";
-
-  propagatedBuildInputs = with python.pkgs; [
-    voluptuous pyyaml paho-mqtt colorlog
-    tornado protobuf tzlocal pyserial ifaddr
-    protobuf
-  ];
-
-  # remove all version pinning (E.g tornado==5.1.1 -> tornado)
-  postPatch = ''
-    sed -i -e "s/==[0-9.]*//" setup.py
-  '';
-
-  makeWrapperArgs = [
-    # platformio is used in esphomeyaml/platformio_api.py
-    # esptool is used in esphomeyaml/__main__.py
-    # git is used in esphomeyaml/writer.py
-    "--prefix PATH : ${lib.makeBinPath [ platformio esptool git ]}"
-    "--set ESPHOME_USE_SUBPROCESS ''"
-  ];
-
-  # Platformio will try to access the network
-  # Instead, run the executable
-  checkPhase = ''
-    $out/bin/esphome --help > /dev/null
-  '';
-
-  meta = with lib; {
-    description = "Make creating custom firmwares for ESP32/ESP8266 super easy";
-    homepage = "https://esphome.io/";
-    license = licenses.mit;
-    maintainers = with maintainers; [ dotlambda globin ];
-  };
-}
diff --git a/pkgs/servers/home-assistant/frontend.nix b/pkgs/servers/home-assistant/frontend.nix
index 3481a2d1bd9..5c7227dc4e0 100644
--- a/pkgs/servers/home-assistant/frontend.nix
+++ b/pkgs/servers/home-assistant/frontend.nix
@@ -4,11 +4,11 @@ buildPythonPackage rec {
   # the frontend version corresponding to a specific home-assistant version can be found here
   # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json
   pname = "home-assistant-frontend";
-  version = "20200519.1";
+  version = "20200811.0";
 
   src = fetchPypi {
     inherit pname version;
-    sha256 = "149v56q5anzdfxf0dw1h39vdmcigx732a7abqjfb0xny5484iq8w";
+    sha256 = "0nrvfr4mw7h9py27hkak201jsfrvyxlgswfnda1l7k9ns9y4lpj8";
   };
 
   # no Python tests implemented
diff --git a/pkgs/servers/home-assistant/parse-requirements.py b/pkgs/servers/home-assistant/parse-requirements.py
index f802485d6c6..3c6d0c4bcab 100755
--- a/pkgs/servers/home-assistant/parse-requirements.py
+++ b/pkgs/servers/home-assistant/parse-requirements.py
@@ -24,7 +24,7 @@ import sys
 import tarfile
 import tempfile
 from io import BytesIO
-from typing import Dict, Optional
+from typing import Dict, Optional, Set, Any
 from urllib.request import urlopen
 
 COMPONENT_PREFIX = "homeassistant.components"
@@ -79,11 +79,14 @@ def parse_components(version: str = "master"):
 
 
 # Recursively get the requirements of a component and its dependencies
-def get_reqs(components, component):
+def get_reqs(components: Dict[str, Dict[str, Any]], component: str, processed: Set[str]) -> Set[str]:
     requirements = set(components[component].get("requirements", []))
     deps = components[component].get("dependencies", [])
+    deps.extend(components[component].get("after_dependencies", []))
+    processed.add(component)
     for dependency in deps:
-        requirements.update(get_reqs(components, dependency))
+        if dependency not in processed:
+            requirements.update(get_reqs(components, dependency, processed))
     return requirements
 
 
@@ -143,7 +146,7 @@ def main() -> None:
     for component in sorted(components.keys()):
         attr_paths = []
         missing_reqs = []
-        reqs = sorted(get_reqs(components, component))
+        reqs = sorted(get_reqs(components, component, set()))
         for req in reqs:
             # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0
             # Therefore, if there's a "#" in the line, only take the part after it
diff --git a/pkgs/servers/home-assistant/relax-dependencies.patch b/pkgs/servers/home-assistant/relax-dependencies.patch
new file mode 100644
index 00000000000..d06a37352f6
--- /dev/null
+++ b/pkgs/servers/home-assistant/relax-dependencies.patch
@@ -0,0 +1,21 @@
+diff --git a/setup.py b/setup.py
+index 81f8727ed6..12200e0b9f 100755
+--- a/setup.py
++++ b/setup.py
+@@ -43,13 +43,13 @@ REQUIRES = [
+     "jinja2>=2.11.1",
+     "PyJWT==1.7.1",
+     # PyJWT has loose dependency. We want the latest one.
+-    "cryptography==2.9.2",
++    "cryptography>=2.9.2",
+     "pip>=8.0.3",
+     "python-slugify==4.0.1",
+     "pytz>=2020.1",
+     "pyyaml==5.3.1",
+-    "requests==2.24.0",
+-    "ruamel.yaml==0.15.100",
++    "requests>=2.23.0",
++    "ruamel.yaml>=0.15.100",
+     "voluptuous==0.11.7",
+     "voluptuous-serialize==2.4.0",
+     "yarl==1.4.2",
diff --git a/pkgs/servers/home-assistant/test-timeout.patch b/pkgs/servers/home-assistant/test-timeout.patch
new file mode 100644
index 00000000000..01b0edae1d7
--- /dev/null
+++ b/pkgs/servers/home-assistant/test-timeout.patch
@@ -0,0 +1,13 @@
+diff --git a/tests/test_core.py b/tests/test_core.py
+index a63f42af61..04b333868b 100644
+--- a/tests/test_core.py
++++ b/tests/test_core.py
+@@ -1432,7 +1432,7 @@ async def test_chained_logging_hits_log_timeout(hass, caplog):
+     async def _task_chain_2():
+         nonlocal created
+         created += 1
+-        if created > 10:
++        if created > 1000:
+             return
+         hass.async_create_task(_task_chain_1())
+ 
diff --git a/pkgs/servers/home-assistant/update.sh b/pkgs/servers/home-assistant/update.sh
new file mode 100755
index 00000000000..11189cf3577
--- /dev/null
+++ b/pkgs/servers/home-assistant/update.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -p nix -p jq -p curl -p bash -p git -p nix-update -i bash
+
+set -eux
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+cd "$DIR"
+
+CURRENT_VERSION=$(nix eval --raw '(with import ../../.. {}; home-assistant.version)')
+TARGET_VERSION=$(curl https://api.github.com/repos/home-assistant/core/releases/latest | jq -r '.name')
+MANIFEST=$(curl https://raw.githubusercontent.com/home-assistant/core/${TARGET_VERSION}/homeassistant/components/frontend/manifest.json)
+FRONTEND_VERSION=$(echo $MANIFEST | jq -r '.requirements[] | select(startswith("home-assistant-frontend")) | sub(".*==(?<vers>.*)"; .vers)')
+
+if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" ]]; then
+    echo "home-assistant is up-to-date: ${CURRENT_VERSION}"
+    exit 0
+fi
+
+
+sed -i -e "s/version =.*/version = \"${TARGET_VERSION}\";/" \
+    component-packages.nix
+
+sed -i -e "s/hassVersion =.*/hassVersion = \"${TARGET_VERSION}\";/" \
+    default.nix
+
+./parse-requirements.py
+(
+    cd ../../..
+    nix-update --version "$FRONTEND_VERSION" home-assistant.hass-frontend
+    nix-update --version "$TARGET_VERSION" --build home-assistant
+)
+
+git add ./component-packages.nix ./default.nix ./frontend.nix
+git commit -m "homeassistant: ${CURRENT_VERSION} -> ${TARGET_VERSION}"