Compare commits

..
17 changed files with 101 additions and 80 deletions

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{
"background_color": "#FFFFFF",
"description": "Show Home Assistant on your Chromecast or Google Home devices with a screen.",
"description": "Show Home Assistant on your Chromecast or Google Assistant devices with a screen.",
"dir": "ltr",
"display": "standalone",
"icons": [
+2 -2
View File
@@ -5,7 +5,7 @@
<meta property="og:type" content="website" />
<meta
property="og:description"
content="Show Home Assistant on your Chromecast or Google Home devices with a screen."
content="Show Home Assistant on your Chromecast or Google Assistant devices with a screen."
/>
<meta
property="og:image"
@@ -16,7 +16,7 @@
<meta name="twitter:title" content="Home Assistant Cast" />
<meta
name="twitter:description"
content="Show Home Assistant on your Chromecast or Google Home devices with a screen."
content="Show Home Assistant on your Chromecast or Google Assistant devices with a screen."
/>
<meta
name="twitter:image"
+1 -1
View File
@@ -52,7 +52,7 @@
<p>
Home Assistant Cast allows you to show your Home Assistant data on a
Chromecast device and allows you to interact with Home Assistant on
Google Home devices with a screen.
Google Assistant devices with a screen.
</p>
</div>
+1 -1
View File
@@ -48,7 +48,7 @@ const translateErr = (err) =>
const INTRO = html`
<p>
Home Assistant Cast allows you to cast your Home Assistant installation to
Chromecast video devices and to Google Home devices with a screen.
Chromecast video devices and to Google Assistant devices with a screen.
</p>
<p>
For more information, see the
+1 -1
View File
@@ -6,7 +6,7 @@ const playerManager = castContext.getPlayerManager();
playerManager.setMessageInterceptor("LOAD", (loadRequestData) => {
const media = loadRequestData.media;
// Special handling if it came from Google Home
// Special handling if it came from Google Assistant
if (media.entity) {
media.contentId = media.entity;
media.streamType = "LIVE";
+1 -1
View File
@@ -13,7 +13,7 @@ export const castDemoLovelace: () => LovelaceConfig = () => {
{
type: "markdown",
title: "Home Assistant Cast",
content: `With Home Assistant you can easily create interfaces (just like this one) which can be shown on Chromecast devices connected to TVs or Google Home devices with a screen.${
content: `With Home Assistant you can easily create interfaces (just like this one) which can be shown on Chromecast devices connected to TVs or Google Assistant devices with a screen.${
touchSupported
? "\n\nYou are able to interact with this demo using the touch screen."
: "\n\nOn a Google Nest Hub you are able to interact with Home Assistant Cast via the touch screen."
+1 -1
View File
@@ -117,7 +117,7 @@ playerManager.setMessageInterceptor("LOAD", (loadRequestData) => {
// We received a play media command, hide Lovelace and show media player
showMediaPlayer();
const media = loadRequestData.media;
// Special handling if it came from Google Home
// Special handling if it came from Google Assistant
if (media.entity) {
media.contentId = media.entity;
media.streamType = "LIVE";
+2 -2
View File
@@ -4,7 +4,7 @@ title: "Our story"
## Open source home automation that puts local control and privacy first
Home Assistant is a free and open-source software for home automation that is designed to be the central control system for smart home devices with a focus on local control and privacy. It can be accessed via a web-based user interface, via apps for Android and iOS, or using voice commands via a supported virtual assistant like Google Home and Amazon Alexa.
Home Assistant is a free and open-source software for home automation that is designed to be the central control system for smart home devices with a focus on local control and privacy. It can be accessed via a web-based user interface, via apps for Android and iOS, or using voice commands via a supported virtual assistant like Google Assistant and Amazon Alexa.
IoT devices and services are supported by modular support for controlling proprietary ecosystems if they provide public access via an Open API for third-party integrations and protocols like Bluetooth, MQTT, Zigbee, and Z-Wave, After the Home Assistant software application is installed as a computer appliance it will act as a central control system for home automation. Information from all entities it sees can be used and controlled from within scripts trigger automations using scheduling and "blueprint" subroutines, e.g. for controlling lighting, climate, entertainment systems, and appliances.
@@ -36,6 +36,6 @@ Durability for the Open Home means that devices are designed and built to keep w
The project was started as a Python application by Paulus Schoutsen in September 2013 and first published publicly on GitHub in November 2013. In July 2017, a managed operating system called Hass.io was initially introduced to make it easier use to use Home Assistant on single-board computers like the Raspberry Pi series. Its bundled "supervisor" management system allowed users to manage, backup, and update the local installation and introduced the option to extend the functionality of the software with add-ons.
An optional subscription service was introduced in December 2017 for $5/month to solve the complexities associated with secured remote access, as well as linking to Amazon Alexa and Google Home. Nabu Casa, Inc. was formed in September 2018 to take over the subscription service. The company's funding is based solely on revenue from the subscription service. It is used to finance the project's infrastructure and to pay for full-time employees contributing to the project.
An optional subscription service was introduced in December 2017 for $5/month to solve the complexities associated with secured remote access, as well as linking to Amazon Alexa and Google Assistant. Nabu Casa, Inc. was formed in September 2018 to take over the subscription service. The company's funding is based solely on revenue from the subscription service. It is used to finance the project's infrastructure and to pay for full-time employees contributing to the project.
In January 2020, branding was adjusted to make it easier to refer to different parts of the project. The main piece of software was renamed to Home Assistant Core, while the full suite of software with the embedded operating system and bundled "supervisor" management system was renamed to Home Assistant.
+1 -1
View File
@@ -121,7 +121,7 @@ const brandEntries: ConfigEntryExtended[] = (
["tuya", "Tuya", "setup_error"],
["unifi", "UniFi Network", "not_loaded"],
["met", "Meteorologisk institutt (Met.no)", "setup_error"],
["google_assistant", "Google Home", "not_loaded"],
["google_assistant", "Google Assistant", "not_loaded"],
["homekit_controller", "HomeKit Device", "setup_retry"],
] as [string, string, ConfigEntryExtended["state"]][]
).map(([domain, name, entryState]) =>
+2 -2
View File
@@ -170,7 +170,7 @@
"@types/sortablejs": "1.15.9",
"@types/tar": "7.0.87",
"@typescript/native": "npm:[email protected]",
"@vitest/coverage-v8": "5.1.0",
"@vitest/coverage-v8": "5.0.5",
"babel-loader": "10.1.1",
"babel-plugin-polyfill-corejs3": "1.0.0",
"browserslist": "4.29.5",
@@ -217,7 +217,7 @@
"typescript-eslint": "8.72.1",
"vite": "8.3.5",
"vite-tsconfig-paths": "6.1.1",
"vitest": "5.1.0",
"vitest": "5.0.5",
"webpack-stats-plugin": "1.1.3",
"webpackbar": "7.0.0",
"workbox-build": "7.4.1"
+36 -36
View File
@@ -566,8 +566,8 @@ importers:
specifier: npm:[email protected]
version: [email protected]
'@vitest/coverage-v8':
specifier: 5.1.0
version: 5.1.0(vitest@5.1.0)
specifier: 5.0.5
version: 5.0.5(vitest@5.0.5)
babel-loader:
specifier: 10.1.1
version: 10.1.1(@babel/[email protected])(@rspack/[email protected](@swc/[email protected]))
@@ -707,8 +707,8 @@ importers:
specifier: 6.1.1
version: 6.1.1([email protected])([email protected])([email protected](@types/[email protected])([email protected])([email protected]))
vitest:
specifier: 5.1.0
version: 5.1.0(@types/[email protected])(@vitest/coverage-v8@5.1.0)([email protected])([email protected](@types/[email protected])([email protected])([email protected]))
specifier: 5.0.5
version: 5.0.5(@types/[email protected])(@vitest/coverage-v8@5.0.5)([email protected])([email protected](@types/[email protected])([email protected])([email protected]))
webpack-stats-plugin:
specifier: 1.1.3
version: 1.1.3
@@ -3716,25 +3716,25 @@ packages:
'@vibrant/[email protected]':
resolution: {integrity: sha512-Q/R6PYhSMWCXEk/IcXbWIzIu7Z4b58ABkGvcdF8Y+q/7g+KnpxKW5x/jfQ/6ciyYSby13wZZoEdNr3QQVgsdBQ==}
'@vitest/coverage-v8@5.1.0':
resolution: {integrity: sha512-OY9aShBQG5KOIw2zCo9fDoCHI9RHliNHJ//nM7m6jGg41Hyke9JOGWmeMlK74xYErsxMoK8mIB3gAeEyFVA7LA==}
'@vitest/coverage-v8@5.0.5':
resolution: {integrity: sha512-4KpkGdIrSqBihx/JyP/e+S+IKB98etg1XDQiLAxksLfcShnwi1VReGeOT9NI43hLHbknosKp/1CCLn9Zgcs8mg==}
peerDependencies:
'@vitest/browser': 5.1.0
vitest: 5.1.0
'@vitest/browser': 5.0.5
vitest: 5.0.5
peerDependenciesMeta:
'@vitest/browser':
optional: true
'@vitest/istanbul-lib-coverage@2.1.0':
resolution: {integrity: sha512-WOjuS+xcjSIy7ruYBQ+9BUcV7XZQ0FyVcbWbWxW9TRx/kLGx5SQaeFRIFDJxjNplb6YsT7SpKo2zuXXUo91OIQ==}
'@vitest/[email protected].2':
resolution: {integrity: sha512-9J/JMwOf9AoJhAywhrn7ScKTL38hsWQP/qPG60OtaAFcQ5OXPwKsxZFlbnuCKmZ61m8/lGgHYnFpdyQZUvG/iA==}
engines: {node: '>=22'}
'@vitest/istanbul-lib-report@2.1.0':
resolution: {integrity: sha512-+ZFta25nWtGCOBG9/IET8w1RO5Oawsd6H8Uf6AJ9EA/StFuKVtKAEJEJ6uRt84OH+T4YkI0ASmIHAhRA+0KVxw==}
'@vitest/[email protected].2':
resolution: {integrity: sha512-gUsfXZJbzPamoIY5TvHFiMMoXESBrUMo+xqaj+rYrWI69+EnvRlYBlP96ZnHPY4vX8kyUpgAnFUCg5wZG/HkDQ==}
engines: {node: '>=22'}
'@vitest/mocker@5.1.0':
resolution: {integrity: sha512-5umB9/jlWcqVS6fsrFmv5Gdnpu6wAUio/lEOwAmvB7v+lFo/IW2B9FhAD0p19GCULTgMzLCdUmuCDCnAzWgppQ==}
'@vitest/mocker@5.0.5':
resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==}
peerDependencies:
msw: ^2.4.9 || ^3.0.0
vite: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -3744,8 +3744,8 @@ packages:
vite:
optional: true
'@vitest/spy@5.1.0':
resolution: {integrity: sha512-2DPO5OMHWKrBngC+fCmTQqemNF0gidRhp3lxbBmRhW+M1XJrfgPpqNqWVevXtn2f2ufD5ZaR1B6B641aAlcX5A==}
'@vitest/spy@5.0.5':
resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==}
'@vscode/[email protected]':
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
@@ -7517,20 +7517,20 @@ packages:
yaml:
optional: true
vitest@5.1.0:
resolution: {integrity: sha512-MzmNFnrwa8v8lF1bLxw3UJ4EREwVOVb75VqJZmUDRjJ6EluK/x9th7qTbaeDk41WxE1GxWqmTXcdsfobfH5sOA==}
vitest@5.0.5:
resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==}
engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0}
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@opentelemetry/api': ^1.9.0
'@types/node': ^22.0.0 || >=24.0.0
'@vitest/browser-playwright': 5.1.0
'@vitest/browser-preview': 5.1.0
'@vitest/browser-playwright': 5.0.5
'@vitest/browser-preview': 5.0.5
'@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0
'@vitest/coverage-istanbul': 5.1.0
'@vitest/coverage-v8': 5.1.0
'@vitest/ui': 5.1.0
'@vitest/coverage-istanbul': 5.0.5
'@vitest/coverage-v8': 5.0.5
'@vitest/ui': 5.0.5
happy-dom: '*'
jsdom: '*'
vite: ^6.4.0 || ^7.0.0 || ^8.0.0
@@ -11357,34 +11357,34 @@ snapshots:
dependencies:
'@vibrant/types': 4.0.4
'@vitest/coverage-v8@5.1.0(vitest@5.1.0)':
'@vitest/coverage-v8@5.0.5(vitest@5.0.5)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/istanbul-lib-coverage': 2.1.0
'@vitest/istanbul-lib-report': 2.1.0
'@vitest/istanbul-lib-coverage': 1.0.2
'@vitest/istanbul-lib-report': 1.0.2
ast-v8-to-istanbul: 1.0.7
magicast: 0.5.5
obug: 3.0.0
std-env: 4.3.0
tinyrainbow: 3.2.0
vitest: 5.1.0(@types/[email protected])(@vitest/coverage-v8@5.1.0)([email protected])([email protected](@types/[email protected])([email protected])([email protected]))
vitest: 5.0.5(@types/[email protected])(@vitest/coverage-v8@5.0.5)([email protected])([email protected](@types/[email protected])([email protected])([email protected]))
'@vitest/istanbul-lib-coverage@2.1.0': {}
'@vitest/[email protected].2': {}
'@vitest/istanbul-lib-report@2.1.0':
'@vitest/[email protected].2':
dependencies:
'@vitest/istanbul-lib-coverage': 2.1.0
'@vitest/istanbul-lib-coverage': 1.0.2
'@vitest/mocker@5.1.0([email protected](@types/[email protected])([email protected])([email protected]))':
'@vitest/mocker@5.0.5([email protected](@types/[email protected])([email protected])([email protected]))':
dependencies:
'@jridgewell/trace-mapping': 0.3.31
'@vitest/spy': 5.1.0
'@vitest/spy': 5.0.5
estree-walker: 3.0.3
magic-string: 1.4.3
optionalDependencies:
vite: 8.3.5(@types/[email protected])([email protected])([email protected])
'@vitest/spy@5.1.0': {}
'@vitest/spy@5.0.5': {}
'@vscode/[email protected]': {}
@@ -15476,10 +15476,10 @@ snapshots:
terser: 5.50.0
yaml: 2.9.1
vitest@5.1.0(@types/[email protected])(@vitest/coverage-v8@5.1.0)([email protected])([email protected](@types/[email protected])([email protected])([email protected])):
vitest@5.0.5(@types/[email protected])(@vitest/coverage-v8@5.0.5)([email protected])([email protected](@types/[email protected])([email protected])([email protected])):
dependencies:
'@types/chai': 5.2.3
'@vitest/mocker': 5.1.0([email protected](@types/[email protected])([email protected])([email protected]))
'@vitest/mocker': 5.0.5([email protected](@types/[email protected])([email protected])([email protected]))
chai: 6.3.0
es-module-lexer: 2.3.2
expect-type: 1.4.0
@@ -15494,7 +15494,7 @@ snapshots:
why-is-node-running: 3.2.1
optionalDependencies:
'@types/node': 24.19.2
'@vitest/coverage-v8': 5.1.0(vitest@5.1.0)
'@vitest/coverage-v8': 5.0.5(vitest@5.0.5)
jsdom: 30.1.3
transitivePeerDependencies:
- msw
+24 -11
View File
@@ -1,3 +1,4 @@
import { ensureArray } from "../../common/array/ensure-array";
import type {
HaFormCondition,
HaFormDataContainer,
@@ -87,26 +88,38 @@ export const combineVisible = (
return conditions;
};
const getConditionFields = (visible: HaFormVisible | undefined): string[] =>
visible === undefined || typeof visible === "boolean"
? []
: ensureArray(visible).flatMap((condition) =>
"condition" in condition
? condition.conditions.flatMap((sub) => getConditionFields(sub))
: [condition.field]
);
// Hiding a field drops its value, which can flip another field's condition, so
// resolve the set to a fixpoint. Fields are given in order as name and visible.
// a field is evaluated after the fields its condition depends on.
export const getHiddenFields = (
fields: readonly (readonly [string, HaFormVisible | undefined])[],
data: HaFormDataContainer | undefined
): Set<string> => {
const hidden = new Set<string>();
const conditions = new Map(fields);
const evalData: HaFormDataContainer = { ...(data ?? {}) };
let changed = true;
while (changed) {
changed = false;
for (const [name, visible] of fields) {
if (hidden.has(name) || isVisible(visible, evalData)) {
continue;
}
const hidden = new Set<string>();
const resolved = new Set<string>();
const resolve = (name: string) => {
if (resolved.has(name) || !conditions.has(name)) {
return;
}
resolved.add(name);
const visible = conditions.get(name);
getConditionFields(visible).forEach(resolve);
if (!isVisible(visible, evalData)) {
hidden.add(name);
delete evalData[name];
changed = true;
}
}
};
fields.forEach(([name]) => resolve(name));
return hidden;
};
+1 -1
View File
@@ -10,7 +10,7 @@ export const voiceAssistants = {
},
"cloud.google_assistant": {
domain: "google_assistant",
name: "Google Home",
name: "Google Assistant",
},
} as const;
@@ -839,9 +839,6 @@ class DataEntryFlowDialog extends DirtyStateProviderMixin<
return [
haStyleDialog,
css`
ha-dialog {
--ha-dialog-header-title-height: auto;
}
.dialog-title {
overflow: hidden;
text-overflow: ellipsis;
@@ -1742,7 +1742,7 @@ ${rejected
}
}
// Alexa and Google Home can't be exposed to from the UI when they
// Alexa and Google Assistant can't be exposed to from the UI when they
// are configured manually in YAML, same as on the voice assistants expose page
private _exposableAssistants = memoize(
(cloudStatus: CloudStatus | undefined, hass: HomeAssistant) =>
+15 -15
View File
@@ -2347,7 +2347,7 @@
"aliases_description": "Aliases are the names voice assistants use for this entity.",
"aliases_description_assist": "Assist uses all aliases equally.",
"aliases_description_alexa": "Amazon Alexa uses only the first alias.",
"aliases_description_google": "Google Home uses the first alias as the main name and the rest as alternatives.",
"aliases_description_google": "Google Assistant uses the first alias as the main name and the rest as alternatives.",
"aliases_no_unique_id": "Aliases are not supported for entities without a unique ID. See the {faq_link} for more detail.",
"entity_name_alias_description": "Default name. When enabled, it is used as the first alias.",
"ask_pin": "Ask for PIN",
@@ -5400,8 +5400,8 @@
"title": "Get the best assistant with {home_assistant_cloud}",
"features": {
"assistants": {
"title": "Google Home and Amazon Alexa",
"text": "Control all your Home Assistant devices via any Google Home-enabled or Alexa-enabled device."
"title": "Google Assistant and Amazon Alexa",
"text": "Control all your Home Assistant devices via any Google Assistant-enabled or Alexa-enabled device."
},
"speech": {
"title": "Amazing speech options for Assist",
@@ -7008,7 +7008,7 @@
"cloud": {
"description_login": "Logged in and connected",
"description_not_login": "Not logged in",
"description_features": "Control home when away and integrate with Alexa and Google Home",
"description_features": "Control home when away and integrate with Alexa and Google Assistant",
"login": {
"title": "Cloud login",
"landing_title": "[%key:ui::panel::config::cloud::account::onboarding::ha_cloud_title%]",
@@ -7112,7 +7112,7 @@
"alexa_google_both": "Alexa and Google linked",
"alexa_google_alexa": "Alexa linked",
"alexa_google_google": "Google linked",
"alexa_google_none": "Control your home with Amazon Alexa and Google Home",
"alexa_google_none": "Control your home with Amazon Alexa and Google Assistant",
"feature_cameras": "Cameras and streaming",
"feature_webhooks": "Webhooks",
"webhooks_active": "{count} active",
@@ -7149,7 +7149,7 @@
"backup_body": "Keep an encrypted off-site copy of your latest backup, ready to restore on first boot.",
"voice_title": "Voice assistants",
"voice_helper": "Alexa, Google, and Home Assistant voice",
"voice_body": "Talk to your home your way. Home Assistant Cloud powers fast, private voice for Assist out of the box, and you can add Amazon Alexa or Google Home.",
"voice_body": "Talk to your home your way. Home Assistant Cloud powers fast, private voice for Assist out of the box, and you can add Amazon Alexa or Google Assistant.",
"streaming_title": "Smoother streaming",
"streaming_helper": "Faster, more reliable camera feeds",
"streaming_body": "Make camera feeds and Music Assistant playback faster and more reliable, over a secure connection.",
@@ -7164,7 +7164,7 @@
"alexa_tagline": "Voice control with Echo devices",
"alexa_bullet1": "Control devices from your Echo by voice",
"alexa_bullet2": "Use Home Assistant in your Alexa routines",
"google_name": "Google Home",
"google_name": "Google Assistant",
"google_tagline": "Hands-free control with Nest devices",
"google_bullet1": "Control devices from your Nest speakers by voice",
"google_bullet2": "Cast your cameras to a Nest Hub display"
@@ -7209,7 +7209,7 @@
"support_package_privacy_warning": "This file may contain personal data about your home. Avoid sharing them with unverified or untrusted parties.",
"reset_cloud_data": "Reset cloud data",
"reset_data_confirm_title": "Reset cloud data?",
"reset_data_confirm_text": "This will reset all your cloud settings. This includes your remote connection, Google Home, and Amazon Alexa integrations. This action cannot be undone.",
"reset_data_confirm_text": "This will reset all your cloud settings. This includes your remote connection, Google Assistant, and Amazon Alexa integrations. This action cannot be undone.",
"reset": "Reset",
"reset_data_failed": "Failed to reset cloud data",
"thank_you_note": "It's because of people like you that we are able to make a great home automation experience for everyone.",
@@ -7222,7 +7222,7 @@
"integrations_introduction": "Integrations for Home Assistant Cloud allow you to connect with services in the cloud without having to expose your Home Assistant instance publicly on the internet.",
"integrations_introduction2": "Check the website for ",
"integrations_link_all_features": " all available features",
"tip_moved_voice_assistants": "Looking for Google Home and Amazon Alexa settings? They are moved to the new voice assistants page.",
"tip_moved_voice_assistants": "Looking for Google Assistant and Amazon Alexa settings? They are moved to the new voice assistants page.",
"connected": "Connected",
"connecting": "Connecting…",
"not_connected": "Not connected",
@@ -7309,26 +7309,26 @@
"expose_new_entities_info": "Should new entities be exposed to Alexa automatically? Exposes supported devices that are not classified as security devices."
},
"google": {
"title": "Google Home",
"info": "With the Google Home integration for Home Assistant Cloud, you'll be able to control all your Home Assistant devices via any Google Home-enabled device.",
"title": "Google Assistant",
"info": "With the Google Assistant integration for Home Assistant Cloud, you'll be able to control all your Home Assistant devices via any Google Assistant-enabled device.",
"http_use_ssl_warning_title": "Local communication unavailable",
"http_use_ssl_warning_text": "Google devices will not be able to talk locally with Home Assistant, because you have configured an SSL certificate for your HTTP integration.",
"config_documentation": "Configuration documentation",
"enable_state_reporting": "Enable state reporting",
"info_state_reporting": "If you enable state reporting, Home Assistant will send all state changes of exposed entities to Google. This speeds up voice commands and allows you to always see the latest states in the Google app.",
"security_devices": "Security devices",
"enter_pin_info": "Please enter a PIN to interact with security devices. Security devices are doors, garage doors, and locks. You will be asked to say/enter this PIN when interacting with security devices via Google Home.",
"enter_pin_info": "Please enter a PIN to interact with security devices. Security devices are doors, garage doors, and locks. You will be asked to say/enter this PIN when interacting with security devices via Google Assistant.",
"devices_pin": "Security devices PIN",
"enter_pin_hint": "Enter a PIN to use security devices",
"show_entities": "Show entities",
"exposed_entities": "{number} {number, plural,\n one {entity}\n other {entities}\n} exposed",
"manual_config": "Editing which entities are exposed via the UI is disabled because you have configured entity filters in configuration.yaml.",
"enter_pin_error": "Unable to store PIN:",
"not_configured_title": "Continue setting up Google Home",
"not_configured_text": "To start using Google Home, add the 'Home Assistant Cloud by Nabu Casa' service in the Google Home app on your smartphone.",
"not_configured_title": "Continue setting up Google Assistant",
"not_configured_text": "To start using Google Assistant, add the 'Home Assistant Cloud by Nabu Casa' service in the Google Home app on your smartphone.",
"link_learn_how_it_works": "[%key:ui::panel::config::cloud::account::remote::link_learn_how_it_works%]",
"expose_new_entities": "Expose new entities",
"expose_new_entities_info": "Should new entities be exposed to Google Home automatically? Exposes supported devices that are not classified as security devices."
"expose_new_entities_info": "Should new entities be exposed to Google Assistant automatically? Exposes supported devices that are not classified as security devices."
},
"webhooks": {
"title": "Webhooks",
@@ -163,6 +163,17 @@ describe("getHiddenFields", () => {
...getHiddenFields(fields, { mode: "advanced", token: "kept" }),
]).toEqual([]);
});
it("does not depend on the order of the fields", () => {
const token = ["token", { field: "mode", value: "advanced" }] as const;
const extra = [
"extra",
{ field: "token", operator: "not_exists" },
] as const;
const data = { mode: "simple", token: "stale" };
expect([...getHiddenFields([token, extra], data)]).toEqual(["token"]);
expect([...getHiddenFields([extra, token], data)]).toEqual(["token"]);
});
});
describe("getHiddenSchemaFields", () => {