Martin Weinelt 2026-07-04 22:12:45 +02:00
commit c2520f5d00
No known key found for this signature in database
GPG key ID: 87C1E9888F856759
4 changed files with 138 additions and 89 deletions

View file

@ -2,7 +2,7 @@
# Do not edit!
{
version = "2026.6.4";
version = "2026.7.1";
components = {
"3_day_blinds" =
ps: with ps; [
@ -42,10 +42,6 @@
ps: with ps; [
accuweather
];
"acer_projector" =
ps: with ps; [
serialx
];
"acmeda" =
ps: with ps; [
aiopulse
@ -245,10 +241,6 @@
"amp_motorization" =
ps: with ps; [
];
"ampio" =
ps: with ps; [
asmog
];
"analytics" =
ps: with ps; [
aiohasupervisor
@ -369,6 +361,9 @@
ps: with ps; [
sharp-aquos-rc
];
"aqvify" =
ps: with ps; [
]; # missing inputs: pyaqvify
"aranet" =
ps: with ps; [
aioesphomeapi
@ -422,7 +417,7 @@
ps: with ps; [
aiohasupervisor
paho-mqtt
];
]; # missing inputs: arwn-client
"aseko_pool_live" =
ps: with ps; [
aioaseko
@ -454,10 +449,6 @@
ps: with ps; [
pyatag
];
"aten_pe" =
ps: with ps; [
atenpdu
];
"atlanticcityelectric" =
ps: with ps; [
];
@ -551,9 +542,8 @@
serialx
zeroconf
];
"avion" =
"avosdim" =
ps: with ps; [
avion
];
"awair" =
ps: with ps; [
@ -643,10 +633,6 @@
ps: with ps; [
pybbox
];
"beewi_smartclim" =
ps: with ps; [
beewi-smartclim
];
"bge" =
ps: with ps; [
];
@ -905,6 +891,9 @@
"button" =
ps: with ps; [
];
"bwt" =
ps: with ps; [
];
"caldav" =
ps: with ps; [
caldav
@ -1005,6 +994,32 @@
ps: with ps; [
pychannels
];
"chef_iq" =
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
pyspeex-noise
serialx
zeroconf
]; # missing inputs: chefiq-ble
"chess_com" =
ps: with ps; [
chess-com-api
@ -1029,10 +1044,6 @@
ps: with ps; [
python-citybikes
];
"clementine" =
ps: with ps; [
python-clementine-remote
];
"clickatell" =
ps: with ps; [
];
@ -1114,7 +1125,7 @@
];
"command_line" =
ps: with ps; [
jsonpath
jsonpath-python
];
"compensation" =
ps: with ps; [
@ -1567,6 +1578,10 @@
ps: with ps; [
aioecowitt
];
"edifier_infrared" =
ps: with ps; [
infrared-protocols
];
"edimax" =
ps: with ps; [
pyedimax
@ -1615,10 +1630,6 @@
ps: with ps; [
elgato
];
"eliqonline" =
ps: with ps; [
eliqonline
];
"elkm1" =
ps: with ps; [
elkm1-lib
@ -1675,6 +1686,9 @@
"energie_vanons" =
ps: with ps; [
];
"energieleser" =
ps: with ps; [
]; # missing inputs: energieleser
"energy" =
ps: with ps; [
fnv-hash-fast
@ -1707,6 +1721,9 @@
ps: with ps; [
enturclient
];
"envertech_evt800" =
ps: with ps; [
]; # missing inputs: pyenvertechevt800
"environment_canada" =
ps: with ps; [
env-canada
@ -2276,7 +2293,6 @@
];
"gitter" =
ps: with ps; [
gitterpy
];
"glances" =
ps: with ps; [
@ -2441,14 +2457,15 @@
ps: with ps; [
greenplanet-energy-api
];
"greencell" =
ps: with ps; [
aiohasupervisor
paho-mqtt
]; # missing inputs: greencell_client
"greeneye_monitor" =
ps: with ps; [
greeneye-monitor
];
"greenwave" =
ps: with ps; [
greenwavereality
];
"group" =
ps: with ps; [
];
@ -2531,6 +2548,9 @@
"heiwa" =
ps: with ps; [
];
"helty" =
ps: with ps; [
]; # missing inputs: pyhelty
"heos" =
ps: with ps; [
pyheos
@ -2977,6 +2997,9 @@
ps: with ps; [
aioimmich
];
"imou" =
ps: with ps; [
]; # missing inputs: pyimouapi
"improv_ble" =
ps: with ps; [
aioesphomeapi
@ -3120,6 +3143,9 @@
ps: with ps; [
ha-iotawattpy
];
"iotorero" =
ps: with ps; [
];
"iotty" =
ps: with ps; [
iottycloud
@ -3212,8 +3238,7 @@
];
"itach" =
ps: with ps; [
pyitachip2ir
];
]; # missing inputs: pyitachip2ir2
"itunes" =
ps: with ps; [
];
@ -3358,6 +3383,10 @@
ps: with ps; [
kiwiki-client
];
"klik_aan_klik_uit" =
ps: with ps; [
rf-protocols
];
"kmtronic" =
ps: with ps; [
pykmtronic
@ -3367,12 +3396,16 @@
knocki
];
"knx" =
ps: with ps; [
ps:
with ps;
[
home-assistant-frontend
knx-frontend
knx-telegram-store
xknx
xknxproject
];
]
++ knx-telegram-store.optional-dependencies.sqlite;
"kodi" =
ps: with ps; [
pykodi
@ -3723,9 +3756,6 @@
psutil-home-assistant
sqlalchemy
];
"logentries" =
ps: with ps; [
];
"logger" =
ps: with ps; [
];
@ -3945,6 +3975,9 @@
ps: with ps; [
python-melcloud
];
"melcloud_home" =
ps: with ps; [
]; # missing inputs: aiomelcloudhome
"melissa" =
ps: with ps; [
py-melissa-climate
@ -4023,18 +4056,6 @@
ps: with ps; [
pycsspeechtts
];
"microsoft_face" =
ps: with ps; [
pyturbojpeg
];
"microsoft_face_detect" =
ps: with ps; [
pyturbojpeg
];
"microsoft_face_identify" =
ps: with ps; [
pyturbojpeg
];
"miele" =
ps: with ps; [
pymiele
@ -4274,7 +4295,6 @@
];
"msteams" =
ps: with ps; [
pymsteams
];
"mta" =
ps: with ps; [
@ -4418,6 +4438,9 @@
ps: with ps; [
neurio
];
"nexen" =
ps: with ps; [
];
"nexia" =
ps: with ps; [
nexia
@ -4886,6 +4909,7 @@
universal-silabs-flasher
zeroconf
zha
zha-quirks
];
"otp" =
ps: with ps; [
@ -4900,9 +4924,12 @@
ourgroceries
];
"overkiz" =
ps: with ps; [
ps:
with ps;
[
pyoverkiz
];
]
++ pyoverkiz.optional-dependencies.nexity;
"overseerr" =
ps: with ps; [
aiohasupervisor
@ -5504,7 +5531,11 @@
"raspberry_pi" =
ps: with ps; [
aiohasupervisor
aiousbwatcher
ha-silabs-firmware-client
psutil-home-assistant
serialx
universal-silabs-flasher
];
"raspyrfm" =
ps: with ps; [
@ -5592,7 +5623,7 @@
];
"rest" =
ps: with ps; [
jsonpath
jsonpath-python
xmltodict
];
"rest_command" =
@ -5807,7 +5838,7 @@
"scrape" =
ps: with ps; [
beautifulsoup4
jsonpath
jsonpath-python
lxml
xmltodict
];
@ -5821,10 +5852,6 @@
"script" =
ps: with ps; [
];
"scsgate" =
ps: with ps; [
scsgate
];
"search" =
ps: with ps; [
];
@ -6297,6 +6324,9 @@
];
"srp_energy" =
ps: with ps; [
fnv-hash-fast
psutil-home-assistant
sqlalchemy
srpenergy
];
"ssdp" =
@ -6406,7 +6436,7 @@
];
"swisscom" =
ps: with ps; [
];
]; # missing inputs: python-swisscom-internet-box
"switch" =
ps: with ps; [
];
@ -6446,6 +6476,29 @@
];
"switchbot_cloud" =
ps: with ps; [
aiohasupervisor
aiousbwatcher
bleak
bleak-retry-connector
bluetooth-adapters
bluetooth-auto-recovery
bluetooth-data-tools
cronsim
dbus-fast
ha-ffmpeg
habluetooth
hass-nabucasa
hassil
home-assistant-intents
matter-ble-proxy
matter-python-client
mutagen
openai
pymicro-vad
pyspeex-noise
pyturbojpeg
securetar
serialx
switchbot-api
];
"switcher_kis" =
@ -6718,10 +6771,6 @@
pytibber
sqlalchemy
];
"tikteck" =
ps: with ps; [
tikteck
];
"tile" =
ps: with ps; [
pytile
@ -7018,10 +7067,6 @@
ps: with ps; [
unifi-discovery
];
"unifiled" =
ps: with ps; [
unifiled
];
"unifiprotect" =
ps: with ps; [
uiprotect
@ -7314,6 +7359,9 @@
ps: with ps; [
aiowatttime
];
"wattwaechter" =
ps: with ps; [
]; # missing inputs: aio-wattwaechter
"waze_travel_time" =
ps: with ps; [
pywaze
@ -7686,6 +7734,7 @@
serialx
universal-silabs-flasher
zha
zha-quirks
];
"zhong_hong" =
ps: with ps; [
@ -7792,6 +7841,7 @@
"aprs"
"apsystems"
"aquacell"
"aqualogic"
"aranet"
"arcam_fmj"
"arve"
@ -7947,6 +7997,7 @@
"econet"
"ecovacs"
"ecowitt"
"edifier_infrared"
"edl21"
"efergy"
"egauge"
@ -7974,6 +8025,7 @@
"enocean"
"enphase_envoy"
"environment_canada"
"envisalink"
"epic_games_store"
"epion"
"epson"
@ -8213,6 +8265,7 @@
"kiosker"
"kira"
"kitchen_sink"
"klik_aan_klik_uit"
"kmtronic"
"knocki"
"knx"
@ -8259,7 +8312,6 @@
"locative"
"lock"
"logbook"
"logentries"
"logger"
"lojack"
"london_air"
@ -8305,9 +8357,6 @@
"mfi"
"microbees"
"microsoft"
"microsoft_face"
"microsoft_face_detect"
"microsoft_face_identify"
"miele"
"mikrotik"
"mill"
@ -8559,6 +8608,7 @@
"ruuvitag_ble"
"rympro"
"sabnzbd"
"saj"
"samsung_infrared"
"samsungtv"
"sanix"
@ -8748,6 +8798,7 @@
"ukraine_alarm"
"unifi"
"unifi_access"
"unifi_direct"
"unifi_discovery"
"unifiprotect"
"universal"

View file

@ -270,7 +270,7 @@ let
extraBuildInputs = extraPackages python3Packages;
# Don't forget to run update-component-packages.py after updating
hassVersion = "2026.6.4";
hassVersion = "2026.7.1";
in
python3Packages.buildPythonApplication rec {
@ -291,13 +291,13 @@ python3Packages.buildPythonApplication rec {
owner = "home-assistant";
repo = "core";
tag = version;
hash = "sha256-NeqJT2CW8A0VfUJ2yrR+KGmmQMK8q0Wdag43rUBBoWU=";
hash = "sha256-3QQ4zDbhr6wD0AR7QOnG3mfbtKYcesCF9qrFwRleQfU=";
};
# Secondary source is pypi sdist for translations
sdist = fetchPypi {
inherit pname version;
hash = "sha256-7Y26vN0oskJBgijtm9RZcvHw/xBEH3IsI8hezgsOVr0=";
hash = "sha256-++Hb/ZXXhqnf7wOzmi5kmENFHqhLavZFJijRFMQu9Lg=";
};
build-system = with python3Packages; [

View file

@ -8,7 +8,7 @@ buildPythonPackage (finalAttrs: {
# 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 = "20260527.7";
version = "20260624.4";
format = "wheel";
src = fetchPypi {
@ -17,7 +17,7 @@ buildPythonPackage (finalAttrs: {
pname = "home_assistant_frontend";
dist = "py3";
python = "py3";
hash = "sha256-zYm8K3HJnAkT41S6TmGvj8V8zpt7tb4pRtWCiB9PEXw=";
hash = "sha256-mC3+BGVT9sDlHhj2aNeqh0YMehE3BAAT8SfMOQKv4/E=";
};
# there is nothing to strip in this package

View file

@ -1,25 +1,23 @@
diff --git a/homeassistant/components/http/static.py b/homeassistant/components/http/static.py
index 29c5840a4bf..463c723df91 100644
index 40405a8734d..754edffb910 100644
--- a/homeassistant/components/http/static.py
+++ b/homeassistant/components/http/static.py
@@ -7,6 +7,7 @@ from pathlib import Path
from typing import Final
@@ -5,6 +5,7 @@ from pathlib import Path
from typing import Final, override
from aiohttp.hdrs import CACHE_CONTROL, CONTENT_TYPE
+from aiohttp.typedefs import PathLike
from aiohttp.web import FileResponse, Request, StreamResponse
from aiohttp.web_fileresponse import CONTENT_TYPES, FALLBACK_CONTENT_TYPE
from aiohttp.web_urldispatcher import StaticResource
@@ -21,6 +22,12 @@ RESPONSE_CACHE: LRU[tuple[str, Path], tuple[Path, str]] = LRU(512)
@@ -20,6 +21,10 @@ _GUESSER = CONTENT_TYPES.guess_file_type
class CachingStaticResource(StaticResource):
"""Static Resource handler that will add cache headers."""
+ def __init__(self, prefix: str, directory: PathLike, **kwargs):
+ """Allow static files to be hosted behind symlinks."""
+ kwargs.update({"follow_symlinks": True})
+ super().__init__(prefix, directory, **kwargs)
+
+
@override
async def _handle(self, request: Request) -> StreamResponse:
"""Wrap base handler to cache file path resolution and content type guess."""
rel_url = request.match_info["filename"]