Compare commits

..

1783 Commits

Author SHA1 Message Date
G Johansson 23c0c5c6ac Add using dict keys 2025-08-18 14:23:57 +00:00
Joost Lekkerkerker e80c090932 Pin gql to 3.5.3 (#150800) 2025-08-17 19:27:17 +02:00
Pete Sage ff418f513a Add dialog mode select for Sonos Arc Ultra soundbar (#150637)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-17 17:15:29 +02:00
Joost Lekkerkerker b222cc5889 Use lifecycle hook instead of storing callback in starline (#150707) 2025-08-17 17:08:35 +02:00
Yuxin Wang db1707fd72 Mark config-flow-test-coverage as done in APCUPSD quality scale (#150733) 2025-08-17 17:08:25 +02:00
peteS-UK 6f6f5809d0 Fix volume step error in Squeezebox media player (#150760) 2025-08-17 17:07:23 +02:00
Aidan Timson 1f43f82ea6 Update systembridgeconnector to 4.1.10 (#150736) 2025-08-17 17:03:46 +02:00
Yevhenii Vaskivskyi 942274234e Add asusrouter logger definition to asuswrt (#150747) 2025-08-17 16:59:02 +02:00
Maciej Bieniek f03955b773 NextDNS tests improvements (#150791) 2025-08-17 16:56:25 +02:00
jan iversen 27ac375183 Remove unused strings in modbus (#150795) 2025-08-17 16:21:28 +02:00
Jamin c951728767 VOIP RTP cleanup (#150490) 2025-08-17 16:16:20 +02:00
Paulus Schoutsen 3496494290 Remove filters from device analytics payload (#150771) 2025-08-17 16:15:02 +02:00
jan iversen e90183391e Modbus: Delay start after connection is made. (#150526) 2025-08-17 16:09:24 +02:00
Joost Lekkerkerker 90558c517b Add info to Bravia device (#150690) 2025-08-17 15:30:46 +02:00
epenet 7fba94747e Add Tuya test fixtures (#150793) 2025-08-17 14:05:58 +02:00
Thomas Schamm 3b4b478afa Fix for bosch_shc: 'device_registry.async_get_or_create' referencing a non existing 'via_device' (#150756) 2025-08-17 10:49:04 +02:00
Joakim Plate a3640c5664 feat: switch to model id for togrill (#150750) 2025-08-17 06:30:05 +02:00
Michael 246a181ad4 Fix restrict-task-creation workflow (#150774) 2025-08-17 01:56:56 +02:00
Thomas Schamm d642ecb302 Bump boschshcpy to 0.2.107 (#150754) 2025-08-17 00:37:44 +02:00
Yevhenii Vaskivskyi 53889165b5 Bump asusrouter to 1.19.0 (#150742) 2025-08-16 21:32:27 +02:00
Marc Mueller fe32e74910 Update charset-normalizer to 3.4.3 (#150770) 2025-08-16 21:31:14 +02:00
dontinelli a71ae4db37 Add min/max values as extra attributes for measurements for fyta (#150562) 2025-08-16 20:49:55 +02:00
Marc Mueller 0d5ebdb692 Update hassfest package exceptions (#150744) 2025-08-16 12:52:26 +02:00
Denis Shulyaka 80e720f663 Add external tools support for chat log (#150461) 2025-08-16 12:20:20 +02:00
epenet 616b031df8 Use constants in Tuya tests (#150739) 2025-08-16 11:00:08 +02:00
Tom bcdece4455 Add additional sensors to airOS (#150712) 2025-08-16 08:43:47 +02:00
Joost Lekkerkerker 1aa3efaf8a Add support for fineDustSensor capability in SmartThings (#150714) 2025-08-16 08:41:28 +02:00
Luke Lashley 7f16b11776 Improve roborock resume cleaning logic (#150726) 2025-08-16 08:40:46 +02:00
Maciej Bieniek 078b7224fc Add "bypass age verification" switch to NextDNS integration (#150716) 2025-08-15 21:46:06 +03:00
Denis Shulyaka d5970e7733 Anthropic thinking content (#150341) 2025-08-15 15:52:36 +02:00
Joost Lekkerkerker d5a74892e6 Remove unnecessary hass assignment in coordinators (#150696)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-15 15:52:13 +02:00
Joost Lekkerkerker 793a829236 Add serial number to Vodafone Station device (#150709) 2025-08-15 15:52:01 +02:00
G Johansson 7670146faf Improve handling decode errors in rest (#150699) 2025-08-15 15:51:48 +02:00
Nick Kuiper eaedefe105 Update bluecurrent-api to 1.3.1 (#150559) 2025-08-15 15:45:40 +02:00
Marc Mueller 4f20776e0e Add check for dependency package names in hassfest (#150630) 2025-08-15 15:44:47 +02:00
epenet 6c21a14be4 Add binary sensor to 1-Wire DS2405 (#150679) 2025-08-15 15:37:34 +02:00
Alex Thompson 9015743483 Bump tilt-ble to 0.3.1 (#150711) 2025-08-15 15:37:08 +02:00
Thomas D 2a62e033dd Add binary sensor platform to qbus integration (#149975) 2025-08-15 15:35:51 +02:00
Joost Lekkerkerker f72f2a326a Add MAC address to Modern forms devices (#150698) 2025-08-15 15:34:31 +02:00
Joost Lekkerkerker 61de50dfc0 Add hw_version to Point device (#150704) 2025-08-15 15:34:10 +02:00
Joost Lekkerkerker ef7ed026db Add serial number to Ondilo ICO (#150702) 2025-08-15 15:33:13 +02:00
Joost Lekkerkerker abdb48e7ce Add serial number to Nobo hub devices (#150700) 2025-08-15 15:32:43 +02:00
Joost Lekkerkerker 9646aa232a Add serial number to Zeversolar device (#150710) 2025-08-15 15:31:29 +02:00
Joost Lekkerkerker 635cfe7d17 Remove hass assignment in Openhome (#150703) 2025-08-15 15:30:01 +02:00
Joost Lekkerkerker 1e2f7cadc7 Add unregister hook to Vera (#150708) 2025-08-15 15:27:49 +02:00
Tom 94e9f32da5 Bump airOS to 0.3.0 (#150693) 2025-08-15 15:24:23 +02:00
Maciej Bieniek b7ba99ed17 Bump nextdns to version 4.1.0 (#150706) 2025-08-15 15:24:05 +02:00
Joost Lekkerkerker ebbeef8021 Add mac to Ambient station device (#150689) 2025-08-15 15:15:22 +02:00
Joost Lekkerkerker 8da75490c0 Add hw_version to RainMachine device (#150705) 2025-08-15 15:04:59 +02:00
Joost Lekkerkerker bc89e8fd3c Move Notion hardware revision to hw_version (#150701) 2025-08-15 15:03:30 +02:00
Joost Lekkerkerker 602497904b Set firmware version to the right field in Guardian (#150697) 2025-08-15 15:01:42 +02:00
G Johansson facf217b99 Fix missing labels for subdiv in workday (#150684) 2025-08-15 13:59:35 +02:00
Joost Lekkerkerker b300654e15 Add serial number to Dremel device (#150691) 2025-08-15 13:58:44 +02:00
Joost Lekkerkerker a742125f13 Add serial number to Emonitor device (#150692) 2025-08-15 13:58:23 +02:00
Thomas D 64768b1036 Fix re-auth flow for Volvo integration (#150478) 2025-08-15 13:58:03 +02:00
Petro31 792bb5781d Fix optimistic set to false for template entities (#150421) 2025-08-15 13:53:48 +02:00
Jan Bouwhuis 7bd126dc8e Assert the MQTT config entry is reloaded on subentry creation and mutation (#150636) 2025-08-15 13:04:12 +02:00
Joakim Sørensen 83ee380b17 Bump hass-nabucasa from 0.111.2 to 1.0.0 and refactor related code (#150566) 2025-08-15 11:35:52 +02:00
Ludovic BOUÉ 58f8b3c401 Bump Python Matter server to 8.1.0 (#150631) 2025-08-15 11:29:49 +02:00
Marc Mueller 2a6d1180f4 Update py-madvr2 to 1.6.40 (#150647) 2025-08-15 08:13:22 +02:00
J. Nick Koston 00b765893d Bump onvif-zeep-async to 4.0.3 (#150663) 2025-08-15 05:49:31 +02:00
karwosts 3e9e9b0489 Fix demo media_player.browse browsing (#150669) 2025-08-15 05:47:55 +02:00
Luke Lashley 25f7c02498 Bump python-snoo to 0.8.3 (#150670) 2025-08-15 05:46:59 +02:00
Manu a785f3d509 Increase test coverage of Habitica (#150671) 2025-08-15 05:45:42 +02:00
J. Nick Koston 9f36b2dcde Bump protobuf to 6.32.0 (#150667) 2025-08-15 02:31:10 +02:00
Michael Hansen 57265ac648 Add fuzzy matching to default agent (#150595) 2025-08-14 16:28:42 -05:00
J. Nick Koston f5fe53a67f Bump uiprotect to 7.21.1 (#150657) 2025-08-14 16:16:04 -05:00
Arie Catsman 7e6ceee9d1 Add IQ Meter Collar and C6 Combiner to enphase_envoy integration (#150649) 2025-08-14 15:34:37 -05:00
DeerMaximum 9c21965a34 Add diagnostics to NINA (#150638) 2025-08-14 19:57:33 +02:00
rwrozelle 1ea740d81c Add media_player add off on capability to esphome (#147990) 2025-08-14 12:07:01 -05:00
rwrozelle 6e98446523 Media player API enumeration alignment and feature flags (#149597)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-08-14 11:24:43 -05:00
Ludovic BOUÉ 2248584a0f Add Matter Electrical measurements additional attributes (#150188)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-08-14 17:07:18 +02:00
Martin Hjelmare d9b6f82639 Add Z-Wave Fortrezz SSA2 discovery (#150629) 2025-08-14 17:37:44 +03:00
DeerMaximum 3eecfa8e57 Set PARALLEL_UPDATES in NINA (#150635) 2025-08-14 16:36:04 +02:00
epenet 382e7dfd39 Add Tuya test fixtures (#150622) 2025-08-14 14:51:43 +02:00
Joost Lekkerkerker 5358c89bfd Add fixtures for one door refrigerator in SmartThings (#150632) 2025-08-14 14:51:20 +02:00
Tom e6103fdcf4 Bump airOS to 0.2.11 (#150627) 2025-08-14 13:43:32 +02:00
Martin Dybal 02dca5f0ad Fix type annotation for climate _attr_current_humidity (#150615) 2025-08-14 12:55:54 +02:00
Ludovic BOUÉ cc4b9e0eca Extend UnitOfReactivePower with 'mvar' (#150415) 2025-08-14 11:46:06 +02:00
Joost Lekkerkerker 7e28e3dcd3 Add sw_version to JustNimbus device (#150592) 2025-08-14 09:31:43 +02:00
Joakim Plate bb3d571887 Make sure we update the api version in philips_js discovery (#150604) 2025-08-14 09:30:47 +02:00
Joakim Plate 5a789cbbc8 Bump togrill to 0.7.0 in preperation for number (#150611) 2025-08-14 09:30:02 +02:00
dependabot[bot] 4954c2a84b Bump actions/ai-inference from 1.2.8 to 2.0.0 (#150619)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-14 09:27:18 +02:00
G Johansson f28e9f60ee Use runtime_data in pvpc_hourly_pricing (#150565) 2025-08-14 01:03:04 +02:00
Luke Lashley 6a4bf4ec72 Bump python-snoo to 0.8.2 (#150569) 2025-08-14 00:12:18 +02:00
Luke Lashley 12706178c2 Change Snoo to use MQTT instead of PubNub (#150570) 2025-08-14 00:11:52 +02:00
Samuel Xiao ed39b18d94 Add cover platform for switchbot cloud (#148993) 2025-08-14 00:10:19 +02:00
G Johansson 9999807891 Use OptionsFlowWithReload in coinbase (#150587) 2025-08-13 23:48:20 +02:00
Arie Catsman b5db0e98b4 Bump pyenphase to 2.3.0 (#150600) 2025-08-13 23:44:07 +02:00
Åke Strandberg f58b2177a2 Bump pymiele to 0.5.4 (#150605) 2025-08-13 23:42:47 +02:00
G Johansson 4f64014816 Add wind gust sensor to OpenWeatherMap (#150607) 2025-08-13 23:34:12 +02:00
Michael Hansen cf68214c4d Bump hassil to 3.1.0 (#150584) 2025-08-13 20:58:57 +02:00
Marc Mueller b3d3284f5c Update types packages (#150586) 2025-08-13 20:55:22 +02:00
Marc Mueller 12c346f550 Update orjson to 3.11.2 (#150588) 2025-08-13 20:53:55 +02:00
HarvsG bda82e19a5 Pi_hole - Account for auth succeeding when it shouldn't (#150413) 2025-08-13 20:53:21 +02:00
Marc Mueller f7726a7563 Update pre-commit-hooks to 6.0.0 (#150583) 2025-08-13 19:23:26 +02:00
Michael Hansen 2c0ed2cbfe Add intent for setting fan speed (#150576) 2025-08-13 18:57:25 +02:00
Marc Mueller 13376ef896 Fix RuntimeWarning in asuswrt tests (#150580) 2025-08-13 18:33:02 +02:00
Marc Mueller d18cc3d6c3 Fix RuntimeWarning in squeezebox tests (#150582) 2025-08-13 18:32:50 +02:00
karwosts b40aab479a Change monetary translation to 'Monetary balance' (#150054) 2025-08-13 17:21:36 +02:00
Michael Hansen 721f9a40d8 Add volume up/down intents for media players (#150443) 2025-08-13 09:35:37 -05:00
Ludovic BOUÉ eb4b75a9a7 Extend UnitOfApparentPower with 'mVA' (#150422)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-08-13 15:56:04 +02:00
epenet b40f381164 Add Tuya test fixture (#150557) 2025-08-13 14:09:19 +02:00
epenet 51413b7a8d Ensure Tuya fans have at least one valid DPCode (#150550) 2025-08-13 13:40:11 +02:00
Foscam-wangzhengyu ff694a0058 Foscam Add prompt language and modify the default port to a more compatible (#150536) 2025-08-13 13:21:39 +02:00
Joakim Sørensen eea04558a9 Move alexa access token updates to new handler (#150466)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-08-13 13:21:28 +02:00
starkillerOG 5ad2a27918 Use camera name in Reolink tests (#150555) 2025-08-13 13:06:12 +02:00
G Johansson f39305f64e Remove deprecated json helper constants and function (#150111) 2025-08-13 12:42:00 +02:00
karwosts 7fba0ca2c0 Add 'all' option to light/switch group config flow (#149671) 2025-08-13 12:34:58 +02:00
Pete Sage 51fbccd125 Fix Sonos CI issue part 2 (#150529)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-08-13 12:26:24 +02:00
G Johansson 5fc2e6ed53 Add async_update_reload_and_abort to config entry subentries (#149768)
Co-authored-by: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com>
2025-08-13 11:59:37 +02:00
Christopher Fenner 5a7f7d90a0 move Volvo car connection status sensor to diagnostic section (#150487) 2025-08-13 11:45:05 +02:00
Luke Lashley 6d34d34ce1 Bump python-snoo to 0.8.1 (#150530) 2025-08-13 11:38:18 +02:00
dependabot[bot] 6454f40c3c Bump github/codeql-action from 3.29.8 to 3.29.9 (#150539)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-13 11:36:43 +02:00
epenet 53e40a6b8c Ensure Tuya humidifiers have at least one valid DPCode (#150546) 2025-08-13 11:25:59 +02:00
J. Nick Koston 8a54a1d95c Bump aioesphomeapi to 39.0.0 (#150523) 2025-08-13 03:17:20 -05:00
Yevhenii Vaskivskyi 8a52e9ca01 Bump asusrouter to 1.18.2 (#150541) 2025-08-13 10:46:08 +03:00
Robert Resch d9ca253c6c Bump uv to 0.8.9 (#150542) 2025-08-13 09:45:54 +02:00
Pete Sage b7853ea9bd Fix Sonos CI Issue (#150518)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-12 23:18:59 +02:00
J. Nick Koston d19e410ea8 Bump aiodhcpwatcher to 1.2.1 (#150519) 2025-08-12 22:07:25 +02:00
Shay Levy 83f911e4ff Bump aiowebostv to 0.7.5 (#150514) 2025-08-12 22:53:56 +03:00
jan iversen 452322e971 Modbus: Do not remove non-duplicate error log. (#150511) 2025-08-12 21:16:43 +02:00
Manu 6fa7c6cb81 Add party to Habitica (#149608) 2025-08-12 20:51:12 +02:00
J. Nick Koston ed6072d46b Bump bleak-retry-connector to 4.0.1 (#150515) 2025-08-12 20:49:43 +02:00
Yevhenii Vaskivskyi 9fdc632780 Switch asuswrt http(s) library to asusrouter package (#150426) 2025-08-12 20:45:39 +02:00
Norbert Rittel 4d426c31f9 Fix missing sentence-case in hydrawise (#150513) 2025-08-12 20:10:43 +02:00
jan iversen ea946c90b3 Modbus: Cancel connect background task if stopping/restarting. (#150507) 2025-08-12 19:38:17 +02:00
Tom fb68b2d454 Bump airOS to 0.2.8 (#150504) 2025-08-12 19:27:27 +02:00
Ludovic BOUÉ 2ebe0a929e Matter SmokeCoAlarm SelfTestRequest (#150497) 2025-08-12 19:10:55 +02:00
Manu c1e5a7efc9 Add icons to Sleep as Android sensor entities (#150451) 2025-08-12 18:23:27 +02:00
dependabot[bot] 561ef7015c Bump actions/checkout from 4.2.2 to 5.0.0 (#150494)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-12 18:17:44 +02:00
Robin Lintermann b4270e019e Bump pysmarlaapi to 0.9.2 (#150496) 2025-08-12 18:14:32 +02:00
Joost Lekkerkerker 614bf96fb9 Add model_id to Philips Hue (#150499) 2025-08-12 18:09:14 +02:00
Tucker Kern ca290ee631 Implement Snapcast grouping with standard HA actions (#146855)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-12 18:07:29 +02:00
epenet ad3174f6e6 Rename Tuya parsing models (#150498) 2025-08-12 18:02:26 +02:00
jan iversen 218b0738ca Modbus: Remove wrong comment on non-existing parameter. (#150501) 2025-08-12 18:00:51 +02:00
Joakim Plate 98e6e20079 Mock habluetooth adapters (#148919) 2025-08-12 10:46:31 -05:00
Norbert Rittel 89aa349881 Fix spelling of "an HS color command" in template (#150495) 2025-08-12 17:18:27 +02:00
wedsa5 07930b12d0 Fix brightness command not sent when in white color mode (#150439)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-08-12 16:36:52 +02:00
Renat Sibgatulin 711afa306c Add number platform for LED brightness to air-Q (#150492) 2025-08-12 15:39:28 +02:00
epenet a3904ce60c Sort Tuya DPCodes alphabetically (#150477) 2025-08-12 15:28:42 +02:00
hanwg 455cf2fb42 Add notify platform for Telegram bot (#149853)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-12 15:24:13 +02:00
Aarni Koskela 072ae2b955 ruuvitag_ble: add new sensors (#150435)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-08-12 14:19:15 +02:00
epenet 2b70639b11 Add device registry snapshots to Tuya (#150482)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-12 14:04:36 +02:00
Åke Strandberg 2612dbeb9b Add missing boost2 code for Miele hobs (#150481) 2025-08-12 13:58:38 +02:00
Matrix 7ebdd24224 Bump yolink api to 0.5.8 (#150480) 2025-08-12 13:55:04 +02:00
Martin Hjelmare 66ff1cf005 Improve Z-Wave manual config flow step description (#150479) 2025-08-12 13:47:11 +02:00
David 08aae4bf49 Fix error of the Powerfox integration in combination with the new Powerfox FLOW adapter (#150429)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-12 12:45:21 +02:00
Etienne C. 313b5a483c Remove rounding of Waze duration sensor (#150424) 2025-08-12 12:20:48 +02:00
Arie Catsman 8edbcc92d3 Fix enphase_envoy non existing via device warning at first config. (#149010)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-12 11:55:43 +02:00
peteS-UK 067cab71fa Additional Fix error on startup when no Apps or Radio plugins are installed for Squeezebox (#150475) 2025-08-12 11:55:21 +02:00
Nippey 596e4883b1 Add more sensors to Tuya weather station (#150442)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-08-12 11:33:51 +02:00
yufeng fb4a452872 Add supply frequency sensors to Tuya energy monitoring devices (#149320)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-08-12 11:02:03 +02:00
yufeng 5b232226e9 Add timers and switches to Tuya irrigation systems (#149236) 2025-08-12 10:53:08 +02:00
J. Nick Koston db81610983 Bump aioesphomeapi to 38.2.1 (#150455) 2025-08-12 10:46:53 +02:00
epenet 8f5c8caf07 Add mute switch to Tuya smoke detectors (#150469) 2025-08-12 10:45:39 +02:00
Matrix f6af524ddf Fix YoLink valve state when device running in class A mode (#150456) 2025-08-12 10:42:40 +02:00
Norbert Rittel e0a8c9b458 Fix missing sentence-casing in somfy_mylink (#150463) 2025-08-12 10:30:38 +02:00
Cyrill Raccaud c46412ee5b Bump cookidoo-api to 0.14.0 (#150450) 2025-08-12 09:51:39 +02:00
Mike Degatano a06df2a680 Make disk_lifetime issue into a repair (#150140) 2025-08-12 08:39:37 +02:00
epenet 68fbcc8665 Add pymodbus to package constraints (#150419)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-12 00:50:05 +02:00
Manu 6cde5cfdcc Add diagnostics platform to Sleep as Android (#150447) 2025-08-11 23:47:07 +02:00
Wesley Vos 5605f5896a Remove the battery feature from supported features (#150101) 2025-08-11 23:26:27 +02:00
Manu 93c30f1b59 Add sensor platform to Sleep as Android (#150440) 2025-08-11 23:25:51 +02:00
Pete Sage 6e3ccbefc2 Add quality scale for Sonos (#144928) 2025-08-11 22:50:47 +02:00
Noah Husby 715dc12792 Add media browsing to Russound RIO (#148248) 2025-08-11 22:40:40 +02:00
Denis Shulyaka 9cae0e0acc OpenAI thinking content (#150340) 2025-08-11 22:28:36 +02:00
Kevin David e13702d9b1 Bump python-snoo to 0.7.0 (#150434) 2025-08-11 22:25:41 +02:00
Tsvi Mostovicz 3b358df9e7 Jewish Calendar add coordinator (#141456)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-11 22:22:13 +02:00
Foscam-wangzhengyu e394435d7c Add more Foscam switches (#147409)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-08-11 22:14:32 +02:00
Aarni Koskela 9e398ffc10 Bump to ruuvitag-ble==0.2.1 (#150436) 2025-08-11 22:05:44 +02:00
tdfountain 065a53a90d Add quality scale and set Platinum for NUT (#143269)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-08-11 21:27:33 +02:00
Manu 91f6b8e1fe Add Sleep as Android integration (#142569) 2025-08-11 20:03:37 +02:00
Michael Hansen 1a9d1a9649 Handle non-streaming TTS case correctly (#150218) 2025-08-11 11:47:29 -05:00
MB901 cb7c7767b5 Add model_id for Freebox integration (#150430) 2025-08-11 18:46:57 +02:00
CubeZ2mDeveloper d02029143c Add SONOFF Dongle Lite MG21 discovery support in ZHA (#148813)
Co-authored-by: zetao.zheng <1050713479@qq.com>
2025-08-11 12:41:41 -04:00
Robin Lintermann 3eda687d30 Smarla integration sensor platform (#145748) 2025-08-11 17:08:07 +02:00
Jamie Magee 7688c367cc Remove coinbase v2 API support (#148387)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-11 16:58:36 +02:00
Manu a1dc3f3eac Bump habiticalib to version 0.4.2 (#150417) 2025-08-11 15:51:22 +02:00
Martin Hjelmare d135d08813 Lower Z-Wave firmware check delay (#150411) 2025-08-11 14:09:04 +02:00
Brett Adams 9595759fd1 Add stale device cleanup to Teslemetry (#144523) 2025-08-11 13:54:44 +02:00
Etienne C. d54f979612 Add a coordinator to Waze Travel Time (#148585) 2025-08-11 13:20:18 +02:00
Paulus Schoutsen 531073acc0 Allow specifying multiple integrations (#150349) 2025-08-11 13:12:29 +02:00
Bouwe Westerdijk 73cbc962f9 Implement snapshot testing for Plugwise binary_sensor platform (#150375) 2025-08-11 13:11:24 +02:00
epenet 34b0b71375 Add Tuya snapshot tests for empty electricity RAW sensors (#150407) 2025-08-11 12:05:33 +02:00
Brett Adams 203c908730 Add charging and preconditioning actions to Teslemetry (#144184) 2025-08-11 11:59:39 +02:00
tronikos 23e6148d3b Create an issue if Opower utility is no longer supported (#150315) 2025-08-11 11:58:12 +02:00
epenet 2a5a66f9d5 Handle empty electricity RAW sensors in Tuya (#150406) 2025-08-11 11:55:47 +02:00
dependabot[bot] 84ce5d65e1 Bump github/codeql-action from 3.29.7 to 3.29.8 (#150405)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-11 11:50:00 +02:00
Bram Kragten 00c7838587 Update frontend to 20250811.0 (#150404) 2025-08-11 10:58:03 +02:00
Stefan Agner d8b576c087 Rename local OAuth2 source (#150403) 2025-08-11 10:37:25 +02:00
Tomeroeni 330dce24c5 Bump aiounifi to version 86 (#150321) 2025-08-11 10:32:35 +02:00
karwosts 0089d3efa1 Support multiple for StateSelector (#146288) 2025-08-11 11:24:20 +03:00
Manuel Stahl 167e9c8f4a Update pystiebeleltron to 0.2.3 (#150339)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-11 09:43:09 +02:00
Manu c7f5e25d41 Update quality scale to platinum 🏆️ for Uptime Kuma (#148951) 2025-08-10 23:36:57 +02:00
Florian von Garrel 7b5dd4a0ec Paperless-ngx: Disable entities by default and extended docs (#149473) 2025-08-10 23:36:36 +02:00
Denis Shulyaka 84de6aacfc Remove native field from conversation chatlog delta listeners (#150389) 2025-08-10 22:41:37 +02:00
epenet 9561c84920 Fix issue with Tuya suggested unit (#150394) 2025-08-10 22:39:00 +02:00
jan iversen 7572b2a669 Bump pymodbus to v3.11.1. (#150383) 2025-08-10 22:38:49 +02:00
dontinelli b48409ab1b Add new sensors with battery data for solarlog (#150385)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-10 22:28:50 +02:00
Austin Mroczek ab04e2c501 TotalConnect major test updates (#139672)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-08-10 22:26:43 +02:00
epenet 38e6a7c6d4 Add Tuya test fixtures (#150387) 2025-08-10 22:17:14 +02:00
Vincent Wolsink c2b284de2d Add humidity (steamer) control to Huum (#150330)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-10 21:55:20 +02:00
epenet b760bf342a Add frost protection and valve status to Tuya thermostats (#150177) 2025-08-10 21:37:14 +02:00
Yuxin Wang 79cfea3fea Use mock_setup_entry fixture for APCUPSD (#150392) 2025-08-10 21:35:47 +02:00
dontinelli 69ace08c01 Bump solarlog_cli to 0.5.0 (#150384) 2025-08-10 20:57:03 +02:00
Yuxin Wang bf33e286d6 Add recovery test logic for connection failure for APCUPSD (#150382)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-10 20:32:25 +02:00
epenet 6b83effc5f Simplify DEVICE_MOCKS in Tuya (#150381) 2025-08-10 17:58:51 +02:00
epenet 2b158fe690 Add Tuya snapshots tests for kt category (air conditioner) (#150256) 2025-08-10 17:45:40 +02:00
epenet 712ddc03c8 Add Tuya snapshots tests for kj category (air purifier) (#150171) 2025-08-10 17:44:55 +02:00
epenet efe519faad Add mute support to Tuya wg2 category (gateway) (#150122) 2025-08-10 17:44:26 +02:00
epenet 1b7cb418eb Add Tuya snapshots tests for cwysj category (pet water fountain) (#150121) 2025-08-10 17:44:00 +02:00
Yuxin Wang c678bcd4f1 Split test_config_flow_duplicate tests into two separate ones for APCUPSD (#150379) 2025-08-10 17:35:48 +02:00
Marc Mueller 0eaea13e8d Update pylint to 3.3.8 + astroid to 3.3.11 (#150327) 2025-08-10 16:41:59 +02:00
Norbert Rittel b1e4513f7d Capitalize "Ice Plus" as feature name in lg_thinq (#150370) 2025-08-10 15:14:40 +02:00
Steven Looman 6d7f8bb7d7 Remove unused string scan_interval in upnp component (#150372) 2025-08-10 15:14:14 +02:00
Norbert Rittel b481aaba77 Fix wrong translation of unlock_inside_the_door in xiaomi_ble (#150371)
thanks
2025-08-10 11:45:24 +02:00
Alexandre CUER d539f37aa4 Remove CONF_EXCLUDE_FEEDID constant from the emoncms integration (#150333) 2025-08-10 09:52:17 +02:00
J. Nick Koston 865b3a6646 Add raw advertisement data to Bluetooth WebSocket API (#150358) 2025-08-10 09:44:15 +02:00
Denis Shulyaka 1c603f968f Bump openai to 1.99.5 (#150342) 2025-08-10 09:41:55 +02:00
J. Nick Koston d821d27730 Bump habluetooth to 5.0.1 (#150320) 2025-08-10 09:41:25 +02:00
tronikos dfa060a7e1 Remove Mercury NZ Limited virtual integration (#150316) 2025-08-10 09:38:48 +02:00
Alexandre CUER 5262cca8e6 Use "device_id" instead of "slave" in modbus integration (#150200) 2025-08-10 09:31:26 +02:00
Yuxin Wang 2c36a74da5 Also test unique ID in config flow test for APCUPSD (#150362) 2025-08-10 07:49:25 +02:00
G Johansson 084cde6ecf Add base entity to workday (#150329) 2025-08-09 21:52:39 +02:00
Denis Shulyaka 3e34aa5fb7 Add thinking and native content to chatlog (#149699) 2025-08-09 15:26:19 +02:00
Pete Sage 268f0d9e03 Add Tests for Sonos Alarms (#150014) 2025-08-09 13:47:16 +02:00
Thomas D f8d3bc1b89 Volvo: Skip unsupported API fields (#150285) 2025-08-09 12:24:53 +02:00
Philipp Waller fb64ff1d17 Update knx-frontend to 2025.8.9.63154 (#150323) 2025-08-09 12:14:31 +02:00
steinmn ff72faf83a Set suggested display precision on Volvo energy/fuel consumption sensors (#150296) 2025-08-09 07:48:49 +02:00
Tom acb58c41eb Bump airOS to 0.2.7 supporting firmware 8.7.11 (#150298) 2025-08-09 07:48:05 +02:00
epenet 586b197fc3 Speedup Tuya snapshot tests (#150198) 2025-08-09 07:46:48 +02:00
Manu 5c1d16d582 Abort config flow if user has no friends in PlayStation Network (#150301) 2025-08-09 07:44:35 +02:00
Tom 73be4625ae Add sensor uom suggestions to airOS (#150303) 2025-08-09 07:43:51 +02:00
Andrew Jackson 775701133d Remove deprecated notify platform from Mastodon (#149735) 2025-08-09 01:17:48 +02:00
MB901 1af0282091 Add hardware version to FreeboxRouter device info (#150004) 2025-08-09 00:54:53 +02:00
Joakim Plate c876bed33f Add ToGrill integration (#150075)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-09 00:24:54 +02:00
G Johansson e9d39a826e Remove deprecated horizontal vane select from Sensibo (#150108) 2025-08-09 00:24:38 +02:00
Thomas55555 f9e1c07c04 Add event platform to Husqvarna Automower (#148212)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-08-09 00:07:47 +02:00
Renat Sibgatulin c0bef51563 Refactor airq tests to mock the API class in a fixture (#149712) 2025-08-09 00:01:39 +02:00
Willem-Jan van Rootselaar b41a9575af Add protected call for data retrieval (#150035) 2025-08-08 23:58:19 +02:00
Norbert Rittel e585b3abd1 Fix missing sentence-casing of "AC failure" in bosch_alarm (#150279) 2025-08-08 23:33:55 +02:00
mbo18 5d2877f454 Add absolute humidity sensor to Awair integration (#150110) 2025-08-08 22:55:24 +02:00
Artur Pragacz 2d89c60ac5 Improve service schemas in unifiprotect (#150236) 2025-08-08 22:51:24 +02:00
Marco Gasparini 860a7b7d91 Fix Progettihwsw config flow (#150149) 2025-08-08 22:29:50 +02:00
Ludovic BOUÉ 5585376b40 Switchbot Hub Light level (#150147) 2025-08-08 22:13:23 +02:00
Thomas55555 c4cb70fc06 Handle HusqvarnaWSClientError (#150145) 2025-08-08 22:12:18 +02:00
Pete Sage 981ae39182 Fix dialog enhancement switch for Sonos Arc Ultra (#150116) 2025-08-08 22:11:32 +02:00
Alexandre CUER dff4f79925 Remove useless strings from emoncms (#150182) 2025-08-08 22:00:48 +02:00
Manu bf64e11960 Migrate unique_id only if monitor_id is present in Uptime Kuma (#150197) 2025-08-08 21:38:27 +02:00
Thomas D 823d20c67f Volvo: fix distance to empty battery (#150278) 2025-08-08 21:28:29 +02:00
Norbert Rittel 1a654cd35d Use common strings "Low"/"High" for more states in tuya (#150283) 2025-08-08 20:52:03 +02:00
Denis Shulyaka 13e592edaf Bump anthropic to 0.62.0 (#150284) 2025-08-08 20:51:49 +02:00
Norbert Rittel 94191239c6 Remove misleading "the" from Launch Library configuration (#150288) 2025-08-08 20:50:14 +02:00
Denis Shulyaka 91a1ca09f7 Add GPT-5 support (#150281) 2025-08-08 20:49:09 +02:00
Tom 9f1fe8a067 Add binary_sensor to UISP airOS (#149803)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-08 20:34:40 +02:00
Yuxin Wang f2c9cdb09e Add quality scale for APCUPSD integration (#146999) 2025-08-08 20:31:34 +02:00
Tom 712115cdb8 Bump airOS to 0.2.6 improving device class matching more devices (#150134) 2025-08-08 19:33:16 +02:00
dependabot[bot] eb6ae9d2d6 Bump actions/cache from 4.2.3 to 4.2.4 (#150253)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-08 15:28:51 +02:00
puddly b126f3fa66 Bump ZHA to 0.0.68 (#150208) 2025-08-08 15:27:17 +02:00
puddly 2d720f0d32 Fix JSON serialization for ZHA diagnostics download (#150210) 2025-08-08 15:27:00 +02:00
Raphael Hehl c0155f5e80 Handle Unifi Protect BadRequest exception during API key creation (#150223) 2025-08-08 15:26:02 +02:00
Thomas D 23a2d69984 Volvo: fix missing charging power options (#150272) 2025-08-08 15:25:19 +02:00
peteS-UK a8779d5f52 Fix error on startup when no Apps or Radio plugins are installed for Squeezebox (#150267) 2025-08-08 15:24:41 +02:00
Robert Resch 01c197e830 Constraint num2words to 0.5.14 (#150276) 2025-08-08 15:06:31 +02:00
peteS-UK ef4f476844 Fix handing for zero volume error in Squeezebox (#150265) 2025-08-08 14:26:04 +02:00
dependabot[bot] 8aee05b8b0 Bump github/codeql-action from 3.29.5 to 3.29.7 (#150254)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-08 13:57:20 +02:00
Denis Shulyaka 0f3f8d5707 Bump openai to 1.99.3 (#150232) 2025-08-08 13:57:12 +02:00
epenet 2948b1c58e Cleanup Tuya fixture files (#150190) 2025-08-08 13:56:44 +02:00
Joris Pelgröm 4cb2af4d08 Add select platform to LetPot integration (#150212) 2025-08-08 13:47:13 +02:00
G Johansson 8e12d2028d Remove previously deprecated linear_garage_door (#150109)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-08-08 13:09:01 +02:00
G Johansson 5b046def8e Move holiday object to runtime data in workday (#149122) 2025-08-08 12:02:07 +02:00
Åke Strandberg 6a81bf6f5e Improve interface between Miele integration and pymiele library (#150214) 2025-08-08 11:40:04 +02:00
epenet 102d6a37c0 Use generated device id in tuya tests (#150196) 2025-08-08 09:15:42 +02:00
Yuxin Wang fd6aba3022 Add missing strings for APCUPSD (#150242) 2025-08-08 08:41:03 +02:00
tronikos a88eadf863 Update Opower strings (#150247) 2025-08-08 08:40:28 +02:00
Tom 52f0d04c38 Improve Roborock test teardown (#150144) 2025-08-07 20:32:05 -07:00
Denis Shulyaka 3ab80c6ff2 Bump google-genai to 1.29.0 (#150225) 2025-08-07 16:26:02 -07:00
Vincent Wolsink 71485871c8 Bump Huum requirement to 0.8.1 (#150220) 2025-08-07 21:59:58 +01:00
Martin Hjelmare ba0da4c2a3 Remove switchbot vacuum battery attribute (#150227) 2025-08-07 22:39:45 +02:00
Martin Hjelmare cbaadebac3 Fix Tibber coordinator ContextVar warning (#150229) 2025-08-07 22:39:24 +02:00
Åke Strandberg fd0ae32058 Bump pymiele to 0.5.3 (#150216) 2025-08-07 20:48:25 +02:00
Martin Hjelmare 382bf78ee0 Ignore MQTT vacuum battery warning (#150211) 2025-08-07 20:11:39 +02:00
Martin Hjelmare 6aa077a48d Silence vacuum battery deprecation for built in integrations (#150204) 2025-08-07 19:43:36 +02:00
Joakim Sørensen b638fcbaad Bump hass-nabucasa from 0.111.1 to 0.111.2 (#150209) 2025-08-07 19:42:22 +02:00
G Johansson 704edac9fd Remove deprecated state from backup schedule (#150114)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-08-07 17:42:53 +01:00
yufeng ff9e2a8f1e Update tuya translation for reverse energy sensor (#149317) 2025-08-07 17:08:57 +02:00
Stefan H. d778afe61a Fix Enigma2 startup hang (#149756) 2025-08-07 15:33:24 +01:00
Norbert Rittel 448084e2b5 Fix description of button.press action (#150181) 2025-08-07 15:22:36 +02:00
jan iversen d99379ffdf modbus: use only 1 logger instance. (#150130) 2025-08-07 15:11:00 +02:00
Maciej Bieniek b835b7f266 Bump imgw_pib to version 1.5.3 (#150178) 2025-08-07 13:31:55 +02:00
epenet e96e97edca Add Tuya snapshots tests for sj category (rain sensor) (#150173) 2025-08-07 13:24:33 +02:00
epenet df7c657d7e Add Tuya snapshots tests for wk category (thermostat) (#150175) 2025-08-07 12:53:19 +02:00
epenet 4f5502ab47 Add Tuya snapshots tests for ldcg category (luminance sensor) (#150169) 2025-08-07 12:50:46 +02:00
epenet c30ee776e9 Add Tuya snapshots tests for zwjcy category (soil sensor) (#150168) 2025-08-07 10:44:51 +02:00
epenet efebdc0181 Add Tuya snapshots tests for cl category (curtains) (#150167) 2025-08-07 10:42:36 +02:00
jan iversen da7fc88f1f Bump pymodbus to v3.11.0. (#150129) 2025-08-07 08:13:11 +02:00
Joris Pelgröm 566aeb5e9a Bump letpot to 0.6.1 (#150137) 2025-08-07 08:08:47 +02:00
J. Nick Koston d17f0ef55a Bump inkbird-ble to 1.1.0 to add support for IAM-T2 (#150158) 2025-08-07 08:07:31 +02:00
Abílio Costa 35025c4b59 Fix roborock config flow tests (#150135) 2025-08-07 00:05:31 +01:00
Abílio Costa e5d512d5e5 Add entity filter to target state change tracker (#150064)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-06 20:03:09 +02:00
puddly 2b5028bfb7 Bump ZHA to 0.0.67 (#150132) 2025-08-06 19:56:44 +02:00
Paul Bottein 757fee9f73 Use state selector for climate set hvac mode service (#148963) 2025-08-06 17:48:55 +01:00
Artur Pragacz 06130219b4 Use relative condition keys (#150021) 2025-08-06 17:20:30 +01:00
AlCalzone 4e2fe63182 Check for Z-Wave firmware updates of sleeping devices (#150123) 2025-08-06 18:08:51 +02:00
Luca Angemi d0cc9990dd Deprecate Roborock battery feature (#150126) 2025-08-06 17:32:23 +02:00
epenet 76ca9ce3a4 Add comment to Tuya code for unsupported devices (#150125)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-06 17:12:32 +02:00
epenet 124e7cf4c8 Add support for tuya ywcgq category (liquid level) (#150096)
Thanks @joostlek / @frenck
2025-08-06 15:38:50 +02:00
G Johansson 260ea9a3be Remove previously deprecated raw value attribute from onewire (#150112) 2025-08-06 15:24:22 +02:00
Bram Kragten e1f6820cb6 Update frontend to 20250806.0 (#150106)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-06 15:22:46 +02:00
David Poll 2215777cfb Fix zero-argument functions with as_function (#150062) 2025-08-06 15:20:03 +02:00
G Johansson fa3ce62ae8 Bump holidays to 0.78 (#150103) 2025-08-06 14:55:00 +02:00
Joakim Sørensen 33421bddf3 Remove myself as codeowner from traccar_server (#150107) 2025-08-06 14:51:43 +02:00
markhannon 1efe2b437d Improve dependency transparency for Zimi integration (#145879) 2025-08-06 14:50:06 +02:00
Joost Lekkerkerker a54f0adf74 Enable disabled Ollama config entries after entry migration (#150105) 2025-08-06 14:27:36 +02:00
epenet afe574f74e Simplify DPCode lookup in Tuya (#150052) 2025-08-06 14:24:01 +02:00
epenet 25aae8944d Add Tuya snapshots tests for mzj category (sous-vide) (#150102) 2025-08-06 14:17:30 +02:00
Martin Hjelmare f26e6ad211 Fix update coordinator ContextVar log for custom integrations (#150100) 2025-08-06 14:14:42 +02:00
Joost Lekkerkerker e9444a2e4d Enable disabled Anthropic config entries after entry migration (#150098) 2025-08-06 13:24:49 +02:00
Joost Lekkerkerker 60988534a9 Enable disabled OpenAI config entries after entry migration (#150099) 2025-08-06 13:24:37 +02:00
Michael 932bf81ac8 Add common constant ATTR_CONFIG_ENTRY_ID (#150067) 2025-08-06 12:42:51 +02:00
Jan Bouwhuis 1302b6744e Deprecate MQTT vacuum battery feature and remove it as default feature (#149877)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-08-06 11:51:31 +02:00
tronikos 0aeff366bd Fix PG&E and Duquesne Light Company in Opower (#149658)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-08-06 11:32:42 +02:00
epenet 0db23b0da6 Add Tuya debug logging for new devices (#150091)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-06 11:23:34 +02:00
epenet 863e2074b6 Add more switches to Tuya tdq category (#150090) 2025-08-06 11:03:26 +02:00
epenet 13828f6713 Remove tuya vacuum battery level attribute (#150086) 2025-08-06 11:02:04 +02:00
starkillerOG fdb38ec8ec Reduce Reolink fimware polling from 12h to 24h (#150095) 2025-08-06 10:58:52 +02:00
Robert Resch 55abb6e594 Fix hassio tests by only mocking supervisor id (#150093) 2025-08-06 10:53:55 +02:00
Stefan Agner a83e4f5c63 Add missing translations for unhealthy Supervisor issues (#150036) 2025-08-06 10:07:36 +02:00
J. Nick Koston cba15ee439 Bump habluetooth to 4.0.2 (#150078)
Co-authored-by: Robert Resch <robert@resch.dev>
2025-08-06 09:51:44 +02:00
dependabot[bot] 400620399a Bump actions/download-artifact from 4.3.0 to 5.0.0 (#150084)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-06 09:48:10 +02:00
dependabot[bot] 28e19215ad Bump actions/ai-inference from 1.2.7 to 1.2.8 (#150083)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-06 09:46:02 +02:00
Philipp Waller 119d0a0170 Update knx-frontend to 2025.8.6.52906 (#150085) 2025-08-06 09:28:44 +02:00
Joakim Sørensen 69faf38e86 Bump hass-nabucasa from 0.111.0 to 0.111.1 (#150082) 2025-08-06 09:24:09 +02:00
puddly d0ef1a1a8b Bump ZHA to 0.0.66 (#150081) 2025-08-06 09:22:07 +02:00
Retha Runolfsson 8f328810bf Bump pyswitchbot to 0.68.3 (#150080) 2025-08-05 19:20:37 -10:00
Pete Sage 4f1b75e3b4 Bump soco to 0.30.11 (#150072) 2025-08-05 22:56:27 +01:00
J. Nick Koston 445a7fc749 Bump yalexs to 8.11.1 (#150073) 2025-08-05 22:55:01 +01:00
Robert Svensson 977c0797aa Bump axis to v65 (#150065) 2025-08-05 11:36:48 -10:00
Ludovic BOUÉ a24f027923 Add icon for esa_state in Matter integration (#149075) 2025-08-05 23:18:48 +02:00
Martin Hjelmare 7b45798e30 Remove matter vacuum battery level attribute (#150061) 2025-08-05 22:40:42 +02:00
Artur Pragacz 2b0cda0ad1 Adjust condition and trigger method names (#150060) 2025-08-05 19:46:03 +01:00
starkillerOG 12dca4b1bf Bump reolink-aio to 0.14.6 (#150055) 2025-08-05 18:58:22 +02:00
karwosts 8c509b11b2 Fix template sensor uom string (#150057) 2025-08-05 18:56:34 +02:00
Joost Lekkerkerker 991c9008bd Change AI task strings (#150051) 2025-08-05 16:35:41 +02:00
Martin Hjelmare fe95f6e1c5 Improve downloader service (#150046)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-08-05 16:12:55 +02:00
Bram Kragten 37510aa316 Update frontend to 20250805.0 (#150049) 2025-08-05 16:01:47 +02:00
Marc Mueller 4e40e9bf74 Update mypy-dev to 1.18.0a4 (#150005) 2025-08-05 15:56:03 +02:00
Bouwe Westerdijk 70c9b1f095 Implement snapshot testing for Plugwise button platform (#149984) 2025-08-05 15:31:02 +02:00
dependabot[bot] f714388130 Bump docker/login-action from 3.4.0 to 3.5.0 (#150034)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-05 15:25:58 +02:00
Joost Lekkerkerker ffb2a693f4 Ignore vacuum entities that properly deprecate battery (#150043) 2025-08-05 15:22:21 +02:00
Andrew Jackson 9d8e253ad3 Default to zero quantity on new todo items in Mealie (#150047) 2025-08-05 15:15:08 +02:00
dependabot[bot] 31631cc882 Bump actions/ai-inference from 1.2.4 to 1.2.7 (#150038)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-05 14:40:01 +02:00
epenet 3a64357201 Fix Tuya fan speeds with numeric values (#149971) 2025-08-05 13:22:45 +02:00
Thomas55555 20fdec9e9c Reduce polling in Husqvarna Automower (#149255)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-05 12:56:27 +02:00
Nippey 064a63fe1f Add support for Tuya "Bresser 7-in-1 Weatherstation" (#149498) 2025-08-05 12:54:40 +02:00
epenet 803654223a Revert "Do not create Tuya fan entities without control" (#150032) 2025-08-05 12:23:06 +02:00
epenet a6148b50cf Add Tuya snapshots tests for button and vacuum platform (#149968) 2025-08-05 11:21:05 +02:00
Ludovic BOUÉ 02a3c5be14 Matter pump setpoint CurrentLevel limit (#149689) 2025-08-05 11:19:03 +02:00
Paulus Schoutsen 08ea640629 Do not allow overriding users when uuid is duplicate (#149408) 2025-08-05 11:13:32 +02:00
Grzegorz M 7dd761c9c3 Bump icalendar from 6.1.0 to 6.3.1 for CalDav (#149990) 2025-08-05 11:09:03 +02:00
epenet 6b827dfc33 Do not create Tuya fan entities without control (#149976)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-05 09:52:29 +02:00
Robert Resch 67c19087dd Bump deebot-client to 13.6.0 (#149983) 2025-08-05 09:08:33 +02:00
epenet 55c7c2f730 Redact terminal_id in Tuya fixture files (#149957) 2025-08-05 09:06:15 +02:00
Matthias Alphart afee936c3d Update knx-frontend to 2025.8.4.154919 (#149991) 2025-08-05 09:03:23 +02:00
Marc Mueller ed2ced6c36 Fix zimi test RuntimeWarnings (#150017) 2025-08-05 08:55:54 +02:00
Martin Hjelmare 4c5cf028d7 Fix Z-Wave duplicate provisioned device (#150008) 2025-08-05 08:50:42 +02:00
Thomas55555 68faa897ad Bump aioautomower to 2.1.2 (#150003) 2025-08-05 08:48:47 +02:00
Artur Pragacz 53c9c42148 Use relative trigger keys (#149846) 2025-08-04 23:01:40 +01:00
Michael Hansen d48cc03be7 Bump wyoming to 1.7.2 (#150007) 2025-08-04 23:36:24 +02:00
starkillerOG 28236aa023 Reolink disable entities by default (#149986) 2025-08-04 23:03:38 +02:00
Tom bfae07135a Bump python-airos to 0.2.4 (#149885) 2025-08-04 22:35:47 +02:00
Thomas55555 99d580e371 Add reset cutting blade usage time to Husqvarna Automower (#149628) 2025-08-04 22:28:34 +02:00
Petro31 4d53450cbf Create battery_level deprecation repair for template vacuum platform (#149987)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-08-04 21:54:50 +02:00
epenet 1fbce01e26 Add initial support for Tuya wg2 category (#149676) 2025-08-04 21:30:43 +02:00
markhannon a9621ac811 Add tests for Zimi entitites (#144292) 2025-08-04 20:41:05 +02:00
Marc Mueller 94f2118b19 Fix flaky history_stats test case (#149974) 2025-08-04 20:34:07 +02:00
Mike Degatano 73ca6b4900 Add translation strings for unsupported OS version (#149837) 2025-08-04 17:40:11 +02:00
Joakim Sørensen 31e647b5b0 Bump hass-nabucasa from 0.110.1 to 0.111.0 (#149977) 2025-08-04 16:59:07 +02:00
epenet fac5b2c09c Add Tuya snapshots tests for camera platform (#149959) 2025-08-04 16:58:46 +02:00
Martin Hjelmare ae48179e95 Bump zwave-js-server-python to 0.67.1 (#149972) 2025-08-04 15:58:57 +02:00
Willem-Jan van Rootselaar 88c9d5dbe3 Fix bsblan reauthentication (#149926) 2025-08-04 15:35:41 +02:00
hanwg b76f47cd9f Add bot details to Telegram bot events (#148638) 2025-08-04 14:32:48 +02:00
hanwg 822e1ffc8d Minor UI improvements for Telegram bot actions (#149889) 2025-08-04 14:27:15 +02:00
Martin Hjelmare 1632e0aef6 Direct migrations with Z-Wave JS UI to docs (#149966) 2025-08-04 13:36:12 +02:00
Petro31 e2bc73f153 Fix optimistic covers (#149962) 2025-08-04 13:35:13 +02:00
Joakim Sørensen 46cfdddc80 Move to the new handler for migrate_paypal_agreement (#149934) 2025-08-04 13:29:11 +02:00
Joost Lekkerkerker 0bdf6757c4 Pass config entry to Remote Calendar coordinator (#149958) 2025-08-04 13:28:59 +02:00
Joost Lekkerkerker 312e590360 Pass config entry to Broadlink coordinator (#149949) 2025-08-04 13:27:51 +02:00
Joost Lekkerkerker 7a6aaf667b Pass config entry to hue coordinator (#149941) 2025-08-04 13:27:10 +02:00
Joost Lekkerkerker 33eaca24d6 Pass config entry to Simplisafe coordinator (#149943) 2025-08-04 13:21:29 +02:00
Joost Lekkerkerker 3d27d501b1 Pass config entry to Mill coordinator (#149942) 2025-08-04 13:20:30 +02:00
Joost Lekkerkerker 39b651e075 Pass config entry to Kraken coordinator (#149944) 2025-08-04 13:17:27 +02:00
Joost Lekkerkerker a962777a2e Pass config entry to Meteo France coordinator (#149945) 2025-08-04 13:14:50 +02:00
Joost Lekkerkerker 594ce8f266 Pass config entry to Smarttub coordinator (#149946) 2025-08-04 12:58:46 +02:00
Joost Lekkerkerker 9f867f268c Pass config entry to Snoo coordinator (#149947) 2025-08-04 12:58:19 +02:00
Joost Lekkerkerker 9edd242734 Pass config entry to SMS coordinator (#149955) 2025-08-04 12:49:26 +02:00
Bouwe Westerdijk 93e11aa8bc Refresh plugwise test-fixtures (#149875) 2025-08-04 12:35:24 +02:00
Joakim Sørensen c2b298283e Bump hass-nabucasa from 0.110.0 to 0.110.1 (#149956) 2025-08-04 12:32:01 +02:00
Joost Lekkerkerker 106c086e8b Pass config entry to Unifi coordinator (#149952) 2025-08-04 12:29:27 +02:00
Markus Adrario cbf4130bff Add zeroconf flow to Homee (#149820)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-08-04 12:26:22 +02:00
Erik Montnemery afffe0b08b Fix DeviceEntry.suggested_area deprecation warning (#149951) 2025-08-04 12:20:30 +02:00
Joost Lekkerkerker c1ccfee7cc Pass config entry to AsusWRT coordinator (#149953) 2025-08-04 12:08:03 +02:00
epenet 8d8383e1c1 Add extra Tuya snapshots for dc and dj category (lights) (#149940) 2025-08-04 12:07:25 +02:00
Marc Mueller f350a1a1fa Add hassfest check to help with future dependency updates (#149624) 2025-08-04 12:03:39 +02:00
epenet fe2bd8d09e Add Tuya snapshots for ywcgq category (#149948) 2025-08-04 12:02:34 +02:00
Joost Lekkerkerker cf14226b02 Pass config entry to Fronius coordinator (#149954) 2025-08-04 12:02:21 +02:00
Brett Adams bd3fe1d4ad Fix credit sensor when there are no vehicles in Teslemetry (#149925) 2025-08-04 11:26:14 +02:00
Christopher Fenner 377ca04be8 Update sensor icons in Volvo integration (#149811) 2025-08-04 11:24:51 +02:00
epenet 5837f55205 Add extra Tuya snapshots for cz category (#149938) 2025-08-04 11:23:58 +02:00
andreimoraru 0766edb9c4 Bump yt-dlp to 2025.07.21 (#149916)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-08-04 11:15:38 +02:00
epenet e62e3778f3 Add Tuya snapshots for hps category (#149936) 2025-08-04 11:14:11 +02:00
epenet aa8e4c1c15 Add Tuya snapshots for sgbj, sp, wfcon and ywbj category (#149933) 2025-08-04 11:11:06 +02:00
Erik Montnemery 46ed8a73fc Bump automower-ble to 0.2.7 (#149928) 2025-08-04 11:09:18 +02:00
dependabot[bot] 83f22497ae Bump actions/ai-inference from 1.2.3 to 1.2.4 (#149929)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-04 11:09:02 +02:00
epenet 3dda1685dc Add Tuya snapshots for pc and pir category (#149931) 2025-08-04 11:08:43 +02:00
Ståle Storø Hauknes 6fa9d42401 Airthings ContextVar warning (#149930) 2025-08-04 11:05:32 +02:00
jvmahon 1a54d566f8 Apple vendor name update (#149845) 2025-08-04 10:26:11 +02:00
puddly 1a9cae0f89 Bump ZHA to 0.0.65 (#149922) 2025-08-04 10:17:25 +02:00
epenet 551dcaa169 Rename Tuya fixture files (#149927) 2025-08-04 10:08:03 +02:00
epenet 5467db065b Make Tuya complex type handling explicit (#149677) 2025-08-04 07:59:47 +02:00
J. Nick Koston 6a8d752e56 Bump aiodiscover to 2.7.1 (#149920) 2025-08-03 16:42:38 -10:00
J. Nick Koston 179a56628d Bump dbus-fast to 2.44.3 (#149921) 2025-08-03 16:42:11 -10:00
J. Nick Koston b3f830773a Bump yalexs-ble to 3.1.2 (#149917) 2025-08-03 15:02:30 -10:00
Joost Lekkerkerker 084e06ec7d Bump python-open-router to 0.3.1 (#149873) 2025-08-03 21:46:40 +02:00
Maciej Bieniek e0190afd3c Bump imgw_pib to version 1.5.2 (#149892) 2025-08-03 20:07:01 +02:00
Jan-Philipp Benecke b9e16d54c4 Add jitter sensor to Ping integration (#149899) 2025-08-03 20:06:14 +02:00
Thomas55555 627785edc1 Fix options for error sensor in Husqvarna Automower (#149901) 2025-08-03 20:05:23 +02:00
Andrew Jackson 4318e29ce8 Bump aiomealie to 0.10.1 (#149890) 2025-08-03 14:18:13 +02:00
Martin Hjelmare fea5c63bba Fix Z-Wave handling of driver ready event (#149879) 2025-08-03 11:23:01 +02:00
Åke Strandberg b2349ac2bd Improve miele climate test coverage (#149859) 2025-08-03 11:19:08 +02:00
Marc Mueller 08f7b708a4 Update pytest warnings filter (#149839) 2025-08-03 09:25:17 +02:00
Martin Hjelmare 1236801b7d Fix Z-Wave config entry state conditions in listen task (#149841) 2025-08-02 23:07:16 +02:00
Thomas D 72d9dbf39d Add scopes in config flow auth request for Volvo integration (#149813) 2025-08-02 22:17:13 +02:00
Thomas D 755864f9f3 Add sensor platform to Qbus integration (#149389)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-08-02 20:01:58 +02:00
peteS-UK fa476d4e34 Fix initialisation of Apps and Radios list for Squeezebox (#149834) 2025-08-02 20:01:02 +02:00
Manu 018197e41a Add notifiers to send direct messages to friends in PlayStation Network (#149844) 2025-08-02 19:55:45 +02:00
Brett Adams 7dd2b9e422 Make history coordinator more reliable in Tesla Fleet (#149854) 2025-08-02 19:54:19 +02:00
hahn-th 3e615fd373 Improve code quality for garage door modules in homematicip_cloud (#149856) 2025-08-02 19:51:08 +02:00
Oliver c0bf167e10 Update denonavr to 1.1.2 (#149842) 2025-08-02 19:44:01 +02:00
Andrea Turri 45f6778ff4 Fix Miele hob translation keys (#149865) 2025-08-02 18:37:57 +02:00
Jamin bddd4d621a Bump VoIP utils to 0.3.4 (#149786) 2025-08-01 20:37:45 +01:00
Norbert Rittel b0e75e9ee4 Update reference for volatile_organic_compounds_parts in template (#149831) 2025-08-01 20:36:10 +01:00
Norbert Rittel d45c03a795 Update reference for volatile_organic_compounds_parts in random (#149832) 2025-08-01 20:35:04 +01:00
Norbert Rittel 8562c8d32f Add translations for recently introduced device classes to scrape (#149822) 2025-08-01 20:34:31 +01:00
Norbert Rittel ae42d71123 Add translations for recently introduced device classes to sql (#149821) 2025-08-01 20:33:47 +01:00
Alexandre CUER 9616c8cd7b Bump pyemoncms to 0.1.2 (#149825) 2025-08-01 20:04:16 +01:00
kizovinh 9394546668 Add EZVIZ battery camera power status and online status sensor (#146822) 2025-08-01 20:00:53 +01:00
Norbert Rittel d43f21c2e2 Fix descriptions for template number fields (#149804) 2025-08-01 20:35:48 +02:00
Norbert Rittel 8d68fee9f8 Add translation for absolute_humidity device class to template (#149814) 2025-08-01 18:30:59 +01:00
Willem-Jan van Rootselaar b4a4e218ec Add re-authentication to BSBLan (#146280)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-08-01 16:42:59 +02:00
Norbert Rittel fb2d62d692 Add translation for absolute_humidity device class to mqtt (#149818) 2025-08-01 15:57:47 +02:00
Erik Montnemery f538807d6e Make device suggested_area only influence new devices (#149758)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-08-01 14:54:58 +02:00
Joost Lekkerkerker a08c3c9f44 Improve Tado binary sensor tests (#149807) 2025-08-01 14:38:12 +02:00
Joost Lekkerkerker 506431c75f Improve Tado water heater tests (#149806) 2025-08-01 14:38:02 +02:00
Joost Lekkerkerker 37579440e6 Improve Tado climate tests (#149808) 2025-08-01 14:37:12 +02:00
Joost Lekkerkerker 5ce2729dc2 Improve Tado sensor tests (#149809) 2025-08-01 14:36:57 +02:00
Joost Lekkerkerker b5e4ae4a53 Improve Tado switch tests (#149810)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-01 14:36:37 +02:00
Norbert Rittel 3d4386ea6d Add translation for absolute_humidity device class to random (#149815) 2025-08-01 14:32:14 +02:00
Alexandre CUER 9f1cec893e emoncms - fix missing data descriptions (#149733) 2025-08-01 13:22:46 +02:00
starkillerOG bc87140a6f Update after Motion Blinds tilt change (#149779) 2025-08-01 11:15:49 +02:00
Erik Montnemery d77a3fca83 Exclude is_new from DeviceEntry snapshots (#149801) 2025-08-01 11:01:26 +02:00
Joakim Sørensen 924a86dfb6 Add nameservers to supervisor system health response (#149749) 2025-08-01 10:51:48 +02:00
Erik Montnemery 0d7608f7c5 Deprecate DeviceEntry.suggested_area (#149730) 2025-08-01 10:34:34 +02:00
Tom 22e054f4cd Add diagnostics to UISP AirOS (#149631) 2025-08-01 09:24:22 +02:00
epenet 8b53b26333 Fix tuya light supported color modes (#149793)
Co-authored-by: Erik <erik@montnemery.com>
2025-08-01 09:13:53 +02:00
Erik Montnemery 4d59e8cd80 Fix flaky velbus test (#149743) 2025-08-01 07:49:51 +02:00
Fabian Leutgeb 61396d92a5 Homekit valve duration characteristics (#149698)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-31 15:21:48 -10:00
Philippe Lafoucrière c72c600de4 Fix bootstrap script path resolution (#149721) 2025-07-31 23:47:25 +01:00
J. Nick Koston b86b0c10bd Bump aioesphomeapi to 37.2.2 (#149755) 2025-07-31 12:23:24 -10:00
starkillerOG eb222f6c5d Bump motionblinds to 0.6.30 (#149764) 2025-08-01 01:09:20 +03:00
Manu 4b5fe424ed Hide configuration URL when Uptime Kuma is installed locally (#149781) 2025-08-01 01:07:56 +03:00
Nathan Spencer 61ca42e923 Bump pylitterbot to 2024.2.3 (#149763) 2025-07-31 21:04:23 +02:00
Copilot 21c1427abf Fix ZHA ContextVar deprecation by passing config_entry (#149748)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: joostlek <7083755+joostlek@users.noreply.github.com>
Co-authored-by: puddly <32534428+puddly@users.noreply.github.com>
Co-authored-by: TheJulianJES <6409465+TheJulianJES@users.noreply.github.com>
2025-07-31 14:52:17 -04:00
karwosts aa6b37bc7c Fix add_suggested_values_to_schema when the schema has sections (#149718)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-31 20:50:26 +02:00
Marc Mueller bbc1466cfc Update rpds-py to 0.26.0 (#149753) 2025-07-31 17:51:10 +01:00
Bram Kragten 21a9799060 Update frontend to 20250731.0 (#149757) 2025-07-31 18:46:10 +02:00
Erik Montnemery f7d54b46ec Improve test of FlowHandler.add_suggested_values_to_schema (#149759) 2025-07-31 17:55:15 +02:00
Erik Montnemery 6ad1b8dcb1 Fix kitchen_sink option flow (#149760) 2025-07-31 17:49:09 +02:00
Abílio Costa 5f6b1212a3 Remove data flow step_id deprecation note (#149714) 2025-07-31 16:04:09 +02:00
dependabot[bot] 58dc6a952e Bump home-assistant/wheels from 2025.03.0 to 2025.07.0 (#149741) 2025-07-31 15:35:55 +02:00
Petro31 59d8df142d Nitpick default translations for template integration (#149740) 2025-07-31 15:19:43 +02:00
Petro31 04fb86b4ba Fix unique_id in config validation for legacy weather platform (#149742) 2025-07-31 15:19:37 +02:00
Erik Montnemery 3d744f032f Make _EventDeviceRegistryUpdatedData_Remove JSON serializable (#149734) 2025-07-31 12:35:13 +02:00
J. Nick Koston f7c8cdb3a7 Bump aioesphomeapi to 37.2.0 (#149732) 2025-07-31 12:10:23 +02:00
Copilot 3952544822 Fix ContextVar deprecation warning in homeassistant_hardware integration (#149687)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: joostlek <7083755+joostlek@users.noreply.github.com>
Co-authored-by: mib1185 <35783820+mib1185@users.noreply.github.com>
2025-07-31 12:06:04 +02:00
Erik Montnemery 42101dd432 Remove result from FlowResult (#149202) 2025-07-31 10:58:36 +02:00
L. f7eacaa48d Bump xiaomi-ble to 1.2.0 (#149711) 2025-07-31 09:01:06 +02:00
johanzander ad0db5c83a Update growattServer to version 1.7.1 (#149716) 2025-07-31 08:17:33 +02:00
J. Nick Koston 63216b77c2 Bump aioesphomeapi to 37.1.6 (#149715) 2025-07-30 13:54:18 -10:00
Åke Strandberg 7a55373b0b Fix bug when interpreting miele action response (#149710) 2025-07-31 01:07:12 +02:00
J. Nick Koston f9e7459901 Fix ESPHome unnecessary probing on DHCP discovery (#149713) 2025-07-31 01:06:08 +02:00
starkillerOG 94dc2e2ea3 Bump reolink-aio to 0.14.5 (#149700) 2025-07-30 22:54:32 +01:00
Åke Strandberg 2cf144fb25 Add missing translations for miele dishwasher (#149702) 2025-07-30 22:45:05 +01:00
Jan Bouwhuis f318766021 Fix inconsistent use of the term 'target' and a typo in MQTT translation strings (#149703) 2025-07-30 22:42:53 +01:00
Andrea Turri ec7fb140ac Fix Miele induction hob empty state (#149706) 2025-07-30 22:38:11 +01:00
Petro31 2706c7d67d Add translations for all fields in template integration (#149692)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-30 22:30:05 +01:00
Roman Sivriver b4e50902eb Fix typo in backup log message (#149705) 2025-07-30 22:29:26 +01:00
Åke Strandberg 1ead01bc9a Explicitly pass config_entry to miele coordinator (#149691) 2025-07-30 20:19:01 +02:00
puddly 389a1251a1 Bump ZHA to 0.0.64 (#149683)
Co-authored-by: TheJulianJES <TheJulianJES@users.noreply.github.com>
Co-authored-by: abmantis <amfcalt@gmail.com>
2025-07-30 18:59:41 +01:00
Manu 8d27ca1e21 Fix KeyError in friends coordinator (#149684) 2025-07-30 19:59:01 +02:00
Michael Hansen a76af50c10 Bump intents to 2025.7.30 (#149678) 2025-07-30 19:57:59 +02:00
Renat Sibgatulin 09b91bd76a Clean airq tests (#149682) 2025-07-30 18:48:36 +01:00
Jan Bouwhuis 736d582d04 Fix translation string reference for MQTT climate subentry option (#149673) 2025-07-30 18:53:21 +02:00
Bram Kragten 8114df4219 Bump version to 2025.9.0 (#149680) 2025-07-30 18:36:20 +02:00
Joost Lekkerkerker 8193259e02 Revert "Add select for heating circuit to Tado zones" (#149670) 2025-07-30 17:06:55 +02:00
Petro31 6306baa3c9 Add config flow to template lock platform (#149449) 2025-07-30 17:04:39 +02:00
Petro31 d481a694f1 Add config flow to template vacuum platform (#149458) 2025-07-30 17:04:08 +02:00
Robert Resch edca3fc0b7 Add matter to Third Reality (#149659) 2025-07-30 16:52:20 +02:00
Bram Kragten daea76c2f1 Update frontend to 20250730.0 (#149672) 2025-07-30 16:51:10 +02:00
Petro31 160b61e0b9 Add config flow to template fan platform (#149446)
Co-authored-by: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com>
2025-07-30 16:17:49 +02:00
epenet fc900a632a Revert logging for unsupported Tuya devices (#149665) 2025-07-30 16:04:45 +02:00
Joost Lekkerkerker 1b58809655 Add AI Task to OpenRouter (#149275) 2025-07-30 16:01:44 +02:00
Åke Strandberg 223c34056d Add missing colons in miele messages (#149668) 2025-07-30 15:58:43 +02:00
Jeef 99ee56a4dd Add Precipitation sensors to Weatherflow Cloud (#149619)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-30 15:45:03 +02:00
lucasfijen 91be25a292 Add get recipes search service to Mealie integration (#149348)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-30 15:43:10 +02:00
Petro31 a21af78aa1 Add config flow to template light platform (#149448) 2025-07-30 15:27:43 +02:00
Manu 70cfdfa231 Remove unnecessary CONFIG_SCHEMA from Uptime Kuma integration (#149601) 2025-07-30 15:23:54 +02:00
Jan Bouwhuis a5b075af68 Add climate support for MQTT subentries (#149451)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-30 15:20:23 +02:00
Manu c4d4ef884e Add hassio discovery flow to Uptime Kuma (#148770) 2025-07-30 15:13:39 +02:00
Manu ba4e7e50e0 Add friend tracking to PlayStation Network (#149546) 2025-07-30 15:10:30 +02:00
Alistair Francis dd0b23afb0 husqvarna_automower_ble: Support battery percentage sensor (#146159)
Signed-off-by: Alistair Francis <alistair@alistair23.me>
2025-07-30 15:07:47 +02:00
Manu 779f0afcc4 Refactor Habitica button and switch functions to use habiticalib instance directly (#149602) 2025-07-30 15:07:22 +02:00
Manu d8016f7f41 Remove stale devices in Uptime Kuma (#149605) 2025-07-30 15:06:59 +02:00
Avery 25169e9075 Bump datadogpy to 0.52.0 (#149596) 2025-07-30 15:06:38 +02:00
Samuel Xiao 260ca70785 Add Light platform to Switchbot cloud (#146382) 2025-07-30 15:03:13 +02:00
Samuel Xiao 69e3a5bc34 Add support for more switchbot cloud vacuum models (#146637) 2025-07-30 15:02:37 +02:00
Simone Chemelli 1a75a88c76 Add actions to Alexa Devices (#145645) 2025-07-30 14:52:31 +02:00
Petro31 6c2a662838 Add config flow to template cover platform (#149433) 2025-07-30 14:48:24 +02:00
Artur Pragacz 749fc318ca Validate selectors in the trigger helper (#149662) 2025-07-30 14:22:55 +02:00
epenet 828f979c78 Use Tuya device listener in binary sensor tests (#148890) 2025-07-30 13:43:07 +02:00
Åke Strandberg 1eb6d5fe32 Add action for set_program_oven to miele (#149620) 2025-07-30 13:35:24 +02:00
epenet 5930ac6425 Use translation_placeholders in tuya switch descriptions (#149664) 2025-07-30 13:27:24 +02:00
Simone Chemelli 15e45df8a7 Use async_create_clientsession in Alexa Devices (#149432) 2025-07-30 12:49:21 +02:00
karwosts a79d2da9a3 Move group toggle descriptions to data_description (#149625)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-30 12:31:32 +02:00
Robert Resch ac86f2e2ba Add Frient brand (#149654) 2025-07-30 12:21:27 +02:00
Norbert Rittel 03ee97d38f Clarify description of turn_away_mode_on.osoenergy action (#149655) 2025-07-30 12:16:40 +02:00
J. Nick Koston 06233b5134 Bump aioesphomeapi to 37.1.5 (#149656) 2025-07-30 12:16:16 +02:00
Petro31 9d66b19c03 Add assumed optimistic to template number entities (#148499) 2025-07-30 11:20:04 +02:00
Martin Hjelmare bb6bcfdd01 Add Z-Wave controller firmware updates (#149623) 2025-07-30 11:07:41 +02:00
Marc Mueller 8e9e304608 Update lxml to 6.0.0 (#149640) 2025-07-30 10:38:42 +02:00
dependabot[bot] 6b641411a0 Bump github/codeql-action from 3.29.4 to 3.29.5 (#149648)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-30 10:33:09 +02:00
Norbert Rittel 6f8214bbb4 Fix spelling mistakes in abort message of leaone (#149653) 2025-07-29 22:22:35 -10:00
Marcel van der Veldt f66e83f33e Add dynamic encryption key support to the ESPHome integration (#148746)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-29 21:54:00 -10:00
Robert Resch 2ee82e1d6f Remove battery attribute from Ecovacs vacuums (#149581) 2025-07-30 09:24:16 +02:00
Jan Bouwhuis 0dd1e0cabb Suppress exception stack trace when writing MQTT entity state if a ValueError occured (#149583) 2025-07-30 09:06:15 +02:00
Åke Strandberg 45ae34cc0e Strip leading and trailing whitespace in program names in miele action response (#149643) 2025-07-30 00:23:03 +02:00
hypnosiss 73e578b168 Bump pymysensors library version (#149632) 2025-07-29 22:29:53 +01:00
Arie Catsman 52ee5d53ee bump pyenphase to 2.2.3 (#149641) 2025-07-29 22:27:43 +01:00
Marc Mueller 62713b1371 Update pyblu to 2.0.4 (#149589) 2025-07-29 22:32:32 +02:00
Simone Chemelli c4c4463c63 Update IQS for Alexa Devices (#149639) 2025-07-29 22:00:49 +02:00
Franck Nijhof 7e2fd6e47b Merge branch 'master' into dev 2025-07-29 18:52:18 +00:00
karwosts 9f45801409 Remove advanced mode from group all option. (#149626) 2025-07-29 20:03:27 +02:00
J. Nick Koston aaec243bf4 Properly cleanup ONVIF events to prevent log flooding on setup errors (#149603) 2025-07-29 19:49:20 +02:00
Tom b67e85e8da Introduce Ubiquiti UISP airOS (#148989)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-29 19:41:13 +02:00
J. Nick Koston 25407c0f4b Bump aiohttp to 3.12.15 (#149609) 2025-07-29 19:21:31 +02:00
Stefan Agner 09e7d8d1a5 Increase open file descriptor limit on startup (#148940)
Co-authored-by: Jan Čermák <sairon@sairon.cz>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-29 17:42:26 +02:00
Markus Adrario ff7c125334 Upgrade Homee quality scale to silver (#149194) 2025-07-29 15:19:08 +02:00
Martin Hjelmare 3d6f868cbc Bump zwave-js-server-python to 0.67.0 (#149616) 2025-07-29 13:57:40 +02:00
Thomas D 378c3af9df Bump qbusmqttapi to 1.4.2 (#149622) 2025-07-29 13:51:32 +02:00
osohotwateriot c7271d1af9 Add OSO Energy Custom Away Mode Service (#149612) 2025-07-29 13:50:31 +02:00
Klaas Schoute 87400c6a17 Bump odp-amsterdam to v6.1.2 (#149617) 2025-07-29 12:59:30 +02:00
Christopher Fenner 692a1119a6 Adjust suggested display precision on Volvo distance sensors (#149593) 2025-07-29 12:29:07 +02:00
Thomas55555 2e728eb7de Bump aioautomower to 2.1.1 (#149585) 2025-07-29 09:38:50 +02:00
Manu 45ec9c7dad Refactor coordinator setup in Iron OS (#149600) 2025-07-29 09:37:32 +02:00
Manu 62ee1fbc64 Remove unnecessary CONF_NAME usage in Habitica integration (#149595) 2025-07-29 08:55:32 +02:00
Jan-Philipp Benecke 3c1aa9d9de Make exceptions translatable in Tankerkoenig integration (#149611) 2025-07-29 08:52:42 +02:00
J. Nick Koston bf568b22d7 Bump onvif-zeep-async to 4.0.2 (#149606) 2025-07-29 08:41:45 +02:00
Michael 596f6cd216 Add people and tags collections to Immich media source (#149340) 2025-07-28 23:21:04 +02:00
Åke Strandberg cf05f1046d Add action to retrieve list of programs on miele appliance (#149307) 2025-07-28 22:19:51 +02:00
Thomas55555 7f9be420d2 Add details to Husqvarna Automower restricted reason sensor (#147678)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-28 19:54:54 +01:00
Abílio Costa dda46e7e0b Use non-autospec mock in Reolink's remaining tests (#149565)
Co-authored-by: starkillerOG <starkiller.og@gmail.com>
2025-07-28 18:38:06 +01:00
Michael b1dd742a57 Move battery properties from legacy Ecovacs vacuum entity to separate entities (#149084) 2025-07-28 18:49:12 +02:00
Simone Chemelli 5af4290b77 Update IQS for Alexa Devices (#149440) 2025-07-28 18:33:39 +02:00
Petro31 8339516fb4 Add optimistic option to alarm control panel yaml (#149334) 2025-07-28 17:44:43 +02:00
Matrix aa1314c1d5 Add YoLink YS6614 support. (#149153) 2025-07-28 17:43:20 +02:00
epenet 92ad922ddc Add fan mode support for Tuya air conditioner (aqoouq7x) (#149226) 2025-07-28 17:42:36 +02:00
epenet e518e7beac Add service tests to Tuya select platform (#149156)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-28 17:42:18 +02:00
Thomas D 483d814a8f Add new Volvo integration (#142994)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-28 17:24:15 +02:00
Tom 8f795f021c Bump Plugwise to v1.7.8 preventing rogue KeyError (#149000) 2025-07-28 17:19:43 +02:00
Petro31 d823b574c0 Add optimistic option to light yaml (#149395) 2025-07-28 16:59:57 +02:00
Petro31 49bd15718c Add optimistic option to fan yaml (#149390) 2025-07-28 16:58:46 +02:00
Abílio Costa d3f18c1678 Add quality scale to ring manifest (#149406) 2025-07-28 16:35:38 +02:00
Joost Lekkerkerker 5ef17c8588 Bump the required version of ruff to 0.12.1 (#149571) 2025-07-28 16:32:56 +02:00
Norbert Rittel e8b8d31027 Make actions labels consistent for Template alarm control panel (#149574) 2025-07-28 16:31:13 +02:00
Manu 978ee3870c Add notify platform to PlayStation Network integration (#149557) 2025-07-28 16:18:57 +02:00
Petro31 b3862591ea Add optimism to vacuum platform (#149425) 2025-07-28 16:18:37 +02:00
Petro31 1895db0ddd Add optimistic option to switch yaml (#149402) 2025-07-28 16:17:39 +02:00
Petro31 ee2cf961f6 Add assumed optimistic functionality to lock platform (#149397) 2025-07-28 16:17:09 +02:00
Martin Hjelmare 9a364ec729 Fix Z-Wave removal of devices when connected to unknown controller (#149339) 2025-07-28 16:13:39 +02:00
starkillerOG 96529ec245 Add Reolink pre-recording entities (#149522)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-28 16:12:53 +02:00
David Knowles 8fc8220924 Teach Hydrawise to auto-add/remove devices (#149547)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-28 16:06:15 +02:00
osohotwateriot 386f709fd3 Osoenergy holiday mode services (#149430)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-28 16:00:22 +02:00
alvi kazi 🇧🇩 d088fccb88 VeSync: add support for LAP-V102S-WJP air purifier (#149102) 2025-07-28 15:51:07 +02:00
jennoian 2a5448835f Add Vacuum support to smartthings (#148724)
Co-authored-by: Joostlek <joostlek@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-28 15:37:37 +02:00
Avery a71eecaaa4 Update datadog test logic (#149459)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-28 15:10:55 +02:00
hanwg 46d810b9f9 Better error handling when setting up config entry for Telegram bot (#149444) 2025-07-28 14:52:40 +02:00
Petro31 48c4240a5d Delete unused switch platform code (#149468) 2025-07-28 14:48:45 +02:00
wittypluck bf05c23414 Update OpenWeatherMap config step description to clarify API key documentation (#146843) 2025-07-28 14:40:00 +02:00
Michael db1e6a0d98 Add quality scale and set Silver for Tankerkoenig (#143418) 2025-07-28 14:34:27 +02:00
Assaf Inbal 4ad35e8421 Add charging binary sensor to ituran (#149562)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-28 13:18:43 +02:00
wollew 850e04d9aa Add binary sensor for rain detection for Velux windows that have them (#148275)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-28 13:15:59 +02:00
Manu 95c5a91f01 Refactor active session handling in PlaystationNetwork (#149559) 2025-07-28 13:13:08 +02:00
Petro31 140f56aeaa Add common translation strings (#149472)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-28 13:12:52 +02:00
Michael 40ce228c9c Add upload_file action to immich integration (#147295)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-28 13:12:16 +02:00
Abílio Costa 18c5437fe7 Revert "Make default title configurable in XMPP" (#149544) 2025-07-28 13:42:40 +03:00
Norbert Rittel ebad1ff4cc Fix capitalization of "IP address" in goalzero (#149563) 2025-07-28 11:59:11 +02:00
Ludovic BOUÉ a68e722c92 Matter MicrowaveOven device (#148219)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-28 11:33:03 +02:00
Joakim Sørensen 05935bbc01 Bump hass-nabucasa from 0.108.0 to 0.110.0 (#149560) 2025-07-28 11:17:26 +02:00
Assaf Inbal c67636b4f6 Add support for EVs in ituran (#149484) 2025-07-28 10:35:52 +02:00
Franck Nijhof 777b3128bb 2025.7.4 (#149526) 2025-07-28 10:15:08 +02:00
Shai Ungar ab6cd0eb41 Bump israel-rail to 0.1.3 (#149555) 2025-07-28 08:42:40 +02:00
Brett Adams f35558413a Bump tesla-fleet-api to 1.2.3 (#149550) 2025-07-28 07:58:59 +02:00
Michael e30d405625 Enable strict typing in Tankerkoenig (#149535) 2025-07-27 22:48:15 +02:00
Thomas55555 622cce03a1 Bump aioautomower to 2.1.0 (#149541) 2025-07-27 22:46:59 +02:00
Raphael Hehl 1fa9141ce1 Bump uiprotect to version 7.20.0 (#149533) 2025-07-27 21:52:53 +02:00
Norbert Rittel a060f7486f Replace duplicated strings and fix "street name" in waze_travel_time (#149512) 2025-07-27 21:36:25 +03:00
Manu dbb5730389 Increase trophy titles retrieval page size to 500 for PlayStation Network (#149528) 2025-07-27 21:35:01 +03:00
Michael 431b2aa1d5 Add data description strings to Tankerkoenig (#149519)
Co-authored-by: Josef Zweck <josef@zweck.dev>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-27 20:13:05 +02:00
Michael c99d81a554 Set PARALLEL_UPDATES in Tankerkoenig platforms (#149518) 2025-07-27 20:02:24 +02:00
starkillerOG ff4dc393cf Bump reolink-aio to 0.14.4 (#149521) 2025-07-27 20:00:50 +02:00
Franck Nijhof d384bee576 Bump version to 2025.7.4 2025-07-27 17:35:19 +00:00
Manu f0cb5d5480 Bump habiticalib to v0.4.1 (#149523) 2025-07-27 17:35:01 +00:00
jb101010-2 725799c73e Bump pysuezV2 to 2.0.7 (#149436) 2025-07-27 17:34:59 +00:00
Simone Chemelli dc6d2e3e84 Bump aioamazondevices to 3.5.1 (#149385) 2025-07-27 17:34:09 +00:00
Alex Hermann 4a7d06a68a Update slixmpp to 1.10.0 (#149374) 2025-07-27 17:29:37 +00:00
Brett Adams cd800da357 Update Tesla OAuth Server in Tesla Fleet (#149280) 2025-07-27 17:29:35 +00:00
Antoine Reversat 4c8ab8eb64 Add fan off mode to the supported fan modes to fujitsu_fglair (#149277) 2025-07-27 17:29:33 +00:00
Martin Hjelmare 60f4d29d60 Add Z-Wave USB migration confirm step (#149243) 2025-07-27 17:29:31 +00:00
Avi Miller 68b7d09476 Fix brightness_step and brightness_step_pct via lifx.set_state (#149217)
Signed-off-by: Avi Miller <me@dje.li>
2025-07-27 17:29:29 +00:00
jvmahon c3eb6dea11 Fix Matter light get brightness (#149186) 2025-07-27 17:29:28 +00:00
David Knowles f428ffde87 Bump pyschlage to 2025.7.2 (#149148) 2025-07-27 17:29:26 +00:00
hanwg fa207860a0 Fix multiple webhook secrets for Telegram bot (#149103) 2025-07-27 17:29:24 +00:00
Allen Porter 959c3a8a99 Fix a bug in rainbird device migration that results in additional devices (#149078) 2025-07-27 17:29:23 +00:00
Marc Hörsken 254ccca4e5 Fix warning about failure to get action during setup phase (#148923) 2025-07-27 17:29:21 +00:00
AlCalzone 5b08724d81 Keep entities of dead Z-Wave devices available (#148611) 2025-07-27 17:29:20 +00:00
Marc Mueller ea2b3b3ff3 Update ical + gcal-sync (#149413) 2025-07-27 19:22:01 +02:00
Alex Hermann a33760bc1a Update slixmpp to 1.10.0 (#149374) 2025-07-27 19:18:00 +02:00
Manu 4ea7ad52b1 Bump habiticalib to v0.4.1 (#149523) 2025-07-27 19:09:13 +02:00
Manu dac75d1902 Add update platform to Uptime Kuma (#148973) 2025-07-27 18:02:33 +02:00
petep0p 0e9ced3c00 Correct core Purpleair integration's RSSI sensor to use RSSI value rather than barometric pressure (#149418) 2025-07-27 07:13:31 -06:00
Norbert Rittel 22d0fbcbd2 Fix spelling of "its" in mqtt (#149517) 2025-07-27 14:39:21 +02:00
Abílio Costa 57b641b97d Use non-autospec mock in Reolink's media source, number, sensor and siren tests (#149396) 2025-07-27 12:43:48 +02:00
J. Nick Koston 27bd6d2e38 Bump aioesphomeapi to 37.1.2 (#149460) 2025-07-26 22:48:48 -10:00
Assaf Inbal 427e5d81df Bump pyituran to 0.1.5 (#149486) 2025-07-26 19:03:51 +03:00
Shay Levy b6bd92ed19 Shelly entity device info code quality (#149477) 2025-07-26 17:08:08 +03:00
Florian von Garrel 7976729e76 Paperless-ngx: Retry setup on initialization error (#149476) 2025-07-26 14:19:33 +02:00
Shay Levy 5aa0d0dc81 Remove Shelly redundant device info assignment in Button class (#149469) 2025-07-26 14:32:51 +03:00
jb101010-2 e1501d7510 Bump pysuezV2 to 2.0.7 (#149436) 2025-07-26 13:38:38 +03:00
Norbert Rittel be5109fddf Change spelling of "Favorite x" to intl. English in bang_olufsen (#149464) 2025-07-26 13:35:11 +03:00
Norbert Rittel c5cf9b07b7 Replace HA alarm (control panel) states with references in risco (#149466) 2025-07-26 13:34:24 +03:00
Norbert Rittel 002b7c6789 Fix descriptions in home_connect.set_program_and_options action (#149462) 2025-07-26 09:47:26 +02:00
Paul Bottein e017dc80a0 Allow to reorder members within a group (#149003) 2025-07-26 01:07:51 +02:00
Erik Montnemery aab7381553 Add test of ConfigSubentryFlow._subentry_type (#147565) 2025-07-26 00:27:04 +02:00
Norbert Rittel cbf4409db3 Fix inconsistent spelling of "Wi-Fi" in unifiprotect (#149311)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-25 09:51:01 -10:00
Raphael Hehl 56fb59e48e Unifiprotect refactor device description ID retrieval in tests (#149445) 2025-07-25 09:21:57 -10:00
rappenze 971bd56bee Add Z-Box Hub virtual integration (#146678) 2025-07-25 20:37:36 +02:00
Matt Zimmerman b2710c1bce Add smarttub cover sensor (#139134)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-25 20:10:39 +02:00
Petro31 a069b59efc Transition template types from string to platform keys (#149434) 2025-07-25 19:55:40 +02:00
osohotwateriot 02eb1dd533 Bump pyosoenergyapi to 1.2.4 (#149439) 2025-07-25 19:30:58 +02:00
Thomas55555 b3130c7929 Bump aioautomower to 2.0.2 (#149441) 2025-07-25 19:29:40 +02:00
Norbert Rittel aad1dbecb4 Fix spelling of "IP" and improve action descriptions in lcn (#149314) 2025-07-25 19:28:43 +02:00
jvmahon 65109ea000 Fix Matter light get brightness (#149186) 2025-07-25 19:09:58 +02:00
Marc Mueller 356ac74fa5 Update orjson to 3.11.1 (#149442) 2025-07-25 19:07:07 +02:00
Norbert Rittel f3513f7f29 Add missing hyphen to "case-sensitive" in tplink (#149363) 2025-07-25 19:01:57 +02:00
Marc Mueller 4bbb94f43d Update coverage to 7.10.0 (#149412) 2025-07-25 15:05:20 +02:00
Jan Bouwhuis c1fa721a57 Revert "Use OptionsFlowWithReload in mqtt" (#149431) 2025-07-25 15:03:44 +02:00
Norbert Rittel e3ffb41650 Improve some option and state names in home_connect (#149373) 2025-07-25 13:52:01 +02:00
Shay Levy 123cce6d96 Add configuration URL and model details to Shelly sub device info (#149404) 2025-07-25 14:26:32 +03:00
Guido Schmitz 6920dec352 Rework devolo Home Control config flow (#147121) 2025-07-25 12:55:42 +02:00
Guido Schmitz f7cc260336 Add quality scale for devolo Home Network (#131510)
Co-authored-by: Josef Zweck <24647999+zweckj@users.noreply.github.com>
2025-07-25 12:20:33 +02:00
osohotwateriot b7da31a021 Bump pyosoenergyapi to 1.2.3 (#149422) 2025-07-25 12:15:42 +02:00
Kevin Stillhammer 95d4dc678c Add option traffic_mode in here_travel_time (#146676) 2025-07-25 12:14:36 +02:00
Álvaro Fernández Rojas 7e9da052ca Update aioairzone-cloud to v0.7.1 (#149388)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-07-25 08:17:26 +02:00
Marc Mueller 59ece455d9 Update numpy to 2.3.2 (#149411) 2025-07-25 02:24:25 +02:00
Jake Martin 3ba144c8b2 Bump monzopy to 1.5.1 (#149410) 2025-07-25 02:38:48 +03:00
Petro31 4cc4bd3b9a Remove redundant async_set_context from platforms (#149403) 2025-07-24 22:28:56 +01:00
Raphael Hehl dbc2b1354b UnifiProtect refactor sensor retrieval in tests to use get_sensor_by_key function (#149398) 2025-07-24 10:11:47 -10:00
Steven B. fbe257f997 Add quality scale file to ring integration (#136454)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-24 20:19:30 +01:00
Alex Hermann 208dde10e6 Make default title configurable in XMPP (#149379) 2025-07-24 20:08:47 +01:00
Norbert Rittel b7b733efc3 Use common state for "Normal" in switchbot (#149399) 2025-07-24 20:03:45 +01:00
Norbert Rittel 1d9f779b2a Add missing hyphen to "case-sensitive" in tuya (#149400) 2025-07-24 20:03:36 +01:00
Maciej Bieniek 56c53fdb9b Allow Bluetooth proxy for Shelly devices only if Zigbee firmware is not active (#149193)
Co-authored-by: Shay Levy <levyshay1@gmail.com>
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-24 21:14:44 +03:00
LG-ThinQ-Integration 5c4862ffe1 Fix Air Conditioner set temperature error in LG ThinQ (#147008)
Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-07-24 20:12:41 +02:00
Abílio Costa 5c7913c3bd Remove door state from Whirlpool machine state sensor (#144078) 2025-07-24 20:07:57 +02:00
Norbert Rittel 36a98470cc Remove excessive comma from dsmr_reader issue description (#149393) 2025-07-24 19:20:42 +02:00
Norbert Rittel f2c995cf86 Fix sentence-casing of "DSMR options" string (#149392) 2025-07-24 19:20:28 +02:00
Matěj 'Horm' Horák eeca5a8030 Improve Airthings test coverage (#144750)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-24 19:10:01 +02:00
Norbert Rittel 56d97f5545 Drop duplicated lower-case "qnap" from setup description (#149384) 2025-07-24 18:49:46 +02:00
Simone Chemelli 995a99e256 Bump aioamazondevices to 3.5.1 (#149385) 2025-07-24 16:54:00 +01:00
Abílio Costa ef7cd815b2 Add list of targeted entities to target state event (#149203) 2025-07-24 16:52:12 +01:00
Paulus Schoutsen 8b8616182d Allow downloading a device analytics dump (#149376) 2025-07-24 17:27:02 +02:00
Frank Wickström 760b69d458 Only send integers when setting Huum sauna temperature (#149380) 2025-07-24 17:13:54 +02:00
Norbert Rittel 6adcd34521 Remove space character from "autodetect" in xiaomi_miio (#149381) 2025-07-24 17:10:46 +02:00
Thomas55555 a0992498c6 Improve removal of stale entities/devices in Husqvarna Automower (#148428)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-24 15:52:43 +01:00
Marc Mueller d6175fb383 Update mypy-dev to 1.18.0a3 (#149383) 2025-07-24 16:05:24 +02:00
G Johansson dd3c9ab3af Use OptionsFlowWithReload in mqtt (#149092) 2025-07-24 15:34:00 +02:00
Maciej Bieniek fea2ef1ac1 Bump imgw_pib to version 1.5.1 (#149368) 2025-07-24 15:37:01 +03:00
Álvaro Fernández Rojas 326bcc3f05 Update aioairzone-cloud to v0.7.0 (#149369)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-07-24 15:32:51 +03:00
Andrew Jackson feeef88710 Bump aiomealie to 0.10.0 (#149370) 2025-07-24 13:07:35 +02:00
LG-ThinQ-Integration f481c1b92f Add sensors for ventilator in LG ThinQ (#140846)
Co-authored-by: yunseon.park <yunseon.park@lge.com>
2025-07-24 12:33:34 +02:00
Avery eea22d8079 Add config flow for datadog (#148104)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-07-24 12:29:07 +02:00
Maciej Bieniek 393087cf50 Bump aioshelly to 13.8.0 (#149365) 2025-07-24 11:50:26 +02:00
Norbert Rittel f5718e1df6 Fix spelling of "autoplay" in music_assistant (#149364) 2025-07-24 11:15:57 +02:00
Artur Pragacz 15f2ae3002 Mark Onkyo quality scale as bronze (#149362) 2025-07-24 11:03:02 +02:00
Norbert Rittel f458ede468 Small fixes to user-facing strings of webostv (#149359) 2025-07-24 11:53:33 +03:00
dependabot[bot] d85ffee27a Bump github/codeql-action from 3.29.3 to 3.29.4 (#149354)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-24 10:29:34 +02:00
Norbert Rittel 2e12d67f2f Improve id_missing abort message in samsungtv (#149357) 2025-07-24 10:23:30 +02:00
Norbert Rittel 46a01c2060 Fix config entry name and description in rainbird.set_rain_delay action (#149358) 2025-07-24 10:23:17 +02:00
tronikos 53d77c4c10 Fix Chinese in Google Cloud STT (#149155) 2025-07-24 01:08:58 -07:00
Norbert Rittel fcd514a06b Sentence-case "Still image URL" in mjpeg (#149356) 2025-07-24 09:23:21 +02:00
Norbert Rittel 049a698815 Add missing hyphen to "right-hand drive" in teslemetry (#149355) 2025-07-24 08:56:49 +02:00
Norbert Rittel 55f01e3485 Make descriptions of modbus.stop/restart actions consistent (#149341) 2025-07-24 08:23:42 +02:00
Artur Pragacz c2b1932045 Bump aioonkyo to 0.3.0 (#149336) 2025-07-24 08:23:02 +02:00
Norbert Rittel 5543587527 Fix spelling of "sea level" in luftdaten (#149347) 2025-07-24 08:22:25 +02:00
J. Nick Koston 202d8ac802 Bump yalexs-ble to 3.1.0 (#149352) 2025-07-24 08:18:59 +02:00
Norbert Rittel 7613880645 Fix spelling of "the setup" in nest (#149345) 2025-07-24 02:50:39 +02:00
Norbert Rittel 3f77c13aad Fix spelling of "re-authenticate" in devolo_home_control (#149342) 2025-07-24 02:46:20 +02:00
Raphael Hehl b966b59c09 Unifiprotect public api snapshot (#149213) 2025-07-23 13:37:34 -10:00
Michael 40cf47ae5a Bump aioimmich to 0.11.1 (#149335)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-23 20:48:04 +02:00
Norbert Rittel da8ce52ed7 Fix grammar issues in re-interview description of zwave_js (#149337) 2025-07-23 19:00:55 +01:00
Norbert Rittel b5190788ac Fix missing sentence-casing of "MAC address" in anthemav (#149333) 2025-07-23 19:29:31 +02:00
Norbert Rittel bfa7ff3ede Make spelling of "Telldus Live" consistent (#149332) 2025-07-23 19:07:40 +02:00
Norbert Rittel 1312e04c57 Fix typos in update_failed message of fritz (#149330) 2025-07-23 18:53:19 +02:00
Matthias Alphart d3771571cd Bump knx-frontend (#149287) 2025-07-23 17:18:41 +01:00
Norbert Rittel 5aa629edd0 Fix typo in "re-authentication" in devolo_home_network (#149312) 2025-07-23 17:16:00 +01:00
Norbert Rittel 3ed297676f Remove third "s" from "Home Assistant" in lametric (#149329) 2025-07-23 18:08:01 +02:00
Norbert Rittel d735af505e Sentence-case "app" in laundrify (#149328) 2025-07-23 18:04:47 +02:00
Norbert Rittel e337abb12d Clarify setup description in google_travel_time (#149327) 2025-07-23 17:57:45 +02:00
Maciej Bieniek 45edd12f13 Bump imgw_pib to version 1.5.0 (#149324) 2025-07-23 16:51:24 +01:00
Ludovic BOUÉ 5b94f5a99a Add more types in TYPE_MAP for Matter Cover (#149188) 2025-07-23 17:33:24 +02:00
Norbert Rittel 8b7295cd26 Fix three spelling issues in lg_thinq (#149322) 2025-07-23 17:16:28 +02:00
Marc Hörsken 15f7dade5e Fix warning about failure to get action during setup phase (#148923) 2025-07-23 17:05:35 +02:00
Norbert Rittel 61807412c4 Fix typo "optimisic" in mqtt (#149291) 2025-07-23 16:03:12 +01:00
Norbert Rittel f679f33c56 Fix description of current field of keba.set_current action (#149326) 2025-07-23 17:02:59 +02:00
Sid 2abd203580 Bump eheimdigital quality scale to platinum (#148263) 2025-07-23 16:58:18 +02:00
Avi Miller ccd22ce0d5 Fix brightness_step and brightness_step_pct via lifx.set_state (#149217)
Signed-off-by: Avi Miller <me@dje.li>
2025-07-23 16:55:44 +02:00
AlCalzone 391b144033 Update Z-Wave LED entity name for ZWA-2 (#149323) 2025-07-23 16:55:00 +02:00
tronikos b6db10340e Update supported languages for Google Generative AI TTS and STT (#149154) 2025-07-23 16:54:06 +02:00
epenet 23b2936174 Replace RuntimeError with custom ServiceValidationError in Tuya (#149175) 2025-07-23 16:53:36 +02:00
Petro31 fad5f7a47b Move optimistic platform logic to AbstractTemplateEntity base class (#149245) 2025-07-23 14:52:25 +01:00
Marius 58ddf4ea95 Add note about re-interviewing Z-Wave battery powered devices (#149300) 2025-07-23 15:40:09 +02:00
AlCalzone 22fa863984 Discover ZWA-2 LED as a configuration entity in Z-Wave (#149298) 2025-07-23 15:33:52 +02:00
Imeon-Energy d9b25770ad Remove sensors from Imeon Inverter (#148542)
Co-authored-by: TheBushBoy <theodavid@icloud.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-23 15:32:32 +02:00
Nick Kuiper 1c8ae8a21b Add switches for blue current integration. (#146210) 2025-07-23 15:12:53 +02:00
Norbert Rittel 6d3872252b Fix one inconsistent spelling of "AppArmor" in hassio (#149310) 2025-07-23 15:09:17 +02:00
epenet 4730c5b831 Add logging to Tuya for devices that cannot be supported (#149192)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-23 15:07:37 +02:00
Artur Pragacz 9a9f65dc36 Improve config flow tests in Onkyo (#149199) 2025-07-23 15:06:25 +02:00
G Johansson 7c83fd0bf9 Add twice_daily forecast to SMHI (#148882) 2025-07-23 15:05:39 +02:00
johanzander 70e03cdd4e Implements coordinator pattern for Growatt component data fetching (#143373) 2025-07-23 15:05:19 +02:00
J. Nick Koston 4d5c1b139b Consolidate REST sensor encoding tests using pytest parametrize (#149279)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-23 14:57:07 +02:00
Antoine Reversat 6dc5c9beb7 Add fan off mode to the supported fan modes to fujitsu_fglair (#149277) 2025-07-23 14:52:14 +02:00
Brett Adams 47611619db Update Tesla OAuth Server in Tesla Fleet (#149280) 2025-07-23 14:45:50 +02:00
Norbert Rittel 2a0a31bff8 Capitalize "HEPA" as an abbreviation in matter (#149306) 2025-07-23 14:27:49 +02:00
Joost Lekkerkerker dcf29d12a7 Migrate Ollama to has entity name (#149303) 2025-07-23 14:27:32 +02:00
Norbert Rittel edf6166a9f Fix spelling of "Domino's Pizza" in dominos (#149308) 2025-07-23 13:58:24 +02:00
Joost Lekkerkerker eb8ca53a03 Migrate Anthropic to has entity name (#149302) 2025-07-23 12:58:28 +02:00
Joost Lekkerkerker 3dffd74607 Migrate OpenAI to has entity name (#149301) 2025-07-23 12:58:15 +02:00
Thomas55555 b37273ed33 Makes entites available in Husqvarna Automower when mower is in error state (#149261) 2025-07-23 12:39:17 +02:00
David Ferguson 232b34609c Avoid hardcoded max core climate timeout in SleepIQ (#149283) 2025-07-23 12:37:47 +02:00
Norbert Rittel aeeabfcae7 Fix typo "hazlenut" in miele (#149299) 2025-07-23 11:55:35 +02:00
Vincent Wolsink 52abab8ae8 Use translation_key for entities in Huum (#149256) 2025-07-23 11:28:28 +02:00
Artur Pragacz 7aa4810b0a Clean up internal_get_tts_audio in TTS entity (#148946) 2025-07-23 11:26:54 +02:00
Norbert Rittel c4d742f549 Add missing hyphen to "auto-renew period" in whois (#149296) 2025-07-23 12:01:19 +03:00
Raphael Hehl 51a46a128c Begin migrating unifiprotect to use the public API (#149126)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-22 22:46:52 -10:00
Norbert Rittel 9a6ba225e4 Fix typo "paela" in miele (#149295) 2025-07-23 10:33:31 +02:00
Norbert Rittel a5ab523014 Fix sentence-casing in tomorrowio (#149293) 2025-07-23 10:03:04 +02:00
Norbert Rittel 40571dff3d Replace typo "effect" with "affect" in insteon (#149292) 2025-07-23 09:33:27 +02:00
J. Nick Koston 5f2f038609 Bump dbus-fast to 2.44.2 (#149281) 2025-07-23 08:14:41 +02:00
Matthias Alphart 9fd2ad425c Refactor KNX UI conditional selectors and migrate store data (#146067)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-23 07:22:48 +02:00
Michael 2f6c0a1b7f Bump aioimmich to 0.11.0 (#149272) 2025-07-23 00:30:23 +02:00
Artur Pragacz dde73c05cb Order selectors alphabetically in helper (#149269) 2025-07-22 23:06:51 +02:00
Michael 993b0bbdd7 Use absolute humidity device class in HomematicIP Cloud (#148905) 2025-07-22 22:51:03 +02:00
Raphael Hehl 45dbf3ef1a Bump uiprotect to version 7.19.0 (#149266) 2025-07-22 22:50:55 +02:00
Paulus Schoutsen 71c1837f39 Update OpenAI title to drop "conversation" (#149263) 2025-07-22 22:43:02 +02:00
epenet 34eb99530f Use translation_placeholders in tuya cover descriptions (#149248)
Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>
2025-07-22 22:21:59 +02:00
Thomas55555 55ac4d8855 Bump aioautomower to 2.0.1 (#149262) 2025-07-22 21:17:59 +02:00
epenet ef3fb50018 Use translation_placeholders in tuya light descriptions (#149249) 2025-07-22 19:44:51 +02:00
epenet 316ac6253b Use translation_placeholders in tuya number descriptions (#149250) 2025-07-22 19:06:14 +02:00
epenet 252a46d141 Use translation_placeholders in tuya select descriptions (#149251) 2025-07-22 19:05:54 +02:00
Álvaro Fernández Rojas 969ad232aa Update aioairzone-cloud to v0.6.16 (#149254) 2025-07-22 17:23:38 +01:00
Martin Hjelmare 828a47db06 Add Z-Wave USB migration confirm step (#149243) 2025-07-22 17:09:11 +03:00
G Johansson 3947569132 Bump holidays to 0.77 (#149246) 2025-07-22 15:50:38 +02:00
Joakim Sørensen e5f9788d24 Refactor cloud backup agent to use updated file handling methods (#149231) 2025-07-22 15:15:56 +02:00
Erik Montnemery dd399ef59f Refactor EntityPlatform (#147927) 2025-07-22 14:35:57 +02:00
wedsa5 5a771b501d Fix ColorMode.WHITE support in Tuya (#126242)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-22 14:07:34 +02:00
hahn-th 3f67ba4c02 Add support for ELV-SH-WSM to homematicip (#149098) 2025-07-22 14:06:03 +02:00
Joost Lekkerkerker c075134845 Use OpenRouterClient to get the models (#148903) 2025-07-22 13:58:33 +02:00
Joost Lekkerkerker e5c7e04329 Introduce base entity in Open Router (#148910) 2025-07-22 13:43:41 +02:00
Åke Strandberg 49807c9fbe Add set_program service to Miele (#143442) 2025-07-22 13:33:03 +02:00
Norbert Rittel e79d42ecfc Add missing hyphen to "post-heater" in vallox (#149222) 2025-07-22 13:32:45 +02:00
dependabot[bot] 1f07dd7946 Bump github/codeql-action from 3.29.2 to 3.29.3 (#149220)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-22 13:07:56 +02:00
epenet 8d1c789ca2 Replace RuntimeError with TYPE_CHECKING in Tuya (#149227) 2025-07-22 12:10:23 +02:00
Bram Kragten 456f992b7e 2025.7.3 (#149024) 2025-07-22 10:30:09 +02:00
Artur Pragacz f5d68a4ea4 Simplify getting domains to resolve in bootstrap (#145829) 2025-07-22 10:10:59 +02:00
Artur Pragacz 2315bcbfe3 Set has_entity_name in Onkyo (#149223) 2025-07-22 10:02:15 +02:00
Raphael Hehl df4e1411cc Bump uiprotect to version 7.18.1 (#149209) 2025-07-22 09:00:25 +02:00
Norbert Rittel 3e7974a638 Add missing hyphen to "post-processing" in nzbget (#149205) 2025-07-22 08:58:32 +02:00
David Ferguson 48b8827390 Bump asyncsleepiq to 1.5.3 (#149215) 2025-07-22 08:56:54 +02:00
hanwg 42cf4e8db7 Fix multiple webhook secrets for Telegram bot (#149103) 2025-07-22 07:42:40 +02:00
Ville Skyttä ef2531d28d Add diagnostics support to Huawei LTE (#131085)
Co-authored-by: abmantis <amfcalt@gmail.com>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-21 21:52:48 +01:00
Vincent Wolsink 79dd91ebc6 Add sauna light control in Huum (#149169) 2025-07-21 22:52:24 +02:00
starkillerOG ecb6cc50b9 Add Reolink post recording time select entity (#149201)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-21 21:48:02 +01:00
starkillerOG b6014da121 Add Reolink wifi signal sensor for IPC cams (#149200) 2025-07-21 21:35:28 +02:00
Erik Montnemery 941d3c2be4 Improve integration sensor tests (#149180) 2025-07-21 18:23:58 +02:00
starkillerOG 7d895653fb Bump reolink-aio to 0.14.3 (#149191) 2025-07-21 18:19:56 +02:00
Erik Montnemery 3bd70a4698 Improve derivative sensor tests (#149179) 2025-07-21 17:51:26 +02:00
Petro31 b85ec55abb Add availability template to template helper config flow (#147623)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
Co-authored-by: Joostlek <joostlek@outlook.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-21 17:41:56 +02:00
Michael Hansen 3f42911af4 Add streaming to cloud TTS (#148925) 2025-07-21 10:33:23 -05:00
G Johansson 3c70932357 Use OptionsFlowWithReload in enphase_envoy (#149171) 2025-07-21 16:52:25 +02:00
Artur Pragacz 40252763d7 Switch to a new library in Onkyo (#148613) 2025-07-21 16:31:28 +02:00
G Johansson 80b96b0007 Use OptionsFlowWithReload in roku (#149172) 2025-07-21 15:40:30 +02:00
David Knowles f3db3ba3c8 Bump pyschlage to 2025.7.3 (#149184) 2025-07-21 14:36:12 +01:00
Joakim Sørensen 102ef257a0 Bump hass-nabucasa from 0.107.1 to 0.108.0 (#149189) 2025-07-21 14:35:35 +01:00
Joost Lekkerkerker 2476e7e47c Revert setting a user to download translations (#149190) 2025-07-21 15:27:29 +02:00
G Johansson 671523feb3 Use OptionsFlowWithReload in hyperion (#149163) 2025-07-21 14:52:14 +02:00
G Johansson 54fa4d635b Use OptionsFlowWithReload in sonarr (#149166) 2025-07-21 14:51:48 +02:00
G Johansson af0480f2a4 Use OptionsFlowWithReload in slide_local (#149168) 2025-07-21 14:51:33 +02:00
Ludovic BOUÉ 64f190749a Add Demo Vacuum in entity name (#148629) 2025-07-21 14:39:42 +02:00
dependabot[bot] 6b489e0ab6 Bump sigstore/cosign-installer from 3.9.1 to 3.9.2 (#148985)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 14:34:12 +02:00
Norbert Rittel 1315095b4a Make spelling of "devolo Home Network" consistent (#149165) 2025-07-21 14:16:03 +02:00
David Ferguson 2d86fa079e SleepIQ add core climate for SleepNumber Climate 360 beds (#134718) 2025-07-21 14:14:33 +02:00
Paul Bottein 875219ccb5 Adds support for hide_states options in state selector (#148959) 2025-07-21 13:02:04 +01:00
Luuk Dobber bc0162cf85 Add select for heating circuit to Tado zones (#147902)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-21 12:45:57 +01:00
Marc Mueller d774de79db Update types packages (#149178) 2025-07-21 13:33:04 +02:00
G Johansson be25a7bc70 Use OptionsFlowWithReload in ezviz (#149167) 2025-07-21 13:24:15 +02:00
Marc Mueller 05566e1621 Update websockets pin (#149004) 2025-07-21 13:23:42 +02:00
Erik Montnemery b59d8b5730 Improve statistics sensor tests (#149181) 2025-07-21 13:20:04 +02:00
dependabot[bot] 75a90ab568 Bump actions/ai-inference from 1.1.0 to 1.2.3 (#149159)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-21 13:11:22 +02:00
Erik Montnemery 67c68dedba Make async_track_state_change/report_event listeners fire in order (#148766) 2025-07-21 13:07:52 +02:00
Marc Mueller 1fba61973d Update pytest-asyncio to 1.1.0 (#149177) 2025-07-21 12:03:53 +01:00
Simon Lamon bf1a660dcb Bump Lokalise docker image to v2.6.14 (#149031) 2025-07-21 13:02:50 +02:00
G Johansson 94d077ea41 Use OptionsFlowWithReload in honeywell (#149162) 2025-07-21 12:47:38 +02:00
G Johansson c22f65bd87 Use OptionsFlowWithReload in isy994 (#149174) 2025-07-21 12:47:24 +02:00
G Johansson 0dba32dbcd Use OptionsFlowWithReload in keenetic_ndms2 (#149173) 2025-07-21 12:47:11 +02:00
Elmo-S 8c964e64db Add support for UV index attribute in template weather entity (#149015) 2025-07-21 11:39:46 +01:00
epenet c08aa74496 Cleanup Tuya climate/cover tests (#149157) 2025-07-21 12:27:37 +02:00
G Johansson ff9fb6228b Use OptionsFlowWithReload in onewire (#149164) 2025-07-21 11:14:02 +02:00
Joost Lekkerkerker 6eab118a2d Bump airgradient to platinum (#149014) 2025-07-21 08:26:20 +02:00
G Johansson c1e35cc9cf Use OptionsFlowWithReload in androidtv_remote (#149133) 2025-07-21 08:18:40 +02:00
G Johansson 11dd2dc374 Use OptionsFlowWithReload in file (#149108) 2025-07-21 08:17:12 +02:00
G Johansson 00c4b09773 Use OptionsFlowWithReload in motioneye (#149130) 2025-07-21 08:15:51 +02:00
Joakim Plate bc9ad5eac6 Add device class to gardena (#149144) 2025-07-21 08:15:32 +02:00
Michael eca80a1645 Use OptionsFlowWithReload in Feedreader (#149134) 2025-07-21 07:27:02 +02:00
Michael bd7cef92c7 Use OptionsFlowWithReload in Proximity (#149136) 2025-07-21 07:26:29 +02:00
David Knowles 27787e0679 Bump pyschlage to 2025.7.2 (#149148) 2025-07-21 07:25:45 +02:00
Raphael Hehl 0a9fbb215d Bump uiprotect to version 7.16.0 (#149146) 2025-07-21 02:22:32 +02:00
G Johansson 77a954df9b Use OptionsFlowWithReload in reolink (#149132) 2025-07-20 23:44:39 +02:00
G Johansson 61ca0b6b86 Use OptionsFlowWithReload in vodafone_station (#149131) 2025-07-20 23:18:00 +02:00
G Johansson e3577de9d8 Use OptionsFlowWithReload in onkyo (#149093) 2025-07-20 23:17:43 +02:00
J. Nick Koston b8d45fba24 Bump aioesphomeapi to 37.0.2 (#149143) 2025-07-20 10:53:09 -10:00
Vincent Wolsink 44fec53bac Add binary_sensor for door status in Huum (#149135) 2025-07-20 22:50:53 +02:00
Raphael Hehl ca48b9e375 Bump uiprotect to version 7.15.1 (#149124) 2025-07-20 08:41:49 -10:00
Abílio Costa 216e89dc5e Add battery charging state icons to Reolink (#149125) 2025-07-20 14:50:17 +02:00
Norbert Rittel 72d5578128 Fix typo in #device-discovery-payload anchor link of mqtt (#149116) 2025-07-20 14:29:18 +02:00
Thorsten e3bdd12dad Add Bauknecht virtual integration (#146801) 2025-07-20 13:13:24 +01:00
G Johansson 43dc73c2e1 Use OptionsFlowWithReload in forecast_solar (#149112) 2025-07-20 13:09:07 +02:00
G Johansson 302b6f03ba Use OptionsFlowWithReload in speedtest (#149111) 2025-07-20 13:08:42 +02:00
G Johansson b31e17f1f9 Use OptionsFlowWithReload in met (#149115) 2025-07-20 13:07:46 +02:00
G Johansson 1b8f3348b0 Use OptionsFlowWithReload in roborock (#149118) 2025-07-20 13:06:59 +02:00
G Johansson 0d42b24467 Use OptionsFlowWithReload in jewish_calendar (#149121) 2025-07-20 13:05:39 +02:00
G Johansson 0c858de1af Use OptionsFlowWithReload in lamarzocco (#149119) 2025-07-20 12:31:18 +02:00
G Johansson 5d653d46c3 Remove not used config entry update listener from nut (#149096) 2025-07-20 12:30:22 +02:00
G Johansson b262a5c9b6 Use OptionsFlowWithReload in lastfm (#149113) 2025-07-20 12:05:24 +02:00
G Johansson ead99c549f Use OptionsFlowWithReload in denonavr (#149109) 2025-07-20 11:12:51 +02:00
G Johansson 1a6bfc0310 Use OptionsFlowWithReload in knx (#149097) 2025-07-20 10:17:09 +02:00
hahn-th 507f29a209 Bump homematicip to 2.2.0 (#149038) 2025-07-19 21:12:49 +02:00
G Johansson d796ab8fe7 Use OptionsFlowWithReload in kitchen_sink (#149091) 2025-07-19 21:12:17 +02:00
G Johansson d35dca377f Use OptionsFlowWithReload in purpleair (#149095) 2025-07-19 21:11:15 +02:00
Michael 96766fc62a Use OptionsFlowWithReload in Synology DSM (#149086) 2025-07-19 21:08:37 +02:00
G Johansson afbb0ee2f4 Use OptionsFlowWithReload in github (#149089) 2025-07-19 21:07:55 +02:00
G Johansson e885ae1b15 Use OptionsFlowWithReload in holiday (#149090) 2025-07-19 21:07:23 +02:00
G Johansson 51d38f8f05 Use OptionsFlowWithReload in emoncms (#149094) 2025-07-19 21:06:14 +02:00
peteS-UK be644ca96e Add type to coordinator for Squeezebox (#149087) 2025-07-19 20:39:22 +02:00
Michael d266b6f6ab Use OptionsFlowWithReload in AVM Fritz!Box Tools (#149085) 2025-07-19 20:08:20 +02:00
G Johansson dbdc666a92 Use OptionsFlowWithReload in control4 (#149058) 2025-07-19 19:51:01 +02:00
Allen Porter 2577d9f108 Fix a bug in rainbird device migration that results in additional devices (#149078) 2025-07-19 19:49:14 +02:00
peteS-UK 7dfb54c8e8 Paramaterize test for on/off for Squeezebox (#149048) 2025-07-19 19:30:40 +02:00
peteS-UK a50d926e2a Check for error in test_squeezebox_play_media_with_announce_volume_invalid for Squeezebox (#149044) 2025-07-19 19:30:15 +02:00
peteS-UK 0cfb395ab5 Remove unnecessary getattr from init for Squeezebox (#149077) 2025-07-19 19:20:11 +02:00
peteS-UK b3f049676d Move Squeezebox registry tests to test_init (#149050) 2025-07-19 19:17:34 +02:00
G Johansson 7e04a7ec19 Use OptionsFlowWithReload in unifiprotect (#149064) 2025-07-19 17:40:16 +02:00
G Johansson c15bf097f0 Use OptionsFlowWithReload in airnow (#149049) 2025-07-19 16:50:41 +02:00
G Johansson dba3d98a2b Use OptionsFlowWithReload in xiaomi_miio (#149051) 2025-07-19 16:50:13 +02:00
G Johansson 4a5e193ebb Use OptionsFlowWithReload in ws66i (#149052) 2025-07-19 16:49:19 +02:00
G Johansson 1bbd07fe48 Use OptionsFlowWithReload in wiffi (#149053) 2025-07-19 16:48:53 +02:00
G Johansson b9d19ffb29 Use OptionsFlowWithReload in vera (#149055) 2025-07-19 16:48:23 +02:00
G Johansson 22b35030a9 Use OptionsFlowWithReload in analytics_insight (#149056) 2025-07-19 16:47:09 +02:00
G Johansson 69c26e5f1f Use OptionsFlowWithReload in dnsip (#149059) 2025-07-19 16:46:30 +02:00
G Johansson cb4d17b24f Use OptionsFlowWithReload in Ping (#149061) 2025-07-19 16:45:39 +02:00
G Johansson ff14f6b823 Use OptionsFlowWithReload in somfy_mylink (#149062) 2025-07-19 16:44:51 +02:00
G Johansson ab964c8bca Use OptionsFlowWithReload in tankerkoenig (#149063) 2025-07-19 16:43:49 +02:00
peteS-UK 05f686cb86 Update comments in 3 Squeezebox platforms (#149065) 2025-07-19 16:42:21 +02:00
G Johansson 440a20340e Use OptionsFlowWithReload in nobo_hub (#149066) 2025-07-19 16:41:38 +02:00
G Johansson 676a931c48 Use OptionsFlowWithReload in nmap_tracker (#149067) 2025-07-19 16:40:57 +02:00
G Johansson 360da43868 Use OptionsFlowWithReload in nina (#149068) 2025-07-19 16:40:32 +02:00
Marc Mueller 12193587c9 Use OptionsFlowWithReload in fritzbox_callmonitor (#149071) 2025-07-19 16:39:38 +02:00
G Johansson 290f19dbd9 Use OptionsFlowWithReload in motion_blinds (#149070) 2025-07-19 16:38:28 +02:00
G Johansson 13434012e7 Use OptionsFlowWithReload in netgear (#149069) 2025-07-19 16:37:37 +02:00
peteS-UK 7202203f35 Update bool test in coordinator platform for Squeezebox (#149073) 2025-07-19 16:33:34 +02:00
G Johansson 31167f5da7 Use OptionsFlowWithReload in webostv (#149054) 2025-07-19 16:16:56 +03:00
G Johansson 665991a3c1 Use OptionsFlowWithReload in wled (#149046) 2025-07-19 13:27:46 +01:00
G Johansson 8a2493e9d2 Use OptionsFlowWithReload in Workday (#149043) 2025-07-19 13:26:54 +01:00
G Johansson be6743d4fd Use OptionsFlowWithReload in yale_smart_alarm (#149040) 2025-07-19 13:14:38 +01:00
G Johansson 284b90d502 Use OptionsFlowWithReload in yeelight (#149045) 2025-07-19 13:14:13 +01:00
G Johansson d7d2013ec8 Use OptionsFlowWithReload in sql (#149047) 2025-07-19 13:12:25 +01:00
G Johansson b3bd882a80 Use OptionsFlowWithReload in Trafikverket Train (#149042) 2025-07-19 13:09:54 +01:00
J. Nick Koston 3a6f23b95f Bump aioesphomeapi to 37.0.1 (#149035) 2025-07-19 12:53:51 +01:00
G Johansson 6f59aaebdd Add extended class for OptionsFlow that automatically reloads (#146910)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-19 13:14:20 +02:00
Allen Porter f90e06fde1 Add attachment support in ollama ai task (#148981) 2025-07-19 07:27:48 +02:00
Paul Bottein 380c737901 Add reorder option to entity selector (#149002) 2025-07-18 19:41:59 +01:00
Petro31 33cc257e75 Consolidate template integration's config schemas (#149018) 2025-07-18 19:38:53 +01:00
Franck Nijhof 3877a6211a Ensure Lokalise download runs as the same user as GitHub Actions (#149026) 2025-07-18 19:56:19 +02:00
J. Nick Koston 916b4368dd Bump aioesphomeapi to 36.0.1 (#148991) 2025-07-18 07:30:34 -10:00
Franck Nijhof 0675e34c62 Bump version to 2025.7.3 2025-07-18 17:05:52 +00:00
Simone Chemelli 190c98f5a8 Bump aioamazondevices to 3.5.0 (#149011) 2025-07-18 17:04:01 +00:00
Jan Bouwhuis c6bb26be89 Ignore MQTT sensor unit of measurement if it is an empty string (#149006) 2025-07-18 17:02:02 +00:00
J. Nick Koston d57c5ffa8f Bump PySwitchbot to 0.68.2 (#148996) 2025-07-18 17:02:01 +00:00
Bram Kragten 68889e1790 Update frontend to 20250702.3 (#148994) 2025-07-18 17:02:00 +00:00
Joost Lekkerkerker 8fdc50a29f Pass Syncthru entry to coordinator (#148974) 2025-07-18 17:01:58 +00:00
Steven Looman 5656b4c20d Bump async-upnp-client to 0.45.0 (#148961) 2025-07-18 17:01:57 +00:00
Maciej Bieniek b6edcc9422 Bump gios to version 6.1.2 (#148884) 2025-07-18 17:01:56 +00:00
Maciej Bieniek 7a3eb53453 Bump gios to version 6.1.1 (#148414) 2025-07-18 17:01:54 +00:00
Arie Catsman 11a2c73e8a Bump pyenphase to 2.2.2 (#148870) 2025-07-18 17:00:32 +00:00
Brett Adams 1644484c92 Fix button platform parent class in Teslemetry (#148863) 2025-07-18 17:00:30 +00:00
Pete Sage 8e0a89dc2f Add guard to prevent exception in Sonos Favorites (#148854) 2025-07-18 17:00:29 +00:00
Robert Resch 9e4b8df344 Use ffmpeg for generic cameras in go2rtc (#148818) 2025-07-18 17:00:28 +00:00
Brett Adams 69fdc1d269 Bump Tesla Fleet API to 1.2.2 (#148776) 2025-07-18 17:00:26 +00:00
Joost Lekkerkerker 56e0aa103d Bump pySmartThings to 3.2.8 (#148761) 2025-07-18 17:00:25 +00:00
Maciej Bieniek caf0492009 Fix Shelly n_current sensor removal condition (#148740) 2025-07-18 17:00:24 +00:00
hahn-th c6d0aad3d3 Handle connection issues after websocket reconnected in homematicip_cloud (#147731) 2025-07-18 17:00:22 +00:00
Jan Bouwhuis 4c99fe9ae5 Ignore MQTT sensor unit of measurement if it is an empty string (#149006) 2025-07-18 18:57:03 +02:00
Marc Mueller 353b573707 Update bluecurrent-api to 1.2.4 (#149005) 2025-07-18 15:43:43 +02:00
Maciej Bieniek 109663f177 Bump imgw_pib to version 1.4.2 (#149009) 2025-07-18 15:36:17 +02:00
Simone Chemelli 3b89b2cbbe Bump aioamazondevices to 3.5.0 (#149011) 2025-07-18 15:35:38 +02:00
Abílio Costa 29d0d6cd43 Add top-level target support to trigger schema (#148894) 2025-07-18 14:32:16 +01:00
Erik Montnemery 1743766d17 Add last_reported to state reported event data (#148932) 2025-07-18 13:53:30 +02:00
G Johansson 277241c4d3 Adjust ManualTriggerSensorEntity to handle timestamp device classes (#145909) 2025-07-18 13:49:12 +02:00
Bram Kragten 17034f4d6a Update frontend to 20250702.3 (#148994) 2025-07-18 13:15:55 +02:00
Thomas55555 ec544b0430 Mark entities as unavailable when they don't have a value in Husqvarna Automower (#148563) 2025-07-18 12:49:50 +02:00
Marc Mueller 75c803e376 Update pysmarlaapi to 0.9.1 (#149001) 2025-07-18 12:48:39 +02:00
J. Nick Koston a96e31f1d8 Bump PySwitchbot to 0.68.2 (#148996) 2025-07-18 12:48:09 +02:00
c0ffeeca7 43a30fad96 Home Assistant Cloud: fix capitalization (#148992) 2025-07-18 12:19:33 +02:00
Petar Petrov 39d323186f Disable "last seen" Z-Wave entity by default (#148987) 2025-07-18 09:53:47 +02:00
karwosts 57c024449c Fix broken invalid_config tests (#148965) 2025-07-18 09:02:44 +02:00
Manu 414057d455 Add image platform to PlayStation Network (#148928) 2025-07-18 08:33:30 +02:00
Joost Lekkerkerker 50688bbd69 Add support for calling tools in Open Router (#148881) 2025-07-18 05:49:27 +02:00
Álvaro Fernández Rojas 073ea813f0 Update aioairzone-cloud to v0.6.15 (#148947) 2025-07-17 23:08:45 +01:00
Vincent Wolsink 6b959f42f6 Introduce base entity for supporting multiple platforms in Huum (#148957) 2025-07-17 23:06:51 +01:00
Joost Lekkerkerker 0ff0902ccf Add icons to WAQI (#148976) 2025-07-17 22:36:18 +01:00
Joost Lekkerkerker 37a154b1df Migrate WAQI to runtime data (#148977) 2025-07-17 23:22:30 +02:00
Petro31 3c87a3e892 Add a preview to template config flow for alarm control panel, image, and select platforms (#148441) 2025-07-17 22:19:45 +01:00
Joost Lekkerkerker aacaa9a20f Pass Syncthru entry to coordinator (#148974) 2025-07-18 00:14:19 +03:00
Joost Lekkerkerker c074453763 Remove obsolete variables in WAQI (#148975) 2025-07-18 00:13:46 +03:00
Jan Bouwhuis 29afa891ec Add YAML and discovery info export feature for MQTT device subentries (#141896)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-17 23:06:47 +02:00
Steven Looman 3b6eb045c6 Bump async-upnp-client to 0.45.0 (#148961) 2025-07-17 21:19:47 +02:00
Joost Lekkerkerker 0d819f2389 Refactor WAQI tests (#148968) 2025-07-17 20:30:40 +02:00
Joakim Sørensen 9802441fea Bump hass-nabucasa from 0.106.0 to 0.107.1 (#148949) 2025-07-17 18:47:00 +01:00
Joakim Plate fb13c8f4f2 Update arcam to 1.8.2 (#148956) 2025-07-17 18:34:58 +01:00
AlCalzone a96e38871f Z-Wave JS: Simplify strings for RSSI sensors (#148936) 2025-07-17 18:49:34 +03:00
Vincent Wolsink 17920b6ec3 Use climate min/max temp from sauna configuration in Huum (#148955) 2025-07-17 15:34:15 +01:00
karwosts 40cabc8d70 Validate min/max for input_text config (#148909) 2025-07-17 16:27:41 +02:00
AlCalzone b33a556ca5 Bump zwave-js-server-python to 0.66.0 (#148939)
Co-authored-by: Marc Mueller <30130371+cdce8p@users.noreply.github.com>
2025-07-17 16:20:03 +03:00
Marc Mueller 9df97fb2e2 Add correct labels for dependabot PRs (#148944) 2025-07-17 12:31:55 +02:00
Erik Montnemery ee35fc495d Improve derivative sensor tests (#148941) 2025-07-17 11:44:37 +02:00
Vincent Wolsink 9373bb287c Huum - Introduce coordinator to support multiple platforms (#148889)
Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-07-17 11:43:26 +02:00
Erik Montnemery d72fb021c1 Improve statistics tests (#148937) 2025-07-17 11:42:25 +02:00
Erik Montnemery 0e6a1e3242 Improve integration sensor tests (#148938)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-07-17 11:41:39 +02:00
asafhas 79b8e74d87 Add numbers configuration to Tuya alarm (#148907) 2025-07-17 11:26:33 +02:00
Aidan Timson 72d1c3cfc8 Fix Tuya support for climate fan modes which use "windspeed" function (#148646)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-07-17 09:47:54 +02:00
AlCalzone 3d278b626a Z-Wave JS: Add statistics sensors for channel 3 background RSSI (#148899) 2025-07-17 09:19:44 +02:00
Joakim Plate 5383ff96ef Make sure gardena bluetooth mock unload if it mocks load (#148920) 2025-07-17 09:00:44 +02:00
epenet a0991134c4 Rename tuya fixture file to match category (#148892) 2025-07-17 08:59:34 +02:00
Jan-Philipp Benecke 9def44dca4 Bump inexogy quality scale to platinum (#148908) 2025-07-17 08:58:53 +02:00
Joris Pelgröm 656822b39c Bump letpot to 0.5.0 (#148922) 2025-07-17 08:57:11 +02:00
epenet ae03fc2295 Fix missing unit of measurement in tuya numbers (#148924) 2025-07-17 08:55:47 +02:00
Abílio Costa e32e06d7a0 Fix Husqvarna Automower coordinator listener list mutating (#148926) 2025-07-17 08:52:59 +02:00
Artur Pragacz 6dc2340c5a Fix docstring for WaitIntegrationOnboardingView (#148904) 2025-07-16 23:15:45 +01:00
Thomas55555 83cd2dfef3 Bump aioautomower to 2.0.0 (#148846) 2025-07-16 22:12:35 +02:00
Franck Nijhof a5c301db1b Add code review guidelines to exclude imports and formatting feedback (#148912) 2025-07-16 21:55:37 +02:00
Norbert Rittel 5b41d5a795 Fix typo "barametric" in rainmachine (#148917) 2025-07-16 21:50:29 +02:00
Michael 9d178ad5f1 Deprecate the usage of ContextVar for config_entry in coordinator (#138161) 2025-07-16 21:45:22 +02:00
Franck Nijhof e8fca19335 Fix flaky husqvarna_automower test with comprehensive race condition fix (#148911)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-16 21:40:44 +02:00
Joost Lekkerkerker 58bb2fa327 Bump python-open-router to 0.3.0 (#148900) 2025-07-16 18:51:52 +02:00
epenet fca05f6bcf Add snapshot tests for tuya dj category (#148897) 2025-07-16 18:34:28 +02:00
Joost Lekkerkerker a5f0f6c8b9 Add prompt as constant and common translation key (#148896) 2025-07-16 18:23:38 +02:00
Artur Pragacz e2340314c6 Do not allow filters for services with no target in hassfest (#148869) 2025-07-16 17:40:35 +02:00
Erik Montnemery aab6cd665f Fix flaky notify group test (#148895) 2025-07-16 17:06:35 +02:00
Paulus Schoutsen 1734b316d5 Return intent response from LLM chat log if available (#148522) 2025-07-16 16:16:01 +02:00
Maciej Bieniek 3449863eee Bump gios to version 6.1.2 (#148884) 2025-07-16 15:49:02 +02:00
Manu b68de0af88 Change deprecated media_player state standby to off in PlayStation Network (#148885) 2025-07-16 15:48:39 +02:00
Artur Pragacz 840e0d1388 Clean up ModuleWrapper from loader (#148488) 2025-07-16 15:19:22 +02:00
Joost Lekkerkerker 412035b970 Add devices to OpenRouter (#148888) 2025-07-16 15:07:53 +02:00
Denis Shulyaka 3e465da892 Add Code Interpreter tool for OpenAI Conversation (#148383) 2025-07-16 14:52:53 +02:00
Marc Mueller 0d79f7db51 Update mypy-dev to 1.18.0a2 (#148880) 2025-07-16 14:43:55 +02:00
Erik Montnemery 62e3802ff2 Deprecate MediaPlayerState.STANDBY (#148151)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-16 14:22:42 +02:00
tronikos 02a11638b3 Add Google AI STT (#147563) 2025-07-16 14:11:29 +02:00
Josef Zweck 26a9af7371 Add search functionality to jellyfin (#148822) 2025-07-16 13:26:46 +02:00
epenet e28f02d163 Add initial support for tuya qccdz (#148874) 2025-07-16 12:28:18 +02:00
G Johansson a6828898d1 Add sensor platform to SMHI (#139295) 2025-07-16 12:25:10 +02:00
Paulus Schoutsen 29e105b0ef Set default mode for number selector to box (#148773) 2025-07-16 11:19:31 +01:00
Maciej Bieniek ce4a811b96 Add hydrological alert sensor to IMGW-PIB integration (#148848) 2025-07-16 10:55:50 +01:00
Arie Catsman fe8384719d Bump pyenphase to 2.2.2 (#148870) 2025-07-15 23:18:14 -10:00
Joost Lekkerkerker a57d48fd31 Add OpenRouter integration (#143098) 2025-07-16 10:55:28 +02:00
Thomas55555 8a73511b02 Add inactive reason sensor to Husqvarna Automower (#147684) 2025-07-16 10:44:04 +02:00
epenet 033d8b3dfb Add snapshot tests for tuya co2bj and gyd categories (#148872) 2025-07-16 10:38:43 +02:00
epenet 6833bf1900 Add battery status and configuration entities to Tuya thermostat (wk) (#148821) 2025-07-16 10:15:44 +02:00
Brett Adams 84e3dac406 Update vehicle type handling in Teslemetry (#148862) 2025-07-16 10:05:17 +02:00
epenet bafd342d5d Add initial support for tuya cwjwq (#148420) 2025-07-16 09:54:44 +02:00
epenet fae6b375cd Fix incorrectly rejected device classes in tuya (#148596) 2025-07-16 09:39:22 +02:00
epenet d8de6e34dd Add support for Tuya ks category (tower fan) (#148811) 2025-07-16 09:24:20 +02:00
Artur Pragacz 9db5b0b3b7 Validate selectors in the service helper (#148857) 2025-07-16 08:51:16 +02:00
Brett Adams bcec29763f Fix button platform parent class in Teslemetry (#148863) 2025-07-16 08:16:36 +02:00
epenet 27ad459ae0 Add tuya snapshots for more humidifiers (cs category) (#148797) 2025-07-16 08:11:55 +02:00
hahn-th 9c933ef01f Add support for HmIPW-DRBL4 in homematicip_cloud (#148844) 2025-07-16 08:10:56 +02:00
Norbert Rittel 2011e64390 Different fixes in user-facing strings of nasweb (#148830) 2025-07-16 08:10:29 +02:00
Brett Adams ffc2b0a8cf Add mock for listen in Teslemetry tests (#148853) 2025-07-16 08:09:54 +02:00
Pete Sage 549069e22c Add guard to prevent exception in Sonos Favorites (#148854) 2025-07-16 08:09:24 +02:00
Jan-Philipp Benecke 57e4270b7b Make exceptions translatable in inexogy integration (#148865) 2025-07-16 08:06:49 +02:00
Maciej Bieniek 38e4e18f60 Bump IMGW-PIB to version 1.4.1 (#148849) 2025-07-16 00:41:56 +01:00
Robert Resch 7f2a32d4eb Remove not needed go2rtc stream config (#148836) 2025-07-15 22:11:55 +01:00
Manu d46e0e132b Add reconfigure flow to Uptime Kuma (#148833) 2025-07-15 22:46:37 +02:00
Álvaro Fernández Rojas 828f0f8b26 Update aioairzone-cloud to v0.6.14 (#148820) 2025-07-15 22:43:40 +02:00
Erik Montnemery 849a25e3cc Handle changes to source entities in mold_indicator helper (#148823)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-07-15 22:19:32 +02:00
Erik Montnemery 3cb579d585 Do not add statistics config entry to source device (#148731) 2025-07-15 22:13:26 +02:00
Erik Montnemery 381bd489d8 Do not add template config entry to source device (#148756) 2025-07-15 22:13:03 +02:00
Marc Mueller f5b785acd5 Update youtubeaio to 2.0.0 (#148814) 2025-07-15 20:44:32 +02:00
Manu 648dce2fa3 Add diagnostics platform to Uptime Kuma (#148835) 2025-07-15 20:19:14 +02:00
Manu d14a0e0191 Bump pythonkuma to v0.3.1 (#148834) 2025-07-15 20:18:47 +02:00
Maciej Bieniek 9caf46c68b Bump imgw_pib library to version 1.4.0 (#148831) 2025-07-15 20:17:54 +02:00
Artur Pragacz e89ae021d8 Clean up validate_supported_features in selector helper (#148843) 2025-07-15 20:10:16 +02:00
Marc Mueller 36156d9c54 Update orjson to 3.11.0 (#148840) 2025-07-15 19:43:44 +02:00
Artur Pragacz 3e0628cec2 Fix entity and device selectors (#148580) 2025-07-15 18:58:42 +02:00
Robert Resch 8bd51a7fd1 Use ffmpeg for generic cameras in go2rtc (#148818) 2025-07-15 16:38:19 +01:00
Paul Bottein 5b29d6bbdf Set icon for off state for light domain (#148749) 2025-07-15 16:25:22 +01:00
karwosts 2c2ac4b669 Throw an error from reload_themes if themes are invalid (#148827)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-15 17:08:19 +02:00
Petro31 35097602d7 Remove unnecessary hass if check in AbstractTemplateEntity (#148828) 2025-07-15 17:04:31 +02:00
Petro31 e5fe243a86 Remove device id references from button and image (#148826) 2025-07-15 17:03:47 +02:00
Manu fd10fa1fba Add reauthentication flow to Uptime Kuma (#148772) 2025-07-15 16:49:08 +02:00
Myles Eftos 087a938a7d Add forecast service to amberelectric (#144848)
Co-authored-by: G Johansson <goran.johansson@shiftit.se>
2025-07-15 16:32:59 +02:00
Petro31 c058561162 Add initalize for abstract template entities (#147504) 2025-07-15 15:53:01 +02:00
epenet b89b248b4c Add tuya snapshots for qxj category (#148802) 2025-07-15 14:18:14 +02:00
Samuel Xiao cd94685b7d Add Fan platform to Switchbot cloud (#148304)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-15 13:55:13 +02:00
Matrix 0acfb81d50 Clean up YoLink entities on startup (#148718) 2025-07-15 13:53:29 +02:00
Andrea Turri 7d06aec8da Discovery of Miele temperature sensors (#144585)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-15 12:50:28 +02:00
Åke Strandberg ee4325a927 Replace deprecated battery property on Miele vacuum with sensor (#148765) 2025-07-15 11:40:48 +01:00
Alex Leversen c7aadcdd20 Add file name/size sensors to OctoPrint integration (#148636) 2025-07-15 12:35:20 +02:00
wuede 8256401f7f expose schedule id as an extra state attribute in Netatmo (#147076) 2025-07-15 12:16:59 +02:00
hahn-th ab187f39c2 Add support for HmIP-RGBW and HmIP-LSC in homematicip_cloud integration (#148639) 2025-07-15 12:16:07 +02:00
hahn-th 1cb278966c Handle connection issues after websocket reconnected in homematicip_cloud (#147731) 2025-07-15 12:15:19 +02:00
Josef Zweck b522bd5ef2 Get media player features elsewhere for jellyfin (#148805) 2025-07-15 12:07:57 +02:00
Álvaro Fernández Rojas a6e1d96852 Update aioairzone-cloud to v0.6.13 (#148798)
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2025-07-15 11:21:54 +02:00
Marc Mueller 3d74d02704 Update pytouchlinesl to 0.4.0 (#148801) 2025-07-15 11:15:06 +02:00
Artur Pragacz db45f46c8a Fan support in WiZ (#146440) 2025-07-15 11:14:47 +02:00
ehendrix23 4f938d032d Bump elevenlabs to 2.3.0 (#147224) 2025-07-15 10:45:55 +02:00
nasWebio e1f15dac39 Add Sensor platform to NASweb integration (#133063)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-15 10:39:53 +02:00
epenet 41e261096a Use suggested unit of measurement in Tuya (#148599) 2025-07-15 10:34:16 +02:00
Max Velitchko f6aa4aa788 Bump amcrest to 1.9.9 (#148769) 2025-07-15 10:14:26 +02:00
Brett Adams 7d7767c93a Bump Tesla Fleet API to 1.2.2 (#148776) 2025-07-15 09:21:00 +02:00
J. Nick Koston 5e883cfb12 Fix flaky nuki tests by preventing teardown race condition (#148795) 2025-07-14 21:03:49 -10:00
Paulus Schoutsen e2cc51f21d Allow AI Task to handle camera attachments (#148753) 2025-07-15 08:51:08 +02:00
Petro31 816977dd75 Refactor async_setup_platform for template platforms (#147379) 2025-07-15 08:26:34 +02:00
kingy444 a81e83cb28 Manually register powerview hub (#146709)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-14 22:38:01 +01:00
Maciej Bieniek c476500c49 Fix Shelly n_current sensor removal condition (#148740) 2025-07-14 23:40:46 +03:00
Matthias Alphart f65fa38429 Add reconfigure flow for KNX (#145067)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-14 21:49:52 +02:00
Manu 66641356cc Add Uptime Kuma integration (#146393) 2025-07-14 21:35:57 +02:00
Willem-Jan van Rootselaar 37ae476c67 Add Zeroconf support for bsblan integration (#146137)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-14 21:26:03 +02:00
Manu 5ec9c4e6e3 Add PS Vita support to PlayStation Network integration (#148186) 2025-07-14 21:24:50 +02:00
Marc Mueller 80eb4fb2f6 Replace asyncio.iscoroutinefunction (#148738) 2025-07-14 20:24:32 +01:00
Joost Lekkerkerker 9e3a78b7ef Bump pySmartThings to 3.2.8 (#148761) 2025-07-14 20:18:12 +01:00
hahn-th c08c402409 Add switches for HmIPW-DRI16, HmIPW-DRI32, HmIPW-DRS4, HmIPW-DRS8 (#148571) 2025-07-14 21:16:29 +02:00
Vincent Wolsink d42d270fb2 Bump Huum to version 0.8.0 (#148763) 2025-07-14 20:16:26 +01:00
fwestenberg 9068a09620 Add Stookwijzer forecast service (#138392)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-14 21:08:16 +02:00
Stephan Traub 1ef07544d5 Fix for ignored devices issue #137114 (#146562) 2025-07-14 21:07:47 +02:00
Erik Montnemery ed4a23d104 Override connect method in RecorderPool (#148490) 2025-07-14 20:57:00 +02:00
peteS-UK 0729b3a2f1 Change hass.data storage to runtime.data for Squeezebox (#146482) 2025-07-14 20:53:53 +02:00
Manu c9356868f7 Add add-on discovery flow to pyLoad integration (#148494) 2025-07-14 19:29:57 +01:00
Abílio Costa 1753baf186 Add method to track entity state changes from target selectors (#148086)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-14 19:28:53 +01:00
Petro31 8421ca7802 Add assumed optimistic state to template select (#148513) 2025-07-14 19:28:27 +01:00
Paulus Schoutsen 124931b2ee TTS to always stream when available (#148695)
Co-authored-by: Michael Hansen <mike@rhasspy.org>
2025-07-14 20:23:43 +02:00
Erik Montnemery c27a67db82 Do not add integration config entry to source device (#148730) 2025-07-14 20:18:41 +02:00
Erik Montnemery 3ae9ea3f19 Do not add generic_thermostat config entry to source device (#148728) 2025-07-14 20:18:21 +02:00
Erik Montnemery e35f7b12f1 Do not add generic_hygrostat config entry to source device (#148727) 2025-07-14 20:18:11 +02:00
Erik Montnemery 1a1e9e9f57 Add test for combining state change and state report listeners (#148721) 2025-07-14 20:15:39 +02:00
Erik Montnemery 254f766357 Do not add history_stats config entry to source device (#148729) 2025-07-14 20:05:34 +02:00
Erik Montnemery 7df0016fab Do not add threshold config entry to source device (#148732) 2025-07-14 20:05:20 +02:00
Erik Montnemery 57f89dd606 Do not add trend config entry to source device (#148733) 2025-07-14 20:00:49 +02:00
Erik Montnemery 92bb1f2551 Do not add utility_meter config entry to source device (#148735) 2025-07-14 20:00:21 +02:00
kanshurichard f680e992ff Add support for Broadlink A2 air quality sensor (#142203)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-14 19:07:50 +02:00
Thomas55555 f08d1e547f Fix adding a work area in Husqvarna Automower (#148358) 2025-07-14 19:04:00 +02:00
Tsvi Mostovicz 9e022ad75e Quality fixes for Jewish Calendar (#148689) 2025-07-14 17:44:11 +02:00
Paulus Schoutsen 14ff04200e Make AI Task instructions multiline (#148606) 2025-07-14 15:24:44 +01:00
Michael 5e4ce46dae Use absolute humidity device class in Airq (#148568) 2025-07-14 14:38:33 +02:00
Erik Montnemery 155fc134b6 Do not add derivative config entry to source device (#148674)
Co-authored-by: Artur Pragacz <49985303+arturpragacz@users.noreply.github.com>
2025-07-14 13:33:00 +02:00
Franck Nijhof 1f59b735c6 2025.7.2 (#148725) 2025-07-14 13:12:29 +02:00
Franck Nijhof 87af9fc8ba Bump version to 2025.7.2 2025-07-14 10:30:35 +00:00
Simone Chemelli 691a0ca065 Bump aioamazondevices to 3.2.10 (#148709) 2025-07-14 10:27:45 +00:00
Shay Levy 80384b89a5 Bump aioshelly to 13.7.2 (#148706) 2025-07-14 10:25:24 +00:00
Jan Bouwhuis f7672985ed Fix hide empty sections in mqtt subentry flows (#148692) 2025-07-14 10:25:23 +00:00
Christopher Fenner d4374dbcc7 Bump PyViCare to 2.50.0 (#148679) 2025-07-14 10:25:22 +00:00
Brett Adams c4ddcd64c8 Fix Charge Cable binary sensor in Teslemetry (#148675) 2025-07-14 10:25:21 +00:00
0xEF c802430066 Bump nyt_games to 0.5.0 (#148654) 2025-07-14 10:25:20 +00:00
falconindy 649fbfc729 snoo: use correct value for right safety clip binary sensor (#148647) 2025-07-14 10:25:18 +00:00
Jan Bouwhuis 80c52ad8ea Fix - only enable AlexaModeController if at least one mode is offered (#148614) 2025-07-14 10:25:17 +00:00
Lưu Quang Vũ 150d4716fa Fix Google Cloud 504 Deadline Exceeded (#148589) 2025-07-14 10:25:16 +00:00
Bram Kragten dc2736580f Update frontend to 20250702.2 (#148573) 2025-07-14 10:25:15 +00:00
J. Nick Koston f1272ef513 Bump aiohttp to 3.12.14 (#148565) 2025-07-14 10:25:14 +00:00
Åke Strandberg 3c2fa023b4 Remove vg argument from miele auth flow (#148541) 2025-07-14 10:25:12 +00:00
Kristof Mariën 5cf5be8c9c Fix for Renson set Breeze fan speed (#148537) 2025-07-14 10:25:11 +00:00
Jan-Philipp Benecke 63b21fda1a Ensure response is fully read to prevent premature connection closure in rest command (#148532) 2025-07-14 10:25:10 +00:00
J. Diego Rodríguez Royo d87379d083 Use the link to the issue instead of creating new issues at Home Connect (#148523) 2025-07-14 10:25:09 +00:00
J. Diego Rodríguez Royo 0990cef917 Add Home Connect resume command button when an appliance is paused (#148512) 2025-07-14 10:25:08 +00:00
Michael 962ad99c20 Add workaround for sub units without main device in AVM Fritz!SmartHome (#148507) 2025-07-14 10:25:07 +00:00
Michael 9c9836defd Bump aioimmich to 0.10.2 (#148503) 2025-07-14 10:25:06 +00:00
Jan Bouwhuis e951fc401c Fix entity_id should be based on object_id the first time an entity is added (#148484) 2025-07-14 10:25:05 +00:00
Robert Resch 00e2a177a5 Revert "Deprecate hddtemp" (#148482) 2025-07-14 10:25:04 +00:00
Joakim Sørensen b6d316c8f2 Bump hass-nabucasa from 0.105.0 to 0.106.0 (#148473) 2025-07-14 10:25:02 +00:00
Raphael Hehl b8425de0d0 Bump uiprotect to version 7.14.2 (#148453) 2025-07-14 10:25:01 +00:00
Joost Lekkerkerker d51a44acbc Bump pySmartThings to 3.2.7 (#148394) 2025-07-14 10:25:00 +00:00
Josef Zweck 435465e569 Bump pylamarzocco to 2.0.11 (#148386) 2025-07-14 10:24:59 +00:00
Josef Zweck 3b047859f9 Create own clientsession for lamarzocco (#148385) 2025-07-14 10:24:58 +00:00
Simone Chemelli 91cdf1a367 Bump aioamazondevices to 3.2.8 (#148365)
Co-authored-by: Joakim Plate <elupus@ecce.se>
2025-07-14 10:24:57 +00:00
Joakim Plate 2377b136f3 Handle binary coils with non default mappings in nibe heatpump (#148354) 2025-07-14 10:24:56 +00:00
Retha Runolfsson 186c4e7038 Bump pyswitchbot to 0.68.1 (#148335) 2025-07-14 10:24:55 +00:00
Samuel Xiao d303a7d17e Fix Switchbot cloud plug mini current unit Issue (#148314) 2025-07-14 10:24:54 +00:00
jvits227 14f059c766 Add lamp states to smartthings selector (#148302)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-14 10:23:55 +00:00
Arie Catsman 4a10370932 Bump pyenphase to 2.2.1 (#148292) 2025-07-14 10:13:43 +00:00
J. Nick Koston 672ffa5984 Restore httpx compatibility for non-primitive REST query parameters (#148286) 2025-07-14 10:13:42 +00:00
Maciej Bieniek 3d3f2527cb Bump gios to version 6.1.0 (#148274) 2025-07-14 10:13:41 +00:00
Shay Levy 5c3b279f95 Bump aiowebostv to 0.7.4 (#148273) 2025-07-14 10:13:40 +00:00
starkillerOG 59bcf1167a bump motionblinds to 0.6.29 (#148265) 2025-07-14 10:13:39 +00:00
Mark Adkins b4d789f8e2 Bump sharkiq to 1.1.1 (#148244) 2025-07-14 10:12:00 +00:00
Josef Zweck f4ca56052b Bump pylamarzocco to 2.0.10 (#148233) 2025-07-14 10:11:59 +00:00
J. Nick Koston 74f9549431 Fix UTF-8 encoding for REST basic authentication (#148225) 2025-07-14 10:11:58 +00:00
J. Nick Koston 9650727515 Fix REST sensor charset handling to respect Content-Type header (#148223) 2025-07-14 10:11:57 +00:00
ekutner 25f64a2f36 Do not specify the code_format when a code is not required (#148698) 2025-07-14 12:11:36 +02:00
TimL c965da6559 Bump pysmlight to v0.2.7 (#148101)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-14 10:09:19 +00:00
Sören Beye 9077965214 Squeezebox: Fix tracks not having thumbnails (#147187) 2025-07-14 10:09:18 +00:00
Sören Beye 2b7992e849 Squeezebox: Fix track selection in media browser (#147185) 2025-07-14 10:09:16 +00:00
Erik Montnemery dcbdce4b2b Improve docstrings of event helpers related to state changes (#148722) 2025-07-14 11:57:27 +02:00
Michael 50047f0a4e Add new device class for absolute humidity (#148567) 2025-07-14 11:46:17 +02:00
Fredrik Mårtensson 21b1122f83 Add test fixture for Tuya cover (#148660) 2025-07-14 11:43:02 +02:00
Jan Bouwhuis 09104fca4d Fix hide empty sections in mqtt subentry flows (#148692) 2025-07-14 11:26:37 +02:00
Jan Bouwhuis ad4e5459b1 Fix - only enable AlexaModeController if at least one mode is offered (#148614) 2025-07-14 11:25:22 +02:00
Joost Lekkerkerker 334d5f09fb Create Google Generative AI sub entries for an enabled entry (#148161)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-07-14 11:24:00 +02:00
Niccolò Maggioni 9f3d890e91 Bump pysnmp to v7 and brother to v5 (#129761)
Co-authored-by: Maciej Bieniek <bieniu@users.noreply.github.com>
2025-07-14 10:46:13 +02:00
Hessel eae9f4f925 Wallbox Integration - Add repair action for insufficient rights (#148610)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-14 10:30:48 +02:00
Brett Adams 5e50c723a7 Fix Charge Cable binary sensor in Teslemetry (#148675) 2025-07-14 10:29:29 +02:00
MattMorgan f761f7628a Minor update to keymitt_ble manifest. (#148708) 2025-07-14 08:50:25 +02:00
karwosts 26d71fcdba Fix derivative migration from 'none' unit_prefix (#147820) 2025-07-14 08:17:20 +02:00
Christopher Fenner e4359e74c6 Bump PyViCare to 2.50.0 (#148679) 2025-07-14 08:08:54 +02:00
Marc Mueller 5e30e6cb91 Update python-mystrom to 2.4.0 (#148682) 2025-07-14 08:02:43 +02:00
Simone Chemelli bc07030304 Bump aioamazondevices to 3.2.10 (#148709) 2025-07-14 01:18:35 +03:00
Shay Levy 25ba2437dd Bump aioshelly to 13.7.2 (#148706) 2025-07-14 01:15:50 +03:00
Kevin Worrel cfc7cfcf37 Bump screenlogicpy to 0.10.2 (#148703) 2025-07-13 11:44:55 -10:00
J. Diego Rodríguez Royo 74288a3bc8 Re-enable Home Connect updates automatically (#148657)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-13 22:46:42 +02:00
Marc Mueller b2fe17c6d4 Update PyMicroBot to 0.0.23 (#148700) 2025-07-13 22:12:00 +02:00
Paulus Schoutsen 611f86cf8c OpenAI: Add attachment support to AI task (#148676) 2025-07-13 21:51:46 +02:00
Paulus Schoutsen 23a8442abe Make attachments native to chat log (#148693)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-13 19:35:11 +02:00
Paulus Schoutsen f3ad6bd9b6 Report correctly when no funds for OpenAI (#148677) 2025-07-13 17:55:24 +02:00
Robert Meijers 023dd9d523 Discover Heos players using Zeroconf (#144763) 2025-07-13 09:56:31 -05:00
Steven Tegreeny f7d132b043 Add Z-WAVE discovery entry for the GE/JASCO in-wall smart fan control (#148246) 2025-07-13 13:46:37 +02:00
Brett Adams bb17f34bae Remove history first refresh from Teslemetry (#148531) 2025-07-13 13:01:38 +02:00
Erik Montnemery d22dd68119 Fix exception in EntityRegistry.async_device_modified (#148645) 2025-07-13 10:37:48 +02:00
Alex Leversen 4122af1d33 Bump pyoctoprintapi version to 0.1.14 (#148651) 2025-07-13 09:04:01 +02:00
J. Nick Koston 87fd45d4ab Add device_id parameter to ESPHome command calls for sub-device support (#148667) 2025-07-12 20:12:14 -10:00
asafhas 1c35aff510 Add configuration entities to Tuya multifunction alarm (#148556) 2025-07-13 07:55:37 +02:00
J. Nick Koston ab6ac94af9 Bump aioesphomeapi to 35.0.0 (#148666) 2025-07-12 18:49:59 -10:00
Marc Mueller d33f73fce2 Cleanup bleak warnings (#148665) 2025-07-12 16:26:31 -10:00
Marc Mueller fca6dc264f Update bleak to 1.0.1 (#147742)
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-12 13:11:37 -10:00
Amit Finkelstein 5287f4de81 Bump pyatv to 0.16.1 (#148659) 2025-07-12 21:52:26 +01:00
jvits227 ccc1f01ff6 Add lamp states to smartthings selector (#148302)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-12 20:51:09 +02:00
falconindy 531f1f1964 snoo: use correct value for right safety clip binary sensor (#148647) 2025-07-12 20:46:03 +02:00
Hessel 72dc2b15d5 Wallbox Add translation to exception config entry auth failed (#148649) 2025-07-12 20:40:39 +02:00
0xEF cf2ef4cec1 Bump nyt_games to 0.5.0 (#148654) 2025-07-12 20:30:26 +02:00
Hessel 28994152ae Wallbox - Add translation to exception (#148644) 2025-07-12 12:24:59 +02:00
AlCalzone ad881d892b Keep entities of dead Z-Wave devices available (#148611) 2025-07-11 23:45:57 +02:00
Paulus Schoutsen 87e641bf59 Update recommended model for Ollama to Qwen3 (#148627) 2025-07-11 16:15:13 -05:00
Paulus Schoutsen 6ecaca753d Update Anthropic max tokens to 3000 and recommended model to claude-3-5-haiku-latest (#148624)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 23:00:04 +02:00
Paulus Schoutsen 017cd0bf45 Update OpenAI conversation max tokens to 3000 (#148623)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 22:59:51 +02:00
Paulus Schoutsen 1920edd712 Update Google Generative AI Conversation max tokens to 3000 (#148625)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 13:10:12 -07:00
Erik Montnemery 2dca78efbb Improve entity registry handling of device changes (#148425) 2025-07-11 20:56:50 +02:00
Lưu Quang Vũ e0179a7d45 Fix Google Cloud 504 Deadline Exceeded (#148589) 2025-07-11 11:53:38 -07:00
Abílio Costa d393d5fdbb Use non-autospec mock for Reolink's util and view tests (#148579) 2025-07-11 16:27:06 +02:00
Joost Lekkerkerker a34264f345 Add SmartThings RVC fixture (#148552) 2025-07-11 14:01:11 +02:00
epenet 73c9d99abf Add tuya snapshot tests for wxkg category (#148609) 2025-07-11 13:55:01 +02:00
Avi Miller ec5991bc68 Add support for LIFX 26"x13" Ceiling (#148459)
Signed-off-by: Avi Miller <me@dje.li>
2025-07-11 13:42:50 +02:00
Arjan 87aecf0ed9 Linkplay: add select entity to set Audio Output hardware (#143329) 2025-07-11 12:45:21 +02:00
Norbert Rittel 0b2ce73eac Fix description of html5.dismiss action (#148591) 2025-07-11 11:43:29 +02:00
Hessel 22828568e2 Wallbox Integration - Type Config Entry (#148594) 2025-07-11 11:37:24 +02:00
Jan Bouwhuis 5a4c837328 Fix entity_id should be based on object_id the first time an entity is added (#148484) 2025-07-11 11:19:54 +02:00
Jan-Philipp Benecke cd73824e3e Ensure response is fully read to prevent premature connection closure in rest command (#148532) 2025-07-11 09:06:18 +02:00
Robin Thoni 32121a073c Add release URL for Tessie updates (#148548)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-11 07:56:23 +02:00
Matrix c6c622797d Add YoLink YS7A12 support (#148588) 2025-07-11 07:55:13 +02:00
jlestel 193b32218f Fix domain validation in Tesla Fleet (#148555) 2025-07-11 00:41:03 +01:00
Paulus Schoutsen e6702d2392 Serialize Object Selector correctly if a field is required (#148577) 2025-07-10 22:45:56 +01:00
Paulus Schoutsen 19b3b6cb28 Add attachment support to Google Gemini (#148208) 2025-07-10 23:45:11 +02:00
Harry Heymann a2220cc2e6 Add LED intensity custom attributes for Matter Inovelli Dimmers (#148074)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-10 23:36:51 +02:00
J. Nick Koston 18a89d5815 Bump aiohttp to 3.12.14 (#148565) 2025-07-10 23:10:48 +02:00
Bram Kragten 6eeec948a8 Update frontend to 20250702.2 (#148573) 2025-07-10 23:09:47 +02:00
Paulus Schoutsen 0e09a47476 Add OpenAI AI Task entity (#148295) 2025-07-10 23:08:56 +02:00
karwosts f0a636949a Support all Energy units in Energy integration (#148566) 2025-07-10 19:29:48 +01:00
Allen Porter d15baf9f9f Drop homeassistant agent and assist_pipeline migration code (#147968)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2025-07-10 17:30:54 +02:00
epenet 4f27058a68 Add fault binary sensors to tuya dehumidifer (#148485) 2025-07-10 16:15:07 +02:00
epenet 058e1ede10 Add tuya snapshot tests for wsdcg and zndb category (#148554) 2025-07-10 15:55:22 +02:00
epenet d23321cf54 Add tuya snapshot tests for dlq category (#148549) 2025-07-10 15:55:03 +02:00
epenet eb20292683 Move tuya models to separate module (#148550) 2025-07-10 15:54:05 +02:00
Norbert Rittel 12f913e737 Improve names and descriptions of rainmachine.push_weather_data (#148534) 2025-07-10 13:38:42 +02:00
tronikos 7e405d4ddb 100% test coverage in Google Assistant SDK (#148536) 2025-07-10 13:21:19 +02:00
Nathan Spencer 2829cc1248 Add visits today sensor for pets (#147459) 2025-07-10 11:24:54 +01:00
Matrix 8881919efd Add YS8009 support to Yolink (#148538) 2025-07-10 12:10:15 +02:00
Åke Strandberg a00f61f7be Remove vg argument from miele auth flow (#148541) 2025-07-10 12:09:24 +02:00
Josh Barnard c37b0a8f1d Adding precision for voltage and wind speed sensors in Ecowitt (#148462) 2025-07-10 11:21:44 +02:00
Kristof Mariën c75b34a911 Fix for Renson set Breeze fan speed (#148537) 2025-07-10 10:52:03 +02:00
Denis Shulyaka cbe2fbdc34 Encrypted reasoning items support for OpenAI Conversation (#148279) 2025-07-10 10:46:10 +02:00
J. Diego Rodríguez Royo c2bc4a990e Use the link to the issue instead of creating new issues at Home Connect (#148523) 2025-07-10 09:35:30 +02:00
J. Diego Rodríguez Royo 49baa65f61 Add Home Connect resume command button when an appliance is paused (#148512) 2025-07-10 00:26:13 +02:00
Matthias Alphart 24a7ebd2bb Move KNXModule class to separate module (#146100) 2025-07-09 23:51:40 +02:00
Noah Husby a4b9efa1b1 Support AM/FM channel name in Russound RIO (#148421) 2025-07-09 23:23:04 +02:00
Manu 15544769b6 Add action for activity reactions to Bring! (#138175) 2025-07-09 23:08:24 +02:00
Tsvi Mostovicz 3307132441 Jewish calendar: appropriate polling for sensors (2/3) (#144906)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-09 22:50:09 +02:00
Thomas55555 da255af8de Bump aioautomower to 1.2.2 (#148497) 2025-07-09 22:02:31 +02:00
Maciej Bieniek a7e879714b Add water flow sensor to IMGW PIB integration (#148517) 2025-07-09 21:59:08 +02:00
Michael 8aaf5756e0 Add workaround for sub units without main device in AVM Fritz!SmartHome (#148507) 2025-07-09 21:44:50 +02:00
Maciej Bieniek ce5f06b1e5 Add new sensors to GIOS integration (#148510) 2025-07-09 21:43:02 +02:00
Denis Shulyaka e42ca06173 Bump openai to 1.93.3 (#148501) 2025-07-09 21:41:50 +02:00
Thomas55555 2807f057de Fix flaky test in Husqvarna Automower (#148515) 2025-07-09 22:34:37 +03:00
Mickael Goubin 283d0d16c0 Linkplay - when grouped, the first media player returned is the coordinator (#146295)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-09 21:33:15 +02:00
Michael 84959a0077 Add platinum quality scale to Pegel Online (#131382) 2025-07-09 21:33:07 +02:00
Michael e012196af8 Bump aioimmich to 0.10.2 (#148503) 2025-07-09 21:22:31 +02:00
Maciej Bieniek 5d43938f0d Bump imgw_pib to version 1.2.0 (#148511) 2025-07-09 21:20:38 +02:00
Nathan Spencer cbdc8e3800 Bump pylitterbot to 2024.2.2 (#148505) 2025-07-09 20:45:45 +02:00
Jan-Philipp Benecke 1b5bbda6b0 Add response headers to action response of rest command (#148480) 2025-07-09 20:37:00 +02:00
G Johansson 57083d877e Add repairs from issue registry to integration diagnostics (#148498) 2025-07-09 18:52:16 +01:00
Petro31 3045f67ae5 Modernize binary sensor template tests (#148367) 2025-07-09 17:49:28 +02:00
Joost Lekkerkerker 6f31057d30 Rework Snapcast config flow tests (#148434) 2025-07-09 16:01:17 +01:00
epenet 511ffdc03c Add tuya snapshot tests for kg category (#148492) 2025-07-09 16:20:29 +02:00
epenet 59fe6da47c Adjust tuya test docstrings (#148493) 2025-07-09 15:59:43 +02:00
epenet e1cdc1af1c Add diagnostics tests to tuya (#148489) 2025-07-09 15:47:48 +02:00
epenet f6e2b962fd Use SnapshotAssertion in lifx diagnostics tests (#148491) 2025-07-09 15:30:17 +02:00
epenet fe0ce9bc6d Use real product_id in tuya fixture (#148415) 2025-07-09 14:44:18 +02:00
Robert Resch b083919031 Revert "Deprecate hddtemp" (#148482) 2025-07-09 13:53:15 +02:00
epenet ef2e699d2c Add tuya snapshot tests for curtain switch (#148465)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-09 13:05:53 +02:00
Raphael Hehl 71df8ffe6e Bump uiprotect to version 7.14.2 (#148453) 2025-07-09 12:37:45 +02:00
Joakim Sørensen 98604f09fc Bump hass-nabucasa from 0.105.0 to 0.106.0 (#148473) 2025-07-09 12:30:43 +02:00
Artur Pragacz b97b04661e Improve logging in bootstrap (#148469) 2025-07-09 11:29:56 +01:00
Andrew Jackson 828037de1f Set quality scale on Mealie to silver (#148467) 2025-07-09 11:25:56 +01:00
Norbert Rittel 659504c91f Fix friendly name of increased_non_neutral_output in zha (#148468) 2025-07-09 12:24:44 +02:00
Franck Nijhof 434ac421d1 Tiny tweaks to task form (#148475) 2025-07-09 12:04:00 +02:00
Denis Shulyaka de849b920a Enable web search for OpenAI reasoning models (#148393) 2025-07-09 10:54:49 +02:00
Artur Pragacz e387d4834f Fix unloading update listener in Unifi (#148471) 2025-07-09 10:44:21 +02:00
Artur Pragacz 39ed877a17 Fix unloading update listener in Axis (#148470) 2025-07-09 10:43:55 +02:00
epenet 13d05a338b Sort tuya definitions by category (#148472) 2025-07-09 10:42:55 +02:00
Avi Miller cb2095bcbe Bump aiolifx to 1.2.1 (#148464)
Signed-off-by: Avi Miller <me@dje.li>
2025-07-09 09:43:29 +02:00
Norbert Rittel 6de630ef3e Fix sentence-casing of trigger subtypes in xiaomi_ble (#148463) 2025-07-09 10:43:22 +03:00
Rico Hageman a02359b25d Add dew point to Awair integration (#148403) 2025-07-09 09:28:55 +02:00
Oliver Heesakkers afcd991262 Handle processing errors when writing to Zabbix (#148449) 2025-07-09 08:01:54 +02:00
J. Nick Koston 6b5b35fece Bump aioesphomeapi to 34.2.0 (#148456) 2025-07-08 22:34:35 -06:00
Norbert Rittel ed8effa162 Fix spelling of "non-existent", "non-blocking" and "currently used" (#148440) 2025-07-08 22:58:39 +01:00
Simone Chemelli 70c01efe57 Update Alexa Devices quality scale to silver (#148435) 2025-07-08 17:58:35 +01:00
Norbert Rittel ebffaed0bd Fix spelling of "non-resettable" in iskra (#148417) 2025-07-08 19:45:39 +03:00
Norbert Rittel ab1e323d49 Fix spelling of "non-volatile memory" in z-wave_js (#148422) 2025-07-08 19:44:11 +03:00
Simone Chemelli 6e63c17b39 Improve exceptions in Alexa Devices (#148260) 2025-07-08 17:58:48 +02:00
Petro31 a35299d94c Add preview tests for number and sensor (#148426) 2025-07-08 16:04:06 +01:00
Tucker Kern c97ad9657f Add metadata support to Snapcast media players (#132283)
Co-authored-by: Joostlek <joostlek@outlook.com>
2025-07-08 16:58:32 +02:00
Erik Montnemery aab8908af8 Improve entity registry tests related to config entries in devices (#148399)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-08 16:24:06 +02:00
Maciej Bieniek ae7bc14059 Make the update interval a property of the NextDNS coordinator class (#148410) 2025-07-08 16:14:02 +02:00
Maciej Bieniek 546f6afac2 Bump gios to version 6.1.1 (#148414) 2025-07-08 16:11:15 +02:00
epenet 8ccd097e98 Add tuya snapshot tests for bladeless tower fan (#148401) 2025-07-08 14:50:49 +02:00
epenet 77ae6048ef Add tuya snapshot tests for gas leak sensor (#148400) 2025-07-08 14:49:52 +02:00
Abílio Costa 420d1e169d Fix hassfest command in copilot-instructions (#148405) 2025-07-08 14:49:09 +02:00
hanwg 91b8262128 Update strings for Telegram bot (#148409) 2025-07-08 14:48:44 +02:00
Ludovic BOUÉ e393929014 Matter EVSE StateOfCharge (#148213) 2025-07-08 14:28:13 +02:00
Samuel Xiao 11938762eb Fix Switchbot cloud plug mini current unit Issue (#148314) 2025-07-08 13:57:30 +02:00
Simone Chemelli 94862e6a50 Update Alexa Devices quality scale (#147259) 2025-07-08 13:49:00 +02:00
epenet 1a8d4c5041 Add tuya snapshot tests for Avatto WT598 thermostat (#148398) 2025-07-08 13:40:16 +02:00
Erik Montnemery b775ba2955 Do not add switch_as_x config entry to source device (#148346) 2025-07-08 13:23:28 +02:00
Josef Zweck d2bf27195a Bump pylamarzocco to 2.0.11 (#148386) 2025-07-08 13:06:43 +02:00
Josef Zweck 824006729b Create own clientsession for lamarzocco (#148385) 2025-07-08 13:06:05 +02:00
Joakim Plate a7cba2b9bb Handle binary coils with non default mappings in nibe heatpump (#148354) 2025-07-08 13:05:16 +02:00
Joost Lekkerkerker bd1917c9b6 Bump pySmartThings to 3.2.7 (#148394) 2025-07-08 12:34:51 +02:00
Josef Zweck 7541e266da Make api_version runtime_data in pi_hole (#148238) 2025-07-08 11:46:13 +02:00
Manu f58c76c883 Fix error when personalDetail is missing in PlayStation Network integration (#148389) 2025-07-08 10:16:10 +02:00
Simone Chemelli a77a071954 Bump aioamazondevices to 3.2.8 (#148365)
Co-authored-by: Joakim Plate <elupus@ecce.se>
2025-07-08 10:14:41 +02:00
Jiacheng Ma 0dc145aee3 Fix tuya vacuum return_to_base function (#144362)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-08 10:03:35 +02:00
Joakim Plate ac5d4f4a81 Fix CI issues due to nibe heatpump (#148388) 2025-07-08 09:17:27 +02:00
Noah Husby d44b822295 Add play media support to Russound RIO (#148240) 2025-07-08 08:51:18 +02:00
Paulus Schoutsen 6d0891e970 OpenAI: Extract file attachment logic (#148288) 2025-07-08 08:01:49 +02:00
Avi Miller 73730e3eb3 Bump aiolifx to 1.2.0 (#148382) 2025-07-08 07:57:41 +02:00
Alexandre CUER 87b00fdc7b Emoncms add reconfigure flow (#145108)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-08 07:28:16 +02:00
hahn-th f780b9763d Add support for ELV-SH-CTV Sensor to homematicip_cloud (#143737) 2025-07-08 07:24:55 +02:00
Joakim Sørensen 7a7e16bbb6 Change how subscription information is fetched (#148337)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-08 06:52:41 +02:00
J. Nick Koston dcf8d7f74d Track ESPHome entities by (device_id, key) to support sub-devices with overlaping names (#148297) 2025-07-08 06:41:20 +02:00
Ville Skyttä ccc80c78a0 Add huawei_lte device registry upnp udn connection (#148370) 2025-07-08 06:32:29 +02:00
epenet b0f7c985e4 Add snapshots tests for new platforms in tuya (#148334) 2025-07-08 06:25:53 +02:00
Joakim Sørensen 7875290256 Adds claude-code feature to the devcontainer (#148338) 2025-07-08 06:24:31 +02:00
Ruben van Dijk f478812568 Allow multiple set-cookie headers with hassio ingress (#148148) 2025-07-08 06:13:08 +02:00
Joakim Plate 9ce03c79f0 Switch to box default for numbers in nibe_heatpump integration (#148364) 2025-07-08 06:09:22 +02:00
Joakim Plate 19951d9403 Handle when heat pump rejects same value writes in nibe_heatpump (#148366) 2025-07-08 06:07:41 +02:00
G Johansson 4b8dcc39b4 Bump holidays to 0.76 (#148363) 2025-07-08 06:05:18 +02:00
Joakim Plate b151a9bf75 Add missing connection for gardena ble device (#148376) 2025-07-08 06:02:56 +02:00
Manu e3cc4acdc6 Remove deprecated max_health, habits and rewards sensors from Habitica integration (#148377) 2025-07-08 05:57:46 +02:00
Ville Skyttä fc53ddb3b4 Remove huawei_lte notify related timeout suppression (#148373) 2025-07-08 00:08:43 +02:00
hanwg 0409c05265 Add basic authentication option for Telegram bot (#148247) 2025-07-07 22:08:49 +02:00
jlanchares 9d2ffa6372 Goodwe TCP support (port 502) (#147900) 2025-07-07 19:37:20 +02:00
Joakim Plate 5c4f166f6f Add translation for write failures in nibe_heatpump (#148352) 2025-07-07 18:48:34 +02:00
Erik Montnemery 6396f54e0d Move zone conditions to the zone integration (#148157) 2025-07-07 18:27:44 +02:00
Denis Shulyaka 090b8f0659 Bump openai to 1.93.0 (#148350) 2025-07-07 18:07:28 +02:00
G Johansson a46cc82916 Don't log deprecation warning in vacuum until after entity added to hass (#147959)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-07 16:52:29 +02:00
J. Nick Koston 8007bf1c31 Fix REST sensor charset handling to respect Content-Type header (#148223) 2025-07-07 14:32:58 +01:00
Manu c296e1f818 Remove deprecated register_static_path method (#148303)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-07 14:27:19 +01:00
Retha Runolfsson 799dc97d4a Bump pyswitchbot to 0.68.1 (#148335) 2025-07-07 14:26:23 +01:00
Mark Adkins e4c9df6d98 Bump sharkiq to 1.1.1 (#148244) 2025-07-07 15:18:15 +02:00
J. Nick Koston 03e295ace0 Restore httpx compatibility for non-primitive REST query parameters (#148286) 2025-07-07 08:01:48 -05:00
Abílio Costa b71bcb002b Move target selector extractor method to common module (#148087) 2025-07-07 13:48:48 +01:00
Norbert Rittel c60e06d32f Fix missing sentence-casing and spelling of "REST" in iskra (#148330) 2025-07-07 14:06:27 +02:00
Norbert Rittel 448d6041e5 Fix missing sentence-casing in wallbox (#148332) 2025-07-07 14:06:13 +02:00
tronikos 15c9ddea78 Bump gassist-text to 0.0.14 (#148312) 2025-07-07 04:10:50 -07:00
Erik Montnemery 0c783e87d1 Fix homee test (#148322) 2025-07-07 11:59:35 +02:00
Franck Nijhof 42b50c71ec Revert "Add tests for Sonos Alarms" (#148319) 2025-07-07 11:54:36 +02:00
Maciej Bieniek 991864a8af Bump gios to version 6.1.0 (#148274) 2025-07-07 11:43:39 +02:00
Arie Catsman b79e770bcf Bump pyenphase to 2.2.1 (#148292) 2025-07-07 11:40:48 +02:00
Shay Levy f02c1b0d4e Bump aiowebostv to 0.7.4 (#148273) 2025-07-07 11:37:39 +02:00
Norbert Rittel a5d6bfd1b3 Reword option for 'Main' control in wled (#148309) 2025-07-07 10:30:39 +02:00
Norbert Rittel 21f6bf3914 Improve translation_key of EnergyEvseSupplyStateSensor in matter (#148280) 2025-07-07 10:26:20 +02:00
Hessel 0bce01da0b Address some Wallbox quality scale issues (#148200) 2025-07-07 10:09:07 +02:00
Ludovic BOUÉ 6351c3302e Matter OperationalState CountdownTime (#147705)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-06 23:40:05 +02:00
J. Nick Koston 2ea20ee2ab Fix UTF-8 encoding for REST basic authentication (#148225) 2025-07-06 12:40:19 -05:00
Paulus Schoutsen 008e2a3d10 Add attachment support to AI task (#148120) 2025-07-06 19:33:41 +02:00
Joakim Sørensen 699c60f293 Add the current version to the starting log to aid troubleshooting (#148271) 2025-07-06 19:06:27 +02:00
karwosts 404d17efca Translate number selector unit for utility_meter (#148276) 2025-07-06 18:36:38 +02:00
Allen Porter 4b5c04b2f0 Add AI Task support in Ollama (#148226)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-07-06 16:56:37 +02:00
Paulus Schoutsen 8cb9cadce9 Extract files_to_prompt from Gemini action (#148203)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-07-06 15:15:38 +02:00
Robin Thoni 075efb469a Bump sfrbox-api to 0.0.12 (#148259)
Co-authored-by: epenet <6771947+epenet@users.noreply.github.com>
2025-07-06 13:08:27 +02:00
starkillerOG 0e7a4c91bf bump motionblinds to 0.6.29 (#148265) 2025-07-06 12:38:57 +02:00
Norbert Rittel 4ee930507d Fix typo in wrong_hub abort message of homee (#148261) 2025-07-06 12:11:44 +02:00
Markus Adrario 1b11ac9123 Add Homee general tests (#137128) 2025-07-06 12:05:43 +02:00
Norbert Rittel 8d7e387b46 Deduplicate strings in nordpool actions (#148258) 2025-07-06 11:23:57 +02:00
Joakim Sørensen 70e9c4e2d0 Add reauth flow to the Traccar Server integration (#148236)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-07-06 08:09:59 +02:00
Josef Zweck 26de1ea37b Update strings in pihole (#148234)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-05 23:14:59 +01:00
Josef Zweck 3ffcfa42ba Bump pylamarzocco to 2.0.10 (#148233) 2025-07-05 23:34:23 +02:00
G Johansson e304022560 Add service in Nord Pool for fetching normalized price indices (#147979) 2025-07-05 21:39:48 +02:00
G Johansson 160e4e4d05 Block options flow for default hostname in dnsip (#148221) 2025-07-05 21:36:15 +02:00
Noah Husby eb0f11a859 Bump aiorussound to 4.8.0 (#148235) 2025-07-05 21:13:48 +02:00
TheJulianJES 295b15ace9 Change ZHA string "autoshutdown" to "auto-shutdown" (#148230) 2025-07-05 20:23:03 +02:00
Pete Sage d997efc500 Add tests for Sonos Alarms (#146308) 2025-07-05 17:39:52 +02:00
Jack Powell 736865c130 Add binary sensor platform to PlayStation Network Integration (#147639) 2025-07-05 17:27:23 +02:00
Paulus Schoutsen 4f4ec6f41a Add Google Gen AI structured data support (#148143) 2025-07-05 08:22:17 -07:00
Luka Matijević 33d05d99eb Fix Miele hob plate power step typo (#148214) 2025-07-05 16:44:41 +02:00
Guido Schmitz 8d82e34ba5 Make connected stations coordinator a dict in devolo Home Network (#147042) 2025-07-05 11:42:15 +02:00
Sören Beye 2ea09ff37a Squeezebox: Fix track selection in media browser (#147185) 2025-07-05 11:36:45 +02:00
Sören Beye 676567f471 Squeezebox: Fix tracks not having thumbnails (#147187) 2025-07-05 11:31:30 +02:00
Denis Shulyaka 3151713a34 Replace dot with underscores for NamespacedTool and ActionTool (#147764) 2025-07-05 11:27:27 +02:00
David Rapan 23773759ea Starlink's last boot time occasional, back and forth changes by 1 s fix (#147969) 2025-07-05 11:18:54 +02:00
Norbert Rittel ef255788d2 Make lat/long attribute names localizable in dwd_weather_warnings (#147988) 2025-07-05 11:01:27 +02:00
Norbert Rittel b72536acfa Make "autorelock" consistent across integrations in matter (#148023) 2025-07-05 10:59:57 +02:00
tronikos fea7dc7eba Remember Opower utility and username on config flow errors (#148097) 2025-07-05 10:26:15 +02:00
Markus Adrario f1698cdb75 Add reauth flow to homee (#147258) 2025-07-05 10:26:04 +02:00
HarvsG 1b21c986e8 Enable Pihole API v6 (#145890)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Josef Zweck <josef@zweck.dev>
2025-07-05 10:21:32 +02:00
Paulus Schoutsen 1e164c94b1 Include path when media source file can be accessed on disk (#148180) 2025-07-05 10:14:52 +02:00
epenet 7898e3f0fb Add initial tuya snapshot tests (#148034)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-05 09:54:54 +02:00
Norbert Rittel 0d54e75940 Fix spelling of "auto" prefixes in zha (#148022) 2025-07-05 09:34:24 +02:00
karwosts 3cfff4de3a Add a preview to history_stats options flow (#145721) 2025-07-05 09:09:02 +02:00
Andrey Kupreychik 275d390a6c Add reconfiguration support for keenetic_ndms2 integration (#142191)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-05 08:52:43 +02:00
Matt Zimmerman e63e6a6072 Bump python-smarttub to 0.0.43 (#147317) 2025-07-05 08:08:52 +02:00
Josef Zweck e592e565c0 Make ready time sensors unavailable instead in lamarzocco (#147985) 2025-07-05 07:20:42 +02:00
Arie Catsman 12b90f3c8e Add debug logs to trace enphase auth process at load. (#148117) 2025-07-04 23:14:51 +01:00
epenet 76be2fdba1 Improve (and align) deprecation messages (#147948) 2025-07-05 00:02:36 +02:00
Thomas55555 528daad854 Constant polling for Husqvarna Automower (#147957) 2025-07-04 23:42:17 +02:00
Ville Skyttä dcad5bbe04 Simplify unnecessary re.findall calls (#147907)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-04 23:26:36 +02:00
Michael Podhorodecki ca85ffc068 Add Deadlock (SecureMode) support to the Yale Access Bluetooth integration (#144107)
Co-authored-by: J. Nick Koston <nick+github@koston.org>
Co-authored-by: J. Nick Koston <nick@koston.org>
2025-07-04 23:07:13 +02:00
Kevin Stillhammer 9a5cbe483b Remove obsolete string unit_system in here_travel_time (#146656) 2025-07-04 23:06:47 +02:00
Pete Sage be7735964b Sonos remove unneeded mocking from test (#147064) 2025-07-04 23:02:38 +02:00
Guido Schmitz 79683c8267 Log availability of devices in devolo Home Control (#147091) 2025-07-04 22:59:38 +02:00
Andre Lengwenus 8f24ebe967 Remove deprecated support for lock sensors and corresponding actions in lcn (#147143) 2025-07-04 22:55:20 +02:00
Andre Lengwenus 520d92b902 Use brightness stored in hardware device when switching LCN lights (#147375) 2025-07-04 22:53:11 +02:00
karwosts 22e46d9977 Make derivative sensor unavailable when source sensor is unavailable (#147468) 2025-07-04 22:48:48 +02:00
TimL 57c04f3a56 Bump pysmlight to v0.2.7 (#148101)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-04 22:35:44 +02:00
Franck Nijhof c0368f2448 Add weekdays to time trigger (#147505)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-04 22:31:11 +02:00
Paulus Schoutsen 6a7f4953cd Fix media selector validation (#147855)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-04 22:30:35 +02:00
Joakim Plate 470baa782e Add zeroconf discovery to philips_js (#147913)
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-07-04 22:24:40 +02:00
Sid 6e607ffa01 Add reconfigure flow to eheimdigital (#147930) 2025-07-04 22:18:13 +02:00
Wesley Vos f5b51c6cf0 Add serial_numbers to device_info of inverters, encharge and enpower (#147964) 2025-07-04 22:04:48 +02:00
Franck Nijhof 5d6b02f470 2025.7.1 (#148171) 2025-07-04 22:00:18 +02:00
Hessel bfccee17ef Wallbox, Improve test setup (#148036) 2025-07-04 21:56:44 +02:00
Erik Montnemery b6b6de24ac Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in cambridge_audio (#148133) 2025-07-04 21:54:11 +02:00
Thomas55555 70624f72b6 Additional icon translation for Husqvarna Automower (#148167) 2025-07-04 21:51:47 +02:00
Franck Nijhof a274961593 Bump version to 2025.7.1 2025-07-04 19:22:41 +00:00
Michael Freeman 4e163c4591 Bump venstarcolortouch to 0.21 (#148152) 2025-07-04 19:21:33 +00:00
Marc Mueller 3ffec2a655 [ci] Fix typing issue with aiohttp and aiosignal (#148141) 2025-07-04 19:21:31 +00:00
Bram Kragten c646658643 Update frontend to 20250702.1 (#148131) 2025-07-04 19:21:30 +00:00
Simone Chemelli 342b4c3442 Bump aioamazondevices to 3.2.3 (#148082) 2025-07-04 19:21:28 +00:00
Arie Catsman eb58c10e5e Cancel enphase mac verification on unload. (#148072) 2025-07-04 19:21:27 +00:00
Arie Catsman f42e7d982f Bump pyenphase to 2.2.0 (#148070) 2025-07-04 19:21:25 +00:00
hanwg 898ef43750 Fix Telegram bots using plain text parser failing to load on restart (#148050) 2025-07-04 19:21:24 +00:00
Joakim Sørensen f806e6ba49 Bump hass-nabucasa from 0.104.0 to 0.105.0 (#148040) 2025-07-04 19:21:23 +00:00
Marcel van der Veldt c23bfb1b39 Fix state being incorrectly reported in some situations on Music Assistant players (#147997) 2025-07-04 19:21:22 +00:00
Robert Svensson a2ffe32b02 Bump aiounifi to v84 (#147987) 2025-07-04 19:21:21 +00:00
puddly 0f32b6331d Bump ZHA to 0.0.62 (#147966) 2025-07-04 19:21:19 +00:00
epenet 9a4959560e Fix missing port in samsungtv (#147962)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-04 19:21:18 +00:00
Thomas55555 41ab7b346c Set timeout for remote calendar (#147024) 2025-07-04 19:21:17 +00:00
Thomas55555 c61cd422d1 Delete stale icon translation in Husqvarna Automower (#148168) 2025-07-04 20:47:32 +02:00
karwosts 0b2db2510f Support translating number selector UoM (#148162) 2025-07-04 21:06:33 +03:00
Erik Montnemery bb1e263149 Remove cv.SUN_CONDITION_SCHEMA (#148158) 2025-07-04 18:34:55 +02:00
Michael Freeman 8e6b9c04f6 Bump venstarcolortouch to 0.21 (#148152) 2025-07-04 17:46:59 +02:00
Greg Dowling cf931a75a7 Remove incorrect use of via_device in roon component (#146572) 2025-07-04 17:04:16 +02:00
Thomas55555 3250a2fb46 Bump aioautomower to 1.2.0 (#148078) 2025-07-04 16:43:36 +02:00
Franck Nijhof 6235adc69a Fix flaky emulated_roku/test_binding.py::test_events_fired_properly test (#148069) 2025-07-04 16:42:24 +02:00
Simone Chemelli 5d258c2f82 Bump aioamazondevices to 3.2.3 (#148082) 2025-07-04 16:33:16 +02:00
hanwg cc2aca2c2c Fix Telegram bots using plain text parser failing to load on restart (#148050) 2025-07-04 16:32:46 +02:00
Erik Montnemery 04bd1967a7 Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in apple_tv (#148132) 2025-07-04 16:31:44 +02:00
Erik Montnemery a046530eaf Replace MediaPlayerState.STANDBY with MediaPlayerState.IDLE in mediaroom (#148135) 2025-07-04 16:30:03 +02:00
Erik Montnemery 631523dfaf Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in lookin (#148134) 2025-07-04 16:27:54 +02:00
Erik Montnemery dc20375506 Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in snapcast (#148138) 2025-07-04 16:27:33 +02:00
Erik Montnemery 811f085556 Replace MediaPlayerState.STANDBY with MediaPlayerState.IDLE in androidtv (#148130) 2025-07-04 16:27:01 +02:00
Erik Montnemery fd86a43b28 Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in ps4 (#148136) 2025-07-04 16:25:59 +02:00
Bram Kragten b7f830523e Update frontend to 20250702.1 (#148131) 2025-07-04 16:25:28 +02:00
Erik Montnemery 3f752e13ff Replace MediaPlayerState.STANDBY with MediaPlayerState.OFF in roku (#148137) 2025-07-04 16:23:18 +02:00
Marc Mueller 783102f2f6 [ci] Fix typing issue with aiohttp and aiosignal (#148141) 2025-07-04 16:22:38 +02:00
Erik Montnemery 8ce30d9559 Add tests of legacy entity without platform writing state (#148109) 2025-07-04 16:21:48 +02:00
Paulus Schoutsen cde17fc0ca add extra tests for media source URI parsing (#148114) 2025-07-04 16:21:11 +02:00
David Knowles 83ae5f52da Bump pydrawise to 2025.7.0 (#148088) 2025-07-04 16:20:24 +02:00
tronikos 1cb9767bb8 Enable strict typing for Opower (#148096) 2025-07-04 16:19:04 +02:00
tronikos e98fe7dc9c Add data_description to Opower forms (#148099) 2025-07-04 16:17:41 +02:00
tronikos 40ec51c0a3 Add redirect URL in Google Assistant SDK setup (#148076) 2025-07-04 16:17:10 +02:00
Harry Heymann 40fcc3b75b Rename Matter device conversion methods (#148090) 2025-07-04 16:13:40 +02:00
Erik Montnemery 510fd09163 Allow core integrations to describe their conditions (#147529)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-04 16:03:42 +02:00
epenet e47bdc06a0 Set docstyle convention to google in ruff (#148142) 2025-07-04 16:00:37 +02:00
Allen Porter b3d9908cd9 Add AI task structured output (#148083)
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-07-04 15:03:34 +02:00
Erik Montnemery 99d63c49bb Add comment about error assigning in frame.report_usage (#148105) 2025-07-04 14:47:01 +02:00
Robin Thoni 4be2e84ce6 Add backward compatibility with older versions of Traccar server (#146639)
Co-authored-by: Joakim Sørensen <joasoe@proton.me>
2025-07-04 14:36:25 +02:00
Allen Porter 1fc624c7a7 Update LLM selector serializer to support ObjectSelector fields and arrays (#148094) 2025-07-04 13:05:16 +02:00
tronikos 8641a2141c Fix has-entity-name and entity-translations in Opower (#148098) 2025-07-04 10:10:21 +02:00
Paulus Schoutsen 04cc451c76 Add AI Task platform to Google Gen AI (#146766) 2025-07-03 23:36:34 -07:00
Erik Montnemery a3b03caead Deduce integration from module in loader.async_get_issue_tracker (#148017) 2025-07-04 07:55:20 +02:00
Franck Nijhof 49d1d781b8 Fix ezviz test timeout (#148066) 2025-07-03 23:11:54 +02:00
HeroOfCanton16 11c75d7ef2 Add sensor attributes restore to modem_callerid integration (#147753) 2025-07-03 22:10:26 +01:00
Arie Catsman 8ef6b62d9a Cancel enphase mac verification on unload. (#148072) 2025-07-03 22:06:38 +02:00
tronikos b410b414ec Add reconfigure flow in Android TV Remote (#148044) 2025-07-03 22:00:07 +02:00
Arie Catsman e5f7421703 Bump pyenphase to 2.2.0 (#148070) 2025-07-03 21:04:13 +02:00
Marc Mueller 8330ae2d3a Update license-expression to 30.4.3 (#147941) 2025-07-03 20:22:10 +02:00
tronikos 4b162f09bd Bump androidtvremote2 to 0.2.3 (#148042) 2025-07-03 20:15:47 +02:00
tronikos 9c558fabcd Use AndroidTVRemoteConfigEntry (#148046) 2025-07-03 20:15:36 +02:00
tronikos 5f9cc0a5f6 Add data_description to forms in Android TV Remote (#148045)
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Artem Draft <Drafteed@users.noreply.github.com>
2025-07-03 20:13:44 +02:00
Erik Montnemery bc4a322e81 Improve helpers.frame.report_usage when called from outside the event loop (#148021) 2025-07-03 20:12:52 +02:00
Jeef b999c5906e Bump weatherflow4py to 1.4.1 (#148054) 2025-07-03 20:11:33 +02:00
Erik Montnemery d2825e1c80 Don't gather TRIGGER_PLATFORM_SUBSCRIPTIONS (#147954)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-03 19:33:28 +02:00
epenet 419e4f3b1d Remove unused module in tuya tests (#148058) 2025-07-03 19:14:27 +02:00
Thomas55555 4a937d2452 Set timeout for remote calendar (#147024) 2025-07-03 10:08:58 -07:00
Noah Husby 01b4a5ceed Bump aiorussound to 4.7.0 (#148057) 2025-07-03 19:04:18 +02:00
Abílio Costa 4e71745c62 Set assist_satellite preannounce default to True (#148060) 2025-07-03 18:41:08 +02:00
Franck Nijhof 6a88ee7a8f Add Task issue form (#148038) 2025-07-03 18:27:51 +02:00
J. Nick Koston 3c4ecffa1b Bump aioesphomeapi to 34.1.0 (#148048) 2025-07-03 17:33:44 +02:00
Joakim Sørensen 244e0f5ea8 Bump hass-nabucasa from 0.104.0 to 0.105.0 (#148040) 2025-07-03 14:24:51 +02:00
epenet a656b6e26a Use HassKey in media_source (#148011) 2025-07-03 09:56:46 +02:00
epenet 691681a78a Move medcom_ble coordinator to separate module (#148009) 2025-07-03 09:32:57 +02:00
epenet 3bc00824e2 Use runtime_data in mystrom (#148020) 2025-07-03 09:27:38 +02:00
epenet 7d36a2e3a7 Move meteoclimatic coordinator to separate module (#148018) 2025-07-03 09:26:24 +02:00
Norbert Rittel b1e3561ead Clarify description of autorelock setting in zwave_js (#148019) 2025-07-03 09:23:45 +02:00
epenet bfc814c839 Use entry.async_on_unload in meteo_france (#148015) 2025-07-03 09:22:27 +02:00
epenet 5008151688 Use entry.async_on_unload in monoprice (#148016) 2025-07-03 09:20:50 +02:00
Franck Nijhof d738c0d6b1 Merge branch 'master' into dev 2025-07-03 07:04:46 +00:00
epenet e42235285d Use runtime_data in melcloud (#148012)
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-03 08:57:22 +02:00
epenet 04e69479f4 Fix hass.data reference in lookin (#148008) 2025-07-03 08:54:20 +02:00
epenet b973916032 Move met_eireann coordinator to separate module (#148014) 2025-07-03 08:53:22 +02:00
epenet 6f4757ef42 Use runtime_data in melnor (#148013) 2025-07-03 08:52:40 +02:00
epenet a6962e9e1e Fix missing port in samsungtv (#147962)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-03 08:51:38 +02:00
Marcel van der Veldt 142c10cccc Fix state being incorrectly reported in some situations on Music Assistant players (#147997) 2025-07-03 08:50:41 +02:00
Matthias Alphart c137c96cfd KNX: use async_load_json_object_fixture in tests (#147991) 2025-07-03 08:00:34 +02:00
Robert Svensson f0e0c954e7 Bump aiounifi to v84 (#147987) 2025-07-02 23:10:21 +02:00
Norbert Rittel 681961d3a5 Use common config_flow strings in vegehub (#147984) 2025-07-02 22:14:55 +02:00
Matthias Alphart 53d2f6b0c6 KNX: Use a ConfigExtractor helper class for value retrieval (#147983) 2025-07-02 21:49:24 +02:00
G Johansson 78c39f8a06 Remove deprecated battery properties from demo vacuum (#147980) 2025-07-02 21:49:12 +02:00
Ludovic BOUÉ a748525e03 Allow LevelControl Cluster for Matter Pump devices (#145004)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-07-02 21:48:15 +02:00
Manuel Rüger 8ca1fe83b7 Bump switchbot-api to v2.7.0 (#147978) 2025-07-02 21:36:06 +02:00
Matthias Alphart 8968cf704b Use send_json_auto_id in KNX tests (#147982) 2025-07-02 21:34:30 +02:00
puddly ebe04466f4 Bump ZHA to 0.0.62 (#147966) 2025-07-02 21:19:32 +02:00
G Johansson e31470ba5b Change breaking version for battery props in vacuum (#147956) 2025-07-02 19:06:56 +02:00
Franck Nijhof 4bc2951f44 2025.7.0 (#147533) 2025-07-02 18:01:06 +02:00
Franck Nijhof 8334a0398c Bump version to 2025.7.0 2025-07-02 15:12:16 +00:00
Ville Skyttä 80a1e0e4cd Improve huawei_lte config flow class naming (#147910) 2025-07-02 17:02:39 +02:00
Thomas55555 3778f537d5 Remove noisy debug logs in Husgvarna Automower (#147958) 2025-07-02 15:28:42 +01:00
Petro31 adec157d43 Allow trigger based numeric sensors to be set to unknown (#137047)
* Allow trigger based numeric sensors to be set to unknown

* resolve comments

* Do case insensitive check

* use _parse_result

---------

Co-authored-by: abmantis <amfcalt@gmail.com>
2025-07-02 15:35:47 +02:00
Franck Nijhof 8fc3fa51a8 Bump version to 2025.7.0b9 2025-07-02 13:30:51 +00:00
c0ffeeca7 4eb688b560 Z-Wave JS: rename controller to adapter according to term decision (#147955)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-02 13:30:31 +00:00
Simone Chemelli 9472ff5d36 Bump aioamazondevices to 3.2.2 (#147953) 2025-07-02 13:30:29 +00:00
Bram Kragten 12e8b81ec7 Update frontend to 20250702.0 (#147952) 2025-07-02 13:30:28 +00:00
Paulus Schoutsen ec5e543c09 Ollama: Migrate pick model to subentry (#147944) 2025-07-02 13:30:27 +00:00
Paulus Schoutsen 116c745872 Split Ollama entity (#147769) 2025-07-02 13:30:26 +00:00
Robert Resch 1fdf152292 Bump deebot-client to 13.5.0 (#147938) 2025-07-02 13:27:47 +00:00
G Johansson b816f1a408 Handle additional errors in Nord Pool (#147937) 2025-07-02 13:27:46 +00:00
John Hess eb351e6505 Bump thermopro-ble to 0.13.1 (#147924) 2025-07-02 13:27:45 +00:00
Maciej Bieniek 2f27d55495 Open repair issue when outbound WebSocket is enabled for Shelly non-sleeping RPC device (#147901) 2025-07-02 13:26:03 +00:00
Space fa1bed1849 Skip processing request body for HTTP HEAD requests (#147899)
* Skip processing request body for HTTP HEAD requests

* Use aiohttp's must_be_empty_body() to check whether ingress requests should be streamed

* Only call must_be_empty_body() once per request

* Fix incorrect use of walrus operator
2025-07-02 13:26:01 +00:00
Raphael Hehl b8c19f23f3 UnifiProtect Change log level from debug to error for connection exceptions in ProtectFlowHandler (#147730) 2025-07-02 13:26:00 +00:00
Erwin Douna b677ce6c90 SMA add DHCP strictness (#145753)
* Add DHCP strictness (needs beta check)

* Update to check on CONF_MAC

* Update to check on CONF_HOST

* Update hostname

* Polish it a bit

* Update to CONF_HOST, again

* Add split

* Add CONF_MAC add upon detection

* epenet feedback

* epenet round II
2025-07-02 13:25:59 +00:00
c0ffeeca7 d6da686ffe Z-Wave JS: rename controller to adapter according to term decision (#147955)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-02 15:23:08 +02:00
Paulus Schoutsen f50ef79c72 Ollama: Migrate pick model to subentry (#147944) 2025-07-02 15:20:42 +02:00
Erik Montnemery 943fb9948b Adjust logic related to entity platform state (#147882)
* Adjust logic related to entity platform state

* Break up hard to read if-statement

* Add and improve tests
2025-07-02 14:57:53 +02:00
Raphael Hehl 7447cf329b UnifiProtect Change log level from debug to error for connection exceptions in ProtectFlowHandler (#147730) 2025-07-02 14:57:46 +02:00
Erwin Douna 3d27c0ce52 SMA add DHCP strictness (#145753)
* Add DHCP strictness (needs beta check)

* Update to check on CONF_MAC

* Update to check on CONF_HOST

* Update hostname

* Polish it a bit

* Update to CONF_HOST, again

* Add split

* Add CONF_MAC add upon detection

* epenet feedback

* epenet round II
2025-07-02 14:48:21 +02:00
Simone Chemelli b7496be61f Bump aioamazondevices to 3.2.2 (#147953) 2025-07-02 14:27:51 +02:00
Bram Kragten 57a98240bd Update frontend to 20250702.0 (#147952) 2025-07-02 14:26:19 +02:00
Ville Skyttä ff76017ba6 Simplify unnecessary re match.groups()[0] calls (#147909) 2025-07-02 14:12:26 +02:00
Maikel Punie f10fcde6d8 Remove the deprecated interface paramater for velbus (#147868) 2025-07-02 14:07:47 +02:00
Marc Mueller a7002e3a24 Update pytest to 8.4.1 (#147951) 2025-07-02 13:02:18 +01:00
tronikos bbe03dcab7 Add missing Opower tests (#147934) 2025-07-02 13:46:40 +02:00
Andre Lengwenus f77e6cc8fc Add missing exception translations to LCN (#147723) 2025-07-02 13:41:06 +02:00
Petro31 cb8e076703 Fix missing device_class and state_class on compensation entities (#146115)
Co-authored-by: Robert Resch <robert@resch.dev>
2025-07-02 13:39:19 +02:00
G Johansson 73251fbb1c Handle additional errors in Nord Pool (#147937) 2025-07-02 13:26:47 +02:00
Maciej Bieniek 7ff90ca49d Open repair issue when outbound WebSocket is enabled for Shelly non-sleeping RPC device (#147901) 2025-07-02 13:06:27 +02:00
Manu bab9ec9976 Add sensor for online status to PlayStation Network (#147842) 2025-07-02 11:47:41 +01:00
Marc Mueller 1051f85ac0 Update coverage to 7.9.1 (#147940) 2025-07-02 12:20:50 +02:00
Marc Mueller 6c7da57af2 Update pytest-cov to 6.2.1 (#147942) 2025-07-02 12:14:27 +02:00
Marc Mueller 73e505d48d Update pytest-xdist to 3.8.0 (#147943) 2025-07-02 12:11:09 +02:00
Marc Mueller ec65066f5e Update mypy-dev to 1.17.0a4 (#147939) 2025-07-02 12:09:39 +02:00
Robert Resch 9c4951261c Bump deebot-client to 13.5.0 (#147938) 2025-07-02 12:00:48 +02:00
Space 00dfc04b86 Skip processing request body for HTTP HEAD requests (#147899)
* Skip processing request body for HTTP HEAD requests

* Use aiohttp's must_be_empty_body() to check whether ingress requests should be streamed

* Only call must_be_empty_body() once per request

* Fix incorrect use of walrus operator
2025-07-02 11:45:45 +02:00
Manu bee07ad284 Fix Online ID string in PlayStation Network integration (#147915) 2025-07-02 10:45:07 +02:00
Paulus Schoutsen b2108fdd40 Update Dockerfile.dev to only use uv for Python (#147926) 2025-07-02 10:40:16 +02:00
John Hess 3730a1a379 Bump thermopro-ble to 0.13.1 (#147924) 2025-07-02 10:11:49 +02:00
Sid 088c02d38a Complete tests for eheimdigital (#143337)
* Complete tests for eheimdigital

* Review

* Review

* Review

* Review

* Fix tests
2025-07-02 10:09:30 +02:00
Harry Heymann afb247c907 Bump Python Matter server to 8.0.0 (#147783) 2025-07-02 08:12:47 +02:00
Franck Nijhof 0e6bbb30c1 Bump version to 2025.7.0b8 2025-07-02 06:04:14 +00:00
J. Nick Koston fdba791f18 Bump bluetooth-data-tools to 1.28.2 (#147920) 2025-07-02 06:03:56 +00:00
Ivan Lopez Hernandez d4dec6c7a9 Swap the Models label for the model name not it's display name, (#147918)
Swap display name for name.
2025-07-02 06:03:55 +00:00
Simone Chemelli f838e85a79 Manager wrong country selection in Alexa Devices (#147914)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-02 06:03:54 +00:00
Simone Chemelli 04ae966544 Bump aioamazondevices to 3.2.1 (#147912) 2025-07-02 06:03:53 +00:00
Simone Chemelli 77dcba0984 Manager wrong country selection in Alexa Devices (#147914)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-07-02 08:02:53 +02:00
Simone Chemelli 48f9a12cca Bump aioamazondevices to 3.2.1 (#147912) 2025-07-02 07:36:41 +02:00
J. Nick Koston bdd2ac9ae4 Bump bluetooth-data-tools to 1.28.2 (#147920) 2025-07-02 07:34:40 +02:00
Ivan Lopez Hernandez 2e7113d881 Swap the Models label for the model name not it's display name, (#147918)
Swap display name for name.
2025-07-01 21:12:58 -07:00
Sid 6842bfae4c Bump eheimdigital to 1.3.0 (#147908) 2025-07-01 23:00:25 +01:00
nadimz 392cde20d9 Add support for opening state in template lock (#147813)
Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
2025-07-01 22:03:20 +01:00
cristianburrini a6146fb5a9 Increase the number of irrigation zones up to 8 for Tuya enabled controllers. (#147793) 2025-07-01 22:40:36 +02:00
Franck Nijhof b2c393db72 Bump version to 2025.7.0b7 2025-07-01 20:11:01 +00:00
Jesse Hills 6104731d53 Remove codeowner from ESPHome (#147850) 2025-07-01 22:09:23 +02:00
Marcel van der Veldt 3ed440a3af Bump Music Assistant Client to 1.2.3 (#147885) 2025-07-01 20:08:45 +00:00
Jamin 01e7efc7b4 Bump VoIP utils to 0.3.3 (#147880) 2025-07-01 20:08:44 +00:00
avee87 60a930554a Fix station name sensor for metoffice (#145500) 2025-07-01 20:08:43 +00:00
Erik Montnemery 66308a848a Set Entity._platform_state in google_assistant tests (#147892) 2025-07-01 21:46:36 +02:00
Erik Montnemery c71dbd9d4d Set Entity._platform_state in universal tests (#147894) 2025-07-01 21:46:01 +02:00
Erik Montnemery 1195c2ec10 Set Entity._platform_state in core customize test (#147895) 2025-07-01 21:45:08 +02:00
Norbert Rittel 78a9cd9201 Use (new) common state "Empty" for water level in switchbot (#147836) 2025-07-01 21:43:21 +02:00
Erik Montnemery 639a749a0f Mock recorder in ista_ecotrend tests (#147893) 2025-07-01 20:09:48 +01:00
Simone Chemelli 058f3b8b6e Add reauth to Alexa Devices config flow (#147773) 2025-07-01 20:57:24 +02:00
Manu 926e9261ab Add switch to enable/disable boost in IronOS integration (#147831) 2025-07-01 20:53:13 +02:00
Erik Montnemery d6fb860889 Use entity_registry_enabled_by_default fixture in dsmr_reader tests (#147891) 2025-07-01 20:50:38 +02:00
Marcel van der Veldt 5e03900e0a Bump Music Assistant Client to 1.2.3 (#147885) 2025-07-01 20:26:26 +02:00
Erik Montnemery 1e6e5ca1b6 Fix broadlink tests (#147890) 2025-07-01 18:32:58 +01:00
Erik Montnemery 60e3b38de1 Set Entity._platform_state in arcam_fmj tests (#147889) 2025-07-01 17:58:15 +02:00
epenet 852522219c Use correctly formatted MAC in bond tests (#147887) 2025-07-01 17:56:10 +02:00
epenet 23f1e8d1a3 Use correctly formatted MAC in elkm1 tests (#147888) 2025-07-01 17:55:46 +02:00
Franck Nijhof c707bf6264 Bump version to 2025.7.0b6 2025-07-01 14:26:59 +00:00
avee87 655f009f07 Fix station name sensor for metoffice (#145500) 2025-07-01 16:18:13 +02:00
Paul Bottein 3548ab70fd Update frontend to 20250701.0 (#147879) 2025-07-01 14:10:30 +00:00
Erik Montnemery e272ab1885 Initialize EsphomeEntity._has_state (#147877) 2025-07-01 14:10:29 +00:00
Erik Montnemery d5d1b620d0 Correct openai conversation config entry migration (#147859) 2025-07-01 14:10:28 +00:00
Erik Montnemery 8b2f4f0f86 Correct ollama config entry migration (#147858) 2025-07-01 14:10:26 +00:00
Erik Montnemery 725269ecda Correct anthropic config entry migration (#147857) 2025-07-01 14:10:25 +00:00
Erik Montnemery c42fc818bf Correct Google generative AI config entry migration (#147856) 2025-07-01 14:10:23 +00:00
Jesse Hills 5554e38171 Implement suggested_display_precision for ESPHome (#147849) 2025-07-01 14:10:22 +00:00
Jan Bouwhuis b25acfe823 Fix invalid configuration of MQTT device QoS option in subentry flow (#147837) 2025-07-01 14:10:21 +00:00
micha91 ff25948e37 fix: Create new aiohttp session with DummyCookieJar (#147827) 2025-07-01 14:10:19 +00:00
Maciej Bieniek f85fc7173f Bump Nettigo Air Monitor backend library to version 5.0.0 (#147812) 2025-07-01 14:10:18 +00:00
Bob Laz 748cc6386d fix state_class for water used today sensor (#147787) 2025-07-01 14:10:17 +00:00
Manu 47b232db49 Add more mac address prefixes for discovery to PlayStation Network (#147739) 2025-07-01 14:10:15 +00:00
hanwg c61935fc41 Include chat ID in Telegram bot subentry title (#147643) 2025-07-01 14:10:14 +00:00
Jan-Philipp Benecke 414318f3fb Catch access denied errors in webdav and display proper message (#147093) 2025-07-01 14:10:12 +00:00
Paul Bottein 08985d783f Fix Meteo france Ciel clair condition mapping (#146965)
Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>
2025-07-01 14:10:11 +00:00
Thomas55555 e4bcde7d20 Fix wrong state in Husqvarna Automower (#146075) 2025-07-01 14:10:10 +00:00
Jamin 59bf39f4ed Bump VoIP utils to 0.3.3 (#147880) 2025-07-01 16:09:51 +02:00
Fredrik Mårtensson 510e3977df Add water_level sensor to Tuya pet fountain cwysj (#146602)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-07-01 14:57:17 +01:00
micha91 922720576a fix: Create new aiohttp session with DummyCookieJar (#147827) 2025-07-01 15:50:04 +02:00
Paul Bottein e10b581d4b Fix Meteo france Ciel clair condition mapping (#146965)
Co-authored-by: Simon Lamon <32477463+silamon@users.noreply.github.com>
2025-07-01 15:43:34 +02:00
hanwg e38eac9415 Include chat ID in Telegram bot subentry title (#147643) 2025-07-01 15:42:32 +02:00
Maciej Bieniek 11c9aa9280 Bump Nettigo Air Monitor backend library to version 5.0.0 (#147812) 2025-07-01 15:39:29 +02:00
Paul Bottein 52c86f8a6a Update frontend to 20250701.0 (#147879) 2025-07-01 15:38:04 +02:00
Marc Mueller 6364a9ad98 Update pillow to 11.3.0 (#147869) 2025-07-01 14:31:06 +01:00
Manu 651162b8e7 Fix error in last online sensor of PlayStation integration (#147844)
* Fix Last online sensor

* set unavailable

* available_fn
2025-07-01 15:17:10 +02:00
Denis Shulyaka 7deca35172 Add multiple LLM API support for MCP Server (#147785)
* Add multiple LLM API support for MCP Server

* Update homeassistant/components/mcp_server/config_flow.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* ruff

* Update tests/components/mcp_server/conftest.py

Co-authored-by: Allen Porter <allen.porter@gmail.com>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Allen Porter <allen.porter@gmail.com>
2025-07-01 06:14:03 -07:00
epenet 073a467fb2 Use correctly formatted MAC in bond tests (#147870) 2025-07-01 14:41:31 +02:00
epenet 3f9590b03b Use correctly formatted MAC in gogogate2 tests (#147872) 2025-07-01 14:41:20 +02:00
epenet b47f989c77 Use correctly formatted MAC in wmspro tests (#147876) 2025-07-01 14:40:41 +02:00
epenet 4ebffa8d23 Use correctly formatted MAC in palazzetti tests (#147875) 2025-07-01 14:40:27 +02:00
epenet c5873c6dd0 Use correctly formatted MAC in dlink tests (#147871) 2025-07-01 14:40:12 +02:00
Erik Montnemery 2cb80e083e Initialize EsphomeEntity._has_state (#147877) 2025-07-01 07:33:33 -05:00
epenet 871296dff6 Use correctly formatted MAC in lamarzocco tests (#147874) 2025-07-01 14:13:21 +02:00
Claudio Ruggeri - CR-Tech c92873bbff Change default slave id from 0 to 1 in modbus actions (#142865)
* set default slave id in service calls

* add test

* revert out of scope change
2025-07-01 13:15:32 +02:00
Norbert Rittel 5fea4915ef Use (new) common state "Empty" in litterrobot (#147835) 2025-07-01 13:13:12 +02:00
dependabot[bot] 8fa016059d Bump github/codeql-action from 3.29.1 to 3.29.2 (#147867)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-01 12:30:01 +02:00
Bob Laz 61a29db72c fix state_class for water used today sensor (#147787) 2025-07-01 12:28:13 +02:00
epenet 5a3aa7874d Use correctly formatted MAC in airthings tests (#147817) 2025-07-01 12:26:10 +02:00
Parker Brown 12e2493c42 Capitalize "version" in Tesla fleet strings (#146501) 2025-07-01 12:18:55 +02:00
Paulus Schoutsen 659cd42739 Move async_reload on updates in async_setup_entry in Anthropic (#147862)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-01 12:16:00 +02:00
Paulus Schoutsen 7fcea17e83 Move async_reload on updates in async_setup_entry in OpenAI Conversation (#147863)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-01 12:15:28 +02:00
Paulus Schoutsen 30a85c40da Move async_reload on updates in async_setup_entry in Ollama (#147861)
Co-authored-by: Claude <noreply@anthropic.com>
2025-07-01 12:14:46 +02:00
epenet 57a8f1e0cc Use correctly formatted MAC in rehlko tests (#147864) 2025-07-01 12:09:00 +02:00
epenet 78aeae577d Use correctly formatted MAC in roomba tests (#147865) 2025-07-01 11:24:08 +02:00
epenet 3f95cb37e6 Use correctly formatted MAC in sma tests (#147866) 2025-07-01 11:23:31 +02:00
epenet 12aef4aae5 Use correctly formatted MAC in knocki tests (#147821) 2025-07-01 11:22:48 +02:00
Thomas55555 2e12db001d Fix wrong state in Husqvarna Automower (#146075) 2025-07-01 10:53:55 +02:00
epenet 573325be97 Use correctly formatted MAC in home_connect tests (#147818) 2025-07-01 10:51:49 +02:00
Erik Montnemery 7021fe7495 Correct openai conversation config entry migration (#147859) 2025-07-01 10:49:07 +02:00
Erik Montnemery b7999755bd Correct anthropic config entry migration (#147857) 2025-07-01 10:47:06 +02:00
Erik Montnemery 99f7a031d6 Correct Google generative AI config entry migration (#147856) 2025-07-01 10:46:13 +02:00
Erik Montnemery 8fc31283b7 Correct ollama config entry migration (#147858) 2025-07-01 10:45:17 +02:00
Jan-Philipp Benecke 5ff698c78d Catch access denied errors in webdav and display proper message (#147093) 2025-07-01 10:15:45 +02:00
Jesse Hills 9469c6ad1c Implement suggested_display_precision for ESPHome (#147849) 2025-07-01 09:16:23 +02:00
Norbert Rittel 35f0505c7b Use (new) common state "Empty" in whirlpool (#147847)
Use (new) common state "Empty"
2025-07-01 08:59:55 +02:00
Norbert Rittel a180cabea9 Use (new) common state "Full" in overkiz (#147848)
Use (new) common state "Full"
2025-07-01 08:58:31 +02:00
Jan Bouwhuis 4f7348b8bc Fix invalid configuration of MQTT device QoS option in subentry flow (#147837) 2025-07-01 08:46:58 +02:00
On Freund ddf56f053b Support device removal in CoolMasterNet integration (#147851) 2025-07-01 08:26:04 +02:00
G Johansson 9719d2ef2b Start deprecation of battery properties in vacuum (#146401)
* Start deprecation of battery properties in vacuum

* Small fixes

* Fixes

* Deprecate battery supported feature
2025-07-01 08:23:47 +02:00
Manu 2afe475234 Add more mac address prefixes for discovery to PlayStation Network (#147739) 2025-07-01 07:12:00 +02:00
Norbert Rittel 23c304fc75 Use (new) common state "Full" in enphase_envoy (#147834)
Use (new) common state "Full"
2025-06-30 20:13:05 -04:00
Norbert Rittel 84645d0ca6 Use (new) common states for "Full" and "Empty" in lg_thinq (#147833)
Use (new) common states for "Full" and "Empty"
2025-07-01 01:59:33 +02:00
Norbert Rittel 2bdfc8cf5e Add common states "Empty" and "Full" (#146646) 2025-06-30 22:08:55 +02:00
epenet 603e277a5b Add docstring to DhcpServiceInfo MAC address (#147823)
Co-authored-by: Franck Nijhof <git@frenck.dev>
2025-06-30 21:54:05 +02:00
Paulus Schoutsen 38a7b21052 Split Anthropic entity (#147770) 2025-06-30 21:47:44 +02:00
Franck Nijhof db04c77e62 Bump version to 2025.7.0b5 2025-06-30 19:39:34 +00:00
puddly e8204e5f8e Await firmware installation task when flashing ZBT-1/Yellow firmware (#147824) 2025-06-30 19:39:03 +00:00
starkillerOG 66cf9c4ed5 Bump reolink_aio to 0.14.2 (#147797) 2025-06-30 19:39:02 +00:00
mkmer 1f6d28dcbf Honeywell: Don't use shared session (#147772) 2025-06-30 19:39:02 +00:00
Paulus Schoutsen 328e838351 Use media selector for Assist Satellite actions (#147767)
Co-authored-by: Michael Hansen <mike@rhasspy.org>
2025-06-30 19:39:01 +00:00
cdnninja 62a1c8af11 Fix Vesync set_percentage error (#147751) 2025-06-30 19:39:00 +00:00
tronikos b50e599517 Move the async_reload on updates in async_setup_entry in Google Generative AI (#147748)
Move the async_reload on updates in async_setup_entry
2025-06-30 19:38:59 +00:00
Manu 3c7c9176d2 Fix sensor displaying unknown when getting readings from heat meters in ista EcoTrend (#147741) 2025-06-30 19:37:54 +00:00
J. Nick Koston c771f5fe1e Preserve httpx boolean behavior in REST integration after aiohttp conversion (#147738) 2025-06-30 19:35:31 +00:00
hanwg 6dc464ad73 Fix Telegram bot proxy URL not initialized when creating a new bot (#147707) 2025-06-30 19:35:30 +00:00
Marc Hörsken ae48e3716e Update pywmspro to 0.3.0 to wait for short-lived actions (#147679)
Replace action delays with detailed action responses.
2025-06-30 19:35:29 +00:00
Hessel 1543726095 Wallbox Integration, Reduce API impact by limiting the amount of API calls made (#147618) 2025-06-30 19:35:27 +00:00
Evan Severson adbace95c3 Fixed pushbullet handling of fields longer than 255 characters (#146993) 2025-06-30 19:35:26 +00:00
Shay Levy 578b43cf61 Bump aioshelly to 13.7.1 (#146221)
* Bump aioshelly to 13.8.0

* Change version to 13.7.1
2025-06-30 19:35:25 +00:00
mvn23 a8b5d1511d Populate hvac_modes list in opentherm_gw (#142074) 2025-06-30 19:35:24 +00:00
Pete Sage 5a0a1bbbf4 Person ble_trackers for non-home zones not processed correctly (#138475)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-06-30 19:35:23 +00:00
Paulus Schoutsen bf74ba990a Split Ollama entity (#147769) 2025-06-30 21:31:54 +02:00
Paulus Schoutsen 70856bd92a Split OpenAI entity (#147771) 2025-06-30 21:11:51 +02:00
Paulus Schoutsen be6b624081 Improve validation for media selector (#147768) 2025-06-30 20:26:52 +02:00
mvn23 217fbb2849 Populate hvac_modes list in opentherm_gw (#142074) 2025-06-30 20:24:13 +02:00
epenet 22a14da19c Rename service registration method (#146615) 2025-06-30 20:21:38 +02:00
puddly 20f5d85800 Await firmware installation task when flashing ZBT-1/Yellow firmware (#147824) 2025-06-30 20:18:22 +02:00
hanwg 88feb5139b Fix Telegram bot proxy URL not initialized when creating a new bot (#147707) 2025-06-30 20:16:45 +02:00
Hessel 90cbe272a0 Wallbox Integration, Reduce API impact by limiting the amount of API calls made (#147618) 2025-06-30 20:15:48 +02:00
Paulus Schoutsen 511b739bf6 Use media selector for Assist Satellite actions (#147767)
Co-authored-by: Michael Hansen <mike@rhasspy.org>
2025-06-30 20:12:03 +02:00
Manu 9961a499ee Fix sensor displaying unknown when getting readings from heat meters in ista EcoTrend (#147741) 2025-06-30 20:11:46 +02:00
rubenbe d8c7ed473b Bump xiaomi-ble to 1.1.0 (#147828)
Bump xiaomi-ble to 1.1.0
2025-06-30 20:11:03 +02:00
Manu 2c30a5a14c Improve exception handling of PlayStation Network (#147792) 2025-06-30 19:53:46 +02:00
Manu 5e3fc858d8 Add sensor last online to PlayStation Network integration (#147796) 2025-06-30 19:52:11 +02:00
epenet f03af213d4 Use correctly formatted MAC in lg_thinq tests (#147822) 2025-06-30 19:50:50 +02:00
epenet 1e3ebd5650 Use correctly formatted MAC in incomfort tests (#147819) 2025-06-30 18:02:42 +02:00
epenet 53936ab062 Use async_load_fixture in weatherflow_cloud (#147816) 2025-06-30 18:01:14 +02:00
Bouwe Westerdijk b52a248def Bump plugwise to v1.7.7 and adapt (#147809) 2025-06-30 14:40:10 +01:00
Jeef ea70229426 Add Weatherflow Cloud wind support via websocket (#125611)
* rebase off of dev

* update tests

* update tests

* addressing PR finally

* API to back

* adding a return type

* need to test

* removed teh extra check on available

* some changes

* ready for re-review

* change assertions

* remove icon function

* update ambr

* ruff

* update snapshot and push

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* enhnaced tests

* better coverage

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Update homeassistant/components/weatherflow_cloud/coordinator.py

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* remove comments

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-30 15:26:17 +02:00
Erik Montnemery 741a3d5009 Remove backup helper (#143558)
* Remove backup helper

* Update aws_s3 tests
2025-06-30 14:11:10 +02:00
Pete Sage ee8830cc77 Person ble_trackers for non-home zones not processed correctly (#138475)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-06-30 13:35:19 +02:00
Bouwe Westerdijk 7fbf25e862 Plugwise: remove outdated fixtures (#147806) 2025-06-30 12:15:52 +02:00
epenet e642cd45ae Enforce async_load_fixture in async test functions (#145709) 2025-06-30 11:56:26 +02:00
dependabot[bot] 179e1c2b00 Bump github/codeql-action from 3.29.0 to 3.29.1 (#147799)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-30 11:53:30 +02:00
Phill (pssc) 52a99aea0c Squeezebox: Fix Allow server device details to merge with players with the same MAC (#133517)
* Disambiguate bewtween servers and player to stop them being merged

* ruff format

* make SqueezeLite players not a service

* ruff

* Tidy redunant code

* config url

* revert config url

* change to domain server

* use default to see how they are mereged with server device

* refactor to use defaults so where a player is part of a bigger ie server service device in the same intergration it doesnt replace its information

* ruff

* make test match the new data

* Fix merge

* Fix tests

* Fix meregd test data

* Fix all tests add new test for merged device in reg

* Remove info from device_info so its only a lookup

* manual merge of server player shared devices

* Fix format of merged entires

* fixes for testing

* Fix test with input from @peteS-UK device knowlonger exits for this test

* Fix test now device doesnt exits for tests

* Update homeassistant/components/squeezebox/media_player.py

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Fix Copilots formatting

* Apply suggestions from code review

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-30 11:41:22 +02:00
Paulus Schoutsen c7b2f236be Type Z-Wave JS config entry (#147456)
* Type Z-Wave JS config entry

* Migrate to data class
2025-06-30 11:15:12 +02:00
Evan Severson a6e3da43ca Fixed pushbullet handling of fields longer than 255 characters (#146993) 2025-06-30 11:08:50 +02:00
Steffen Rusitschka 4d58024d5d Add publish_string_states config to zabbix (#134773)
* Add include_strings config to zabbix

* Remove commented code

* Fix ruff formatting

* Update homeassistant/components/zabbix/__init__.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Update homeassistant/components/zabbix/__init__.py

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>

* Don't use dict.get, CONF_INCLUDE_STRINGS has a default value and will always be set.

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* Convert to string only when include_strings is true

Co-authored-by: Erik Montnemery <erik@montnemery.com>

* change to guard

* Fix review comments

* ruff, mypy, pylint fixes

* more ruff, mypy fixes

* and another ruff format fix

---------

Co-authored-by: Abílio Costa <abmantis@users.noreply.github.com>
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-30 10:52:33 +02:00
Manu c7603b39ec Fix inputs to correctly handle Fahrenheit in IronOS (#135421)
* Fix inputs to correctly handle Fahrenheit in IronOS

* some refactoring

* add boost switch entity

* Revert switch entity

* refactor

* remove commented code

* some changes
2025-06-30 10:44:39 +02:00
epenet c17ee0d123 Allow binary sensor template to return state unknown (#128861)
* Allow binary sensor template to return state unknown

* Add tests

* Adjust TriggerBinarySensorEntity

* Add restore tests for BinarySensorTemplate

* Add tests for TriggerBinarySensorEntity

* Tweak

* Tweak

* Adjust tests

* Adjust
2025-06-30 10:06:05 +02:00
Alexandre CUER 97c1e21a69 Add possibility to synchronize automatically all available feeds in emoncms (#128122)
* Add checkbox in options to sync all feeds once

* Add sync mode selector in async_step_user
Remove checkbox in options

* Correct use of SYNC_MODE & SYNC_MODE_AUTO in tests

* Use dropdown for mode selection

* rmv_unused_const

* Add separate tests + use SelectSelector
2025-06-30 10:05:07 +02:00
starkillerOG c9a6b1fd45 Bump reolink_aio to 0.14.2 (#147797) 2025-06-30 09:39:02 +02:00
mkmer 05ceee568e Honeywell: Don't use shared session (#147772) 2025-06-29 21:22:59 +02:00
Shay Levy 08a6b38699 Bump aioshelly to 13.7.1 (#146221)
* Bump aioshelly to 13.8.0

* Change version to 13.7.1
2025-06-29 21:41:50 +03:00
Norbert Rittel 4add346272 Deduplicate strings and fix sentence-casing in proximity (#147777)
* Deduplicate strings and fix sentence-casing in `proximity`

* Update test_init.py
2025-06-29 21:00:16 +03:00
Andre Lengwenus 369c8d1e0d Bump pypck to 0.8.10 (#147774) 2025-06-29 20:58:41 +03:00
tronikos 25ab47a587 Move the async_reload on updates in async_setup_entry in Google Generative AI (#147748)
Move the async_reload on updates in async_setup_entry
2025-06-29 07:56:37 +02:00
Marc Hörsken 617ea1925c Update pywmspro to 0.3.0 to wait for short-lived actions (#147679)
Replace action delays with detailed action responses.
2025-06-29 07:33:44 +02:00
cdnninja 8bacab4f9c Fix Vesync set_percentage error (#147751) 2025-06-29 07:22:04 +02:00
J. Nick Koston 6d28b99344 Preserve httpx boolean behavior in REST integration after aiohttp conversion (#147738) 2025-06-28 17:24:09 -05:00
cnico bbd1cbf5c9 Correct Chlorine unit definition in flipr integration (#147537)
* Correction of bug 145683

* constant for chlorine unit correction

* constant name correction

* Review correction
2025-06-28 22:29:24 +01:00
Paulus Schoutsen cf2e69ed74 Bump version to 2025.7.0b4 2025-06-28 20:27:42 +00:00
J. Nick Koston c32b44b774 Improve rest error logging (#147736)
* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* top level
2025-06-28 20:27:20 +00:00
Florian von Garrel 2f69ed4a8a bump pypaperless to 4.1.1 (#147735) 2025-06-28 20:27:19 +00:00
Marc Hörsken 4b3449fe0c Fix error if cover position is not available or unknown (#147732) 2025-06-28 20:27:18 +00:00
starkillerOG 33e1c6de68 Reduce idle timeout of HLS stream to conserve camera battery life (#147728)
* Reduce IDLE timeout of HLS stream to conserve camera battery life

* adjust tests
2025-06-28 20:27:17 +00:00
Daniel Hjelseth Høyer 81e712ea49 Bump pytibber to 0.31.6 (#147703) 2025-06-28 20:27:16 +00:00
Shay Levy d3c5684cd0 Fix Shelly Block entity removal (#147694) 2025-06-28 20:27:16 +00:00
Jan Bouwhuis 862b7460b5 Move MQTT device sw and hw version to collapsed section in subentry flow (#147685)
Move MQTT device sw and hw version to collapsed section
2025-06-28 20:27:15 +00:00
Samuel Xiao a65eb57539 Add lock models to switchbot cloud (#147569) 2025-06-28 20:27:14 +00:00
Antoni Czaplicki b537850f52 Bump vulcan-api to 2.4.2 (#146857) 2025-06-28 20:27:13 +00:00
starkillerOG 43450d4489 Reduce idle timeout of HLS stream to conserve camera battery life (#147728)
* Reduce IDLE timeout of HLS stream to conserve camera battery life

* adjust tests
2025-06-28 22:20:47 +02:00
J. Nick Koston f8c052e0ce Improve rest error logging (#147736)
* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* Improve rest error logging

* top level
2025-06-28 22:18:46 +02:00
Florian von Garrel 1f3bdfc7b7 bump pypaperless to 4.1.1 (#147735) 2025-06-28 22:13:51 +02:00
Antoni Czaplicki 0652bffd68 Bump vulcan-api to 2.4.2 (#146857) 2025-06-28 22:11:59 +02:00
Manu 8322611099 Use test parametrization in ista EcoTrend integration (#147729) 2025-06-28 21:57:51 +02:00
Marc Hörsken 134967b817 Fix error if cover position is not available or unknown (#147732) 2025-06-28 21:57:26 +02:00
Shay Levy 39abae36f0 Fix Shelly Block entity removal (#147694) 2025-06-28 22:40:58 +03:00
Marc Mueller 227760f203 Fix RuntimeWarnings in homeassistant_yellow tests (#147724) 2025-06-28 20:31:01 +02:00
Jan Bouwhuis 969809456e Move MQTT device sw and hw version to collapsed section in subentry flow (#147685)
Move MQTT device sw and hw version to collapsed section
2025-06-28 11:25:59 +02:00
Daniel Hjelseth Høyer d2e8a48b2c Bump pytibber to 0.31.6 (#147703) 2025-06-28 10:11:17 +02:00
epenet ea6332ee42 Move backup services to separate module (#146427) 2025-06-27 20:54:56 +02:00
Erik Montnemery 91c3b43d7f Improve comment for helpers.entity.entity_sources (#146529) 2025-06-27 20:54:19 +02:00
Thomas55555 1d82d44794 Add device prefix to summary in Husqvarna Automower (#147405) 2025-06-27 20:34:50 +02:00
Thomas55555 571376badc Bump aioautomower to 1.0.1 (#147683) 2025-06-27 20:28:45 +02:00
Manu 32236b2f4d Add reconfiguration flow to PlayStation Network (#147552) 2025-06-27 20:17:06 +02:00
Samuel Xiao 18c1953bc5 Add lock models to switchbot cloud (#147569) 2025-06-27 20:16:21 +02:00
Bernardus Jansen d874c28dc9 Add previously missing state classes to dsmr sensors (#147633) 2025-06-27 19:45:36 +02:00
Brett Adams 19d89c8952 Fix energy history in Teslemetry (#147646) 2025-06-27 19:43:03 +02:00
Ludovic BOUÉ e3ba1f34ca Matter TemperatureControl (#145706)
* TemperatureControl

* Add tests

* Commands.SetTemperature

* Update homeassistant/components/matter/number.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Apply suggestions from code review

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Update number.py

* Update number.py

* Update number.py

* Update homeassistant/components/matter/number.py

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>

* Refactor MatterRangeNumber to streamline command handling in async_set_native_value

* testing requested changes

---------

Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2025-06-27 19:41:39 +02:00
Thomas55555 b630fb0520 Respect availability of parent class in Husqvarna Automower (#147649) 2025-06-27 19:38:42 +02:00
Ville Skyttä 5129f89086 Finish config flow in huawei_lte SSDP test (#147542) 2025-06-27 19:00:01 +02:00
Ville Skyttä 0be0e22e76 Simplify rflink dimmable set_level parsing (#147636) 2025-06-27 18:59:10 +02:00
epenet b8500b338a Improve tests for binary sensor template (#147657) 2025-06-27 18:58:16 +02:00
Simone Chemelli 4cab3a0465 Bump aioamazondevices to 3.1.22 (#147681) 2025-06-27 18:44:01 +02:00
hanwg ff711324d5 Add codeowner for Telegram bot (#147680) 2025-06-27 18:18:01 +02:00
Michael 113e7dc003 Add data descriptions to PEGELONLINE integration (#147594) 2025-06-27 18:16:38 +02:00
Shay Levy 2120ff6a0a Fix Shelly entity removal (#147665) 2025-06-27 18:50:35 +03:00
Marc Mueller 8ee5c30754 Update ruff to 0.12.1 (#147677) 2025-06-27 17:40:08 +02:00
Paul Bottein a1518b96c4 Update frontend to 20250627.0 (#147668) 2025-06-27 17:28:14 +02:00
Petar Petrov bba7f5c3f0 Z-WaveJS config flow: Change keys question (#147518)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-06-27 17:27:43 +02:00
Manu 8a5671af76 Remove dweet.io integration (#147645) 2025-06-27 17:23:42 +02:00
Raphael Hehl 8a18dea8c7 UniFi Protect removing early access checks and issue creation (#147432)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-06-27 17:15:34 +02:00
Thomas55555 4b02f22724 Bump aioautomower to 1.0.0 (#147676) 2025-06-27 17:02:52 +02:00
mkmer 7229c2ca2c Bump aiosomecomfort to 0.0.33 (#147673) 2025-06-27 16:32:25 +02:00
Norbert Rittel d83eddf13b Fix sentence-casing and spacing of button in thermopro (#147671) 2025-06-27 15:53:18 +02:00
Josef Zweck 4a192a7b09 Bump jellyfin-apiclient-python to 1.11.0 (#147658) 2025-06-27 11:07:14 +02:00
Josef Zweck 58c434887e Fix: Unhandled NoneType sessions in jellyfin (#147659) 2025-06-27 11:00:23 +02:00
Abílio Costa 78c2405e61 Bump whirlpool to 0.21.1 (#147611) 2025-06-27 10:33:49 +02:00
Josef Zweck 8cc4105984 Make jellyfin not single config entry (#147656) 2025-06-27 10:31:13 +02:00
Josef Zweck 917f1e4c6f Make entities unavailable when machine is physically off in lamarzocco (#147426) 2025-06-27 10:03:14 +02:00
hanwg 3879f6d2ef Fix Telegram bot yaml import for webhooks containing None value for URL (#147586) 2025-06-27 10:03:03 +02:00
Norbert Rittel 78060e4833 Clarify descriptions of subaru.unlock_specific_door action (#147655) 2025-06-27 10:01:44 +02:00
Guido Schmitz fda66c4be4 Handle deleted devices dynamically in devolo Home Control (#147585) 2025-06-27 09:52:00 +02:00
Michael 21131d00b3 Fix config schema to make credentials optional in NUT flows (#147593) 2025-06-27 09:51:28 +02:00
puddly a84313de33 Allow setup of Zigbee/Thread for ZBT-1 and Yellow without internet access (#147549)
Co-authored-by: Norbert Rittel <norbert@rittel.de>
2025-06-27 09:50:45 +02:00
Manu c73346e6b3 Bump pynecil to v4.1.1 (#147648) 2025-06-27 09:31:35 +02:00
Franck Nijhof 55a37a2936 Extend GitHub Copilot instructions with new learnings from reviews (#147652) 2025-06-27 09:01:09 +02:00
Abílio Costa e481f14335 Simplify reolink light tests (#147637) 2025-06-27 08:58:09 +02:00
Petar Petrov 1ca03c8ae9 Do not factory reset old Z-Wave controller during migration (#147576)
* Do not factory reset old Z-Wave controller during migration

* PR comments

* remove obsolete test
2025-06-27 08:02:12 +02:00
Ville Skyttä 61b43ca1fc Remove unnecessary wilight trigger regex use (#147638) 2025-06-26 23:16:21 +01:00
Joost Lekkerkerker 1b2be083c2 Make sure Google Generative AI integration migration is clean (#147625) 2025-06-26 23:03:36 +02:00
Joost Lekkerkerker 4bdf3d6f30 Make sure OpenAI integration migration is clean (#147627) 2025-06-26 23:03:11 +02:00
Joost Lekkerkerker 43535ede8b Make sure Anthropic integration migration is clean (#147629) 2025-06-26 23:02:59 +02:00
Joost Lekkerkerker 9bd0762799 Make sure Ollama integration migration is clean (#147630) 2025-06-26 23:02:35 +02:00
Ville Skyttä 1bb653b4f7 Remove unused config regexps (#147631) 2025-06-26 23:02:14 +02:00
Franck Nijhof 2655edcfc8 Extend GitHub Copilot instructions and make it suitable for Claude Code (#147632) 2025-06-26 23:00:02 +02:00
Franck Nijhof 7a08edc3dd Add Claude to gitignore (#147622) 2025-06-26 21:06:34 +02:00
Abílio Costa b3131355b0 Use non-autospec mock for Reolink's light tests (#147621) 2025-06-26 21:05:23 +02:00
Abílio Costa 06d04c001d Use non-autospec mock for Reolink's host tests (#147619) 2025-06-26 20:55:46 +02:00
Jack Powell babecdf32c Add Diagnostics to PlayStation Network (#147607)
* Add Diagnostics support to PlayStation_Network

* Remove unused constant

* minor cleanup

* Redact additional data

* Redact additional data
2025-06-26 20:52:07 +02:00
Renat Sibgatulin 17cd39748b Create a new client session for air-Q to fix cookie polution (#147027) 2025-06-26 19:59:49 +02:00
Simone Chemelli c2f1e86a4e Add action exceptions to Alexa Devices (#147546) 2025-06-26 19:59:02 +02:00
Joost Lekkerkerker 61a32466b6 Hide Telegram bot proxy URL behind section (#147613)
Co-authored-by: Manu <4445816+tr4nt0r@users.noreply.github.com>
2025-06-26 19:55:38 +02:00
Manu aef08091f8 Fix asset url in Habitica integration (#147612) 2025-06-26 19:52:58 +02:00
Joost Lekkerkerker 1416f0f1e0 Fix meaters not being added after a reload (#147614) 2025-06-26 19:52:29 +02:00
HarvsG af7b1a76bc Add description placeholders to SchemaFlowFormStep (#147544)
* test description placeholders

* Update test_schema_config_entry_flow.py

* fix copy and paste indentation

* Apply suggestions from code review

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-26 19:51:31 +02:00
Maximilian Arzberger bf88fcd5bf Add Manual Charge Switch for Installers for Kostal Plenticore (#146932)
* Add Manual Charge Switch for Installers

* Update stale docstring

* Installer config fixture

* fix ruff
2025-06-26 19:50:27 +02:00
Joost Lekkerkerker 35478e3162 Set Google AI model as device model (#147582)
* Set Google AI model as device model

* fix
2025-06-26 19:44:15 +02:00
Joost Lekkerkerker 69af74a593 Improve explanation on how to get API token in Telegram (#147605) 2025-06-26 18:21:56 +02:00
tronikos b4dd912bee Refactor in Google AI TTS in preparation for STT (#147562) 2025-06-26 11:53:16 -04:00
Bram Kragten b5821ef499 Update frontend to 20250626.0 (#147601) 2025-06-26 17:46:45 +02:00
Fabio Natanael Kepler 1a92d4530e Fix playing TTS and local media source over DLNA (#134903)
Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-26 17:12:15 +02:00
Joost Lekkerkerker 7b80c1c693 Add default conversation name for OpenAI integration (#147597) 2025-06-26 17:11:48 +02:00
Joost Lekkerkerker e7cc03c1d9 Add default title to migrated Claude entry (#147598) 2025-06-26 17:11:13 +02:00
Luca Angemi 69f0b6244a Remove default icon for wind direction sensor for Buienradar (#147603)
* Fix wind direction state class sensor

* Remove default icon for wind direction sensor
2025-06-26 17:05:59 +02:00
Joost Lekkerkerker 01205f8a14 Add default title to migrated Ollama entry (#147599) 2025-06-26 17:05:26 +02:00
hanwg 68924d23ab Fix Telegram bot default target when sending messages (#147470)
* handle targets

* updated error message

* validate chat id for single target

* add validation for chat id

* handle empty target

* handle empty target
2025-06-26 16:43:09 +02:00
Artur Pragacz 40f553a007 Migrate device connections to a normalized form (#140383)
* Normalize device connections migration

* Update version

* Slightly improve tests

* Update homeassistant/helpers/device_registry.py

* Add validators

* Fix validator

* Move format mac function too

* Add validator test

---------

Co-authored-by: Erik Montnemery <erik@montnemery.com>
2025-06-26 15:33:34 +02:00
Robin Lintermann bc46894b74 Fixed issue when tests (should) fail in Smarla (#146102)
* Fixed issue when tests (should) fail

* Use usefixture decorator

* Throw ConfigEntryError instead of AuthFailed
2025-06-26 15:30:03 +02:00
Anders Peter Fugmann 6f4615f012 Bump dependency on pyW215 for DLink integration to 0.8.0 (#147534) 2025-06-26 12:56:46 +02:00
Joost Lekkerkerker 4244d2f66f Set right model in OpenAI conversation (#147575) 2025-06-26 12:49:33 +02:00
Petar Petrov a73dafe097 Hide unnamed paths when selecting a USB Z-Wave adapter (#147571)
* Hide unnamed paths when selecting a USB Z-Wave adapter

* remove pointless sorting
2025-06-26 12:15:02 +02:00
Stefan Agner be49296547 Deduplicate shared logic in Matter vacuum commands (#147578)
Get the run mode by tag in a single place to avoid code duplication.
Also raise an error if the run mode (unexpectedly) is not found.
2025-06-26 11:54:52 +02:00
Marcel van der Veldt d55ecd885e Do not make the favorite button unavailable when no content playing on a Music Assistant player (#147579) 2025-06-26 11:49:06 +02:00
Luca Angemi 076248c455 Fix wind direction state class sensor for AEMET (#147535) 2025-06-26 11:07:07 +02:00
Petar Petrov 13ce27c94c Remove obsolete routing info when migrating a Z-Wave network (#147568) 2025-06-26 11:06:36 +02:00
Joost Lekkerkerker 4b9b08ece5 Show current Lametric version if there is no newer version (#147538) 2025-06-26 10:55:31 +02:00
Simone Chemelli 79df38eff2 Improve config flow strings for Alexa Devices (#147523) 2025-06-26 10:52:14 +02:00
tronikos fb133664e4 Include subentries in Google Generative AI diagnostics (#147558) 2025-06-26 10:50:47 +02:00
Marcel van der Veldt 38669ce96c Fix sending commands to Matter vacuum (#147567) 2025-06-26 10:47:24 +02:00
Petar Petrov 651b33d49b Bump zwave-js-server-python to 0.65.0 (#147561)
* Bump zwave-js-server-python to 0.65.0

* update tests
2025-06-26 10:11:25 +03:00
Erik Montnemery 3b64db5f76 Set end date for when allowing unique id collisions in config entries (#147516)
* Set end date for when allowing unique id collisions in config entries

* Update test
2025-06-26 08:20:26 +02:00
tronikos 0f95fe566c Use default title for migrated Google Generative AI entries (#147551) 2025-06-25 22:30:41 -04:00
Simone Chemelli 6290facffb Fix unload for Alexa Devices (#147548) 2025-06-26 01:55:58 +02:00
tronikos f0a78aadbe Fixes in Google AI TTS (#147501)
* Fix Google AI not using correct config options after subentries migration

* Fixes in Google AI TTS

* Fix tests by @IvanLH

* Change type name.

---------

Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
2025-06-25 18:12:23 -04:00
Pete Sage 345ec97dd5 Add enum sensor for Sonos Power Source (#147449)
* feat: add power source sensor

* fix: translations

* fix:cleanup

* fix: simpify

* fix: improve coverage

* fix: improve coverage

* fix: add missing test

* fix: call it charging_base

* fix: disable entity by default

* update snapshots

* Update homeassistant/components/sonos/strings.json

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>

* fix: update test

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2025-06-25 23:49:06 +02:00
Franck Nijhof 1286b5d9d8 Bump version to 2025.8.0dev0 (#147531) 2025-06-25 21:38:35 +02:00
3168 changed files with 229765 additions and 40510 deletions
+1
View File
@@ -8,6 +8,7 @@
"PYTHONASYNCIODEBUG": "1"
},
"features": {
"ghcr.io/anthropics/devcontainer-features/claude-code:1.0": {},
"ghcr.io/devcontainers/features/github-cli:1": {}
},
// Port 5683 udp is used by Shelly integration
+53
View File
@@ -0,0 +1,53 @@
name: Task
description: For staff only - Create a task
type: Task
body:
- type: markdown
attributes:
value: |
## ⚠️ RESTRICTED ACCESS
**This form is restricted to Open Home Foundation staff, authorized contributors, and integration code owners only.**
If you are a community member wanting to contribute, please:
- For bug reports: Use the [bug report form](https://github.com/home-assistant/core/issues/new?template=bug_report.yml)
- For feature requests: Submit to [Feature Requests](https://github.com/orgs/home-assistant/discussions)
---
### For authorized contributors
Use this form to create tasks for development work, improvements, or other actionable items that need to be tracked.
- type: textarea
id: description
attributes:
label: Description
description: |
Provide a clear and detailed description of the task that needs to be accomplished.
Be specific about what needs to be done, why it's important, and any constraints or requirements.
placeholder: |
Describe the task, including:
- What needs to be done
- Why this task is needed
- Expected outcome
- Any constraints or requirements
validations:
required: true
- type: textarea
id: additional_context
attributes:
label: Additional context
description: |
Any additional information, links, research, or context that would be helpful.
Include links to related issues, research, prototypes, roadmap opportunities etc.
placeholder: |
- Roadmap opportunity: [link]
- Epic: [link]
- Feature request: [link]
- Technical design documents: [link]
- Prototype/mockup: [link]
- Dependencies: [links]
validations:
required: false
File diff suppressed because it is too large Load Diff
+3
View File
@@ -6,3 +6,6 @@ updates:
interval: daily
time: "06:00"
open-pull-requests-limit: 10
labels:
- dependency
- github_actions
+15 -15
View File
@@ -27,7 +27,7 @@ jobs:
publish: ${{ steps.version.outputs.publish }}
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
with:
fetch-depth: 0
@@ -90,7 +90,7 @@ jobs:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Download nightly wheels of frontend
if: needs.init.outputs.channel == 'dev'
@@ -175,7 +175,7 @@ jobs:
sed -i "s|pykrakenapi|# pykrakenapi|g" requirements_all.txt
- name: Download translations
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: translations
@@ -190,7 +190,7 @@ jobs:
echo "${{ github.sha }};${{ github.ref }};${{ github.event_name }};${{ github.actor }}" > rootfs/OFFICIAL_IMAGE
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.4.0
uses: docker/login-action@v3.5.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -242,7 +242,7 @@ jobs:
- green
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set build additional args
run: |
@@ -256,7 +256,7 @@ jobs:
fi
- name: Login to GitHub Container Registry
uses: docker/login-action@v3.4.0
uses: docker/login-action@v3.5.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -279,7 +279,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Initialize git
uses: home-assistant/actions/helpers/git-init@master
@@ -321,23 +321,23 @@ jobs:
registry: ["ghcr.io/home-assistant", "docker.io/homeassistant"]
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Install Cosign
uses: sigstore/cosign-installer@v3.9.1
uses: sigstore/cosign-installer@v3.9.2
with:
cosign-release: "v2.2.3"
- name: Login to DockerHub
if: matrix.registry == 'docker.io/homeassistant'
uses: docker/login-action@v3.4.0
uses: docker/login-action@v3.5.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GitHub Container Registry
if: matrix.registry == 'ghcr.io/home-assistant'
uses: docker/login-action@v3.4.0
uses: docker/login-action@v3.5.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
@@ -454,7 +454,7 @@ jobs:
if: github.repository_owner == 'home-assistant' && needs.init.outputs.publish == 'true'
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.6.0
@@ -462,7 +462,7 @@ jobs:
python-version: ${{ env.DEFAULT_PYTHON }}
- name: Download translations
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: translations
@@ -499,10 +499,10 @@ jobs:
HASSFEST_IMAGE_TAG: ghcr.io/home-assistant/hassfest:${{ needs.init.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
- name: Login to GitHub Container Registry
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
+49 -49
View File
@@ -37,10 +37,10 @@ on:
type: boolean
env:
CACHE_VERSION: 3
CACHE_VERSION: 5
UV_CACHE_VERSION: 1
MYPY_CACHE_VERSION: 1
HA_SHORT_VERSION: "2025.7"
HA_SHORT_VERSION: "2025.9"
DEFAULT_PYTHON: "3.13"
ALL_PYTHON_VERSIONS: "['3.13']"
# 10.3 is the oldest supported version
@@ -94,7 +94,7 @@ jobs:
runs-on: ubuntu-24.04
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Generate partial Python venv restore key
id: generate_python_cache_key
run: |
@@ -246,7 +246,7 @@ jobs:
- info
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -255,7 +255,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache@v4.2.3
uses: actions/cache@v4.2.4
with:
path: venv
key: >-
@@ -271,7 +271,7 @@ jobs:
uv pip install "$(cat requirements_test.txt | grep pre-commit)"
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache@v4.2.3
uses: actions/cache@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
lookup-only: true
@@ -292,7 +292,7 @@ jobs:
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.6.0
id: python
@@ -301,7 +301,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -310,7 +310,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -332,7 +332,7 @@ jobs:
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.6.0
id: python
@@ -341,7 +341,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -350,7 +350,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -372,7 +372,7 @@ jobs:
- pre-commit
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.6.0
id: python
@@ -381,7 +381,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -390,7 +390,7 @@ jobs:
needs.info.outputs.pre-commit_cache_key }}
- name: Restore pre-commit environment from cache
id: cache-precommit
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: ${{ env.PRE_COMMIT_CACHE }}
fail-on-cache-miss: true
@@ -462,7 +462,7 @@ jobs:
- script/hassfest/docker/Dockerfile
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Register hadolint problem matcher
run: |
echo "::add-matcher::.github/workflows/matchers/hadolint.json"
@@ -481,7 +481,7 @@ jobs:
python-version: ${{ fromJSON(needs.info.outputs.python_versions) }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -497,7 +497,7 @@ jobs:
env.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@v4.2.3
uses: actions/cache@v4.2.4
with:
path: venv
key: >-
@@ -505,7 +505,7 @@ jobs:
needs.info.outputs.python_cache_key }}
- name: Restore uv wheel cache
if: steps.cache-venv.outputs.cache-hit != 'true'
uses: actions/cache@v4.2.3
uses: actions/cache@v4.2.4
with:
path: ${{ env.UV_CACHE_DIR }}
key: >-
@@ -584,7 +584,7 @@ jobs:
sudo apt-get -y install \
libturbojpeg
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -593,7 +593,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -617,7 +617,7 @@ jobs:
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -626,7 +626,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -651,7 +651,7 @@ jobs:
&& github.event_name == 'pull_request'
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Dependency review
uses: actions/dependency-review-action@v4.7.1
with:
@@ -674,7 +674,7 @@ jobs:
python-version: ${{ fromJson(needs.info.outputs.python_versions) }}
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -683,7 +683,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -717,7 +717,7 @@ jobs:
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -726,7 +726,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -764,7 +764,7 @@ jobs:
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -773,7 +773,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -809,7 +809,7 @@ jobs:
- base
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -825,7 +825,7 @@ jobs:
env.HA_SHORT_VERSION }}-$(date -u '+%Y-%m-%dT%H:%M:%s')" >> $GITHUB_OUTPUT
- name: Restore full Python ${{ env.DEFAULT_PYTHON }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -833,7 +833,7 @@ jobs:
${{ runner.os }}-${{ runner.arch }}-${{ steps.python.outputs.python-version }}-${{
needs.info.outputs.python_cache_key }}
- name: Restore mypy cache
uses: actions/cache@v4.2.3
uses: actions/cache@v4.2.4
with:
path: .mypy_cache
key: >-
@@ -886,7 +886,7 @@ jobs:
libturbojpeg \
libgammu-dev
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
uses: actions/setup-python@v5.6.0
@@ -895,7 +895,7 @@ jobs:
check-latest: true
- name: Restore base Python virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -947,7 +947,7 @@ jobs:
libgammu-dev \
libxml2-utils
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -956,7 +956,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -970,7 +970,7 @@ jobs:
run: |
echo "::add-matcher::.github/workflows/matchers/pytest-slow.json"
- name: Download pytest_buckets
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: pytest_buckets
- name: Compile English translations
@@ -1080,7 +1080,7 @@ jobs:
libmariadb-dev-compat \
libxml2-utils
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -1089,7 +1089,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -1222,7 +1222,7 @@ jobs:
sudo apt-get -y install \
postgresql-server-dev-14
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -1231,7 +1231,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -1334,9 +1334,9 @@ jobs:
timeout-minutes: 10
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
pattern: coverage-*
- name: Upload coverage to Codecov
@@ -1381,7 +1381,7 @@ jobs:
libgammu-dev \
libxml2-utils
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ matrix.python-version }}
id: python
uses: actions/setup-python@v5.6.0
@@ -1390,7 +1390,7 @@ jobs:
check-latest: true
- name: Restore full Python ${{ matrix.python-version }} virtual environment
id: cache-venv
uses: actions/cache/restore@v4.2.3
uses: actions/cache/restore@v4.2.4
with:
path: venv
fail-on-cache-miss: true
@@ -1484,9 +1484,9 @@ jobs:
timeout-minutes: 10
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
pattern: coverage-*
- name: Upload coverage to Codecov
@@ -1511,7 +1511,7 @@ jobs:
timeout-minutes: 10
steps:
- name: Download all coverage artifacts
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
pattern: test-results-*
- name: Upload test results to Codecov
+3 -3
View File
@@ -21,14 +21,14 @@ jobs:
steps:
- name: Check out code from GitHub
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Initialize CodeQL
uses: github/codeql-action/init@v3.29.0
uses: github/codeql-action/init@v3.29.9
with:
languages: python
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3.29.0
uses: github/codeql-action/analyze@v3.29.9
with:
category: "/language:python"
@@ -231,7 +231,7 @@ jobs:
- name: Detect duplicates using AI
id: ai_detection
if: steps.extract.outputs.should_continue == 'true' && steps.fetch_similar.outputs.has_similar == 'true'
uses: actions/ai-inference@v1.1.0
uses: actions/ai-inference@v2.0.0
with:
model: openai/gpt-4o
system-prompt: |
@@ -57,7 +57,7 @@ jobs:
- name: Detect language using AI
id: ai_language_detection
if: steps.detect_language.outputs.should_continue == 'true'
uses: actions/ai-inference@v1.1.0
uses: actions/ai-inference@v2.0.0
with:
model: openai/gpt-4o-mini
system-prompt: |
@@ -0,0 +1,84 @@
name: Restrict task creation
# yamllint disable-line rule:truthy
on:
issues:
types: [opened]
jobs:
check-authorization:
runs-on: ubuntu-latest
# Only run if this is a Task issue type (from the issue form)
if: github.event.issue.type.name == 'Task'
steps:
- name: Check if user is authorized
uses: actions/github-script@v7
with:
script: |
const issueAuthor = context.payload.issue.user.login;
// First check if user is an organization member
try {
await github.rest.orgs.checkMembershipForUser({
org: 'home-assistant',
username: issueAuthor
});
console.log(`✅ ${issueAuthor} is an organization member`);
return; // Authorized, no need to check further
} catch (error) {
console.log(`️ ${issueAuthor} is not an organization member, checking codeowners...`);
}
// If not an org member, check if they're a codeowner
try {
// Fetch CODEOWNERS file from the repository
const { data: codeownersFile } = await github.rest.repos.getContent({
owner: context.repo.owner,
repo: context.repo.repo,
path: 'CODEOWNERS',
ref: 'dev'
});
// Decode the content (it's base64 encoded)
const codeownersContent = Buffer.from(codeownersFile.content, 'base64').toString('utf-8');
// Check if the issue author is mentioned in CODEOWNERS
// GitHub usernames in CODEOWNERS are prefixed with @
if (codeownersContent.includes(`@${issueAuthor}`)) {
console.log(`✅ ${issueAuthor} is a integration code owner`);
return; // Authorized
}
} catch (error) {
console.error('Error checking CODEOWNERS:', error);
}
// If we reach here, user is not authorized
console.log(`❌ ${issueAuthor} is not authorized to create Task issues`);
// Close the issue with a comment
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `Hi @${issueAuthor}, thank you for your contribution!\n\n` +
`Task issues are restricted to Open Home Foundation staff, authorized contributors, and integration code owners.\n\n` +
`If you would like to:\n` +
`- Report a bug: Please use the [bug report form](https://github.com/home-assistant/core/issues/new?template=bug_report.yml)\n` +
`- Request a feature: Please submit to [Feature Requests](https://github.com/orgs/home-assistant/discussions)\n\n` +
`If you believe you should have access to create Task issues, please contact the maintainers.`
});
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
state: 'closed'
});
// Add a label to indicate this was auto-closed
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['auto-closed']
});
+1 -1
View File
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
uses: actions/setup-python@v5.6.0
+12 -12
View File
@@ -32,7 +32,7 @@ jobs:
architectures: ${{ steps.info.outputs.architectures }}
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
id: python
@@ -135,20 +135,20 @@ jobs:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Download env_file
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: env_file
- name: Download build_constraints
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: build_constraints
- name: Download requirements_diff
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: requirements_diff
@@ -159,7 +159,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt
- name: Build wheels
uses: home-assistant/wheels@2025.03.0
uses: home-assistant/wheels@2025.07.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
@@ -184,25 +184,25 @@ jobs:
arch: ${{ fromJson(needs.init.outputs.architectures) }}
steps:
- name: Checkout the repository
uses: actions/checkout@v4.2.2
uses: actions/checkout@v5.0.0
- name: Download env_file
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: env_file
- name: Download build_constraints
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: build_constraints
- name: Download requirements_diff
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: requirements_diff
- name: Download requirements_all_wheels
uses: actions/download-artifact@v4.3.0
uses: actions/download-artifact@v5.0.0
with:
name: requirements_all_wheels
@@ -219,7 +219,7 @@ jobs:
sed -i "/uv/d" requirements_diff.txt
- name: Build wheels
uses: home-assistant/wheels@2025.03.0
uses: home-assistant/wheels@2025.07.0
with:
abi: ${{ matrix.abi }}
tag: musllinux_1_2
+5 -1
View File
@@ -137,4 +137,8 @@ tmp_cache
.ropeproject
# Will be created from script/split_tests.py
pytest_buckets.txt
pytest_buckets.txt
# AI tooling
.claude
+2 -2
View File
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.12.0
rev: v0.12.1
hooks:
- id: ruff-check
args:
@@ -18,7 +18,7 @@ repos:
exclude_types: [csv, json, html]
exclude: ^tests/fixtures/|homeassistant/generated/|tests/components/.*/snapshots/
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
rev: v6.0.0
hooks:
- id: check-executables-have-shebangs
stages: [manual]
+7 -1
View File
@@ -53,6 +53,7 @@ homeassistant.components.air_quality.*
homeassistant.components.airgradient.*
homeassistant.components.airly.*
homeassistant.components.airnow.*
homeassistant.components.airos.*
homeassistant.components.airq.*
homeassistant.components.airthings.*
homeassistant.components.airthings_ble.*
@@ -309,7 +310,6 @@ homeassistant.components.letpot.*
homeassistant.components.lidarr.*
homeassistant.components.lifx.*
homeassistant.components.light.*
homeassistant.components.linear_garage_door.*
homeassistant.components.linkplay.*
homeassistant.components.litejet.*
homeassistant.components.litterrobot.*
@@ -377,10 +377,12 @@ homeassistant.components.onedrive.*
homeassistant.components.onewire.*
homeassistant.components.onkyo.*
homeassistant.components.open_meteo.*
homeassistant.components.open_router.*
homeassistant.components.openai_conversation.*
homeassistant.components.openexchangerates.*
homeassistant.components.opensky.*
homeassistant.components.openuv.*
homeassistant.components.opower.*
homeassistant.components.oralb.*
homeassistant.components.otbr.*
homeassistant.components.overkiz.*
@@ -464,6 +466,7 @@ homeassistant.components.simplisafe.*
homeassistant.components.siren.*
homeassistant.components.skybell.*
homeassistant.components.slack.*
homeassistant.components.sleep_as_android.*
homeassistant.components.sleepiq.*
homeassistant.components.smhi.*
homeassistant.components.smlight.*
@@ -499,6 +502,7 @@ homeassistant.components.tag.*
homeassistant.components.tailscale.*
homeassistant.components.tailwind.*
homeassistant.components.tami4.*
homeassistant.components.tankerkoenig.*
homeassistant.components.tautulli.*
homeassistant.components.tcp.*
homeassistant.components.technove.*
@@ -534,6 +538,7 @@ homeassistant.components.unifiprotect.*
homeassistant.components.upcloud.*
homeassistant.components.update.*
homeassistant.components.uptime.*
homeassistant.components.uptime_kuma.*
homeassistant.components.uptimerobot.*
homeassistant.components.usb.*
homeassistant.components.uvc.*
@@ -543,6 +548,7 @@ homeassistant.components.valve.*
homeassistant.components.velbus.*
homeassistant.components.vlc_telnet.*
homeassistant.components.vodafone_station.*
homeassistant.components.volvo.*
homeassistant.components.wake_on_lan.*
homeassistant.components.wake_word.*
homeassistant.components.wallbox.*
Symlink
+1
View File
@@ -0,0 +1 @@
.github/copilot-instructions.md
Generated
+20 -12
View File
@@ -67,6 +67,8 @@ build.json @home-assistant/supervisor
/tests/components/airly/ @bieniu
/homeassistant/components/airnow/ @asymworks
/tests/components/airnow/ @asymworks
/homeassistant/components/airos/ @CoMPaTech
/tests/components/airos/ @CoMPaTech
/homeassistant/components/airq/ @Sibgatulin @dl2080
/tests/components/airq/ @Sibgatulin @dl2080
/homeassistant/components/airthings/ @danielhiversen @LaStrada
@@ -154,8 +156,8 @@ build.json @home-assistant/supervisor
/tests/components/assist_pipeline/ @balloob @synesthesiam
/homeassistant/components/assist_satellite/ @home-assistant/core @synesthesiam
/tests/components/assist_satellite/ @home-assistant/core @synesthesiam
/homeassistant/components/asuswrt/ @kennedyshead @ollo69
/tests/components/asuswrt/ @kennedyshead @ollo69
/homeassistant/components/asuswrt/ @kennedyshead @ollo69 @Vaskivskyi
/tests/components/asuswrt/ @kennedyshead @ollo69 @Vaskivskyi
/homeassistant/components/atag/ @MatsNL
/tests/components/atag/ @MatsNL
/homeassistant/components/aten_pe/ @mtdcr
@@ -452,8 +454,8 @@ build.json @home-assistant/supervisor
/tests/components/eq3btsmart/ @eulemitkeule @dbuezas
/homeassistant/components/escea/ @lazdavila
/tests/components/escea/ @lazdavila
/homeassistant/components/esphome/ @OttoWinter @jesserockz @kbx81 @bdraco
/tests/components/esphome/ @OttoWinter @jesserockz @kbx81 @bdraco
/homeassistant/components/esphome/ @jesserockz @kbx81 @bdraco
/tests/components/esphome/ @jesserockz @kbx81 @bdraco
/homeassistant/components/eufylife_ble/ @bdr99
/tests/components/eufylife_ble/ @bdr99
/homeassistant/components/event/ @home-assistant/core
@@ -684,8 +686,8 @@ build.json @home-assistant/supervisor
/tests/components/husqvarna_automower/ @Thomas55555
/homeassistant/components/husqvarna_automower_ble/ @alistair23
/tests/components/husqvarna_automower_ble/ @alistair23
/homeassistant/components/huum/ @frwickst
/tests/components/huum/ @frwickst
/homeassistant/components/huum/ @frwickst @vincentwolsink
/tests/components/huum/ @frwickst @vincentwolsink
/homeassistant/components/hvv_departures/ @vigonotion
/tests/components/hvv_departures/ @vigonotion
/homeassistant/components/hydrawise/ @dknowles2 @thomaskistler @ptcryan
@@ -860,8 +862,6 @@ build.json @home-assistant/supervisor
/tests/components/lifx/ @Djelibeybi
/homeassistant/components/light/ @home-assistant/core
/tests/components/light/ @home-assistant/core
/homeassistant/components/linear_garage_door/ @IceBotYT
/tests/components/linear_garage_door/ @IceBotYT
/homeassistant/components/linkplay/ @Velleman
/tests/components/linkplay/ @Velleman
/homeassistant/components/linux_battery/ @fabaff
@@ -1102,6 +1102,8 @@ build.json @home-assistant/supervisor
/tests/components/onvif/ @hunterjm @jterrace
/homeassistant/components/open_meteo/ @frenck
/tests/components/open_meteo/ @frenck
/homeassistant/components/open_router/ @joostlek
/tests/components/open_router/ @joostlek
/homeassistant/components/openai_conversation/ @balloob
/tests/components/openai_conversation/ @balloob
/homeassistant/components/openerz/ @misialq
@@ -1413,6 +1415,8 @@ build.json @home-assistant/supervisor
/tests/components/skybell/ @tkdrob
/homeassistant/components/slack/ @tkdrob @fletcherau
/tests/components/slack/ @tkdrob @fletcherau
/homeassistant/components/sleep_as_android/ @tr4nt0r
/tests/components/sleep_as_android/ @tr4nt0r
/homeassistant/components/sleepiq/ @mfugate1 @kbickar
/tests/components/sleepiq/ @mfugate1 @kbickar
/homeassistant/components/slide/ @ualex73
@@ -1595,6 +1599,8 @@ build.json @home-assistant/supervisor
/tests/components/todo/ @home-assistant/core
/homeassistant/components/todoist/ @boralyl
/tests/components/todoist/ @boralyl
/homeassistant/components/togrill/ @elupus
/tests/components/togrill/ @elupus
/homeassistant/components/tolo/ @MatthiasLohr
/tests/components/tolo/ @MatthiasLohr
/homeassistant/components/tomorrowio/ @raman325 @lymanepp
@@ -1609,8 +1615,6 @@ build.json @home-assistant/supervisor
/tests/components/tplink_omada/ @MarkGodwin
/homeassistant/components/traccar/ @ludeeus
/tests/components/traccar/ @ludeeus
/homeassistant/components/traccar_server/ @ludeeus
/tests/components/traccar_server/ @ludeeus
/homeassistant/components/trace/ @home-assistant/core
/tests/components/trace/ @home-assistant/core
/homeassistant/components/tractive/ @Danielhiversen @zhulik @bieniu
@@ -1658,6 +1662,8 @@ build.json @home-assistant/supervisor
/tests/components/upnp/ @StevenLooman
/homeassistant/components/uptime/ @frenck
/tests/components/uptime/ @frenck
/homeassistant/components/uptime_kuma/ @tr4nt0r
/tests/components/uptime_kuma/ @tr4nt0r
/homeassistant/components/uptimerobot/ @ludeeus @chemelli74
/tests/components/uptimerobot/ @ludeeus @chemelli74
/homeassistant/components/usb/ @bdraco
@@ -1702,6 +1708,8 @@ build.json @home-assistant/supervisor
/tests/components/voip/ @balloob @synesthesiam @jaminh
/homeassistant/components/volumio/ @OnFreund
/tests/components/volumio/ @OnFreund
/homeassistant/components/volvo/ @thomasddn
/tests/components/volvo/ @thomasddn
/homeassistant/components/volvooncall/ @molobrakos
/tests/components/volvooncall/ @molobrakos
/homeassistant/components/vulcan/ @Antoni-Czaplicki
@@ -1756,8 +1764,8 @@ build.json @home-assistant/supervisor
/homeassistant/components/wirelesstag/ @sergeymaysak
/homeassistant/components/withings/ @joostlek
/tests/components/withings/ @joostlek
/homeassistant/components/wiz/ @sbidy
/tests/components/wiz/ @sbidy
/homeassistant/components/wiz/ @sbidy @arturpragacz
/tests/components/wiz/ @sbidy @arturpragacz
/homeassistant/components/wled/ @frenck
/tests/components/wled/ @frenck
/homeassistant/components/wmspro/ @mback2k
Generated
+1 -1
View File
@@ -31,7 +31,7 @@ RUN \
&& go2rtc --version
# Install uv
RUN pip3 install uv==0.7.1
RUN pip3 install uv==0.8.9
WORKDIR /usr/src
+10 -17
View File
@@ -1,15 +1,7 @@
FROM mcr.microsoft.com/devcontainers/python:1-3.13
FROM mcr.microsoft.com/vscode/devcontainers/base:debian
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Uninstall pre-installed formatting and linting tools
# They would conflict with our pinned versions
RUN \
pipx uninstall pydocstyle \
&& pipx uninstall pycodestyle \
&& pipx uninstall mypy \
&& pipx uninstall pylint
RUN \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
&& apt-get update \
@@ -32,21 +24,18 @@ RUN \
libxml2 \
git \
cmake \
autoconf \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Add go2rtc binary
COPY --from=ghcr.io/alexxit/go2rtc:latest /usr/local/bin/go2rtc /bin/go2rtc
# Install uv
RUN pip3 install uv
WORKDIR /usr/src
# Setup hass-release
RUN git clone --depth 1 https://github.com/home-assistant/hass-release \
&& uv pip install --system -e hass-release/ \
&& chown -R vscode /usr/src/hass-release/data
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
RUN uv python install 3.13.2
USER vscode
ENV VIRTUAL_ENV="/home/vscode/.local/ha-venv"
@@ -55,6 +44,10 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH"
WORKDIR /tmp
# Setup hass-release
RUN git clone --depth 1 https://github.com/home-assistant/hass-release ~/hass-release \
&& uv pip install -e ~/hass-release/
# Install Python dependencies from requirements
COPY requirements.txt ./
COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt
@@ -65,4 +58,4 @@ RUN uv pip install -r requirements_test.txt
WORKDIR /workspaces
# Set the default shell to bash instead of sh
ENV SHELL /bin/bash
ENV SHELL=/bin/bash
+3
View File
@@ -120,6 +120,9 @@ class AuthStore:
new_user = models.User(**kwargs)
while new_user.id in self._users:
new_user = models.User(**kwargs)
self._users[new_user.id] = new_user
if credentials is None:
+4 -1
View File
@@ -33,7 +33,10 @@ class AuthFlowContext(FlowContext, total=False):
redirect_uri: str
AuthFlowResult = FlowResult[AuthFlowContext, tuple[str, str]]
class AuthFlowResult(FlowResult[AuthFlowContext, tuple[str, str]], total=False):
"""Typed result dict for auth flow."""
result: Credentials # Only present if type is CREATE_ENTRY
@attr.s(slots=True)
+31 -38
View File
@@ -75,8 +75,8 @@ from .core_config import async_process_ha_core_config
from .exceptions import HomeAssistantError
from .helpers import (
area_registry,
backup,
category_registry,
condition,
config_validation as cv,
device_registry,
entity,
@@ -332,6 +332,9 @@ async def async_setup_hass(
if not is_virtual_env():
await async_mount_local_lib_path(runtime_config.config_dir)
if hass.config.safe_mode:
_LOGGER.info("Starting in safe mode")
basic_setup_success = (
await async_from_config_dict(config_dict, hass) is not None
)
@@ -384,8 +387,6 @@ async def async_setup_hass(
{"recovery_mode": {}, "http": http_conf},
hass,
)
elif hass.config.safe_mode:
_LOGGER.info("Starting in safe mode")
if runtime_config.open_ui:
hass.add_job(open_hass_ui, hass)
@@ -453,6 +454,7 @@ async def async_load_base_functionality(hass: core.HomeAssistant) -> None:
create_eager_task(restore_state.async_load(hass)),
create_eager_task(hass.config_entries.async_initialize()),
create_eager_task(async_get_system_info(hass)),
create_eager_task(condition.async_setup(hass)),
create_eager_task(trigger.async_setup(hass)),
)
@@ -607,7 +609,7 @@ async def async_enable_logging(
)
threading.excepthook = lambda args: logging.getLogger().exception(
"Uncaught thread exception",
exc_info=( # type: ignore[arg-type] # noqa: LOG014
exc_info=( # type: ignore[arg-type]
args.exc_type,
args.exc_value,
args.exc_traceback,
@@ -693,10 +695,10 @@ async def async_mount_local_lib_path(config_dir: str) -> str:
def _get_domains(hass: core.HomeAssistant, config: dict[str, Any]) -> set[str]:
"""Get domains of components to set up."""
# Filter out the repeating and common config section [homeassistant]
domains = {
domain for key in config if (domain := cv.domain_key(key)) != core.DOMAIN
}
# The common config section [homeassistant] could be filtered here,
# but that is not necessary, since it corresponds to the core integration,
# that is always unconditionally loaded.
domains = {cv.domain_key(key) for key in config}
# Add config entry and default domains
if not hass.config.recovery_mode:
@@ -724,34 +726,28 @@ async def _async_resolve_domains_and_preload(
together with all their dependencies.
"""
domains_to_setup = _get_domains(hass, config)
platform_integrations = conf_util.extract_platform_integrations(
config, BASE_PLATFORMS
)
# Ensure base platforms that have platform integrations are added to `domains`,
# so they can be setup first instead of discovering them later when a config
# entry setup task notices that it's needed and there is already a long line
# to use the import executor.
# Also process all base platforms since we do not require the manifest
# to list them as dependencies.
# We want to later avoid lock contention when multiple integrations try to load
# their manifests at once.
#
# Additionally process integrations that are defined under base platforms
# to speed things up.
# For example if we have
# sensor:
# - platform: template
#
# `template` has to be loaded to validate the config for sensor
# so we want to start loading `sensor` as soon as we know
# it will be needed. The more platforms under `sensor:`, the longer
# `template` has to be loaded to validate the config for sensor.
# The more platforms under `sensor:`, the longer
# it will take to finish setup for `sensor` because each of these
# platforms has to be imported before we can validate the config.
#
# Thankfully we are migrating away from the platform pattern
# so this will be less of a problem in the future.
domains_to_setup.update(platform_integrations)
# Additionally process base platforms since we do not require the manifest
# to list them as dependencies.
# We want to later avoid lock contention when multiple integrations try to load
# their manifests at once.
# Also process integrations that are defined under base platforms
# to speed things up.
platform_integrations = conf_util.extract_platform_integrations(
config, BASE_PLATFORMS
)
additional_domains_to_process = {
*BASE_PLATFORMS,
*chain.from_iterable(platform_integrations.values()),
@@ -869,9 +865,9 @@ async def _async_set_up_integrations(
domains = set(integrations) & all_domains
_LOGGER.info(
"Domains to be set up: %s | %s",
domains,
all_domains - domains,
"Domains to be set up: %s\nDependencies: %s",
domains or "{}",
(all_domains - domains) or "{}",
)
async_set_domains_to_be_loaded(hass, all_domains)
@@ -880,10 +876,6 @@ async def _async_set_up_integrations(
if "recorder" in all_domains:
recorder.async_initialize_recorder(hass)
# Initialize backup
if "backup" in all_domains:
backup.async_initialize_backup(hass)
stages: list[tuple[str, set[str], int | None]] = [
*(
(name, domain_group, timeout)
@@ -916,12 +908,13 @@ async def _async_set_up_integrations(
stage_all_domains = stage_domains | stage_dep_domains
_LOGGER.info(
"Setting up stage %s: %s | %s\nDependencies: %s | %s",
"Setting up stage %s: %s; already set up: %s\n"
"Dependencies: %s; already set up: %s",
name,
stage_domains,
stage_domains_unfiltered - stage_domains,
stage_dep_domains,
stage_dep_domains_unfiltered - stage_dep_domains,
(stage_domains_unfiltered - stage_domains) or "{}",
stage_dep_domains or "{}",
(stage_dep_domains_unfiltered - stage_dep_domains) or "{}",
)
if timeout is None:
@@ -1061,5 +1054,5 @@ async def _async_setup_multi_components(
_LOGGER.error(
"Error setting up integration %s - received exception",
domain,
exc_info=(type(result), result, result.__traceback__), # noqa: LOG014
exc_info=(type(result), result, result.__traceback__),
)
+5
View File
@@ -0,0 +1,5 @@
{
"domain": "frient",
"name": "Frient",
"iot_standards": ["zigbee"]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"domain": "third_reality",
"name": "Third Reality",
"iot_standards": ["zigbee"]
"iot_standards": ["matter", "zigbee"]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"domain": "ubiquiti",
"name": "Ubiquiti",
"integrations": ["unifi", "unifi_direct", "unifiled", "unifiprotect"]
"integrations": ["airos", "unifi", "unifi_direct", "unifiled", "unifiprotect"]
}
+34 -2
View File
@@ -1,11 +1,12 @@
"""Integration to offer AI tasks to Home Assistant."""
import logging
from typing import Any
import voluptuous as vol
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.const import ATTR_ENTITY_ID, CONF_DESCRIPTION, CONF_SELECTOR
from homeassistant.core import (
HassJobType,
HomeAssistant,
@@ -14,12 +15,15 @@ from homeassistant.core import (
SupportsResponse,
callback,
)
from homeassistant.helpers import config_validation as cv, storage
from homeassistant.helpers import config_validation as cv, selector, storage
from homeassistant.helpers.entity_component import EntityComponent
from homeassistant.helpers.typing import UNDEFINED, ConfigType, UndefinedType
from .const import (
ATTR_ATTACHMENTS,
ATTR_INSTRUCTIONS,
ATTR_REQUIRED,
ATTR_STRUCTURE,
ATTR_TASK_NAME,
DATA_COMPONENT,
DATA_PREFERENCES,
@@ -47,6 +51,27 @@ _LOGGER = logging.getLogger(__name__)
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
STRUCTURE_FIELD_SCHEMA = vol.Schema(
{
vol.Optional(CONF_DESCRIPTION): str,
vol.Optional(ATTR_REQUIRED): bool,
vol.Required(CONF_SELECTOR): selector.validate_selector,
}
)
def _validate_structure_fields(value: dict[str, Any]) -> vol.Schema:
"""Validate the structure fields as a voluptuous Schema."""
if not isinstance(value, dict):
raise vol.Invalid("Structure must be a dictionary")
fields = {}
for k, v in value.items():
field_class = vol.Required if v.get(ATTR_REQUIRED, False) else vol.Optional
fields[field_class(k, description=v.get(CONF_DESCRIPTION))] = selector.selector(
v[CONF_SELECTOR]
)
return vol.Schema(fields, extra=vol.PREVENT_EXTRA)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Register the process service."""
@@ -64,6 +89,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
vol.Required(ATTR_TASK_NAME): cv.string,
vol.Optional(ATTR_ENTITY_ID): cv.entity_id,
vol.Required(ATTR_INSTRUCTIONS): cv.string,
vol.Optional(ATTR_STRUCTURE): vol.All(
vol.Schema({str: STRUCTURE_FIELD_SCHEMA}),
_validate_structure_fields,
),
vol.Optional(ATTR_ATTACHMENTS): vol.All(
cv.ensure_list, [selector.MediaSelector({"accept": ["*/*"]})]
),
}
),
supports_response=SupportsResponse.ONLY,
@@ -21,6 +21,9 @@ SERVICE_GENERATE_DATA = "generate_data"
ATTR_INSTRUCTIONS: Final = "instructions"
ATTR_TASK_NAME: Final = "task_name"
ATTR_STRUCTURE: Final = "structure"
ATTR_REQUIRED: Final = "required"
ATTR_ATTACHMENTS: Final = "attachments"
DEFAULT_SYSTEM_PROMPT = (
"You are a Home Assistant expert and help users with their tasks."
@@ -32,3 +35,6 @@ class AITaskEntityFeature(IntFlag):
GENERATE_DATA = 1
"""Generate data based on instructions."""
SUPPORT_ATTACHMENTS = 2
"""Support attachments with generate data."""
+7 -4
View File
@@ -13,7 +13,7 @@ from homeassistant.components.conversation import (
)
from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN
from homeassistant.helpers import llm
from homeassistant.helpers.chat_session import async_get_chat_session
from homeassistant.helpers.chat_session import ChatSession
from homeassistant.helpers.restore_state import RestoreEntity
from homeassistant.util import dt as dt_util
@@ -56,12 +56,12 @@ class AITaskEntity(RestoreEntity):
@contextlib.asynccontextmanager
async def _async_get_ai_task_chat_log(
self,
session: ChatSession,
task: GenDataTask,
) -> AsyncGenerator[ChatLog]:
"""Context manager used to manage the ChatLog used during an AI Task."""
# pylint: disable-next=contextmanager-generator-missing-cleanup
with (
async_get_chat_session(self.hass) as session,
async_get_chat_log(
self.hass,
session,
@@ -79,19 +79,22 @@ class AITaskEntity(RestoreEntity):
user_llm_prompt=DEFAULT_SYSTEM_PROMPT,
)
chat_log.async_add_user_content(UserContent(task.instructions))
chat_log.async_add_user_content(
UserContent(task.instructions, attachments=task.attachments)
)
yield chat_log
@final
async def internal_async_generate_data(
self,
session: ChatSession,
task: GenDataTask,
) -> GenDataTaskResult:
"""Run a gen data task."""
self.__last_activity = dt_util.utcnow().isoformat()
self.async_write_ha_state()
async with self._async_get_ai_task_chat_log(task) as chat_log:
async with self._async_get_ai_task_chat_log(session, task) as chat_log:
return await self._async_generate_data(task, chat_log)
async def _async_generate_data(
@@ -1,8 +1,9 @@
{
"domain": "ai_task",
"name": "AI Task",
"after_dependencies": ["camera"],
"codeowners": ["@home-assistant/core"],
"dependencies": ["conversation"],
"dependencies": ["conversation", "media_source"],
"documentation": "https://www.home-assistant.io/integrations/ai_task",
"integration_type": "system",
"quality_scale": "internal"
+17 -3
View File
@@ -10,10 +10,24 @@ generate_data:
required: true
selector:
text:
multiline: true
entity_id:
required: false
selector:
entity:
domain: ai_task
supported_features:
- ai_task.AITaskEntityFeature.GENERATE_DATA
filter:
domain: ai_task
supported_features:
- ai_task.AITaskEntityFeature.GENERATE_DATA
structure:
advanced: true
required: false
example: '{ "name": { "selector": { "text": }, "description": "Name of the user", "required": "True" } } }, "age": { "selector": { "number": }, "description": "Age of the user" } }'
selector:
object:
attachments:
required: false
selector:
media:
accept:
- "*"
@@ -15,6 +15,14 @@
"entity_id": {
"name": "Entity ID",
"description": "Entity ID to run the task on. If not provided, the preferred entity will be used."
},
"structure": {
"name": "Structured output",
"description": "When set, the AI Task will output fields with this in structure. The structure is a dictionary where the keys are the field names and the values contain a 'description', a 'selector', and an optional 'required' field."
},
"attachments": {
"name": "Attachments",
"description": "List of files to attach for multi-modal AI analysis."
}
}
}
+100 -6
View File
@@ -3,20 +3,40 @@
from __future__ import annotations
from dataclasses import dataclass
import mimetypes
from pathlib import Path
import tempfile
from typing import Any
from homeassistant.core import HomeAssistant
import voluptuous as vol
from homeassistant.components import camera, conversation, media_source
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.chat_session import async_get_chat_session
from .const import DATA_COMPONENT, DATA_PREFERENCES, AITaskEntityFeature
def _save_camera_snapshot(image: camera.Image) -> Path:
"""Save camera snapshot to temp file."""
with tempfile.NamedTemporaryFile(
mode="wb",
suffix=mimetypes.guess_extension(image.content_type, False),
delete=False,
) as temp_file:
temp_file.write(image.content)
return Path(temp_file.name)
async def async_generate_data(
hass: HomeAssistant,
*,
task_name: str,
entity_id: str | None = None,
instructions: str,
structure: vol.Schema | None = None,
attachments: list[dict] | None = None,
) -> GenDataTaskResult:
"""Run a task in the AI Task integration."""
if entity_id is None:
@@ -34,12 +54,80 @@ async def async_generate_data(
f"AI Task entity {entity_id} does not support generating data"
)
return await entity.internal_async_generate_data(
GenDataTask(
name=task_name,
instructions=instructions,
# Resolve attachments
resolved_attachments: list[conversation.Attachment] = []
created_files: list[Path] = []
if (
attachments
and AITaskEntityFeature.SUPPORT_ATTACHMENTS not in entity.supported_features
):
raise HomeAssistantError(
f"AI Task entity {entity_id} does not support attachments"
)
for attachment in attachments or []:
media_content_id = attachment["media_content_id"]
# Special case for camera media sources
if media_content_id.startswith("media-source://camera/"):
# Extract entity_id from the media content ID
entity_id = media_content_id.removeprefix("media-source://camera/")
# Get snapshot from camera
image = await camera.async_get_image(hass, entity_id)
temp_filename = await hass.async_add_executor_job(
_save_camera_snapshot, image
)
created_files.append(temp_filename)
resolved_attachments.append(
conversation.Attachment(
media_content_id=media_content_id,
mime_type=image.content_type,
path=temp_filename,
)
)
else:
# Handle regular media sources
media = await media_source.async_resolve_media(hass, media_content_id, None)
if media.path is None:
raise HomeAssistantError(
"Only local attachments are currently supported"
)
resolved_attachments.append(
conversation.Attachment(
media_content_id=media_content_id,
mime_type=media.mime_type,
path=media.path,
)
)
with async_get_chat_session(hass) as session:
if created_files:
def cleanup_files() -> None:
"""Cleanup temporary files."""
for file in created_files:
file.unlink(missing_ok=True)
@callback
def cleanup_files_callback() -> None:
"""Cleanup temporary files."""
hass.async_add_executor_job(cleanup_files)
session.async_on_cleanup(cleanup_files_callback)
return await entity.internal_async_generate_data(
session,
GenDataTask(
name=task_name,
instructions=instructions,
structure=structure,
attachments=resolved_attachments or None,
),
)
)
@dataclass(slots=True)
@@ -52,6 +140,12 @@ class GenDataTask:
instructions: str
"""Instructions on what needs to be done."""
structure: vol.Schema | None = None
"""Optional structure for the data to be generated."""
attachments: list[conversation.Attachment] | None = None
"""List of attachments to go along the instructions."""
def __str__(self) -> str:
"""Return task as a string."""
return f"<GenDataTask {self.name}: {id(self)}>"
@@ -6,6 +6,7 @@
"documentation": "https://www.home-assistant.io/integrations/airgradient",
"integration_type": "device",
"iot_class": "local_polling",
"quality_scale": "platinum",
"requirements": ["airgradient==0.9.2"],
"zeroconf": ["_airgradient._tcp.local."]
}
@@ -14,9 +14,9 @@ rules:
status: exempt
comment: |
This integration does not provide additional actions.
docs-high-level-description: todo
docs-installation-instructions: todo
docs-removal-instructions: todo
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup:
status: exempt
comment: |
@@ -34,7 +34,7 @@ rules:
docs-configuration-parameters:
status: exempt
comment: No options to configure
docs-installation-parameters: todo
docs-installation-parameters: done
entity-unavailable: done
integration-owner: done
log-when-unavailable: done
@@ -43,23 +43,19 @@ rules:
status: exempt
comment: |
This integration does not require authentication.
test-coverage: todo
test-coverage: done
# Gold
devices: done
diagnostics: done
discovery-update-info:
status: todo
comment: DHCP is still possible
discovery:
status: todo
comment: DHCP is still possible
docs-data-update: todo
docs-examples: todo
docs-known-limitations: todo
docs-supported-devices: todo
docs-supported-functions: todo
docs-troubleshooting: todo
docs-use-cases: todo
discovery-update-info: done
discovery: done
docs-data-update: done
docs-examples: done
docs-known-limitations: done
docs-supported-devices: done
docs-supported-functions: done
docs-troubleshooting: done
docs-use-cases: done
dynamic-devices:
status: exempt
comment: |
@@ -45,9 +45,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirNowConfigEntry) -> bo
# Store Entity and Initialize Platforms
entry.runtime_data = coordinator
# Listen for option changes
entry.async_on_unload(entry.add_update_listener(update_listener))
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Clean up unused device entries with no entities
@@ -88,8 +85,3 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: AirNowConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Handle options update."""
await hass.config_entries.async_reload(entry.entry_id)
@@ -13,7 +13,7 @@ from homeassistant.config_entries import (
ConfigEntry,
ConfigFlow,
ConfigFlowResult,
OptionsFlow,
OptionsFlowWithReload,
)
from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_RADIUS
from homeassistant.core import HomeAssistant, callback
@@ -126,7 +126,7 @@ class AirNowConfigFlow(ConfigFlow, domain=DOMAIN):
return AirNowOptionsFlowHandler()
class AirNowOptionsFlowHandler(OptionsFlow):
class AirNowOptionsFlowHandler(OptionsFlowWithReload):
"""Handle an options flow for AirNow."""
async def async_step_init(
@@ -0,0 +1,45 @@
"""The Ubiquiti airOS integration."""
from __future__ import annotations
from airos.airos8 import AirOS
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .coordinator import AirOSConfigEntry, AirOSDataUpdateCoordinator
_PLATFORMS: list[Platform] = [
Platform.BINARY_SENSOR,
Platform.SENSOR,
]
async def async_setup_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> bool:
"""Set up Ubiquiti airOS from a config entry."""
# By default airOS 8 comes with self-signed SSL certificates,
# with no option in the web UI to change or upload a custom certificate.
session = async_get_clientsession(hass, verify_ssl=False)
airos_device = AirOS(
host=entry.data[CONF_HOST],
username=entry.data[CONF_USERNAME],
password=entry.data[CONF_PASSWORD],
session=session,
)
coordinator = AirOSDataUpdateCoordinator(hass, entry, airos_device)
await coordinator.async_config_entry_first_refresh()
entry.runtime_data = coordinator
await hass.config_entries.async_forward_entry_setups(entry, _PLATFORMS)
return True
async def async_unload_entry(hass: HomeAssistant, entry: AirOSConfigEntry) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, _PLATFORMS)
@@ -0,0 +1,106 @@
"""AirOS Binary Sensor component for Home Assistant."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
import logging
from homeassistant.components.binary_sensor import (
BinarySensorDeviceClass,
BinarySensorEntity,
BinarySensorEntityDescription,
)
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .coordinator import AirOSConfigEntry, AirOSData, AirOSDataUpdateCoordinator
from .entity import AirOSEntity
_LOGGER = logging.getLogger(__name__)
PARALLEL_UPDATES = 0
@dataclass(frozen=True, kw_only=True)
class AirOSBinarySensorEntityDescription(BinarySensorEntityDescription):
"""Describe an AirOS binary sensor."""
value_fn: Callable[[AirOSData], bool]
BINARY_SENSORS: tuple[AirOSBinarySensorEntityDescription, ...] = (
AirOSBinarySensorEntityDescription(
key="portfw",
translation_key="port_forwarding",
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda data: data.portfw,
),
AirOSBinarySensorEntityDescription(
key="dhcp_client",
translation_key="dhcp_client",
device_class=BinarySensorDeviceClass.RUNNING,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda data: data.services.dhcpc,
),
AirOSBinarySensorEntityDescription(
key="dhcp_server",
translation_key="dhcp_server",
device_class=BinarySensorDeviceClass.RUNNING,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda data: data.services.dhcpd,
entity_registry_enabled_default=False,
),
AirOSBinarySensorEntityDescription(
key="dhcp6_server",
translation_key="dhcp6_server",
device_class=BinarySensorDeviceClass.RUNNING,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda data: data.services.dhcp6d_stateful,
entity_registry_enabled_default=False,
),
AirOSBinarySensorEntityDescription(
key="pppoe",
translation_key="pppoe",
device_class=BinarySensorDeviceClass.CONNECTIVITY,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda data: data.services.pppoe,
entity_registry_enabled_default=False,
),
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: AirOSConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the AirOS binary sensors from a config entry."""
coordinator = config_entry.runtime_data
async_add_entities(
AirOSBinarySensor(coordinator, description) for description in BINARY_SENSORS
)
class AirOSBinarySensor(AirOSEntity, BinarySensorEntity):
"""Representation of a binary sensor."""
entity_description: AirOSBinarySensorEntityDescription
def __init__(
self,
coordinator: AirOSDataUpdateCoordinator,
description: AirOSBinarySensorEntityDescription,
) -> None:
"""Initialize the binary sensor."""
super().__init__(coordinator)
self.entity_description = description
self._attr_unique_id = f"{coordinator.data.host.device_id}_{description.key}"
@property
def is_on(self) -> bool:
"""Return the state of the binary sensor."""
return self.entity_description.value_fn(self.coordinator.data)
@@ -0,0 +1,82 @@
"""Config flow for the Ubiquiti airOS integration."""
from __future__ import annotations
import logging
from typing import Any
from airos.exceptions import (
AirOSConnectionAuthenticationError,
AirOSConnectionSetupError,
AirOSDataMissingError,
AirOSDeviceConnectionError,
AirOSKeyDataMissingError,
)
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import DOMAIN
from .coordinator import AirOS
_LOGGER = logging.getLogger(__name__)
STEP_USER_DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_HOST): str,
vol.Required(CONF_USERNAME, default="ubnt"): str,
vol.Required(CONF_PASSWORD): str,
}
)
class AirOSConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Ubiquiti airOS."""
VERSION = 1
async def async_step_user(
self,
user_input: dict[str, Any] | None = None,
) -> ConfigFlowResult:
"""Handle the initial step."""
errors: dict[str, str] = {}
if user_input is not None:
# By default airOS 8 comes with self-signed SSL certificates,
# with no option in the web UI to change or upload a custom certificate.
session = async_get_clientsession(self.hass, verify_ssl=False)
airos_device = AirOS(
host=user_input[CONF_HOST],
username=user_input[CONF_USERNAME],
password=user_input[CONF_PASSWORD],
session=session,
)
try:
await airos_device.login()
airos_data = await airos_device.status()
except (
AirOSConnectionSetupError,
AirOSDeviceConnectionError,
):
errors["base"] = "cannot_connect"
except (AirOSConnectionAuthenticationError, AirOSDataMissingError):
errors["base"] = "invalid_auth"
except AirOSKeyDataMissingError:
errors["base"] = "key_data_missing"
except Exception:
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
await self.async_set_unique_id(airos_data.derived.mac)
self._abort_if_unique_id_configured()
return self.async_create_entry(
title=airos_data.host.hostname, data=user_input
)
return self.async_show_form(
step_id="user", data_schema=STEP_USER_DATA_SCHEMA, errors=errors
)
+9
View File
@@ -0,0 +1,9 @@
"""Constants for the Ubiquiti airOS integration."""
from datetime import timedelta
DOMAIN = "airos"
SCAN_INTERVAL = timedelta(minutes=1)
MANUFACTURER = "Ubiquiti"
@@ -0,0 +1,70 @@
"""DataUpdateCoordinator for AirOS."""
from __future__ import annotations
import logging
from airos.airos8 import AirOS, AirOSData
from airos.exceptions import (
AirOSConnectionAuthenticationError,
AirOSConnectionSetupError,
AirOSDataMissingError,
AirOSDeviceConnectionError,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryError
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DOMAIN, SCAN_INTERVAL
_LOGGER = logging.getLogger(__name__)
type AirOSConfigEntry = ConfigEntry[AirOSDataUpdateCoordinator]
class AirOSDataUpdateCoordinator(DataUpdateCoordinator[AirOSData]):
"""Class to manage fetching AirOS data from single endpoint."""
config_entry: AirOSConfigEntry
def __init__(
self, hass: HomeAssistant, config_entry: AirOSConfigEntry, airos_device: AirOS
) -> None:
"""Initialize the coordinator."""
self.airos_device = airos_device
super().__init__(
hass,
_LOGGER,
config_entry=config_entry,
name=DOMAIN,
update_interval=SCAN_INTERVAL,
)
async def _async_update_data(self) -> AirOSData:
"""Fetch data from AirOS."""
try:
await self.airos_device.login()
return await self.airos_device.status()
except (AirOSConnectionAuthenticationError,) as err:
_LOGGER.exception("Error authenticating with airOS device")
raise ConfigEntryError(
translation_domain=DOMAIN, translation_key="invalid_auth"
) from err
except (
AirOSConnectionSetupError,
AirOSDeviceConnectionError,
TimeoutError,
) as err:
_LOGGER.error("Error connecting to airOS device: %s", err)
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="cannot_connect",
) from err
except (AirOSDataMissingError,) as err:
_LOGGER.error("Expected data not returned by airOS device: %s", err)
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="error_data_missing",
) from err
@@ -0,0 +1,33 @@
"""Diagnostics support for airOS."""
from __future__ import annotations
from typing import Any
from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_HOST, CONF_PASSWORD
from homeassistant.core import HomeAssistant
from .coordinator import AirOSConfigEntry
IP_REDACT = ["addr", "ipaddr", "ip6addr", "lastip"] # IP related
HW_REDACT = ["apmac", "hwaddr", "mac"] # MAC address
TO_REDACT_HA = [CONF_HOST, CONF_PASSWORD]
TO_REDACT_AIROS = [
"hostname", # Prevent leaking device naming
"essid", # Network SSID
"lat", # GPS latitude to prevent exposing location data.
"lon", # GPS longitude to prevent exposing location data.
*HW_REDACT,
*IP_REDACT,
]
async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: AirOSConfigEntry
) -> dict[str, Any]:
"""Return diagnostics for a config entry."""
return {
"entry_data": async_redact_data(entry.data, TO_REDACT_HA),
"data": async_redact_data(entry.runtime_data.data.to_dict(), TO_REDACT_AIROS),
}
+36
View File
@@ -0,0 +1,36 @@
"""Generic AirOS Entity Class."""
from __future__ import annotations
from homeassistant.const import CONF_HOST
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN, MANUFACTURER
from .coordinator import AirOSDataUpdateCoordinator
class AirOSEntity(CoordinatorEntity[AirOSDataUpdateCoordinator]):
"""Represent a AirOS Entity."""
_attr_has_entity_name = True
def __init__(self, coordinator: AirOSDataUpdateCoordinator) -> None:
"""Initialise the gateway."""
super().__init__(coordinator)
airos_data = self.coordinator.data
configuration_url: str | None = (
f"https://{coordinator.config_entry.data[CONF_HOST]}"
)
self._attr_device_info = DeviceInfo(
connections={(CONNECTION_NETWORK_MAC, airos_data.derived.mac)},
configuration_url=configuration_url,
identifiers={(DOMAIN, str(airos_data.host.device_id))},
manufacturer=MANUFACTURER,
model=airos_data.host.devmodel,
name=airos_data.host.hostname,
sw_version=airos_data.host.fwversion,
)
@@ -0,0 +1,10 @@
{
"domain": "airos",
"name": "Ubiquiti airOS",
"codeowners": ["@CoMPaTech"],
"config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/airos",
"iot_class": "local_polling",
"quality_scale": "bronze",
"requirements": ["airos==0.3.0"]
}
@@ -0,0 +1,70 @@
rules:
# Bronze
action-setup:
status: exempt
comment: airOS does not have actions
appropriate-polling: done
brands: done
common-modules: done
config-flow-test-coverage: done
config-flow: done
dependency-transparency: done
docs-actions:
status: exempt
comment: airOS does not have actions
docs-high-level-description: done
docs-installation-instructions: done
docs-removal-instructions: done
entity-event-setup:
status: exempt
comment: local_polling without events
entity-unique-id: done
has-entity-name: done
runtime-data: done
test-before-configure: done
test-before-setup: done
unique-config-entry: done
# Silver
action-exceptions:
status: exempt
comment: airOS does not have actions
config-entry-unloading: done
docs-configuration-parameters: done
docs-installation-parameters: done
entity-unavailable: todo
integration-owner: done
log-when-unavailable: todo
parallel-updates: todo
reauthentication-flow: todo
test-coverage: done
# Gold
devices: done
diagnostics: done
discovery-update-info: todo
discovery: todo
docs-data-update: done
docs-examples: todo
docs-known-limitations: done
docs-supported-devices: done
docs-supported-functions: todo
docs-troubleshooting: done
docs-use-cases: todo
dynamic-devices: todo
entity-category: done
entity-device-class: done
entity-disabled-by-default: done
entity-translations: done
exception-translations: done
icon-translations:
status: exempt
comment: no (custom) icons used or envisioned
reconfiguration-flow: todo
repair-issues: todo
stale-devices: todo
# Platinum
async-dependency: done
inject-websession: done
strict-typing: done
+194
View File
@@ -0,0 +1,194 @@
"""AirOS Sensor component for Home Assistant."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
import logging
from airos.data import DerivedWirelessMode, DerivedWirelessRole, NetRole
from homeassistant.components.sensor import (
SensorDeviceClass,
SensorEntity,
SensorEntityDescription,
SensorStateClass,
)
from homeassistant.const import (
PERCENTAGE,
SIGNAL_STRENGTH_DECIBELS,
UnitOfDataRate,
UnitOfFrequency,
UnitOfLength,
UnitOfTime,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType
from .coordinator import AirOSConfigEntry, AirOSData, AirOSDataUpdateCoordinator
from .entity import AirOSEntity
_LOGGER = logging.getLogger(__name__)
NETROLE_OPTIONS = [mode.value for mode in NetRole]
WIRELESS_MODE_OPTIONS = [mode.value for mode in DerivedWirelessMode]
WIRELESS_ROLE_OPTIONS = [mode.value for mode in DerivedWirelessRole]
PARALLEL_UPDATES = 0
@dataclass(frozen=True, kw_only=True)
class AirOSSensorEntityDescription(SensorEntityDescription):
"""Describe an AirOS sensor."""
value_fn: Callable[[AirOSData], StateType]
SENSORS: tuple[AirOSSensorEntityDescription, ...] = (
AirOSSensorEntityDescription(
key="host_cpuload",
translation_key="host_cpuload",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=1,
value_fn=lambda data: data.host.cpuload,
entity_registry_enabled_default=False,
),
AirOSSensorEntityDescription(
key="host_netrole",
translation_key="host_netrole",
device_class=SensorDeviceClass.ENUM,
value_fn=lambda data: data.host.netrole.value,
options=NETROLE_OPTIONS,
),
AirOSSensorEntityDescription(
key="wireless_frequency",
translation_key="wireless_frequency",
native_unit_of_measurement=UnitOfFrequency.MEGAHERTZ,
device_class=SensorDeviceClass.FREQUENCY,
state_class=SensorStateClass.MEASUREMENT,
value_fn=lambda data: data.wireless.frequency,
),
AirOSSensorEntityDescription(
key="wireless_essid",
translation_key="wireless_essid",
value_fn=lambda data: data.wireless.essid,
),
AirOSSensorEntityDescription(
key="wireless_antenna_gain",
translation_key="wireless_antenna_gain",
native_unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
device_class=SensorDeviceClass.SIGNAL_STRENGTH,
state_class=SensorStateClass.MEASUREMENT,
value_fn=lambda data: data.wireless.antenna_gain,
),
AirOSSensorEntityDescription(
key="wireless_throughput_tx",
translation_key="wireless_throughput_tx",
native_unit_of_measurement=UnitOfDataRate.KILOBITS_PER_SECOND,
device_class=SensorDeviceClass.DATA_RATE,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=0,
suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
value_fn=lambda data: data.wireless.throughput.tx,
),
AirOSSensorEntityDescription(
key="wireless_throughput_rx",
translation_key="wireless_throughput_rx",
native_unit_of_measurement=UnitOfDataRate.KILOBITS_PER_SECOND,
device_class=SensorDeviceClass.DATA_RATE,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=0,
suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
value_fn=lambda data: data.wireless.throughput.rx,
),
AirOSSensorEntityDescription(
key="wireless_polling_dl_capacity",
translation_key="wireless_polling_dl_capacity",
native_unit_of_measurement=UnitOfDataRate.KILOBITS_PER_SECOND,
device_class=SensorDeviceClass.DATA_RATE,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=0,
suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
value_fn=lambda data: data.wireless.polling.dl_capacity,
),
AirOSSensorEntityDescription(
key="wireless_polling_ul_capacity",
translation_key="wireless_polling_ul_capacity",
native_unit_of_measurement=UnitOfDataRate.KILOBITS_PER_SECOND,
device_class=SensorDeviceClass.DATA_RATE,
state_class=SensorStateClass.MEASUREMENT,
suggested_display_precision=0,
suggested_unit_of_measurement=UnitOfDataRate.MEGABITS_PER_SECOND,
value_fn=lambda data: data.wireless.polling.ul_capacity,
),
AirOSSensorEntityDescription(
key="host_uptime",
translation_key="host_uptime",
native_unit_of_measurement=UnitOfTime.SECONDS,
device_class=SensorDeviceClass.DURATION,
suggested_display_precision=0,
suggested_unit_of_measurement=UnitOfTime.DAYS,
value_fn=lambda data: data.host.uptime,
entity_registry_enabled_default=False,
),
AirOSSensorEntityDescription(
key="wireless_distance",
translation_key="wireless_distance",
native_unit_of_measurement=UnitOfLength.METERS,
device_class=SensorDeviceClass.DISTANCE,
suggested_display_precision=1,
suggested_unit_of_measurement=UnitOfLength.KILOMETERS,
value_fn=lambda data: data.wireless.distance,
),
AirOSSensorEntityDescription(
key="wireless_mode",
translation_key="wireless_mode",
device_class=SensorDeviceClass.ENUM,
value_fn=lambda data: data.derived.mode.value,
options=WIRELESS_MODE_OPTIONS,
entity_registry_enabled_default=False,
),
AirOSSensorEntityDescription(
key="wireless_role",
translation_key="wireless_role",
device_class=SensorDeviceClass.ENUM,
value_fn=lambda data: data.derived.role.value,
options=WIRELESS_ROLE_OPTIONS,
entity_registry_enabled_default=False,
),
)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: AirOSConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the AirOS sensors from a config entry."""
coordinator = config_entry.runtime_data
async_add_entities(AirOSSensor(coordinator, description) for description in SENSORS)
class AirOSSensor(AirOSEntity, SensorEntity):
"""Representation of a Sensor."""
entity_description: AirOSSensorEntityDescription
def __init__(
self,
coordinator: AirOSDataUpdateCoordinator,
description: AirOSSensorEntityDescription,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator)
self.entity_description = description
self._attr_unique_id = f"{coordinator.data.derived.mac}_{description.key}"
@property
def native_value(self) -> StateType:
"""Return the state of the sensor."""
return self.entity_description.value_fn(self.coordinator.data)
+117
View File
@@ -0,0 +1,117 @@
{
"config": {
"flow_title": "Ubiquiti airOS device",
"step": {
"user": {
"data": {
"host": "[%key:common::config_flow::data::host%]",
"username": "[%key:common::config_flow::data::username%]",
"password": "[%key:common::config_flow::data::password%]"
},
"data_description": {
"host": "IP address or hostname of the airOS device",
"username": "Administrator username for the airOS device, normally 'ubnt'",
"password": "Password configured through the UISP app or web interface"
}
}
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"key_data_missing": "Expected data not returned from the device, check the documentation for supported devices",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
}
},
"entity": {
"binary_sensor": {
"port_forwarding": {
"name": "Port forwarding"
},
"dhcp_client": {
"name": "DHCP client"
},
"dhcp_server": {
"name": "DHCP server"
},
"dhcp6_server": {
"name": "DHCPv6 server"
},
"pppoe": {
"name": "PPPoE link"
}
},
"sensor": {
"host_cpuload": {
"name": "CPU load"
},
"host_netrole": {
"name": "Network role",
"state": {
"bridge": "Bridge",
"router": "Router"
}
},
"wireless_frequency": {
"name": "Wireless frequency"
},
"wireless_essid": {
"name": "Wireless SSID"
},
"wireless_antenna_gain": {
"name": "Antenna gain"
},
"wireless_throughput_tx": {
"name": "Throughput transmit (actual)"
},
"wireless_throughput_rx": {
"name": "Throughput receive (actual)"
},
"wireless_polling_dl_capacity": {
"name": "Download capacity"
},
"wireless_polling_ul_capacity": {
"name": "Upload capacity"
},
"wireless_remote_hostname": {
"name": "Remote hostname"
},
"host_uptime": {
"name": "Uptime"
},
"wireless_distance": {
"name": "Wireless distance"
},
"wireless_role": {
"name": "Wireless role",
"state": {
"access_point": "Access point",
"station": "Station"
}
},
"wireless_mode": {
"name": "Wireless mode",
"state": {
"point_to_point": "Point-to-point",
"point_to_multipoint": "Point-to-multipoint"
}
}
}
},
"exceptions": {
"invalid_auth": {
"message": "[%key:common::config_flow::error::invalid_auth%]"
},
"cannot_connect": {
"message": "[%key:common::config_flow::error::cannot_connect%]"
},
"key_data_missing": {
"message": "Key data not returned from device"
},
"error_data_missing": {
"message": "Data incomplete or missing"
}
}
}
+1 -1
View File
@@ -9,7 +9,7 @@ from homeassistant.core import HomeAssistant
from .const import CONF_CLIP_NEGATIVE, CONF_RETURN_AVERAGE
from .coordinator import AirQCoordinator
PLATFORMS: list[Platform] = [Platform.SENSOR]
PLATFORMS: list[Platform] = [Platform.NUMBER, Platform.SENSOR]
AirQConfigEntry = ConfigEntry[AirQCoordinator]
-1
View File
@@ -6,6 +6,5 @@ CONF_RETURN_AVERAGE: Final = "return_average"
CONF_CLIP_NEGATIVE: Final = "clip_negatives"
DOMAIN: Final = "airq"
MANUFACTURER: Final = "CorantGmbH"
CONCENTRATION_GRAMS_PER_CUBIC_METER: Final = "g/m³"
ACTIVITY_BECQUEREL_PER_CUBIC_METER: Final = "Bq/m³"
UPDATE_INTERVAL: float = 10.0
@@ -75,6 +75,7 @@ class AirQCoordinator(DataUpdateCoordinator):
return_average=self.return_average,
clip_negative_values=self.clip_negative,
)
data["brightness"] = await self.airq.get_current_brightness()
if warming_up_sensors := identify_warming_up_sensors(data):
_LOGGER.debug(
"Following sensors are still warming up: %s", warming_up_sensors
-3
View File
@@ -4,9 +4,6 @@
"health_index": {
"default": "mdi:heart-pulse"
},
"absolute_humidity": {
"default": "mdi:water"
},
"oxygen": {
"default": "mdi:leaf"
},
+85
View File
@@ -0,0 +1,85 @@
"""Definition of air-Q number platform used to control the LED strips."""
from __future__ import annotations
from collections.abc import Awaitable, Callable
from dataclasses import dataclass
import logging
from aioairq.core import AirQ
from homeassistant.components.number import NumberEntity, NumberEntityDescription
from homeassistant.const import PERCENTAGE
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import AirQConfigEntry, AirQCoordinator
_LOGGER = logging.getLogger(__name__)
@dataclass(frozen=True, kw_only=True)
class AirQBrightnessDescription(NumberEntityDescription):
"""Describes AirQ number entity responsible for brightness control."""
value: Callable[[dict], float]
set_value: Callable[[AirQ, float], Awaitable[None]]
AIRQ_LED_BRIGHTNESS = AirQBrightnessDescription(
key="airq_led_brightness",
translation_key="airq_led_brightness",
native_min_value=0.0,
native_max_value=100.0,
native_step=1.0,
native_unit_of_measurement=PERCENTAGE,
value=lambda data: data["brightness"],
set_value=lambda device, value: device.set_current_brightness(value),
)
async def async_setup_entry(
hass: HomeAssistant,
entry: AirQConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up number entities: a single entity for the LEDs."""
coordinator = entry.runtime_data
entities = [AirQLEDBrightness(coordinator, AIRQ_LED_BRIGHTNESS)]
async_add_entities(entities)
class AirQLEDBrightness(CoordinatorEntity[AirQCoordinator], NumberEntity):
"""Representation of the LEDs from a single AirQ."""
_attr_has_entity_name = True
def __init__(
self,
coordinator: AirQCoordinator,
description: AirQBrightnessDescription,
) -> None:
"""Initialize a single sensor."""
super().__init__(coordinator)
self.entity_description: AirQBrightnessDescription = description
self._attr_device_info = coordinator.device_info
self._attr_unique_id = f"{coordinator.device_id}_{description.key}"
@property
def native_value(self) -> float:
"""Return the brightness of the LEDs in %."""
return self.entity_description.value(self.coordinator.data)
async def async_set_native_value(self, value: float) -> None:
"""Set the brightness of the LEDs to the value in %."""
_LOGGER.debug(
"Changing LED brighntess from %.0f%% to %.0f%%",
self.coordinator.data["brightness"],
value,
)
await self.entity_description.set_value(self.coordinator.airq, value)
await self.coordinator.async_request_refresh()
+3 -5
View File
@@ -14,6 +14,7 @@ from homeassistant.components.sensor import (
SensorStateClass,
)
from homeassistant.const import (
CONCENTRATION_GRAMS_PER_CUBIC_METER,
CONCENTRATION_MICROGRAMS_PER_CUBIC_METER,
CONCENTRATION_MILLIGRAMS_PER_CUBIC_METER,
CONCENTRATION_PARTS_PER_BILLION,
@@ -28,10 +29,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from . import AirQConfigEntry, AirQCoordinator
from .const import (
ACTIVITY_BECQUEREL_PER_CUBIC_METER,
CONCENTRATION_GRAMS_PER_CUBIC_METER,
)
from .const import ACTIVITY_BECQUEREL_PER_CUBIC_METER
_LOGGER = logging.getLogger(__name__)
@@ -195,7 +193,7 @@ SENSOR_TYPES: list[AirQEntityDescription] = [
),
AirQEntityDescription(
key="humidity_abs",
translation_key="absolute_humidity",
device_class=SensorDeviceClass.ABSOLUTE_HUMIDITY,
native_unit_of_measurement=CONCENTRATION_GRAMS_PER_CUBIC_METER,
state_class=SensorStateClass.MEASUREMENT,
value=lambda data: data.get("humidity_abs"),
+5 -3
View File
@@ -35,6 +35,11 @@
}
},
"entity": {
"number": {
"airq_led_brightness": {
"name": "LED brightness"
}
},
"sensor": {
"acetaldehyde": {
"name": "Acetaldehyde"
@@ -93,9 +98,6 @@
"health_index": {
"name": "Health index"
},
"absolute_humidity": {
"name": "Absolute humidity"
},
"hydrogen": {
"name": "Hydrogen"
},
@@ -7,21 +7,18 @@ import logging
from airthings import Airthings
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ID, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from .const import CONF_SECRET
from .coordinator import AirthingsDataUpdateCoordinator
from .coordinator import AirthingsConfigEntry, AirthingsDataUpdateCoordinator
_LOGGER = logging.getLogger(__name__)
PLATFORMS: list[Platform] = [Platform.SENSOR]
SCAN_INTERVAL = timedelta(minutes=6)
type AirthingsConfigEntry = ConfigEntry[AirthingsDataUpdateCoordinator]
async def async_setup_entry(hass: HomeAssistant, entry: AirthingsConfigEntry) -> bool:
"""Set up Airthings from a config entry."""
@@ -31,7 +28,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: AirthingsConfigEntry) ->
async_get_clientsession(hass),
)
coordinator = AirthingsDataUpdateCoordinator(hass, airthings)
coordinator = AirthingsDataUpdateCoordinator(hass, airthings, entry)
await coordinator.async_config_entry_first_refresh()
@@ -45,6 +45,8 @@ class AirthingsConfigFlow(ConfigFlow, domain=DOMAIN):
)
errors = {}
await self.async_set_unique_id(user_input[CONF_ID])
self._abort_if_unique_id_configured()
try:
await airthings.get_token(
@@ -60,9 +62,6 @@ class AirthingsConfigFlow(ConfigFlow, domain=DOMAIN):
_LOGGER.exception("Unexpected exception")
errors["base"] = "unknown"
else:
await self.async_set_unique_id(user_input[CONF_ID])
self._abort_if_unique_id_configured()
return self.async_create_entry(title="Airthings", data=user_input)
return self.async_show_form(
@@ -5,6 +5,7 @@ import logging
from airthings import Airthings, AirthingsDevice, AirthingsError
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
@@ -13,15 +14,23 @@ from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
SCAN_INTERVAL = timedelta(minutes=6)
type AirthingsConfigEntry = ConfigEntry[AirthingsDataUpdateCoordinator]
class AirthingsDataUpdateCoordinator(DataUpdateCoordinator[dict[str, AirthingsDevice]]):
"""Coordinator for Airthings data updates."""
def __init__(self, hass: HomeAssistant, airthings: Airthings) -> None:
def __init__(
self,
hass: HomeAssistant,
airthings: Airthings,
config_entry: AirthingsConfigEntry,
) -> None:
"""Initialize the coordinator."""
super().__init__(
hass,
_LOGGER,
config_entry=config_entry,
name=DOMAIN,
update_method=self._update_method,
update_interval=SCAN_INTERVAL,
+2 -2
View File
@@ -150,7 +150,7 @@ async def async_setup_entry(
coordinator = entry.runtime_data
entities = [
AirthingsHeaterEnergySensor(
AirthingsDeviceSensor(
coordinator,
airthings_device,
SENSORS[sensor_types],
@@ -162,7 +162,7 @@ async def async_setup_entry(
async_add_entities(entities)
class AirthingsHeaterEnergySensor(
class AirthingsDeviceSensor(
CoordinatorEntity[AirthingsDataUpdateCoordinator], SensorEntity
):
"""Representation of a Airthings Sensor device."""
@@ -6,5 +6,5 @@
"documentation": "https://www.home-assistant.io/integrations/airzone_cloud",
"iot_class": "cloud_push",
"loggers": ["aioairzone_cloud"],
"requirements": ["aioairzone-cloud==0.6.12"]
"requirements": ["aioairzone-cloud==0.7.1"]
}
+18 -5
View File
@@ -505,8 +505,13 @@ class ClimateCapabilities(AlexaEntity):
):
yield AlexaThermostatController(self.hass, self.entity)
yield AlexaTemperatureSensor(self.hass, self.entity)
if self.entity.domain == water_heater.DOMAIN and (
supported_features & water_heater.WaterHeaterEntityFeature.OPERATION_MODE
if (
self.entity.domain == water_heater.DOMAIN
and (
supported_features
& water_heater.WaterHeaterEntityFeature.OPERATION_MODE
)
and self.entity.attributes.get(water_heater.ATTR_OPERATION_LIST)
):
yield AlexaModeController(
self.entity,
@@ -634,7 +639,9 @@ class FanCapabilities(AlexaEntity):
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_OSCILLATING}"
)
force_range_controller = False
if supported & fan.FanEntityFeature.PRESET_MODE:
if supported & fan.FanEntityFeature.PRESET_MODE and self.entity.attributes.get(
fan.ATTR_PRESET_MODES
):
yield AlexaModeController(
self.entity, instance=f"{fan.DOMAIN}.{fan.ATTR_PRESET_MODE}"
)
@@ -672,7 +679,11 @@ class RemoteCapabilities(AlexaEntity):
yield AlexaPowerController(self.entity)
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
activities = self.entity.attributes.get(remote.ATTR_ACTIVITY_LIST) or []
if activities and supported & remote.RemoteEntityFeature.ACTIVITY:
if (
activities
and (supported & remote.RemoteEntityFeature.ACTIVITY)
and self.entity.attributes.get(remote.ATTR_ACTIVITY_LIST)
):
yield AlexaModeController(
self.entity, instance=f"{remote.DOMAIN}.{remote.ATTR_ACTIVITY}"
)
@@ -692,7 +703,9 @@ class HumidifierCapabilities(AlexaEntity):
"""Yield the supported interfaces."""
yield AlexaPowerController(self.entity)
supported = self.entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
if supported & humidifier.HumidifierEntityFeature.MODES:
if (
supported & humidifier.HumidifierEntityFeature.MODES
) and self.entity.attributes.get(humidifier.ATTR_AVAILABLE_MODES):
yield AlexaModeController(
self.entity, instance=f"{humidifier.DOMAIN}.{humidifier.ATTR_MODE}"
)
@@ -2,8 +2,12 @@
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import aiohttp_client, config_validation as cv
from homeassistant.helpers.typing import ConfigType
from .const import DOMAIN
from .coordinator import AmazonConfigEntry, AmazonDevicesCoordinator
from .services import async_setup_services
PLATFORMS = [
Platform.BINARY_SENSOR,
@@ -12,11 +16,20 @@ PLATFORMS = [
Platform.SWITCH,
]
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the Alexa Devices component."""
async_setup_services(hass)
return True
async def async_setup_entry(hass: HomeAssistant, entry: AmazonConfigEntry) -> bool:
"""Set up Alexa Devices platform."""
coordinator = AmazonDevicesCoordinator(hass, entry)
session = aiohttp_client.async_create_clientsession(hass)
coordinator = AmazonDevicesCoordinator(hass, entry, session)
await coordinator.async_config_entry_first_refresh()
@@ -29,8 +42,4 @@ async def async_setup_entry(hass: HomeAssistant, entry: AmazonConfigEntry) -> bo
async def async_unload_entry(hass: HomeAssistant, entry: AmazonConfigEntry) -> bool:
"""Unload a config entry."""
coordinator = entry.runtime_data
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
await coordinator.api.close()
return unload_ok
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
@@ -2,19 +2,48 @@
from __future__ import annotations
from collections.abc import Mapping
from typing import Any
from aioamazondevices.api import AmazonEchoApi
from aioamazondevices.exceptions import CannotAuthenticate, CannotConnect
from aioamazondevices.exceptions import (
CannotAuthenticate,
CannotConnect,
CannotRetrieveData,
WrongCountry,
)
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_CODE, CONF_COUNTRY, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.helpers import aiohttp_client
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.selector import CountrySelector
from .const import CONF_LOGIN_DATA, DOMAIN
STEP_REAUTH_DATA_SCHEMA = vol.Schema(
{
vol.Required(CONF_PASSWORD): cv.string,
vol.Required(CONF_CODE): cv.string,
}
)
async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]:
"""Validate the user input allows us to connect."""
session = aiohttp_client.async_create_clientsession(hass)
api = AmazonEchoApi(
session,
data[CONF_COUNTRY],
data[CONF_USERNAME],
data[CONF_PASSWORD],
)
return await api.login_mode_interactive(data[CONF_CODE])
class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle a config flow for Alexa Devices."""
@@ -25,17 +54,16 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
"""Handle the initial step."""
errors = {}
if user_input:
client = AmazonEchoApi(
user_input[CONF_COUNTRY],
user_input[CONF_USERNAME],
user_input[CONF_PASSWORD],
)
try:
data = await client.login_mode_interactive(user_input[CONF_CODE])
data = await validate_input(self.hass, user_input)
except CannotConnect:
errors["base"] = "cannot_connect"
except CannotAuthenticate:
errors["base"] = "invalid_auth"
except CannotRetrieveData:
errors["base"] = "cannot_retrieve_data"
except WrongCountry:
errors["base"] = "wrong_country"
else:
await self.async_set_unique_id(data["customer_info"]["user_id"])
self._abort_if_unique_id_configured()
@@ -44,8 +72,6 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
title=user_input[CONF_USERNAME],
data=user_input | {CONF_LOGIN_DATA: data},
)
finally:
await client.close()
return self.async_show_form(
step_id="user",
@@ -61,3 +87,45 @@ class AmazonDevicesConfigFlow(ConfigFlow, domain=DOMAIN):
}
),
)
async def async_step_reauth(
self, entry_data: Mapping[str, Any]
) -> ConfigFlowResult:
"""Handle reauth flow."""
self.context["title_placeholders"] = {CONF_USERNAME: entry_data[CONF_USERNAME]}
return await self.async_step_reauth_confirm()
async def async_step_reauth_confirm(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle reauth confirm."""
errors: dict[str, str] = {}
reauth_entry = self._get_reauth_entry()
entry_data = reauth_entry.data
if user_input is not None:
try:
await validate_input(self.hass, {**reauth_entry.data, **user_input})
except CannotConnect:
errors["base"] = "cannot_connect"
except CannotAuthenticate:
errors["base"] = "invalid_auth"
except CannotRetrieveData:
errors["base"] = "cannot_retrieve_data"
else:
return self.async_update_reload_and_abort(
reauth_entry,
data={
CONF_USERNAME: entry_data[CONF_USERNAME],
CONF_PASSWORD: entry_data[CONF_PASSWORD],
CONF_CODE: user_input[CONF_CODE],
},
)
return self.async_show_form(
step_id="reauth_confirm",
description_placeholders={CONF_USERNAME: entry_data[CONF_USERNAME]},
data_schema=STEP_REAUTH_DATA_SCHEMA,
errors=errors,
)
@@ -8,14 +8,15 @@ from aioamazondevices.exceptions import (
CannotConnect,
CannotRetrieveData,
)
from aiohttp import ClientSession
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_COUNTRY, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryError
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import _LOGGER, CONF_LOGIN_DATA
from .const import _LOGGER, CONF_LOGIN_DATA, DOMAIN
SCAN_INTERVAL = 30
@@ -31,6 +32,7 @@ class AmazonDevicesCoordinator(DataUpdateCoordinator[dict[str, AmazonDevice]]):
self,
hass: HomeAssistant,
entry: AmazonConfigEntry,
session: ClientSession,
) -> None:
"""Initialize the scanner."""
super().__init__(
@@ -41,6 +43,7 @@ class AmazonDevicesCoordinator(DataUpdateCoordinator[dict[str, AmazonDevice]]):
update_interval=timedelta(seconds=SCAN_INTERVAL),
)
self.api = AmazonEchoApi(
session,
entry.data[CONF_COUNTRY],
entry.data[CONF_USERNAME],
entry.data[CONF_PASSWORD],
@@ -52,7 +55,21 @@ class AmazonDevicesCoordinator(DataUpdateCoordinator[dict[str, AmazonDevice]]):
try:
await self.api.login_mode_stored_data()
return await self.api.get_devices_data()
except (CannotConnect, CannotRetrieveData) as err:
raise UpdateFailed(f"Error occurred while updating {self.name}") from err
except CannotConnect as err:
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="cannot_connect_with_error",
translation_placeholders={"error": repr(err)},
) from err
except CannotRetrieveData as err:
raise UpdateFailed(
translation_domain=DOMAIN,
translation_key="cannot_retrieve_data_with_error",
translation_placeholders={"error": repr(err)},
) from err
except CannotAuthenticate as err:
raise ConfigEntryError("Could not authenticate") from err
raise ConfigEntryAuthFailed(
translation_domain=DOMAIN,
translation_key="invalid_auth",
translation_placeholders={"error": repr(err)},
) from err
@@ -38,5 +38,13 @@
}
}
}
},
"services": {
"send_sound": {
"service": "mdi:cast-audio"
},
"send_text_command": {
"service": "mdi:microphone-message"
}
}
}
@@ -7,6 +7,6 @@
"integration_type": "hub",
"iot_class": "cloud_polling",
"loggers": ["aioamazondevices"],
"quality_scale": "bronze",
"requirements": ["aioamazondevices==3.1.22"]
"quality_scale": "silver",
"requirements": ["aioamazondevices==4.0.0"]
}
@@ -28,39 +28,37 @@ rules:
# Silver
action-exceptions: done
config-entry-unloading: done
docs-configuration-parameters: todo
docs-installation-parameters: todo
docs-configuration-parameters: done
docs-installation-parameters: done
entity-unavailable: done
integration-owner: done
log-when-unavailable: done
parallel-updates: done
reauthentication-flow: todo
test-coverage:
status: todo
comment: all tests missing
reauthentication-flow: done
test-coverage: done
# Gold
devices: done
diagnostics: todo
diagnostics: done
discovery-update-info:
status: exempt
comment: Network information not relevant
discovery:
status: exempt
comment: There are a ton of mac address ranges in use, but also by kindles which are not supported by this integration
docs-data-update: todo
docs-examples: todo
docs-known-limitations: todo
docs-supported-devices: todo
docs-supported-functions: todo
docs-troubleshooting: todo
docs-use-cases: todo
docs-data-update: done
docs-examples: done
docs-known-limitations: done
docs-supported-devices: done
docs-supported-functions: done
docs-troubleshooting: done
docs-use-cases: done
dynamic-devices: todo
entity-category: done
entity-device-class: done
entity-disabled-by-default: done
entity-translations: done
exception-translations: todo
exception-translations: done
icon-translations: done
reconfiguration-flow: todo
repair-issues:
@@ -72,5 +70,5 @@ rules:
# Platinum
async-dependency: done
inject-websession: todo
inject-websession: done
strict-typing: done
@@ -0,0 +1,121 @@
"""Support for services."""
from aioamazondevices.sounds import SOUNDS_LIST
import voluptuous as vol
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_DEVICE_ID
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers import config_validation as cv, device_registry as dr
from .const import DOMAIN
from .coordinator import AmazonConfigEntry
ATTR_TEXT_COMMAND = "text_command"
ATTR_SOUND = "sound"
ATTR_SOUND_VARIANT = "sound_variant"
SERVICE_TEXT_COMMAND = "send_text_command"
SERVICE_SOUND_NOTIFICATION = "send_sound"
SCHEMA_SOUND_SERVICE = vol.Schema(
{
vol.Required(ATTR_SOUND): cv.string,
vol.Required(ATTR_SOUND_VARIANT): cv.positive_int,
vol.Required(ATTR_DEVICE_ID): cv.string,
},
)
SCHEMA_CUSTOM_COMMAND = vol.Schema(
{
vol.Required(ATTR_TEXT_COMMAND): cv.string,
vol.Required(ATTR_DEVICE_ID): cv.string,
}
)
@callback
def async_get_entry_id_for_service_call(
call: ServiceCall,
) -> tuple[dr.DeviceEntry, AmazonConfigEntry]:
"""Get the entry ID related to a service call (by device ID)."""
device_registry = dr.async_get(call.hass)
device_id = call.data[ATTR_DEVICE_ID]
if (device_entry := device_registry.async_get(device_id)) is None:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="invalid_device_id",
translation_placeholders={"device_id": device_id},
)
for entry_id in device_entry.config_entries:
if (entry := call.hass.config_entries.async_get_entry(entry_id)) is None:
continue
if entry.domain == DOMAIN:
if entry.state is not ConfigEntryState.LOADED:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="entry_not_loaded",
translation_placeholders={"entry": entry.title},
)
return (device_entry, entry)
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="config_entry_not_found",
translation_placeholders={"device_id": device_id},
)
async def _async_execute_action(call: ServiceCall, attribute: str) -> None:
"""Execute action on the device."""
device, config_entry = async_get_entry_id_for_service_call(call)
assert device.serial_number
value: str = call.data[attribute]
coordinator = config_entry.runtime_data
if attribute == ATTR_SOUND:
variant: int = call.data[ATTR_SOUND_VARIANT]
pad = "_" if variant > 10 else "_0"
file = f"{value}{pad}{variant!s}"
if value not in SOUNDS_LIST or variant > SOUNDS_LIST[value]:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="invalid_sound_value",
translation_placeholders={"sound": value, "variant": str(variant)},
)
await coordinator.api.call_alexa_sound(
coordinator.data[device.serial_number], file
)
elif attribute == ATTR_TEXT_COMMAND:
await coordinator.api.call_alexa_text_command(
coordinator.data[device.serial_number], value
)
async def async_send_sound_notification(call: ServiceCall) -> None:
"""Send a sound notification to a AmazonDevice."""
await _async_execute_action(call, ATTR_SOUND)
async def async_send_text_command(call: ServiceCall) -> None:
"""Send a custom command to a AmazonDevice."""
await _async_execute_action(call, ATTR_TEXT_COMMAND)
@callback
def async_setup_services(hass: HomeAssistant) -> None:
"""Set up the services for the Amazon Devices integration."""
for service_name, method, schema in (
(
SERVICE_SOUND_NOTIFICATION,
async_send_sound_notification,
SCHEMA_SOUND_SERVICE,
),
(
SERVICE_TEXT_COMMAND,
async_send_text_command,
SCHEMA_CUSTOM_COMMAND,
),
):
hass.services.async_register(DOMAIN, service_name, method, schema=schema)
@@ -0,0 +1,504 @@
send_text_command:
fields:
device_id:
required: true
selector:
device:
integration: alexa_devices
text_command:
required: true
example: "Play B.B.C. on TuneIn"
selector:
text:
send_sound:
fields:
device_id:
required: true
selector:
device:
integration: alexa_devices
sound_variant:
required: true
example: 1
default: 1
selector:
number:
min: 1
max: 50
sound:
required: true
example: amzn_sfx_doorbell_chime
default: amzn_sfx_doorbell_chime
selector:
select:
options:
- air_horn
- air_horns
- airboat
- airport
- aliens
- amzn_sfx_airplane_takeoff_whoosh
- amzn_sfx_army_march_clank_7x
- amzn_sfx_army_march_large_8x
- amzn_sfx_army_march_small_8x
- amzn_sfx_baby_big_cry
- amzn_sfx_baby_cry
- amzn_sfx_baby_fuss
- amzn_sfx_battle_group_clanks
- amzn_sfx_battle_man_grunts
- amzn_sfx_battle_men_grunts
- amzn_sfx_battle_men_horses
- amzn_sfx_battle_noisy_clanks
- amzn_sfx_battle_yells_men
- amzn_sfx_battle_yells_men_run
- amzn_sfx_bear_groan_roar
- amzn_sfx_bear_roar_grumble
- amzn_sfx_bear_roar_small
- amzn_sfx_beep_1x
- amzn_sfx_bell_med_chime
- amzn_sfx_bell_short_chime
- amzn_sfx_bell_timer
- amzn_sfx_bicycle_bell_ring
- amzn_sfx_bird_chickadee_chirp_1x
- amzn_sfx_bird_chickadee_chirps
- amzn_sfx_bird_forest
- amzn_sfx_bird_forest_short
- amzn_sfx_bird_robin_chirp_1x
- amzn_sfx_boing_long_1x
- amzn_sfx_boing_med_1x
- amzn_sfx_boing_short_1x
- amzn_sfx_bus_drive_past
- amzn_sfx_buzz_electronic
- amzn_sfx_buzzer_loud_alarm
- amzn_sfx_buzzer_small
- amzn_sfx_car_accelerate
- amzn_sfx_car_accelerate_noisy
- amzn_sfx_car_click_seatbelt
- amzn_sfx_car_close_door_1x
- amzn_sfx_car_drive_past
- amzn_sfx_car_honk_1x
- amzn_sfx_car_honk_2x
- amzn_sfx_car_honk_3x
- amzn_sfx_car_honk_long_1x
- amzn_sfx_car_into_driveway
- amzn_sfx_car_into_driveway_fast
- amzn_sfx_car_slam_door_1x
- amzn_sfx_car_undo_seatbelt
- amzn_sfx_cat_angry_meow_1x
- amzn_sfx_cat_angry_screech_1x
- amzn_sfx_cat_long_meow_1x
- amzn_sfx_cat_meow_1x
- amzn_sfx_cat_purr
- amzn_sfx_cat_purr_meow
- amzn_sfx_chicken_cluck
- amzn_sfx_church_bell_1x
- amzn_sfx_church_bells_ringing
- amzn_sfx_clear_throat_ahem
- amzn_sfx_clock_ticking
- amzn_sfx_clock_ticking_long
- amzn_sfx_copy_machine
- amzn_sfx_cough
- amzn_sfx_crow_caw_1x
- amzn_sfx_crowd_applause
- amzn_sfx_crowd_bar
- amzn_sfx_crowd_bar_rowdy
- amzn_sfx_crowd_boo
- amzn_sfx_crowd_cheer_med
- amzn_sfx_crowd_excited_cheer
- amzn_sfx_dog_med_bark_1x
- amzn_sfx_dog_med_bark_2x
- amzn_sfx_dog_med_bark_growl
- amzn_sfx_dog_med_growl_1x
- amzn_sfx_dog_med_woof_1x
- amzn_sfx_dog_small_bark_2x
- amzn_sfx_door_open
- amzn_sfx_door_shut
- amzn_sfx_doorbell
- amzn_sfx_doorbell_buzz
- amzn_sfx_doorbell_chime
- amzn_sfx_drinking_slurp
- amzn_sfx_drum_and_cymbal
- amzn_sfx_drum_comedy
- amzn_sfx_earthquake_rumble
- amzn_sfx_electric_guitar
- amzn_sfx_electronic_beep
- amzn_sfx_electronic_major_chord
- amzn_sfx_elephant
- amzn_sfx_elevator_bell_1x
- amzn_sfx_elevator_open_bell
- amzn_sfx_fairy_melodic_chimes
- amzn_sfx_fairy_sparkle_chimes
- amzn_sfx_faucet_drip
- amzn_sfx_faucet_running
- amzn_sfx_fireplace_crackle
- amzn_sfx_fireworks
- amzn_sfx_fireworks_firecrackers
- amzn_sfx_fireworks_launch
- amzn_sfx_fireworks_whistles
- amzn_sfx_food_frying
- amzn_sfx_footsteps
- amzn_sfx_footsteps_muffled
- amzn_sfx_ghost_spooky
- amzn_sfx_glass_on_table
- amzn_sfx_glasses_clink
- amzn_sfx_horse_gallop_4x
- amzn_sfx_horse_huff_whinny
- amzn_sfx_horse_neigh
- amzn_sfx_horse_neigh_low
- amzn_sfx_horse_whinny
- amzn_sfx_human_walking
- amzn_sfx_jar_on_table_1x
- amzn_sfx_kitchen_ambience
- amzn_sfx_large_crowd_cheer
- amzn_sfx_large_fire_crackling
- amzn_sfx_laughter
- amzn_sfx_laughter_giggle
- amzn_sfx_lightning_strike
- amzn_sfx_lion_roar
- amzn_sfx_magic_blast_1x
- amzn_sfx_monkey_calls_3x
- amzn_sfx_monkey_chimp
- amzn_sfx_monkeys_chatter
- amzn_sfx_motorcycle_accelerate
- amzn_sfx_motorcycle_engine_idle
- amzn_sfx_motorcycle_engine_rev
- amzn_sfx_musical_drone_intro
- amzn_sfx_oars_splashing_rowboat
- amzn_sfx_object_on_table_2x
- amzn_sfx_ocean_wave_1x
- amzn_sfx_ocean_wave_on_rocks_1x
- amzn_sfx_ocean_wave_surf
- amzn_sfx_people_walking
- amzn_sfx_person_running
- amzn_sfx_piano_note_1x
- amzn_sfx_punch
- amzn_sfx_rain
- amzn_sfx_rain_on_roof
- amzn_sfx_rain_thunder
- amzn_sfx_rat_squeak_2x
- amzn_sfx_rat_squeaks
- amzn_sfx_raven_caw_1x
- amzn_sfx_raven_caw_2x
- amzn_sfx_restaurant_ambience
- amzn_sfx_rooster_crow
- amzn_sfx_scifi_air_escaping
- amzn_sfx_scifi_alarm
- amzn_sfx_scifi_alien_voice
- amzn_sfx_scifi_boots_walking
- amzn_sfx_scifi_close_large_explosion
- amzn_sfx_scifi_door_open
- amzn_sfx_scifi_engines_on
- amzn_sfx_scifi_engines_on_large
- amzn_sfx_scifi_engines_on_short_burst
- amzn_sfx_scifi_explosion
- amzn_sfx_scifi_explosion_2x
- amzn_sfx_scifi_incoming_explosion
- amzn_sfx_scifi_laser_gun_battle
- amzn_sfx_scifi_laser_gun_fires
- amzn_sfx_scifi_laser_gun_fires_large
- amzn_sfx_scifi_long_explosion_1x
- amzn_sfx_scifi_missile
- amzn_sfx_scifi_motor_short_1x
- amzn_sfx_scifi_open_airlock
- amzn_sfx_scifi_radar_high_ping
- amzn_sfx_scifi_radar_low
- amzn_sfx_scifi_radar_medium
- amzn_sfx_scifi_run_away
- amzn_sfx_scifi_sheilds_up
- amzn_sfx_scifi_short_low_explosion
- amzn_sfx_scifi_small_whoosh_flyby
- amzn_sfx_scifi_small_zoom_flyby
- amzn_sfx_scifi_sonar_ping_3x
- amzn_sfx_scifi_sonar_ping_4x
- amzn_sfx_scifi_spaceship_flyby
- amzn_sfx_scifi_timer_beep
- amzn_sfx_scifi_zap_backwards
- amzn_sfx_scifi_zap_electric
- amzn_sfx_sheep_baa
- amzn_sfx_sheep_bleat
- amzn_sfx_silverware_clank
- amzn_sfx_sirens
- amzn_sfx_sleigh_bells
- amzn_sfx_small_stream
- amzn_sfx_sneeze
- amzn_sfx_stream
- amzn_sfx_strong_wind_desert
- amzn_sfx_strong_wind_whistling
- amzn_sfx_subway_leaving
- amzn_sfx_subway_passing
- amzn_sfx_subway_stopping
- amzn_sfx_swoosh_cartoon_fast
- amzn_sfx_swoosh_fast_1x
- amzn_sfx_swoosh_fast_6x
- amzn_sfx_test_tone
- amzn_sfx_thunder_rumble
- amzn_sfx_toilet_flush
- amzn_sfx_trumpet_bugle
- amzn_sfx_turkey_gobbling
- amzn_sfx_typing_medium
- amzn_sfx_typing_short
- amzn_sfx_typing_typewriter
- amzn_sfx_vacuum_off
- amzn_sfx_vacuum_on
- amzn_sfx_walking_in_mud
- amzn_sfx_walking_in_snow
- amzn_sfx_walking_on_grass
- amzn_sfx_water_dripping
- amzn_sfx_water_droplets
- amzn_sfx_wind_strong_gusting
- amzn_sfx_wind_whistling_desert
- amzn_sfx_wings_flap_4x
- amzn_sfx_wings_flap_fast
- amzn_sfx_wolf_howl
- amzn_sfx_wolf_young_howl
- amzn_sfx_wooden_door
- amzn_sfx_wooden_door_creaks_long
- amzn_sfx_wooden_door_creaks_multiple
- amzn_sfx_wooden_door_creaks_open
- amzn_ui_sfx_gameshow_bridge
- amzn_ui_sfx_gameshow_countdown_loop_32s_full
- amzn_ui_sfx_gameshow_countdown_loop_64s_full
- amzn_ui_sfx_gameshow_countdown_loop_64s_minimal
- amzn_ui_sfx_gameshow_intro
- amzn_ui_sfx_gameshow_negative_response
- amzn_ui_sfx_gameshow_neutral_response
- amzn_ui_sfx_gameshow_outro
- amzn_ui_sfx_gameshow_player1
- amzn_ui_sfx_gameshow_player2
- amzn_ui_sfx_gameshow_player3
- amzn_ui_sfx_gameshow_player4
- amzn_ui_sfx_gameshow_positive_response
- amzn_ui_sfx_gameshow_tally_negative
- amzn_ui_sfx_gameshow_tally_positive
- amzn_ui_sfx_gameshow_waiting_loop_30s
- anchor
- answering_machines
- arcs_sparks
- arrows_bows
- baby
- back_up_beeps
- bars_restaurants
- baseball
- basketball
- battles
- beeps_tones
- bell
- bikes
- billiards
- board_games
- body
- boing
- books
- bow_wash
- box
- break_shatter_smash
- breaks
- brooms_mops
- bullets
- buses
- buzz
- buzz_hums
- buzzers
- buzzers_pistols
- cables_metal
- camera
- cannons
- car_alarm
- car_alarms
- car_cell_phones
- carnivals_fairs
- cars
- casino
- casinos
- cellar
- chimes
- chimes_bells
- chorus
- christmas
- church_bells
- clock
- cloth
- concrete
- construction
- construction_factory
- crashes
- crowds
- debris
- dining_kitchens
- dinosaurs
- dripping
- drops
- electric
- electrical
- elevator
- evolution_monsters
- explosions
- factory
- falls
- fax_scanner_copier
- feedback_mics
- fight
- fire
- fire_extinguisher
- fireballs
- fireworks
- fishing_pole
- flags
- football
- footsteps
- futuristic
- futuristic_ship
- gameshow
- gear
- ghosts_demons
- giant_monster
- glass
- glasses_clink
- golf
- gorilla
- grenade_lanucher
- griffen
- gyms_locker_rooms
- handgun_loading
- handgun_shot
- handle
- hands
- heartbeats_ekg
- helicopter
- high_tech
- hit_punch_slap
- hits
- horns
- horror
- hot_tub_filling_up
- human
- human_vocals
- hygene # codespell:ignore
- ice_skating
- ignitions
- infantry
- intro
- jet
- juggling
- key_lock
- kids
- knocks
- lab_equip
- lacrosse
- lamps_lanterns
- leather
- liquid_suction
- locker_doors
- machine_gun
- magic_spells
- medium_large_explosions
- metal
- modern_rings
- money_coins
- motorcycles
- movement
- moves
- nature
- oar_boat
- pagers
- paintball
- paper
- parachute
- pay_phones
- phone_beeps
- pigmy_bats
- pills
- pour_water
- power_up_down
- printers
- prison
- public_space
- racquetball
- radios_static
- rain
- rc_airplane
- rc_car
- refrigerators_freezers
- regular
- respirator
- rifle
- roller_coaster
- rollerskates_rollerblades
- room_tones
- ropes_climbing
- rotary_rings
- rowboat_canoe
- rubber
- running
- sails
- sand_gravel
- screen_doors
- screens
- seats_stools
- servos
- shoes_boots
- shotgun
- shower
- sink_faucet
- sink_filling_water
- sink_run_and_off
- sink_water_splatter
- sirens
- skateboards
- ski
- skids_tires
- sled
- slides
- small_explosions
- snow
- snowmobile
- soldiers
- splash_water
- splashes_sprays
- sports_whistles
- squeaks
- squeaky
- stairs
- steam
- submarine_diesel
- swing_doors
- switches_levers
- swords
- tape
- tape_machine
- televisions_shows
- tennis_pingpong
- textile
- throw
- thunder
- ticks
- timer
- toilet_flush
- tone
- tones_noises
- toys
- tractors
- traffic
- train
- trucks_vans
- turnstiles
- typing
- umbrella
- underwater
- vampires
- various
- video_tunes
- volcano_earthquake
- watches
- water
- water_running
- werewolves
- winches_gears
- wind
- wood
- wood_boat
- woosh
- zap
- zippers
translation_key: sound
@@ -4,7 +4,8 @@
"data_description_country": "The country where your Amazon account is registered.",
"data_description_username": "The email address of your Amazon account.",
"data_description_password": "The password of your Amazon account.",
"data_description_code": "The one-time password to log in to your account. Currently, only tokens from OTP applications are supported."
"data_description_code": "The one-time password to log in to your account. Currently, only tokens from OTP applications are supported.",
"device_id_description": "The ID of the device to send the command to."
},
"config": {
"flow_title": "{username}",
@@ -22,17 +23,30 @@
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"code": "[%key:component::alexa_devices::common::data_description_code%]"
}
},
"reauth_confirm": {
"data": {
"password": "[%key:common::config_flow::data::password%]",
"code": "[%key:component::alexa_devices::common::data_code%]"
},
"data_description": {
"password": "[%key:component::alexa_devices::common::data_description_password%]",
"code": "[%key:component::alexa_devices::common::data_description_code%]"
}
}
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"unknown": "[%key:common::config_flow::error::unknown%]"
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_retrieve_data": "Unable to retrieve data from Amazon. Please try again later.",
"invalid_auth": "[%key:common::config_flow::error::invalid_auth%]",
"wrong_country": "Wrong country selected. Please select the country where your Amazon account is registered.",
"unknown": "[%key:common::config_flow::error::unknown%]"
}
},
@@ -71,12 +85,532 @@
}
}
},
"services": {
"send_sound": {
"name": "Send sound",
"description": "Sends a sound to a device",
"fields": {
"device_id": {
"name": "Device",
"description": "[%key:component::alexa_devices::common::device_id_description%]"
},
"sound": {
"name": "Alexa Skill sound file",
"description": "The sound file to play."
},
"sound_variant": {
"name": "Sound variant",
"description": "The variant of the sound to play."
}
}
},
"send_text_command": {
"name": "Send text command",
"description": "Sends a text command to a device",
"fields": {
"text_command": {
"name": "Alexa text command",
"description": "The text command to send."
},
"device_id": {
"name": "Device",
"description": "[%key:component::alexa_devices::common::device_id_description%]"
}
}
}
},
"selector": {
"sound": {
"options": {
"air_horn": "Air Horn",
"air_horns": "Air Horns",
"airboat": "Airboat",
"airport": "Airport",
"aliens": "Aliens",
"amzn_sfx_airplane_takeoff_whoosh": "Airplane Takeoff Whoosh",
"amzn_sfx_army_march_clank_7x": "Army March Clank 7x",
"amzn_sfx_army_march_large_8x": "Army March Large 8x",
"amzn_sfx_army_march_small_8x": "Army March Small 8x",
"amzn_sfx_baby_big_cry": "Baby Big Cry",
"amzn_sfx_baby_cry": "Baby Cry",
"amzn_sfx_baby_fuss": "Baby Fuss",
"amzn_sfx_battle_group_clanks": "Battle Group Clanks",
"amzn_sfx_battle_man_grunts": "Battle Man Grunts",
"amzn_sfx_battle_men_grunts": "Battle Men Grunts",
"amzn_sfx_battle_men_horses": "Battle Men Horses",
"amzn_sfx_battle_noisy_clanks": "Battle Noisy Clanks",
"amzn_sfx_battle_yells_men": "Battle Yells Men",
"amzn_sfx_battle_yells_men_run": "Battle Yells Men Run",
"amzn_sfx_bear_groan_roar": "Bear Groan Roar",
"amzn_sfx_bear_roar_grumble": "Bear Roar Grumble",
"amzn_sfx_bear_roar_small": "Bear Roar Small",
"amzn_sfx_beep_1x": "Beep 1x",
"amzn_sfx_bell_med_chime": "Bell Med Chime",
"amzn_sfx_bell_short_chime": "Bell Short Chime",
"amzn_sfx_bell_timer": "Bell Timer",
"amzn_sfx_bicycle_bell_ring": "Bicycle Bell Ring",
"amzn_sfx_bird_chickadee_chirp_1x": "Bird Chickadee Chirp 1x",
"amzn_sfx_bird_chickadee_chirps": "Bird Chickadee Chirps",
"amzn_sfx_bird_forest": "Bird Forest",
"amzn_sfx_bird_forest_short": "Bird Forest Short",
"amzn_sfx_bird_robin_chirp_1x": "Bird Robin Chirp 1x",
"amzn_sfx_boing_long_1x": "Boing Long 1x",
"amzn_sfx_boing_med_1x": "Boing Med 1x",
"amzn_sfx_boing_short_1x": "Boing Short 1x",
"amzn_sfx_bus_drive_past": "Bus Drive Past",
"amzn_sfx_buzz_electronic": "Buzz Electronic",
"amzn_sfx_buzzer_loud_alarm": "Buzzer Loud Alarm",
"amzn_sfx_buzzer_small": "Buzzer Small",
"amzn_sfx_car_accelerate": "Car Accelerate",
"amzn_sfx_car_accelerate_noisy": "Car Accelerate Noisy",
"amzn_sfx_car_click_seatbelt": "Car Click Seatbelt",
"amzn_sfx_car_close_door_1x": "Car Close Door 1x",
"amzn_sfx_car_drive_past": "Car Drive Past",
"amzn_sfx_car_honk_1x": "Car Honk 1x",
"amzn_sfx_car_honk_2x": "Car Honk 2x",
"amzn_sfx_car_honk_3x": "Car Honk 3x",
"amzn_sfx_car_honk_long_1x": "Car Honk Long 1x",
"amzn_sfx_car_into_driveway": "Car Into Driveway",
"amzn_sfx_car_into_driveway_fast": "Car Into Driveway Fast",
"amzn_sfx_car_slam_door_1x": "Car Slam Door 1x",
"amzn_sfx_car_undo_seatbelt": "Car Undo Seatbelt",
"amzn_sfx_cat_angry_meow_1x": "Cat Angry Meow 1x",
"amzn_sfx_cat_angry_screech_1x": "Cat Angry Screech 1x",
"amzn_sfx_cat_long_meow_1x": "Cat Long Meow 1x",
"amzn_sfx_cat_meow_1x": "Cat Meow 1x",
"amzn_sfx_cat_purr": "Cat Purr",
"amzn_sfx_cat_purr_meow": "Cat Purr Meow",
"amzn_sfx_chicken_cluck": "Chicken Cluck",
"amzn_sfx_church_bell_1x": "Church Bell 1x",
"amzn_sfx_church_bells_ringing": "Church Bells Ringing",
"amzn_sfx_clear_throat_ahem": "Clear Throat Ahem",
"amzn_sfx_clock_ticking": "Clock Ticking",
"amzn_sfx_clock_ticking_long": "Clock Ticking Long",
"amzn_sfx_copy_machine": "Copy Machine",
"amzn_sfx_cough": "Cough",
"amzn_sfx_crow_caw_1x": "Crow Caw 1x",
"amzn_sfx_crowd_applause": "Crowd Applause",
"amzn_sfx_crowd_bar": "Crowd Bar",
"amzn_sfx_crowd_bar_rowdy": "Crowd Bar Rowdy",
"amzn_sfx_crowd_boo": "Crowd Boo",
"amzn_sfx_crowd_cheer_med": "Crowd Cheer Med",
"amzn_sfx_crowd_excited_cheer": "Crowd Excited Cheer",
"amzn_sfx_dog_med_bark_1x": "Dog Med Bark 1x",
"amzn_sfx_dog_med_bark_2x": "Dog Med Bark 2x",
"amzn_sfx_dog_med_bark_growl": "Dog Med Bark Growl",
"amzn_sfx_dog_med_growl_1x": "Dog Med Growl 1x",
"amzn_sfx_dog_med_woof_1x": "Dog Med Woof 1x",
"amzn_sfx_dog_small_bark_2x": "Dog Small Bark 2x",
"amzn_sfx_door_open": "Door Open",
"amzn_sfx_door_shut": "Door Shut",
"amzn_sfx_doorbell": "Doorbell",
"amzn_sfx_doorbell_buzz": "Doorbell Buzz",
"amzn_sfx_doorbell_chime": "Doorbell Chime",
"amzn_sfx_drinking_slurp": "Drinking Slurp",
"amzn_sfx_drum_and_cymbal": "Drum And Cymbal",
"amzn_sfx_drum_comedy": "Drum Comedy",
"amzn_sfx_earthquake_rumble": "Earthquake Rumble",
"amzn_sfx_electric_guitar": "Electric Guitar",
"amzn_sfx_electronic_beep": "Electronic Beep",
"amzn_sfx_electronic_major_chord": "Electronic Major Chord",
"amzn_sfx_elephant": "Elephant",
"amzn_sfx_elevator_bell_1x": "Elevator Bell 1x",
"amzn_sfx_elevator_open_bell": "Elevator Open Bell",
"amzn_sfx_fairy_melodic_chimes": "Fairy Melodic Chimes",
"amzn_sfx_fairy_sparkle_chimes": "Fairy Sparkle Chimes",
"amzn_sfx_faucet_drip": "Faucet Drip",
"amzn_sfx_faucet_running": "Faucet Running",
"amzn_sfx_fireplace_crackle": "Fireplace Crackle",
"amzn_sfx_fireworks": "Fireworks",
"amzn_sfx_fireworks_firecrackers": "Fireworks Firecrackers",
"amzn_sfx_fireworks_launch": "Fireworks Launch",
"amzn_sfx_fireworks_whistles": "Fireworks Whistles",
"amzn_sfx_food_frying": "Food Frying",
"amzn_sfx_footsteps": "Footsteps",
"amzn_sfx_footsteps_muffled": "Footsteps Muffled",
"amzn_sfx_ghost_spooky": "Ghost Spooky",
"amzn_sfx_glass_on_table": "Glass On Table",
"amzn_sfx_glasses_clink": "Glasses Clink",
"amzn_sfx_horse_gallop_4x": "Horse Gallop 4x",
"amzn_sfx_horse_huff_whinny": "Horse Huff Whinny",
"amzn_sfx_horse_neigh": "Horse Neigh",
"amzn_sfx_horse_neigh_low": "Horse Neigh Low",
"amzn_sfx_horse_whinny": "Horse Whinny",
"amzn_sfx_human_walking": "Human Walking",
"amzn_sfx_jar_on_table_1x": "Jar On Table 1x",
"amzn_sfx_kitchen_ambience": "Kitchen Ambience",
"amzn_sfx_large_crowd_cheer": "Large Crowd Cheer",
"amzn_sfx_large_fire_crackling": "Large Fire Crackling",
"amzn_sfx_laughter": "Laughter",
"amzn_sfx_laughter_giggle": "Laughter Giggle",
"amzn_sfx_lightning_strike": "Lightning Strike",
"amzn_sfx_lion_roar": "Lion Roar",
"amzn_sfx_magic_blast_1x": "Magic Blast 1x",
"amzn_sfx_monkey_calls_3x": "Monkey Calls 3x",
"amzn_sfx_monkey_chimp": "Monkey Chimp",
"amzn_sfx_monkeys_chatter": "Monkeys Chatter",
"amzn_sfx_motorcycle_accelerate": "Motorcycle Accelerate",
"amzn_sfx_motorcycle_engine_idle": "Motorcycle Engine Idle",
"amzn_sfx_motorcycle_engine_rev": "Motorcycle Engine Rev",
"amzn_sfx_musical_drone_intro": "Musical Drone Intro",
"amzn_sfx_oars_splashing_rowboat": "Oars Splashing Rowboat",
"amzn_sfx_object_on_table_2x": "Object On Table 2x",
"amzn_sfx_ocean_wave_1x": "Ocean Wave 1x",
"amzn_sfx_ocean_wave_on_rocks_1x": "Ocean Wave On Rocks 1x",
"amzn_sfx_ocean_wave_surf": "Ocean Wave Surf",
"amzn_sfx_people_walking": "People Walking",
"amzn_sfx_person_running": "Person Running",
"amzn_sfx_piano_note_1x": "Piano Note 1x",
"amzn_sfx_punch": "Punch",
"amzn_sfx_rain": "Rain",
"amzn_sfx_rain_on_roof": "Rain On Roof",
"amzn_sfx_rain_thunder": "Rain Thunder",
"amzn_sfx_rat_squeak_2x": "Rat Squeak 2x",
"amzn_sfx_rat_squeaks": "Rat Squeaks",
"amzn_sfx_raven_caw_1x": "Raven Caw 1x",
"amzn_sfx_raven_caw_2x": "Raven Caw 2x",
"amzn_sfx_restaurant_ambience": "Restaurant Ambience",
"amzn_sfx_rooster_crow": "Rooster Crow",
"amzn_sfx_scifi_air_escaping": "Scifi Air Escaping",
"amzn_sfx_scifi_alarm": "Scifi Alarm",
"amzn_sfx_scifi_alien_voice": "Scifi Alien Voice",
"amzn_sfx_scifi_boots_walking": "Scifi Boots Walking",
"amzn_sfx_scifi_close_large_explosion": "Scifi Close Large Explosion",
"amzn_sfx_scifi_door_open": "Scifi Door Open",
"amzn_sfx_scifi_engines_on": "Scifi Engines On",
"amzn_sfx_scifi_engines_on_large": "Scifi Engines On Large",
"amzn_sfx_scifi_engines_on_short_burst": "Scifi Engines On Short Burst",
"amzn_sfx_scifi_explosion": "Scifi Explosion",
"amzn_sfx_scifi_explosion_2x": "Scifi Explosion 2x",
"amzn_sfx_scifi_incoming_explosion": "Scifi Incoming Explosion",
"amzn_sfx_scifi_laser_gun_battle": "Scifi Laser Gun Battle",
"amzn_sfx_scifi_laser_gun_fires": "Scifi Laser Gun Fires",
"amzn_sfx_scifi_laser_gun_fires_large": "Scifi Laser Gun Fires Large",
"amzn_sfx_scifi_long_explosion_1x": "Scifi Long Explosion 1x",
"amzn_sfx_scifi_missile": "Scifi Missile",
"amzn_sfx_scifi_motor_short_1x": "Scifi Motor Short 1x",
"amzn_sfx_scifi_open_airlock": "Scifi Open Airlock",
"amzn_sfx_scifi_radar_high_ping": "Scifi Radar High Ping",
"amzn_sfx_scifi_radar_low": "Scifi Radar Low",
"amzn_sfx_scifi_radar_medium": "Scifi Radar Medium",
"amzn_sfx_scifi_run_away": "Scifi Run Away",
"amzn_sfx_scifi_sheilds_up": "Scifi Sheilds Up",
"amzn_sfx_scifi_short_low_explosion": "Scifi Short Low Explosion",
"amzn_sfx_scifi_small_whoosh_flyby": "Scifi Small Whoosh Flyby",
"amzn_sfx_scifi_small_zoom_flyby": "Scifi Small Zoom Flyby",
"amzn_sfx_scifi_sonar_ping_3x": "Scifi Sonar Ping 3x",
"amzn_sfx_scifi_sonar_ping_4x": "Scifi Sonar Ping 4x",
"amzn_sfx_scifi_spaceship_flyby": "Scifi Spaceship Flyby",
"amzn_sfx_scifi_timer_beep": "Scifi Timer Beep",
"amzn_sfx_scifi_zap_backwards": "Scifi Zap Backwards",
"amzn_sfx_scifi_zap_electric": "Scifi Zap Electric",
"amzn_sfx_sheep_baa": "Sheep Baa",
"amzn_sfx_sheep_bleat": "Sheep Bleat",
"amzn_sfx_silverware_clank": "Silverware Clank",
"amzn_sfx_sirens": "Sirens",
"amzn_sfx_sleigh_bells": "Sleigh Bells",
"amzn_sfx_small_stream": "Small Stream",
"amzn_sfx_sneeze": "Sneeze",
"amzn_sfx_stream": "Stream",
"amzn_sfx_strong_wind_desert": "Strong Wind Desert",
"amzn_sfx_strong_wind_whistling": "Strong Wind Whistling",
"amzn_sfx_subway_leaving": "Subway Leaving",
"amzn_sfx_subway_passing": "Subway Passing",
"amzn_sfx_subway_stopping": "Subway Stopping",
"amzn_sfx_swoosh_cartoon_fast": "Swoosh Cartoon Fast",
"amzn_sfx_swoosh_fast_1x": "Swoosh Fast 1x",
"amzn_sfx_swoosh_fast_6x": "Swoosh Fast 6x",
"amzn_sfx_test_tone": "Test Tone",
"amzn_sfx_thunder_rumble": "Thunder Rumble",
"amzn_sfx_toilet_flush": "Toilet Flush",
"amzn_sfx_trumpet_bugle": "Trumpet Bugle",
"amzn_sfx_turkey_gobbling": "Turkey Gobbling",
"amzn_sfx_typing_medium": "Typing Medium",
"amzn_sfx_typing_short": "Typing Short",
"amzn_sfx_typing_typewriter": "Typing Typewriter",
"amzn_sfx_vacuum_off": "Vacuum Off",
"amzn_sfx_vacuum_on": "Vacuum On",
"amzn_sfx_walking_in_mud": "Walking In Mud",
"amzn_sfx_walking_in_snow": "Walking In Snow",
"amzn_sfx_walking_on_grass": "Walking On Grass",
"amzn_sfx_water_dripping": "Water Dripping",
"amzn_sfx_water_droplets": "Water Droplets",
"amzn_sfx_wind_strong_gusting": "Wind Strong Gusting",
"amzn_sfx_wind_whistling_desert": "Wind Whistling Desert",
"amzn_sfx_wings_flap_4x": "Wings Flap 4x",
"amzn_sfx_wings_flap_fast": "Wings Flap Fast",
"amzn_sfx_wolf_howl": "Wolf Howl",
"amzn_sfx_wolf_young_howl": "Wolf Young Howl",
"amzn_sfx_wooden_door": "Wooden Door",
"amzn_sfx_wooden_door_creaks_long": "Wooden Door Creaks Long",
"amzn_sfx_wooden_door_creaks_multiple": "Wooden Door Creaks Multiple",
"amzn_sfx_wooden_door_creaks_open": "Wooden Door Creaks Open",
"amzn_ui_sfx_gameshow_bridge": "Gameshow Bridge",
"amzn_ui_sfx_gameshow_countdown_loop_32s_full": "Gameshow Countdown Loop 32s Full",
"amzn_ui_sfx_gameshow_countdown_loop_64s_full": "Gameshow Countdown Loop 64s Full",
"amzn_ui_sfx_gameshow_countdown_loop_64s_minimal": "Gameshow Countdown Loop 64s Minimal",
"amzn_ui_sfx_gameshow_intro": "Gameshow Intro",
"amzn_ui_sfx_gameshow_negative_response": "Gameshow Negative Response",
"amzn_ui_sfx_gameshow_neutral_response": "Gameshow Neutral Response",
"amzn_ui_sfx_gameshow_outro": "Gameshow Outro",
"amzn_ui_sfx_gameshow_player1": "Gameshow Player1",
"amzn_ui_sfx_gameshow_player2": "Gameshow Player2",
"amzn_ui_sfx_gameshow_player3": "Gameshow Player3",
"amzn_ui_sfx_gameshow_player4": "Gameshow Player4",
"amzn_ui_sfx_gameshow_positive_response": "Gameshow Positive Response",
"amzn_ui_sfx_gameshow_tally_negative": "Gameshow Tally Negative",
"amzn_ui_sfx_gameshow_tally_positive": "Gameshow Tally Positive",
"amzn_ui_sfx_gameshow_waiting_loop_30s": "Gameshow Waiting Loop 30s",
"anchor": "Anchor",
"answering_machines": "Answering Machines",
"arcs_sparks": "Arcs Sparks",
"arrows_bows": "Arrows Bows",
"baby": "Baby",
"back_up_beeps": "Back Up Beeps",
"bars_restaurants": "Bars Restaurants",
"baseball": "Baseball",
"basketball": "Basketball",
"battles": "Battles",
"beeps_tones": "Beeps Tones",
"bell": "Bell",
"bikes": "Bikes",
"billiards": "Billiards",
"board_games": "Board Games",
"body": "Body",
"boing": "Boing",
"books": "Books",
"bow_wash": "Bow Wash",
"box": "Box",
"break_shatter_smash": "Break Shatter Smash",
"breaks": "Breaks",
"brooms_mops": "Brooms Mops",
"bullets": "Bullets",
"buses": "Buses",
"buzz": "Buzz",
"buzz_hums": "Buzz Hums",
"buzzers": "Buzzers",
"buzzers_pistols": "Buzzers Pistols",
"cables_metal": "Cables Metal",
"camera": "Camera",
"cannons": "Cannons",
"car_alarm": "Car Alarm",
"car_alarms": "Car Alarms",
"car_cell_phones": "Car Cell Phones",
"carnivals_fairs": "Carnivals Fairs",
"cars": "Cars",
"casino": "Casino",
"casinos": "Casinos",
"cellar": "Cellar",
"chimes": "Chimes",
"chimes_bells": "Chimes Bells",
"chorus": "Chorus",
"christmas": "Christmas",
"church_bells": "Church Bells",
"clock": "Clock",
"cloth": "Cloth",
"concrete": "Concrete",
"construction": "Construction",
"construction_factory": "Construction Factory",
"crashes": "Crashes",
"crowds": "Crowds",
"debris": "Debris",
"dining_kitchens": "Dining Kitchens",
"dinosaurs": "Dinosaurs",
"dripping": "Dripping",
"drops": "Drops",
"electric": "Electric",
"electrical": "Electrical",
"elevator": "Elevator",
"evolution_monsters": "Evolution Monsters",
"explosions": "Explosions",
"factory": "Factory",
"falls": "Falls",
"fax_scanner_copier": "Fax Scanner Copier",
"feedback_mics": "Feedback Mics",
"fight": "Fight",
"fire": "Fire",
"fire_extinguisher": "Fire Extinguisher",
"fireballs": "Fireballs",
"fireworks": "Fireworks",
"fishing_pole": "Fishing Pole",
"flags": "Flags",
"football": "Football",
"footsteps": "Footsteps",
"futuristic": "Futuristic",
"futuristic_ship": "Futuristic Ship",
"gameshow": "Gameshow",
"gear": "Gear",
"ghosts_demons": "Ghosts Demons",
"giant_monster": "Giant Monster",
"glass": "Glass",
"glasses_clink": "Glasses Clink",
"golf": "Golf",
"gorilla": "Gorilla",
"grenade_lanucher": "Grenade Lanucher",
"griffen": "Griffen",
"gyms_locker_rooms": "Gyms Locker Rooms",
"handgun_loading": "Handgun Loading",
"handgun_shot": "Handgun Shot",
"handle": "Handle",
"hands": "Hands",
"heartbeats_ekg": "Heartbeats EKG",
"helicopter": "Helicopter",
"high_tech": "High Tech",
"hit_punch_slap": "Hit Punch Slap",
"hits": "Hits",
"horns": "Horns",
"horror": "Horror",
"hot_tub_filling_up": "Hot Tub Filling Up",
"human": "Human",
"human_vocals": "Human Vocals",
"hygene": "Hygene",
"ice_skating": "Ice Skating",
"ignitions": "Ignitions",
"infantry": "Infantry",
"intro": "Intro",
"jet": "Jet",
"juggling": "Juggling",
"key_lock": "Key Lock",
"kids": "Kids",
"knocks": "Knocks",
"lab_equip": "Lab Equip",
"lacrosse": "Lacrosse",
"lamps_lanterns": "Lamps Lanterns",
"leather": "Leather",
"liquid_suction": "Liquid Suction",
"locker_doors": "Locker Doors",
"machine_gun": "Machine Gun",
"magic_spells": "Magic Spells",
"medium_large_explosions": "Medium Large Explosions",
"metal": "Metal",
"modern_rings": "Modern Rings",
"money_coins": "Money Coins",
"motorcycles": "Motorcycles",
"movement": "Movement",
"moves": "Moves",
"nature": "Nature",
"oar_boat": "Oar Boat",
"pagers": "Pagers",
"paintball": "Paintball",
"paper": "Paper",
"parachute": "Parachute",
"pay_phones": "Pay Phones",
"phone_beeps": "Phone Beeps",
"pigmy_bats": "Pigmy Bats",
"pills": "Pills",
"pour_water": "Pour Water",
"power_up_down": "Power Up Down",
"printers": "Printers",
"prison": "Prison",
"public_space": "Public Space",
"racquetball": "Racquetball",
"radios_static": "Radios Static",
"rain": "Rain",
"rc_airplane": "RC Airplane",
"rc_car": "RC Car",
"refrigerators_freezers": "Refrigerators Freezers",
"regular": "Regular",
"respirator": "Respirator",
"rifle": "Rifle",
"roller_coaster": "Roller Coaster",
"rollerskates_rollerblades": "RollerSkates RollerBlades",
"room_tones": "Room Tones",
"ropes_climbing": "Ropes Climbing",
"rotary_rings": "Rotary Rings",
"rowboat_canoe": "Rowboat Canoe",
"rubber": "Rubber",
"running": "Running",
"sails": "Sails",
"sand_gravel": "Sand Gravel",
"screen_doors": "Screen Doors",
"screens": "Screens",
"seats_stools": "Seats Stools",
"servos": "Servos",
"shoes_boots": "Shoes Boots",
"shotgun": "Shotgun",
"shower": "Shower",
"sink_faucet": "Sink Faucet",
"sink_filling_water": "Sink Filling Water",
"sink_run_and_off": "Sink Run And Off",
"sink_water_splatter": "Sink Water Splatter",
"sirens": "Sirens",
"skateboards": "Skateboards",
"ski": "Ski",
"skids_tires": "Skids Tires",
"sled": "Sled",
"slides": "Slides",
"small_explosions": "Small Explosions",
"snow": "Snow",
"snowmobile": "Snowmobile",
"soldiers": "Soldiers",
"splash_water": "Splash Water",
"splashes_sprays": "Splashes Sprays",
"sports_whistles": "Sports Whistles",
"squeaks": "Squeaks",
"squeaky": "Squeaky",
"stairs": "Stairs",
"steam": "Steam",
"submarine_diesel": "Submarine Diesel",
"swing_doors": "Swing Doors",
"switches_levers": "Switches Levers",
"swords": "Swords",
"tape": "Tape",
"tape_machine": "Tape Machine",
"televisions_shows": "Televisions Shows",
"tennis_pingpong": "Tennis PingPong",
"textile": "Textile",
"throw": "Throw",
"thunder": "Thunder",
"ticks": "Ticks",
"timer": "Timer",
"toilet_flush": "Toilet Flush",
"tone": "Tone",
"tones_noises": "Tones Noises",
"toys": "Toys",
"tractors": "Tractors",
"traffic": "Traffic",
"train": "Train",
"trucks_vans": "Trucks Vans",
"turnstiles": "Turnstiles",
"typing": "Typing",
"umbrella": "Umbrella",
"underwater": "Underwater",
"vampires": "Vampires",
"various": "Various",
"video_tunes": "Video Tunes",
"volcano_earthquake": "Volcano Earthquake",
"watches": "Watches",
"water": "Water",
"water_running": "Water Running",
"werewolves": "Werewolves",
"winches_gears": "Winches Gears",
"wind": "Wind",
"wood": "Wood",
"wood_boat": "Wood Boat",
"woosh": "Woosh",
"zap": "Zap",
"zippers": "Zippers"
}
}
},
"exceptions": {
"cannot_connect": {
"cannot_connect_with_error": {
"message": "Error connecting: {error}"
},
"cannot_retrieve_data": {
"cannot_retrieve_data_with_error": {
"message": "Error retrieving data: {error}"
},
"device_serial_number_missing": {
"message": "Device serial number missing: {device_id}"
},
"invalid_device_id": {
"message": "Invalid device ID specified: {device_id}"
},
"invalid_sound_value": {
"message": "Invalid sound {sound} with variant {variant} specified"
},
"entry_not_loaded": {
"message": "Entry not loaded: {entry}"
}
}
}
@@ -26,14 +26,14 @@ def alexa_api_call[_T: AmazonEntity, **_P](
self.coordinator.last_update_success = False
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="cannot_connect",
translation_key="cannot_connect_with_error",
translation_placeholders={"error": repr(err)},
) from err
except CannotRetrieveData as err:
self.coordinator.last_update_success = False
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="cannot_retrieve_data",
translation_key="cannot_retrieve_data_with_error",
translation_placeholders={"error": repr(err)},
) from err
@@ -2,11 +2,22 @@
import amberelectric
from homeassistant.components.sensor import ConfigType
from homeassistant.const import CONF_API_TOKEN
from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv
from .const import CONF_SITE_ID, PLATFORMS
from .const import CONF_SITE_ID, DOMAIN, PLATFORMS
from .coordinator import AmberConfigEntry, AmberUpdateCoordinator
from .services import setup_services
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the Amber component."""
setup_services(hass)
return True
async def async_setup_entry(hass: HomeAssistant, entry: AmberConfigEntry) -> bool:
@@ -1,14 +1,23 @@
"""Amber Electric Constants."""
import logging
from typing import Final
from homeassistant.const import Platform
DOMAIN = "amberelectric"
DOMAIN: Final = "amberelectric"
CONF_SITE_NAME = "site_name"
CONF_SITE_ID = "site_id"
ATTR_CHANNEL_TYPE = "channel_type"
ATTRIBUTION = "Data provided by Amber Electric"
LOGGER = logging.getLogger(__package__)
PLATFORMS = [Platform.BINARY_SENSOR, Platform.SENSOR]
SERVICE_GET_FORECASTS = "get_forecasts"
GENERAL_CHANNEL = "general"
CONTROLLED_LOAD_CHANNEL = "controlled_load"
FEED_IN_CHANNEL = "feed_in"
@@ -10,7 +10,6 @@ from amberelectric.models.actual_interval import ActualInterval
from amberelectric.models.channel import ChannelType
from amberelectric.models.current_interval import CurrentInterval
from amberelectric.models.forecast_interval import ForecastInterval
from amberelectric.models.price_descriptor import PriceDescriptor
from amberelectric.rest import ApiException
from homeassistant.config_entries import ConfigEntry
@@ -18,6 +17,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import LOGGER
from .helpers import normalize_descriptor
type AmberConfigEntry = ConfigEntry[AmberUpdateCoordinator]
@@ -49,27 +49,6 @@ def is_feed_in(interval: ActualInterval | CurrentInterval | ForecastInterval) ->
return interval.channel_type == ChannelType.FEEDIN
def normalize_descriptor(descriptor: PriceDescriptor | None) -> str | None:
"""Return the snake case versions of descriptor names. Returns None if the name is not recognized."""
if descriptor is None:
return None
if descriptor.value == "spike":
return "spike"
if descriptor.value == "high":
return "high"
if descriptor.value == "neutral":
return "neutral"
if descriptor.value == "low":
return "low"
if descriptor.value == "veryLow":
return "very_low"
if descriptor.value == "extremelyLow":
return "extremely_low"
if descriptor.value == "negative":
return "negative"
return None
class AmberUpdateCoordinator(DataUpdateCoordinator):
"""AmberUpdateCoordinator - In charge of downloading the data for a site, which all the sensors read."""
@@ -103,7 +82,7 @@ class AmberUpdateCoordinator(DataUpdateCoordinator):
"grid": {},
}
try:
data = self._api.get_current_prices(self.site_id, next=48)
data = self._api.get_current_prices(self.site_id, next=288)
intervals = [interval.actual_instance for interval in data]
except ApiException as api_exception:
raise UpdateFailed("Missing price data, skipping update") from api_exception
@@ -0,0 +1,25 @@
"""Formatting helpers used to convert things."""
from amberelectric.models.price_descriptor import PriceDescriptor
DESCRIPTOR_MAP: dict[str, str] = {
PriceDescriptor.SPIKE: "spike",
PriceDescriptor.HIGH: "high",
PriceDescriptor.NEUTRAL: "neutral",
PriceDescriptor.LOW: "low",
PriceDescriptor.VERYLOW: "very_low",
PriceDescriptor.EXTREMELYLOW: "extremely_low",
PriceDescriptor.NEGATIVE: "negative",
}
def normalize_descriptor(descriptor: PriceDescriptor | None) -> str | None:
"""Return the snake case versions of descriptor names. Returns None if the name is not recognized."""
if descriptor in DESCRIPTOR_MAP:
return DESCRIPTOR_MAP[descriptor]
return None
def format_cents_to_dollars(cents: float) -> float:
"""Return a formatted conversion from cents to dollars."""
return round(cents / 100, 2)
@@ -22,5 +22,10 @@
}
}
}
},
"services": {
"get_forecasts": {
"service": "mdi:transmission-tower"
}
}
}
@@ -23,16 +23,12 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import ATTRIBUTION
from .coordinator import AmberConfigEntry, AmberUpdateCoordinator, normalize_descriptor
from .coordinator import AmberConfigEntry, AmberUpdateCoordinator
from .helpers import format_cents_to_dollars, normalize_descriptor
UNIT = f"{CURRENCY_DOLLAR}/{UnitOfEnergy.KILO_WATT_HOUR}"
def format_cents_to_dollars(cents: float) -> float:
"""Return a formatted conversion from cents to dollars."""
return round(cents / 100, 2)
def friendly_channel_type(channel_type: str) -> str:
"""Return a human readable version of the channel type."""
if channel_type == "controlled_load":
@@ -0,0 +1,121 @@
"""Amber Electric Service class."""
from amberelectric.models.channel import ChannelType
import voluptuous as vol
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import ATTR_CONFIG_ENTRY_ID
from homeassistant.core import (
HomeAssistant,
ServiceCall,
ServiceResponse,
SupportsResponse,
)
from homeassistant.exceptions import ServiceValidationError
from homeassistant.helpers.selector import ConfigEntrySelector
from homeassistant.util.json import JsonValueType
from .const import (
ATTR_CHANNEL_TYPE,
CONTROLLED_LOAD_CHANNEL,
DOMAIN,
FEED_IN_CHANNEL,
GENERAL_CHANNEL,
SERVICE_GET_FORECASTS,
)
from .coordinator import AmberConfigEntry
from .helpers import format_cents_to_dollars, normalize_descriptor
GET_FORECASTS_SCHEMA = vol.Schema(
{
ATTR_CONFIG_ENTRY_ID: ConfigEntrySelector({"integration": DOMAIN}),
ATTR_CHANNEL_TYPE: vol.In(
[GENERAL_CHANNEL, CONTROLLED_LOAD_CHANNEL, FEED_IN_CHANNEL]
),
}
)
def async_get_entry(hass: HomeAssistant, config_entry_id: str) -> AmberConfigEntry:
"""Get the Amber config entry."""
if not (entry := hass.config_entries.async_get_entry(config_entry_id)):
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="integration_not_found",
translation_placeholders={"target": config_entry_id},
)
if entry.state is not ConfigEntryState.LOADED:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="not_loaded",
translation_placeholders={"target": entry.title},
)
return entry
def get_forecasts(channel_type: str, data: dict) -> list[JsonValueType]:
"""Return an array of forecasts."""
results: list[JsonValueType] = []
if channel_type not in data["forecasts"]:
raise ServiceValidationError(
translation_domain=DOMAIN,
translation_key="channel_not_found",
translation_placeholders={"channel_type": channel_type},
)
intervals = data["forecasts"][channel_type]
for interval in intervals:
datum = {}
datum["duration"] = interval.duration
datum["date"] = interval.var_date.isoformat()
datum["nem_date"] = interval.nem_time.isoformat()
datum["per_kwh"] = format_cents_to_dollars(interval.per_kwh)
if interval.channel_type == ChannelType.FEEDIN:
datum["per_kwh"] = datum["per_kwh"] * -1
datum["spot_per_kwh"] = format_cents_to_dollars(interval.spot_per_kwh)
datum["start_time"] = interval.start_time.isoformat()
datum["end_time"] = interval.end_time.isoformat()
datum["renewables"] = round(interval.renewables)
datum["spike_status"] = interval.spike_status.value
datum["descriptor"] = normalize_descriptor(interval.descriptor)
if interval.range is not None:
datum["range_min"] = format_cents_to_dollars(interval.range.min)
datum["range_max"] = format_cents_to_dollars(interval.range.max)
if interval.advanced_price is not None:
multiplier = -1 if interval.channel_type == ChannelType.FEEDIN else 1
datum["advanced_price_low"] = multiplier * format_cents_to_dollars(
interval.advanced_price.low
)
datum["advanced_price_predicted"] = multiplier * format_cents_to_dollars(
interval.advanced_price.predicted
)
datum["advanced_price_high"] = multiplier * format_cents_to_dollars(
interval.advanced_price.high
)
results.append(datum)
return results
def setup_services(hass: HomeAssistant) -> None:
"""Set up the services for the Amber integration."""
async def handle_get_forecasts(call: ServiceCall) -> ServiceResponse:
channel_type = call.data[ATTR_CHANNEL_TYPE]
entry = async_get_entry(hass, call.data[ATTR_CONFIG_ENTRY_ID])
coordinator = entry.runtime_data
forecasts = get_forecasts(channel_type, coordinator.data)
return {"forecasts": forecasts}
hass.services.async_register(
DOMAIN,
SERVICE_GET_FORECASTS,
handle_get_forecasts,
GET_FORECASTS_SCHEMA,
supports_response=SupportsResponse.ONLY,
)
@@ -0,0 +1,16 @@
get_forecasts:
fields:
config_entry_id:
required: true
selector:
config_entry:
integration: amberelectric
channel_type:
required: true
selector:
select:
options:
- general
- controlled_load
- feed_in
translation_key: channel_type
@@ -1,25 +1,61 @@
{
"config": {
"error": {
"invalid_api_token": "[%key:common::config_flow::error::invalid_api_key%]",
"no_site": "No site provided",
"unknown_error": "[%key:common::config_flow::error::unknown%]"
},
"step": {
"site": {
"data": {
"site_id": "Site NMI",
"site_name": "Site name"
},
"description": "Select the NMI of the site you would like to add"
},
"user": {
"data": {
"api_token": "[%key:common::config_flow::data::api_token%]",
"site_id": "Site ID"
},
"description": "Go to {api_url} to generate an API key"
},
"site": {
"data": {
"site_id": "Site NMI",
"site_name": "Site Name"
},
"description": "Select the NMI of the site you would like to add"
}
}
},
"services": {
"get_forecasts": {
"name": "Get price forecasts",
"description": "Retrieves price forecasts from Amber Electric for a site.",
"fields": {
"config_entry_id": {
"description": "The config entry of the site to get forecasts for.",
"name": "Config entry"
},
"channel_type": {
"name": "Channel type",
"description": "The channel to get forecasts for."
}
}
}
},
"exceptions": {
"integration_not_found": {
"message": "Config entry \"{target}\" not found in registry."
},
"error": {
"invalid_api_token": "[%key:common::config_flow::error::invalid_api_key%]",
"no_site": "No site provided",
"unknown_error": "[%key:common::config_flow::error::unknown%]"
"not_loaded": {
"message": "{target} is not loaded."
},
"channel_not_found": {
"message": "There is no {channel_type} channel at this site."
}
},
"selector": {
"channel_type": {
"options": {
"general": "General",
"controlled_load": "Controlled load",
"feed_in": "Feed-in"
}
}
}
}
@@ -5,7 +5,7 @@ from __future__ import annotations
from aioambient.util import get_public_device_id
from homeassistant.core import callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import Entity, EntityDescription
@@ -37,6 +37,7 @@ class AmbientWeatherEntity(Entity):
identifiers={(DOMAIN, mac_address)},
manufacturer="Ambient Weather",
name=station_name.capitalize(),
connections={(CONNECTION_NETWORK_MAC, mac_address)},
)
self._attr_unique_id = f"{mac_address}_{description.key}"
@@ -7,5 +7,5 @@
"iot_class": "local_polling",
"loggers": ["amcrest"],
"quality_scale": "legacy",
"requirements": ["amcrest==1.9.8"]
"requirements": ["amcrest==1.9.9"]
}
@@ -14,6 +14,7 @@ from homeassistant.util.hass_dict import HassKey
from .analytics import Analytics
from .const import ATTR_ONBOARDED, ATTR_PREFERENCES, DOMAIN, INTERVAL, PREFERENCE_SCHEMA
from .http import AnalyticsDevicesView
CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
@@ -55,6 +56,8 @@ async def async_setup(hass: HomeAssistant, _: ConfigType) -> bool:
websocket_api.async_register_command(hass, websocket_analytics)
websocket_api.async_register_command(hass, websocket_analytics_preferences)
hass.http.register_view(AnalyticsDevicesView)
hass.data[DATA_COMPONENT] = analytics
return True
@@ -27,7 +27,7 @@ from homeassistant.config_entries import SOURCE_IGNORE
from homeassistant.const import ATTR_DOMAIN, BASE_PLATFORMS, __version__ as HA_VERSION
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.storage import Store
@@ -77,6 +77,11 @@ from .const import (
)
def gen_uuid() -> str:
"""Generate a new UUID."""
return uuid.uuid4().hex
@dataclass
class AnalyticsData:
"""Analytics data."""
@@ -184,7 +189,7 @@ class Analytics:
return
if self._data.uuid is None:
self._data.uuid = uuid.uuid4().hex
self._data.uuid = gen_uuid()
await self._store.async_save(dataclass_asdict(self._data))
if self.supervisor:
@@ -381,3 +386,68 @@ def _domains_from_yaml_config(yaml_configuration: dict[str, Any]) -> set[str]:
).values():
domains.update(platforms)
return domains
async def async_devices_payload(hass: HomeAssistant) -> dict:
"""Return the devices payload."""
devices: list[dict[str, Any]] = []
dev_reg = dr.async_get(hass)
# Devices that need via device info set
new_indexes: dict[str, int] = {}
via_devices: dict[str, str] = {}
seen_integrations = set()
for device in dev_reg.devices.values():
if not device.primary_config_entry:
continue
config_entry = hass.config_entries.async_get_entry(device.primary_config_entry)
if config_entry is None:
continue
seen_integrations.add(config_entry.domain)
new_indexes[device.id] = len(devices)
devices.append(
{
"integration": config_entry.domain,
"manufacturer": device.manufacturer,
"model_id": device.model_id,
"model": device.model,
"sw_version": device.sw_version,
"hw_version": device.hw_version,
"has_configuration_url": device.configuration_url is not None,
"via_device": None,
"entry_type": device.entry_type.value if device.entry_type else None,
}
)
if device.via_device_id:
via_devices[device.id] = device.via_device_id
for from_device, via_device in via_devices.items():
if via_device not in new_indexes:
continue
devices[new_indexes[from_device]]["via_device"] = new_indexes[via_device]
integrations = {
domain: integration
for domain, integration in (
await async_get_integrations(hass, seen_integrations)
).items()
if isinstance(integration, Integration)
}
for device_info in devices:
if integration := integrations.get(device_info["integration"]):
device_info["is_custom_integration"] = not integration.is_built_in
# Include version for custom integrations
if not integration.is_built_in and integration.version:
device_info["custom_integration_version"] = str(integration.version)
return {
"version": "home-assistant:1",
"devices": devices,
}
@@ -0,0 +1,27 @@
"""HTTP endpoints for analytics integration."""
from aiohttp import web
from homeassistant.components.http import KEY_HASS, HomeAssistantView, require_admin
from homeassistant.core import HomeAssistant
from .analytics import async_devices_payload
class AnalyticsDevicesView(HomeAssistantView):
"""View to handle analytics devices payload download requests."""
url = "/api/analytics/devices"
name = "api:analytics:devices"
@require_admin
async def get(self, request: web.Request) -> web.Response:
"""Return analytics devices payload as JSON."""
hass: HomeAssistant = request.app[KEY_HASS]
payload = await async_devices_payload(hass)
return self.json(
payload,
headers={
"Content-Disposition": "attachment; filename=analytics_devices.json"
},
)
@@ -3,7 +3,7 @@
"name": "Analytics",
"after_dependencies": ["energy", "hassio", "recorder"],
"codeowners": ["@home-assistant/core", "@ludeeus"],
"dependencies": ["api", "websocket_api"],
"dependencies": ["api", "websocket_api", "http"],
"documentation": "https://www.home-assistant.io/integrations/analytics",
"integration_type": "system",
"iot_class": "cloud_push",
@@ -55,7 +55,6 @@ async def async_setup_entry(
entry.runtime_data = AnalyticsInsightsData(coordinator=coordinator, names=names)
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
entry.async_on_unload(entry.add_update_listener(update_listener))
return True
@@ -65,10 +64,3 @@ async def async_unload_entry(
) -> bool:
"""Unload a config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
async def update_listener(
hass: HomeAssistant, entry: AnalyticsInsightsConfigEntry
) -> None:
"""Handle options update."""
await hass.config_entries.async_reload(entry.entry_id)
@@ -11,7 +11,11 @@ from python_homeassistant_analytics import (
from python_homeassistant_analytics.models import Environment, IntegrationType
import voluptuous as vol
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow
from homeassistant.config_entries import (
ConfigFlow,
ConfigFlowResult,
OptionsFlowWithReload,
)
from homeassistant.core import callback
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.selector import (
@@ -129,7 +133,7 @@ class HomeassistantAnalyticsConfigFlow(ConfigFlow, domain=DOMAIN):
)
class HomeassistantAnalyticsOptionsFlowHandler(OptionsFlow):
class HomeassistantAnalyticsOptionsFlowHandler(OptionsFlowWithReload):
"""Handle Homeassistant Analytics options."""
async def async_step_init(
@@ -30,10 +30,9 @@ class AndroidIPCamDataUpdateCoordinator(DataUpdateCoordinator[None]):
cam: PyDroidIPCam,
) -> None:
"""Initialize the Android IP Webcam."""
self.hass = hass
self.cam = cam
super().__init__(
self.hass,
hass,
_LOGGER,
config_entry=config_entry,
name=f"{DOMAIN} {config_entry.data[CONF_HOST]}",
@@ -56,7 +56,7 @@ SERVICE_UPLOAD = "upload"
ANDROIDTV_STATES = {
"off": MediaPlayerState.OFF,
"idle": MediaPlayerState.IDLE,
"standby": MediaPlayerState.STANDBY,
"standby": MediaPlayerState.IDLE,
"playing": MediaPlayerState.PLAYING,
"paused": MediaPlayerState.PAUSED,
}
@@ -5,26 +5,18 @@ from __future__ import annotations
from asyncio import timeout
import logging
from androidtvremote2 import (
AndroidTVRemote,
CannotConnect,
ConnectionClosed,
InvalidAuth,
)
from androidtvremote2 import CannotConnect, ConnectionClosed, InvalidAuth
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_NAME, EVENT_HOMEASSISTANT_STOP, Platform
from homeassistant.core import Event, HomeAssistant, callback
from homeassistant.exceptions import ConfigEntryAuthFailed, ConfigEntryNotReady
from .helpers import create_api, get_enable_ime
from .helpers import AndroidTVRemoteConfigEntry, create_api, get_enable_ime
_LOGGER = logging.getLogger(__name__)
PLATFORMS: list[Platform] = [Platform.MEDIA_PLAYER, Platform.REMOTE]
AndroidTVRemoteConfigEntry = ConfigEntry[AndroidTVRemote]
async def async_setup_entry(
hass: HomeAssistant, entry: AndroidTVRemoteConfigEntry
@@ -76,21 +68,14 @@ async def async_setup_entry(
entry.async_on_unload(
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, on_hass_stop)
)
entry.async_on_unload(entry.add_update_listener(async_update_options))
entry.async_on_unload(api.disconnect)
return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(
hass: HomeAssistant, entry: AndroidTVRemoteConfigEntry
) -> bool:
"""Unload a config entry."""
_LOGGER.debug("async_unload_entry: %s", entry.data)
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
async def async_update_options(hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Handle options update."""
_LOGGER.debug(
"async_update_options: data: %s options: %s", entry.data, entry.options
)
await hass.config_entries.async_reload(entry.entry_id)
@@ -16,10 +16,10 @@ import voluptuous as vol
from homeassistant.config_entries import (
SOURCE_REAUTH,
ConfigEntry,
SOURCE_RECONFIGURE,
ConfigFlow,
ConfigFlowResult,
OptionsFlow,
OptionsFlowWithReload,
)
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME
from homeassistant.core import callback
@@ -33,7 +33,7 @@ from homeassistant.helpers.selector import (
from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo
from .const import CONF_APP_ICON, CONF_APP_NAME, CONF_APPS, CONF_ENABLE_IME, DOMAIN
from .helpers import create_api, get_enable_ime
from .helpers import AndroidTVRemoteConfigEntry, create_api, get_enable_ime
_LOGGER = logging.getLogger(__name__)
@@ -41,12 +41,6 @@ APPS_NEW_ID = "NewApp"
CONF_APP_DELETE = "app_delete"
CONF_APP_ID = "app_id"
STEP_USER_DATA_SCHEMA = vol.Schema(
{
vol.Required("host"): str,
}
)
STEP_PAIR_DATA_SCHEMA = vol.Schema(
{
vol.Required("pin"): str,
@@ -67,7 +61,7 @@ class AndroidTVRemoteConfigFlow(ConfigFlow, domain=DOMAIN):
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle the initial step."""
"""Handle the initial and reconfigure step."""
errors: dict[str, str] = {}
if user_input is not None:
self.host = user_input[CONF_HOST]
@@ -76,15 +70,32 @@ class AndroidTVRemoteConfigFlow(ConfigFlow, domain=DOMAIN):
await api.async_generate_cert_if_missing()
self.name, self.mac = await api.async_get_name_and_mac()
await self.async_set_unique_id(format_mac(self.mac))
if self.source == SOURCE_RECONFIGURE:
self._abort_if_unique_id_mismatch()
return self.async_update_reload_and_abort(
self._get_reconfigure_entry(),
data={
CONF_HOST: self.host,
CONF_NAME: self.name,
CONF_MAC: self.mac,
},
)
self._abort_if_unique_id_configured(updates={CONF_HOST: self.host})
return await self._async_start_pair()
except (CannotConnect, ConnectionClosed):
# Likely invalid IP address or device is network unreachable. Stay
# in the user step allowing the user to enter a different host.
errors["base"] = "cannot_connect"
else:
user_input = {}
default_host = user_input.get(CONF_HOST, vol.UNDEFINED)
if self.source == SOURCE_RECONFIGURE:
default_host = self._get_reconfigure_entry().data[CONF_HOST]
return self.async_show_form(
step_id="user",
data_schema=STEP_USER_DATA_SCHEMA,
step_id="reconfigure" if self.source == SOURCE_RECONFIGURE else "user",
data_schema=vol.Schema(
{vol.Required(CONF_HOST, default=default_host): str}
),
errors=errors,
)
@@ -105,10 +116,10 @@ class AndroidTVRemoteConfigFlow(ConfigFlow, domain=DOMAIN):
pin = user_input["pin"]
await self.api.async_finish_pairing(pin)
if self.source == SOURCE_REAUTH:
await self.hass.config_entries.async_reload(
self._get_reauth_entry().entry_id
return self.async_update_reload_and_abort(
self._get_reauth_entry(), reload_even_if_entry_is_unchanged=True
)
return self.async_abort(reason="reauth_successful")
return self.async_create_entry(
title=self.name,
data={
@@ -217,19 +228,25 @@ class AndroidTVRemoteConfigFlow(ConfigFlow, domain=DOMAIN):
errors=errors,
)
async def async_step_reconfigure(
self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult:
"""Handle reconfiguration."""
return await self.async_step_user(user_input)
@staticmethod
@callback
def async_get_options_flow(
config_entry: ConfigEntry,
config_entry: AndroidTVRemoteConfigEntry,
) -> AndroidTVRemoteOptionsFlowHandler:
"""Create the options flow."""
return AndroidTVRemoteOptionsFlowHandler(config_entry)
class AndroidTVRemoteOptionsFlowHandler(OptionsFlow):
class AndroidTVRemoteOptionsFlowHandler(OptionsFlowWithReload):
"""Android TV Remote options flow."""
def __init__(self, config_entry: ConfigEntry) -> None:
def __init__(self, config_entry: AndroidTVRemoteConfigEntry) -> None:
"""Initialize options flow."""
self._apps: dict[str, Any] = dict(config_entry.options.get(CONF_APPS, {}))
self._conf_app_id: str | None = None
@@ -8,7 +8,7 @@ from homeassistant.components.diagnostics import async_redact_data
from homeassistant.const import CONF_HOST, CONF_MAC
from homeassistant.core import HomeAssistant
from . import AndroidTVRemoteConfigEntry
from .helpers import AndroidTVRemoteConfigEntry
TO_REDACT = {CONF_HOST, CONF_MAC}
@@ -6,7 +6,6 @@ from typing import Any
from androidtvremote2 import AndroidTVRemote, ConnectionClosed
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME
from homeassistant.core import callback
from homeassistant.exceptions import HomeAssistantError
@@ -14,6 +13,7 @@ from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC, Device
from homeassistant.helpers.entity import Entity
from .const import CONF_APPS, DOMAIN
from .helpers import AndroidTVRemoteConfigEntry
class AndroidTVRemoteBaseEntity(Entity):
@@ -23,7 +23,9 @@ class AndroidTVRemoteBaseEntity(Entity):
_attr_has_entity_name = True
_attr_should_poll = False
def __init__(self, api: AndroidTVRemote, config_entry: ConfigEntry) -> None:
def __init__(
self, api: AndroidTVRemote, config_entry: AndroidTVRemoteConfigEntry
) -> None:
"""Initialize the entity."""
self._api = api
self._host = config_entry.data[CONF_HOST]
@@ -10,6 +10,8 @@ from homeassistant.helpers.storage import STORAGE_DIR
from .const import CONF_ENABLE_IME, CONF_ENABLE_IME_DEFAULT_VALUE
AndroidTVRemoteConfigEntry = ConfigEntry[AndroidTVRemote]
def create_api(hass: HomeAssistant, host: str, enable_ime: bool) -> AndroidTVRemote:
"""Create an AndroidTVRemote instance."""
@@ -23,6 +25,6 @@ def create_api(hass: HomeAssistant, host: str, enable_ime: bool) -> AndroidTVRem
)
def get_enable_ime(entry: ConfigEntry) -> bool:
def get_enable_ime(entry: AndroidTVRemoteConfigEntry) -> bool:
"""Get value of enable_ime option or its default value."""
return entry.options.get(CONF_ENABLE_IME, CONF_ENABLE_IME_DEFAULT_VALUE)
return entry.options.get(CONF_ENABLE_IME, CONF_ENABLE_IME_DEFAULT_VALUE) # type: ignore[no-any-return]
@@ -7,6 +7,6 @@
"integration_type": "device",
"iot_class": "local_push",
"loggers": ["androidtvremote2"],
"requirements": ["androidtvremote2==0.2.2"],
"requirements": ["androidtvremote2==0.2.3"],
"zeroconf": ["_androidtvremote2._tcp.local."]
}
@@ -5,7 +5,7 @@ from __future__ import annotations
import asyncio
from typing import Any
from androidtvremote2 import AndroidTVRemote, ConnectionClosed
from androidtvremote2 import AndroidTVRemote, ConnectionClosed, VolumeInfo
from homeassistant.components.media_player import (
BrowseMedia,
@@ -20,9 +20,9 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import AndroidTVRemoteConfigEntry
from .const import CONF_APP_ICON, CONF_APP_NAME, DOMAIN
from .entity import AndroidTVRemoteBaseEntity
from .helpers import AndroidTVRemoteConfigEntry
PARALLEL_UPDATES = 0
@@ -75,13 +75,11 @@ class AndroidTVRemoteMediaPlayerEntity(AndroidTVRemoteBaseEntity, MediaPlayerEnt
else current_app
)
def _update_volume_info(self, volume_info: dict[str, str | bool]) -> None:
def _update_volume_info(self, volume_info: VolumeInfo) -> None:
"""Update volume info."""
if volume_info.get("max"):
self._attr_volume_level = int(volume_info["level"]) / int(
volume_info["max"]
)
self._attr_is_volume_muted = bool(volume_info["muted"])
self._attr_volume_level = volume_info["level"] / volume_info["max"]
self._attr_is_volume_muted = volume_info["muted"]
else:
self._attr_volume_level = None
self._attr_is_volume_muted = None
@@ -93,7 +91,7 @@ class AndroidTVRemoteMediaPlayerEntity(AndroidTVRemoteBaseEntity, MediaPlayerEnt
self.async_write_ha_state()
@callback
def _volume_info_updated(self, volume_info: dict[str, str | bool]) -> None:
def _volume_info_updated(self, volume_info: VolumeInfo) -> None:
"""Update the state when the volume info changes."""
self._update_volume_info(volume_info)
self.async_write_ha_state()
@@ -102,8 +100,10 @@ class AndroidTVRemoteMediaPlayerEntity(AndroidTVRemoteBaseEntity, MediaPlayerEnt
"""Register callbacks."""
await super().async_added_to_hass()
self._update_current_app(self._api.current_app)
self._update_volume_info(self._api.volume_info)
if self._api.current_app is not None:
self._update_current_app(self._api.current_app)
if self._api.volume_info is not None:
self._update_volume_info(self._api.volume_info)
self._api.add_current_app_updated_callback(self._current_app_updated)
self._api.add_volume_info_updated_callback(self._volume_info_updated)
@@ -20,9 +20,9 @@ from homeassistant.components.remote import (
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import AndroidTVRemoteConfigEntry
from .const import CONF_APP_NAME
from .entity import AndroidTVRemoteBaseEntity
from .helpers import AndroidTVRemoteConfigEntry
PARALLEL_UPDATES = 0
@@ -63,7 +63,8 @@ class AndroidTVRemoteEntity(AndroidTVRemoteBaseEntity, RemoteEntity):
self._attr_activity_list = [
app.get(CONF_APP_NAME, "") for app in self._apps.values()
]
self._update_current_app(self._api.current_app)
if self._api.current_app is not None:
self._update_current_app(self._api.current_app)
self._api.add_current_app_updated_callback(self._current_app_updated)
async def async_will_remove_from_hass(self) -> None:
@@ -6,6 +6,18 @@
"description": "Enter the IP address of the Android TV you want to add to Home Assistant. It will turn on and a pairing code will be displayed on it that you will need to enter in the next screen.",
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Android TV device."
}
},
"reconfigure": {
"description": "Update the IP address of this previously configured Android TV device.",
"data": {
"host": "[%key:common::config_flow::data::host%]"
},
"data_description": {
"host": "The hostname or IP address of the Android TV device."
}
},
"zeroconf_confirm": {
@@ -16,6 +28,9 @@
"description": "Enter the pairing code displayed on the Android TV ({name}).",
"data": {
"pin": "[%key:common::config_flow::data::pin%]"
},
"data_description": {
"pin": "Pairing code displayed on the Android TV device."
}
},
"reauth_confirm": {
@@ -32,7 +47,9 @@
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]",
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]",
"reconfigure_successful": "[%key:common::config_flow::abort::reconfigure_successful%]",
"unique_id_mismatch": "Please ensure you reconfigure against the same device."
}
},
"options": {
@@ -40,7 +57,11 @@
"init": {
"data": {
"apps": "Configure applications list",
"enable_ime": "Enable IME. Needed for getting the current app. Disable for devices that show 'Use keyboard on mobile device screen' instead of the on screen keyboard."
"enable_ime": "Enable IME"
},
"data_description": {
"apps": "Here you can define the list of applications, specify names and icons that will be displayed in the UI.",
"enable_ime": "Enable this option to be able to get the current app name and send text as keyboard input. Disable it for devices that show 'Use keyboard on mobile device screen' instead of the on-screen keyboard."
}
},
"apps": {
@@ -53,8 +74,10 @@
"app_delete": "Check to delete this application"
},
"data_description": {
"app_name": "Name of the application as you would like it to be displayed in Home Assistant.",
"app_id": "E.g. com.plexapp.android for https://play.google.com/store/apps/details?id=com.plexapp.android",
"app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename"
"app_icon": "Image URL. From the Play Store app page, right click on the icon and select 'Copy image address' and then paste it here. Alternatively, download the image, upload it under /config/www/ and use the URL /local/filename",
"app_delete": "Check this box to delete the application from the list."
}
}
}
@@ -10,7 +10,7 @@
},
"error": {
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
"cannot_receive_deviceinfo": "Failed to retrieve MAC Address. Make sure the device is turned on"
"cannot_receive_deviceinfo": "Failed to retrieve MAC address. Make sure the device is turned on"
},
"abort": {
"already_configured": "[%key:common::config_flow::abort::already_configured_device%]"
+119 -13
View File
@@ -61,6 +61,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: AnthropicConfigEntry) ->
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
entry.async_on_unload(entry.add_update_listener(async_update_options))
return True
@@ -69,14 +71,25 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
async def async_update_options(
hass: HomeAssistant, entry: AnthropicConfigEntry
) -> None:
"""Update options."""
await hass.config_entries.async_reload(entry.entry_id)
async def async_migrate_integration(hass: HomeAssistant) -> None:
"""Migrate integration entry structure."""
entries = hass.config_entries.async_entries(DOMAIN)
# Make sure we get enabled config entries first
entries = sorted(
hass.config_entries.async_entries(DOMAIN),
key=lambda e: e.disabled_by is not None,
)
if not any(entry.version == 1 for entry in entries):
return
api_keys_entries: dict[str, ConfigEntry] = {}
api_keys_entries: dict[str, tuple[ConfigEntry, bool]] = {}
entity_registry = er.async_get(hass)
device_registry = dr.async_get(hass)
@@ -90,30 +103,61 @@ async def async_migrate_integration(hass: HomeAssistant) -> None:
)
if entry.data[CONF_API_KEY] not in api_keys_entries:
use_existing = True
api_keys_entries[entry.data[CONF_API_KEY]] = entry
all_disabled = all(
e.disabled_by is not None
for e in entries
if e.data[CONF_API_KEY] == entry.data[CONF_API_KEY]
)
api_keys_entries[entry.data[CONF_API_KEY]] = (entry, all_disabled)
parent_entry = api_keys_entries[entry.data[CONF_API_KEY]]
parent_entry, all_disabled = api_keys_entries[entry.data[CONF_API_KEY]]
hass.config_entries.async_add_subentry(parent_entry, subentry)
conversation_entity = entity_registry.async_get_entity_id(
conversation_entity_id = entity_registry.async_get_entity_id(
"conversation",
DOMAIN,
entry.entry_id,
)
if conversation_entity is not None:
entity_registry.async_update_entity(
conversation_entity,
config_entry_id=parent_entry.entry_id,
config_subentry_id=subentry.subentry_id,
new_unique_id=subentry.subentry_id,
)
device = device_registry.async_get_device(
identifiers={(DOMAIN, entry.entry_id)}
)
if conversation_entity_id is not None:
conversation_entity_entry = entity_registry.entities[conversation_entity_id]
entity_disabled_by = conversation_entity_entry.disabled_by
if (
entity_disabled_by is er.RegistryEntryDisabler.CONFIG_ENTRY
and not all_disabled
):
# Device and entity registries don't update the disabled_by flag
# when moving a device or entity from one config entry to another,
# so we need to do it manually.
entity_disabled_by = (
er.RegistryEntryDisabler.DEVICE
if device
else er.RegistryEntryDisabler.USER
)
entity_registry.async_update_entity(
conversation_entity_id,
config_entry_id=parent_entry.entry_id,
config_subentry_id=subentry.subentry_id,
disabled_by=entity_disabled_by,
new_unique_id=subentry.subentry_id,
)
if device is not None:
# Device and entity registries don't update the disabled_by flag when
# moving a device or entity from one config entry to another, so we
# need to do it manually.
device_disabled_by = device.disabled_by
if (
device.disabled_by is dr.DeviceEntryDisabler.CONFIG_ENTRY
and not all_disabled
):
device_disabled_by = dr.DeviceEntryDisabler.USER
device_registry.async_update_device(
device.id,
disabled_by=device_disabled_by,
new_identifiers={(DOMAIN, subentry.subentry_id)},
add_config_subentry_id=subentry.subentry_id,
add_config_entry_id=parent_entry.entry_id,
@@ -138,4 +182,66 @@ async def async_migrate_integration(hass: HomeAssistant) -> None:
title=DEFAULT_CONVERSATION_NAME,
options={},
version=2,
minor_version=3,
)
async def async_migrate_entry(hass: HomeAssistant, entry: AnthropicConfigEntry) -> bool:
"""Migrate entry."""
LOGGER.debug("Migrating from version %s:%s", entry.version, entry.minor_version)
if entry.version > 2:
# This means the user has downgraded from a future version
return False
if entry.version == 2 and entry.minor_version == 1:
# Correct broken device migration in Home Assistant Core 2025.7.0b0-2025.7.0b1
device_registry = dr.async_get(hass)
for device in dr.async_entries_for_config_entry(
device_registry, entry.entry_id
):
device_registry.async_update_device(
device.id,
remove_config_entry_id=entry.entry_id,
remove_config_subentry_id=None,
)
hass.config_entries.async_update_entry(entry, minor_version=2)
if entry.version == 2 and entry.minor_version == 2:
# Fix migration where the disabled_by flag was not set correctly.
# We can currently only correct this for enabled config entries,
# because migration does not run for disabled config entries. This
# is asserted in tests, and if that behavior is changed, we should
# correct also disabled config entries.
device_registry = dr.async_get(hass)
entity_registry = er.async_get(hass)
devices = dr.async_entries_for_config_entry(device_registry, entry.entry_id)
entity_entries = er.async_entries_for_config_entry(
entity_registry, entry.entry_id
)
if entry.disabled_by is None:
# If the config entry is not disabled, we need to set the disabled_by
# flag on devices to USER, and on entities to DEVICE, if they are set
# to CONFIG_ENTRY.
for device in devices:
if device.disabled_by is not dr.DeviceEntryDisabler.CONFIG_ENTRY:
continue
device_registry.async_update_device(
device.id,
disabled_by=dr.DeviceEntryDisabler.USER,
)
for entity in entity_entries:
if entity.disabled_by is not er.RegistryEntryDisabler.CONFIG_ENTRY:
continue
entity_registry.async_update_entity(
entity.entity_id,
disabled_by=er.RegistryEntryDisabler.DEVICE,
)
hass.config_entries.async_update_entry(entry, minor_version=3)
LOGGER.debug(
"Migration to version %s:%s successful", entry.version, entry.minor_version
)
return True

Some files were not shown because too many files have changed in this diff Show More