-
-
-
Add-on Security Rating
-
- Hass.io provides a security rating to each of the add-ons, which indicates the risks involved when using this add-on. The more access an add-on requires on your system, the lower the score, thus raising the possible security risks.
-
+
+
+
Show in sidebar
+
+
+ This option requires Home Assistant 0.92 or later.
+
+
+
-
Protection mode
+
+ Protection mode
+
+
+ Grant the add-on elevated system access.
+
+
-
-
-
@@ -580,5 +599,14 @@ class HassioAddonInfo extends EventsMixin(PolymerElement) {
this.fire("hass-api-called", eventData);
});
}
+
+ _computeCannotIngressSidebar(hass, addon) {
+ return !addon.ingress || !this._computeHA92plus(hass);
+ }
+
+ _computeHA92plus(hass) {
+ const [major, minor] = hass.config.version.split(".", 2);
+ return Number(major) > 0 || (major === "0" && Number(minor) >= 92);
+ }
}
customElements.define("hassio-addon-info", HassioAddonInfo);
diff --git a/setup.py b/setup.py
index bbb3e0c5cd..0e754b6250 100644
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
- version="20190424.0",
+ version="20190427.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",
diff --git a/src/cards/ha-media_player-card.js b/src/cards/ha-media_player-card.js
index e24f08cb68..6a08bb01c9 100644
--- a/src/cards/ha-media_player-card.js
+++ b/src/cards/ha-media_player-card.js
@@ -279,6 +279,14 @@ class HaMediaPlayerCard extends LocalizeMixin(EventsMixin(PolymerElement)) {
}
// We have a new picture url
+ // If entity picture is non-relative, we use that url directly.
+ if (picture.substr(0, 1) !== "/") {
+ this._coverShowing = true;
+ this._coverLoadError = false;
+ this.$.cover.style.backgroundImage = `url(${picture})`;
+ return;
+ }
+
try {
const {
content_type: contentType,
diff --git a/src/common/dom/stop_propagation.ts b/src/common/dom/stop_propagation.ts
new file mode 100644
index 0000000000..b04b2156c0
--- /dev/null
+++ b/src/common/dom/stop_propagation.ts
@@ -0,0 +1 @@
+export const stopPropagation = (ev) => ev.stopPropagation();
diff --git a/src/components/ha-date-input.ts b/src/components/ha-date-input.ts
new file mode 100644
index 0000000000..4157d70af9
--- /dev/null
+++ b/src/components/ha-date-input.ts
@@ -0,0 +1,126 @@
+import {
+ html,
+ css,
+ LitElement,
+ TemplateResult,
+ property,
+ customElement,
+} from "lit-element";
+
+import "@polymer/paper-input/paper-input";
+// tslint:disable-next-line:no-duplicate-imports
+import { PaperInputElement } from "@polymer/paper-input/paper-input";
+
+@customElement("ha-date-input")
+export class HaDateInput extends LitElement {
+ @property() public year?: string;
+ @property() public month?: string;
+ @property() public day?: string;
+ @property({ type: Boolean }) public disabled = false;
+
+ static get styles() {
+ return css`
+ :host {
+ display: block;
+ font-family: var(--paper-font-common-base_-_font-family);
+ -webkit-font-smoothing: var(
+ --paper-font-common-base_-_-webkit-font-smoothing
+ );
+ }
+
+ paper-input {
+ width: 30px;
+ text-align: center;
+ --paper-input-container-input_-_-moz-appearance: textfield;
+ --paper-input-container-input-webkit-spinner_-_-webkit-appearance: none;
+ --paper-input-container-input-webkit-spinner_-_margin: 0;
+ --paper-input-container-input-webkit-spinner_-_display: none;
+ }
+
+ paper-input#year {
+ width: 50px;
+ }
+
+ .date-input-wrap {
+ display: flex;
+ flex-direction: row;
+ }
+ `;
+ }
+
+ protected render(): TemplateResult {
+ return html`
+
+ `;
+ }
+
+ private _formatYear() {
+ const yearElement = this.shadowRoot!.getElementById(
+ "year"
+ ) as PaperInputElement;
+ this.year = yearElement.value!;
+ }
+
+ private _formatMonth() {
+ const monthElement = this.shadowRoot!.getElementById(
+ "month"
+ ) as PaperInputElement;
+ this.month = ("0" + monthElement.value!).slice(-2);
+ }
+
+ private _formatDay() {
+ const dayElement = this.shadowRoot!.getElementById(
+ "day"
+ ) as PaperInputElement;
+ this.day = ("0" + dayElement.value!).slice(-2);
+ }
+
+ get value() {
+ return `${this.year}-${this.month}-${this.day}`;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "ha-date-input": HaDateInput;
+ }
+}
diff --git a/src/components/paper-time-input.js b/src/components/paper-time-input.js
index 59c819858a..3fec74281a 100644
--- a/src/components/paper-time-input.js
+++ b/src/components/paper-time-input.js
@@ -23,7 +23,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
-class PaperTimeInput extends PolymerElement {
+export class PaperTimeInput extends PolymerElement {
static get template() {
return html`
-
- [[localize('ui.panel.config.integrations.new')]]
-
-
-
-
- [[_computeIntegrationTitle(localize, item)]]
-
-
[[localize('ui.panel.config.integrations.configure')]]
-
-
-
-
+
`;
}
@@ -162,6 +176,12 @@ class HaConfigManagerDashboard extends LocalizeMixin(
progress: Array,
handlers: Array,
+
+ rtl: {
+ type: Boolean,
+ reflectToAttribute: true,
+ computed: "_computeRTL(hass)",
+ },
};
}
@@ -170,17 +190,14 @@ class HaConfigManagerDashboard extends LocalizeMixin(
loadConfigFlowDialog();
}
- _createFlow(ev) {
+ _createFlow() {
showConfigFlowDialog(this, {
- hass: this.hass,
- newFlowForHandler: ev.model.item,
dialogClosedCallback: () => this.fire("hass-reload-entries"),
});
}
_continueFlow(ev) {
showConfigFlowDialog(this, {
- hass: this.hass,
continueFlowId: ev.model.item.flow_id,
dialogClosedCallback: () => this.fire("hass-reload-entries"),
});
@@ -230,6 +247,10 @@ class HaConfigManagerDashboard extends LocalizeMixin(
_handleMoreInfo(ev) {
this.fire("hass-more-info", { entityId: ev.model.item.entity_id });
}
+
+ _computeRTL(hass) {
+ return computeRTL(hass);
+ }
}
customElements.define("ha-config-entries-dashboard", HaConfigManagerDashboard);
diff --git a/src/panels/lovelace/common/compute-tooltip.ts b/src/panels/lovelace/common/compute-tooltip.ts
index 87f921319d..f3e77143f2 100644
--- a/src/panels/lovelace/common/compute-tooltip.ts
+++ b/src/panels/lovelace/common/compute-tooltip.ts
@@ -11,6 +11,10 @@ interface Config extends LovelaceElementConfig {
}
export const computeTooltip = (hass: HomeAssistant, config: Config): string => {
+ if (config.title === null) {
+ return "";
+ }
+
if (config.title) {
return config.title;
}
@@ -26,10 +30,10 @@ export const computeTooltip = (hass: HomeAssistant, config: Config): string => {
}
const tapTooltip = config.tap_action
- ? computeActionTooltip(stateName, config.tap_action, false)
+ ? computeActionTooltip(hass, stateName, config.tap_action, false)
: "";
const holdTooltip = config.hold_action
- ? computeActionTooltip(stateName, config.hold_action, true)
+ ? computeActionTooltip(hass, stateName, config.hold_action, true)
: "";
const newline = tapTooltip && holdTooltip ? "\n" : "";
@@ -40,6 +44,7 @@ export const computeTooltip = (hass: HomeAssistant, config: Config): string => {
};
function computeActionTooltip(
+ hass: HomeAssistant,
state: string,
config: ActionConfig,
isHold: boolean
@@ -48,20 +53,39 @@ function computeActionTooltip(
return "";
}
- let tooltip = isHold ? "Hold: " : "Tap: ";
+ let tooltip =
+ (isHold
+ ? hass.localize("ui.panel.lovelace.cards.picture-elements.hold")
+ : hass.localize("ui.panel.lovelace.cards.picture-elements.tap")) + " ";
switch (config.action) {
case "navigate":
- tooltip += `Navigate to ${config.navigation_path}`;
+ tooltip += `${hass.localize(
+ "ui.panel.lovelace.cards.picture-elements.navigate_to",
+ "location",
+ config.navigation_path
+ )}`;
break;
case "toggle":
- tooltip += `Toggle ${state}`;
+ tooltip += `${hass.localize(
+ "ui.panel.lovelace.cards.picture-elements.toggle",
+ "name",
+ state
+ )}`;
break;
case "call-service":
- tooltip += `Call service ${config.service}`;
+ tooltip += `${hass.localize(
+ "ui.panel.lovelace.cards.picture-elements.call_service",
+ "name",
+ config.service
+ )}`;
break;
case "more-info":
- tooltip += `Show more-info: ${state}`;
+ tooltip += `${hass.localize(
+ "ui.panel.lovelace.cards.picture-elements.more_info",
+ "name",
+ state
+ )}`;
break;
}
diff --git a/src/panels/lovelace/common/create-row-element.ts b/src/panels/lovelace/common/create-row-element.ts
index 510d52a53a..7269247bb6 100644
--- a/src/panels/lovelace/common/create-row-element.ts
+++ b/src/panels/lovelace/common/create-row-element.ts
@@ -10,6 +10,7 @@ import {
import "../entity-rows/hui-climate-entity-row";
import "../entity-rows/hui-cover-entity-row";
import "../entity-rows/hui-group-entity-row";
+import "../entity-rows/hui-input-datetime-entity-row";
import "../entity-rows/hui-input-number-entity-row";
import "../entity-rows/hui-input-select-entity-row";
import "../entity-rows/hui-input-text-entity-row";
@@ -58,6 +59,7 @@ const DOMAIN_TO_ELEMENT_TYPE = {
// Temporary. Once climate is rewritten,
// water heater should get it's own row.
water_heater: "climate",
+ input_datetime: "input-datetime",
};
const TIMEOUT = 2000;
diff --git a/src/panels/lovelace/elements/hui-state-icon-element.ts b/src/panels/lovelace/elements/hui-state-icon-element.ts
index 91a41748d9..7f2c39057a 100644
--- a/src/panels/lovelace/elements/hui-state-icon-element.ts
+++ b/src/panels/lovelace/elements/hui-state-icon-element.ts
@@ -62,6 +62,7 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement {
@ha-click="${this._handleClick}"
@ha-hold="${this._handleHold}"
.longPress="${longPress()}"
+ .overrideIcon=${this._config.icon}
>
`;
}
diff --git a/src/panels/lovelace/elements/types.ts b/src/panels/lovelace/elements/types.ts
index 5c82484003..bfc6ccdd2a 100644
--- a/src/panels/lovelace/elements/types.ts
+++ b/src/panels/lovelace/elements/types.ts
@@ -51,6 +51,7 @@ export interface StateIconElementConfig extends LovelaceElementConfig {
entity: string;
tap_action?: ActionConfig;
hold_action?: ActionConfig;
+ icon?: string;
}
export interface StateLabelElementConfig extends LovelaceElementConfig {
diff --git a/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts
new file mode 100644
index 0000000000..12199b9359
--- /dev/null
+++ b/src/panels/lovelace/entity-rows/hui-input-datetime-entity-row.ts
@@ -0,0 +1,128 @@
+import {
+ html,
+ LitElement,
+ TemplateResult,
+ property,
+ PropertyValues,
+ customElement,
+} from "lit-element";
+
+import "../components/hui-generic-entity-row";
+import "../../../components/paper-time-input.js";
+// tslint:disable-next-line:no-duplicate-imports
+import { PaperTimeInput } from "../../../components/paper-time-input.js";
+import "../../../components/ha-date-input";
+// tslint:disable-next-line:no-duplicate-imports
+import { HaDateInput } from "../../../components/ha-date-input";
+
+import { HomeAssistant } from "../../../types";
+import { EntityRow, EntityConfig } from "./types";
+import { setInputDateTimeValue } from "../../../data/input_datetime";
+import { hasConfigOrEntityChanged } from "../common/has-changed";
+
+@customElement("hui-input-datetime-entity-row")
+class HuiInputDatetimeEntityRow extends LitElement implements EntityRow {
+ @property() public hass?: HomeAssistant;
+ @property() private _config?: EntityConfig;
+
+ public setConfig(config: EntityConfig): void {
+ if (!config) {
+ throw new Error("Configuration error");
+ }
+ this._config = config;
+ }
+
+ protected shouldUpdate(changedProps: PropertyValues): boolean {
+ return hasConfigOrEntityChanged(this, changedProps);
+ }
+
+ protected render(): TemplateResult | void {
+ if (!this._config || !this.hass) {
+ return html``;
+ }
+
+ const stateObj = this.hass.states[this._config.entity];
+
+ if (!stateObj) {
+ return html`
+
${this.hass.localize(
+ "ui.panel.lovelace.warning.entity_not_found",
+ "entity",
+ this._config.entity
+ )}
+ `;
+ }
+
+ return html`
+
+ ${stateObj.attributes.has_date
+ ? html`
+
+ ${stateObj.attributes.has_time ? "," : ""}
+ `
+ : ``}
+ ${stateObj.attributes.has_time
+ ? html`
+
+ `
+ : ``}
+
+ `;
+ }
+
+ private _stopEventPropagation(ev: Event): void {
+ ev.stopPropagation();
+ }
+
+ private get _timeInputEl(): PaperTimeInput {
+ return this.shadowRoot!.querySelector("paper-time-input")!;
+ }
+
+ private get _dateInputEl(): HaDateInput {
+ return this.shadowRoot!.querySelector("ha-date-input")!;
+ }
+
+ private _selectedValueChanged(ev): void {
+ const stateObj = this.hass!.states[this._config!.entity];
+
+ const time =
+ this._timeInputEl !== null
+ ? this._timeInputEl.value.trim() + ":00"
+ : undefined;
+
+ const date =
+ this._dateInputEl !== null ? this._dateInputEl.value : undefined;
+
+ if (time !== stateObj.state) {
+ setInputDateTimeValue(this.hass!, stateObj.entity_id, time, date);
+ }
+
+ ev.target.blur();
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "hui-input-datetime-entity-row": HuiInputDatetimeEntityRow;
+ }
+}
diff --git a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts
index c068fe3179..3568196454 100644
--- a/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts
+++ b/src/panels/lovelace/entity-rows/hui-input-select-entity-row.ts
@@ -8,7 +8,6 @@ import {
customElement,
PropertyValues,
} from "lit-element";
-import { repeat } from "lit-html/directives/repeat";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
@@ -18,11 +17,12 @@ import "../components/hui-warning";
import computeStateName from "../../../common/entity/compute_state_name";
-import { HomeAssistant } from "../../../types";
+import { HomeAssistant, InputSelectEntity } from "../../../types";
import { EntityRow, EntityConfig } from "./types";
-import { setOption } from "../../../data/input-select";
+import { setInputSelectOption } from "../../../data/input-select";
import { hasConfigOrEntityChanged } from "../common/has-changed";
import { forwardHaptic } from "../../../util/haptics";
+import { stopPropagation } from "../../../common/dom/stop_propagation";
@customElement("hui-input-select-entity-row")
class HuiInputSelectEntityRow extends LitElement implements EntityRow {
@@ -47,7 +47,9 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow {
return html``;
}
- const stateObj = this.hass.states[this._config.entity];
+ const stateObj = this.hass.states[this._config.entity] as
+ | InputSelectEntity
+ | undefined;
if (!stateObj) {
return html`
@@ -64,26 +66,43 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow {
return html`
-
- ${repeat(
- stateObj.attributes.options,
- (option) =>
- html`
- ${option}
- `
+
+ ${stateObj.attributes.options.map(
+ (option) => html`
+ ${option}
+ `
)}
`;
}
+ protected updated(changedProps: PropertyValues) {
+ super.updated(changedProps);
+
+ if (!this.hass || !this._config) {
+ return;
+ }
+
+ const stateObj = this.hass.states[this._config.entity] as
+ | InputSelectEntity
+ | undefined;
+
+ if (!stateObj) {
+ return;
+ }
+
+ // Update selected after rendering the items or else it won't work in Firefox
+ this.shadowRoot!.querySelector(
+ "paper-listbox"
+ )!.selected = stateObj.attributes.options.indexOf(stateObj.state);
+ }
+
static get styles(): CSSResult {
return css`
:host {
@@ -94,22 +113,28 @@ class HuiInputSelectEntityRow extends LitElement implements EntityRow {
margin-left: 16px;
flex: 1;
}
+
+ paper-item {
+ cursor: pointer;
+ min-width: 200px;
+ }
`;
}
private _selectedChanged(ev): void {
- forwardHaptic(this, "light");
- // Selected Option will transition to '' before transitioning to new value
const stateObj = this.hass!.states[this._config!.entity];
- if (
- !ev.target.selectedItem ||
- ev.target.selectedItem.innerText === "" ||
- ev.target.selectedItem.innerText === stateObj.state
- ) {
+ const option = ev.detail.item.innerText;
+ if (option === stateObj.state) {
return;
}
- setOption(this.hass!, stateObj.entity_id, ev.target.selectedItem.innerText);
+ forwardHaptic(this, "light");
+
+ setInputSelectOption(
+ this.hass!,
+ stateObj.entity_id,
+ ev.target.selectedItem.innerText
+ );
}
}
diff --git a/src/polymer-types.ts b/src/polymer-types.ts
index 4432149176..4ffbf77df6 100644
--- a/src/polymer-types.ts
+++ b/src/polymer-types.ts
@@ -18,6 +18,12 @@ export interface PolymerChangedEvent
extends Event {
};
}
+export interface PolymerIronSelectEvent extends Event {
+ detail: {
+ item: T;
+ };
+}
+
declare global {
// for fire event
interface HASSDomEvents {
diff --git a/src/state-summary/state-card-input_select.js b/src/state-summary/state-card-input_select.js
deleted file mode 100644
index 76e4667988..0000000000
--- a/src/state-summary/state-card-input_select.js
+++ /dev/null
@@ -1,96 +0,0 @@
-import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
-import "@polymer/paper-item/paper-item";
-import "@polymer/paper-listbox/paper-listbox";
-import { html } from "@polymer/polymer/lib/utils/html-tag";
-import { PolymerElement } from "@polymer/polymer/polymer-element";
-
-import "../components/entity/state-badge";
-
-import computeStateName from "../common/entity/compute_state_name";
-
-class StateCardInputSelect extends PolymerElement {
- static get template() {
- return html`
-
-
- ${this.stateBadgeTemplate}
-
-
-
- [[item]]
-
-
-
- `;
- }
-
- static get stateBadgeTemplate() {
- return html`
-
- `;
- }
-
- static get properties() {
- return {
- hass: Object,
- stateObj: Object,
- inDialog: {
- type: Boolean,
- value: false,
- },
- selectedOption: {
- type: String,
- observer: "selectedOptionChanged",
- },
- };
- }
-
- _computeStateName(stateObj) {
- return computeStateName(stateObj);
- }
-
- computeSelected(stateObj) {
- return stateObj.attributes.options.indexOf(stateObj.state);
- }
-
- selectedOptionChanged(option) {
- // Selected Option will transition to '' before transitioning to new value
- if (option === "" || option === this.stateObj.state) {
- return;
- }
- this.hass.callService("input_select", "select_option", {
- option: option,
- entity_id: this.stateObj.entity_id,
- });
- }
-
- stopPropagation(ev) {
- ev.stopPropagation();
- }
-}
-customElements.define("state-card-input_select", StateCardInputSelect);
diff --git a/src/state-summary/state-card-input_select.ts b/src/state-summary/state-card-input_select.ts
new file mode 100644
index 0000000000..19befdfb29
--- /dev/null
+++ b/src/state-summary/state-card-input_select.ts
@@ -0,0 +1,96 @@
+import {
+ LitElement,
+ customElement,
+ TemplateResult,
+ html,
+ CSSResult,
+ css,
+ property,
+ PropertyValues,
+} from "lit-element";
+import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light";
+import "@polymer/paper-item/paper-item";
+// tslint:disable-next-line: no-duplicate-imports
+import { PaperItemElement } from "@polymer/paper-item/paper-item";
+import "@polymer/paper-listbox/paper-listbox";
+
+import "../components/entity/state-badge";
+
+import computeStateName from "../common/entity/compute_state_name";
+import { HomeAssistant, InputSelectEntity } from "../types";
+import { setInputSelectOption } from "../data/input-select";
+import { PolymerIronSelectEvent } from "../polymer-types";
+import { stopPropagation } from "../common/dom/stop_propagation";
+
+@customElement("state-card-input_select")
+class StateCardInputSelect extends LitElement {
+ @property() public hass!: HomeAssistant;
+ @property() public stateObj!: InputSelectEntity;
+
+ protected render(): TemplateResult | void {
+ return html`
+
+
+
+ ${this.stateObj.attributes.options.map(
+ (option) => html`
+ ${option}
+ `
+ )}
+
+
+ `;
+ }
+
+ protected updated(changedProps: PropertyValues) {
+ super.updated(changedProps);
+ // Update selected after rendering the items or else it won't work in Firefox
+ this.shadowRoot!.querySelector(
+ "paper-listbox"
+ )!.selected = this.stateObj.attributes.options.indexOf(this.stateObj.state);
+ }
+
+ private async _selectedOptionChanged(
+ ev: PolymerIronSelectEvent
+ ) {
+ const option = ev.detail.item.innerText;
+ if (option === this.stateObj.state) {
+ return;
+ }
+ await setInputSelectOption(this.hass, this.stateObj.entity_id, option);
+ }
+
+ static get styles(): CSSResult {
+ return css`
+ :host {
+ display: block;
+ }
+
+ state-badge {
+ float: left;
+ margin-top: 10px;
+ }
+
+ paper-dropdown-menu-light {
+ display: block;
+ margin-left: 53px;
+ }
+
+ paper-item {
+ cursor: pointer;
+ min-width: 200px;
+ }
+ `;
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "state-card-input_select": StateCardInputSelect;
+ }
+}
diff --git a/src/translations/en.json b/src/translations/en.json
index 477b3e9f62..fe58a46fdc 100644
--- a/src/translations/en.json
+++ b/src/translations/en.json
@@ -916,6 +916,14 @@
"checked_items": "Checked items",
"clear_items": "Clear checked items",
"add_item": "Add item"
+ },
+ "picture-elements": {
+ "hold": "Hold:",
+ "tap": "Tap:",
+ "navigate_to": "Navigate to {location}",
+ "toggle": "Toggle {name}",
+ "call_service": "Call service {name}",
+ "more_info": "Show more-info: {name}"
}
},
"menu": {
diff --git a/src/types.ts b/src/types.ts
index e312a1f6b9..9a5a731a3b 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -219,6 +219,12 @@ export type CameraEntity = HassEntityBase & {
};
};
+export type InputSelectEntity = HassEntityBase & {
+ attributes: HassEntityAttributeBase & {
+ options: string[];
+ };
+};
+
export interface Route {
prefix: string;
path: string;
diff --git a/translations/cy.json b/translations/cy.json
index 984277a1bf..7416302b9d 100644
--- a/translations/cy.json
+++ b/translations/cy.json
@@ -629,6 +629,9 @@
"password": "Cyfrinair",
"create": "Creu"
}
+ },
+ "cloud": {
+ "description_features": "Rheolaeth oddi cartref, integreiddio gyda Alexa a Google Assistant."
}
},
"lovelace": {
diff --git a/translations/el.json b/translations/el.json
index 704c616fea..e47d0690c1 100644
--- a/translations/el.json
+++ b/translations/el.json
@@ -178,7 +178,7 @@
"stopped": "Σταμάτησε",
"locked": "Κλειδωμένο",
"unlocked": "Ξεκλείδωτο",
- "ok": "Ένταξη",
+ "ok": "Εντάξει",
"problem": "Πρόβλημα"
},
"input_boolean": {
diff --git a/translations/hu.json b/translations/hu.json
index 5e4e7e068c..343e2b24cb 100644
--- a/translations/hu.json
+++ b/translations/hu.json
@@ -581,7 +581,8 @@
"cloud": {
"caption": "Home Assistant Felhő",
"description_login": "Bejelentkezve mint {email}",
- "description_not_login": "Nincs bejelentkezve"
+ "description_not_login": "Nincs bejelentkezve",
+ "description_features": "Távoli vezérlés, Alexa és Google Assistant integráció"
},
"integrations": {
"caption": "Integrációk",
diff --git a/translations/is.json b/translations/is.json
index 245aff2d7b..9b10258be2 100644
--- a/translations/is.json
+++ b/translations/is.json
@@ -101,13 +101,24 @@
"gas": "Gas",
"manual": "Handvirkt"
},
+ "cover": {
+ "open": "Opin",
+ "opening": "Opna",
+ "closed": "Lokað",
+ "closing": "Loka"
+ },
"device_tracker": {
"home": "Heima",
"not_home": "Fjarverandi"
},
"group": {
+ "off": "Óvirkur",
+ "on": "Virkur",
"home": "Heima",
"not_home": "Fjarverandi",
+ "open": "Opin",
+ "opening": "Opna",
+ "closed": "Lokuð",
"closing": "Loka",
"stopped": "Stöðvað",
"locked": "Læst",
@@ -172,6 +183,7 @@
"rainy": "Rigning",
"snowy": "Snjókoma",
"snowy-rainy": "Slydda",
+ "sunny": "Sólskin",
"windy": "Vindasamt",
"windy-variant": "Vindasamt"
},
@@ -229,12 +241,16 @@
},
"config": {
"header": "Stilla af Home Assistant",
+ "introduction": "Hér er mögulegt að stilla af íhluti og Home Assistang. Því miður er ekki hægt að breyta öllu í gegnum viðmótið ennþá, en við erum að vinna í því.",
"core": {
"caption": "Almennt",
"description": "Staðfesta að stillingarskráin þín sé rétt og stjórnun á miðlara",
"section": {
"core": {
+ "header": "Stillingar og stjórnun þjóns",
+ "introduction": "Að breyta stillingum getur verið þreytandi ferli og við vitum það. Þetta svæði mun reyna að létta þér lífið hvað það varðar.",
"validation": {
+ "heading": "Staðfesta stillingar",
"check_config": "Athuga stillingar",
"valid": "Stillingar í lagi!",
"invalid": "Stillingar ógildar"
@@ -243,7 +259,8 @@
"heading": "Endurhleðsla stillinga",
"core": "Endurhlaða inn kjarna",
"group": "Endurhlaða inn hópum",
- "automation": "Endurhlaða inn sjálfvirkni"
+ "automation": "Endurhlaða inn sjálfvirkni",
+ "script": "Endurhlaða inn skriftum"
},
"server_management": {
"heading": "Stjórnun miðlara",
@@ -256,6 +273,7 @@
},
"customize": {
"caption": "Séraðlögun",
+ "description": "Séraðlögun fyrir einingarnar þínar",
"picker": {
"header": "Séraðlögun"
}
@@ -265,6 +283,7 @@
"description": "Stofna og breyta sjálfvirkni",
"picker": {
"pick_automation": "Veldu sjálfvirkni sem á að breyta",
+ "no_automations": "Við fundum ekki neinar sjálfvirkni-skilgreiningar sem hægt er að breyta",
"add_automation": "Bæta við sjálfvirkni",
"learn_more": "Læra meira um sjálfvirkni"
},
@@ -300,6 +319,10 @@
"mqtt": {
"label": "MQTT"
},
+ "numeric_state": {
+ "above": "Yfir",
+ "below": "Undir"
+ },
"sun": {
"label": "Sól",
"event": "Viðburður:",
@@ -348,6 +371,10 @@
"label": "Staða",
"state": "Staða"
},
+ "numeric_state": {
+ "above": "Yfir",
+ "below": "Undir"
+ },
"sun": {
"label": "Sól",
"before": "Fyrir:",
@@ -656,6 +683,7 @@
}
},
"page-onboarding": {
+ "intro": "Ertu tilbúinn að vekja heimilið þitt, endurheimta friðhelgi þína og gerast þáttakandi í samfélagi grúskara á heimsvísu?",
"user": {
"intro": "Hefjumst handa með því að byrja á að stona notanda aðgang.",
"required_field": "Skilyrt",
@@ -896,6 +924,7 @@
"confirm": "Vista innskráningu"
},
"notification_drawer": {
+ "click_to_configure": "Smelltu á hnappinn til að stilla {entity}",
"empty": "Engar tilkynningar",
"title": "Tilkynningar"
}
@@ -904,11 +933,16 @@
"automation": "Sjálfvirkni",
"calendar": "Dagatal",
"camera": "Myndavél",
+ "climate": "Loftslag",
"configurator": "Stillingarálfur",
"conversation": "Samtal",
"cover": "Gluggatjöld",
"fan": "Vifta",
"group": "Hópur",
+ "input_datetime": "Innsláttar dagsetning\/tími",
+ "input_select": "Innsláttarval",
+ "input_number": "Innsláttarnúmer",
+ "input_text": "Innsláttartexti",
"light": "Ljós",
"lock": "Lás",
"mailbox": "Pósthólf",
@@ -917,6 +951,7 @@
"plant": "Planta",
"proximity": "Nálægð",
"scene": "Sena",
+ "script": "Skrifta",
"sensor": "Skynjari",
"sun": "Sól",
"switch": "Rofi",