

Select area
When you voice assistant knows where it is, it can better control the diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-change-wake-word.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-change-wake-word.ts index 1ea24948f1..8f51521c9b 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-change-wake-word.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-change-wake-word.ts @@ -21,7 +21,7 @@ export class HaVoiceAssistantSetupStepChangeWakeWord extends LitElement { protected override render() { return html`


Change wake word
Some wake words are better for diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-check.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-check.ts index a12a243c2e..415d6e4d13 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-check.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-check.ts @@ -6,6 +6,7 @@ import "../../components/ha-circular-progress"; import { testAssistSatelliteConnection } from "../../data/assist_satellite"; import type { HomeAssistant } from "../../types"; import { AssistantSetupStyles } from "./styles"; +import { documentationUrl } from "../../util/documentation-url"; @customElement("ha-voice-assistant-setup-step-check") export class HaVoiceAssistantSetupStepCheck extends LitElement { @@ -35,7 +36,7 @@ export class HaVoiceAssistantSetupStepCheck extends LitElement { protected override render() { return html`


The voice assistant is unable to connect to Home Assistant
To play audio, the voice assistant device has to connect to Home @@ -44,12 +45,15 @@ export class HaVoiceAssistantSetupStepCheck extends LitElement {
` - : html`

Hi
Over the next couple steps we're going to personalize your voice diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts index f4b171bda7..939d76be5e 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-success.ts @@ -67,7 +67,7 @@ export class HaVoiceAssistantSetupStepSuccess extends LitElement { : undefined; return html`


Ready to Assist!
Make any final customizations here. You can always change these in the diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-update.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-update.ts index 9171ff15f0..e81afa480b 100644 --- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-update.ts +++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-update.ts @@ -65,7 +65,7 @@ export class HaVoiceAssistantSetupStepUpdate extends LitElement { const progressIsNumeric = stateObj && updateUsesProgress(stateObj); return html`


${stateObj &&
(stateObj.state === "unavailable" || updateIsInstalling(stateObj))
diff --git a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-wake-word.ts b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-wake-word.ts
index 2515f7ba9c..442ca54192 100644
--- a/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-wake-word.ts
+++ b/src/dialogs/voice-assistant-setup/voice-assistant-setup-step-wake-word.ts
@@ -64,14 +64,14 @@ export class HaVoiceAssistantSetupStepWakeWord extends LitElement {
return html`
${!this._detected
? html`
-
+
Say “${this._activeWakeWord(this.assistConfiguration)}” to wake the
device up
Setup will continue once the device is awake.
`
- : html`
+ : html`
Say “${this._activeWakeWord(this.assistConfiguration)}” again
diff --git a/src/onboarding/onboarding-create-user.ts b/src/onboarding/onboarding-create-user.ts
index 2d843b3b26..5f9d333e94 100644
--- a/src/onboarding/onboarding-create-user.ts
+++ b/src/onboarding/onboarding-create-user.ts
@@ -16,6 +16,8 @@ import type { ValueChangedEvent } from "../types";
import { onBoardingStyles } from "./styles";
import { debounce } from "../common/util/debounce";
+const CHECK_USERNAME_REGEX = /\s|[A-Z]/;
+
const CREATE_USER_SCHEMA: HaFormSchema[] = [
{
name: "name",
@@ -121,6 +123,7 @@ class OnboardingCreateUser extends LitElement {
ev: ValueChangedEvent
): void {
const nameChanged = ev.detail.value.name !== this._newUser.name;
+ const usernameChanged = ev.detail.value.username !== this._newUser.username;
const passwordChanged =
ev.detail.value.password !== this._newUser.password ||
ev.detail.value.password_confirm !== this._newUser.password_confirm;
@@ -135,6 +138,9 @@ class OnboardingCreateUser extends LitElement {
this._debouncedCheckPasswordMatch();
}
}
+ if (usernameChanged) {
+ this._checkUsername();
+ }
}
private _debouncedCheckPasswordMatch = debounce(
@@ -164,6 +170,21 @@ class OnboardingCreateUser extends LitElement {
const parts = String(this._newUser.name).split(" ");
if (parts.length) {
this._newUser.username = parts[0].toLowerCase();
+ this._checkUsername();
+ }
+ }
+
+ private _checkUsername(): void {
+ const old = this._formError.username;
+ if (CHECK_USERNAME_REGEX.test(this._newUser.username as string)) {
+ this._formError.username = this.localize(
+ "ui.panel.page-onboarding.user.error.username_not_normalized"
+ );
+ } else {
+ this._formError.username = "";
+ }
+ if (old !== this._formError.username) {
+ this.requestUpdate("_formError");
}
}
diff --git a/src/panels/config/automation/action/types/ha-automation-action-delay.ts b/src/panels/config/automation/action/types/ha-automation-action-delay.ts
index 996824c7c5..3efb1c618a 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-delay.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-delay.ts
@@ -49,6 +49,7 @@ export class HaDelayAction extends LitElement implements ActionElement {
.disabled=${this.disabled}
.data=${this._timeData}
enableMillisecond
+ required
@value-changed=${this._valueChanged}
>`;
}
diff --git a/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts b/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
index 3c27aa6dfb..7d6e74fd79 100644
--- a/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
+++ b/src/panels/config/automation/action/types/ha-automation-action-wait_for_trigger.ts
@@ -67,9 +67,6 @@ export class HaWaitForTriggerAction
private _timeoutChanged(ev: CustomEvent<{ value: TimeChangedEvent }>): void {
ev.stopPropagation();
const value = ev.detail.value;
- if (!value) {
- return;
- }
fireEvent(this, "value-changed", {
value: { ...this.action, timeout: value },
});
diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts
index 4c32f3aa3d..37c9f8b77b 100644
--- a/src/panels/config/automation/ha-automation-editor.ts
+++ b/src/panels/config/automation/ha-automation-editor.ts
@@ -712,8 +712,12 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) {
private async _duplicate() {
const result = this._readOnly
? await showConfirmationDialog(this, {
- title: "Migrate automation?",
- text: "You can migrate this automation, so it can be edited from the UI. After it is migrated and you have saved it, you will have to manually delete your old automation from your configuration. Do you want to migrate this automation?",
+ title: this.hass.localize(
+ "ui.panel.config.automation.picker.migrate_automation"
+ ),
+ text: this.hass.localize(
+ "ui.panel.config.automation.picker.migrate_automation_description"
+ ),
})
: await this.confirmUnsavedChanged();
if (result) {
diff --git a/src/panels/config/automation/trigger/types/ha-automation-trigger-calendar.ts b/src/panels/config/automation/trigger/types/ha-automation-trigger-calendar.ts
index 4ece6655ae..c2e11c7890 100644
--- a/src/panels/config/automation/trigger/types/ha-automation-trigger-calendar.ts
+++ b/src/panels/config/automation/trigger/types/ha-automation-trigger-calendar.ts
@@ -46,7 +46,7 @@ export class HaCalendarTrigger extends LitElement implements TriggerElement {
],
],
},
- { name: "offset", selector: { duration: {} } },
+ { name: "offset", required: true, selector: { duration: {} } },
{
name: "offset_type",
type: "select",
diff --git a/src/panels/config/integrations/dialog-add-integration.ts b/src/panels/config/integrations/dialog-add-integration.ts
index 3c0d4f156c..5447065e0c 100644
--- a/src/panels/config/integrations/dialog-add-integration.ts
+++ b/src/panels/config/integrations/dialog-add-integration.ts
@@ -584,6 +584,10 @@ class AddIntegrationDialog extends LitElement {
});
if (configEntries.length > 0) {
this.closeDialog();
+ const localize = await this.hass.loadBackendTranslation(
+ "title",
+ integration.name
+ );
showAlertDialog(this, {
title: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry_title"
@@ -591,7 +595,7 @@ class AddIntegrationDialog extends LitElement {
text: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry",
{
- integration_name: integration.name,
+ integration_name: domainToName(localize, integration.name),
}
),
});
diff --git a/src/panels/config/integrations/ha-config-integration-page.ts b/src/panels/config/integrations/ha-config-integration-page.ts
index 7031bc991d..876c3e59d8 100644
--- a/src/panels/config/integrations/ha-config-integration-page.ts
+++ b/src/panels/config/integrations/ha-config-integration-page.ts
@@ -1387,6 +1387,10 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) {
this._extraConfigEntries || this.configEntries
);
if (entries.length > 0) {
+ const localize = await this.hass.loadBackendTranslation(
+ "title",
+ this._manifest.name
+ );
await showAlertDialog(this, {
title: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry_title"
@@ -1394,7 +1398,7 @@ class HaConfigIntegrationPage extends SubscribeMixin(LitElement) {
text: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry",
{
- integration_name: this._manifest.name,
+ integration_name: domainToName(localize, this._manifest.name),
}
),
});
diff --git a/src/panels/config/integrations/ha-config-integrations-dashboard.ts b/src/panels/config/integrations/ha-config-integrations-dashboard.ts
index af99da864d..064bdfcbe2 100644
--- a/src/panels/config/integrations/ha-config-integrations-dashboard.ts
+++ b/src/panels/config/integrations/ha-config-integrations-dashboard.ts
@@ -744,6 +744,10 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) {
if (integration.single_config_entry) {
const configEntries = await getConfigEntries(this.hass, { domain });
if (configEntries.length > 0) {
+ const localize = await this.hass.loadBackendTranslation(
+ "title",
+ integration.name
+ );
showAlertDialog(this, {
title: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry_title"
@@ -751,7 +755,7 @@ class HaConfigIntegrationsDashboard extends SubscribeMixin(LitElement) {
text: this.hass.localize(
"ui.panel.config.integrations.config_flow.single_config_entry",
{
- integration_name: integration.name,
+ integration_name: domainToName(localize, integration.name!),
}
),
});
diff --git a/src/panels/config/integrations/integration-panels/matter/matter-add-device/matter-add-device-google-home.ts b/src/panels/config/integrations/integration-panels/matter/matter-add-device/matter-add-device-google-home.ts
index 3f1834ea1c..85193fd24a 100644
--- a/src/panels/config/integrations/integration-panels/matter/matter-add-device/matter-add-device-google-home.ts
+++ b/src/panels/config/integrations/integration-panels/matter/matter-add-device/matter-add-device-google-home.ts
@@ -44,7 +44,6 @@ class MatterAddDeviceGoogleHome extends LitElement {
home_assistant: html`Home Assistant`,
}
)}
-
+
+ ${this.hass.localize(
+ `ui.dialogs.matter-add-device.google_home.redirect`
+ )}
+
-
- ${this.hass.localize(
- `ui.dialogs.matter-add-device.google_home.redirect`
- )}
-


Say “${this._activeWakeWord(this.assistConfiguration)}” to wake the device up
Setup will continue once the device is awake.
+
-
- ${this.hass.localize( - `ui.dialogs.matter-add-device.google_home.redirect` - )} -
+