- [[stateObj.attributes.errors]] -
++ [[stateObj.attributes.errors]] +
- -
+
-


[[error]]
-[[error]]
+[[localize('ui.panel.config.automation.picker.no_automations')]]
++ [[localize('ui.panel.config.automation.picker.no_automations')]] +
+-
+
- + To activate, search in the Alexa app for the Home Assistant Smart + Home skill. + +
- + + Config documentation + + +
Exposed entities:
+Exposed entities:
+- Thank you for being part of Home Assistant Cloud. It's because of people like you that we are able to make a great home automation experience for everyone. Thank you! -
-+ Thank you for being part of Home Assistant Cloud. It's because + of people like you that we are able to make a great home + automation experience for everyone. Thank you! +
+ 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. +
++ Check the website for + all available features. +
- 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. -
-- Check the website for all available features. -
--
-
- - To activate, search in the Alexa app for the Home Assistant Smart Home skill. - -
- - - Config documentation - - -
This integration requires an Alexa-enabled device like the Amazon Echo.
-This integration requires a Google Assistant-enabled device like the Google Home or Android phone.
-Forgot your password?
-- Enter your email address and we will send you a link to reset your password. -
-Forgot your password?
++ Enter your email address and we will send you a link to reset + your password. +
+- Home Assistant Cloud connects your local instance securely to cloud-only services Amazon Alexa and Google Assistant. -
-- This service is run by our partner Nabu Casa, Inc, a company founded by the founders of Home Assistant and Hass.io. -
-- Home Assistant Cloud is a subscription service with a free one month trial. No payment information necessary. -
- -+ Home Assistant Cloud connects your local instance securely to + cloud-only services Amazon Alexa and Google Assistant. +
++ This service is run by our partner + Nabu Casa, Inc, a company founded by the founders of Home Assistant and + Hass.io. +
++ Home Assistant Cloud is a subscription service with a free one + month trial. No payment information necessary. +
+Sign In
-Sign In
+[[localize('ui.panel.config.integrations.config_entry.no_devices')]]
- - -+ [[localize('ui.panel.config.integrations.config_entry.no_devices')]] +
+ + +- - Aborted - - - Success! - - - [[_computeStepTitle(localize, _step)]] - -
-
+
+ Aborted
+
- Created config for [[_step.title]]
+ Success!
-
-
-
-
-
-
+ [[_computeStepTitle(localize, _step)]]
-
Created config for [[_step.title]]
+ + + +- Added/edited customizations will take effect immediately. Removed customizations will take effect when the entity is updated. - -
+ Added/edited customizations will take effect immediately. Removed + customizations will take effect when the entity is updated. + +
- Changes made here won't affect your configuration. + .attributes-text { + padding-left: 20px; + } + + +
+ Changes made here won't affect your configuration. +
+ The following attributes are already set in customize.yaml
+
+
+ The following attributes are customized from outside of
+ customize.yaml
+ Possibly via a domain, a glob or a different include.
+
+
+ The following attributes of the entity are set programatically.
+ You can override them if you like.
+
+ + The following attributes weren't set. Set them if you like. +
+
- The following attributes are already set in customize.yaml
-
-
- The following attributes are customized from outside of customize.yaml
- Possibly via a domain, a glob or a different include.
-
-
- The following attributes of the entity are set programatically.
- You can override them if you like.
-
- - The following attributes weren't set. Set them if you like. -
-We couldn't find any editable scripts.
+We couldn't find any editable scripts.
+Add user
-Add user
+ID | -[[user.id]] | -
Owner | -[[user.is_owner]] | -
Active | -[[user.is_active]] | -
System generated | -[[user.system_generated]] | -
ID | +[[user.id]] | +
Owner | +[[user.is_owner]] | +
Active | +[[user.is_active]] | +
System generated | +[[user.system_generated]] | +
Ascii: [[_computedCodeOutput]]
-
-
-
- - {{event.event}} - ({{event.listener_count}} listeners) - - -
-
+
+
- + {{event.event}} + ({{event.listener_count}} listeners) + + +
- Fire an event on the event bus. -
+Fire an event on the event bus.
-Loaded Components
-The following components are currently loaded:
--
-
-
- [[item]] - -
Loaded Components
+The following components are currently loaded:
+-
+
+
- [[item]] + +
- The service dev tool allows you to call any available service in Home Assistant. -
++ The service dev tool allows you to call any available service in + Home Assistant. +
-Select a service to see the description
- - - - -No description is available
- - -[[_description]]
- -Parameter | -Description | -Example | -
---|---|---|
This service takes no parameters. | ||
[[attribute.key]] |
- [[attribute.description]] | -[[attribute.example]] | -
Select a service to see the description
+ + + + +No description is available
+ + +[[_description]]
+ +Parameter | +Description | +Example | +
---|---|---|
This service takes no parameters. | +||
[[attribute.key]] |
+ [[attribute.description]] | +[[attribute.example]] | +
- Set the representation of a device within Home Assistant.
- This will not communicate with the actual device.
-
+ Set the representation of a device within Home Assistant.
+ This will not communicate with the actual device.
+
Current entities
-Entity | -State | -
- Attributes
- |
- |||
---|---|---|---|---|---|
No entities | -
- |
- [[entity.state]] | - -[[attributeString(entity)]] | - +Entity | +State | +
+ Attributes
+ |
---|
- Templates are rendered using the Jinja2 template engine with some Home Assistant specific extensions. -
- -+ Templates are rendered using the Jinja2 template engine with some + Home Assistant specific extensions. +
+ +[[processed]]+
[[processed]]-
[[_formatDate(item.when)]]
+ + No logbook entries found. -[[_formatDate(item.when)]]
+ + + -${this._toStr(this._config.origConfig)}`; } diff --git a/src/panels/lovelace/cards/hui-gauge-card.ts b/src/panels/lovelace/cards/hui-gauge-card.ts index 5a6ebddf26..5fbfeece6f 100644 --- a/src/panels/lovelace/cards/hui-gauge-card.ts +++ b/src/panels/lovelace/cards/hui-gauge-card.ts @@ -71,30 +71,33 @@ class HuiGaugeCard extends LitElement implements LovelaceCard { } return html` - ${this.renderStyle()} -
Entities
+Card Configuration
-${this.localize("ui.panel.lovelace.editor.edit.header")}
+${this.localize("ui.panel.lovelace.editor.migrate.header")}
+${this.localize("ui.panel.lovelace.editor.migrate.para_no_id")}
++ ${this.localize("ui.panel.lovelace.editor.migrate.para_migrate")} +
+
- [[localize('ui.panel.mailbox.playback_title')]]
-
-
-
-
-
+ paper-dialog {
+ border-radius: 2px;
+ }
+ paper-dialog p {
+ color: var(--secondary-text-color);
+ }
+
+ .icon {
+ float: right;
+ }
+
+
+
+ [[localize('ui.panel.mailbox.playback_title')]]
+
+
+
+
+
+
+
+
+
+
+ [[_errorMsg]]
+
+
-
-
-
-
- [[_errorMsg]]
-
-
-
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/panels/mailbox/ha-panel-mailbox.js b/src/panels/mailbox/ha-panel-mailbox.js
index deb955d892..6cde979b4a 100644
--- a/src/panels/mailbox/ha-panel-mailbox.js
+++ b/src/panels/mailbox/ha-panel-mailbox.js
@@ -26,100 +26,106 @@ let registeredDialog = false;
class HaPanelMailbox extends EventsMixin(LocalizeMixin(PolymerElement)) {
static get template() {
return html`
-
+ .content {
+ padding: 16px;
+ max-width: 600px;
+ margin: 0 auto;
+ }
-
-
-
-
- [[localize('panel.mailbox')]]
-
-
-
-
-
- [[getPlatformName(item)]]
-
+ paper-card {
+ display: block;
+ }
+
+ paper-item {
+ cursor: pointer;
+ }
+
+ .empty {
+ text-align: center;
+ color: var(--secondary-text-color);
+ }
+
+ .header {
+ @apply --paper-font-title;
+ }
+
+ .row {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ @media all and (max-width: 450px) {
+ .content {
+ width: auto;
+ padding: 0;
+ }
+ }
+
+ .tip {
+ color: var(--secondary-text-color);
+ font-size: 14px;
+ }
+ .date {
+ color: var(--primary-text-color);
+ }
+
+
+
+
+
+
+ [[localize('panel.mailbox')]]
+
+
+
+
+
+ [[getPlatformName(item)]]
+
+
+
+
+
+
+
+
+
+ [[localize('ui.panel.mailbox.empty')]]
+
-
+
+
+
+
+ [[item.caller]]
+
+ [[localize('ui.duration.second', 'count', item.duration)]]
+
+
+
+ [[item.timestamp]] -
+ [[item.message]]
+
+
+
+
+
-
-
-
-
-
- [[localize('ui.panel.mailbox.empty')]]
-
-
-
-
-
-
- [[item.caller]]
- [[localize('ui.duration.second', 'count', item.duration)]]
-
-
- [[item.timestamp]] - [[item.message]]
-
-
-
-
-
-
-
+
`;
}
diff --git a/src/panels/map/ha-entity-marker.js b/src/panels/map/ha-entity-marker.js
index a575f22418..18f853d4b6 100644
--- a/src/panels/map/ha-entity-marker.js
+++ b/src/panels/map/ha-entity-marker.js
@@ -10,35 +10,42 @@ import EventsMixin from "../../mixins/events-mixin";
class HaEntityMarker extends EventsMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+
-
- [[entityName]]
-
-
-
-
-`;
+
+ [[entityName]]
+
+
+
+
+ `;
}
static get properties() {
diff --git a/src/panels/map/ha-panel-map.js b/src/panels/map/ha-panel-map.js
index bb69bf4416..0a13829de7 100644
--- a/src/panels/map/ha-panel-map.js
+++ b/src/panels/map/ha-panel-map.js
@@ -21,20 +21,23 @@ Leaflet.Icon.Default.imagePath = "/static/images/leaflet";
class HaPanelMap extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
+
-
-
- [[localize('panel.map')]]
-
+
+
+ [[localize('panel.map')]]
+
-
+
`;
}
diff --git a/src/panels/profile/ha-change-password-card.js b/src/panels/profile/ha-change-password-card.js
index 8511669f6f..75e7c45d68 100644
--- a/src/panels/profile/ha-change-password-card.js
+++ b/src/panels/profile/ha-change-password-card.js
@@ -15,74 +15,77 @@ import "../../resources/ha-style";
class HaChangePasswordCard extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
-
-
-
- [[_errorMsg]]
-
-
- [[_statusMsg]]
-
-
-
+
+
+
+
+
+ [[_errorMsg]]
+
+
+ [[_statusMsg]]
+
-
-
-
-
-
-
-
-
- [[localize('ui.panel.profile.change_password.submit')]]
-
-
-
-
-`;
+
+
+
+
+
+
+
+
+
+
+ [[localize('ui.panel.profile.change_password.submit')]]
+
+
+
+
+ `;
}
static get properties() {
diff --git a/src/panels/profile/ha-long-lived-access-tokens-card.js b/src/panels/profile/ha-long-lived-access-tokens-card.js
index a6843d5e6a..3493bc20bd 100644
--- a/src/panels/profile/ha-long-lived-access-tokens-card.js
+++ b/src/panels/profile/ha-long-lived-access-tokens-card.js
@@ -17,45 +17,55 @@ import "./ha-settings-row";
class HaLongLivedTokens extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
-
-
-
-
- [[localize('ui.panel.profile.long_lived_access_tokens.description')]]
-
- [[localize('ui.panel.profile.long_lived_access_tokens.learn_auth_requests')]]
-
-
-
- [[localize('ui.panel.profile.long_lived_access_tokens.empty_state')]]
+
+
+
+
+ [[localize('ui.panel.profile.long_lived_access_tokens.description')]]
+
+ [[localize('ui.panel.profile.long_lived_access_tokens.learn_auth_requests')]]
+
+
+
+
+ [[localize('ui.panel.profile.long_lived_access_tokens.empty_state')]]
+
+
+
+
+
+ [[item.client_name]]
+ [[_formatCreatedAt(item.created_at)]]
+
+
-
-
-
- [[item.client_name]]
- [[_formatCreatedAt(item.created_at)]]
-
-
-
-
-
- [[localize('ui.panel.profile.long_lived_access_tokens.create')]]
-
-
-
+
+
+ [[localize('ui.panel.profile.long_lived_access_tokens.create')]]
+
+
+
`;
}
diff --git a/src/panels/profile/ha-mfa-module-setup-flow.js b/src/panels/profile/ha-mfa-module-setup-flow.js
index c98b02488c..27f7da490e 100644
--- a/src/panels/profile/ha-mfa-module-setup-flow.js
+++ b/src/panels/profile/ha-mfa-module-setup-flow.js
@@ -21,96 +21,116 @@ let instance = 0;
class HaMfaModuleSetupFlow extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
-
-
-
-
- [[localize('ui.panel.profile.mfa_setup.title_aborted')]]
-
-
- [[localize('ui.panel.profile.mfa_setup.title_success')]]
-
-
- [[_computeStepTitle(localize, _step)]]
-
-
-
-
- [[_errorMsg]]
-
-
-
-
-
+
+
+
-
+ [[localize('ui.panel.profile.mfa_setup.title_aborted')]]
-
- [[localize('ui.panel.profile.mfa_setup.step_done', 'step', _step.title)]]
+ [[localize('ui.panel.profile.mfa_setup.title_success')]]
-
-
-
+ [[_computeStepTitle(localize, _step)]]
+
+
+
+
+ [[_errorMsg]]
+
+
+
+
+
+
+
+
+
-
+
+
+ [[localize('ui.panel.profile.mfa_setup.step_done', 'step',
+ _step.title)]]
+
+
+
+
+
+
+
+
+
+
-
-
-
-
- [[localize('ui.panel.profile.mfa_setup.close')]]
-
-
- [[localize('ui.panel.profile.mfa_setup.close')]]
-
-
-
-
+
+
+
+ [[localize('ui.panel.profile.mfa_setup.close')]]
-
- [[localize('ui.panel.profile.mfa_setup.submit')]]
+
+ [[localize('ui.panel.profile.mfa_setup.close')]]
-
-
-
-`;
+
+
+
+
+
+
+
+ [[localize('ui.panel.profile.mfa_setup.submit')]]
+
+
+
+
+ `;
}
static get properties() {
diff --git a/src/panels/profile/ha-mfa-modules-card.js b/src/panels/profile/ha-mfa-modules-card.js
index 9bcd647b04..daaccd1c2b 100644
--- a/src/panels/profile/ha-mfa-modules-card.js
+++ b/src/panels/profile/ha-mfa-modules-card.js
@@ -19,49 +19,50 @@ let registeredDialog = false;
class HaMfaModulesCard extends EventsMixin(LocalizeMixin(PolymerElement)) {
static get template() {
return html`
-
-
-
-
-
- [[module.name]]
- [[module.id]]
-
-
- [[localize('ui.panel.profile.mfa.disable')]]
-
-
- [[localize('ui.panel.profile.mfa.enable')]]
-
-
-
-
-`;
+
+
+
+
+
+ [[module.name]]
+ [[module.id]]
+
+
+ [[localize('ui.panel.profile.mfa.disable')]]
+
+
+ [[localize('ui.panel.profile.mfa.enable')]]
+
+
+
+
+ `;
}
static get properties() {
diff --git a/src/panels/profile/ha-panel-profile.js b/src/panels/profile/ha-panel-profile.js
index b642aa2764..b07f16b943 100644
--- a/src/panels/profile/ha-panel-profile.js
+++ b/src/panels/profile/ha-panel-profile.js
@@ -30,85 +30,90 @@ import "./ha-push-notifications-row";
class HaPanelProfile extends EventsMixin(LocalizeMixin(PolymerElement)) {
static get template() {
return html`
-
+ .content > * {
+ display: block;
+ margin: 24px 0;
+ }
+
-
-
-
-
- [[localize('panel.profile')]]
-
-
+
+
+
+
+ [[localize('panel.profile')]]
+
+
-
-
-
- [[localize('ui.panel.profile.current_user', 'fullName', hass.user.name)]]
- [[localize('ui.panel.profile.is_owner')]]
-
+
+
+
+ [[localize('ui.panel.profile.current_user', 'fullName',
+ hass.user.name)]]
+ [[localize('ui.panel.profile.is_owner')]]
+
-
+
-
+
+
+
+
+ [[localize('ui.panel.profile.logout')]]
+
+
+
+
+
+
+
+
-
+
+
-
+
+
-
-
- [[localize('ui.panel.profile.logout')]]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ refresh-tokens="[[_refreshTokens]]"
+ on-hass-refresh-tokens="_refreshRefreshTokens"
+ >
+
+
`;
}
diff --git a/src/panels/profile/ha-pick-language-row.js b/src/panels/profile/ha-pick-language-row.js
index 1b1a1e89de..5e73e24e16 100644
--- a/src/panels/profile/ha-pick-language-row.js
+++ b/src/panels/profile/ha-pick-language-row.js
@@ -17,24 +17,39 @@ import "./ha-settings-row";
class HaPickLanguageRow extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
-
-
- [[localize('ui.panel.profile.language.header')]]
-
- [[localize('ui.panel.profile.language.link_promo')]]
-
-
-
-
- [[item.nativeName]]
-
-
-
-
+
+
+ [[localize('ui.panel.profile.language.header')]]
+
+ [[localize('ui.panel.profile.language.link_promo')]]
+
+
+
+
+ [[item.nativeName]]
+
+
+
+
`;
}
diff --git a/src/panels/profile/ha-pick-theme-row.js b/src/panels/profile/ha-pick-theme-row.js
index 4d3dc557c6..25220a7e7b 100644
--- a/src/panels/profile/ha-pick-theme-row.js
+++ b/src/panels/profile/ha-pick-theme-row.js
@@ -15,31 +15,37 @@ import LocalizeMixin from "../../mixins/localize-mixin";
class HaPickThemeRow extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
-
-
- [[localize('ui.panel.profile.themes.header')]]
-
-
- [[localize('ui.panel.profile.themes.error_no_theme')]]
-
- [[localize('ui.panel.profile.themes.link_promo')]]
-
-
-
-
- [[theme]]
+
+
+ [[localize('ui.panel.profile.themes.header')]]
+
+
+ [[localize('ui.panel.profile.themes.error_no_theme')]]
-
-
-
+ [[localize('ui.panel.profile.themes.link_promo')]]
+
+
+
+
+ [[theme]]
+
+
+
+
`;
}
diff --git a/src/panels/profile/ha-push-notifications-row.js b/src/panels/profile/ha-push-notifications-row.js
index 83c31f01ee..eb8f3ef0a3 100644
--- a/src/panels/profile/ha-push-notifications-row.js
+++ b/src/panels/profile/ha-push-notifications-row.js
@@ -17,24 +17,28 @@ import "./ha-settings-row";
class HaPushNotificationsRow extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
- [[localize('ui.panel.profile.push_notifications.header')]]
-
- [[_description(_platformLoaded, _pushSupported)]]
- [[localize('ui.panel.profile.push_notifications.link_promo')]]
-
-
-
+
+
+ [[localize('ui.panel.profile.push_notifications.header')]]
+
+ [[_description(_platformLoaded, _pushSupported)]]
+ [[localize('ui.panel.profile.push_notifications.link_promo')]]
+
+
+
`;
}
diff --git a/src/panels/profile/ha-refresh-tokens-card.js b/src/panels/profile/ha-refresh-tokens-card.js
index 1de26dfb36..48a9b5e34e 100644
--- a/src/panels/profile/ha-refresh-tokens-card.js
+++ b/src/panels/profile/ha-refresh-tokens-card.js
@@ -16,39 +16,43 @@ import "./ha-settings-row";
class HaRefreshTokens extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
-
-
- [[localize('ui.panel.profile.refresh_tokens.description')]]
-
-
- [[_formatTitle(item.client_id)]]
- [[_formatCreatedAt(item.created_at)]]
- [[_formatLastUsed(item)]]
-
-
- [[localize('ui.panel.profile.refresh_tokens.current_token_tooltip')]]
-
-
-
-
-
-
+
+
+
+ [[localize('ui.panel.profile.refresh_tokens.description')]]
+
+
+
+ [[_formatTitle(item.client_id)]]
+ [[_formatCreatedAt(item.created_at)]]
+ [[_formatLastUsed(item)]]
+
+
+ [[localize('ui.panel.profile.refresh_tokens.current_token_tooltip')]]
+
+
+
+
+
+
`;
}
diff --git a/src/panels/profile/ha-settings-row.js b/src/panels/profile/ha-settings-row.js
index 7bba46651c..cfdb7b1512 100644
--- a/src/panels/profile/ha-settings-row.js
+++ b/src/panels/profile/ha-settings-row.js
@@ -4,29 +4,29 @@ import { PolymerElement } from "@polymer/polymer/polymer-element";
class HaSettingsRow extends PolymerElement {
static get template() {
return html`
-
-
-
-
-
-
+
+
+
+
+
+
`;
}
diff --git a/src/panels/shopping-list/ha-panel-shopping-list.js b/src/panels/shopping-list/ha-panel-shopping-list.js
index 5c4602a4c5..9e7935429d 100644
--- a/src/panels/shopping-list/ha-panel-shopping-list.js
+++ b/src/panels/shopping-list/ha-panel-shopping-list.js
@@ -23,116 +23,122 @@ import LocalizeMixin from "../../mixins/localize-mixin";
class HaPanelShoppingList extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
+ app-toolbar paper-item {
+ cursor: pointer;
+ }
+ .content {
+ padding-bottom: 32px;
+ max-width: 600px;
+ margin: 0 auto;
+ }
+ paper-card {
+ display: block;
+ }
+ paper-icon-item {
+ border-top: 1px solid var(--divider-color);
+ }
+ paper-icon-item:first-child {
+ border-top: 0;
+ }
+ paper-checkbox {
+ padding: 11px;
+ }
+ paper-input {
+ --paper-input-container-underline: {
+ display: none;
+ }
+ --paper-input-container-underline-focus: {
+ display: none;
+ }
+ position: relative;
+ top: 1px;
+ }
+ .tip {
+ padding: 24px;
+ text-align: center;
+ color: var(--secondary-text-color);
+ }
+
-
-
-
-
- [[localize('panel.shopping_list')]]
-
-
-
-
- [[localize('ui.panel.shopping-list.clear_completed')]]
-
-
-
-
+
+
+
+
+ [[localize('panel.shopping_list')]]
+
+
+
+
+ [[localize('ui.panel.shopping-list.clear_completed')]]
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
- [[localize('ui.panel.shopping-list.microphone_tip')]]
+
+
+
+
+
+
+
+
+
+
+
+ [[localize('ui.panel.shopping-list.microphone_tip')]]
+
-
-
+
`;
}
diff --git a/src/resources/html-import/polyfill.js b/src/resources/html-import/polyfill.js
index ea9ccd8127..bb357ae2f6 100644
--- a/src/resources/html-import/polyfill.js
+++ b/src/resources/html-import/polyfill.js
@@ -419,8 +419,8 @@
return a
? a.href
: p && p.get
- ? p.get.call(this)
- : (document.querySelector("base") || window.location).href;
+ ? p.get.call(this)
+ : (document.querySelector("base") || window.location).href;
},
configurable: !0,
enumerable: !0,
diff --git a/src/resources/jquery.roundslider.js b/src/resources/jquery.roundslider.js
index 16ada36315..471e5a0c57 100644
--- a/src/resources/jquery.roundslider.js
+++ b/src/resources/jquery.roundslider.js
@@ -3,4 +3,8 @@ import "./jquery";
import "round-slider";
import roundSliderCSS from "round-slider/dist/roundslider.min.css";
-export const roundSliderStyle = html``;
+export const roundSliderStyle = html`
+
+`;
diff --git a/src/state-summary/state-card-climate.js b/src/state-summary/state-card-climate.js
index a3df097492..70cf125569 100644
--- a/src/state-summary/state-card-climate.js
+++ b/src/state-summary/state-card-climate.js
@@ -8,34 +8,37 @@ import "../components/ha-climate-state";
class StateCardClimate extends PolymerElement {
static get template() {
return html`
-
-
+
+ ha-climate-state {
+ margin-left: 16px;
+ text-align: right;
+ }
+
-
- ${this.stateInfoTemplate}
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-configurator.js b/src/state-summary/state-card-configurator.js
index e9b49018a0..4b8449ff40 100644
--- a/src/state-summary/state-card-configurator.js
+++ b/src/state-summary/state-card-configurator.js
@@ -13,37 +13,39 @@ import LocalizeMixin from "../mixins/localize-mixin";
class StateCardConfigurator extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
- [[_localizeState(stateObj.state)]]
-
+
+ ${this.stateInfoTemplate}
+ [[_localizeState(stateObj.state)]]
+
-
-
-
-
-`;
+
+
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-cover.js b/src/state-summary/state-card-cover.js
index 94c275fbb5..2ecb7f66ed 100644
--- a/src/state-summary/state-card-cover.js
+++ b/src/state-summary/state-card-cover.js
@@ -10,31 +10,39 @@ import CoverEntity from "../util/cover-model";
class StateCardCover extends PolymerElement {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
-
-
-
+
+ ${this.stateInfoTemplate}
+
+
+
+
-
-`;
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-display.js b/src/state-summary/state-card-display.js
index 0438fa425f..7414666cd2 100644
--- a/src/state-summary/state-card-display.js
+++ b/src/state-summary/state-card-display.js
@@ -14,44 +14,45 @@ import attributeClassNames from "../common/entity/attribute_class_names";
class StateCardDisplay extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
- state-info {
- flex: 1 1 auto;
- min-width: 0;
- }
- .state {
- @apply --paper-font-body1;
- color: var(--primary-text-color);
- margin-left: 16px;
- text-align: right;
- max-width: 40%;
- flex: 0 0 auto;
- }
- .state.has-unit_of_measurement {
- white-space: nowrap;
- }
-
-
- ${this.stateInfoTemplate}
- [[computeStateDisplay(localize, stateObj, language)]]
-`;
+ ${this.stateInfoTemplate}
+
+ [[computeStateDisplay(localize, stateObj, language)]]
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-input_number.js b/src/state-summary/state-card-input_number.js
index 8b13308ab9..6f914e6662 100644
--- a/src/state-summary/state-card-input_number.js
+++ b/src/state-summary/state-card-input_number.js
@@ -14,50 +14,81 @@ class StateCardInputNumber extends mixinBehaviors(
) {
static get template() {
return html`
-
-
+
+ }
+ ha-slider[hidden] {
+ display: none !important;
+ }
+ paper-input {
+ text-align: right;
+ margin-left: auto;
+ }
+
-
- ${this.stateInfoTemplate}
-
-
-
-
- [[stateObj.attributes.unit_of_measurement]]
- [[value]] [[stateObj.attributes.unit_of_measurement]]
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+
+
+
+ [[stateObj.attributes.unit_of_measurement]]
+
+
+ [[value]] [[stateObj.attributes.unit_of_measurement]]
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
ready() {
diff --git a/src/state-summary/state-card-input_select.js b/src/state-summary/state-card-input_select.js
index 4d881a8014..76e4667988 100644
--- a/src/state-summary/state-card-input_select.js
+++ b/src/state-summary/state-card-input_select.js
@@ -11,41 +11,48 @@ import computeStateName from "../common/entity/compute_state_name";
class StateCardInputSelect extends PolymerElement {
static get template() {
return html`
-
+ paper-item {
+ cursor: pointer;
+ }
+
- ${this.stateBadgeTemplate}
-
-
-
- [[item]]
-
-
-
-`;
+ ${this.stateBadgeTemplate}
+
+
+
+ [[item]]
+
+
+
+ `;
}
static get stateBadgeTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-input_text.js b/src/state-summary/state-card-input_text.js
index 6f0f2a4158..7840133218 100644
--- a/src/state-summary/state-card-input_text.js
+++ b/src/state-summary/state-card-input_text.js
@@ -8,29 +8,40 @@ import "../components/entity/state-info";
class StateCardInputText extends PolymerElement {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
-
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-lock.js b/src/state-summary/state-card-lock.js
index cb99b3fe33..d3fa3c4c0d 100644
--- a/src/state-summary/state-card-lock.js
+++ b/src/state-summary/state-card-lock.js
@@ -13,33 +13,43 @@ import LocalizeMixin from "../mixins/localize-mixin";
class StateCardLock extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
- [[localize('ui.card.lock.unlock')]]
- [[localize('ui.card.lock.lock')]]
-
-`;
+
+ ${this.stateInfoTemplate}
+ [[localize('ui.card.lock.unlock')]]
+ [[localize('ui.card.lock.lock')]]
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-media_player.js b/src/state-summary/state-card-media_player.js
index 593c71a800..afc3b97103 100644
--- a/src/state-summary/state-card-media_player.js
+++ b/src/state-summary/state-card-media_player.js
@@ -12,53 +12,55 @@ import HassMediaPlayerEntity from "../util/hass-media-player-model";
class StateCardMediaPlayer extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+ .secondary-text {
+ @apply --paper-font-common-nowrap;
+ color: var(--secondary-text-color);
+ }
+
-
- ${this.stateInfoTemplate}
-
- [[computePrimaryText(localize, playerObj)]]
- [[playerObj.secondaryTitle]]
+
+ ${this.stateInfoTemplate}
+
+
+ [[computePrimaryText(localize, playerObj)]]
+
+ [[playerObj.secondaryTitle]]
+
-
-`;
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-scene.js b/src/state-summary/state-card-scene.js
index 335ca5554f..02ab4491d6 100644
--- a/src/state-summary/state-card-scene.js
+++ b/src/state-summary/state-card-scene.js
@@ -12,32 +12,34 @@ import LocalizeMixin from "../mixins/localize-mixin";
class StateCardScene extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
- [[localize('ui.card.scene.activate')]]
-
-`;
+
+ ${this.stateInfoTemplate}
+ [[localize('ui.card.scene.activate')]]
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-script.js b/src/state-summary/state-card-script.js
index 38155b3057..d74b04f890 100644
--- a/src/state-summary/state-card-script.js
+++ b/src/state-summary/state-card-script.js
@@ -14,41 +14,46 @@ import LocalizeMixin from "../mixins/localize-mixin";
class StateCardScript extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
-
-
+
+ ha-entity-toggle {
+ margin-left: 16px;
+ }
+
-
- ${this.stateInfoTemplate}
-
-
-
-
- [[localize('ui.card.script.execute')]]
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+
+
+ [[localize('ui.card.script.execute')]]
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-timer.js b/src/state-summary/state-card-timer.js
index b108a200cd..da8d2a8ef7 100644
--- a/src/state-summary/state-card-timer.js
+++ b/src/state-summary/state-card-timer.js
@@ -10,33 +10,33 @@ import secondsToDuration from "../common/datetime/seconds_to_duration";
class StateCardTimer extends PolymerElement {
static get template() {
return html`
-
-
+
+ margin-left: 16px;
+ text-align: right;
+ line-height: 40px;
+ }
+
-
- ${this.stateInfoTemplate}
- [[_secondsToDuration(timeRemaining)]]
-
-`;
+
+ ${this.stateInfoTemplate}
+ [[_secondsToDuration(timeRemaining)]]
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-toggle.js b/src/state-summary/state-card-toggle.js
index ae96ab28ed..391da0dc25 100644
--- a/src/state-summary/state-card-toggle.js
+++ b/src/state-summary/state-card-toggle.js
@@ -8,29 +8,32 @@ import "../components/entity/state-info";
class StateCardToggle extends PolymerElement {
static get template() {
return html`
-
-
+
+
-
- ${this.stateInfoTemplate}
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-vacuum.js b/src/state-summary/state-card-vacuum.js
index d976fd5b1c..2900d322cd 100644
--- a/src/state-summary/state-card-vacuum.js
+++ b/src/state-summary/state-card-vacuum.js
@@ -8,23 +8,26 @@ import "../components/ha-vacuum-state";
class StateCardVacuum extends PolymerElement {
static get template() {
return html`
-
+
-
- ${this.stateInfoTemplate}
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-water_heater.js b/src/state-summary/state-card-water_heater.js
index c04214edbc..92ae779930 100644
--- a/src/state-summary/state-card-water_heater.js
+++ b/src/state-summary/state-card-water_heater.js
@@ -8,34 +8,37 @@ import "../components/ha-water_heater-state";
class StateCardWaterHeater extends PolymerElement {
static get template() {
return html`
-
-
+
+ ha-water_heater-state {
+ margin-left: 16px;
+ text-align: right;
+ }
+
-
- ${this.stateInfoTemplate}
-
-
-`;
+
+ ${this.stateInfoTemplate}
+
+
+ `;
}
static get stateInfoTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/state-summary/state-card-weblink.js b/src/state-summary/state-card-weblink.js
index 467f5318b2..d078965983 100644
--- a/src/state-summary/state-card-weblink.js
+++ b/src/state-summary/state-card-weblink.js
@@ -8,30 +8,32 @@ import computeStateName from "../common/entity/compute_state_name";
class StateCardWeblink extends PolymerElement {
static get template() {
return html`
-
+ text-transform: capitalize;
+ line-height: 40px;
+ margin-left: 16px;
+ }
+
- ${this.stateBadgeTemplate}
- [[_computeStateName(stateObj)]]
-`;
+ ${this.stateBadgeTemplate}
+ [[_computeStateName(stateObj)]]
+ `;
}
static get stateBadgeTemplate() {
return html`
-
-`;
+
+ `;
}
static get properties() {
diff --git a/src/translations/en.json b/src/translations/en.json
index cc04a89269..b7e0846d2b 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -182,7 +182,8 @@
"performance": "Performance",
"high_demand": "High demand",
"heat_pump": "Heat pump",
- "gas": "Gas"
+ "gas": "Gas",
+ "manual": "Manual"
},
"configurator": {
"configure": "Configure",
@@ -757,6 +758,28 @@
"logbook": {
"showing_entries": "[%key:ui::panel::history::showing_entries%]"
},
+ "lovelace": {
+ "cards": {
+ "shopping-list": {
+ "checked_items": "Checked items",
+ "clear_items": "Clear checked items",
+ "add_item": "Add item"
+ }
+ },
+ "editor": {
+ "edit": {
+ "header": "Card Configuration",
+ "save": "Save",
+ "toggle_editor": "Toggle Editor"
+ },
+ "migrate": {
+ "header": "Configuration Incompatible",
+ "para_no_id": "This element doesn't have an ID. Please add an ID to this element in 'ui-lovelace.yaml'.",
+ "para_migrate": "Home Assistant can add ID's to all your cards and views automatically for you by pressing the 'Migrate config' button.",
+ "migrate": "Migrate config"
+ }
+ }
+ },
"mailbox": {
"empty": "You do not have any messages",
"playback_title": "Message playback",
diff --git a/src/translations/translationMetadata.json b/src/translations/translationMetadata.json
index faaceac74c..3a31673c25 100644
--- a/src/translations/translationMetadata.json
+++ b/src/translations/translationMetadata.json
@@ -51,7 +51,8 @@
"nativeName": "Schwiizerdütsch"
},
"he": {
- "nativeName": "עברית"
+ "nativeName": "עברית",
+ "isRTL": true
},
"hi": {
"nativeName": "हिन्दी"
diff --git a/src/types.ts b/src/types.ts
index 6cc016d2ee..dad3f5ffd4 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -6,8 +6,15 @@ import {
MessageBase,
HassEntityBase,
HassEntityAttributeBase,
+ HassServices,
} from "home-assistant-js-websocket";
+declare global {
+ var __DEV__: boolean;
+ var __BUILD__: "latest" | "es5";
+ var __VERSION__: string;
+}
+
export interface Credential {
auth_provider_type: string;
auth_provider_id: string;
@@ -34,6 +41,11 @@ export interface Theme {
"accent-color": string;
}
+export interface Themes {
+ default_theme: string;
+ themes: { [key: string]: Theme };
+}
+
export interface Panel {
component_name: string;
config?: { [key: string]: any };
@@ -42,22 +54,33 @@ export interface Panel {
url_path: string;
}
+export interface Panels {
+ [name: string]: Panel;
+}
+
export interface Translation {
nativeName: string;
+ isRTL: boolean;
fingerprints: { [fragment: string]: string };
}
+export interface Notification {
+ notification_id: string;
+ message: string;
+ title: string;
+ status: "read" | "unread";
+ created_at: string;
+}
+
export interface HomeAssistant {
auth: Auth;
connection: Connection;
connected: boolean;
states: HassEntities;
+ services: HassServices;
config: HassConfig;
- themes: {
- default_theme: string;
- themes: { [key: string]: Theme };
- };
- panels: { [key: string]: Panel };
+ themes: Themes;
+ panels: Panels;
panelUrl: string;
language: string;
resources: { [key: string]: any };
@@ -121,3 +144,13 @@ export type LightEntity = HassEntityBase & {
hs_color: number[];
};
};
+
+export type GroupEntity = HassEntityBase & {
+ attributes: HassEntityAttributeBase & {
+ entity_id: string[];
+ order: number;
+ auto?: boolean;
+ view?: boolean;
+ control?: "hidden";
+ };
+};
diff --git a/src/util/cover-model.js b/src/util/cover-model.js
index 09666718a7..45de4ad911 100644
--- a/src/util/cover-model.js
+++ b/src/util/cover-model.js
@@ -72,9 +72,9 @@ export default class CoverEntity {
}
get isTiltOnly() {
- var supportsCover =
+ const supportsCover =
this.supportsOpen || this.supportsClose || this.supportsStop;
- var supportsTilt =
+ const supportsTilt =
this.supportsOpenTilt || this.supportsCloseTilt || this.supportsStopTilt;
return supportsTilt && !supportsCover;
}
@@ -120,3 +120,32 @@ export default class CoverEntity {
this.hass.callService("cover", service, data);
}
}
+
+const support = (stateObj, feature) =>
+ (stateObj.attributes.supported_features & feature) !== 0;
+
+export const supportsOpen = (stateObj) => support(stateObj, 1);
+
+export const supportsClose = (stateObj) => support(stateObj, 2);
+
+export const supportsSetPosition = (stateObj) => support(stateObj, 4);
+
+export const supportsStop = (stateObj) => support(stateObj, 8);
+
+export const supportsOpenTilt = (stateObj) => support(stateObj, 16);
+
+export const supportsCloseTilt = (stateObj) => support(stateObj, 32);
+
+export const supportsStopTilt = (stateObj) => support(stateObj, 64);
+
+export const supportsSetTiltPosition = (stateObj) => support(stateObj, 128);
+
+export function isTiltOnly(stateObj) {
+ const supportsCover =
+ supportsOpen(stateObj) || supportsClose(stateObj) || supportsStop(stateObj);
+ const supportsTilt =
+ supportsOpenTilt(stateObj) ||
+ supportsCloseTilt(stateObj) ||
+ supportsStopTilt(stateObj);
+ return supportsTilt && !supportsCover;
+}
diff --git a/test-mocha/common/datetime/duration_to_seconds_test.js b/test-mocha/common/datetime/duration_to_seconds_test.ts
similarity index 100%
rename from test-mocha/common/datetime/duration_to_seconds_test.js
rename to test-mocha/common/datetime/duration_to_seconds_test.ts
diff --git a/test-mocha/common/datetime/format_date.js b/test-mocha/common/datetime/format_date.ts
similarity index 100%
rename from test-mocha/common/datetime/format_date.js
rename to test-mocha/common/datetime/format_date.ts
diff --git a/test-mocha/common/datetime/format_date_time.js b/test-mocha/common/datetime/format_date_time.ts
similarity index 100%
rename from test-mocha/common/datetime/format_date_time.js
rename to test-mocha/common/datetime/format_date_time.ts
diff --git a/test-mocha/common/datetime/format_time.js b/test-mocha/common/datetime/format_time.ts
similarity index 100%
rename from test-mocha/common/datetime/format_time.js
rename to test-mocha/common/datetime/format_time.ts
diff --git a/test-mocha/common/datetime/seconds_to_duration_test.js b/test-mocha/common/datetime/seconds_to_duration_test.ts
similarity index 100%
rename from test-mocha/common/datetime/seconds_to_duration_test.js
rename to test-mocha/common/datetime/seconds_to_duration_test.ts
diff --git a/test-mocha/common/entity/attribute_class_names_test.js b/test-mocha/common/entity/attribute_class_names_test.ts
similarity index 89%
rename from test-mocha/common/entity/attribute_class_names_test.js
rename to test-mocha/common/entity/attribute_class_names_test.ts
index 1a5b29f327..b6a904b00a 100644
--- a/test-mocha/common/entity/attribute_class_names_test.js
+++ b/test-mocha/common/entity/attribute_class_names_test.ts
@@ -6,12 +6,12 @@ describe("attributeClassNames", () => {
const attrs = ["mock_attr1", "mock_attr2"];
it("Skips null states", () => {
- const stateObj = null;
+ const stateObj: any = null;
assert.strictEqual(attributeClassNames(stateObj, attrs), "");
});
it("Matches no attrbutes", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
other_attr_1: 1,
other_attr_2: 2,
@@ -21,7 +21,7 @@ describe("attributeClassNames", () => {
});
it("Matches one attrbute", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
other_attr_1: 1,
other_attr_2: 2,
@@ -32,7 +32,7 @@ describe("attributeClassNames", () => {
});
it("Matches two attrbutes", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
other_attr_1: 1,
other_attr_2: 2,
diff --git a/test-mocha/common/entity/can_toggle_domain_test.js b/test-mocha/common/entity/can_toggle_domain_test.ts
similarity index 97%
rename from test-mocha/common/entity/can_toggle_domain_test.js
rename to test-mocha/common/entity/can_toggle_domain_test.ts
index 9416e885c2..a3d3d36b30 100644
--- a/test-mocha/common/entity/can_toggle_domain_test.js
+++ b/test-mocha/common/entity/can_toggle_domain_test.ts
@@ -3,7 +3,7 @@ import { assert } from "chai";
import canToggleDomain from "../../../src/common/entity/can_toggle_domain";
describe("canToggleDomain", () => {
- const hass = {
+ const hass: any = {
services: {
light: {
turn_on: null, // Service keys only need to be present for test
diff --git a/test-mocha/common/entity/can_toggle_state_test.js b/test-mocha/common/entity/can_toggle_state_test.ts
similarity index 83%
rename from test-mocha/common/entity/can_toggle_state_test.js
rename to test-mocha/common/entity/can_toggle_state_test.ts
index 2a1c706031..b0239dd376 100644
--- a/test-mocha/common/entity/can_toggle_state_test.js
+++ b/test-mocha/common/entity/can_toggle_state_test.ts
@@ -3,7 +3,7 @@ import { assert } from "chai";
import canToggleState from "../../../src/common/entity/can_toggle_state";
describe("canToggleState", () => {
- const hass = {
+ const hass: any = {
services: {
light: {
turn_on: null, // Service keys only need to be present for test
@@ -13,7 +13,7 @@ describe("canToggleState", () => {
};
it("Detects lights toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "light.bla",
state: "on",
};
@@ -21,7 +21,7 @@ describe("canToggleState", () => {
});
it("Detects group with toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "group.bla",
state: "on",
};
@@ -29,7 +29,7 @@ describe("canToggleState", () => {
});
it("Detects group without toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "group.devices",
state: "home",
};
@@ -37,7 +37,7 @@ describe("canToggleState", () => {
});
it("Detects climate with toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "climate.bla",
attributes: {
supported_features: 4096,
@@ -47,8 +47,11 @@ describe("canToggleState", () => {
});
it("Detects climate without toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "climate.bla",
+ attributes: {
+ supported_features: 0,
+ },
};
assert.isFalse(canToggleState(hass, stateObj));
});
diff --git a/test-mocha/common/entity/compute_domain.js b/test-mocha/common/entity/compute_domain.ts
similarity index 100%
rename from test-mocha/common/entity/compute_domain.js
rename to test-mocha/common/entity/compute_domain.ts
diff --git a/test-mocha/common/entity/compute_state_display.js b/test-mocha/common/entity/compute_state_display.ts
similarity index 82%
rename from test-mocha/common/entity/compute_state_display.js
rename to test-mocha/common/entity/compute_state_display.ts
index d599d0fc74..3d0da10b56 100644
--- a/test-mocha/common/entity/compute_state_display.js
+++ b/test-mocha/common/entity/compute_state_display.ts
@@ -3,13 +3,12 @@ import { assert } from "chai";
import computeStateDisplay from "../../../src/common/entity/compute_state_display";
describe("computeStateDisplay", () => {
- const localize = function(message, ...args) {
- // Mock Localize function for testing
- return message + (args.length ? ": " + args.join(",") : "");
- };
+ // Mock Localize function for testing
+ const localize = (message, ...args) =>
+ message + (args.length ? ": " + args.join(",") : "");
it("Localizes binary sensor defaults", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "binary_sensor.test",
state: "off",
attributes: {},
@@ -21,7 +20,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes binary sensor device class", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "binary_sensor.test",
state: "off",
attributes: {
@@ -35,12 +34,13 @@ describe("computeStateDisplay", () => {
});
it("Localizes binary sensor invalid device class", () => {
- const altLocalize = function(message, ...args) {
- if (message === "state.binary_sensor.invalid_device_class.off")
- return null;
+ const altLocalize = (message, ...args) => {
+ if (message === "state.binary_sensor.invalid_device_class.off") {
+ return "";
+ }
return localize(message, ...args);
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "binary_sensor.test",
state: "off",
attributes: {
@@ -54,7 +54,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes sensor value with units", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "123",
attributes: {
@@ -65,11 +65,13 @@ describe("computeStateDisplay", () => {
});
it("Localizes unknown sensor value with units", () => {
- const altLocalize = function(message, ...args) {
- if (message === "state.sensor.unknown") return null;
+ const altLocalize = (message, ...args) => {
+ if (message === "state.sensor.unknown") {
+ return "";
+ }
return localize(message, ...args);
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "unknown",
attributes: {
@@ -83,11 +85,13 @@ describe("computeStateDisplay", () => {
});
it("Localizes unavailable sensor value with units", () => {
- const altLocalize = function(message, ...args) {
- if (message === "state.sensor.unavailable") return null;
+ const altLocalize = (message, ...args) => {
+ if (message === "state.sensor.unavailable") {
+ return "";
+ }
return localize(message, ...args);
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "unavailable",
attributes: {
@@ -101,11 +105,13 @@ describe("computeStateDisplay", () => {
});
it("Localizes sensor value with component translation", () => {
- const altLocalize = function(message, ...args) {
- if (message !== "component.sensor.state.custom_state") return null;
+ const altLocalize = (message, ...args) => {
+ if (message !== "component.sensor.state.custom_state") {
+ return "";
+ }
return localize(message, ...args);
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "custom_state",
attributes: {},
@@ -117,7 +123,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes input_datetime with full date time", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "input_datetime.test",
state: "123",
attributes: {
@@ -138,7 +144,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes input_datetime with date", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "input_datetime.test",
state: "123",
attributes: {
@@ -159,7 +165,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes input_datetime with time", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "input_datetime.test",
state: "123",
attributes: {
@@ -180,7 +186,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes zwave ready", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "zwave.test",
state: "ready",
attributes: {
@@ -194,7 +200,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes zwave initializing", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "zwave.test",
state: "initializing",
attributes: {
@@ -208,7 +214,7 @@ describe("computeStateDisplay", () => {
});
it("Localizes cover open", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "cover.test",
state: "open",
attributes: {},
@@ -220,11 +226,13 @@ describe("computeStateDisplay", () => {
});
it("Localizes unavailable", () => {
- const altLocalize = function(message, ...args) {
- if (message === "state.sensor.unavailable") return null;
+ const altLocalize = (message, ...args) => {
+ if (message === "state.sensor.unavailable") {
+ return "";
+ }
return localize(message, ...args);
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "unavailable",
attributes: {},
@@ -236,11 +244,11 @@ describe("computeStateDisplay", () => {
});
it("Localizes custom state", () => {
- const altLocalize = function() {
+ const altLocalize = () => {
// No matches can be found
- return null;
+ return "";
};
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
state: "My Custom State",
attributes: {},
@@ -252,7 +260,7 @@ describe("computeStateDisplay", () => {
});
it("Only calculates state display once per immutable state object", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "cover.test",
state: "open",
attributes: {},
diff --git a/test-mocha/common/entity/compute_state_domain.js b/test-mocha/common/entity/compute_state_domain.ts
similarity index 91%
rename from test-mocha/common/entity/compute_state_domain.js
rename to test-mocha/common/entity/compute_state_domain.ts
index f65cb2bac7..803737fa5a 100644
--- a/test-mocha/common/entity/compute_state_domain.js
+++ b/test-mocha/common/entity/compute_state_domain.ts
@@ -4,7 +4,7 @@ import computeStateDomain from "../../../src/common/entity/compute_state_domain"
describe("computeStateDomain", () => {
it("Detects sensor domain", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.test",
};
assert.strictEqual(computeStateDomain(stateObj), "sensor");
diff --git a/test-mocha/common/entity/entity_filter.ts b/test-mocha/common/entity/entity_filter.ts
new file mode 100644
index 0000000000..d236a78037
--- /dev/null
+++ b/test-mocha/common/entity/entity_filter.ts
@@ -0,0 +1,97 @@
+import { generateFilter } from "../../../src/common/entity/entity_filter";
+
+import * as assert from "assert";
+
+describe("EntityFilter", () => {
+ // case 1
+ it("passes all when no filters passed in", () => {
+ const filter = generateFilter();
+
+ assert(filter("sensor.test"));
+ assert(filter("sun.sun"));
+ assert(filter("light.test"));
+ });
+
+ // case 2
+ it("allows whitelisting entities by entity id", () => {
+ const filter = generateFilter(undefined, ["light.kitchen"]);
+
+ assert(filter("light.kitchen"));
+ assert(!filter("light.living_room"));
+ });
+
+ it("allows whitelisting entities by domain", () => {
+ const filter = generateFilter(["switch"]);
+
+ assert(filter("switch.bla"));
+ assert(!filter("light.kitchen"));
+ });
+
+ // case 3
+ it("allows blacklisting entities by entity id", () => {
+ const filter = generateFilter(undefined, undefined, undefined, [
+ "light.kitchen",
+ ]);
+
+ assert(!filter("light.kitchen"));
+ assert(filter("light.living_room"));
+ });
+
+ it("allows blacklisting entities by domain", () => {
+ const filter = generateFilter(undefined, undefined, ["switch"]);
+
+ assert(!filter("switch.bla"));
+ assert(filter("light.kitchen"));
+ });
+
+ // case 4a
+ it("allows whitelisting domain and blacklisting entity", () => {
+ const filter = generateFilter(["switch"], undefined, undefined, [
+ "switch.kitchen",
+ ]);
+
+ assert(filter("switch.living_room"));
+ assert(!filter("switch.kitchen"));
+ assert(!filter("sensor.bla"));
+ });
+
+ it("allows whitelisting entity while whitelisting other domains", () => {
+ const filter = generateFilter(["switch"], ["light.kitchen"]);
+
+ assert(filter("switch.living_room"));
+ assert(filter("light.kitchen"));
+ assert(!filter("sensor.bla"));
+ });
+
+ // case 4b
+ it("allows blacklisting domain and whitelisting entity", () => {
+ const filter = generateFilter(undefined, ["switch.kitchen"], ["switch"]);
+
+ assert(filter("switch.kitchen"));
+ assert(!filter("switch.living_room"));
+ assert(filter("sensor.bla"));
+ });
+
+ it("allows blacklisting domain and excluding entities", () => {
+ const filter = generateFilter(
+ undefined,
+ undefined,
+ ["switch"],
+ ["light.kitchen"]
+ );
+
+ assert(!filter("switch.living_room"));
+ assert(!filter("light.kitchen"));
+ assert(filter("sensor.bla"));
+ });
+
+ // case 4c
+ it("allows whitelisting entities", () => {
+ const filter = generateFilter(undefined, ["light.kitchen"]);
+
+ assert(filter("light.kitchen"));
+ assert(!filter("switch.living_room"));
+ assert(!filter("light.living_room"));
+ assert(!filter("sensor.bla"));
+ });
+});
diff --git a/test-mocha/common/entity/extract_views.spec.js b/test-mocha/common/entity/extract_views.spec.ts
similarity index 95%
rename from test-mocha/common/entity/extract_views.spec.js
rename to test-mocha/common/entity/extract_views.spec.ts
index 2feb8879ea..9528f21a9a 100644
--- a/test-mocha/common/entity/extract_views.spec.js
+++ b/test-mocha/common/entity/extract_views.spec.ts
@@ -1,4 +1,4 @@
-import assert from "assert";
+import * as assert from "assert";
import extractViews from "../../../src/common/entity/extract_views";
diff --git a/test-mocha/common/entity/feature_class_names_test.js b/test-mocha/common/entity/feature_class_names_test.ts
similarity index 74%
rename from test-mocha/common/entity/feature_class_names_test.js
rename to test-mocha/common/entity/feature_class_names_test.ts
index 005359e2eb..544d95a1e6 100644
--- a/test-mocha/common/entity/feature_class_names_test.js
+++ b/test-mocha/common/entity/feature_class_names_test.ts
@@ -1,6 +1,7 @@
import { assert } from "chai";
import featureClassNames from "../../../src/common/entity/feature_class_names";
+import { HassEntity } from "home-assistant-js-websocket";
describe("featureClassNames", () => {
const classNames = {
@@ -12,11 +13,12 @@ describe("featureClassNames", () => {
it("Skips null states", () => {
const stateObj = null;
- assert.strictEqual(featureClassNames(stateObj, classNames), "");
+ assert.strictEqual(featureClassNames(stateObj!, classNames), "");
});
it("Matches no features", () => {
- const stateObj = {
+ // tslint:disable-next-line
+ const stateObj = {
attributes: {
supported_features: 64,
},
@@ -25,7 +27,8 @@ describe("featureClassNames", () => {
});
it("Matches one feature", () => {
- const stateObj = {
+ // tslint:disable-next-line
+ const stateObj = {
attributes: {
supported_features: 72,
},
@@ -37,7 +40,8 @@ describe("featureClassNames", () => {
});
it("Matches two features", () => {
- const stateObj = {
+ // tslint:disable-next-line
+ const stateObj = {
attributes: {
supported_features: 73,
},
diff --git a/test-mocha/common/entity/get_group_entities.spec.js b/test-mocha/common/entity/get_group_entities.spec.ts
similarity index 96%
rename from test-mocha/common/entity/get_group_entities.spec.js
rename to test-mocha/common/entity/get_group_entities.spec.ts
index 35052dee0a..a6c5d6177b 100644
--- a/test-mocha/common/entity/get_group_entities.spec.js
+++ b/test-mocha/common/entity/get_group_entities.spec.ts
@@ -1,4 +1,4 @@
-import assert from "assert";
+import * as assert from "assert";
import getGroupEntities from "../../../src/common/entity/get_group_entities";
diff --git a/test-mocha/common/entity/get_view_entities.spec.js b/test-mocha/common/entity/get_view_entities.spec.ts
similarity index 98%
rename from test-mocha/common/entity/get_view_entities.spec.js
rename to test-mocha/common/entity/get_view_entities.spec.ts
index b95cb573ac..c39b8a37ed 100644
--- a/test-mocha/common/entity/get_view_entities.spec.js
+++ b/test-mocha/common/entity/get_view_entities.spec.ts
@@ -1,4 +1,4 @@
-import assert from "assert";
+import * as assert from "assert";
import getViewEntities from "../../../src/common/entity/get_view_entities";
diff --git a/test-mocha/common/entity/has_location.test.js b/test-mocha/common/entity/has_location.test.ts
similarity index 87%
rename from test-mocha/common/entity/has_location.test.js
rename to test-mocha/common/entity/has_location.test.ts
index 10389d35be..88ee4f7508 100644
--- a/test-mocha/common/entity/has_location.test.js
+++ b/test-mocha/common/entity/has_location.test.ts
@@ -4,7 +4,7 @@ import hasLocation from "../../../src/common/entity/has_location";
describe("hasLocation", () => {
it("flags states with location", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
latitude: 12.34,
longitude: 12.34,
@@ -13,7 +13,7 @@ describe("hasLocation", () => {
assert(hasLocation(stateObj));
});
it("does not flag states with only latitude", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
latitude: 12.34,
},
@@ -21,7 +21,7 @@ describe("hasLocation", () => {
assert(!hasLocation(stateObj));
});
it("does not flag states with only longitude", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {
longitude: 12.34,
},
@@ -29,7 +29,7 @@ describe("hasLocation", () => {
assert(!hasLocation(stateObj));
});
it("does not flag states with no location", () => {
- const stateObj = {
+ const stateObj: any = {
attributes: {},
};
assert(!hasLocation(stateObj));
diff --git a/test-mocha/common/entity/split_by_groups.spec.js b/test-mocha/common/entity/split_by_groups.spec.ts
similarity index 96%
rename from test-mocha/common/entity/split_by_groups.spec.js
rename to test-mocha/common/entity/split_by_groups.spec.ts
index 85c31f4715..ede3c3ea19 100644
--- a/test-mocha/common/entity/split_by_groups.spec.js
+++ b/test-mocha/common/entity/split_by_groups.spec.ts
@@ -1,4 +1,4 @@
-import assert from "assert";
+import * as assert from "assert";
import splitByGroups from "../../../src/common/entity/split_by_groups";
diff --git a/test-mocha/common/entity/state_card_type_test.js b/test-mocha/common/entity/state_card_type_test.ts
similarity index 88%
rename from test-mocha/common/entity/state_card_type_test.js
rename to test-mocha/common/entity/state_card_type_test.ts
index 3d9c66edbe..deb455784c 100644
--- a/test-mocha/common/entity/state_card_type_test.js
+++ b/test-mocha/common/entity/state_card_type_test.ts
@@ -3,7 +3,7 @@ import { assert } from "chai";
import stateCardType from "../../../src/common/entity/state_card_type";
describe("stateCardType", () => {
- const hass = {
+ const hass: any = {
services: {
light: {
turn_on: null, // Service keys only need to be present for test
@@ -13,21 +13,21 @@ describe("stateCardType", () => {
};
it("Returns display for unavailable states", () => {
- const stateObj = {
+ const stateObj: any = {
state: "unavailable",
};
assert.strictEqual(stateCardType(hass, stateObj), "display");
});
it("Returns media_player for media_player states", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "media_player.bla",
};
assert.strictEqual(stateCardType(hass, stateObj), "media_player");
});
it("Returns toggle for states that can toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "light.bla",
attributes: {},
};
@@ -35,7 +35,7 @@ describe("stateCardType", () => {
});
it("Returns display for states with hidden control", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "light.bla",
attributes: {
control: "hidden",
@@ -45,7 +45,7 @@ describe("stateCardType", () => {
});
it("Returns display for entities that cannot toggle", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "sensor.bla",
};
assert.strictEqual(stateCardType(hass, stateObj), "display");
diff --git a/test-mocha/common/entity/state_more_info_type_test.js b/test-mocha/common/entity/state_more_info_type_test.ts
similarity index 89%
rename from test-mocha/common/entity/state_more_info_type_test.js
rename to test-mocha/common/entity/state_more_info_type_test.ts
index 93a1e8d7cb..1d62f53b8d 100644
--- a/test-mocha/common/entity/state_more_info_type_test.js
+++ b/test-mocha/common/entity/state_more_info_type_test.ts
@@ -4,14 +4,14 @@ import stateMoreInfoType from "../../../src/common/entity/state_more_info_type";
describe("stateMoreInfoType", () => {
it("Returns media_player for media_player states", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "media_player.bla",
};
assert.strictEqual(stateMoreInfoType(stateObj), "media_player");
});
it("Returns hidden for input_select states", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "input_select.bla",
attributes: {},
};
@@ -19,7 +19,7 @@ describe("stateMoreInfoType", () => {
});
it("Returns default for switch states", () => {
- const stateObj = {
+ const stateObj: any = {
entity_id: "switch.bla",
attributes: {},
};
diff --git a/test-mocha/common/entity/test_util.js b/test-mocha/common/entity/test_util.ts
similarity index 97%
rename from test-mocha/common/entity/test_util.js
rename to test-mocha/common/entity/test_util.ts
index 32aa92aef6..1d7b3f203c 100644
--- a/test-mocha/common/entity/test_util.js
+++ b/test-mocha/common/entity/test_util.ts
@@ -27,7 +27,7 @@ export function createView(entity) {
return createGroup(entity);
}
-export function createLightEntity(isOn) {
+export function createLightEntity(isOn?) {
mockState++;
if (isOn === undefined) {
isOn = Math.random() > 0.5;
diff --git a/test-mocha/common/entity/timer_time_remaining_test.js b/test-mocha/common/entity/timer_time_remaining_test.ts
similarity index 92%
rename from test-mocha/common/entity/timer_time_remaining_test.js
rename to test-mocha/common/entity/timer_time_remaining_test.ts
index fd77bc92b8..e049fa1015 100644
--- a/test-mocha/common/entity/timer_time_remaining_test.js
+++ b/test-mocha/common/entity/timer_time_remaining_test.ts
@@ -1,5 +1,5 @@
import { assert } from "chai";
-import sinon from "sinon";
+import * as sinon from "sinon";
import timerTimeRemaining from "../../../src/common/entity/timer_time_remaining";
@@ -11,7 +11,7 @@ describe("timerTimeRemaining", () => {
attributes: {
remaining: "0:01:05",
},
- }),
+ } as any),
65
);
});
@@ -23,7 +23,7 @@ describe("timerTimeRemaining", () => {
attributes: {
remaining: "0:01:05",
},
- }),
+ } as any),
65
);
});
@@ -44,7 +44,7 @@ describe("timerTimeRemaining", () => {
remaining: "0:01:05",
},
last_changed: "2018-01-17T16:15:12Z",
- }),
+ } as any),
47
);
});
diff --git a/test-mocha/common/util/parse_aspect_ratio_test.js b/test-mocha/common/util/parse_aspect_ratio_test.ts
similarity index 97%
rename from test-mocha/common/util/parse_aspect_ratio_test.js
rename to test-mocha/common/util/parse_aspect_ratio_test.ts
index dd6af4f3cc..15b42a0cc1 100644
--- a/test-mocha/common/util/parse_aspect_ratio_test.js
+++ b/test-mocha/common/util/parse_aspect_ratio_test.ts
@@ -1,4 +1,4 @@
-import assert from "assert";
+import * as assert from "assert";
import parseAspectRatio from "../../../src/common/util/parse-aspect-ratio";
diff --git a/test-mocha/mocha.opts b/test-mocha/mocha.opts
index f25388f803..7157db4af7 100644
--- a/test-mocha/mocha.opts
+++ b/test-mocha/mocha.opts
@@ -1,4 +1,3 @@
--recursive
---require reify
--timeout 10000
-test-mocha
+test-mocha/**/*.ts
diff --git a/test-mocha/tsconfig.test.json b/test-mocha/tsconfig.test.json
new file mode 100644
index 0000000000..0e7afc6855
--- /dev/null
+++ b/test-mocha/tsconfig.test.json
@@ -0,0 +1,6 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "module": "commonjs"
+ }
+}
diff --git a/test-mocha/tslint.json b/test-mocha/tslint.json
new file mode 100644
index 0000000000..1e32f15d50
--- /dev/null
+++ b/test-mocha/tslint.json
@@ -0,0 +1,6 @@
+{
+ "extends": ["../tslint.json"],
+ "rules": {
+ "no-implicit-dependencies": [true, "dev"]
+ }
+}
diff --git a/translations/ca.json b/translations/ca.json
index 365f55b107..e7c9cf7b48 100644
--- a/translations/ca.json
+++ b/translations/ca.json
@@ -779,8 +779,10 @@
"code": "Codi",
"clear_code": "Esborrar",
"disarm": "Desactivar",
- "arm_home": "Activar a casa",
- "arm_away": "Activar a fora"
+ "arm_home": "Activar, casa",
+ "arm_away": "Activar, fora",
+ "arm_night": "Activar, nit",
+ "armed_custom_bypass": "Bypass personalitzat"
},
"automation": {
"last_triggered": "Última activació",
@@ -850,7 +852,7 @@
},
"relative_time": {
"past": "Fa {time}",
- "future": "D'aquí {time}",
+ "future": "D'aquí a {time}",
"never": "Mai",
"duration": {
"second": "{count} {count, plural,\n one {segon}\n other {segons}\n}",
diff --git a/translations/cs.json b/translations/cs.json
index 52251666e6..d570aba54e 100644
--- a/translations/cs.json
+++ b/translations/cs.json
@@ -780,7 +780,9 @@
"clear_code": "Zrušit",
"disarm": "Deaktivovat",
"arm_home": "Aktivní doma",
- "arm_away": "Aktivní v nepřítomnosti"
+ "arm_away": "Aktivní v nepřítomnosti",
+ "arm_night": "Aktivní v noci",
+ "armed_custom_bypass": "Specifické obejítí alarmu"
},
"automation": {
"last_triggered": "Naposledy spuštěno",
diff --git a/translations/da.json b/translations/da.json
index 463576cbe1..7493df687f 100644
--- a/translations/da.json
+++ b/translations/da.json
@@ -602,6 +602,15 @@
"current_user": "Du er logget ind som {fullName} .",
"is_owner": "Du er ejer.",
"logout": "Log af",
+ "change_password": {
+ "header": "Skift adgangskode",
+ "submit": "Gem og afslut"
+ },
+ "mfa": {
+ "header": "Multifaktor godkendelsesmoduler",
+ "disable": "Deaktiver",
+ "enable": "Aktiver"
+ },
"mfa_setup": {
"title_aborted": "Afbrudt",
"title_success": "Succes!",
@@ -684,7 +693,7 @@
}
},
"page-onboarding": {
- "intro": "Er du klar til at vække din hjem, genvinde dit privatliv og deltage i et verdensomspændende fællesskab af tinkerers?",
+ "intro": "Er du klar til at vække dit hjem, genvinde dit privatliv og blive medlem af et verdensomspændende fællesskab af tinkerers?",
"user": {
"intro": "Lad os komme i gang ved at oprette en brugerkonto.",
"required_field": "Nødvendig",
@@ -766,7 +775,9 @@
"clear_code": "Nulstil",
"disarm": "Frakoble",
"arm_home": "Tilkoble hjemme",
- "arm_away": "Tilkoble ude"
+ "arm_away": "Tilkoble ude",
+ "arm_night": "Tilkoblet nat",
+ "armed_custom_bypass": "Brugerdefineret "
},
"automation": {
"last_triggered": "Senest udløst",
diff --git a/translations/de.json b/translations/de.json
index 3ce4df4fda..688a55e94c 100644
--- a/translations/de.json
+++ b/translations/de.json
@@ -780,7 +780,9 @@
"clear_code": "Löschen",
"disarm": "Deaktivieren",
"arm_home": "Aktivieren, Zuhause",
- "arm_away": "Aktivieren, unterwegs"
+ "arm_away": "Aktivieren, unterwegs",
+ "arm_night": "Nacht aktiviert",
+ "armed_custom_bypass": "Benutzerdefinierter Bypass"
},
"automation": {
"last_triggered": "Zuletzt ausgelöst",
@@ -836,7 +838,7 @@
"on_off": "An \/ Aus",
"target_temperature": "Solltemperatur",
"operation": "Betrieb",
- "away_mode": "Abwesend-Modus"
+ "away_mode": "Abwesenheitsmodus"
}
},
"components": {
diff --git a/translations/en.json b/translations/en.json
index 14d0c9d56c..d70c46c649 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -780,7 +780,9 @@
"clear_code": "Clear",
"disarm": "Disarm",
"arm_home": "Arm home",
- "arm_away": "Arm away"
+ "arm_away": "Arm away",
+ "arm_night": "Arm night",
+ "armed_custom_bypass": "Custom bypass"
},
"automation": {
"last_triggered": "Last triggered",
diff --git a/translations/es-419.json b/translations/es-419.json
index bd0777a604..6a878a5635 100644
--- a/translations/es-419.json
+++ b/translations/es-419.json
@@ -780,7 +780,9 @@
"clear_code": "Limpiar",
"disarm": "Desactivar",
"arm_home": "Proteger en casa",
- "arm_away": "Proteger fuera de casa"
+ "arm_away": "Proteger fuera de casa",
+ "arm_night": "Armado nocturno",
+ "armed_custom_bypass": "Bypass personalizado"
},
"automation": {
"last_triggered": "Última activación",
diff --git a/translations/es.json b/translations/es.json
index 19a97b50f2..cca9adf21d 100644
--- a/translations/es.json
+++ b/translations/es.json
@@ -158,7 +158,7 @@
"stopped": "Detenido"
},
"device_tracker": {
- "home": "Casa",
+ "home": "En casa",
"not_home": "Fuera de casa"
},
"fan": {
@@ -284,7 +284,7 @@
"armed_custom_bypass": "Armada"
},
"device_tracker": {
- "home": "En casa",
+ "home": "Casa",
"not_home": "Fuera"
}
},
@@ -381,7 +381,7 @@
"label": "Estado",
"from": "De",
"to": "A",
- "for": "Por"
+ "for": "Durante"
},
"homeassistant": {
"label": "Home Assistant",
@@ -548,7 +548,7 @@
"manuf": "por {manufacturer}",
"hub": "Conectado a través de",
"firmware": "Firmware: {version}",
- "device_unavailable": "entidad no disponible",
+ "device_unavailable": "dispositivo no disponible",
"entity_unavailable": "entidad no disponible"
}
}
@@ -577,10 +577,10 @@
"header": "Actualizar tokens",
"description": "Cada token de actualización representa un acceso de sesión. Los tokens de actualización se eliminarán automáticamente cuando haga clic en Cerrar sesión. Los siguientes tokens de actualización están actualmente activos para su cuenta.",
"token_title": "Actualizar token para {clientId}",
- "created_at": "Creado en {date}",
+ "created_at": "Creado el {date}",
"confirm_delete": "¿Está seguro de que desea eliminar el token de acceso para {name}?",
"delete_failed": "Error al eliminar el token de acceso.",
- "last_used": "Ultimo uso {fecha} desde {lugar}",
+ "last_used": "Último uso el {date} desde {location}",
"not_used": "Nunca ha sido usado",
"current_token_tooltip": "No se puede eliminar el token actual"
},
@@ -588,7 +588,7 @@
"header": "Tokens de acceso de larga duración",
"description": "Crea tokens de acceso de larga duración para permitir que tus scripts interactúen con tu Home Assistant. Cada token será válido por 10 años desde la creación. Los siguientes tokens de acceso de larga duración están actualmente activos.",
"learn_auth_requests": "Aprenda a realizar solicitudes autenticadas.",
- "created_at": "Creado en {fecha}",
+ "created_at": "Creado el {date}",
"confirm_delete": "¿Está seguro de que desea eliminar el token de acceso para {nombre}?",
"delete_failed": "Error al eliminar el token de acceso.",
"create": "Crear Token",
@@ -596,15 +596,15 @@
"prompt_name": "¿Nombre?",
"prompt_copy_token": "Copie su token de acceso. No se volverá a mostrar.",
"empty_state": "Aún no tienes tokens de acceso de larga duración.",
- "last_used": "Ultimo uso {fecha} desde {lugar}",
+ "last_used": "Último uso el {date} desde {location}",
"not_used": "Nunca ha sido usado"
},
- "current_user": "Actualmente estás conectado como {fullName} .",
+ "current_user": "Has inciado sesión como {fullName} .",
"is_owner": "Eres propietario.",
"logout": "Cerrar sesión",
"change_password": {
"header": "Cambiar Contraseña",
- "current_password": "contraseña actual",
+ "current_password": "Contraseña actual",
"new_password": "Nueva contraseña",
"confirm_new_password": "Confirmar nueva contraseña",
"error_required": "Obligatorio",
@@ -654,7 +654,7 @@
"invalid_code": "Código de autenticación inválido"
},
"abort": {
- "login_expired": "La sesión expiró, por favor inicie sesión de nuevo."
+ "login_expired": "La sesión ha caducado, por favor inicie sesión de nuevo."
}
},
"legacy_api_password": {
@@ -678,7 +678,7 @@
},
"abort": {
"no_api_password_set": "No tienes una contraseña de API configurada.",
- "login_expired": "La sesión expiró, por favor inicie sesión de nuevo."
+ "login_expired": "La sesión ha caducado, por favor inicie sesión de nuevo."
}
},
"trusted_networks": {
@@ -780,7 +780,9 @@
"clear_code": "Limpiar",
"disarm": "Desarmar",
"arm_home": "Armar en casa",
- "arm_away": "Armar fuera de casa"
+ "arm_away": "Armar fuera de casa",
+ "arm_night": "Armado nocturno",
+ "armed_custom_bypass": "Armada zona específica"
},
"automation": {
"last_triggered": "Última activación",
diff --git a/translations/et.json b/translations/et.json
index 49cee8d35a..b13a870c86 100644
--- a/translations/et.json
+++ b/translations/et.json
@@ -26,9 +26,9 @@
"alarm_control_panel": {
"armed": "Valves",
"disarmed": "Maas",
- "armed_home": "Valves kodu",
+ "armed_home": "Valves kodus",
"armed_away": "Valves eemal",
- "armed_night": "Öö-valves",
+ "armed_night": "Valves öine",
"pending": "Ootel",
"arming": "Valvestab",
"disarming": "Maas...",
@@ -578,7 +578,7 @@
"description": "Iga ajutine juurdepääsutõend kehtib ühe seansi jaoks. Ajutised juurdepääsutõendid kustutatakse automaatselt pärast välja logimist. Sinu konto jaoks on praegu aktiivsed järgmised ajutised juurdepääsutõendid.",
"token_title": "Ajutine juurdepääsutõend {clientId} jaoks",
"created_at": "Loodud {date}",
- "confirm_delete": "Oled kindel, et soovid kustutada ajutise juurdepääsutõendi {nimi} jaoks?",
+ "confirm_delete": "Oled kindel, et soovid kustutada ajutise juurdepääsutõendi {name} jaoks?",
"delete_failed": "Ajutise juurdepääsutõendi kustutamine ebaõnnestus.",
"last_used": "Viimati kasutatud {date} asukohast {location}",
"not_used": "Pole kunagi kasutatud",
@@ -589,7 +589,7 @@
"description": "Loo pikaajalised juurdepääsutõendid, mis võimaldavad sinu skriptidel suhelda sinu Home Assistant serveriga. Iga juurdepääsutõend kehtib kümme aastat loomisest alates. Praegu on aktiivsed järgmised pikaajalised juurdepääsutõendid.",
"learn_auth_requests": "Loe, kuidas teha tõendatud päringuid.",
"created_at": "Loodud {date}",
- "confirm_delete": "Oled kindel, et soovid kustutada juurdepääsutõendi {nimi} jaoks?",
+ "confirm_delete": "Oled kindel, et soovid kustutada juurdepääsutõendi {name} jaoks?",
"delete_failed": "Juurdepääsutõendi kustutamine ebaõnnestus.",
"create": "Loo juurdepääsutõend",
"create_failed": "Juurdepääsutõendi loomine ebaõnnestus.",
@@ -614,7 +614,7 @@
"header": "Mitmeastmelise autentimise moodulid",
"disable": "Keela",
"enable": "Luba",
- "confirm_disable": "Oled kindel, et soovid keelata kasutaja {nimi}?"
+ "confirm_disable": "Oled kindel, et soovid keelata kasutaja {name}?"
},
"mfa_setup": {
"title_aborted": "Katkestatud",
@@ -779,8 +779,10 @@
"code": "Kood",
"clear_code": "Puhasta",
"disarm": "Valvest maha",
- "arm_home": "Valvesta kodu",
- "arm_away": "Valves eemal"
+ "arm_home": "Valvesta kodus",
+ "arm_away": "Valvesta eemal",
+ "arm_night": "Valvesta öine",
+ "armed_custom_bypass": "Eranditega"
},
"automation": {
"last_triggered": "Viimati käivitatud",
diff --git a/translations/gsw.json b/translations/gsw.json
index 8b0053e312..069cb85b0e 100644
--- a/translations/gsw.json
+++ b/translations/gsw.json
@@ -9,7 +9,8 @@
"shopping_list": "Ichoufsliste",
"dev-mqtt": "MQTT",
"dev-info": "Info",
- "calendar": "Kaländer"
+ "calendar": "Kaländer",
+ "profile": "Profiu"
},
"state": {
"default": {
@@ -223,6 +224,13 @@
"sunny": "sunnig",
"windy": "windig",
"windy-variant": "windig"
+ },
+ "vacuum": {
+ "cleaning": "Putze",
+ "error": "Fähler",
+ "off": "Us",
+ "on": "I",
+ "paused": "Pause"
}
},
"state_badge": {
@@ -359,6 +367,48 @@
},
"zwave": {
"caption": "Z-Wave"
+ },
+ "users": {
+ "caption": "Benutzer",
+ "picker": {
+ "title": "Benutzer"
+ },
+ "editor": {
+ "rename_user": "Benutzer umbenenne",
+ "delete_user": "Benutzer lösche"
+ }
+ },
+ "integrations": {
+ "caption": "Integratione",
+ "discovered": "Erkennt",
+ "configured": "Konfiguriärt",
+ "configure": "Konfiguriärä",
+ "config_entry": {
+ "manuf": "vo {manufacturer}",
+ "hub": "Verbunge über",
+ "firmware": "Firmware: {version}",
+ "device_unavailable": "Grät verfüägbar",
+ "entity_unavailable": "Entitiy verfüägbar"
+ }
+ }
+ },
+ "profile": {
+ "long_lived_access_tokens": {
+ "create": "Token erzüge",
+ "prompt_name": "Name?"
+ },
+ "is_owner": "Du bisch dr Bsitzer",
+ "logout": "Uslogge",
+ "change_password": {
+ "header": "Passwort wächsle",
+ "current_password": "Aktuells Passwort",
+ "new_password": "Nöis Passwort",
+ "confirm_new_password": "Nöis Passwort bestätige",
+ "error_required": "Benötigt",
+ "submit": "Abschicke"
+ },
+ "mfa": {
+ "disable": "Deaktiviert"
}
}
},
@@ -447,6 +497,18 @@
"media_player": {
"source": "Quelle",
"sound_mode": "Sound-Modus"
+ },
+ "vacuum": {
+ "actions": {
+ "turn_on": "Ischaute",
+ "turn_off": "Ausschaute"
+ }
+ },
+ "water_heater": {
+ "currently": "Aktuell",
+ "on_off": "I \/ Us",
+ "target_temperature": "Ziu-Temperatur",
+ "operation": "Operation"
}
},
"notification_toast": {
@@ -455,7 +517,8 @@
"dialogs": {
"more_info_settings": {
"save": "Spichere",
- "name": "Name"
+ "name": "Name",
+ "entity_id": "Entity ID"
}
}
},
@@ -480,7 +543,8 @@
"switch": "Schauter",
"updater": "Updater",
"weblink": "Weblink",
- "zwave": "Z-Wave"
+ "zwave": "Z-Wave",
+ "vacuum": "Stoubsuger"
},
"attribute": {
"weather": {
diff --git a/translations/he.json b/translations/he.json
index 4dcbe2e007..04161f784b 100644
--- a/translations/he.json
+++ b/translations/he.json
@@ -619,6 +619,7 @@
"mfa_setup": {
"title_aborted": "הופסק",
"title_success": "הצליח!",
+ "step_done": "הגדרה בוצעה עבור {step}",
"close": "סגור",
"submit": "שלח"
}
@@ -779,7 +780,9 @@
"clear_code": "נקה",
"disarm": "לא דרוך",
"arm_home": "דרוך בבית",
- "arm_away": "דרוך לא בבית"
+ "arm_away": "דרוך לא בבית",
+ "arm_night": "דריכה לילית",
+ "armed_custom_bypass": "מעקף מותאם"
},
"automation": {
"last_triggered": "הפעלה אחרונה",
@@ -831,7 +834,11 @@
}
},
"water_heater": {
- "target_temperature": "טמפרטורת היעד"
+ "currently": "כעת",
+ "on_off": "הפעלה \/ כיבוי",
+ "target_temperature": "טמפרטורת היעד",
+ "operation": "פעולה",
+ "away_mode": "מצב מחוץ לבית"
}
},
"components": {
diff --git a/translations/hu.json b/translations/hu.json
index 9afd5b3dbe..14d43a3970 100644
--- a/translations/hu.json
+++ b/translations/hu.json
@@ -529,7 +529,7 @@
},
"cloud": {
"caption": "Home Assistant Felhő",
- "description_login": "Bejelentkezve mint {e-mail}",
+ "description_login": "Bejelentkezve mint {email}",
"description_not_login": "Nincs bejelentkezve"
},
"integrations": {
@@ -780,7 +780,9 @@
"clear_code": "Törlés",
"disarm": "Hatástalanít",
"arm_home": "Élesít (otthon)",
- "arm_away": "Élesít (távozó)"
+ "arm_away": "Élesít (távozó)",
+ "arm_night": "Élesít (éjszakai)",
+ "armed_custom_bypass": "Egyéni áthidalás"
},
"automation": {
"last_triggered": "Utoljára aktiválva",
diff --git a/translations/it.json b/translations/it.json
index 1277ee024f..faa011978b 100644
--- a/translations/it.json
+++ b/translations/it.json
@@ -780,7 +780,9 @@
"clear_code": "Canc",
"disarm": "Disattivato",
"arm_home": "Attivo in casa",
- "arm_away": "Attiva Fuori Casa"
+ "arm_away": "Attiva Fuori Casa",
+ "arm_night": "Attiva Notte",
+ "armed_custom_bypass": "Attiva con bypass"
},
"automation": {
"last_triggered": "Ultima attivazione",
diff --git a/translations/ko.json b/translations/ko.json
index 9d7cb8802c..07ed2e3e1e 100644
--- a/translations/ko.json
+++ b/translations/ko.json
@@ -33,7 +33,7 @@
"arming": "경비중",
"disarming": "해제중",
"triggered": "작동됨",
- "armed_custom_bypass": "경비중(특정지점)"
+ "armed_custom_bypass": "경비중(사용자 우회)"
},
"automation": {
"off": "꺼짐",
@@ -780,7 +780,9 @@
"clear_code": "지움",
"disarm": "경비 해제",
"arm_home": "재실 경비",
- "arm_away": "외출 경비"
+ "arm_away": "외출 경비",
+ "arm_night": "야간 경비",
+ "armed_custom_bypass": "사용자 우회"
},
"automation": {
"last_triggered": "최근 트리거 됨",
diff --git a/translations/lb.json b/translations/lb.json
index 3812b8a3ac..be103f45c2 100644
--- a/translations/lb.json
+++ b/translations/lb.json
@@ -780,7 +780,9 @@
"clear_code": "Kloer",
"disarm": "Desaktivéieren",
"arm_home": "Aktivéiert Doheem",
- "arm_away": "Aktivéiert Ënnerwee"
+ "arm_away": "Aktivéiert Ënnerwee",
+ "arm_night": "Aktivéiert Nuecht",
+ "armed_custom_bypass": "Personaliséierte Bypass"
},
"automation": {
"last_triggered": "Läscht ausgeléist",
diff --git a/translations/nl.json b/translations/nl.json
index cf146f196b..6ec0c54658 100644
--- a/translations/nl.json
+++ b/translations/nl.json
@@ -780,7 +780,9 @@
"clear_code": "Wis",
"disarm": "Uitschakelen",
"arm_home": "Inschakelen thuis",
- "arm_away": "Inschakelen afwezig"
+ "arm_away": "Inschakelen afwezig",
+ "arm_night": "Inschakelen nacht",
+ "armed_custom_bypass": "Aangepaste overbrugging(en)"
},
"automation": {
"last_triggered": "Laatst uitgevoerd",
diff --git a/translations/nn.json b/translations/nn.json
index 38dd122172..b67f0e4d73 100644
--- a/translations/nn.json
+++ b/translations/nn.json
@@ -13,7 +13,8 @@
"dev-templates": "Malar",
"dev-mqtt": "MQTT",
"dev-info": "Info",
- "calendar": "Kalendrar"
+ "calendar": "Kalendrar",
+ "profile": "Perfil"
},
"state": {
"default": {
@@ -379,7 +380,8 @@
"state": {
"label": "Tilstand",
"from": "Frå",
- "to": "Til"
+ "to": "Til",
+ "for": "Para"
},
"homeassistant": {
"label": "Home Assistant",
@@ -524,6 +526,31 @@
"deactivate_user": "Deaktiver brukaren",
"delete_user": "Slett brukar"
}
+ },
+ "cloud": {
+ "caption": "Home Assistant Cloud",
+ "description_login": "Conectado como {email}",
+ "description_not_login": "Ikkje logga inn"
+ },
+ "integrations": {
+ "caption": "Integrações",
+ "description": "Gerenciar dispositivos e serviços conectados",
+ "discovered": "Descoberto",
+ "configured": "Configurado",
+ "new": "Configurar uma nova integração",
+ "configure": "Configurar",
+ "none": "Ainda não configurado",
+ "config_entry": {
+ "no_devices": "Essa integração não possui dispositivos.",
+ "no_device": "Entidades sem dispositivos.",
+ "delete_confirm": "Voc^tem certeza que deseja apagar essa integração?",
+ "restart_confirm": "Reinicie Home Assistant para finalizar essa integração",
+ "manuf": "por {fabricante}",
+ "hub": "Conectado via",
+ "firmware": "Firmware: {versão}",
+ "device_unavailable": "Dispositivo indisponível",
+ "entity_unavailable": "Entidade indisponível"
+ }
}
},
"profile": {
@@ -571,6 +598,30 @@
"empty_state": "Du har ikkje langtidslevande tilgangstoken endå.",
"last_used": "Sist brukt den {date} frå {location}",
"not_used": "Har aldri vore brukt"
+ },
+ "current_user": "Você está atualmente conectado como {NomeCompleto}.",
+ "is_owner": "Du er ein eigar",
+ "logout": "Sair",
+ "change_password": {
+ "header": "Mudar Senha",
+ "current_password": "Senha Atual",
+ "new_password": "Nova Senha",
+ "confirm_new_password": "Confirme Nova Senha",
+ "error_required": "Obrigatório",
+ "submit": "Submeter"
+ },
+ "mfa": {
+ "header": "Módulos de autenticação Multi-fator",
+ "disable": "Desabilitar",
+ "enable": "Habilitar",
+ "confirm_disable": "Você está seguro que deseja desabilitar {nome}?"
+ },
+ "mfa_setup": {
+ "title_aborted": "Abortado",
+ "title_success": "Sucesso!",
+ "step_done": "Configuraçãofeita por {passo}",
+ "close": "Fechar",
+ "submit": "Submeter"
}
},
"page-authorize": {
@@ -729,7 +780,9 @@
"clear_code": "Slett alt",
"disarm": "Skru av",
"arm_home": "Heimemodus",
- "arm_away": "Bortemodus"
+ "arm_away": "Bortemodus",
+ "arm_night": "Acionamento noturno",
+ "armed_custom_bypass": "Atalho configurado"
},
"automation": {
"last_triggered": "Sist utløyst",
@@ -779,6 +832,13 @@
"turn_on": "Skru på",
"turn_off": "Skru av"
}
+ },
+ "water_heater": {
+ "currently": "Atualmente",
+ "on_off": "Liga \/ desliga",
+ "target_temperature": "Temperatura desejada",
+ "operation": "Operação",
+ "away_mode": "Modo distante"
}
},
"components": {
diff --git a/translations/no.json b/translations/no.json
index e4691028e1..0a9c04958f 100644
--- a/translations/no.json
+++ b/translations/no.json
@@ -344,7 +344,7 @@
},
"customize": {
"caption": "Tilpasning",
- "description": "Tilpass dine enheter"
+ "description": "Tilpass dine oppføringer"
},
"automation": {
"caption": "Automatisering",
@@ -381,7 +381,7 @@
"label": "Tilstand",
"from": "Fra",
"to": "Til",
- "for": "Fra"
+ "for": "For"
},
"homeassistant": {
"label": "Home Assistant",
@@ -417,7 +417,7 @@
},
"zone": {
"label": "Sone",
- "entity": "Enhet med posisjon",
+ "entity": "Oppføring med posisjon",
"zone": "Sone",
"event": "Hendelse:",
"enter": "Ankommer",
@@ -530,7 +530,7 @@
"cloud": {
"caption": "Home Assistant Cloud",
"description_login": "Logget inn som {email}",
- "description_not_login": "Ikke logget på"
+ "description_not_login": "Ikke pålogget"
},
"integrations": {
"caption": "Integrasjoner",
@@ -539,17 +539,17 @@
"configured": "Konfigurert",
"new": "Sett opp en ny integrasjon",
"configure": "Konfigurer",
- "none": "Ikke konfigurert enda",
+ "none": "Ingenting er konfigurert enda",
"config_entry": {
"no_devices": "Denne integrasjonen har ingen enheter.",
- "no_device": "Enheten mangler input",
+ "no_device": "Oppføringer uten enheter",
"delete_confirm": "Er du sikker på at du vil slette denne integrasjonen?",
"restart_confirm": "Start Home Assistant på nytt for å fullføre fjerningen av denne integrasjonen",
"manuf": "av {manufacturer}",
"hub": "Tilkoblet via",
"firmware": "Fastvare: {version}",
"device_unavailable": "enheten er utilgjengelig",
- "entity_unavailable": "enhet utilgjengelig"
+ "entity_unavailable": "oppføringen er utilgjengelig"
}
}
},
@@ -780,7 +780,9 @@
"clear_code": "Klarer",
"disarm": "Deaktiver",
"arm_home": "Armer hjemme",
- "arm_away": "Armer bort"
+ "arm_away": "Armer bort",
+ "arm_night": "Armer natt",
+ "armed_custom_bypass": "Tilpasset bypass"
},
"automation": {
"last_triggered": "Sist utløst",
@@ -833,7 +835,7 @@
},
"water_heater": {
"currently": "Temperatur nå",
- "on_off": "På \/ Av",
+ "on_off": "På \/ av",
"target_temperature": "Ønsket temperatur",
"operation": "Drift",
"away_mode": "Bortemodus"
@@ -842,14 +844,14 @@
"components": {
"entity": {
"entity-picker": {
- "entity": "Enhet"
+ "entity": "Oppføring"
}
},
"service-picker": {
"service": "Tjeneste"
},
"relative_time": {
- "past": "For {time} siden",
+ "past": "{time} siden",
"future": "Om {time}",
"never": "Aldri",
"duration": {
@@ -876,7 +878,7 @@
"more_info_settings": {
"save": "Lagre",
"name": "Navn",
- "entity_id": "Enhets ID"
+ "entity_id": "Oppføring ID"
}
},
"auth_store": {
diff --git a/translations/pl.json b/translations/pl.json
index f7ac90e025..8548c00b03 100644
--- a/translations/pl.json
+++ b/translations/pl.json
@@ -330,7 +330,7 @@
"introduction": "Niektóre części Home Assistant'a można przeładować bez konieczności ponownego uruchomienia. Kliknięcie przeładuj spowoduje ponowne wczytanie konfiguracji.",
"core": "Przeładuj rdzeń",
"group": "Przeładuj grupy",
- "automation": "Przeładuj automatyzacje",
+ "automation": "Przeładuj reguły automatyzacji",
"script": "Przeładuj skrypty"
},
"server_management": {
@@ -347,18 +347,18 @@
"description": "Dostosuj swoje encje"
},
"automation": {
- "caption": "Automatyzacja",
- "description": "Twórz i edytuj automatyzacje",
+ "caption": "Reguły automatyzacji",
+ "description": "Twórz i edytuj reguły automatyzacji",
"picker": {
"header": "Edytor automatyzacji",
- "introduction": "Edytor automatyzacji pozwala tworzyć i edytować automatyzację. Przeczytaj [instrukcje](https:\/\/home-assistant.io\/docs\/automation\/editor\/), aby upewnić się, że poprawnie skonfigurowałeś Home Assistant'a.",
- "pick_automation": "Wybierz automatyzację do edycji",
- "no_automations": "Nie znaleziono żadnych edytowalnych automatyzacji",
- "add_automation": "Dodaj automatyzację"
+ "introduction": "Edytor automatyzacji pozwala tworzyć i edytować reguły automatyzacji. Przeczytaj [instrukcje](https:\/\/home-assistant.io\/docs\/automation\/editor\/), aby upewnić się, że poprawnie skonfigurowałeś Home Assistant'a.",
+ "pick_automation": "Wybierz regułę automatyzacji do edycji",
+ "no_automations": "Nie znaleziono żadnych edytowalnych reguł automatyzacji",
+ "add_automation": "Dodaj regułę automatyzacji"
},
"editor": {
- "introduction": "Użyj automatyzacji, aby utrzymać swój dom przy życiu",
- "default_name": "Nowa automatyzacja",
+ "introduction": "Użyj reguł automatyzacji, aby utrzymać swój dom przy życiu",
+ "default_name": "Nowa reguła automatyzacji",
"save": "Zapisz",
"unsaved_confirm": "Masz niezapisane zmiany. Jesteś pewny, że chcesz wyjść?",
"alias": "Nazwa",
@@ -515,7 +515,7 @@
},
"users": {
"caption": "Użytkownicy",
- "description": "Zarządzanie użytkownikami",
+ "description": "Zarządzaj użytkownikami",
"picker": {
"title": "Użytkownicy"
},
@@ -779,8 +779,10 @@
"code": "Kod",
"clear_code": "Wyczyść",
"disarm": "Rozbrojony",
- "arm_home": "Uzbrojony (w domu)",
- "arm_away": "Uzbrojony (nieobecny)"
+ "arm_home": "uzbrojony (w domu)",
+ "arm_away": "uzbrojony (nieobecny)",
+ "arm_night": "uzbrojony (noc)",
+ "armed_custom_bypass": "uzbrojony (częściowo)"
},
"automation": {
"last_triggered": "Ostatnie uruchomienie",
diff --git a/translations/pt-BR.json b/translations/pt-BR.json
index 3e5ea87fe5..1e4e56623a 100644
--- a/translations/pt-BR.json
+++ b/translations/pt-BR.json
@@ -134,7 +134,7 @@
"off": "Desligado",
"on": "Ligado",
"heat": "Quente",
- "cool": "Fresco",
+ "cool": "Frio",
"idle": "Ocioso",
"auto": "Automático",
"dry": "Seco",
@@ -381,7 +381,7 @@
"label": "Estado",
"from": "De",
"to": "Para",
- "for": "Para"
+ "for": "Por"
},
"homeassistant": {
"label": "",
@@ -780,7 +780,9 @@
"clear_code": "Limpar",
"disarm": "Desarmar",
"arm_home": "Armar em casa",
- "arm_away": "Armar ausente"
+ "arm_away": "Armar ausente",
+ "arm_night": "Acionamento noturno",
+ "armed_custom_bypass": "Atalho personalizado"
},
"automation": {
"last_triggered": "Último disparo",
diff --git a/translations/pt.json b/translations/pt.json
index ffe5be5f76..0c67c902a2 100644
--- a/translations/pt.json
+++ b/translations/pt.json
@@ -780,7 +780,9 @@
"clear_code": "Limpo",
"disarm": "Desarmar",
"arm_home": "Armado casa",
- "arm_away": "Armado ausente"
+ "arm_away": "Armado ausente",
+ "arm_night": "Armado noite",
+ "armed_custom_bypass": "Desvio personalizado"
},
"automation": {
"last_triggered": "Última ocorrência",
diff --git a/translations/ru.json b/translations/ru.json
index 01470af6e9..4bd1bfc937 100644
--- a/translations/ru.json
+++ b/translations/ru.json
@@ -780,7 +780,9 @@
"clear_code": "Очистить",
"disarm": "Без охраны",
"arm_home": "Охрана (дома)",
- "arm_away": "Охрана (не дома)"
+ "arm_away": "Охрана (не дома)",
+ "arm_night": "Ночная охрана",
+ "armed_custom_bypass": "Охрана с исключениями"
},
"automation": {
"last_triggered": "Последний запуск",
diff --git a/translations/sl.json b/translations/sl.json
index 503b5f6a4f..77cdf04e24 100644
--- a/translations/sl.json
+++ b/translations/sl.json
@@ -780,7 +780,9 @@
"clear_code": "Počisti",
"disarm": "Izklopi",
"arm_home": "Vklopi doma",
- "arm_away": "Vklopi odsoten"
+ "arm_away": "Vklopi odsoten",
+ "arm_night": "Vklopi nočni način",
+ "armed_custom_bypass": "Po meri"
},
"automation": {
"last_triggered": "Nazadnje sprožen",
diff --git a/translations/sv.json b/translations/sv.json
index dd7189df57..0ad503267c 100644
--- a/translations/sv.json
+++ b/translations/sv.json
@@ -780,7 +780,9 @@
"clear_code": "Rensa",
"disarm": "Larma från",
"arm_home": "Larma hemmaläge",
- "arm_away": "Larma bortaläge"
+ "arm_away": "Larma bortaläge",
+ "arm_night": "Nattlarmat",
+ "armed_custom_bypass": "Larm förbikopplat"
},
"automation": {
"last_triggered": "Utlöstes senast",
diff --git a/translations/th.json b/translations/th.json
index ccfbb49411..5a8e477257 100644
--- a/translations/th.json
+++ b/translations/th.json
@@ -252,6 +252,12 @@
"sunny": "แดดจัด",
"windy": "ลมแรง",
"windy-variant": "ลมแรง"
+ },
+ "vacuum": {
+ "cleaning": "กำลังทำความสะอาด",
+ "idle": "ว่าง",
+ "off": "ปิด",
+ "on": "เปิด"
}
},
"state_badge": {
@@ -368,7 +374,8 @@
"state": {
"label": "สถานะ",
"from": "จาก",
- "to": "ไปยัง"
+ "to": "ไปยัง",
+ "for": "ถึง"
},
"homeassistant": {
"label": "Home Assistant",
@@ -499,6 +506,47 @@
"zwave": {
"caption": "Z-Wave",
"description": "จัดการเครือข่าย Z-Wave"
+ },
+ "cloud": {
+ "description_login": "ลงชื่อเข้าใช้เป็น {email}"
+ },
+ "integrations": {
+ "config_entry": {
+ "delete_confirm": "แน่ใจหรือว่าต้องการจะลบการบูรณาการนี้",
+ "restart_confirm": "เริ่ม Home Assistant ใหม่หลังจากลบการบูรณาการนี้",
+ "manuf": "โดย {manufacturer}",
+ "hub": "เชื่อมต่อแล้ว",
+ "firmware": "เฟิร์มแวร์: {version}"
+ }
+ }
+ },
+ "page-authorize": {
+ "form": {
+ "providers": {
+ "legacy_api_password": {
+ "abort": {
+ "login_expired": "เซสชั่นหมดอายุ โปรดเข้าสู่ระบบใหม่"
+ }
+ }
+ }
+ }
+ },
+ "profile": {
+ "long_lived_access_tokens": {
+ "confirm_delete": "คุณแน่ใจหรือไม่ว่าต้องการลบโทเค็นการเข้าถึงของ {name} ?"
+ },
+ "current_user": "ขณะนี้คุณเข้าสู่ระบบในชื่อ {fullName}",
+ "change_password": {
+ "header": "เปลี่ยนรหัสผ่าน",
+ "current_password": "รหัสผ่านปัจจุบัน"
+ },
+ "mfa": {
+ "disable": "ปิดการใช้งาน",
+ "enable": "เปิดใช้งาน",
+ "confirm_disable": "คุณแน่ใจหรือไม่ว่าต้องการปิดใช้งาน {name} ?"
+ },
+ "mfa_setup": {
+ "title_success": "งานสำเร็จ!"
}
}
},
@@ -510,6 +558,11 @@
"loading": "กำลังโหลด",
"cancel": "ยกเลิก"
},
+ "duration": {
+ "day": "วัน",
+ "week": "สัปดาห์",
+ "second": "วินาที"
+ },
"login-form": {
"password": "รหัสผ่าน",
"remember": "จดจำ",
@@ -555,6 +608,48 @@
"wsw": "ทิศหรดีเฉียงตะวันตก"
},
"forecast": "พยากรณ์"
+ },
+ "alarm_control_panel": {
+ "disarm": "ปิดระบบสัญญาณกันขโมย"
+ },
+ "automation": {
+ "last_triggered": "การทำงานครั้งล่าสุด",
+ "trigger": "การทำงาน"
+ },
+ "cover": {
+ "position": "ตำแหน่ง",
+ "tilt_position": "ตำแหน่งการเอียง"
+ },
+ "fan": {
+ "speed": "ความเร็วลม",
+ "oscillate": "การส่าย",
+ "direction": "ทิศทาง"
+ },
+ "light": {
+ "brightness": "ความสว่าง",
+ "color_temperature": "อุณหภูมิสี",
+ "white_value": "ค่าสีขาว",
+ "effect": "ลูกเล่น"
+ },
+ "media_player": {
+ "text_to_speak": "ข้อความที่จะให้ออกเสียง"
+ },
+ "climate": {
+ "currently": "ในขณะนี้",
+ "on_off": "เปิด \/ ปิด",
+ "target_temperature": "อุณหภูมิที่ต้องการ",
+ "target_humidity": "ค่าความชื้นที่ต้องการ"
+ },
+ "vacuum": {
+ "actions": {
+ "turn_on": "เปิดใข้งาน",
+ "turn_off": "ปิดใข้งาน"
+ }
+ },
+ "water_heater": {
+ "currently": "ในขณะนี้",
+ "on_off": "เปิด \/ ปิด",
+ "target_temperature": "อุณหภูมิ"
}
},
"components": {
@@ -565,6 +660,23 @@
},
"service-picker": {
"service": "บริการ"
+ },
+ "relative_time": {
+ "past": "{time} ที่ผ่านมา",
+ "future": "ในเวลา {time}",
+ "never": "ไม่เคย"
+ },
+ "history_charts": {
+ "loading_history": "กำลังโหลดประวัติการทำงาน ...",
+ "no_history_found": "ไม่พบประวัติการทำงาน"
+ }
+ },
+ "notification_toast": {
+ "connection_lost": "สูญเสียการเชื่อมต่อ ดำเนินการเชื่อมต่อใหม่..."
+ },
+ "dialogs": {
+ "more_info_settings": {
+ "entity_id": "รหัสเอนทิตี"
}
}
},
@@ -603,7 +715,8 @@
"switch": "สวิตซ์",
"updater": "อัพเดต",
"weblink": "เว็บลิงค์",
- "zwave": "Z-Wave"
+ "zwave": "Z-Wave",
+ "vacuum": "เครื่องดูดฝุ่น"
},
"attribute": {
"weather": {
diff --git a/translations/uk.json b/translations/uk.json
index 3513e45ff6..79879b6dae 100644
--- a/translations/uk.json
+++ b/translations/uk.json
@@ -600,7 +600,8 @@
"clear_code": "Очистити",
"disarm": "Зняття з охорони",
"arm_home": "Поставити на охорону",
- "arm_away": "Охорона (не вдома)"
+ "arm_away": "Охорона (не вдома)",
+ "arm_night": "Нічна охорона"
},
"automation": {
"last_triggered": "Спрацьовано",
diff --git a/translations/vi.json b/translations/vi.json
index bc74bf3c06..2d5e58e6bc 100644
--- a/translations/vi.json
+++ b/translations/vi.json
@@ -510,12 +510,14 @@
"none": "Chưa có cấu hình nào",
"config_entry": {
"no_devices": "Bộ tích hợp này chưa có thiết bị nào",
+ "no_device": "Các mục không có thiết bị",
"delete_confirm": "Bạn chắc chắn muốn xóa bộ tích hợp này?",
"restart_confirm": "Khởi động lại Home Assistant để hoàn tất xóa bộ tích hợp này",
"manuf": "bởi {manufacturer}",
"hub": "Đã kết nối qua",
"firmware": "Firmware: {version}",
- "device_unavailable": "thiết bị không khả dụng"
+ "device_unavailable": "Thiết bị không khả dụng",
+ "entity_unavailable": "Thiết bị không khả dụng"
}
}
},
@@ -540,12 +542,20 @@
"dropdown_label": "Giao diện"
},
"refresh_tokens": {
+ "header": "Token",
+ "description": "Mỗi mã token đại diện cho một phiên đăng nhập. Token sẽ được tự động loại bỏ khi bạn bấm vào đăng xuất. Những token đang hoạt động với tài khoản của bạn là:",
+ "token_title": "Làm mới token cho {clientId}",
"created_at": "Được tạo lúc {date}",
+ "confirm_delete": "Bạn có chắn chắn muốn xóa token truy cập {name}?",
+ "delete_failed": "Không thể xóa token truy cập.",
"last_used": "Sử dụng lần cuối lúc {date} từ {location}",
- "not_used": "Chưa bao giờ được sử dụng"
+ "not_used": "Chưa bao giờ được sử dụng",
+ "current_token_tooltip": "Không thể xóa token truy cập"
},
"long_lived_access_tokens": {
"header": "Token truy cập thời hạn dài",
+ "description": "Tạo mã truy cập tồn tại lâu dài để cho phép script của bạn tương tác với Home assistant. Mỗi mã truy cập sẽ có hiệu lực trong 10 năm kể từ khi tạo. Các mã truy cập hiện đang hoạt động được thể hiện trong danh sách sau.",
+ "learn_auth_requests": "Làm thế nào để thực hiện yêu cầu xác thực.",
"created_at": "Được tạo lúc {date}",
"confirm_delete": "Bạn có chắn chắn muốn xóa token truy cập {name}?",
"delete_failed": "Không thể xóa token truy cập.",
@@ -553,6 +563,7 @@
"create_failed": "Không thể tạo token truy cập.",
"prompt_name": "Tên?",
"prompt_copy_token": "Sao chép token truy cập của bạn. Nó sẽ không đươc hiển thị nữa.",
+ "empty_state": "Bạn hiện tại chưa có token truy cập lâu dài",
"last_used": "Sử dụng lần cuối lúc {date} từ {location}",
"not_used": "Chưa bao giờ được sử dụng"
},
@@ -736,7 +747,9 @@
"clear_code": "Xóa",
"disarm": "Vô hiệu hoá",
"arm_home": "An ninh ở nhà",
- "arm_away": "An ninh đi vắng"
+ "arm_away": "An ninh đi vắng",
+ "arm_night": "An ninh ban đêm",
+ "armed_custom_bypass": "Bỏ qua tùy chỉnh"
},
"automation": {
"last_triggered": "Kích hoạt lần cuối",
@@ -788,7 +801,11 @@
}
},
"water_heater": {
- "currently": "Hiện tại"
+ "currently": "Hiện tại",
+ "on_off": "Bật \/ tắt",
+ "target_temperature": "Nhiệt độ mục tiêu",
+ "operation": "Chế độ hoạt động",
+ "away_mode": "Chế độ đi vắng"
}
},
"components": {
diff --git a/translations/zh-Hans.json b/translations/zh-Hans.json
index 58f8d74de5..53959b9bf3 100644
--- a/translations/zh-Hans.json
+++ b/translations/zh-Hans.json
@@ -780,7 +780,9 @@
"clear_code": "清除",
"disarm": "解除警戒",
"arm_home": "在家警戒",
- "arm_away": "离家警戒"
+ "arm_away": "离家警戒",
+ "arm_night": "夜间警戒",
+ "armed_custom_bypass": "自定义略过"
},
"automation": {
"last_triggered": "上次触发",
diff --git a/translations/zh-Hant.json b/translations/zh-Hant.json
index 9fca96a9ad..05b409bbdf 100644
--- a/translations/zh-Hant.json
+++ b/translations/zh-Hant.json
@@ -780,7 +780,9 @@
"clear_code": "清除",
"disarm": "解除警戒",
"arm_home": "在家警戒",
- "arm_away": "離家警戒"
+ "arm_away": "離家警戒",
+ "arm_night": "夜間警戒",
+ "armed_custom_bypass": "自定義忽略"
},
"automation": {
"last_triggered": "上次觸發",
diff --git a/webpack.config.js b/webpack.config.js
index 87b7105aed..4bc3fb1cc4 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -41,7 +41,7 @@ function createConfig(isProdBuild, latestBuild) {
app: "./src/entrypoints/app.js",
authorize: "./src/entrypoints/authorize.js",
onboarding: "./src/entrypoints/onboarding.js",
- core: "./src/entrypoints/core.js",
+ core: "./src/entrypoints/core.ts",
compatibility: "./src/entrypoints/compatibility.js",
"custom-panel": "./src/entrypoints/custom-panel.js",
"hass-icons": "./src/entrypoints/hass-icons.js",
@@ -173,7 +173,7 @@ function createConfig(isProdBuild, latestBuild) {
swDest: "service_worker.js",
importWorkboxFrom: "local",
include: [
- /core.js$/,
+ /core.ts$/,
/app.js$/,
/custom-panel.js$/,
/hass-icons.js$/,
diff --git a/yarn.lock b/yarn.lock
index 38b4426f63..c2efe9bb1e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1039,7 +1039,7 @@
"@polymer/iron-meta" "^3.0.0-pre.26"
"@polymer/polymer" "^3.0.0"
-"@polymer/lit-element@^0.6.2":
+"@polymer/lit-element@0.6.2", "@polymer/lit-element@^0.6.2":
version "0.6.2"
resolved "https://registry.yarnpkg.com/@polymer/lit-element/-/lit-element-0.6.2.tgz#589f2fa19e84d23c1debb2c329cbab758ae30581"
integrity sha512-4NWvK6SyAyyeW1mQ24ZVR+rtqZNHZ2JWnVTsPF/1iXnmmPwnpLs8mz0HRqz5adyoyt96ed/y2dsDwGBktJYyew==
@@ -1372,10 +1372,10 @@
dependencies:
any-observable "^0.3.0"
-"@sinonjs/commons@^1.0.2":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.0.2.tgz#3e0ac737781627b8844257fadc3d803997d0526e"
- integrity sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw==
+"@sinonjs/commons@^1.2.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849"
+ integrity sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==
dependencies:
type-detect "4.0.8"
@@ -1449,7 +1449,7 @@
dependencies:
"@types/chai" "*"
-"@types/chai@*":
+"@types/chai@*", "@types/chai@^4.1.7":
version "4.1.7"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
@@ -1624,6 +1624,11 @@
resolved "https://registry.yarnpkg.com/@types/is-windows/-/is-windows-0.2.0.tgz#6f24ee48731d31168ea510610d6dd15e5fc9c6ff"
integrity sha1-byTuSHMdMRaOpRBhDW3RXl/Jxv8=
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
"@types/launchpad@^0.6.0":
version "0.6.0"
resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.0.tgz#37296109b7f277f6e6c5fd7e0c0706bc918fbb51"
@@ -1646,6 +1651,11 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+"@types/mocha@^5.2.5":
+ version "5.2.5"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.5.tgz#8a4accfc403c124a0bafe8a9fc61a05ec1032073"
+ integrity sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==
+
"@types/mz@0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.29.tgz#bc24728c649973f1c7851e9033f9ce525668c27b"
@@ -3777,7 +3787,7 @@ buffer-fill@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
-buffer-from@^1.0.0:
+buffer-from@^1.0.0, buffer-from@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
@@ -3965,7 +3975,7 @@ chai@^3.5.0:
deep-eql "^0.1.3"
type-detect "^1.0.0"
-chai@^4.1.2:
+chai@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
@@ -4939,6 +4949,11 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+deepmerge@^2.0.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170"
+ integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==
+
default-gateway@^2.6.0:
version "2.7.2"
resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f"
@@ -6210,9 +6225,9 @@ fd-slicer@~1.1.0:
dependencies:
pend "~1.2.0"
-fecha@^2.3.3, "fecha@https://github.com/balloob/fecha/archive/51d14fd0eb4781e2ecf265d1c3080706259133b5.tar.gz":
- version "2.3.3"
- resolved "https://github.com/balloob/fecha/archive/51d14fd0eb4781e2ecf265d1c3080706259133b5.tar.gz#bfb1e49121dd7821601af35faf4fe93dbd19200a"
+fecha@^2.3.3, "fecha@https://github.com/taylorhakes/fecha/archive/5e8fe08d982647fdb19fb403459838b02647813c.tar.gz":
+ version "3.0.0"
+ resolved "https://github.com/taylorhakes/fecha/archive/5e8fe08d982647fdb19fb403459838b02647813c.tar.gz#aec1831322f371389326199010df524ccfa9ab73"
figgy-pudding@^3.1.0, figgy-pudding@^3.5.1:
version "3.5.1"
@@ -7426,10 +7441,10 @@ hoek@4.x.x:
resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb"
integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==
-home-assistant-js-websocket@^3.1.5:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-3.1.5.tgz#56358660bbccb5f24e16f9197bbad12739f9b756"
- integrity sha512-BlANSkA9ob6wlUJCYS26n1tfMla+aJzB2rhhXSFi0iiTtWWfuOlcSOw8pxjeWhh1I9oAcbQ4qxhB7Np1EXG+Og==
+home-assistant-js-websocket@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/home-assistant-js-websocket/-/home-assistant-js-websocket-3.2.4.tgz#0c4212e6ac57b60ed939aa420253994e4f9f0bef"
+ integrity sha512-DaHpWIjJFLwTWNbHeGSCEUsbeyLUWAyWUgsYkiVWxzbfm+vqC5YaLNRu+Ma64SQYh5yGSYr7h25p2hip1GvyhQ==
home-or-tmp@^2.0.0:
version "2.0.0"
@@ -8710,7 +8725,7 @@ listr@^0.14.2:
p-map "^1.1.1"
rxjs "^6.1.0"
-lit-html@^0.12.0:
+lit-html@0.12.0, lit-html@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/lit-html/-/lit-html-0.12.0.tgz#d994420fda74744f9d4a79401b086de929643e6a"
integrity sha512-NyFgq8yTlGEjUFQOmNnK/kj+ZdDVJzTwsLunNSewGiOns7SjuJi6ymCCqzZZ81uW2VwEmliMbOlFZc9QmOJPLA==
@@ -9334,6 +9349,11 @@ make-dir@^1.0.0, make-dir@^1.1.0:
dependencies:
pify "^3.0.0"
+make-error@^1.1.1:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8"
+ integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==
+
map-age-cleaner@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74"
@@ -11128,9 +11148,9 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2"
prettier@^1.14.3:
- version "1.14.3"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895"
- integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==
+ version "1.15.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.1.tgz#06c67106afb1b40e74b002353b2079cc7e0e67bf"
+ integrity sha512-4rgV2hyc/5Pk0XHH4VjJWHRgVjgRbpMfLQjREAhHBtyW1UvTFkjJEsueGYNYYZd9mn97K+1qv0EBwm11zoaSgA==
pretty-bytes@^4.0.2:
version "4.0.2"
@@ -12321,12 +12341,12 @@ sinon@^2.3.5:
text-encoding "0.6.4"
type-detect "^4.0.0"
-sinon@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.1.0.tgz#819b63002ee09a90a3b50a0da4e0bdecb2e3f345"
- integrity sha512-ffASxced8xr8eU0EGyfj9K++bRCtv/NyOFOxl7UBD86YH97oZjVxvecMhObwRlXe27GRUa6rVFEn67khPZ29rQ==
+sinon@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.1.1.tgz#1202f317aa14d93cb9b69ff50b6bd49c0e05ffc9"
+ integrity sha512-iYagtjLVt1vN3zZY7D8oH7dkjNJEjLjyuzy8daX5+3bbQl8gaohrheB9VfH1O3L6LKuue5WTJvFluHiuZ9y3nQ==
dependencies:
- "@sinonjs/commons" "^1.0.2"
+ "@sinonjs/commons" "^1.2.0"
"@sinonjs/formatio" "^3.0.0"
"@sinonjs/samsam" "^2.1.2"
diff "^3.5.0"
@@ -12503,6 +12523,14 @@ source-map-support@^0.4.15:
dependencies:
source-map "^0.5.6"
+source-map-support@^0.5.6:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+ integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map-url@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
@@ -12513,7 +12541,7 @@ source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7, sourc
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -13251,6 +13279,40 @@ triple-beam@^1.2.0, triple-beam@^1.3.0:
resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9"
integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==
+ts-mocha@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-2.0.0.tgz#0dbd3cd04671df9933b9303b4aa46347573c5635"
+ integrity sha512-Rj6+vvwKtOTs5GsNO1jLl4DIXUGnyAg5HFt2Yb4SHIRN45clTJkHWpNdTxCSL0u+1oeavSYJah6d1PZ++Ju5pw==
+ dependencies:
+ ts-node "7.0.0"
+ optionalDependencies:
+ tsconfig-paths "^3.5.0"
+
+ts-node@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.0.tgz#a94a13c75e5e1aa6b82814b84c68deb339ba7bff"
+ integrity sha512-klJsfswHP0FuOLsvBZ/zzCfUvakOSSxds78mVeK7I+qP76YWtxf16hEZsp3U+b0kIo82R5UatGFeblYMqabb2Q==
+ dependencies:
+ arrify "^1.0.0"
+ buffer-from "^1.1.0"
+ diff "^3.1.0"
+ make-error "^1.1.1"
+ minimist "^1.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.5.6"
+ yn "^2.0.0"
+
+tsconfig-paths@^3.5.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.6.0.tgz#f14078630d9d6e8b1dc690c1fc0cfb9cd0663891"
+ integrity sha512-mrqQIP2F4e03aMTCiPdedCIT300//+q0ET53o5WqqtQjmEICxP9yfz/sHTpPqXpssuJEzODsEzJaLRaf5J2X1g==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ deepmerge "^2.0.1"
+ json5 "^1.0.1"
+ minimist "^1.2.0"
+ strip-bom "^3.0.0"
+
tslib@1.9.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
@@ -14645,6 +14707,11 @@ yeoman-generator@^3.1.1:
through2 "^2.0.0"
yeoman-environment "^2.0.5"
+yn@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a"
+ integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=
+
zip-stream@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"
+ [[localize('ui.panel.mailbox.playback_title')]]
+
+
+
+
+
+
+
+
+ - [[localize('ui.panel.profile.long_lived_access_tokens.description')]] - - [[localize('ui.panel.profile.long_lived_access_tokens.learn_auth_requests')]] - -
- -[[localize('ui.panel.profile.long_lived_access_tokens.empty_state')]]
+ ++ [[localize('ui.panel.profile.long_lived_access_tokens.description')]] + + [[localize('ui.panel.profile.long_lived_access_tokens.learn_auth_requests')]] + +
+ ++ [[localize('ui.panel.profile.long_lived_access_tokens.empty_state')]] +
+ +- - [[localize('ui.panel.profile.mfa_setup.title_aborted')]] - - - [[localize('ui.panel.profile.mfa_setup.title_success')]] - - - [[_computeStepTitle(localize, _step)]] - -
-
-
+ [[localize('ui.panel.profile.mfa_setup.title_aborted')]]
-
- [[localize('ui.panel.profile.mfa_setup.step_done', 'step', _step.title)]]
+ [[localize('ui.panel.profile.mfa_setup.title_success')]]
-
-
-
+ [[_computeStepTitle(localize, _step)]]
+
+
+ + [[localize('ui.panel.profile.mfa_setup.step_done', 'step', + _step.title)]] +
+ + + + +