Commit Graph

160 Commits

Author SHA1 Message Date
Ryan Warner
295a2a7c9f Fix Live Activity compilation and display issues for Mac Catalyst (#4495)
## Summary

Follow-up fixes after #4444 merged, addressing issues found during Mac
Catalyst testing:

- **Fix `›` character in Frequent Updates footer** — `.strings` files
don't interpret `\uXXXX` escapes at runtime; replaced with the literal
`›` character
- **Fix Mac Catalyst compilation** — `ActivityKit` APIs
(`ActivityAttributes`, `Activity`, `ActivityUIDismissalPolicy`, etc.)
are marked unavailable on Mac Catalyst even though
`canImport(ActivityKit)` returns true there. Replaced all `#if
canImport(ActivityKit)` and bare `#if os(iOS)` guards around ActivityKit
code with `#if os(iOS) && !targetEnvironment(macCatalyst)`. Files
affected:
  - `HALiveActivityAttributes.swift`
  - `LiveActivityRegistry.swift`
  - `HandlerLiveActivity.swift`
  - `LiveActivitySettingsView.swift`
  - `HADynamicIslandView.swift`
  - `HALockScreenView.swift`
  - `HALiveActivityConfiguration.swift`
  - `Widgets.swift` (three `HALiveActivityConfiguration()` call sites)
- `Environment.swift`, `AppDelegate.swift`, `HAAPI.swift`,
`NotificationsCommandManager.swift`, `SettingsItem.swift` (inline
guards)

## Test plan

- [x] iOS builds and runs
- [x] macOS (Mac Catalyst) builds and launches
- [ ] Live Activities settings entry does not appear on macOS (filtered
by `isTestFlight` + `#available(iOS 17.2, *)`)
- [ ] Live Activities work as expected on iOS TestFlight build

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 00:39:37 +02:00
Ryan Warner
c3fd24aa0b Adds iOS Live Activities support (#4444)
## Summary

> For architecture decisions, data model details, iOS version strategy,
push token flow, and rate limiting — see

[technical-brief.pdf](https://github.com/user-attachments/files/26280274/technical-brief.pdf)

Adds iOS Live Activities support, letting Home Assistant automations
push real-time state to the Lock Screen — washing machine countdowns, EV
charging progress, delivery tracking, alarm states, or anything
time-sensitive that benefits from glanceable visibility without
unlocking the phone.

When an automation sends a notification with `live_update: true` in the
data payload, the companion app starts a Live Activity instead of (or in
addition to) a standard notification banner. Subsequent pushes with the
same `tag` update it in-place silently. `clear_notification` + `tag`
ends it.

Field names (`tag`, `title`, `message`, `progress`, `progress_max`,
`chronometer`, `when`, `when_relative`, `notification_icon`,
`notification_icon_color`) are intentionally shared with Android's Live
Notifications API. Both platforms use the same `live_update: true`
trigger — a single YAML block targets iOS 17.2+ and Android 16+ with no
platform-specific keys.

```yaml
data:
  title: "Washing Machine"
  message: "Cycle in progress"
  data:
    tag: washer_cycle
    live_update: true           # Android 16+ and iOS 17.2+
    progress: 2700
    progress_max: 3600
    chronometer: true
    when: 2700
    when_relative: true
    notification_icon: mdi:washing-machine
    notification_icon_color: "#2196F3"
```

**New files:**
- `Sources/Shared/LiveActivity/HALiveActivityAttributes.swift` — the
`ActivityAttributes` type. Field names match the Android payload spec.
**Struct name and `CodingKeys` are wire-format frozen** — APNs
push-to-start payloads reference the Swift type name directly.
- `Sources/Shared/LiveActivity/LiveActivityRegistry.swift` — Swift
`actor` managing `Activity<HALiveActivityAttributes>` lifecycle. Uses a
reservation pattern to prevent duplicate activities when two pushes with
the same `tag` arrive simultaneously.
-
`Sources/Shared/Notifications/NotificationCommands/HandlerLiveActivity.swift`
— start/update and end `NotificationCommandHandler` implementations,
guarded against the `PushProvider` extension process where ActivityKit
is unavailable.
- `Sources/Extensions/Widgets/LiveActivity/` — `ActivityConfiguration`
wrapper, Lock Screen / StandBy view, and compact / minimal / expanded
Dynamic Island views.
- `Sources/App/Settings/LiveActivity/LiveActivitySettingsView.swift` —
activity status, active list, privacy disclosure, and 11 debug scenarios
for pre-server-side testing.

**Modified files:**
- `Widgets.swift` — registers `HALiveActivityConfiguration` in all three
`WidgetBundle` variants behind `#available(iOSApplicationExtension 17.2,
*)`
- `NotificationsCommandManager.swift` — registers new handlers;
`HandlerClearNotification` now also ends a matching Live Activity when
`tag` is present
- `HAAPI.swift` — adds `supports_live_activities`,
`supports_live_activities_frequent_updates`,
`live_activity_push_to_start_token`,
`live_activity_push_to_start_apns_environment` to registration payload
under a single `#available(iOS 17.2, *)` check
- `AppDelegate.swift` — reattaches surviving activities at launch and
starts observing push-to-start tokens under a single `#available(iOS
17.2, *)` check
- `Info.plist` — `NSSupportsLiveActivities` +
`NSSupportsLiveActivitiesFrequentUpdates`
- `SettingsItem.swift` / `SettingsView.swift` — Live Activities settings
row is gated behind `Current.isTestFlight` and shows a `BetaLabel` badge

**Tests:** 
 - *Unit Tests*
- 45 new tests (36 handler tests, 9 command manager routing tests). All
490 existing tests continue to pass.
 - *Device Tests*
- I tried to test with my physical device, however I do not have a paid
account. Turns out I could not deploy without disabling a lot of
entitlements for compilation. Even so, once I did get it deployed and
running Live Activities wouldn't show unless some of those settings that
I disable were re-enable and leaving me in a particular spot.
   - I mainly tested with the simulator which is what is shown below

## Screenshots


![full-debug-scenarios](https://github.com/user-attachments/assets/b6f61b15-8f41-4fb5-b89d-75b5de719056)

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#1303

## Link to pull request in push relay repository

Relay server: home-assistant/mobile-apps-fcm-push#278

## Link to pull request in HA core

Core: home-assistant/core#166072

## Any other notes

**iOS version gating at 17.2.** The entire feature is gated at
`#available(iOS 17.2, *)` — this is the minimum for push-to-start (the
primary server-side start mechanism). A single availability check now
covers all Live Activity APIs: `supports_live_activities`,
`frequentPushesEnabled`, push-to-start token, and all ActivityKit usage.
This eliminates the nested 16.2/17.2 check pattern.

**Push-to-start (iOS 17.2+) is client-complete.** The token is observed,
stored in Keychain, and included in registration payloads. All companion
server-side PRs are now open — relay server at
home-assistant/mobile-apps-fcm-push#278 and HA core webhook handlers at
home-assistant/core#166072. The relay server uses FCM's native
`apns.liveActivityToken` support (Firebase Admin SDK v13.5.0+) — no
custom APNs client or credentials needed.

> **Server-side work** — all PRs now open:
> - ~~`supports_live_activities` field handling in device registration~~
✓ home-assistant/core#166072
> - ~~`mobile_app_live_activity_token` webhook handler~~ ✓
home-assistant/core#166072
> - ~~`mobile_app_live_activity_dismissed` webhook handler~~ ✓
home-assistant/core#166072
> - ~~Relay server: Live Activity delivery via FCM
`apns.liveActivityToken`~~ ✓ home-assistant/mobile-apps-fcm-push#278
> - ~~`notify.py` routing: includes Live Activity APNs token alongside
FCM token~~ ✓ home-assistant/core#166072

**Live Activities entry in Settings is gated behind TestFlight.** The
settings row only appears when `Current.isTestFlight` is true,
preventing it from surfacing in a release build before the feature is
fully tested. A `BetaLabel` badge is shown alongside the row title.

**iPad:** `areActivitiesEnabled` is always `false` on iPad — Apple
system restriction. The Settings screen shows "Not available on iPad."
The registry silently no-ops. HA receives `supports_live_activities:
false` in the device registration for iPad.

**`HALiveActivityAttributes` is frozen post-ship.** The struct name
appears as `attributes-type` in APNs push-to-start payloads. Renaming it
silently breaks all remote starts. The `ContentState` `CodingKeys` are
equally frozen — only additions are safe. Both have comments in the
source calling this out.

**The debug section in Settings is intentional.** Gated behind `#if
DEBUG` so it only appears in debug builds — it never ships to TestFlight
or the App Store. It exercises the full ActivityKit lifecycle without
requiring the server-side chain.

**`UNUserNotificationCenter` in tests.** The `clear_notification` +
`tag` → Live Activity dismissal path is covered by code review rather
than a unit test. `HandlerClearNotification` calls
`UNUserNotificationCenter.current().removeDeliveredNotifications`
synchronously, which requires a real app bundle and throws
`NSInternalInconsistencyException` in the XCTest host. A comment in the
test file explains this.

**Rate limiting on iOS 18.** Apple throttles Live Activity updates to
~15 seconds between renders. Automations should trigger on state change
events, not polling timers.

**Related:**
- Community discussion:
https://github.com/orgs/home-assistant/discussions/84
- Android companion reference: https://github.com/home-assistant/android
- Roadmap: https://github.com/home-assistant/roadmap/issues/52

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Bruno Pantaleão Gonçalves <5808343+bgoncal@users.noreply.github.com>
2026-04-07 14:50:49 +02:00
Bruno Pantaleão Gonçalves
ce1fe1b485 Extract helper for entity intent collections (#4416)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->
Introduce makeHAEntityIntentItemCollection to centralize building
IntentItemCollection<HAAppEntityAppIntentEntity> with a default icon and
areaName mapping. Replace duplicated mapping logic in multiple
ControlOpen* entity option providers (Camera, Cover, InputBoolean,
Light, Lock, Sensor, Switch) to call the new helper, reducing
duplication and adding consistent areaName support. The helper is added
to HAAppEntityAppIntentEntity.swift and used by the various
ControlOpen*ValueProvider files.

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-03-05 14:52:44 +00:00
Bruno Pantaleão Gonçalves
457bbb299e Remove "Native home view" experiment (#4406)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-03-04 10:46:03 +00:00
Bruno Pantaleão Gonçalves
f3c9c1399a Remove domains not ready for commonly used entities widget (#4388) 2026-02-24 20:49:13 +00:00
Bruno Pantaleão Gonçalves
7dcdccc60f Use domain dependent action when executing entities "main action" (#4387)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->
Prevent generic usage of "toggle" action when executing entity MagicItem
Fixes #4356

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-02-24 15:10:18 +01:00
Copilot
ab3d3c34a9 Add Common Controls widget (#4365)
## Summary

Adds a new widget called "Common Controls" that displays commonly used
entities based on usage patterns from the
`usage_prediction/common_control` endpoint.

**New Files:**
- `WidgetCommonlyUsedEntities.swift` - Widget definition using
`WidgetBasicContainerView` (same UI as WidgetCustom)
- `WidgetCommonlyUsedEntitiesTimelineProvider.swift` - Timeline provider
with state fetching and caching

**Key Changes:**
- Filters entities to supported domains: `light`, `switch`, `cover`,
`fan`, `climate`, `lock`
- Added `climate` domain to `Domain` enum with thermostat icon
- Added climate interaction in `MagicItem` (opens more info dialog)
- Registered in iOS 17/18 widget bundles
- Added `commonlyUsedEntities` to `WidgetsKind` and `DataWidgetsUpdater`
- Updated `WidgetsKindTests` to include the new widget kind

**Widget Behavior:**
- Fetches entities from the configured server (or first available) via
`usagePredictionCommonControl()`
- Entity info from app database via `MagicItemProvider`
- Entity states via `ControlEntityProvider` (same as WidgetCustom)
- 15-minute refresh policy with 1-second state cache (iOS reload bug
workaround)
- Supports systemSmall/Medium/Large families

## Screenshots

<img
src="https://github.com/user-attachments/assets/ad37542d-b3b4-4476-81b4-8be7425b5f31">

## Link to pull request in Documentation repository
Documentation: home-assistant/companion.home-assistant#

## Any other notes

<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/home-assistant/iOS/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-18 13:45:03 +01:00
Bruno Pantaleão Gonçalves
9c2a40075c Improve to-do list widget UI, row heights and alignment. (#4367)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->
<img width="1366" height="918" alt="CleanShot 2026-02-18 at 10 09 36@2x"
src="https://github.com/user-attachments/assets/993eb9af-1762-414d-96bc-8e85a1691fed"
/>

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-02-18 09:42:46 +00:00
Copilot
ca986f1e8e Fix widget todo list time display for sub-hour due dates (#4359)
## Summary

Widget todo items due within 1 hour displayed as "in 1 hour" due to
`RelativeDateTimeFormatter` rounding. Now shows minute precision ("in 15
minutes", "in 30 minutes") for better time awareness with full
localization support.

**Implementation:**
- Added `DateComponentsFormatter` for minute-level formatting
- Enhanced `dueDisplay` to detect `abs(timeInterval) < 3600`
- Checks `abs(timeInterval) < 60` directly for "Now" threshold before
calculating minutes
- Uses `ceil()` for future times and `floor()` for past times to avoid
rounding boundary issues
- Displays localized strings via `L10n.Widgets.TodoList.DueDate.now`,
`.inFormat()`, and `.agoFormat()`
- Preserves existing formatter for ≥1 hour durations

**Localization:**
- Added 3 new localization strings to all 34 locale files (English
placeholders for translation team)
- Updated `Strings.swift` with corresponding L10n accessor functions
- All time displays now properly localized via `L10n` infrastructure

**Code Quality:**
- Made `dueDisplay` internal (not private) for testability via
`@testable import`
- Restored family-based widget row spacing logic that was accidentally
removed
- Fixed accessibility issues by replacing `.hidden()` and `.overlay()`
patterns with proper conditional rendering
- Tests made locale-agnostic using helper methods that generate expected
strings with same formatter

**Testing:**
- Added `WidgetTodoListViewTests.swift` with comprehensive coverage for
all time ranges
- Tests validate behavior for items due in 15, 30, 45 minutes, 1 minute,
<1 minute, overdue items, and >1 hour items
- Tests use same `DateComponentsFormatter` and L10n functions as
implementation for locale independence

## Screenshots
N/A - Text-only change

## Link to pull request in Documentation repository
Documentation: home-assistant/companion.home-assistant#

## Any other notes
Uses `DateComponentsFormatter.allowedUnits = [.minute]` for proper
localization. English placeholder strings have been added to all 34
locale files for the translation team to localize. The implementation
ensures consistent formatting across all supported languages using the
iOS localization system.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> The widget To-Do List shows items with due dates less than 1 hour as
"in 1 hour" where it should display the time in minutes (e.g., "in x
minutes"). The issue lies in the `dueDisplay` method in the
`WidgetTodoListView` struct (file path:
`Sources/Extensions/Widgets/TodoList/WidgetTodoListView.swift`).
Specifically, this function uses the `numericRelativeFormatter` but does
not account for cases where the remaining due time is less than 1 hour.
> 
> The `numericRelativeFormatter` is currently used in the following
block:
> ```swift
> if item.hasDueTime {
> let text = Self.numericRelativeFormatter.localizedString(for: due,
relativeTo: now)
> return DueDisplay(text: capitalizeLeadingCharacter(in: text),
isPastDateOnly: false)
> }
> ```
> This produces a generic "in 1 hour" string for times under an hour. To
fix this, we need to enhance the logic to check if the remaining time is
less than 1 hour. If so, explicitly calculate and display the remaining
minutes using custom logic.
> 
> ### Proposed Fix:
> 1. Modify the `dueDisplay` method to check if the due time difference
is less than 1 hour.
> 2. If the remaining time is below one hour, calculate the difference
in minutes and format it as "in x minutes."
> 3. Otherwise, use the `numericRelativeFormatter` as before.
> 
> ### Resources for the Fix:
> - `DateComponentsFormatter` for better control over minute formatting.
> - Update the logic in the `dueDisplay` method to handle the special
case explicitly.
> 
> ### Testing
> - Add unit tests or predefined timelines with entries for due dates at
15, 30, and 45 minutes to confirm the enhanced functionality is applied
correctly.


</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

*This pull request was created from Copilot chat.*
>

<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/home-assistant/iOS/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-17 16:16:13 +01:00
Bruno Pantaleão Gonçalves
af1967b282 Add due date to todo list widget + haptics (#4357)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->
<img width="2058" height="1342" alt="CleanShot 2026-02-16 at 10 48
03@2x"
src="https://github.com/user-attachments/assets/49cf17c8-219d-46f6-aa82-eed163f5d03b"
/>

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-02-16 10:18:27 +00:00
Copilot
61e4905e96 Add haptic feedback to todo list widget buttons (#4355) 2026-02-14 18:39:47 +00:00
Copilot
76238c3a95 Update AppIntents to use system sound 1520 (Peek) (#4354) 2026-02-14 16:06:50 +00:00
Bruno Pantaleão Gonçalves
e47b6a2662 Update todo list on app background + fix copy (#4350)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-02-13 12:05:36 +01:00
Bruno Pantaleão Gonçalves
fdb0e2bc03 Todo list widget (#4347) 2026-02-12 23:40:14 +01:00
Bruno Pantaleão Gonçalves
7548c9b4ae fix: Exclude custom widgetFamily environment from widget extension ta… (#4297)
…rget

The custom EnvironmentKey extension for widgetFamily conflicts with
WidgetKit's native \.widgetFamily environment variable when compiled for
the widget extension.

This wraps the custom definition with #if !WIDGET_EXTENSION so it's only
available in the main app target (for widget preview in the widget
creator).

<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Bruno Gonçalves <bgoncal@users.noreply.github.com>
2026-02-02 11:24:21 +01:00
Bruno Pantaleão Gonçalves
fc06463235 Fix widget systemSmall preview (#4274)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-01-30 08:46:38 +00:00
Bruno Pantaleão Gonçalves
308e3cc608 Refactor widget view layout and update corner radius constants (#4268)
Refactored WidgetBasicView to improve layout handling for compact and
single-column widgets, including max height constraints and dynamic
spacing. Moved corner radius logic in TileCardStyleModifier to a
computed property for clarity. Updated DesignSystem corner radius
constants for better documentation and added missing values.

<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->
<img width="2760" height="2320" alt="CleanShot 2026-01-28 at 14 50
06@2x"
src="https://github.com/user-attachments/assets/2045b737-18f7-41a2-b1f7-bafa8093f36c"
/>

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-01-28 17:19:49 +00:00
Bruno Pantaleão Gonçalves
f57b54976f Improve custom widget state handling and URL management (#4262)
Refactored custom widget to use AppConstants.createCustomWidgetURL for
deeplink construction. Enhanced domain state handling by introducing
isActive property and ensuring state comparison is case-insensitive.
Updated icon color logic to support additional domains (cover, fan) and
improved clarity in state checks.

<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

<img width="1342" height="952" alt="CleanShot 2026-01-28 at 10 44 39@2x"
src="https://github.com/user-attachments/assets/0d92a047-2356-45b5-8208-423d0b669e4b"
/>


## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2026-01-28 10:52:03 +00:00
Bruno Pantaleão Gonçalves
ac1687bcc1 Add pending configuration strings for widget controls (#4239) 2026-01-20 18:49:55 +01:00
Bruno Pantaleão Gonçalves
f7780f6937 Removing cameras list entry from control center (#4211) 2026-01-15 10:07:41 +01:00
mat1th
a9bf90ec93 Remove usage of old api and use DesignSytem class (#4183) 2026-01-07 23:00:06 +01:00
Bruno Pantaleão Gonçalves
39be820fb9 Persist Entity and Device registry (#4157)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-01-06 04:00:08 +00:00
Copilot
8cdfb4f294 Experiment: Native HomeView/dashboard (#4142)
Basic implementation of a native dashboard - WIP

- [ ] Support more domains toggle action when tapping icon
  - [x] Light
  - [x] Cover
  - [x] Switch
- [ ] Create the equivalent of "more info dialog" for each domain
  - [x] Light
  - [x] Cover
  - [x] Switch
- [x] Add haptics
- [ ] Add more cards such as a camera card
- [ ] Find a way to display sensors information such as humidity and
temperature
- [ ] Allow customizing background
- [x] Allow opening the native dashboard from iOS controls
- [ ] Allow opening the native dashboard from Shortcuts
- [ ] Add an advanced option somewhere in settings that allow user to
see the native dashboard first instead of web UI
- [ ] Add error state
- [x] Add empty state
- [x] Add loading state
- [x] Allow reordering rooms
- [x] Allow reordering cards

<img width="1232" height="1158" alt="CleanShot 2026-01-05 at 16 19
59@2x"
src="https://github.com/user-attachments/assets/84ae8748-ec40-430c-a820-fcb6a88a6270"
/>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2026-01-05 22:38:09 +00:00
Bruno Pantaleão Gonçalves
1da8113507 Sync network info before performing intents (#4147)
Added calls to syncNetworkInformation() at the start of various
perform() methods for AppIntents and widget controls to ensure
up-to-date connectivity data before executing actions. Also refactored
ConnectivityWrapper to support async network info synchronization.

<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-29 12:50:47 +00:00
Bruno Pantaleão Gonçalves
f823d8936f Experimental Assist UI (#4139)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->
<img width="1776" height="1124" alt="CleanShot 2025-12-23 at 03 29
25@2x"
src="https://github.com/user-attachments/assets/ab1a5c9f-72a9-4dc8-ae44-1f7d574738f6"
/>

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2025-12-23 15:38:35 +00:00
Copilot
7ab7aa095d Add camera list screen with server filtering, area display, and iOS 18+ control widgets (#4118)
## Summary

Implements a camera list view accessible from iOS 18+ control widgets
and deeplinks, displaying all cameras from the database with server
filtering, area information, and search capabilities. Tapping a camera
opens the WebRTC video player in full screen on top of the list.

**New Components:**
- `CameraListView` - SwiftUI list with conditional server selector,
search, area display, and empty states
- `CameraListViewModel` - Fetches cameras via `ControlEntityProvider`,
handles filtering, and maps camera areas
- `OpenCameraListAppIntent` - iOS 18+ app intent for opening camera list
- `ControlOpenCamerasList` - iOS 18+ control widget for Control Center
(no configuration needed)

**Key Features:**
- **Server Picker**: Hidden when initialized with specific serverId,
always visible otherwise
- **Area Display**: Shows area name (if available) or entity ID for each
camera
- **Full Screen Behavior**: Camera opens on top of list modal without
dismissing it
- **Search**: Real-time filtering by camera name or entity ID
- **Localization**: All user-facing strings use the localization system
(`L10n.CameraList.*`)
- **Control Widgets**: Two iOS 18+ widgets for Control Center access

**iOS 18+ Control Widgets:**
1. **ControlOpenCamerasList** - Opens the full camera list with one tap
(static, no configuration)
2. **ControlOpenCamera** - Opens a specific camera directly (user
selects camera during setup)

**URL Routing:**
- `homeassistant://camera/` → Opens camera list
- `homeassistant://camera/?serverId={id}` → Opens filtered list (hides
server picker)
- `homeassistant://camera/?entityId={id}&serverId={id}` → Opens specific
camera (existing)

Updated `IncomingURLHandler.swift` to branch on `entityId` presence:
missing opens list, present opens player.

**Localization Keys:**
- `camera_list.title` - Navigation title
- `camera_list.search_placeholder` - Search bar placeholder
- `camera_list.empty.title` & `camera_list.empty.message` - Empty state
- `camera_list.no_results.title` & `camera_list.no_results.message` - No
search results
- `widgets.controls.open_cameras_list.description` - Control widget
description

**Tests:**
- Updated `WidgetsKindTests` to include assertion for
`controlOpenCamerasList` enum case
- Total enum case count updated from 26 to 27

## Screenshots

_Screenshots required for testing on macOS/iOS device_

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

Files added to both App and Extensions-Widgets targets for proper iOS
18+ control support. Backward compatible with existing camera deeplinks.
ViewModel fetches area information from the database and maps it to
cameras for display. All strings are properly localized and ready for
translation.

The `ControlOpenCamerasList` widget uses `StaticControlConfiguration`,
requiring no user setup, making it quick to add to Control Center for
instant access to all cameras.

Tests have been updated to reflect the new `controlOpenCamerasList`
widget kind after merging with main branch changes.

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> In the App we have the options to open WebRTCVideoPlayerView from iOS
18+ controls, implement a screen that presents a list of cameras base on
all cameras in the database.
> This screen should have a server selector as well and it should allow
initializing with a specific serverId, so the list is displayed based on
1 server only.
> When tapping list row, it opens WebRTCVideoPlayerView for that
selected camera in full screen


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/home-assistant/iOS/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-22 11:57:45 +00:00
Copilot
3f25cd80ab Add automation domain and iOS control widget (#4120)
## Summary

Adds support for Home Assistant automations in the iOS app. Automations
can now be triggered from iOS Control Center widgets (iOS 18+), similar
to existing script and scene controls.

**Domain & Model**
- Added `automation` domain with robot icon and `trigger` service
- Included automation in `AppEntitiesModel` tracked domains for database
caching
- Added to CarPlay supported domains

**Control Widget** (iOS 18+)
- `ControlAutomation` - Main control widget
- `AutomationAppIntent` - Triggers `automation.trigger` service
- `IntentAutomationEntity` - Entity queries and selection
- `ControlAutomationsValueProvider` - Configuration with custom
icons/text

**Pattern**
Follows existing `ControlScript` and `ControlScene` implementation
patterns for consistency.

**Tests**
- Updated `testWidgetsKindCasesValues` to include assertion for
`controlAutomation` case
- Updated widget kind count validation from 25 to 26

## Screenshots

N/A - Control widgets are system UI and cannot be screenshotted during
development. Widget appears in Control Center configuration with
automation icon and allows selection from available automations.

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

Localization strings added for English only. Additional languages will
need translation via the standard localization workflow.

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> 1 - Add "automation" in AppEntitiesModel domains
> 2 - Create an iOS control for running automation like it exist for
ControlScript


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/home-assistant/iOS/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-22 10:58:37 +00:00
Copilot
6916e5437b Add fan entity type to Control Center controls (#4109)
## Summary
Adds fan domain support to iOS 18 Control Center controls. Users can now
toggle fan entities directly from Control Center alongside existing
light, switch, and cover controls.

## Screenshots

N/A - Control Center widget requires device testing with configured fan
entities

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

**Implementation:**
- Added `fan` domain to `Domain` enum with on/off states and CarPlay
support
- Created `ControlFan` widget with 4 files following existing control
patterns:
  - Main widget configuration with blue tint
  - Intent handler for toggle/turn_on/turn_off services
- Entity query with async pattern (matching Switch/Cover for
future-proofing)
- Value provider for state management with SF Symbol icons
(`fan`/`fan.fill`) and optional displayText parameter
- Integrated fan domain into system components:
  - `HAAPI.swift` - Added to toggle domain case
  - `HAEntity+CarPlay.swift` - Added fan icon mapping
  - `MagicItem.swift` - Added to toggle domain case
- Registered as `controlFan` in `WidgetsKind` and `WidgetsBundle18`
- Added localization strings following established patterns ("Choose
fan" for consistency)
- Added optional `displayText` parameter to `ControlFanConfiguration`
for custom display names (matching PR #4104 pattern)

**Pattern consistency:**
Mirrors Switch/Cover implementations with async entity queries. Uses
standard on/off toggle model with state-based icons. Includes
displayText override feature for user customization.

<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>Add "fan" entity type to control center
controls</issue_title>
> <issue_description>
> ### Discussed in
https://github.com/home-assistant/iOS/discussions/3679
> 
> <div type='discussions-op-text'>
> 
> <sup>Originally posted by **haydonryan** June 29, 2025</sup>
> Currently on IOS we have most of the major types except for fans.
Could we add that too please?
> 
>
![image](https://github.com/user-attachments/assets/6bef25db-f706-45f8-92cb-5940b5f0f7c4)</div></issue_description>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> </comments>
> 


</details>



<!-- START COPILOT CODING AGENT SUFFIX -->

- Fixes home-assistant/iOS#3681

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-18 16:15:02 +00:00
Copilot
d79ef4d400 Add display text override parameter to Control Center controls (#4104)
## Add display text parameter to Control Center controls

- [x] Explore repository structure and understand Control Center
controls
- [x] Add displayText parameter to ControlButtonConfiguration (Button
control)
- [x] Update ControlButtonValueProvider to use displayText when
available
- [x] Add displayText parameter to ControlSwitchConfiguration (Switch
control)
- [x] Update ControlSwitchValueProvider to use displayText when
available
- [x] Add displayText parameter to ControlLightsConfiguration (Light
control)
- [x] Update ControlLightsValueProvider to use displayText when
available
- [x] Add displayText parameter to ControlCoverConfiguration (Cover
control)
- [x] Update ControlCoverValueProvider to use displayText when available
- [x] Add displayText parameter to ControlSceneConfiguration (Scene
control)
- [x] Update ControlScenesValueProvider to use displayText when
available
- [x] Update ControlScene to use displayText in Label
- [x] Add displayText parameter to ControlScriptsConfiguration (Script
control)
- [x] Update ControlScriptsValueProvider to use displayText when
available
- [x] Update ControlScript to use displayText in Label
- [x] Add displayText parameter to ControlOpenPageConfiguration
(OpenPage control)
- [x] Update ControlOpenPageValueProvider to use displayText when
available
- [x] Update ControlOpenPage to use displayText in Label
- [x] Add displayText parameter to ControlAssistConfiguration (Assist
control)
- [x] Update ControlAssistValueProvider to use displayText when
available
- [x] Update ControlAssist to use displayText in Label
- [x] Add displayText parameter to all OpenEntity controls (Entity,
Switch, Light, Cover, InputBoolean, Lock, Camera, Sensor)
- [x] Update all OpenEntity value providers to use displayText when
available
- [x] Update all OpenEntity controls to use displayText in Labels
- [x] Run code review - No issues found
- [x] Run security checks - No vulnerabilities detected
- [x] Fix SwiftFormat lint issues - wrapped long lines to meet 120
character limit

## Summary

Successfully added an optional `displayText` parameter to all Control
Center control configurations. This allows users to override the default
display text shown on their controls without changing the underlying
entity name.

### Implementation Details

**Controls Updated (19 total):**
1. Button
2. Switch
3. Light
4. Cover
5. Scene
6. Script
7. OpenPage
8. Assist
9. OpenEntity
10. OpenSwitch
11. OpenLight
12. OpenCoverEntity
13. OpenInputBoolean
14. OpenLock
15. OpenCamera
16. OpenSensor

**Pattern Applied:**
- Added `@Parameter` for `displayText: String?` in each Configuration
struct
- Added `displayText: String?` field to each Item struct
- Updated value providers to pass displayText through to items
- Updated control widgets to use `displayText ?? defaultText` pattern
for labels
- Parameter is optional, maintaining backward compatibility
- Fixed SwiftFormat lint issues by wrapping long lines

**Files Modified:** 28 files total
- 19 Configuration/ValueProvider files
- 19 Control widget files (some combined in same file)

All changes maintain backward compatibility - existing controls will
continue to work without modification.

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> To each Control center control that we have, add a new parameter to
control configuration where the user can override the display text


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-18 13:28:56 +00:00
Copilot
2aa5c551b8 Add domain-specific controls for iOS Control Center (#4093)
## Implementation Plan for Domain-Specific Open Entity Controls

**Phase 1 - Initial 3 controls (COMPLETED):**
- [x] Add WidgetsKind cases for camera, lock, cover
- [x] Create ControlOpenCamera, ControlOpenLock, ControlOpenCoverEntity
- [x] Add localization strings and tests

**Phase 2 - Complete all domains (COMPLETED):**
- [x] Add WidgetsKind cases for remaining domains
- [x] Create all 11 remaining controls
- [x] Add localization strings for all new controls
- [x] Register all controls in WidgetsBundle18
- [x] Update tests for all new cases
- [x] Add files to Xcode project
- [x] Fix localization keys for snake_case domains

**Phase 3 - Code optimization (COMPLETED):**
- [x] Refactor all controls to use shared OpenEntityAppIntent
- [x] Remove 14 duplicate AppIntent files
- [x] Update Xcode project references
- [x] Clean up backup files

**Phase 4 - Refinement (COMPLETED):**
- [x] Combine sensor and binary_sensor into single control
- [x] Remove script, scene, zone, and person controls
- [x] Update all references and localization

**Phase 5 - Convert button to action control (COMPLETED):**
- [x] Convert ControlOpenButton to ControlButton (stateless press
action)
- [x] Create ButtonIntent that executes button.press service
- [x] Combine button and input_button domains
- [x] Remove ControlOpenInputButton
- [x] Update all references and localization
- [x] Fix code review issues

**Phase 6 - Add beta label (COMPLETED):**
- [x] Add beta label to ControlOpenCamera using
promptsForUserConfiguration()

**Phase 7 - Fix linting (COMPLETED):**
- [x] Fix line length warning in ControlOpenInputBooleanValueProvider

## Summary

Successfully implemented 8 focused controls for iOS Control Center with
all linting issues resolved:

**Final 8 Controls:**
- **Button** - Stateless action control that presses button/input_button
entities
- **Camera** - Opens camera entities (with beta label)
- **Cover** - Opens cover entities
- **Input Boolean** - Opens input_boolean entities
- **Light** - Opens light entities
- **Lock** - Opens lock entities
- **Sensor** - Opens sensor/binary_sensor entities
- **Switch** - Opens switch entities

All code passes linting checks with proper line width constraints.

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> We have the Open entity control in the app which allows users to add a
control in ios control center that opens entities. Please implement one
control like this per entity domain, like "Open camera", "Open lock",
"Open cover", make sure that the description mentions that the app will
open the entity inside the app and not perform any action directly


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

 Let Copilot coding agent [set things up for
you](https://github.com/home-assistant/iOS/issues/new?title=+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot)
— coding agent works faster and does higher quality work when set up for
your repo.

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-16 12:07:01 +01:00
Copilot
dad7295f4f Enable search by entity ID and area name in HAAppEntityAppIntentEntity (#4075)
## Summary

Extended entity search in App Intents to match against entity ID and
area name in addition to entity display name.

**Modified:** `HAAppEntityAppIntentEntityQuery.entities(matching:)`
- Added case-insensitive matching on `entityId` 
- Added case-insensitive matching on `area` (with nil-safe handling)
- Combined with existing `displayString` match using OR logic

Users can now search entities by:
- Display name: "Living Room Light"
- Entity ID: "light.living_room" 
- Area: "Living Room"

## Screenshots

N/A - Backend search logic change only

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

None

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> When searching HAAppEntityAppIntentEntity, allow matching name, entity
id and area name


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-10 16:36:12 +00:00
Copilot
d29319d949 Display area name in HAAppEntityAppIntentEntity subtitle (#4069)
## Summary

Adds area name display to `HAAppEntityAppIntentEntity` subtitle. When an
entity belongs to an area, the area name is shown instead of the entity
ID.

**Changes:**
- Added optional `area: String?` property to
`HAAppEntityAppIntentEntity`
- Modified `displayRepresentation` to show area name when available,
falls back to entity ID
- Optimized area lookup: fetch all areas per server once, build
entity→area dictionary for O(1) lookups

**Implementation:**
```swift
var displayRepresentation: DisplayRepresentation {
    DisplayRepresentation(title: "\(displayString)", subtitle: "\(area ?? entityId)")
}
```

Area lookups are batched per server and cached in a dictionary to avoid
N+1 database queries.

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
No breaking changes. Entities without areas continue to display entity
ID as before.

<!-- START COPILOT CODING AGENT SUFFIX -->



<!-- START COPILOT ORIGINAL PROMPT -->



<details>

<summary>Original prompt</summary>

> Display area in HAAppEntityAppIntentEntity subtitle display
representation


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-10 13:16:22 +00:00
Copilot
0bb92dc9da Fix widget page identifiers causing duplicates and incorrect server names with multiple servers (#4051)
## Summary

Widget pages displayed wrong server names and showed blank names when >6
servers were configured. The issue had two root causes:

1. **Non-unique identifiers**: `IntentPanel` identifiers were set to
just `panel.path`, causing duplicate identifiers when multiple servers
shared the same panel path (e.g., "lovelace")
2. **Widget matching failure**: When widgets reloaded, the matching
logic couldn't handle backward compatibility, causing incorrect server
names to be displayed

**Changes Made:**

- Changed `IntentPanel` identifier from `panel.path` to
`"serverID-path"` format to ensure uniqueness across servers
- Added `extractedPath` computed property to `IntentPanel` for
consistent path extraction supporting both old and new identifier
formats
- Updated widget matching logic in `WidgetOpenPageProvider` to properly
match panels by server + path when reloading widgets
- Ensured backward compatibility with existing widget configurations
that use the old identifier format

**Before:**
```swift
// Server 1: identifier = "lovelace"
// Server 2: identifier = "lovelace"  // Duplicate!
// Widget matching: fails to match correct server
```

**After:**
```swift
// Server 1: identifier = "server1-lovelace"
// Server 2: identifier = "server2-lovelace"  // Unique!
// Widget matching: correctly matches by server + extracted path
```

The fix handles server IDs that contain hyphens and maintains backward
compatibility with widgets configured using the old identifier format.

## Screenshots

N/A - Fix resolves display issue shown in original bug report
screenshots

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

- Follows existing pattern in `PageAppEntity.swift` (line 69) for
consistency
- Path extraction logic is shared via `IntentPanel.extractedPath`
computed property to eliminate code duplication
- All linters passed (SwiftFormat, SwiftLint)

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>iOS widget showing wrong page and shows no pages if more
than 6 servers defined.</issue_title>
> <issue_description><!-- Please READ THIS FIRST
> If your issue relates to something not looking right on Home Assistant
within the Companion App, please check if the error is present in Safari
on iOS too. If the issue is also seen in Safari, please open an issue on
the frontend repo
(https://github.com/home-assistant/frontend/issues/new?labels=bug&template=BUG_REPORT.md)
instead -->
> 
> **iOS device model, version and app version**
> 
> Model Name: iPhone 16 Pro Max
> Software Version: 26.0.1
> App version: 2025.9.2 (2025.1423)
> 
> **Home Assistant Core Version**
> 2025.9.4
> 
> **Describe the bug**
> When adding multiple pages to the widget, the correct page description
isn't shown. When I have 5 servers (named Server 1 ... Server 5), and
have added the Overview page for each server, the widget shows, Server 1
Overview, Server 1 Overview, Server 3 Overview, Server 3 Overview, and
Server 5 Overview. Click on the second Server 1 Overview brings up
Server 1 Overview, but the widget configuration shows that its suppose
to bring up Server 2 Overview.
> 
> Additionally, if I also add Server 6 to the list of servers, all of
the page names are now blanks. It doesn't show Server 1 Overview, Server
2, Overview, etc. It would appear that having more than 5 servers
defined causes the widget to not display the names of any of the defined
pages.
> 
> 
> **To Reproduce**
> 
> Add up to 5 servers to the Companion App configuration. Then create a
HA Open Page widget and add the Overview page for the first two servers.
They will both be displayed with the first Server name.
> 
> **Expected behavior**
> 
> Adding the two server's Overview page should show Server 1 Overview
and Server 2 Overview in the widget.
> 
> **Screenshots**
> 
> <img width="660" height="1434" alt="Image"
src="https://github.com/user-attachments/assets/c421d9b4-d1d8-421b-b7b5-b50857a15973"
/>
> <img width="659" height="448" alt="Image"
src="https://github.com/user-attachments/assets/73ad6c2d-5f0c-4d8d-82c5-0006ea74855d"
/>
> <img width="660" height="442" alt="Image"
src="https://github.com/user-attachments/assets/1b891db3-c49a-469c-a82d-59c726964c01"
/>
> <img width="660" height="448" alt="Image"
src="https://github.com/user-attachments/assets/dc469e31-e588-4e24-9e01-09abca6caacc"
/>
> <img width="660" height="446" alt="Image"
src="https://github.com/user-attachments/assets/43e783a2-0f47-4ec2-a363-b6c45c3dab84"
/>
> <img width="660" height="453" alt="Image"
src="https://github.com/user-attachments/assets/92337fd4-1feb-4b3b-9ee9-1c0049cb3bb2"
/>
> <img width="660" height="449" alt="Image"
src="https://github.com/user-attachments/assets/a9d0548c-0e9d-496e-8616-84a6ffdc9fdc"
/>
> 
> **Additional context**
> This problem has been ongoing for a month or so.  
> </issue_description>
> 
> <agent_instructions>Check WidgetOpenPage, there must be some ID that
is not unique or such a thing.</agent_instructions>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> </comments>
> 


</details>

- Fixes home-assistant/iOS#3876

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-05 16:12:28 +01:00
Copilot
3f30b4a4a8 Add "notify when run" toggle to WidgetGauge (#4047)
## Summary

PR #4037 added the "notify when run" toggle to WidgetDetails but missed
WidgetGauge, which also supports script execution. This PR applies the
same pattern to WidgetGauge for feature parity.

Added `showConfirmationNotification` parameter to WidgetGauge:
- Uses existing localization strings
(`app_intents.notify_when_run.title/description`)
- Flows through `WidgetGaugeEntry` to `ScriptAppIntent` when tapped
- Visible only when "Run Script" is enabled
- Defaults to `true` for backward compatibility

**Files changed:**
- `WidgetGaugeAppIntent.swift`: Added parameter and updated all 3 gauge
type parameter summaries
- `WidgetGaugeAppIntentTimelineProvider.swift`: Added field to
`WidgetGaugeEntry` and passed through placeholder/entry creation
- `WidgetGauge.swift`: Set parameter on `ScriptAppIntent` intent
creation

All widgets with script execution (Scripts, Details, Gauge) now have
consistent notification behavior.

## Screenshots

N/A - Configuration-only change, no visual UI modifications

## Link to pull request in Documentation repository

Documentation: home-assistant/companion.home-assistant#

## Any other notes

Mirrors the exact implementation from PR #4037 for consistency.

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> In this pr https://github.com/home-assistant/iOS/pull/4037 you missed
WidgetGauge


</details>



<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-05 10:06:16 +01:00
Copilot
df44bad806 Add "notify when run" toggle to Details widget (#4037)
## Summary

The Details widget was missing the "notify when run" toggle available in
the Scripts widget, causing unwanted notifications when scripts were
executed from the widget.

Added `showConfirmationNotification` parameter to
`WidgetDetailsAppIntent` following the same pattern as
`WidgetScriptsAppIntent`:

- Added parameter with existing localization strings
(`app_intents.notify_when_run.title/description`)
- Flows through `WidgetDetailsEntry` to `ScriptAppIntent` when widget
button is tapped
- Only visible in configuration when "Run Script" is enabled
- Defaults to `true` for backward compatibility

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

<!-- START COPILOT CODING AGENT SUFFIX -->



<details>

<summary>Original prompt</summary>

> 
> ----
> 
> *This section details on the original issue you should resolve*
> 
> <issue_title>Missing "notify when run" toggle for Details
widget</issue_title>
> <issue_description>**iOS device model, version and app version**
> 
> Model Name: iPhone 16 Pro
> Software Version: iOS 26.1
> App version: 2025.11.2 (2025.1537)
> 
> **Home Assistant Core Version**
> 2025.11.3
> 
> A "notify when run" toggle is missing from the "Details" widget
resulting in unwanted notifications when the script is run.
> This toggle exists in the "Scripts" widget.
> </issue_description>
> 
> ## Comments on the Issue (you are @copilot in this section)
> 
> <comments>
> </comments>
> 


</details>

- Fixes home-assistant/iOS#4018

<!-- START COPILOT CODING AGENT TIPS -->
---

💬 We'd love your input! Share your thoughts on Copilot coding agent in
our [2 minute survey](https://gh.io/copilot-coding-agent-survey).

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: bgoncal <5808343+bgoncal@users.noreply.github.com>
2025-12-03 10:46:28 +01:00
Bruno Pantaleão Gonçalves
e8dac180e4 Migrate details and gauge widgets to run script instead of legacy iOS Actions (#4008)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 16:06:53 +01:00
Bruno Pantaleão Gonçalves
8c46161ff0 Replace usage of UIApplication.shared by URLOpener class (#3961)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 15:41:49 +01:00
Bruno Pantaleão Gonçalves
8cbf89cc3d Fix cover control label (#3806)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-09-10 14:23:29 +00:00
Bruno Pantaleão Gonçalves
23edc7ce0a Fix scripts execution (#3731) 2025-07-16 11:28:10 +02:00
Bruno Pantaleão Gonçalves
b908fff567 Reset frontend cache when server version changes + refactor webView access (#3718)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->
This PR adds functionality of resetting web cache when server version
changes and also refactor WebView direct access around the project,
becoming now private to WebViewController and only interactable through
the controller's protocol.

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-07-14 15:13:03 +02:00
Bruno Pantaleão Gonçalves
615da4c976 Add experimental native WebRTC Player (#3703) 2025-07-07 23:30:02 +02:00
Bruno Pantaleão Gonçalves
c020510160 Add brand colors (#3692)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-07-03 11:57:20 +00:00
Bruno Pantaleão Gonçalves
cac8f15627 Add debug notifications option (#3674)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->
This PR adds option in the debug section to receive debug notifications,
this is a debugging tool only and it is not visible to the user unless
it open the debugging tool hidden panel.

First use case: Receive notification when location fails to update ein
brackground.

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-06-25 17:05:43 +02:00
Bruno Pantaleão Gonçalves
54d9519e7b Make "Custom widgets" and "Run Scripts (widget scpecific)" App Intents not discoverable in shortcuts App (#3669)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-06-24 13:14:00 +02:00
Bruno Pantaleão Gonçalves
f7b609f633 Allow widgets to open "more-info" dialog from selected entity (#3632)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-06-11 16:10:50 +02:00
Bruno Pantaleão Gonçalves
11d67f320f Add AppIntent to open entity more-info dialog (#3630)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-06-11 15:26:17 +02:00
Bruno Pantaleão Gonçalves
972201a3da Use Swift generated assets for colors instead of using SwiftGen (#3587) 2025-05-08 21:19:04 +02:00
Bruno Pantaleão Gonçalves
0c97751d3e Avoid reload lovelace when opened from OpenPageIntent (#3542) 2025-04-14 19:36:12 +02:00
Bruno Pantaleão Gonçalves
16f5a1bc75 Simplify and migrate onboarding screens to SwiftUI (#3527)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->



https://github.com/user-attachments/assets/e79c6e4d-13ff-405a-9463-02e597ce4996
2025-04-08 23:54:34 +02:00
Bruno Pantaleão Gonçalves
f4f111c717 Improve copy for control intents (#3519)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2025-04-01 09:07:56 +00:00