mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-30 04:36:36 +00:00
commit
ddc11c1b12
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="home-assistant-frontend",
|
name="home-assistant-frontend",
|
||||||
version="20190630.0",
|
version="20190702.0",
|
||||||
description="The Home Assistant frontend",
|
description="The Home Assistant frontend",
|
||||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||||
author="The Home Assistant Authors",
|
author="The Home Assistant Authors",
|
||||||
|
@ -116,10 +116,13 @@ class HaSidebar extends LitElement {
|
|||||||
|
|
||||||
@property({ type: Boolean }) public alwaysExpand = false;
|
@property({ type: Boolean }) public alwaysExpand = false;
|
||||||
@property({ type: Boolean, reflect: true }) public expanded = false;
|
@property({ type: Boolean, reflect: true }) public expanded = false;
|
||||||
|
@property({ type: Boolean, reflect: true }) public expandedWidth = false;
|
||||||
@property() public _defaultPage?: string =
|
@property() public _defaultPage?: string =
|
||||||
localStorage.defaultPage || DEFAULT_PANEL;
|
localStorage.defaultPage || DEFAULT_PANEL;
|
||||||
@property() private _externalConfig?: ExternalConfig;
|
@property() private _externalConfig?: ExternalConfig;
|
||||||
@property() private _notifications?: PersistentNotification[];
|
@property() private _notifications?: PersistentNotification[];
|
||||||
|
private _expandTimeout?: number;
|
||||||
|
private _contractTimeout?: number;
|
||||||
|
|
||||||
protected render() {
|
protected render() {
|
||||||
const hass = this.hass;
|
const hass = this.hass;
|
||||||
@ -239,6 +242,7 @@ class HaSidebar extends LitElement {
|
|||||||
protected shouldUpdate(changedProps: PropertyValues): boolean {
|
protected shouldUpdate(changedProps: PropertyValues): boolean {
|
||||||
if (
|
if (
|
||||||
changedProps.has("expanded") ||
|
changedProps.has("expanded") ||
|
||||||
|
changedProps.has("expandedWidth") ||
|
||||||
changedProps.has("narrow") ||
|
changedProps.has("narrow") ||
|
||||||
changedProps.has("alwaysExpand") ||
|
changedProps.has("alwaysExpand") ||
|
||||||
changedProps.has("_externalConfig") ||
|
changedProps.has("_externalConfig") ||
|
||||||
@ -271,8 +275,17 @@ class HaSidebar extends LitElement {
|
|||||||
this._externalConfig = conf;
|
this._externalConfig = conf;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// On tablets, there is no hover. So we receive click and mouseenter at the
|
||||||
|
// same time. In that case, we're going to cancel expanding, because it is
|
||||||
|
// going to require another tap outside the sidebar to trigger mouseleave
|
||||||
|
this.addEventListener("click", () => {
|
||||||
|
if (this._expandTimeout) {
|
||||||
|
clearTimeout(this._expandTimeout);
|
||||||
|
this._expandTimeout = undefined;
|
||||||
|
}
|
||||||
|
});
|
||||||
this.addEventListener("mouseenter", () => {
|
this.addEventListener("mouseenter", () => {
|
||||||
this.expanded = true;
|
this._expand();
|
||||||
});
|
});
|
||||||
this.addEventListener("mouseleave", () => {
|
this.addEventListener("mouseleave", () => {
|
||||||
this._contract();
|
this._contract();
|
||||||
@ -284,23 +297,48 @@ class HaSidebar extends LitElement {
|
|||||||
|
|
||||||
protected updated(changedProps) {
|
protected updated(changedProps) {
|
||||||
super.updated(changedProps);
|
super.updated(changedProps);
|
||||||
if (changedProps.has("alwaysExpand")) {
|
if (changedProps.has("alwaysExpand") && this.alwaysExpand) {
|
||||||
this.expanded = this.alwaysExpand;
|
this.expanded = true;
|
||||||
|
this.expandedWidth = true;
|
||||||
}
|
}
|
||||||
if (SUPPORT_SCROLL_IF_NEEDED || !changedProps.has("hass")) {
|
if (!SUPPORT_SCROLL_IF_NEEDED || !changedProps.has("hass")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
|
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
|
||||||
if (!oldHass || oldHass.panelUrl !== this.hass.panelUrl) {
|
if (!oldHass || oldHass.panelUrl !== this.hass.panelUrl) {
|
||||||
this.shadowRoot!.querySelector(
|
const selectedEl = this.shadowRoot!.querySelector(".iron-selected");
|
||||||
".iron-selected"
|
if (selectedEl) {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
)!.scrollIntoViewIfNeeded();
|
selectedEl.scrollIntoViewIfNeeded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _expand() {
|
||||||
|
// We debounce it one frame, because on tablets, the mouse-enter and
|
||||||
|
// click event fire at the same time.
|
||||||
|
this._expandTimeout = window.setTimeout(() => {
|
||||||
|
this.expanded = true;
|
||||||
|
this.expandedWidth = true;
|
||||||
|
}, 0);
|
||||||
|
if (this._contractTimeout) {
|
||||||
|
clearTimeout(this._contractTimeout);
|
||||||
|
this._contractTimeout = undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _contract() {
|
private _contract() {
|
||||||
this.expanded = this.alwaysExpand || false;
|
if (this._expandTimeout) {
|
||||||
|
clearTimeout(this._expandTimeout);
|
||||||
|
this._expandTimeout = undefined;
|
||||||
|
}
|
||||||
|
if (this.alwaysExpand) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.expandedWidth = false;
|
||||||
|
this._contractTimeout = window.setTimeout(() => {
|
||||||
|
this.expanded = this.alwaysExpand || false;
|
||||||
|
}, 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleShowNotificationDrawer() {
|
private _handleShowNotificationDrawer() {
|
||||||
@ -338,7 +376,7 @@ class HaSidebar extends LitElement {
|
|||||||
contain: strict;
|
contain: strict;
|
||||||
transition-delay: 0.2s;
|
transition-delay: 0.2s;
|
||||||
}
|
}
|
||||||
:host([expanded]) {
|
:host([expandedwidth]) {
|
||||||
width: 256px;
|
width: 256px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,9 @@ export interface ZHADevice {
|
|||||||
name: string;
|
name: string;
|
||||||
ieee: string;
|
ieee: string;
|
||||||
nwk: string;
|
nwk: string;
|
||||||
|
lqi: string;
|
||||||
|
rssi: string;
|
||||||
|
last_seen: string;
|
||||||
manufacturer: string;
|
manufacturer: string;
|
||||||
model: string;
|
model: string;
|
||||||
quirk_applied: boolean;
|
quirk_applied: boolean;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import "@polymer/app-layout/app-drawer/app-drawer";
|
||||||
import "@material/mwc-button";
|
import "@material/mwc-button";
|
||||||
import "@polymer/paper-icon-button/paper-icon-button";
|
import "@polymer/paper-icon-button/paper-icon-button";
|
||||||
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
||||||
@ -6,11 +7,10 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||||
|
|
||||||
import "./notification-item";
|
import "./notification-item";
|
||||||
import "../../components/ha-paper-icon-button-next";
|
import "../../components/ha-paper-icon-button-prev";
|
||||||
|
|
||||||
import { EventsMixin } from "../../mixins/events-mixin";
|
import { EventsMixin } from "../../mixins/events-mixin";
|
||||||
import LocalizeMixin from "../../mixins/localize-mixin";
|
import LocalizeMixin from "../../mixins/localize-mixin";
|
||||||
import { computeRTL } from "../../common/util/compute_rtl";
|
|
||||||
import { subscribeNotifications } from "../../data/persistent_notification";
|
import { subscribeNotifications } from "../../data/persistent_notification";
|
||||||
import computeDomain from "../../common/entity/compute_domain";
|
import computeDomain from "../../common/entity/compute_domain";
|
||||||
/*
|
/*
|
||||||
@ -23,86 +23,12 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
static get template() {
|
static get template() {
|
||||||
return html`
|
return html`
|
||||||
<style include="paper-material-styles">
|
<style include="paper-material-styles">
|
||||||
:host {
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([hidden]) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
align-items: stretch;
|
|
||||||
background: var(--sidebar-background-color, var(--primary-background-color));
|
|
||||||
bottom: 0;
|
|
||||||
box-shadow: var(--paper-material-elevation-1_-_box-shadow);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
overflow-y: hidden;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
transition: right .2s ease-in;
|
|
||||||
width: 500px;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([rtl]) .container {
|
|
||||||
transition: left .2s ease-in !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host(:not(narrow)) .container {
|
|
||||||
right: -500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([rtl]:not(narrow)) .container {
|
|
||||||
left: -500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([narrow]) .container {
|
|
||||||
right: -100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([rtl][narrow]) .container {
|
|
||||||
left: -100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host(.open) .container,
|
|
||||||
:host(.open[narrow]) .container {
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([rtl].open) .container,
|
|
||||||
:host([rtl].open[narrow]) .container {
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
app-toolbar {
|
app-toolbar {
|
||||||
color: var(--primary-text-color);
|
color: var(--primary-text-color);
|
||||||
border-bottom: 1px solid var(--divider-color);
|
border-bottom: 1px solid var(--divider-color);
|
||||||
background-color: var(--primary-background-color);
|
background-color: var(--primary-background-color);
|
||||||
min-height: 64px;
|
min-height: 64px;
|
||||||
width: calc(100% - 32px);
|
width: calc(100% - 32px);
|
||||||
z-index: 11;
|
|
||||||
}
|
|
||||||
|
|
||||||
.overlay {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host(.open) .overlay {
|
|
||||||
bottom: 0;
|
|
||||||
display: block;
|
|
||||||
left: 0;
|
|
||||||
position: absolute;
|
|
||||||
right: 0;
|
|
||||||
top: 0;
|
|
||||||
z-index: 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.notifications {
|
.notifications {
|
||||||
@ -119,11 +45,10 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="overlay" on-click="_closeDrawer"></div>
|
<app-drawer id='drawer' opened="{{open}}" disable-swipe>
|
||||||
<div class="container">
|
|
||||||
<app-toolbar>
|
<app-toolbar>
|
||||||
<div main-title>[[localize('ui.notification_drawer.title')]]</div>
|
<div main-title>[[localize('ui.notification_drawer.title')]]</div>
|
||||||
<ha-paper-icon-button-next on-click="_closeDrawer"></paper-icon-button>
|
<ha-paper-icon-button-prev on-click="_closeDrawer"></paper-icon-button>
|
||||||
</app-toolbar>
|
</app-toolbar>
|
||||||
<div class="notifications">
|
<div class="notifications">
|
||||||
<template is="dom-if" if="[[!_empty(notifications)]]">
|
<template is="dom-if" if="[[!_empty(notifications)]]">
|
||||||
@ -139,27 +64,17 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
<div class="empty">[[localize('ui.notification_drawer.empty')]]<div>
|
<div class="empty">[[localize('ui.notification_drawer.empty')]]<div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</app-drawer>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get properties() {
|
static get properties() {
|
||||||
return {
|
return {
|
||||||
hass: Object,
|
hass: Object,
|
||||||
narrow: {
|
|
||||||
type: Boolean,
|
|
||||||
reflectToAttribute: true,
|
|
||||||
},
|
|
||||||
open: {
|
open: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
notify: true,
|
|
||||||
observer: "_openChanged",
|
observer: "_openChanged",
|
||||||
},
|
},
|
||||||
hidden: {
|
|
||||||
type: Boolean,
|
|
||||||
value: true,
|
|
||||||
reflectToAttribute: true,
|
|
||||||
},
|
|
||||||
notifications: {
|
notifications: {
|
||||||
type: Array,
|
type: Array,
|
||||||
computed: "_computeNotifications(open, hass, _notificationsBackend)",
|
computed: "_computeNotifications(open, hass, _notificationsBackend)",
|
||||||
@ -168,11 +83,6 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
type: Array,
|
type: Array,
|
||||||
value: [],
|
value: [],
|
||||||
},
|
},
|
||||||
rtl: {
|
|
||||||
type: Boolean,
|
|
||||||
reflectToAttribute: true,
|
|
||||||
computed: "_computeRTL(hass)",
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,36 +106,20 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
}
|
}
|
||||||
|
|
||||||
_openChanged(open) {
|
_openChanged(open) {
|
||||||
clearTimeout(this._openTimer);
|
|
||||||
if (open) {
|
if (open) {
|
||||||
// Render closed then animate open
|
// Render closed then animate open
|
||||||
this.hidden = false;
|
|
||||||
this._openTimer = setTimeout(() => {
|
|
||||||
this.classList.add("open");
|
|
||||||
}, 50);
|
|
||||||
this._unsubNotifications = subscribeNotifications(
|
this._unsubNotifications = subscribeNotifications(
|
||||||
this.hass.connection,
|
this.hass.connection,
|
||||||
(notifications) => {
|
(notifications) => {
|
||||||
this._notificationsBackend = notifications;
|
this._notificationsBackend = notifications;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else if (this._unsubNotifications) {
|
||||||
// Animate closed then hide
|
this._unsubNotifications();
|
||||||
this.classList.remove("open");
|
this._unsubNotifications = undefined;
|
||||||
this._openTimer = setTimeout(() => {
|
|
||||||
this.hidden = true;
|
|
||||||
}, 250);
|
|
||||||
if (this._unsubNotifications) {
|
|
||||||
this._unsubNotifications();
|
|
||||||
this._unsubNotifications = undefined;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_computeRTL(hass) {
|
|
||||||
return computeRTL(hass);
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeNotifications(open, hass, notificationsBackend) {
|
_computeNotifications(open, hass, notificationsBackend) {
|
||||||
if (!open) {
|
if (!open) {
|
||||||
return [];
|
return [];
|
||||||
@ -239,8 +133,11 @@ export class HuiNotificationDrawer extends EventsMixin(
|
|||||||
}
|
}
|
||||||
|
|
||||||
showDialog({ narrow }) {
|
showDialog({ narrow }) {
|
||||||
this.open = true;
|
this.style.setProperty(
|
||||||
this.narrow = narrow;
|
"--app-drawer-width",
|
||||||
|
narrow ? window.innerWidth + "px" : "500px"
|
||||||
|
);
|
||||||
|
this.$.drawer.open();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
customElements.define("notification-drawer", HuiNotificationDrawer);
|
customElements.define("notification-drawer", HuiNotificationDrawer);
|
||||||
|
@ -26,7 +26,6 @@ import { HomeAssistant } from "../../../types";
|
|||||||
import { AutomationEntity } from "../../../data/automation";
|
import { AutomationEntity } from "../../../data/automation";
|
||||||
import format_date_time from "../../../common/datetime/format_date_time";
|
import format_date_time from "../../../common/datetime/format_date_time";
|
||||||
import { fireEvent } from "../../../common/dom/fire_event";
|
import { fireEvent } from "../../../common/dom/fire_event";
|
||||||
import { repeat } from "lit-html/directives/repeat";
|
|
||||||
|
|
||||||
@customElement("ha-automation-picker")
|
@customElement("ha-automation-picker")
|
||||||
class HaAutomationPicker extends LitElement {
|
class HaAutomationPicker extends LitElement {
|
||||||
@ -74,9 +73,7 @@ class HaAutomationPicker extends LitElement {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
: repeat(
|
: this.automations.map(
|
||||||
this.automations,
|
|
||||||
(automation) => automation.entity_id,
|
|
||||||
(automation) => html`
|
(automation) => html`
|
||||||
|
|
||||||
<div class='automation'>
|
<div class='automation'>
|
||||||
|
@ -25,7 +25,6 @@ import { haStyle } from "../../../resources/styles";
|
|||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
import { triggerScript } from "../../../data/script";
|
import { triggerScript } from "../../../data/script";
|
||||||
import { showToast } from "../../../util/toast";
|
import { showToast } from "../../../util/toast";
|
||||||
import { repeat } from "lit-html/directives/repeat";
|
|
||||||
|
|
||||||
@customElement("ha-script-picker")
|
@customElement("ha-script-picker")
|
||||||
class HaScriptPicker extends LitElement {
|
class HaScriptPicker extends LitElement {
|
||||||
@ -57,9 +56,7 @@ class HaScriptPicker extends LitElement {
|
|||||||
<p>We couldn't find any scripts.</p>
|
<p>We couldn't find any scripts.</p>
|
||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
: repeat(
|
: this.scripts.map(
|
||||||
this.scripts,
|
|
||||||
(script) => script.entity_id,
|
|
||||||
(script) => html`
|
(script) => html`
|
||||||
<div class="script">
|
<div class="script">
|
||||||
<paper-icon-button
|
<paper-icon-button
|
||||||
|
@ -135,6 +135,14 @@ class ZHADeviceCard extends LitElement {
|
|||||||
<dd class="zha-info">${this.device!.ieee}</dd>
|
<dd class="zha-info">${this.device!.ieee}</dd>
|
||||||
<dt>Nwk:</dt>
|
<dt>Nwk:</dt>
|
||||||
<dd class="zha-info">${formatAsPaddedHex(this.device!.nwk)}</dd>
|
<dd class="zha-info">${formatAsPaddedHex(this.device!.nwk)}</dd>
|
||||||
|
<dt>LQI:</dt>
|
||||||
|
<dd class="zha-info">${this.device!.lqi || "Unknown"}</dd>
|
||||||
|
<dt>RSSI:</dt>
|
||||||
|
<dd class="zha-info">${this.device!.rssi || "Unknown"}</dd>
|
||||||
|
<dt>Last Seen:</dt>
|
||||||
|
<dd class="zha-info">${this.device!.last_seen || "Unknown"}</dd>
|
||||||
|
<dt>Power Source:</dt>
|
||||||
|
<dd class="zha-info">${this.device!.power_source || "Unknown"}</dd>
|
||||||
${
|
${
|
||||||
this.device!.quirk_applied
|
this.device!.quirk_applied
|
||||||
? html`
|
? html`
|
||||||
@ -360,7 +368,7 @@ class ZHADeviceCard extends LitElement {
|
|||||||
dl dt {
|
dl dt {
|
||||||
padding-left: 12px;
|
padding-left: 12px;
|
||||||
float: left;
|
float: left;
|
||||||
width: 50px;
|
width: 100px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
dt dd {
|
dt dd {
|
||||||
|
@ -401,7 +401,7 @@
|
|||||||
"alias": "Nimi",
|
"alias": "Nimi",
|
||||||
"triggers": {
|
"triggers": {
|
||||||
"header": "Laukaisuehdot",
|
"header": "Laukaisuehdot",
|
||||||
"introduction": "Laukaisuehdot määrittelevät, milloin automaatiota aletaan suorittaa. Samassa säännössä voi olla useita laukaisuehtoja. Kun laukaisuehto täyttyy, Home Assistant varmistaa ehdot. Jos ehdot täyttyvät, toiminto suoritetaan.\n\n[Lue lisää laukaisuehdoista (englanniksi).](https:\/\/home-assistant.io\/docs\/automation\/trigger\/)",
|
"introduction": "Laukaisuehdot määrittelevät, milloin automaatiota aletaan suorittaa. Samassa säännössä voi olla useita laukaisuehtoja. Kun laukaisuehto täyttyy, Home Assistant varmistaa ehdot. Jos ehdot täyttyvät, toiminto suoritetaan.",
|
||||||
"add": "Laukaisuehto",
|
"add": "Laukaisuehto",
|
||||||
"duplicate": "Kopioi",
|
"duplicate": "Kopioi",
|
||||||
"delete": "Poista",
|
"delete": "Poista",
|
||||||
@ -483,7 +483,7 @@
|
|||||||
},
|
},
|
||||||
"conditions": {
|
"conditions": {
|
||||||
"header": "Ehdot",
|
"header": "Ehdot",
|
||||||
"introduction": "Ehdot ovat vapaaehtoinen osa automaatiosääntöä. Niillä voidaan estää toimintoa tapahtumasta, vaikka se olisi laukaistu. Ehdot näyttävät hyvin samanlaisilta kuin laukaisimet, mutta ne ovat eri asia. Laukaisimen tehtävä on tarkkailla järjestelmän tapahtumia. Ehto kuitenkin katsoo systeemin tilaa vain ja ainoastaan yhdellä hetkellä. Laukaisin voi esimerkiksi huomata, jos jokin vipu käännetään päälle. Ehto voi nähdä vain onko vipu päällä vai pois päältä.\n\n[Lue lisää ehdoista (englanniksi).](https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)",
|
"introduction": "Ehdot ovat vapaaehtoinen osa automaatiosääntöä. Niillä voidaan estää toimintoa tapahtumasta, vaikka se olisi laukaistu. Ehdot näyttävät hyvin samanlaisilta kuin laukaisimet, mutta ne ovat eri asia. Laukaisimen tehtävä on tarkkailla järjestelmän tapahtumia. Ehto kuitenkin katsoo systeemin tilaa vain ja ainoastaan yhdellä hetkellä. Laukaisin voi esimerkiksi huomata, jos jokin vipu käännetään päälle. Ehto voi nähdä vain onko vipu päällä vai pois päältä.",
|
||||||
"add": "Lisää ehto",
|
"add": "Lisää ehto",
|
||||||
"duplicate": "Kopioi",
|
"duplicate": "Kopioi",
|
||||||
"delete": "Poista",
|
"delete": "Poista",
|
||||||
@ -529,7 +529,7 @@
|
|||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"header": "Toiminnot",
|
"header": "Toiminnot",
|
||||||
"introduction": "Home Assistant suorittaa toiminnot, kun automaatio laukaistaan.\n\n[Opi lisää toiminnoista (englanniksi).](https:\/\/home-assistant.io\/docs\/automation\/action\/)",
|
"introduction": "Home Assistant suorittaa toiminnot, kun automaatio laukaistaan.",
|
||||||
"add": "Lisää toiminto",
|
"add": "Lisää toiminto",
|
||||||
"duplicate": "Kopioi",
|
"duplicate": "Kopioi",
|
||||||
"delete": "Poista",
|
"delete": "Poista",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user