Skip to content
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
387 commits
Select commit Hold shift + click to select a range
a19aebe
Keep add-on update entity in progress across post-install refresh (#1…
agners Apr 24, 2026
aad93fd
Add tests asserting condition features (#168881)
emontnemery Apr 24, 2026
599fe25
Fix feedreader tests broken by Python 3.14.3 asyncio changes (#169080)
mib1185 Apr 24, 2026
e422c08
Support media player for Shelly Wall Display (#168494)
bieniu Apr 24, 2026
a53d3ea
Update frontend to 20260325.8 (#169076)
bramkragten Apr 24, 2026
8b2afb4
Add a dynamic sensitivity slider for Matter sensors (#167710)
wardmatter Apr 24, 2026
9369a5d
Slow down Tractive API polling to avoid 429 too many requests (#169057)
bieniu Apr 24, 2026
4d8acfa
Disable knx tests broken by Python 3.14.3 asyncio changes (#169079)
justanotherariel Apr 24, 2026
9cf9540
Fixed Kodi Media Browsing (#165819)
albaintor Apr 20, 2026
056ff95
Fix Victron BLE false reauth on unrecognised advertisement mode bytes…
rajlaud Apr 17, 2026
fcd6f78
Fix case-sensitive MIME type check in Google Generative AI TTS (#168458)
MohamedBarrak3 Apr 21, 2026
7fad242
Hive - Bump pyhive-integration to 1.0.9 (#168489)
KJonline Apr 18, 2026
f84bf99
Bump aioamazondevices to 13.4.3 (#168536)
chemelli74 Apr 19, 2026
4f5d0a7
Disable plex tests broken by Python 3.14.3 asyncio changes (#169069)
justanotherariel Apr 24, 2026
6fe1862
Disable dsmr tests broken by Python 3.14.3 asyncio changes (#169064)
justanotherariel Apr 24, 2026
446d89a
Disable rflink tests broken by Python 3.14.3 asyncio changes (#169074)
justanotherariel Apr 24, 2026
0db50ac
Fix MQTT JSON light restoring None color_mode on startup (#168608)
noerstad Apr 20, 2026
ed560f0
Add Roborock fan speed validation and error handling (#168623)
allenporter Apr 21, 2026
39b690b
Correct state/device class for water in gardena (#168637)
elupus Apr 20, 2026
ca4d36d
Cancel and await idle_start future if the task was canceled after an …
jbouwh Apr 22, 2026
838feef
Validate local_only user property during ws auth phase (#168812)
edenhaus Apr 22, 2026
245b9ed
Update Tibber library, 0.37.2 (#169027)
Danielhiversen Apr 24, 2026
19dd68b
Slow down Tractive API polling to avoid 429 too many requests (#169057)
bieniu Apr 24, 2026
4507f9a
Bump aiotractive to 1.0.3 (#169059)
bieniu Apr 24, 2026
9621307
Validate local_only user for signed requests (#169066)
edenhaus Apr 24, 2026
458b5fe
Update frontend to 20260325.8 (#169076)
bramkragten Apr 24, 2026
f479b0a
Bump version to 2026.4.4
frenck Apr 24, 2026
ca70abe
Refactor button platform to use indevolt-api 1.4.2 (#169063)
Xirt Apr 24, 2026
1e0dc86
Use new UPTIME sensor class for Shelly (#169088)
chemelli74 Apr 24, 2026
822b97d
Upgrade unifi_access quality scale to platinum (#168204)
RaHehl Apr 24, 2026
2deb364
Reinforce Python 3.14 exceptions Agent instructions (#169089)
abmantis Apr 24, 2026
b5e66bb
2026.4.4 (#169092)
frenck Apr 24, 2026
99185bf
Bump israel-rail-api to 0.1.5 (#169094)
mikomgk Apr 24, 2026
e7aa672
Register MAC address connections on Synology DSM hub device (#169085)
tomwilkie Apr 24, 2026
4625176
Upgrade Twente Milieu quality scale to platinum (#169104)
frenck Apr 24, 2026
2278423
Upgrade Elgato quality scale to platinum (#169102)
frenck Apr 24, 2026
2eb9f69
Bump indevolt-api to 1.4.3 (#169103)
Xirt Apr 25, 2026
e509c9b
Migrate `onvif` to use `entry.runtime_data` (#169106)
mib1185 Apr 25, 2026
54e3c3f
Extract common entity base class for RDW (#169118)
frenck Apr 25, 2026
757deb3
Add reconfiguration flow to Notifications for Android TV / Fire TV (#…
tr4nt0r Apr 25, 2026
6862b80
Update fumis to v0.4.0 (#169097)
frenck Apr 25, 2026
1978c97
Filter unknown values from arcam enum (#169124)
elupus Apr 25, 2026
77fd120
Protect update coordinator callbacks (#169122)
elupus Apr 25, 2026
c3f66f9
Set parallel updates to 0 for Forecast.Solar (#169126)
frenck Apr 25, 2026
5a79dd9
Bump aiomealie to 1.2.4 (#169125)
andrew-codechimp Apr 25, 2026
9e1c022
Set parallel updates for Hydrawise platforms (#169101)
frenck Apr 25, 2026
48b650c
Modernize RDW config flow tests (#169129)
frenck Apr 25, 2026
db76773
Standardize ISY994 sensor units and device classes (#169017)
shbatm Apr 25, 2026
b474a42
unifiprotect: bump uiprotect to 10.4.0 (#169146)
RaHehl Apr 25, 2026
759ac2e
Add battery storage data sensors to SolarEdge integration (#161722)
it-rec Apr 25, 2026
f225d81
homematicip_cloud: migrate entity unique IDs to stable format (#166580)
lackas Apr 25, 2026
19ebb1d
Update knx-frontend to 2026.4.25.155016: Add notes to UI expose (#169…
farmio Apr 25, 2026
f06cd25
Add GPT-5.5 support (#169112)
Shulyaka Apr 25, 2026
77df31f
Add climate platform tests for nobo_hub (#169010)
oyvindwe Apr 25, 2026
c48502a
Remove `name` from AccuWeather config flow (#169142)
bieniu Apr 25, 2026
8e3070a
Add reconfiguration flow to PVOutput (#169123)
frenck Apr 25, 2026
d1bdd6e
Upgrade UniFi Network integration quality scale to Silver (#168736)
RaHehl Apr 25, 2026
9ccc2e7
Add temperature sensor to Duco integration (#169021)
ronaldvdmeer Apr 25, 2026
e9ca925
Preserve sub-meter GPS accuracy in mobile_app webhooks (#169144)
mayerwin Apr 25, 2026
c1894ed
Detect .start entry point files in hassfest check (#169135)
cdce8p Apr 25, 2026
306fc52
Switchbot_BLE: bump PySwitchbot to 2.2.0 (#169119)
XiaoLing-git Apr 25, 2026
e19d0e7
Wolflink: Fixing Codeowner (#169171)
EnjoyingM Apr 25, 2026
e7dae02
Bump aioaquacell to 1.0.0 (#169166)
Jordi1990 Apr 25, 2026
d832abc
Add climate entity to Waterfurnace (#168729)
masterkoppa Apr 25, 2026
1bf77e0
Migrate `refoss` to use `entry.runtime_data` (#169105)
mib1185 Apr 25, 2026
2c4f598
Add button platform to Fumis integration (#169095)
frenck Apr 25, 2026
595f041
Add MQTT datetime platform (#169091)
jbouwh Apr 25, 2026
77c7225
Fix None is not and allowed Unit of Measurement during MQTT Device se…
jbouwh Apr 25, 2026
e8e9914
Template vacuum segments (#167805)
gustavakerstrom Apr 26, 2026
8673694
Try to fix `RFLink` tests broken by Python 3.14.3 asyncio changes (#1…
javicalle Apr 26, 2026
f1fcca2
Bump satel_integra to 1.2.2 (#169180)
Tommatheussen Apr 26, 2026
eed4acc
Add radio_frequency platform to Broadlink (#169128)
piitaya Apr 26, 2026
e78a79a
Remove `name` from Airly config flow (#169145)
bieniu Apr 26, 2026
a506be4
Remove TARGET_TEMPERATURE_RANGE from eurotronic climate (#169182)
rikroe Apr 26, 2026
aa0199b
Add LG Netcast service to send remote control commands (#168649)
mithomas Apr 26, 2026
fa9a336
Bump actron-neo-api to 0.5.5 (#169176)
kclif9 Apr 26, 2026
cd98577
Update easyEnergy integration to v3.0.0 (#169162)
klaasnicolaas Apr 26, 2026
6384e6b
Add alarm control panel platform to UniFi Protect (#169158)
RaHehl Apr 26, 2026
b5a1b59
Bump uiprotect to 10.4.1 (#169192)
RaHehl Apr 26, 2026
d20d1df
Add reset buttons for dock strainer and maintenance brush consumables…
CSdread Apr 26, 2026
9293797
Add cleaning route for Q7 vacuums (#169177)
Lash-L Apr 26, 2026
f1bbe42
Use the carbon monoxide device class in the Airly integration (#169193)
bieniu Apr 26, 2026
ed1aefc
Bump pyloadapi to 2.1.0 (#169215)
tr4nt0r Apr 26, 2026
2dd1632
Restrict Insteon link management services to admins (#169206)
balloob Apr 27, 2026
f278711
Restrict file.read_file service to admin users (#169204)
balloob Apr 27, 2026
040c960
Require admin for deCONZ services (#169207)
balloob Apr 27, 2026
5af3b36
Enforce admin policy for assist_satellite ask_question service (#169231)
balloob Apr 27, 2026
392c46c
Remove unique id in dnsip (#169211)
gjohansson-ST Apr 27, 2026
07c1448
Cleanup deprecated SEND_PIN service in blink (#169253)
epenet Apr 27, 2026
70947c6
Require admin for fritz.set_guest_wifi_password service (#169233)
balloob Apr 27, 2026
e684490
Fix google_generative_ai_conversation tests broken by Python 3.14.3 a…
epenet Apr 27, 2026
e3de695
Fix openai_conversation tests broken by Python 3.14.3 asyncio changes…
epenet Apr 27, 2026
5cedb0b
Apply Tuya device quirks on device registration (#168897)
epenet Apr 27, 2026
43fa4f2
Use runtime_data in yeelight (#169260)
epenet Apr 27, 2026
4d4e458
Use HassKey in wemo (#169261)
epenet Apr 27, 2026
45978f4
Use runtime_data in xiaomi_aqara (#169262)
epenet Apr 27, 2026
86af61d
Generalize radio_frequency test fixtures in components conftest (#169…
balloob Apr 27, 2026
605eea6
Migrate yeelight to use HassKey for shared custom effects (#169268)
epenet Apr 27, 2026
e9fc6b3
Merge branch 'master' into dev
frenck Apr 27, 2026
64c9a76
Add binary sensor platform to Fumis integration (#169032)
frenck Apr 27, 2026
64f2fa4
Add integration type service to HTML5 Push notifications (#169015)
tr4nt0r Apr 27, 2026
6902504
Bump holidays lib to 0.95 (#169199)
gjohansson-ST Apr 27, 2026
a381a3a
Update vehicle to 3.0.0 (#169127)
frenck Apr 27, 2026
cb62562
Migrate waze_travel_time to use HassKey for shared semaphore (#169264)
epenet Apr 27, 2026
6ec4466
Remove deprecated action from google generative AI (#169255)
epenet Apr 27, 2026
84a5ba2
Remove unused `name` string from AccuWeather strings (#169195)
bieniu Apr 27, 2026
12280db
Add sensor platform tests for nobo_hub (#169008)
oyvindwe Apr 27, 2026
0cc531e
Remove unused line of code in Velux integration (#168987)
wollew Apr 27, 2026
3673a80
Fix Google Generative AI token usage statistics tracing (#169222)
allenporter Apr 27, 2026
2053e61
Refactor anthropic stream processing (#168980)
Shulyaka Apr 27, 2026
3cc6cc9
Set integration type helper in OTP integration (#169012)
tr4nt0r Apr 27, 2026
ed371bc
Deprecate yaml import in Shopping List (#169084)
mib1185 Apr 27, 2026
54727a6
Require admin access for hassio Supervisor services (#169226)
balloob Apr 27, 2026
5d98f46
Migrate esphome to use HassKey (#168873)
epenet Apr 27, 2026
6422066
Require admin for management WebSocket commands (#169209)
balloob Apr 27, 2026
8a22e84
Verify local_only webhook on MockRequest (#169271)
edenhaus Apr 27, 2026
9321ff5
Fix missing mock in switcher_kis config flow test (#169286)
epenet Apr 27, 2026
a5b6576
Fix flaky KNX test (#169288)
farmio Apr 27, 2026
9390bf3
Fix incorrect CONF_ID in twinkly tests (#169284)
epenet Apr 27, 2026
91d5c08
Add missing mock in izone tests (#169287)
epenet Apr 27, 2026
9cc9f24
Raise ConfigEntryError on decora_wifi authentication error (#169285)
epenet Apr 27, 2026
ad836b4
Fix Green Planet Energy timestamp sensors (#166153)
petschni Apr 27, 2026
0eb2045
Bump python-duco-client to 0.3.9 (#169174)
ronaldvdmeer Apr 27, 2026
d119bbe
Require admin for configurator.configure service (#169230)
balloob Apr 27, 2026
663538c
Require admin for cloud preference and support package endpoints (#16…
balloob Apr 27, 2026
080eb6a
Require admin for backup.create and backup.create_automatic services …
balloob Apr 27, 2026
21a3c5b
Require admin for logger.set_level and logger.set_default_level servi…
balloob Apr 27, 2026
cc1eaa7
Bump aiocomelit to 2.0.3 (#169300)
chemelli74 Apr 27, 2026
6c89ecb
Improve subscription handling in shelly tests (#169293)
epenet Apr 27, 2026
370babf
Require admin for diagnostics download and application credentials li…
balloob Apr 27, 2026
6893d2b
Migrate remaining top-level async_register_command handlers to decora…
balloob Apr 27, 2026
45a6134
Wait for background tasks in shelly tests (#169301)
epenet Apr 27, 2026
d590f4f
Fix more Shelly tests for Python 3.14.3 (#169304)
epenet Apr 27, 2026
6a67c0f
Fix grammatical error in synology_dsm missing_data error message (#16…
MohamedBarrak3 Apr 27, 2026
53e4d6c
Migrate ZHA to `SerialPortSelector` (#169099)
puddly Apr 27, 2026
59711ba
Extract triggers/conditions/services for non-primary entities
abmantis Apr 27, 2026
f21ed90
Remove hassio onboarding bypass for backup endpoints (#169299)
agners Apr 27, 2026
4b9dd68
Remove unnecessary title assertion from Yellow integration tests (#16…
puddly Apr 27, 2026
3e77a4b
Remove unused X-Hass constants (#169324)
agners Apr 27, 2026
2fb0de3
Add actions to Indevolt integration (#163578)
Xirt Apr 27, 2026
8ce1487
Register a stub transport for ESPHome serial proxies via USB (#169308)
puddly Apr 27, 2026
7594ead
Add departure_delay sensor to Israel Rail (#169035)
mikomgk Apr 27, 2026
d192218
Bump aioautomower to 2.7.4 (#169331)
Thomas55555 Apr 27, 2026
1a25864
Bump aiontfy to 0.8.5 (#169327)
tr4nt0r Apr 27, 2026
c048af2
Update to iaqualink 0.7.0 (#169330)
flz Apr 27, 2026
d8a4b36
Bump indevolt-api to 1.6.3 (#169338)
Xirt Apr 27, 2026
63d4f4d
Bump freebox-api to 1.3.1 (#169335)
frantzju Apr 27, 2026
308cb68
Refactor indevolt integration to remove magic number constants (#169337)
Xirt Apr 28, 2026
8d5f83e
Add explicit test of conditions.async_conditions_from_config (#169042)
emontnemery Apr 28, 2026
f36799d
Refactor timezone handling in mqtt datetime (#169342)
epenet Apr 28, 2026
2f3a624
Restore state_class to derivative sensor (#163557)
karwosts Apr 28, 2026
d3809dd
Improve error handling for vacuum clean_area (#168177)
arturpragacz Apr 28, 2026
4eb000d
Add state tracking to EntityConditionBase (#169030)
emontnemery Apr 28, 2026
fa6c6ee
Fix bang olufsen flaky tests in Python 3.14.3 (#169345)
epenet Apr 28, 2026
fa0cf37
Fix Duco diagnostics crash on connection error (#169322)
ronaldvdmeer Apr 28, 2026
73dcc2f
Add missing call to ConditionChecker.async_setup in async_from_config…
emontnemery Apr 28, 2026
bf4b865
Fix OneDrive upload service to report all missing files at once (#169…
leodrivera Apr 28, 2026
9656aaa
Fix Withings via_device race causing flaky test_devices (#169347)
epenet Apr 28, 2026
7f44fe0
Update gotailwind to v0.4.0 (#169316)
frenck Apr 28, 2026
7dacd00
Fix otbr flaky config flow tests in Python 3.14.3 (#169348)
epenet Apr 28, 2026
7cb4d5c
Require admin for addon panel register and delete (#169329)
mdegat01 Apr 28, 2026
33e5a96
Require admin on APIs to create/delete config entries from Supervisor…
mdegat01 Apr 28, 2026
6663717
Require local_only to be a boolean on webhook (#169296)
edenhaus Apr 28, 2026
eb85d7c
Allow targeting non-primary entities in triggers (#168857)
abmantis Apr 28, 2026
b2269b3
Bump yolink-api to 0.6.5 (#169350)
matrixd2 Apr 28, 2026
eb2217c
Use modern condition API in condition tests (#169354)
emontnemery Apr 28, 2026
7e2a7b9
Fix shelly device_trigger tests (#169305)
epenet Apr 28, 2026
96bd991
Use modern condition API in condition helper tests (#169353)
emontnemery Apr 28, 2026
c50676d
Bump actron-neo-api requirement to version 0.5.6 (#169357)
kclif9 Apr 28, 2026
b47b7fa
User camera unique id in go2rtc if available (#168603)
edenhaus Apr 28, 2026
ab08153
Expose more port metadata when listing serial ports (#169336)
puddly Apr 28, 2026
1fc0b62
Fix flaky template test (#169361)
justanotherariel Apr 28, 2026
955e836
Add template number device_class (#168438)
Petro31 Apr 28, 2026
0280d92
netatmo: add battery sensor for doortags (#168202)
farkasdi Apr 28, 2026
5ff1c15
Unload scripts created by script entities (#169364)
emontnemery Apr 28, 2026
ba8b1b2
Fix flaky google calendar tests (#169371)
epenet Apr 28, 2026
3aea7f0
Fix flaky stream test_stream_retries (#169372)
epenet Apr 28, 2026
9b29b07
Rename test sensor entity
abmantis Apr 28, 2026
b90a074
Bump indevolt-api to 1.6.4 (#169377)
Xirt Apr 28, 2026
eaf7210
Add siren platform to UniFi Protect integration (#169216)
RaHehl Apr 28, 2026
de4e1c4
Restrict homematic.set_install_mode service to admins (#169203)
balloob Apr 28, 2026
30f310f
Add UniFi Protect relay output switches via public API (#169201)
RaHehl Apr 28, 2026
6636e67
Fix flaky cloud TTS and picotts streaming tests (#169376)
epenet Apr 28, 2026
aa5e942
Fix flaky gardena_bluetooth test_timeout_manufacturer_data (#169389)
epenet Apr 28, 2026
86e8b9d
Add temporary mute button for Heiman smoke detector (#169311)
lboue Apr 28, 2026
d62f136
Add child lock entity for Eve Matter devices (#169391)
lboue Apr 28, 2026
8fd3d0b
Fix nobo_hub KeyError when a zone or component is removed (#169378)
oyvindwe Apr 28, 2026
d19c250
Discover Fibaro FGMS001 v2.8 as a motion sensor for Z-Wave (#169276)
AlCalzone Apr 28, 2026
d2fddf1
Include matching integrations in scanned ports WS API (#169387)
puddly Apr 28, 2026
d3cf5d9
Add duration support to cover conditions (#169346)
emontnemery Apr 28, 2026
799bcb0
Fix Matter electrical sensors wrongly categorized as diagnostic (#169…
lboue Apr 28, 2026
2f2413c
Enforce per-entity permissions in calendar HTTP and WS APIs (#169235)
balloob Apr 28, 2026
ea5b633
Bump rf-protocols to 2.2.0 (#169400)
balloob Apr 28, 2026
cd639b8
Add battery mode select to Zinvolt (#169397)
joostlek Apr 28, 2026
65a12b4
Add Novy Cooker Hood integration (#169194)
piitaya Apr 28, 2026
dfe4085
Add fan platform to Novy Cooker Hood (#169380)
piitaya Apr 28, 2026
80c7e47
Migrate UniFi Network discovery from SSDP to unifi_discovery (#168122)
RaHehl Apr 28, 2026
0ae5a19
Handle ZHA dynamic entity add/remove events (#169341)
TheJulianJES Apr 28, 2026
4ea0e6b
Require admin for supervisor event publishing and addon options info …
mdegat01 Apr 28, 2026
e1c81c9
Reword country_not_configured repair description (#168357)
oxidworks Apr 28, 2026
ea34fe4
Bump Tesla Fleet API to 1.4.7 (#169411)
Bre77 Apr 28, 2026
d956af0
Add ability to filter GetLiveContext tool (#168457)
NickM-27 Apr 29, 2026
4c70fef
Fix flaky mcp_server tests with Python 3.14.3 (#169385)
epenet Apr 29, 2026
3683607
Deprecate firmware update button in FRITZ!Box Tools (#168117)
mib1185 Apr 29, 2026
ef63ab5
Use new UPTIME sensor class for Vodafone Station (#169077)
chemelli74 Apr 29, 2026
c020008
Fix flaky test_alexa_config_expose_entity_prefs with Python 3.14.3 (#…
epenet Apr 29, 2026
fe0da5c
Bump PyViCare to 2.60.1 (#169401)
lackas Apr 29, 2026
44e94a8
Add last_action state attribute to timers (#168282)
emontnemery Apr 29, 2026
84d5085
Add path-specific custom instructions to copilot gen script (#169402)
abmantis Apr 29, 2026
cd5e21d
Allow Axis websocket event usage if supported (#169409)
Kane610 Apr 29, 2026
4b232be
Unload scripts created by intent_script (#169363)
emontnemery Apr 29, 2026
c3f01b3
Unload scripts created by wake_on_lan switch (#169367)
emontnemery Apr 29, 2026
cd92cb1
Filter out "Unknown" part_name from Teslemetry energy device model (#…
Bre77 Apr 29, 2026
a9c23ff
iaqualink: add reconfigure flow (#169412)
flz Apr 29, 2026
97be8f4
Add DRY HVAC mode support to Actron Air based on hardware capabilitie…
kclif9 Apr 29, 2026
06a9671
Bump axis to v69 (#169408)
Kane610 Apr 29, 2026
aa74748
Fix watts coordinator interrupting fast polling on hub update (#169365)
epenet Apr 29, 2026
dc8abff
Improve data updating for Tibber (#168065)
Danielhiversen Apr 29, 2026
891efeb
Use enumerate instead of range(len()) in Duco fan speed list (#169392)
Amousibrahim Apr 29, 2026
62082bd
Use modern condition API in script helper (#169355)
emontnemery Apr 29, 2026
cdeb550
Use new UPTIME sensor class for Synology DSM (#169090)
chemelli74 Apr 29, 2026
e975496
Fix flaky test_tasks_logged_that_block_stage_2 with Python 3.14.3 (#1…
epenet Apr 29, 2026
b56cdb9
Fix flaky unifi device_tracker entity race on setup (#169359)
epenet Apr 29, 2026
b9bbe36
Remove name field from Forecast.solar config flow (#169165)
klaasnicolaas Apr 29, 2026
5e4f8f8
Fix missing hue.activate_scene actions (#168859)
konradstrack Apr 29, 2026
45121ed
Use new console pages for vehicles and energy sites in Teslemetry (#1…
Bre77 Apr 29, 2026
326895f
Victron GX: Platinum quality scale (#169070)
tomer-w Apr 29, 2026
05121b8
Unload scripts and conditions created by automations (#169362)
emontnemery Apr 29, 2026
0224928
Bump python-otbr-api to 2.10.0 (#169370)
agners Apr 29, 2026
d531ce8
Use async_on_create_entry in bayesian (#169218)
gjohansson-ST Apr 29, 2026
e4e4785
Clean up entity_service_call tests (#169170)
arturpragacz Apr 29, 2026
6552cf8
Keep options values when chaging or starting program on Home Connect …
Diegorro98 Apr 29, 2026
acd9dd2
Protect CI cache save against cancellation (#168310)
cdce8p Apr 29, 2026
3dd972c
Fix jvcprojector entities going unavailable on transient command erro…
SteveEasley Apr 29, 2026
2a5b95b
Require hass in Template (#169292)
edenhaus Apr 29, 2026
05bfb3a
Add number platform to Fumis integration (#169100)
frenck Apr 29, 2026
a7baedc
Add error and alert sensors to Fumis integration (#169307)
frenck Apr 29, 2026
8091f51
Reject manifest dependencies on core integrations in hassfest (#169425)
epenet Apr 29, 2026
d41c9ae
Bump aioshelly to 13.24.1 (#169426)
thecode Apr 29, 2026
71fc725
Extract state template functions into a state Jinja2 extension (#169034)
frenck Apr 29, 2026
0dfbe3e
Expose async_clear_advertisement_history in the bluetooth API (#169191)
bdraco Apr 29, 2026
d41a3ae
Use defaults for device class UPTIME in Shelly (#169148)
chemelli74 Apr 29, 2026
a95c216
Unload scripts created by websocket command execute_script (#169368)
emontnemery Apr 29, 2026
284242b
Copy unit_of_measurement onto energy inverted power sensor (#169427)
MindFreeze Apr 29, 2026
bb41a2d
Fix logbook spam by including image domain in ALWAYS_CONTINUOUS_DOMAI…
daily063 Apr 29, 2026
39d3bc3
Bump deebot-client to 18.2.0 (#169003)
edenhaus Apr 29, 2026
278f25e
Redact sensitive api creds before logging message in websocket api (#…
ch604 Apr 29, 2026
b4bfe6b
Rename timer last_action to last_transition (#169430)
emontnemery Apr 29, 2026
f4637db
Add routine management to Alexa Devices (#166291)
chemelli74 Apr 29, 2026
0190dc1
Merge branch 'dev' of github.com:home-assistant/core into automation_…
abmantis Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 26 additions & 4 deletions homeassistant/components/websocket_api/automation.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from homeassistant.const import CONF_TARGET
from homeassistant.core import HomeAssistant
from homeassistant.helpers import target as target_helpers
from homeassistant.helpers import entity_registry as er, target as target_helpers
from homeassistant.helpers.condition import (
async_get_all_descriptions as async_get_all_condition_descriptions,
)
Expand Down Expand Up @@ -92,12 +92,14 @@ class _AutomationComponentLookupData:

component: str
filters: list[_EntityFilter]
primary_entities_only: bool = True

@classmethod
def create(cls, component: str, target_description: dict[str, Any]) -> Self:
"""Build automation component lookup data from target description."""
filters: list[_EntityFilter] = []

primary_entities_only = target_description.get("primary_entities_only", True)
entity_filters_config = target_description.get("entity", [])
for entity_filter_config in entity_filters_config:
entity_filter = _EntityFilter(
Expand All @@ -110,14 +112,28 @@ def create(cls, component: str, target_description: dict[str, Any]) -> Self:
)
filters.append(entity_filter)

return cls(component=component, filters=filters)
return cls(
component=component,
filters=filters,
primary_entities_only=primary_entities_only,
)

def matches(
self, hass: HomeAssistant, entity_id: str, domain: str, integration: str
self,
hass: HomeAssistant,
entity_id: str,
domain: str,
integration: str,
check_entity_category: bool,
) -> bool:
"""Return if entity matches ANY of the filters."""
if not self.filters:
return True

if check_entity_category and self.primary_entities_only:
entry = er.async_get(hass).async_get(entity_id)
if entry is None or entry.entity_category is not None:
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Treat missing entity-registry entries as not providing an entity_category rather than as non-matching. As written, entry is None returns False, which will drop explicitly targeted entities that are not in the entity registry if check_entity_category is enabled (e.g., a mixed target that includes an area/device plus an explicitly selected runtime-only entity); if you keep this check, consider only rejecting when entry.entity_category is not None and otherwise allowing the match.

Suggested change
if entry is None or entry.entity_category is not None:
if entry is not None and entry.entity_category is not None:

Copilot uses AI. Check for mistakes.
return False
Comment on lines +133 to +136
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cache entity registry lookups per entity (or precompute a set of non-primary entity_ids) before iterating components to avoid doing an entity registry lookup for every component filter check, which can become expensive for large targets and many component descriptions.

Copilot uses AI. Check for mistakes.
return any(
f.matches(hass, entity_id, domain, integration) for f in self.filters
)
Expand Down Expand Up @@ -220,6 +236,7 @@ def _async_get_automation_components_for_target(
hass,
target_helpers.TargetSelection(target_selection),
expand_group=expand_group,
primary_entities_only=False,
)
_LOGGER.debug("Extracted entities for lookup: %s", extracted)

Expand All @@ -230,6 +247,7 @@ def _async_get_automation_components_for_target(
"Automation components per domain: %s", lookup_table.domain_components
)

check_entity_category = len(extracted.indirectly_referenced) > 0
entity_infos = entity_sources(hass)
matched_components: set[str] = set()
for entity_id in extracted.referenced | extracted.indirectly_referenced:
Comment on lines +250 to 253
Copy link

Copilot AI Apr 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apply the entity_category / primary_entities_only filtering only to indirectly referenced entities, not to all entities whenever any indirect expansion occurred. With check_entity_category = len(extracted.indirectly_referenced) > 0 and iterating over extracted.referenced | extracted.indirectly_referenced, a mixed target (e.g. area/device + explicitly selected entity) will incorrectly treat explicitly selected non-primary (or even primary) entities as subject to indirect-only filtering, causing valid triggers/conditions/services to be omitted; consider computing the flag per-entity (e.g. entity_id in extracted.indirectly_referenced) or iterating the two sets separately.

Suggested change
check_entity_category = len(extracted.indirectly_referenced) > 0
entity_infos = entity_sources(hass)
matched_components: set[str] = set()
for entity_id in extracted.referenced | extracted.indirectly_referenced:
entity_infos = entity_sources(hass)
matched_components: set[str] = set()
for entity_id in extracted.referenced | extracted.indirectly_referenced:
check_entity_category = entity_id in extracted.indirectly_referenced

Copilot uses AI. Check for mistakes.
Expand All @@ -253,7 +271,11 @@ def _async_get_automation_components_for_target(
if component_data.component in matched_components:
continue
if component_data.matches(
hass, entity_id, entity_domain, entity_integration
hass,
entity_id,
entity_domain,
entity_integration,
check_entity_category,
):
Comment on lines 250 to 279
Copy link

Copilot AI Apr 29, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Apply the entity_category filter only to indirectly expanded entities (e.g., when entity_id is in extracted.indirectly_referenced) instead of enabling it globally whenever any indirect entity exists, to avoid changing behavior for explicitly targeted entities in mixed targets (and to avoid excluding non-registry entities when combined with area/device/label targets).

Copilot uses AI. Check for mistakes.
matched_components.add(component_data.component)

Expand Down
71 changes: 70 additions & 1 deletion tests/components/websocket_api/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,24 @@ async def target_entities(
switch_platform.config_entry = config_entry
await switch_platform.async_add_entities([device1_switch, area_device_switch])

area_device_diagnostic_sensor = MockEntity(
entity_id="sensor.test7",
unique_id="test7",
device_info=dr.DeviceInfo(identifiers=area_device.identifiers),
entity_category=EntityCategory.DIAGNOSTIC,
)
label2_device_config_sensor = MockEntity(
entity_id="sensor.potato",
unique_id="potato",
device_info=dr.DeviceInfo(identifiers=label2_device.identifiers),
entity_category=EntityCategory.CONFIG,
)
sensor_platform = MockEntityPlatform(hass, domain="sensor", platform_name="test")
sensor_platform.config_entry = config_entry
await sensor_platform.async_add_entities(
[area_device_diagnostic_sensor, label2_device_config_sensor]
)

component1_light = MockEntity(
entity_id="light.component1_light", unique_id="component1_light"
)
Expand Down Expand Up @@ -246,6 +264,8 @@ async def target_entities(
"light.test6",
"switch.test2",
"switch.test5",
"sensor.test7",
"sensor.potato",
"light.component1_light",
"light.component1_flash_light",
"light.component1_effect_flash_light",
Expand Down Expand Up @@ -3795,7 +3815,11 @@ async def async_get_triggers_conditions(hass: HomeAssistant) -> dict[str, type]:
Mock(
**{
f"async_get_{automation_component}s": AsyncMock(
return_value={"match_all": Mock, "other_integration_lights": Mock}
return_value={
"match_all": Mock,
"other_integration_lights": Mock,
"non_primary_sensor": Mock,
}
)
}
),
Expand Down Expand Up @@ -3873,6 +3897,12 @@ def get_common_descriptions(domain: str):
- light.LightEntityFeature.EFFECT
- integration: test
domain: light

non_primary_sensor:
target:
entity:
domain: sensor
primary_entities_only: false
"""

def _load_yaml(fname, secrets=None):
Expand Down Expand Up @@ -3978,6 +4008,7 @@ async def assert_command(
"component1",
"component1.light_message",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turned_on",
"sensor.turned_on",
Expand All @@ -3990,6 +4021,7 @@ async def assert_command(
{"area_id": ["kitchen", "living_room"]},
[
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turned_on",
"switch.turned_on",
Expand All @@ -4003,10 +4035,23 @@ async def assert_command(
"light.turned_on",
"component1",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"switch.turned_on",
],
)

# Test direct targeting of a non-primary entity - even
# primary_entities_only=True components match
await assert_command(
{"entity_id": ["sensor.test7"]},
[
"component2.match_all",
"component2.non_primary_sensor",
"sensor.turned_on",
],
)

# Test mixed target types
await assert_command(
{
Expand All @@ -4019,6 +4064,7 @@ async def assert_command(
"component1",
"component1.light_message",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turned_on",
"sensor.turned_on",
Expand Down Expand Up @@ -4107,6 +4153,12 @@ def get_common_service_descriptions(domain: str):
- light.LightEntityFeature.EFFECT
- integration: test
domain: light

non_primary_sensor:
target:
entity:
domain: sensor
primary_entities_only: false
"""

def _load_yaml(fname, secrets=None):
Expand Down Expand Up @@ -4145,6 +4197,7 @@ def _load_yaml(fname, secrets=None):
hass.services.async_register(
"component2", "other_integration_lights", lambda call: None
)
hass.services.async_register("component2", "non_primary_sensor", lambda call: None)
await hass.async_block_till_done()

async def assert_services(
Expand Down Expand Up @@ -4226,6 +4279,7 @@ async def assert_services(
[
"component1.light_message",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turn_on",
"sensor.turn_on",
Expand All @@ -4238,6 +4292,7 @@ async def assert_services(
{"area_id": ["kitchen", "living_room"]},
[
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turn_on",
"switch.turn_on",
Expand All @@ -4250,10 +4305,23 @@ async def assert_services(
[
"light.turn_on",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"switch.turn_on",
],
)

# Test direct targeting of a non-primary entity - even
# primary_entities_only=True components match
await assert_services(
{"entity_id": ["sensor.test7"]},
[
"component2.match_all",
"component2.non_primary_sensor",
"sensor.turn_on",
],
)

# Test mixed target types
await assert_services(
{
Expand All @@ -4265,6 +4333,7 @@ async def assert_services(
[
"component1.light_message",
"component2.match_all",
"component2.non_primary_sensor",
"component2.other_integration_lights",
"light.turn_on",
"sensor.turn_on",
Expand Down
Loading