Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 2 additions & 7 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Copilot code review instructions

- Start review comments with a short, one-sentence summary of the suggested fix.
- Do not add comments about code style, formatting or linting issues.
- Do not comment on code style, formatting or linting issues.

# GitHub Copilot & Claude Code Instructions

Expand All @@ -21,7 +21,7 @@ This repository contains the core of Home Assistant, a Python 3 based home autom

## Python Syntax Notes

- Python 3.14 explicitly allows `except TypeA, TypeB:` without parentheses.
- Python 3.14 explicitly allows `except TypeA, TypeB:` without parentheses. Never flag this as an issue since Home Assistant officially supports Python 3.14.

## Testing

Expand All @@ -34,8 +34,3 @@ Integrations with Platinum or Gold level in the Integration Quality Scale reflec

When reviewing entity actions, do not suggest extra defensive checks for input fields that are already validated by Home Assistant's service/action schemas and entity selection filters. Suggest additional guards only when data bypasses those validators or is transformed into a less-safe form.
When validation guarantees a dict key exists, prefer direct key access (`data["key"]`) instead of `.get("key")` so contract violations are surfaced instead of silently masked.


# Skills

- ha-integration-knowledge: .claude/skills/ha-integration-knowledge/SKILL.md
47 changes: 47 additions & 0 deletions .github/instructions/integrations.instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
applyTo: "homeassistant/components/**, tests/components/**"
excludeAgent: "cloud-agent"
---

<!-- Automatically generated by gen_copilot_instructions.py, do not edit -->


## File Locations
- **Integration code**: `./homeassistant/components/<integration_domain>/`
- **Integration tests**: `./tests/components/<integration_domain>/`

## General guidelines

- When looking for examples, prefer integrations with the platinum or gold quality scale level first.
- Polling intervals are NOT user-configurable. Never add scan_interval, update_interval, or polling frequency options to config flows or config entries.
- Do NOT allow users to set config entry names in config flows. Names are automatically generated or can be customized later in UI. Exception: helper integrations may allow custom names.
- For entity actions and entity services, avoid requesting redundant defensive checks for fields already enforced by Home Assistant validation schemas and entity filters; only request extra guards when values bypass validation or are transformed unsafely.
- When validation guarantees a key is present, prefer direct dictionary indexing (`data["key"]`) over `.get("key")` so invalid assumptions fail fast.
- Integrations should be thin wrappers. Protocol parsing, device state machines, or other domain logic belong in a separate PyPI library, not in the integration itself. If unsure, ask before inlining.
- "potato" is a forbidden word for an integration and should never be used.

The following platforms have extra guidelines:
- **Diagnostics**: [`platform-diagnostics.md`](platform-diagnostics.md) for diagnostic data collection
- **Repairs**: [`platform-repairs.md`](platform-repairs.md) for user-actionable repair issues


## Integration Quality Scale

- When validating the quality scale rules, check them at https://developers.home-assistant.io/docs/core/integration-quality-scale/rules
- When implementing or reviewing an integration, always consider the quality scale rules, since they promote best practices.

Template scale file: `./script/scaffold/templates/integration/integration/quality_scale.yaml`

### How Rules Apply
1. **Check `manifest.json`**: Look for `"quality_scale"` key to determine integration level
2. **Bronze Rules**: Always required for any integration with quality scale
3. **Higher Tier Rules**: Only apply if integration targets that tier or higher
4. **Rule Status**: Check `quality_scale.yaml` in integration folder for:
- `done`: Rule implemented
- `exempt`: Rule doesn't apply (with reason in comment)
- `todo`: Rule needs implementation


## Testing Requirements

