home-assistant: 2026.3.4 -> 2026.4.0

https://www.home-assistant.io/blog/2026/04/01/release-20264/
This commit is contained in:
Robert Schütz
2026-04-02 13:10:33 -07:00
parent d6ede74cc2
commit 90a2e47acd
4 changed files with 163 additions and 62 deletions
+5 -6
View File
@@ -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"))
@@ -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"
+5 -4
View File
@@ -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"
];
+2 -28
View File
@@ -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"