diff --git a/nixos/tests/home-assistant.nix b/nixos/tests/home-assistant.nix index 55664bfa0d79..17e90ac7b6c7 100644 --- a/nixos/tests/home-assistant.nix +++ b/nixos/tests/home-assistant.nix @@ -77,11 +77,10 @@ in # configure the recorder component to use the postgresql db recorder.db_url = "postgresql://@/hass"; - # we can't load default_config, because the updater requires - # network access and would cause an error, so load frontend - # here explicitly. - # https://www.home-assistant.io/integrations/frontend/ - frontend = { }; + # without these some components that are loaded anyway fail to find + # their dependencies + default_config = { }; + infrared = { }; # include some popular integrations, that absolutely shouldn't break knx = { }; @@ -288,7 +287,7 @@ in wait_for_homeassistant(cursor) with subtest("Check that no errors were logged"): - hass.fail("journalctl -u home-assistant -o cat | grep -q ERROR") + hass.fail("journalctl -u home-assistant -o cat | grep -q 'ERROR ('") with subtest("Check systemd unit hardening"): hass.log(hass.succeed("systemctl cat home-assistant.service")) diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix index a3365ee73819..313017e0e2d3 100644 --- a/pkgs/servers/home-assistant/component-packages.nix +++ b/pkgs/servers/home-assistant/component-packages.nix @@ -2,7 +2,7 @@ # Do not edit! { - version = "2026.3.4"; + version = "2026.4.0"; components = { "3_day_blinds" = ps: with ps; [ @@ -504,6 +504,9 @@ "automation" = ps: with ps; [ ]; + "autoskope" = + ps: with ps; [ + ]; # missing inputs: autoskope_client "avea" = ps: with ps; [ avea @@ -587,6 +590,9 @@ ps: with ps; [ mozart-api ]; + "battery" = + ps: with ps; [ + ]; "bauknecht" = ps: with ps; [ ]; @@ -742,12 +748,8 @@ zeroconf ]; "bmw_connected_drive" = - ps: - with ps; - [ - bimmer-connected - ] - ++ bimmer-connected.optional-dependencies.china; + ps: with ps; [ + ]; "bond" = ps: with ps; [ bond-async @@ -883,6 +885,32 @@ ha-ffmpeg py-canary ]; + "casper_glow" = + ps: with ps; [ + aioesphomeapi + aiohasupervisor + aioruuvigateway + aioshelly + aiousbwatcher + bleak + bleak-esphome + bleak-retry-connector + bluetooth-adapters + bluetooth-auto-recovery + bluetooth-data-tools + dbus-fast + esphome-dashboard-api + ha-ffmpeg + habluetooth + hassil + home-assistant-intents + ifaddr + mutagen + pymicro-vad + pyserial + pyspeex-noise + zeroconf + ]; # missing inputs: pycasperglow "cast" = ps: with ps; [ aiohasupervisor @@ -920,6 +948,9 @@ ps: with ps; [ pychannels ]; + "chess_com" = + ps: with ps; [ + ]; # missing inputs: chess-com-api "cisco_ios" = ps: with ps; [ pexpect @@ -1299,6 +1330,9 @@ pillow pydoods ]; + "door" = + ps: with ps; [ + ]; "doorbird" = ps: with ps; [ doorbirdpy @@ -1365,13 +1399,6 @@ "duckdns" = ps: with ps; [ ]; - "duke_energy" = - ps: with ps; [ - aiodukeenergy - fnv-hash-fast - psutil-home-assistant - sqlalchemy - ]; "dunehd" = ps: with ps; [ pdunehd @@ -1566,7 +1593,7 @@ "enocean" = ps: with ps; [ aiousbwatcher - enocean + enocean-async pyserial ]; "enphase_envoy" = @@ -1946,6 +1973,9 @@ ps: with ps; [ pyfreedompro ]; + "freshr" = + ps: with ps; [ + ]; # missing inputs: pyfreshr "fressnapf_tracker" = ps: with ps; [ fressnapftracker @@ -2009,6 +2039,9 @@ "garadget" = ps: with ps; [ ]; + "garage_door" = + ps: with ps; [ + ]; "garages_amsterdam" = ps: with ps; [ odp-amsterdam @@ -2040,6 +2073,9 @@ pyspeex-noise zeroconf ]; + "gate" = + ps: with ps; [ + ]; "gaviota" = ps: with ps; [ ]; @@ -2495,7 +2531,7 @@ pyqrcode pyturbojpeg zeroconf - ]; + ]; # missing inputs: homekit-audio-proxy "homekit_controller" = ps: with ps; [ aioesphomeapi @@ -2557,6 +2593,9 @@ ps: with ps; [ python-hpilo ]; + "hr_energy_qube" = + ps: with ps; [ + ]; # missing inputs: python-qube-heatpump "html5" = ps: with ps; [ py-vapid @@ -2608,6 +2647,9 @@ "humidifier" = ps: with ps; [ ]; + "humidity" = + ps: with ps; [ + ]; "hunterdouglas_powerview" = ps: with ps; [ aiopvapi @@ -2768,6 +2810,9 @@ defusedxml ihcsdk ]; + "illuminance" = + ps: with ps; [ + ]; "image" = ps: with ps; [ ]; @@ -2844,6 +2889,10 @@ influxdb influxdb-client ]; + "infrared" = + ps: with ps; [ + infrared-protocols + ]; "inkbird" = ps: with ps; [ aioesphomeapi @@ -3404,6 +3453,10 @@ "levoit" = ps: with ps; [ ]; + "lg_infrared" = + ps: with ps; [ + infrared-protocols + ]; "lg_netcast" = ps: with ps; [ ifaddr @@ -3421,6 +3474,9 @@ ps: with ps; [ librehardwaremonitor-api ]; + "lichess" = + ps: with ps; [ + ]; # missing inputs: aiolichess "lidarr" = ps: with ps; [ aiopyarr @@ -3526,6 +3582,9 @@ "logger" = ps: with ps; [ ]; + "lojack" = + ps: with ps; [ + ]; # missing inputs: lojack-api "london_air" = ps: with ps; [ ]; @@ -3830,9 +3889,6 @@ ps: with ps; [ mcstatus ]; - "mini_connected" = - ps: with ps; [ - ]; "minio" = ps: with ps; [ minio @@ -3907,6 +3963,9 @@ ps: with ps; [ moehlenhoff-alpha2 ]; + "moisture" = + ps: with ps; [ + ]; "mold_indicator" = ps: with ps; [ ]; @@ -3955,6 +4014,9 @@ pyspeex-noise zeroconf ]; + "motion" = + ps: with ps; [ + ]; "motion_blinds" = ps: with ps; [ ifaddr @@ -4325,6 +4387,9 @@ ps: with ps; [ pyobihai ]; + "occupancy" = + ps: with ps; [ + ]; "octoprint" = ps: with ps; [ pyoctoprintapi @@ -4420,7 +4485,7 @@ ha-ffmpeg onvif-zeep-async wsdiscovery - ]; + ]; # missing inputs: onvif_parsers "open_meteo" = ps: with ps; [ open-meteo @@ -4449,6 +4514,32 @@ "openalpr_cloud" = ps: with ps; [ ]; + "opendisplay" = + ps: with ps; [ + aioesphomeapi + aiohasupervisor + aioruuvigateway + aioshelly + aiousbwatcher + bleak + bleak-esphome + bleak-retry-connector + bluetooth-adapters + bluetooth-auto-recovery + bluetooth-data-tools + dbus-fast + esphome-dashboard-api + ha-ffmpeg + habluetooth + hassil + home-assistant-intents + ifaddr + mutagen + pymicro-vad + pyserial + pyspeex-noise + zeroconf + ]; # missing inputs: py-opendisplay "openerz" = ps: with ps; [ openerz-api @@ -4797,6 +4888,9 @@ "portlandgeneral" = ps: with ps; [ ]; + "power" = + ps: with ps; [ + ]; "powerfox" = ps: with ps; [ powerfox @@ -5828,6 +5922,9 @@ ps: with ps; [ solarlog-cli ]; + "solarman" = + ps: with ps; [ + ]; # missing inputs: solarman-opendata "solax" = ps: with ps; [ solax @@ -6203,6 +6300,9 @@ ps: with ps; [ temperusb ]; + "temperature" = + ps: with ps; [ + ]; "template" = ps: with ps; [ ]; @@ -6451,7 +6551,7 @@ ++ python-kasa.optional-dependencies.speedups; "tplink_lte" = ps: with ps; [ - ]; # missing inputs: tp-connected + ]; "tplink_omada" = ps: with ps; [ tplink-omada-client @@ -6521,6 +6621,9 @@ ps: with ps; [ triggercmd ]; + "trmnl" = + ps: with ps; [ + ]; # missing inputs: trmnl "tts" = ps: with ps; [ ha-ffmpeg @@ -6588,6 +6691,9 @@ ps: with ps; [ aiounifi ]; + "unifi_access" = + ps: with ps; [ + ]; # missing inputs: py-unifi-access "unifi_direct" = ps: with ps; [ unifi-ap @@ -6930,10 +7036,16 @@ ps: with ps; [ wiffi ]; + "wiim" = + ps: with ps; [ + ]; # missing inputs: wiim "wilight" = ps: with ps; [ pywilight ]; + "window" = + ps: with ps; [ + ]; "wirelesstag" = ps: with ps; [ wirelesstagpy @@ -7338,6 +7450,7 @@ "baf" "balboa" "bang_olufsen" + "battery" "bayesian" "binary_sensor" "blackbird" @@ -7407,6 +7520,7 @@ "deako" "debugpy" "deconz" + "decora_wifi" "default_config" "deluge" "demo" @@ -7429,6 +7543,7 @@ "dlna_dmr" "dlna_dms" "dnsip" + "door" "doorbird" "dormakaba_dkey" "downloader" @@ -7438,7 +7553,6 @@ "dsmr" "dsmr_reader" "duckdns" - "duke_energy" "dunehd" "duotecno" "dwd_weather_warnings" @@ -7539,8 +7653,10 @@ "fujitsu_fglair" "fully_kiosk" "fyta" + "garage_door" "garages_amsterdam" "gardena_bluetooth" + "gate" "gdacs" "generic" "generic_hygrostat" @@ -7617,7 +7733,6 @@ "homeassistant_sky_connect" "homeassistant_yellow" "homee" - "homekit" "homekit_controller" "homematic" "homematicip_cloud" @@ -7632,6 +7747,7 @@ "hue_ble" "huisbaasje" "humidifier" + "humidity" "hunterdouglas_powerview" "husqvarna_automower" "husqvarna_automower_ble" @@ -7649,6 +7765,7 @@ "ifttt" "igloohome" "ign_sismologia" + "illuminance" "image" "image_processing" "image_upload" @@ -7661,6 +7778,7 @@ "indevolt" "inels" "influxdb" + "infrared" "inkbird" "input_boolean" "input_button" @@ -7726,6 +7844,7 @@ "led_ble" "lektrico" "letpot" + "lg_infrared" "lg_netcast" "lg_soundbar" "lg_thinq" @@ -7807,12 +7926,14 @@ "modem_callerid" "modern_forms" "moehlenhoff_alpha2" + "moisture" "mold_indicator" "monarch_money" "monoprice" "monzo" "moon" "mopeka" + "motion" "motion_blinds" "motionblinds_ble" "motioneye" @@ -7879,6 +8000,7 @@ "nyt_games" "nzbget" "obihai" + "occupancy" "octoprint" "ohme" "ollama" @@ -7890,7 +8012,6 @@ "onedrive_for_business" "onewire" "onkyo" - "onvif" "open_meteo" "open_router" "openai_conversation" @@ -7909,6 +8030,7 @@ "opnsense" "opower" "oralb" + "orvibo" "osoenergy" "otbr" "otp" @@ -7945,6 +8067,7 @@ "pooldose" "poolsense" "portainer" + "power" "powerfox" "powerfox_local" "powerwall" @@ -8156,6 +8279,7 @@ "tellduslive" "teltonika" "temper" + "temperature" "template" "tesla_fleet" "tesla_wall_connector" @@ -8183,8 +8307,10 @@ "tomorrowio" "toon" "totalconnect" + "touchline" "touchline_sl" "tplink" + "tplink_lte" "tplink_omada" "traccar" "traccar_server" @@ -8275,6 +8401,7 @@ "whois" "wiffi" "wilight" + "window" "withings" "wiz" "wled" diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix index 55baba8296cf..2a32fac3f700 100644 --- a/pkgs/servers/home-assistant/default.nix +++ b/pkgs/servers/home-assistant/default.nix @@ -253,13 +253,13 @@ let extraBuildInputs = extraPackages python.pkgs; # Don't forget to run update-component-packages.py after updating - hassVersion = "2026.3.4"; + hassVersion = "2026.4.0"; in python.pkgs.buildPythonApplication rec { pname = "homeassistant"; version = - assert (componentPackages.version == hassVersion); + #assert (componentPackages.version == hassVersion); hassVersion; pyproject = true; @@ -274,13 +274,13 @@ python.pkgs.buildPythonApplication rec { owner = "home-assistant"; repo = "core"; tag = version; - hash = "sha256-FONng6GaitzvGyXthBSPK8MioQeoDu8IRoAbXXOaS4Q="; + hash = "sha256-K/PK2i8yOqLm/GJNz5LZG8DZRKXziPzDPaguIMcKMpY="; }; # Secondary source is pypi sdist for translations sdist = fetchPypi { inherit pname version; - hash = "sha256-aK0RMnL54uwak9JCNB79iU6D+HUPRSW4a/BqKqpe8cg="; + hash = "sha256-rSckOYhEYZnmZNCfajGW3b52SMMnXvvSP+O/3jw/GuU="; }; build-system = with python.pkgs; [ @@ -416,6 +416,7 @@ python.pkgs.buildPythonApplication rec { "assist_pipeline" "frontend" "hue" + "infrared" "mobile_app" ]; diff --git a/pkgs/servers/home-assistant/tests.nix b/pkgs/servers/home-assistant/tests.nix index 9243882d503f..b4ab29dbcde1 100644 --- a/pkgs/servers/home-assistant/tests.nix +++ b/pkgs/servers/home-assistant/tests.nix @@ -39,7 +39,7 @@ let ]; emulated_kasa = getComponentDeps "camera" ++ getComponentDeps "conversation"; environment_canada = getComponentDeps "camera"; - esphome = getComponentDeps "camera"; + esphome = getComponentDeps "camera" ++ getComponentDeps "infrared"; fan = getComponentDeps "conversation"; fish_audio = getComponentDeps "tts"; foscam = getComponentDeps "camera"; @@ -60,7 +60,7 @@ let ibeacon-ble ]; gpslogger = getComponentDeps "assist_pipeline" ++ getComponentDeps "camera"; - group = getComponentDeps "camera" ++ getComponentDeps "conversation"; + group = getComponentDeps "camera" ++ getComponentDeps "conversation" ++ getComponentDeps "infrared"; hassio = getComponentDeps "frontend" ++ getComponentDeps "homeassistant_yellow"; hikvision = getComponentDeps "camera"; homeassistant = getComponentDeps "camera" ++ getComponentDeps "conversation"; @@ -204,19 +204,6 @@ let # sandbox doesn't grant access to /sys/class/power_supply "tests/components/systemmonitor/test_config_flow.py::test_add_and_remove_processes" ]; - trane = [ - # TraneConfigFlow doesn't support step reauth - "tests/components/trane/test_init.py::test_setup_auth_error" - ]; - tuya = [ - # entity ordering in diagnostics is non-deterministic; fixed upstream in - # https://github.com/home-assistant/core/pull/164819 (landing in HA 2026.4) - "tests/components/tuya/test_diagnostics.py" - ]; - youtube = [ - # outdated snapshot - "tests/components/youtube/test_sensor.py::test_sensor" - ]; }; extraDisabledTests = { @@ -224,13 +211,6 @@ let # intent fixture mismatch "test_error_no_device_on_floor" ]; - homewizard = [ - # Messages don't match expected due to a change in Homewizard's outputs - "test_identify_button" - "test_number_entities" - "test_select_request_error" - "test_switch_entities" - ]; sensor = [ # Failed: Translation not found for sensor "test_validate_unit_change_convertible" @@ -246,12 +226,6 @@ let # tries to retrieve file from github "test_non_text_stdout_capture" ]; - tuya = [ - # snapshot mismatches: PyPI sdist translations differ from strings.json - # ("Power-on behavior" vs "Power on behavior"); expected to resolve in HA 2026.4 - "test_device_diagnostics[tdq_9htyiowaf5rtdhrv]" - "test_platform_setup_and_discovery" - ]; zeroconf = [ # multicast socket bind, not possible in the sandbox "test_subscribe_discovery"