- Tests should avoid interacting or mocking internal integration details. For more info, see https://developers.home-assistant.io/docs/development_testing/#writing-tests-for-integrations
32 changes: 29 additions & 3 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -366,15 +366,16 @@ jobs:
echo "key=uv-${UV_CACHE_VERSION}-${uv_version}-${HA_SHORT_VERSION}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: venv
key: >-
${{ runner.os }}-${{ runner.arch }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}
- name: Restore uv wheel cache
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
id: cache-uv
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ${{ env.UV_CACHE_DIR }}
key: >-
Expand All @@ -398,6 +399,7 @@ jobs:
if: |
steps.cache-venv.outputs.cache-hit != 'true'
|| steps.cache-apt-check.outputs.cache-hit != 'true'
id: install-os-deps
timeout-minutes: 10
env:
APT_CACHE_HIT: ${{ steps.cache-apt-check.outputs.cache-hit }}
Expand Down Expand Up @@ -431,7 +433,10 @@ jobs:
sudo chmod -R 755 ${APT_CACHE_BASE}
fi
- name: Save apt cache
if: steps.cache-apt-check.outputs.cache-hit != 'true'
if: |
always()
&& steps.cache-apt-check.outputs.cache-hit != 'true'
&& steps.install-os-deps.outcome == 'success'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: |
Expand All @@ -441,6 +446,7 @@ jobs:
${{ runner.os }}-${{ runner.arch }}-${{ needs.info.outputs.apt_cache_key }}
- name: Create Python virtual environment
if: steps.cache-venv.outputs.cache-hit != 'true'
id: create-venv
run: |
python -m venv venv
. venv/bin/activate
Expand Down Expand Up @@ -471,6 +477,26 @@ jobs:
- name: Check dirty
run: |
./script/check_dirty
- name: Save uv wheel cache
if: |
(success() && steps.cache-venv.outputs.cache-hit != 'true')
|| (always()
&& steps.create-venv.outcome == 'success'
&& steps.cache-uv.outputs.cache-matched-key == '')
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ${{ env.UV_CACHE_DIR }}
key: >-
${{ runner.os }}-${{ runner.arch }}-${{ steps.python.outputs.python-version }}-${{
steps.generate-uv-key.outputs.key }}
- name: Save base Python virtual environment
if: always() && steps.create-venv.outcome == 'success'
uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: venv
key: >-
${{ runner.os }}-${{ runner.arch }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}

hassfest:
name: Check hassfest
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This repository contains the core of Home Assistant, a Python 3 based home autom

## Python Syntax Notes

- Python 3.14 explicitly allows `except TypeA, TypeB:` without parentheses.
- Python 3.14 explicitly allows `except TypeA, TypeB:` without parentheses. Never flag this as an issue since Home Assistant officially supports Python 3.14.

## Testing

Expand Down
8 changes: 6 additions & 2 deletions CODEOWNERS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion homeassistant/brands/honeywell.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"domain": "honeywell",
"name": "Honeywell",
"integrations": ["lyric", "evohome", "honeywell"]
"integrations": ["lyric", "evohome", "honeywell", "honeywell_string_lights"]
}
12 changes: 6 additions & 6 deletions homeassistant/components/accuweather/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@

from asyncio import timeout
from collections.abc import Mapping
from typing import Any
from typing import TYPE_CHECKING, Any

from accuweather import AccuWeather, ApiError, InvalidApiKeyError, RequestsExceededError
from aiohttp import ClientError
from aiohttp.client_exceptions import ClientConnectorError
import voluptuous as vol

from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession

Expand Down Expand Up @@ -55,8 +55,11 @@ async def async_step_user(
)
self._abort_if_unique_id_configured()

if TYPE_CHECKING:
assert accuweather.location_name is not None

return self.async_create_entry(
title=user_input[CONF_NAME], data=user_input
title=accuweather.location_name, data=user_input
)

return self.async_show_form(
Expand All @@ -70,9 +73,6 @@ async def async_step_user(
vol.Optional(
CONF_LONGITUDE, default=self.hass.config.longitude
): cv.longitude,
vol.Optional(
CONF_NAME, default=self.hass.config.location_name
): str,
}
),
errors=errors,
Expand Down
4 changes: 2 additions & 2 deletions homeassistant/components/accuweather/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def __init__(
"""Initialize."""
self.accuweather = accuweather
self.location_key = accuweather.location_key
name = config_entry.data[CONF_NAME]
name = config_entry.data.get(CONF_NAME) or config_entry.title

if TYPE_CHECKING:
assert self.location_key is not None
Expand Down Expand Up @@ -122,7 +122,7 @@ def __init__(
self.accuweather = accuweather
self.location_key = accuweather.location_key
self._fetch_method = fetch_method
name = config_entry.data[CONF_NAME]
name = config_entry.data.get(CONF_NAME) or config_entry.title

if TYPE_CHECKING:
assert self.location_key is not None
Expand Down
3 changes: 1 addition & 2 deletions homeassistant/components/accuweather/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@
"data": {
"api_key": "[%key:common::config_flow::data::api_key%]",
"latitude": "[%key:common::config_flow::data::latitude%]",
"longitude": "[%key:common::config_flow::data::longitude%]",
"name": "[%key:common::config_flow::data::name%]"
"longitude": "[%key:common::config_flow::data::longitude%]"
},
"data_description": {
"api_key": "API key generated in the AccuWeather APIs portal."
Expand Down
25 changes: 24 additions & 1 deletion homeassistant/components/actron_air/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"HEAT": HVACMode.HEAT,
"FAN": HVACMode.FAN_ONLY,
"AUTO": HVACMode.AUTO,
"DRY": HVACMode.DRY,
"OFF": HVACMode.OFF,
}
HVAC_MODE_MAPPING_HA_TO_ACTRONAIR = {
Expand Down Expand Up @@ -79,7 +80,6 @@ class ActronAirClimateEntity(ClimateEntity):
)
_attr_name = None
_attr_fan_modes = list(FAN_MODE_MAPPING_ACTRONAIR_TO_HA.values())
_attr_hvac_modes = list(HVAC_MODE_MAPPING_ACTRONAIR_TO_HA.values())


class ActronSystemClimate(ActronAirAcEntity, ActronAirClimateEntity):
Expand All @@ -93,6 +93,17 @@ def __init__(
super().__init__(coordinator)
self._attr_unique_id = self._serial_number

@property
def hvac_modes(self) -> list[HVACMode]:
"""Return the list of supported HVAC modes."""
modes = [
HVAC_MODE_MAPPING_ACTRONAIR_TO_HA[mode]
for mode in self._status.user_aircon_settings.supported_modes
if mode in HVAC_MODE_MAPPING_ACTRONAIR_TO_HA
]
modes.append(HVACMode.OFF)
return modes

@property
def min_temp(self) -> float:
"""Return the minimum temperature that can be set."""
Expand Down Expand Up @@ -179,6 +190,18 @@ def __init__(
super().__init__(coordinator, zone)
self._attr_unique_id: str = self._zone_identifier

@property
def hvac_modes(self) -> list[HVACMode]:
"""Return the list of supported HVAC modes."""
status = self.coordinator.data
modes = [
HVAC_MODE_MAPPING_ACTRONAIR_TO_HA[mode]
for mode in status.user_aircon_settings.supported_modes
if mode in HVAC_MODE_MAPPING_ACTRONAIR_TO_HA
]
modes.append(HVACMode.OFF)
return modes

@property
def min_temp(self) -> float:
"""Return the minimum temperature that can be set."""
Expand Down
2 changes: 1 addition & 1 deletion homeassistant/components/actron_air/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@
"integration_type": "hub",
"iot_class": "cloud_polling",
"quality_scale": "silver",
"requirements": ["actron-neo-api==0.5.3"]
"requirements": ["actron-neo-api==0.5.6"]
}
21 changes: 9 additions & 12 deletions homeassistant/components/airly/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
import voluptuous as vol

from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE
from homeassistant.helpers import config_validation as cv
from homeassistant.helpers.aiohttp_client import async_get_clientsession

from .const import CONF_USE_NEAREST, DOMAIN, NO_AIRLY_SENSORS
from .const import CONF_USE_NEAREST, DEFAULT_NAME, DOMAIN, NO_AIRLY_SENSORS

DESCRIPTION_PLACEHOLDERS = {
"developer_registration_url": "https://developer.airly.eu/register",
Expand Down Expand Up @@ -45,16 +45,16 @@ async def async_step_user(
try:
location_point_valid = await check_location(
websession,
user_input["api_key"],
user_input["latitude"],
user_input["longitude"],
user_input[CONF_API_KEY],
user_input[CONF_LATITUDE],
user_input[CONF_LONGITUDE],
)
if not location_point_valid:
location_nearest_valid = await check_location(
websession,
user_input["api_key"],
user_input["latitude"],
user_input["longitude"],
user_input[CONF_API_KEY],
user_input[CONF_LATITUDE],
user_input[CONF_LONGITUDE],
use_nearest=True,
)
except AirlyError as err:
Expand All @@ -68,7 +68,7 @@ async def async_step_user(
return self.async_abort(reason="wrong_location")
use_nearest = True
return self.async_create_entry(
title=user_input[CONF_NAME],
title=DEFAULT_NAME,
data={**user_input, CONF_USE_NEAREST: use_nearest},
)

Expand All @@ -83,9 +83,6 @@ async def async_step_user(
vol.Optional(
CONF_LONGITUDE, default=self.hass.config.longitude
): cv.longitude,
vol.Optional(
CONF_NAME, default=self.hass.config.location_name
): str,
}
),
errors=errors,
Expand Down
2 changes: 2 additions & 0 deletions homeassistant/components/airly/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@
MIN_UPDATE_INTERVAL: Final = 5
NO_AIRLY_SENSORS: Final = "There are no Airly sensors in this area yet."
URL = "https://airly.org/map/#{latitude},{longitude}"

DEFAULT_NAME: Final = "Airly"
Loading
Loading