Merge pull request #4856 from home-assistant/dev

20200212.0
This commit is contained in:
Bram Kragten 2020-02-12 22:41:36 +01:00 committed by GitHub
commit b7a84cdd60
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
113 changed files with 4112 additions and 1496 deletions

View File

@ -39,81 +39,87 @@ class HassioAddonRepositoryEl extends LitElement {
protected render(): TemplateResult {
const repo = this.repo;
const addons = this._getAddons(this.addons, this.filter);
const ha105pluss = this._computeHA105plus;
if (this.filter && addons.length < 1) {
return html`
<div class="card-group">
<div class="title">
<div class="description">
No results found in "${repo.name}"
</div>
</div>
<div class="content">
<p class="description">
No results found in "${repo.name}"
</p>
</div>
`;
}
return html`
<div class="card-group">
<div class="title">
<div class="content">
<h1>
${repo.name}
<div class="description">
Maintained by ${repo.maintainer}<br />
<a class="repo" href=${repo.url} target="_blank">${repo.url}</a>
</div>
</h1>
<p class="description">
Maintained by ${repo.maintainer}<br />
<a class="repo" href=${repo.url} target="_blank">${repo.url}</a>
</p>
<div class="card-group">
${addons.map(
(addon) => html`
<paper-card
.addon=${addon}
class=${addon.available ? "" : "not_available"}
@click=${this._addonTapped}
>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
.title=${addon.name}
.description=${addon.description}
.available=${addon.available}
.icon=${addon.installed && addon.installed !== addon.version
? "hassio:arrow-up-bold-circle"
: "hassio:puzzle"}
.iconTitle=${addon.installed
? addon.installed !== addon.version
? "New version available"
: "Add-on is installed"
: addon.available
? "Add-on is not installed"
: "Add-on is not available on your system"}
.iconClass=${addon.installed
? addon.installed !== addon.version
? "update"
: "installed"
: !addon.available
? "not_available"
: ""}
.iconImage=${ha105pluss && addon.icon
? `/api/hassio/addons/${addon.slug}/icon`
: undefined}
.showTopbar=${addon.installed || !addon.available}
.topbarClass=${addon.installed
? addon.installed !== addon.version
? "update"
: "installed"
: !addon.available
? "unavailable"
: ""}
></hassio-card-content>
</div>
</paper-card>
`
)}
</div>
${addons.map(
(addon) => html`
<paper-card
.addon=${addon}
class=${addon.available ? "" : "not_available"}
@click=${this.addonTapped}
>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
.title=${addon.name}
.description=${addon.description}
.available=${addon.available}
.icon=${this.computeIcon(addon)}
.iconTitle=${this.computeIconTitle(addon)}
.iconClass=${this.computeIconClass(addon)}
></hassio-card-content>
</div>
</paper-card>
`
)}
</div>
`;
}
private computeIcon(addon) {
return addon.installed && addon.installed !== addon.version
? "hassio:arrow-up-bold-circle"
: "hassio:puzzle";
}
private computeIconTitle(addon) {
if (addon.installed) {
return addon.installed !== addon.version
? "New version available"
: "Add-on is installed";
}
return addon.available
? "Add-on is not installed"
: "Add-on is not available on your system";
}
private computeIconClass(addon) {
if (addon.installed) {
return addon.installed !== addon.version ? "update" : "installed";
}
return !addon.available ? "not_available" : "";
}
private addonTapped(ev) {
private _addonTapped(ev) {
navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`);
}
private get _computeHA105plus(): boolean {
const [major, minor] = this.hass.config.version.split(".", 2);
return Number(major) > 0 || (major === "0" && Number(minor) >= 105);
}
static get styles(): CSSResultArray {
return [
hassioStyle,

View File

@ -36,61 +36,63 @@ class HassioRepositoriesEditor extends LitElement {
protected render(): TemplateResult {
const repos = this._sortedRepos(this.repos);
return html`
<div class="card-group">
<div class="title">
<div class="content">
<h1>
Repositories
<div class="description">
Configure which add-on repositories to fetch data from:
</div>
</div>
${// Use repeat so that the fade-out from call-service-api-button
// stays with the correct repo after we add/delete one.
repeat(
repos,
(repo) => repo.slug,
(repo) => html`
<paper-card>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
.title=${repo.name}
.description=${repo.url}
icon="hassio:github-circle"
></hassio-card-content>
</div>
<div class="card-actions">
<ha-call-api-button
path="hassio/supervisor/options"
.hass=${this.hass}
.data=${this.computeRemoveRepoData(repos, repo.url)}
class="warning"
>
Remove
</ha-call-api-button>
</div>
</paper-card>
`
)}
</h1>
<p class="description">
Configure which add-on repositories to fetch data from:
</p>
<div class="card-group">
${// Use repeat so that the fade-out from call-service-api-button
// stays with the correct repo after we add/delete one.
repeat(
repos,
(repo) => repo.slug,
(repo) => html`
<paper-card>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
.title=${repo.name}
.description=${repo.url}
icon="hassio:github-circle"
></hassio-card-content>
</div>
<div class="card-actions">
<ha-call-api-button
path="hassio/supervisor/options"
.hass=${this.hass}
.data=${this.computeRemoveRepoData(repos, repo.url)}
class="warning"
>
Remove
</ha-call-api-button>
</div>
</paper-card>
`
)}
<paper-card>
<div class="card-content add">
<iron-icon icon="hassio:github-circle"></iron-icon>
<paper-input
label="Add new repository by URL"
.value=${this._repoUrl}
@value-changed=${this._urlChanged}
></paper-input>
</div>
<div class="card-actions">
<ha-call-api-button
path="hassio/supervisor/options"
.hass=${this.hass}
.data=${this.computeAddRepoData(repos, this._repoUrl)}
>
Add
</ha-call-api-button>
</div>
</paper-card>
<paper-card>
<div class="card-content add">
<iron-icon icon="hassio:github-circle"></iron-icon>
<paper-input
label="Add new repository by URL"
.value=${this._repoUrl}
@value-changed=${this._urlChanged}
></paper-input>
</div>
<div class="card-actions">
<ha-call-api-button
path="hassio/supervisor/options"
.hass=${this.hass}
.data=${this.computeAddRepoData(repos, this._repoUrl)}
>
Add
</ha-call-api-button>
</div>
</paper-card>
</div>
</div>
`;
}

View File

@ -51,7 +51,7 @@ class HassioAddonAudio extends LitElement {
<paper-dropdown-menu
label="Input"
@selected-item-changed=${this._setInputDevice}
@iron-select=${this._setInputDevice}
>
<paper-listbox
slot="dropdown-content"
@ -61,14 +61,16 @@ class HassioAddonAudio extends LitElement {
${this._inputDevices &&
this._inputDevices.map((item) => {
return html`
<paper-item device=${item.device}>${item.name}</paper-item>
<paper-item device=${item.device || ""}
>${item.name}</paper-item
>
`;
})}
</paper-listbox>
</paper-dropdown-menu>
<paper-dropdown-menu
label="Output"
@selected-item-changed=${this._setOutputDevice}
@iron-select=${this._setOutputDevice}
>
<paper-listbox
slot="dropdown-content"
@ -78,7 +80,9 @@ class HassioAddonAudio extends LitElement {
${this._outputDevices &&
this._outputDevices.map((item) => {
return html`
<paper-item device=${item.device}>${item.name}</paper-item>
<paper-item device=${item.device || ""}
>${item.name}</paper-item
>
`;
})}
</paper-listbox>
@ -123,17 +127,13 @@ class HassioAddonAudio extends LitElement {
}
private _setInputDevice(ev): void {
const device = ev.detail.device;
if (device) {
this._selectedInput = device;
}
const device = ev.detail.item.getAttribute("device");
this._selectedInput = device || null;
}
private _setOutputDevice(ev): void {
const device = ev.detail.device;
if (device) {
this._selectedOutput = device;
}
const device = ev.detail.item.getAttribute("device");
this._selectedOutput = device || null;
}
private async _addonChanged(): Promise<void> {
@ -143,13 +143,11 @@ class HassioAddonAudio extends LitElement {
return;
}
const noDevice: HassioHardwareAudioDevice[] = [
{ device: undefined, name: "-" },
];
const noDevice: HassioHardwareAudioDevice = { device: null, name: "-" };
try {
const { audio } = await fetchHassioHardwareAudio(this.hass);
const inupt = Object.keys(audio.input).map((key) => ({
const input = Object.keys(audio.input).map((key) => ({
device: key,
name: audio.input[key],
}));
@ -158,12 +156,12 @@ class HassioAddonAudio extends LitElement {
name: audio.output[key],
}));
this._inputDevices = noDevice.concat(inupt);
this._outputDevices = noDevice.concat(output);
this._inputDevices = [noDevice, ...input];
this._outputDevices = [noDevice, ...output];
} catch {
this._error = "Failed to fetch audio hardware";
this._inputDevices = noDevice;
this._outputDevices = noDevice;
this._inputDevices = [noDevice];
this._outputDevices = [noDevice];
}
}

View File

@ -10,6 +10,7 @@ import {
property,
PropertyValues,
TemplateResult,
query,
} from "lit-element";
import { HomeAssistant } from "../../../src/types";
@ -20,30 +21,42 @@ import {
} from "../../../src/data/hassio/addon";
import { hassioStyle } from "../resources/hassio-style";
import { haStyle } from "../../../src/resources/styles";
import { PolymerChangedEvent } from "../../../src/polymer-types";
import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/ha-yaml-editor";
// tslint:disable-next-line: no-duplicate-imports
import { HaYamlEditor } from "../../../src/components/ha-yaml-editor";
import { showConfirmationDialog } from "../../../src/dialogs/generic/show-dialog-box";
@customElement("hassio-addon-config")
class HassioAddonConfig extends LitElement {
@property() public hass!: HomeAssistant;
@property() public addon!: HassioAddonDetails;
@property() private _error?: string;
@property() private _config!: string;
@property({ type: Boolean }) private _configHasChanged = false;
@query("ha-yaml-editor") private _editor!: HaYamlEditor;
protected render(): TemplateResult {
const editor = this._editor;
// If editor not rendered, don't show the error.
const valid = editor ? editor.isValid : true;
return html`
<paper-card heading="Config">
<div class="card-content">
<ha-yaml-editor
@value-changed=${this._configChanged}
></ha-yaml-editor>
${this._error
? html`
<div class="errors">${this._error}</div>
`
: ""}
<iron-autogrow-textarea
@value-changed=${this._configChanged}
.value=${this._config}
></iron-autogrow-textarea>
${valid
? ""
: html`
<div class="errors">Invalid YAML</div>
`}
</div>
<div class="card-actions">
<mwc-button class="warning" @click=${this._resetTapped}>
@ -51,7 +64,7 @@ class HassioAddonConfig extends LitElement {
</mwc-button>
<mwc-button
@click=${this._saveTapped}
.disabled=${!this._configHasChanged}
.disabled=${!this._configHasChanged || !valid}
>
Save
</mwc-button>
@ -77,7 +90,7 @@ class HassioAddonConfig extends LitElement {
}
.errors {
color: var(--google-red-500);
margin-bottom: 16px;
margin-top: 16px;
}
iron-autogrow-textarea {
width: 100%;
@ -93,18 +106,26 @@ class HassioAddonConfig extends LitElement {
protected updated(changedProperties: PropertyValues): void {
super.updated(changedProperties);
if (changedProperties.has("addon")) {
this._config = JSON.stringify(this.addon.options, null, 2);
this._editor.setValue(this.addon.options);
}
}
private _configChanged(ev: PolymerChangedEvent<string>): void {
this._config =
ev.detail.value || JSON.stringify(this.addon.options, null, 2);
this._configHasChanged =
this._config !== JSON.stringify(this.addon.options, null, 2);
private _configChanged(): void {
this._configHasChanged = true;
this.requestUpdate();
}
private async _resetTapped(): Promise<void> {
const confirmed = await showConfirmationDialog(this, {
title: this.addon.name,
text: "Are you sure you want to reset all your options?",
confirmText: "reset options",
});
if (!confirmed) {
return;
}
this._error = undefined;
const data: HassioAddonSetOptionParams = {
options: null,
@ -129,7 +150,7 @@ class HassioAddonConfig extends LitElement {
this._error = undefined;
try {
data = {
options: JSON.parse(this._config),
options: this._editor.value,
};
} catch (err) {
this._error = err;

View File

@ -319,6 +319,7 @@ class HassioAddonInfo extends LitElement {
<ha-switch
@change=${this._startOnBootToggled}
.checked=${this.addon.boot === "auto"}
haptic
></ha-switch>
</div>
<div class="state">
@ -326,6 +327,7 @@ class HassioAddonInfo extends LitElement {
<ha-switch
@change=${this._autoUpdateToggled}
.checked=${this.addon.auto_update}
haptic
></ha-switch>
</div>
${this.addon.ingress
@ -336,6 +338,7 @@ class HassioAddonInfo extends LitElement {
@change=${this._panelToggled}
.checked=${this.addon.ingress_panel}
.disabled=${this._computeCannotIngressSidebar}
haptic
></ha-switch>
${this._computeCannotIngressSidebar
? html`
@ -363,6 +366,7 @@ class HassioAddonInfo extends LitElement {
<ha-switch
@change=${this._protectionToggled}
.checked=${this.addon.protected}
haptic
></ha-switch>
</div>
`
@ -450,7 +454,6 @@ class HassioAddonInfo extends LitElement {
<ha-progress-button
.disabled=${!this.addon.available}
.progress=${this._installing}
class="right"
@click=${this._installClicked}
>
Install

View File

@ -17,21 +17,40 @@ class HassioCardContent extends LitElement {
@property() public hass!: HomeAssistant;
@property() public title!: string;
@property() public description?: string;
@property({ type: Boolean }) public available?: boolean;
@property({ type: Boolean }) public available: boolean = true;
@property({ type: Boolean }) public showTopbar: boolean = false;
@property() public topbarClass?: string;
@property() public datetime?: string;
@property() public iconTitle?: string;
@property() public iconClass?: string;
@property() public icon = "hass:help-circle";
@property() public iconImage?: string;
protected render(): TemplateResult {
return html`
<iron-icon
class=${this.iconClass}
.icon=${this.icon}
.title=${this.iconTitle}
></iron-icon>
${this.showTopbar
? html`
<div class="topbar ${this.topbarClass}"></div>
`
: ""}
${this.iconImage
? html`
<div class="icon_image ${this.iconClass}">
<img src="${this.iconImage}" title="${this.iconTitle}" />
<div></div>
</div>
`
: html`
<iron-icon
class=${this.iconClass}
.icon=${this.icon}
.title=${this.iconTitle}
></iron-icon>
`}
<div>
<div class="title">${this.title}</div>
<div class="title">
${this.title}
</div>
<div class="addition">
${this.description}
${/* treat as available when undefined */
@ -53,8 +72,9 @@ class HassioCardContent extends LitElement {
static get styles(): CSSResult {
return css`
iron-icon {
margin-right: 16px;
margin-top: 16px;
margin-right: 24px;
margin-left: 8px;
margin-top: 12px;
float: left;
color: var(--secondary-text-color);
}
@ -88,6 +108,44 @@ class HassioCardContent extends LitElement {
ha-relative-time {
display: block;
}
.icon_image img {
max-height: 40px;
max-width: 40px;
margin-top: 4px;
margin-right: 16px;
float: left;
}
.icon_image.stopped,
.icon_image.not_available {
filter: grayscale(1);
}
.dot {
position: absolute;
background-color: var(--paper-orange-400);
width: 12px;
height: 12px;
top: 8px;
right: 8px;
border-radius: 50%;
}
.topbar {
position: absolute;
width: 100%;
height: 2px;
top: 0;
left: 0;
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.topbar.installed {
background-color: var(--primary-color);
}
.topbar.update {
background-color: var(--accent-color);
}
.topbar.unavailable {
background-color: var(--error-color);
}
`;
}
}

View File

@ -22,38 +22,61 @@ class HassioAddons extends LitElement {
@property() public addons?: HassioAddonInfo[];
protected render(): TemplateResult {
const [major, minor] = this.hass.config.version.split(".", 2);
const ha105pluss =
Number(major) > 0 || (major === "0" && Number(minor) >= 105);
return html`
<div class="content card-group">
<div class="title">Add-ons</div>
${!this.addons
? html`
<paper-card>
<div class="card-content">
You don't have any add-ons installed yet. Head over to
<a href="#" @click=${this._openStore}>the add-on store</a> to
get started!
</div>
</paper-card>
`
: this.addons
.sort((a, b) => (a.name > b.name ? 1 : -1))
.map(
(addon) => html`
<paper-card .addon=${addon} @click=${this._addonTapped}>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
title=${addon.name}
description=${addon.description}
?available=${addon.available}
icon=${this._computeIcon(addon)}
.iconTitle=${this._computeIconTitle(addon)}
.iconClass=${this._computeIconClass(addon)}
></hassio-card-content>
</div>
</paper-card>
`
)}
<div class="content">
<h1>Add-ons</h1>
<div class="card-group">
${!this.addons
? html`
<paper-card>
<div class="card-content">
You don't have any add-ons installed yet. Head over to
<a href="#" @click=${this._openStore}>the add-on store</a>
to get started!
</div>
</paper-card>
`
: this.addons
.sort((a, b) => (a.name > b.name ? 1 : -1))
.map(
(addon) => html`
<paper-card .addon=${addon} @click=${this._addonTapped}>
<div class="card-content">
<hassio-card-content
.hass=${this.hass}
.title=${addon.name}
.description=${addon.description}
available
.showTopbar=${addon.installed !== addon.version}
topbarClass="update"
.icon=${addon.installed !== addon.version
? "hassio:arrow-up-bold-circle"
: "hassio:puzzle"}
.iconTitle=${addon.state !== "started"
? "Add-on is stopped"
: addon.installed !== addon.version
? "New version available"
: "Add-on is running"}
.iconClass=${addon.installed &&
addon.installed !== addon.version
? addon.state === "started"
? "update"
: "update stopped"
: addon.installed && addon.state === "started"
? "running"
: "stopped"}
.iconImage=${ha105pluss && addon.icon
? `/api/hassio/addons/${addon.slug}/icon`
: undefined}
></hassio-card-content>
</div>
</paper-card>
`
)}
</div>
</div>
`;
}
@ -70,28 +93,6 @@ class HassioAddons extends LitElement {
];
}
private _computeIcon(addon: HassioAddonInfo): string {
return addon.installed !== addon.version
? "hassio:arrow-up-bold-circle"
: "hassio:puzzle";
}
private _computeIconTitle(addon: HassioAddonInfo): string {
if (addon.installed !== addon.version) {
return "New version available";
}
return addon.state === "started"
? "Add-on is running"
: "Add-on is stopped";
}
private _computeIconClass(addon: HassioAddonInfo): string {
if (addon.installed !== addon.version) {
return "update";
}
return addon.state === "started" ? "running" : "";
}
private _addonTapped(ev: any): void {
navigate(this, `/hassio/addon/${ev.currentTarget.addon.slug}`);
}

View File

@ -38,7 +38,12 @@ export class HassioUpdate extends LitElement {
this.supervisorInfo,
this.hassOsInfo,
].filter((value) => {
return !!value && value.version !== value.last_version;
return (
!!value &&
(value.last_version
? value.version !== value.last_version
: value.version !== value.version_latest)
);
}).length;
if (!updatesAvailable) {
@ -52,14 +57,14 @@ export class HassioUpdate extends LitElement {
<div class="error">Error: ${this._error}</div>
`
: ""}
<h1>
${updatesAvailable > 1
? "Updates Available 🎉"
: "Update Available 🎉"}
</h1>
<div class="card-group">
<div class="title">
${updatesAvailable > 1
? "Updates Available 🎉"
: "Update Available 🎉"}
</div>
${this._renderUpdateCard(
"Home Assistant",
"Home Assistant Core",
this.hassInfo.version,
this.hassInfo.last_version,
"hassio/homeassistant/update",
@ -69,7 +74,7 @@ export class HassioUpdate extends LitElement {
"hassio:home-assistant"
)}
${this._renderUpdateCard(
"Hass.io Supervisor",
"Supervisor",
this.supervisorInfo.version,
this.supervisorInfo.last_version,
"hassio/supervisor/update",
@ -77,7 +82,7 @@ export class HassioUpdate extends LitElement {
)}
${this.hassOsInfo
? this._renderUpdateCard(
"HassOS",
"Operating System",
this.hassOsInfo.version,
this.hassOsInfo.version_latest,
"hassio/hassos/update",
@ -149,13 +154,6 @@ export class HassioUpdate extends LitElement {
haStyle,
hassioStyle,
css`
:host {
width: 33%;
}
paper-card {
display: inline-block;
margin-bottom: 32px;
}
.icon {
--iron-icon-height: 48px;
--iron-icon-width: 48px;
@ -170,6 +168,10 @@ export class HassioUpdate extends LitElement {
.warning {
color: var(--secondary-text-color);
}
.card-content {
height: calc(100% - 47px);
box-sizing: border-box;
}
.card-actions {
text-align: right;
}

View File

@ -1,9 +1,12 @@
window.loadES5Adapter().then(() => {
// eslint-disable-next-line
import(/* webpackChunkName: "roboto" */ "../../src/resources/roboto");
// eslint-disable-next-line
import(/* webpackChunkName: "hassio-icons" */ "./resources/hassio-icons");
// eslint-disable-next-line
import(/* webpackChunkName: "hassio-main" */ "./hassio-main");
});
const styleEl = document.createElement("style");
styleEl.innerHTML = `
body {

View File

@ -30,6 +30,10 @@ import { ProvideHassLitMixin } from "../../src/mixins/provide-hass-lit-mixin";
// Don't codesplit it, that way the dashboard always loads fast.
import "./hassio-pages-with-tabs";
import { navigate } from "../../src/common/navigate";
import {
showAlertDialog,
AlertDialogParams,
} from "../../src/dialogs/generic/show-dialog-box";
// The register callback of the IronA11yKeysBehavior inside paper-icon-button
// is not called, causing _keyBindings to be uninitiliazed for paper-icon-button,
@ -72,7 +76,6 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
},
},
};
@property() private _supervisorInfo: HassioSupervisorInfo;
@property() private _hostInfo: HassioHostInfo;
@property() private _hassOsInfo?: HassioHassOSInfo;
@ -81,7 +84,12 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
applyThemesOnElement(this, this.hass.themes, this.hass.selectedTheme, true);
applyThemesOnElement(
this.parentElement,
this.hass.themes,
this.hass.selectedTheme,
true
);
this.addEventListener("hass-api-called", (ev) => this._apiCalled(ev));
// Paulus - March 17, 2019
// We went to a single hass-toggle-menu event in HA 0.90. However, the
@ -107,6 +115,14 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
})
);
// Forward haptic events to parent window.
window.addEventListener("haptic", (ev) => {
// @ts-ignore
fireEvent(window.parent, ev.type, ev.detail, {
bubbles: false,
});
});
makeDialogManager(this, document.body);
}
@ -158,31 +174,81 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
}
private async _redirectIngress(addonSlug: string) {
// When we trigger a navigation, we sleep to make sure we don't
// show the hassio dashboard before navigating away.
const awaitAlert = async (
alertParams: AlertDialogParams,
action: () => void
) => {
await new Promise((resolve) => {
alertParams.confirm = resolve;
showAlertDialog(this, alertParams);
});
action();
await new Promise((resolve) => setTimeout(resolve, 1000));
};
const createSessionPromise = createHassioSession(this.hass).then(
() => true,
() => false
);
let addon;
try {
const [addon] = await Promise.all([
fetchHassioAddonInfo(this.hass, addonSlug).catch(() => {
throw new Error("Failed to fetch add-on info");
}),
createHassioSession(this.hass).catch(() => {
throw new Error("Failed to create an ingress session");
}),
]);
if (!addon.ingress_url) {
alert("Add-on does not support Ingress");
return;
}
if (addon.state !== "started") {
alert("Add-on is not running. Please start it first");
navigate(this, `/hassio/addon/${addon.slug}`, true);
return;
}
location.assign(addon.ingress_url);
// await a promise that doesn't resolve, so we show the loading screen
// while we load the next page.
await new Promise(() => undefined);
addon = await fetchHassioAddonInfo(this.hass, addonSlug);
} catch (err) {
alert("Unable to open ingress connection");
await awaitAlert(
{
text: "Unable to fetch add-on info to start Ingress",
title: "Hass.io",
},
() => history.back()
);
return;
}
if (!addon.ingress_url) {
await awaitAlert(
{
text: "Add-on does not support Ingress",
title: addon.name,
},
() => history.back()
);
return;
}
if (addon.state !== "started") {
await awaitAlert(
{
text: "Add-on is not running. Please start it first",
title: addon.name,
},
() => navigate(this, `/hassio/addon/${addon.slug}`, true)
);
return;
}
if (!(await createSessionPromise)) {
await awaitAlert(
{
text: "Unable to create an Ingress session",
title: addon.name,
},
() => history.back()
);
return;
}
location.assign(addon.ingress_url);
// await a promise that doesn't resolve, so we show the loading screen
// while we load the next page.
await new Promise(() => undefined);
}
private _apiCalled(ev) {

View File

@ -52,7 +52,7 @@ class HassioPagesWithTabs extends LitElement {
.narrow=${this.narrow}
hassio
></ha-menu-button>
<div main-title>Hass.io</div>
<div main-title>Supervisor</div>
${HAS_REFRESH_BUTTON.includes(page)
? html`
<paper-icon-button
@ -123,13 +123,9 @@ class HassioPagesWithTabs extends LitElement {
}
paper-tabs {
margin-left: 12px;
--paper-tabs-selection-bar-color: #fff;
--paper-tabs-selection-bar-color: var(--text-primary-color, #fff);
text-transform: uppercase;
}
app-header,
app-toolbar {
background-color: var(--primary-color);
}
`,
];
}

View File

@ -1,48 +1,43 @@
import { css } from "lit-element";
const documentContainer = document.createElement("template");
documentContainer.setAttribute("style", "display: none;");
export const hassioStyle = css`
.card-group {
margin-top: 24px;
.content {
margin: 8px;
}
.card-group .title {
h1 {
color: var(--primary-text-color);
font-size: 2em;
padding-left: 8px;
margin-bottom: 8px;
font-family: var(--paper-font-headline_-_font-family);
-webkit-font-smoothing: var(--paper-font-headline_-_-webkit-font-smoothing);
font-size: var(--paper-font-headline_-_font-size);
font-weight: var(--paper-font-headline_-_font-weight);
letter-spacing: var(--paper-font-headline_-_letter-spacing);
line-height: var(--paper-font-headline_-_line-height);
padding-left: 8px;
}
.card-group .description {
font-size: 0.5em;
font-weight: 500;
.description {
margin-top: 4px;
padding-left: 8px;
}
.card-group paper-card {
--card-group-columns: 4;
width: calc(
(100% - 12px * var(--card-group-columns)) / var(--card-group-columns)
);
margin: 4px;
vertical-align: top;
.card-group {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
grid-gap: 8px;
}
@media screen and (max-width: 1200px) and (min-width: 901px) {
.card-group paper-card {
--card-group-columns: 3;
@media screen and (min-width: 640px) {
.card-group {
grid-template-columns: repeat(auto-fit, minmax(300px, 0.5fr));
}
}
@media screen and (max-width: 900px) and (min-width: 601px) {
.card-group paper-card {
--card-group-columns: 2;
@media screen and (min-width: 1020px) {
.card-group {
grid-template-columns: repeat(auto-fit, minmax(300px, 0.333fr));
}
}
@media screen and (max-width: 600px) and (min-width: 0) {
.card-group paper-card {
width: 100%;
margin: 4px 0;
}
.content {
padding: 0;
@media screen and (min-width: 1300px) {
.card-group {
grid-template-columns: repeat(auto-fit, minmax(300px, 0.25fr));
}
}
ha-call-api-button {
@ -50,17 +45,7 @@ export const hassioStyle = css`
color: var(--primary-color);
}
.error {
color: var(--google-red-500);
color: var(--error-color);
margin-top: 16px;
}
`;
documentContainer.innerHTML = `<dom-module id="hassio-style">
<template>
<style>
${hassioStyle.toString()}
</style>
</template>
</dom-module>`;
document.head.appendChild(documentContainer.content);

View File

@ -79,14 +79,14 @@ class HassioSnapshots extends LitElement {
protected render(): TemplateResult {
return html`
<div class="content">
<h1>
Create snapshot
</h1>
<p class="description">
Snapshots allow you to easily backup and restore all data of your Home
Assistant instance.
</p>
<div class="card-group">
<div class="title">
Create snapshot
<div class="description">
Snapshots allow you to easily backup and restore all data of your
Hass.io instance.
</div>
</div>
<paper-card>
<div class="card-content">
<paper-input
@ -173,8 +173,8 @@ class HassioSnapshots extends LitElement {
</paper-card>
</div>
<h1>Available snapshots</h1>
<div class="card-group">
<div class="title">Available snapshots</div>
${this._snapshots === undefined
? undefined
: this._snapshots.length === 0

View File

@ -126,23 +126,13 @@ class HassioHostInfo extends LitElement {
hassioStyle,
css`
paper-card {
display: inline-block;
width: 400px;
margin-left: 8px;
height: 100%;
width: 100%;
}
.card-content {
height: 200px;
color: var(--primary-text-color);
}
@media screen and (max-width: 830px) {
paper-card {
margin-top: 8px;
margin-left: 0;
width: 100%;
}
.card-content {
height: auto;
}
box-sizing: border-box;
height: calc(100% - 47px);
}
.info {
width: 100%;

View File

@ -32,7 +32,7 @@ class HassioSupervisorInfo extends LitElement {
return html`
<paper-card>
<div class="card-content">
<h2>Hass.io supervisor</h2>
<h2>Supervisor</h2>
<table class="info">
<tbody>
<tr>
@ -103,20 +103,13 @@ class HassioSupervisorInfo extends LitElement {
hassioStyle,
css`
paper-card {
display: inline-block;
width: 400px;
height: 100%;
width: 100%;
}
.card-content {
height: 200px;
color: var(--primary-text-color);
}
@media screen and (max-width: 830px) {
paper-card {
width: 100%;
}
.card-content {
height: auto;
}
box-sizing: border-box;
height: calc(100% - 47px);
}
.info {
width: 100%;

View File

@ -50,6 +50,9 @@ class HassioSupervisorLog extends LitElement {
hassioStyle,
ANSI_HTML_STYLE,
css`
paper-card {
width: 100%;
}
pre {
white-space: pre-wrap;
}

View File

@ -32,17 +32,19 @@ class HassioSystem extends LitElement {
public render(): TemplateResult | void {
return html`
<div class="content">
<div class="title">Information</div>
<hassio-supervisor-info
.hass=${this.hass}
.supervisorInfo=${this.supervisorInfo}
></hassio-supervisor-info>
<hassio-host-info
.hass=${this.hass}
.hostInfo=${this.hostInfo}
.hassOsInfo=${this.hassOsInfo}
></hassio-host-info>
<div class="title">System log</div>
<h1>Information</h1>
<div class="card-group">
<hassio-supervisor-info
.hass=${this.hass}
.supervisorInfo=${this.supervisorInfo}
></hassio-supervisor-info>
<hassio-host-info
.hass=${this.hass}
.hostInfo=${this.hostInfo}
.hassOsInfo=${this.hassOsInfo}
></hassio-host-info>
</div>
<h1>System log</h1>
<hassio-supervisor-log .hass=${this.hass}></hassio-supervisor-log>
</div>
`;
@ -54,7 +56,7 @@ class HassioSystem extends LitElement {
hassioStyle,
css`
.content {
margin: 4px;
margin: 8px;
color: var(--primary-text-color);
}
.title {
@ -64,6 +66,9 @@ class HassioSystem extends LitElement {
padding-left: 8px;
margin-bottom: 8px;
}
hassio-supervisor-log {
width: 100%;
}
`,
];
}

View File

@ -27,7 +27,7 @@
"@material/mwc-fab": "^0.10.0",
"@material/mwc-ripple": "^0.10.0",
"@material/mwc-switch": "^0.10.0",
"@mdi/svg": "4.8.95",
"@mdi/svg": "4.9.95",
"@polymer/app-layout": "^3.0.2",
"@polymer/app-localize-behavior": "^3.0.1",
"@polymer/app-route": "^3.0.2",

View File

@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
version="20200130.3",
version="20200212.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",

View File

@ -0,0 +1,31 @@
// Check for support of native locale string options
function checkToLocaleDateStringSupportsOptions() {
try {
new Date().toLocaleDateString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
function checkToLocaleTimeStringSupportsOptions() {
try {
new Date().toLocaleTimeString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
function checkToLocaleStringSupportsOptions() {
try {
new Date().toLocaleString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
export const toLocaleDateStringSupportsOptions = checkToLocaleDateStringSupportsOptions();
export const toLocaleTimeStringSupportsOptions = checkToLocaleTimeStringSupportsOptions();
export const toLocaleStringSupportsOptions = checkToLocaleStringSupportsOptions();

View File

@ -1,20 +1,11 @@
import fecha from "fecha";
import { toLocaleDateStringSupportsOptions } from "./check_options_support";
// Check for support of native locale string options
function toLocaleDateStringSupportsOptions() {
try {
new Date().toLocaleDateString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
export default toLocaleDateStringSupportsOptions()
export const formatDate = toLocaleDateStringSupportsOptions
? (dateObj: Date, locales: string) =>
dateObj.toLocaleDateString(locales, {
year: "numeric",
month: "long",
day: "numeric",
})
: (dateObj: Date) => fecha.format(dateObj, "mediumDate");
: (dateObj: Date) => fecha.format(dateObj, "longDate");

View File

@ -1,16 +1,7 @@
import fecha from "fecha";
import { toLocaleStringSupportsOptions } from "./check_options_support";
// Check for support of native locale string options
function toLocaleStringSupportsOptions() {
try {
new Date().toLocaleString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
export default toLocaleStringSupportsOptions()
export const formatDateTime = toLocaleStringSupportsOptions
? (dateObj: Date, locales: string) =>
dateObj.toLocaleString(locales, {
year: "numeric",
@ -19,4 +10,24 @@ export default toLocaleStringSupportsOptions()
hour: "numeric",
minute: "2-digit",
})
: (dateObj: Date) => fecha.format(dateObj, "haDateTime");
: (dateObj: Date) =>
fecha.format(
dateObj,
`${fecha.masks.longDate}, ${fecha.masks.shortTime}`
);
export const formatDateTimeWithSeconds = toLocaleStringSupportsOptions
? (dateObj: Date, locales: string) =>
dateObj.toLocaleString(locales, {
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
minute: "2-digit",
second: "2-digit",
})
: (dateObj: Date) =>
fecha.format(
dateObj,
`${fecha.masks.longDate}, ${fecha.masks.mediumTime}`
);

View File

@ -1,19 +1,19 @@
import fecha from "fecha";
import { toLocaleTimeStringSupportsOptions } from "./check_options_support";
// Check for support of native locale string options
function toLocaleTimeStringSupportsOptions() {
try {
new Date().toLocaleTimeString("i");
} catch (e) {
return e.name === "RangeError";
}
return false;
}
export default toLocaleTimeStringSupportsOptions()
export const formatTime = toLocaleTimeStringSupportsOptions
? (dateObj: Date, locales: string) =>
dateObj.toLocaleTimeString(locales, {
hour: "numeric",
minute: "2-digit",
})
: (dateObj: Date) => fecha.format(dateObj, "shortTime");
export const formatTimeWithSeconds = toLocaleTimeStringSupportsOptions
? (dateObj: Date, locales: string) =>
dateObj.toLocaleTimeString(locales, {
hour: "numeric",
minute: "2-digit",
second: "2-digit",
})
: (dateObj: Date) => fecha.format(dateObj, "mediumTime");

View File

@ -1,3 +1,5 @@
import { derivedStyles } from "../../resources/styles";
const hexToRgb = (hex: string): string | null => {
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
const checkHex = hex.replace(shorthandRegex, (_m, r, g, b) => {
@ -36,7 +38,7 @@ export const applyThemesOnElement = (
}
const styles = { ...element._themes };
if (themeName !== "default") {
const theme = themes.themes[themeName];
const theme = { ...derivedStyles, ...themes.themes[themeName] };
Object.keys(theme).forEach((key) => {
const prefixedKey = `--${key}`;
element._themes[prefixedKey] = "";

View File

@ -1,8 +1,8 @@
import { HassEntity } from "home-assistant-js-websocket";
import { computeStateDomain } from "./compute_state_domain";
import formatDateTime from "../datetime/format_date_time";
import formatDate from "../datetime/format_date";
import formatTime from "../datetime/format_time";
import { formatDateTime } from "../datetime/format_date_time";
import { formatDate } from "../datetime/format_date";
import { formatTime } from "../datetime/format_time";
import { LocalizeFunc } from "../translations/localize";
export const computeStateDisplay = (

View File

@ -1,7 +1,6 @@
import { css } from "lit-element";
export const iconColorCSS = css`
ha-icon[data-domain="alarm_control_panel"][data-state="disarmed"],
ha-icon[data-domain="alert"][data-state="on"],
ha-icon[data-domain="automation"][data-state="on"],
ha-icon[data-domain="binary_sensor"][data-state="on"],
@ -30,6 +29,34 @@ export const iconColorCSS = css`
color: var(--heat-color, #ff8100);
}
ha-icon[data-domain="alarm_control_panel"] {
color: var(--alarm-color-armed, var(--label-badge-red));
}
ha-icon[data-domain="alarm_control_panel"][data-state="disarmed"] {
color: var(--alarm-color-disarmed, var(--label-badge-green));
}
ha-icon[data-domain="alarm_control_panel"][data-state="pending"],
ha-icon[data-domain="alarm_control_panel"][data-state="arming"] {
color: var(--alarm-color-pending, var(--label-badge-yellow));
animation: pulse 1s infinite;
}
ha-icon[data-domain="alarm_control_panel"][data-state="triggered"] {
color: var(--alarm-color-triggered, var(--label-badge-red));
animation: pulse 1s infinite;
}
@keyframes pulse {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
ha-icon[data-domain="plant"][data-state="problem"],
ha-icon[data-domain="zwave"][data-state="dead"] {
color: var(--error-state-color, #db4437);

View File

@ -6,7 +6,7 @@ import { Debouncer } from "@polymer/polymer/lib/utils/debounce";
import { timeOut } from "@polymer/polymer/lib/utils/async";
import { mixinBehaviors } from "@polymer/polymer/lib/legacy/class";
import formatTime from "../../common/datetime/format_time";
import { formatTime } from "../../common/datetime/format_time";
// eslint-disable-next-line no-unused-vars
/* global Chart moment Color */

View File

@ -1,15 +1,27 @@
import { customElement, CSSResult, css, query, html } from "lit-element";
import {
customElement,
CSSResult,
css,
query,
html,
property,
} from "lit-element";
import "@material/mwc-switch";
import { style } from "@material/mwc-switch/mwc-switch-css";
// tslint:disable-next-line
import { Switch } from "@material/mwc-switch";
import { Constructor } from "../types";
import { forwardHaptic } from "../data/haptics";
import { ripple } from "@material/mwc-ripple/ripple-directive";
// tslint:disable-next-line
const MwcSwitch = customElements.get("mwc-switch") as Constructor<Switch>;
@customElement("ha-switch")
export class HaSwitch extends MwcSwitch {
// Generate a haptic vibration.
// Only set to true if the new value of the switch is applied right away when toggling.
// Do not add haptic when a user is required to press save.
@property({ type: Boolean }) public haptic = false;
@query("slot") private _slot!: HTMLSlotElement;
protected firstUpdated() {
@ -22,6 +34,11 @@ export class HaSwitch extends MwcSwitch {
"slotted",
Boolean(this._slot.assignedNodes().length)
);
this.addEventListener("change", () => {
if (this.haptic) {
forwardHaptic("light");
}
});
}
protected render() {

View File

@ -21,9 +21,10 @@ const isEmpty = (obj: object) => {
@customElement("ha-yaml-editor")
export class HaYamlEditor extends LitElement {
@property() public value?: any;
@property() public defaultValue?: any;
@property() public isValid = true;
@property() public label?: string;
@property() private _yaml?: string;
@property() private _yaml: string = "";
@query("ha-code-editor") private _editor?: HaCodeEditor;
public setValue(value) {
@ -40,7 +41,9 @@ export class HaYamlEditor extends LitElement {
}
protected firstUpdated() {
this.setValue(this.value);
if (this.defaultValue) {
this.setValue(this.defaultValue);
}
}
protected render() {
@ -71,7 +74,6 @@ export class HaYamlEditor extends LitElement {
if (value) {
try {
parsed = safeLoad(value);
isValid = true;
} catch (err) {
// Invalid YAML
isValid = false;
@ -83,9 +85,7 @@ export class HaYamlEditor extends LitElement {
this.value = parsed;
this.isValid = isValid;
if (isValid) {
fireEvent(this, "value-changed", { value: parsed });
}
fireEvent(this, "value-changed", { value: parsed, isValid } as any);
}
}

View File

@ -5,7 +5,7 @@ import { PolymerElement } from "@polymer/polymer/polymer-element";
import "./entity/ha-chart-base";
import LocalizeMixin from "../mixins/localize-mixin";
import formatDateTime from "../common/datetime/format_date_time";
import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time";
class StateHistoryChartLine extends LocalizeMixin(PolymerElement) {
static get template() {
@ -317,7 +317,7 @@ class StateHistoryChartLine extends LocalizeMixin(PolymerElement) {
const item = items[0];
const date = data.datasets[item.datasetIndex].data[item.index].x;
return formatDateTime(date, this.hass.language);
return formatDateTimeWithSeconds(date, this.hass.language);
};
const chartOptions = {

View File

@ -6,7 +6,7 @@ import LocalizeMixin from "../mixins/localize-mixin";
import "./entity/ha-chart-base";
import formatDateTime from "../common/datetime/format_date_time";
import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time";
import { computeRTL } from "../common/util/compute_rtl";
class StateHistoryChartTimeline extends LocalizeMixin(PolymerElement) {
@ -165,8 +165,8 @@ class StateHistoryChartTimeline extends LocalizeMixin(PolymerElement) {
const formatTooltipLabel = (item, data) => {
const values = data.datasets[item.datasetIndex].data[item.index];
const start = formatDateTime(values[0], this.hass.language);
const end = formatDateTime(values[1], this.hass.language);
const start = formatDateTimeWithSeconds(values[0], this.hass.language);
const end = formatDateTimeWithSeconds(values[1], this.hass.language);
const state = values[2];
return [state, start, end];

View File

@ -101,14 +101,16 @@ export const localizeDeviceAutomationAction = (
action: DeviceAction
) => {
const state = action.entity_id ? hass.states[action.entity_id] : undefined;
return hass.localize(
`component.${action.domain}.device_automation.action_type.${action.type}`,
"entity_name",
state ? computeStateName(state) : "<unknown>",
"subtype",
return (
hass.localize(
`component.${action.domain}.device_automation.action_subtype.${action.subtype}`
)
`component.${action.domain}.device_automation.action_type.${action.type}`,
"entity_name",
state ? computeStateName(state) : action.entity_id || "<unknown>",
"subtype",
hass.localize(
`component.${action.domain}.device_automation.action_subtype.${action.subtype}`
) || action.subtype
) || `"${action.subtype}" ${action.type}`
);
};
@ -119,14 +121,16 @@ export const localizeDeviceAutomationCondition = (
const state = condition.entity_id
? hass.states[condition.entity_id]
: undefined;
return hass.localize(
`component.${condition.domain}.device_automation.condition_type.${condition.type}`,
"entity_name",
state ? computeStateName(state) : "<unknown>",
"subtype",
return (
hass.localize(
`component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}`
)
`component.${condition.domain}.device_automation.condition_type.${condition.type}`,
"entity_name",
state ? computeStateName(state) : condition.entity_id || "<unknown>",
"subtype",
hass.localize(
`component.${condition.domain}.device_automation.condition_subtype.${condition.subtype}`
) || condition.subtype
) || `"${condition.subtype}" ${condition.type}`
);
};
@ -135,13 +139,15 @@ export const localizeDeviceAutomationTrigger = (
trigger: DeviceTrigger
) => {
const state = trigger.entity_id ? hass.states[trigger.entity_id] : undefined;
return hass.localize(
`component.${trigger.domain}.device_automation.trigger_type.${trigger.type}`,
"entity_name",
state ? computeStateName(state) : "<unknown>",
"subtype",
return (
hass.localize(
`component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}`
)
`component.${trigger.domain}.device_automation.trigger_type.${trigger.type}`,
"entity_name",
state ? computeStateName(state) : trigger.entity_id || "<unknown>",
"subtype",
hass.localize(
`component.${trigger.domain}.device_automation.trigger_subtype.${trigger.subtype}`
) || trigger.subtype
) || `"${trigger.subtype}" ${trigger.type}`
);
};

View File

@ -1,4 +1,5 @@
export const UNAVAILABLE = "unavailable";
export const UNKNOWN = "unknown";
export const ENTITY_COMPONENT_DOMAINS = [
"air_quality",

View File

@ -2,12 +2,15 @@ import { HomeAssistant } from "../../types";
import { HassioResponse, hassioApiResultExtractor } from "./common";
export interface HassioHardwareAudioDevice {
device?: string;
device?: string | null;
name: string;
}
interface HassioHardwareAudioList {
audio: { input: any; output: any };
audio: {
input: { [key: string]: string };
output: { [key: string]: string };
};
}
export interface HassioHardwareInfo {

1
src/data/sensor.ts Normal file
View File

@ -0,0 +1 @@
export const SENSOR_DEVICE_CLASS_BATTERY = "battery";

22
src/data/vacuum.ts Normal file
View File

@ -0,0 +1,22 @@
import {
HassEntityAttributeBase,
HassEntityBase,
} from "home-assistant-js-websocket";
export const VACUUM_SUPPORT_PAUSE = 4;
export const VACUUM_SUPPORT_STOP = 8;
export const VACUUM_SUPPORT_RETURN_HOME = 16;
export const VACUUM_SUPPORT_FAN_SPEED = 32;
export const VACUUM_SUPPORT_BATTERY = 64;
export const VACUUM_SUPPORT_STATUS = 128;
export const VACUUM_SUPPORT_LOCATE = 512;
export const VACUUM_SUPPORT_CLEAN_SPOT = 1024;
export const VACUUM_SUPPORT_START = 8192;
export type VacuumEntity = HassEntityBase & {
attributes: HassEntityAttributeBase & {
battery_level: number;
fan_speed: any;
[key: string]: any;
};
};

View File

@ -8,7 +8,7 @@ const fetchThemes = (conn) =>
const subscribeUpdates = (conn, store) =>
conn.subscribeEvents(
(event) => store.setState(event.data, true),
() => fetchThemes(conn).then((data) => store.setState(data, true)),
"themes_updated"
);

View File

@ -39,7 +39,8 @@ class StepFlowPickHandler extends LitElement {
private _getHandlers = memoizeOne((h: string[], filter?: string) => {
const handlers: HandlerObj[] = h.map((handler) => {
return {
name: this.hass.localize(`component.${handler}.config.title`),
name:
this.hass.localize(`component.${handler}.config.title`) || handler,
slug: handler,
};
});

View File

@ -1,26 +1,32 @@
import { fireEvent } from "../../common/dom/fire_event";
interface AlertDialogParams {
interface BaseDialogParams {
confirmText?: string;
text?: string;
title?: string;
confirm?: (out?: string) => void;
}
interface ConfirmationDialogParams extends AlertDialogParams {
export interface AlertDialogParams extends BaseDialogParams {
confirm?: () => void;
}
export interface ConfirmationDialogParams extends BaseDialogParams {
dismissText?: string;
confirm?: () => void;
cancel?: () => void;
}
interface PromptDialogParams extends AlertDialogParams {
export interface PromptDialogParams extends BaseDialogParams {
inputLabel?: string;
inputType?: string;
defaultValue?: string;
confirm?: (out?: string) => void;
}
export interface DialogParams
extends ConfirmationDialogParams,
PromptDialogParams {
confirm?: (out?: string) => void;
confirmation?: boolean;
prompt?: boolean;
}
@ -28,35 +34,57 @@ export interface DialogParams
export const loadGenericDialog = () =>
import(/* webpackChunkName: "confirmation" */ "./dialog-box");
const showDialogHelper = (
element: HTMLElement,
dialogParams: DialogParams,
extra?: {
confirmation?: DialogParams["confirmation"];
prompt?: DialogParams["prompt"];
}
) =>
new Promise((resolve) => {
const origCancel = dialogParams.cancel;
const origConfirm = dialogParams.confirm;
fireEvent(element, "show-dialog", {
dialogTag: "dialog-box",
dialogImport: loadGenericDialog,
dialogParams: {
...dialogParams,
...extra,
cancel: () => {
resolve(extra?.prompt ? null : false);
if (origCancel) {
origCancel();
}
},
confirm: (out) => {
resolve(extra?.prompt ? out : true);
if (origConfirm) {
origConfirm(out);
}
},
},
});
});
export const showAlertDialog = (
element: HTMLElement,
dialogParams: AlertDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-box",
dialogImport: loadGenericDialog,
dialogParams,
});
};
) => showDialogHelper(element, dialogParams);
export const showConfirmationDialog = (
element: HTMLElement,
dialogParams: ConfirmationDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-box",
dialogImport: loadGenericDialog,
dialogParams: { ...dialogParams, confirmation: true },
});
};
) =>
showDialogHelper(element, dialogParams, { confirmation: true }) as Promise<
boolean
>;
export const showPromptDialog = (
element: HTMLElement,
dialogParams: PromptDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-box",
dialogImport: loadGenericDialog,
dialogParams: { ...dialogParams, prompt: true },
});
};
) =>
showDialogHelper(element, dialogParams, { prompt: true }) as Promise<
null | string
>;

View File

@ -80,7 +80,7 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) {
class="no-padding"
hass="[[hass]]"
state-obj="[[stateObj]]"
dialog-element="[[_dialogElement]]"
dialog-element="[[_dialogElement()]]"
registry-entry="[[_registryInfo]]"
large="{{large}}"
></more-info-controls>
@ -102,7 +102,6 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) {
observer: "_largeChanged",
},
_dialogElement: Object,
_registryInfo: Object,
dataDomain: {
@ -116,9 +115,8 @@ class HaMoreInfoDialog extends DialogMixin(PolymerElement) {
return ["_dialogOpenChanged(opened)"];
}
ready() {
super.ready();
this._dialogElement = this;
_dialogElement() {
return this;
}
_computeDomain(stateObj) {

View File

@ -100,7 +100,8 @@ class MoreInfoClimate extends LitElement {
</div>
`
: ""}
${stateObj.attributes.temperature !== undefined
${stateObj.attributes.temperature !== undefined &&
stateObj.attributes.temperature !== null
? html`
<ha-climate-control
.value=${stateObj.attributes.temperature}
@ -112,8 +113,10 @@ class MoreInfoClimate extends LitElement {
></ha-climate-control>
`
: ""}
${stateObj.attributes.target_temp_low !== undefined ||
stateObj.attributes.target_temp_high !== undefined
${(stateObj.attributes.target_temp_low !== undefined &&
stateObj.attributes.target_temp_low !== null) ||
(stateObj.attributes.target_temp_high !== undefined &&
stateObj.attributes.target_temp_high !== null)
? html`
<ha-climate-control
.value=${stateObj.attributes.target_temp_low}

View File

@ -11,7 +11,7 @@ import { HassEntity } from "home-assistant-js-websocket";
import "../../../components/ha-relative-time";
import formatTime from "../../../common/datetime/format_time";
import { formatTime } from "../../../common/datetime/format_time";
import { HomeAssistant } from "../../../types";
@customElement("more-info-sun")

View File

@ -1,263 +0,0 @@
import "@polymer/iron-flex-layout/iron-flex-layout-classes";
import "@polymer/iron-icon/iron-icon";
import "@polymer/paper-icon-button/paper-icon-button";
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/ha-attributes";
import "../../../components/ha-paper-dropdown-menu";
import { supportsFeature } from "../../../common/entity/supports-feature";
class MoreInfoVacuum extends PolymerElement {
static get template() {
return html`
<style include="iron-flex iron-flex-alignment"></style>
<style>
:host {
@apply --paper-font-body1;
line-height: 1.5;
}
.status-subtitle {
color: var(--secondary-text-color);
}
paper-item {
cursor: pointer;
}
</style>
<div class="horizontal justified layout">
<div hidden$="[[!supportsStatus(stateObj)]]">
<span class="status-subtitle">Status: </span
><span><strong>[[stateObj.attributes.status]]</strong></span>
</div>
<div hidden$="[[!supportsBattery(stateObj)]]">
<span
><iron-icon icon="[[stateObj.attributes.battery_icon]]"></iron-icon>
[[stateObj.attributes.battery_level]] %</span
>
</div>
</div>
<div hidden$="[[!supportsCommandBar(stateObj)]]">
<p></p>
<div class="status-subtitle">Vacuum cleaner commands:</div>
<div class="horizontal justified layout">
<template is="dom-if" if="[[supportsStart(stateObj)]]">
<div>
<paper-icon-button
icon="hass:play"
on-click="onStart"
title="Start"
></paper-icon-button>
</div>
<div hidden$="[[!supportsPause(stateObj)]]">
<paper-icon-button
icon="hass:pause"
on-click="onPause"
title="Pause"
></paper-icon-button>
</div>
</template>
<template is="dom-if" if="[[!supportsStart(stateObj)]]">
<div hidden$="[[!supportsPause(stateObj)]]">
<paper-icon-button
icon="hass:play-pause"
on-click="onPlayPause"
title="Pause"
></paper-icon-button>
</div>
</template>
<div hidden$="[[!supportsStop(stateObj)]]">
<paper-icon-button
icon="hass:stop"
on-click="onStop"
title="Stop"
></paper-icon-button>
</div>
<div hidden$="[[!supportsCleanSpot(stateObj)]]">
<paper-icon-button
icon="hass:broom"
on-click="onCleanSpot"
title="Clean spot"
></paper-icon-button>
</div>
<div hidden$="[[!supportsLocate(stateObj)]]">
<paper-icon-button
icon="hass:map-marker"
on-click="onLocate"
title="Locate"
></paper-icon-button>
</div>
<div hidden$="[[!supportsReturnHome(stateObj)]]">
<paper-icon-button
icon="hass:home-map-marker"
on-click="onReturnHome"
title="Return home"
></paper-icon-button>
</div>
</div>
</div>
<div hidden$="[[!supportsFanSpeed(stateObj)]]">
<div class="horizontal justified layout">
<ha-paper-dropdown-menu
label-float=""
dynamic-align=""
label="Fan speed"
>
<paper-listbox
slot="dropdown-content"
selected="[[stateObj.attributes.fan_speed]]"
on-selected-changed="fanSpeedChanged"
attr-for-selected="item-name"
>
<template
is="dom-repeat"
items="[[stateObj.attributes.fan_speed_list]]"
>
<paper-item item-name$="[[item]]">[[item]]</paper-item>
</template>
</paper-listbox>
</ha-paper-dropdown-menu>
<div
style="justify-content: center; align-self: center; padding-top: 1.3em"
>
<span
><iron-icon icon="hass:fan"></iron-icon>
[[stateObj.attributes.fan_speed]]</span
>
</div>
</div>
<p></p>
</div>
<ha-attributes
state-obj="[[stateObj]]"
extra-filters="fan_speed,fan_speed_list,status,battery_level,battery_icon"
></ha-attributes>
`;
}
static get properties() {
return {
hass: {
type: Object,
},
inDialog: {
type: Boolean,
value: false,
},
stateObj: {
type: Object,
},
};
}
supportsPause(stateObj) {
return supportsFeature(stateObj, 4);
}
supportsStop(stateObj) {
return supportsFeature(stateObj, 8);
}
supportsReturnHome(stateObj) {
return supportsFeature(stateObj, 16);
}
supportsFanSpeed(stateObj) {
return supportsFeature(stateObj, 32);
}
supportsBattery(stateObj) {
return supportsFeature(stateObj, 64);
}
supportsStatus(stateObj) {
return supportsFeature(stateObj, 128);
}
supportsLocate(stateObj) {
return supportsFeature(stateObj, 512);
}
supportsCleanSpot(stateObj) {
return supportsFeature(stateObj, 1024);
}
supportsStart(stateObj) {
return supportsFeature(stateObj, 8192);
}
supportsCommandBar(stateObj) {
return (
supportsFeature(stateObj, 4) |
supportsFeature(stateObj, 8) |
supportsFeature(stateObj, 16) |
supportsFeature(stateObj, 512) |
supportsFeature(stateObj, 1024) |
supportsFeature(stateObj, 8192)
);
}
fanSpeedChanged(ev) {
var oldVal = this.stateObj.attributes.fan_speed;
var newVal = ev.detail.value;
if (!newVal || oldVal === newVal) return;
this.hass.callService("vacuum", "set_fan_speed", {
entity_id: this.stateObj.entity_id,
fan_speed: newVal,
});
}
onStop() {
this.hass.callService("vacuum", "stop", {
entity_id: this.stateObj.entity_id,
});
}
onPlayPause() {
this.hass.callService("vacuum", "start_pause", {
entity_id: this.stateObj.entity_id,
});
}
onPause() {
this.hass.callService("vacuum", "pause", {
entity_id: this.stateObj.entity_id,
});
}
onStart() {
this.hass.callService("vacuum", "start", {
entity_id: this.stateObj.entity_id,
});
}
onLocate() {
this.hass.callService("vacuum", "locate", {
entity_id: this.stateObj.entity_id,
});
}
onCleanSpot() {
this.hass.callService("vacuum", "clean_spot", {
entity_id: this.stateObj.entity_id,
});
}
onReturnHome() {
this.hass.callService("vacuum", "return_to_base", {
entity_id: this.stateObj.entity_id,
});
}
}
customElements.define("more-info-vacuum", MoreInfoVacuum);

View File

@ -0,0 +1,256 @@
import "@polymer/iron-icon/iron-icon";
import "@polymer/paper-icon-button/paper-icon-button";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import {
css,
CSSResult,
customElement,
html,
LitElement,
property,
TemplateResult,
} from "lit-element";
import { supportsFeature } from "../../../common/entity/supports-feature";
import { HomeAssistant } from "../../../types";
import "../../../components/ha-paper-dropdown-menu";
import "../../../components/ha-attributes";
import {
VACUUM_SUPPORT_BATTERY,
VACUUM_SUPPORT_CLEAN_SPOT,
VACUUM_SUPPORT_FAN_SPEED,
VACUUM_SUPPORT_LOCATE,
VACUUM_SUPPORT_PAUSE,
VACUUM_SUPPORT_RETURN_HOME,
VACUUM_SUPPORT_START,
VACUUM_SUPPORT_STATUS,
VACUUM_SUPPORT_STOP,
VacuumEntity,
} from "../../../data/vacuum";
interface VacuumCommand {
translationKey: string;
icon: string;
serviceName: string;
isVisible: (stateObj: VacuumEntity) => boolean;
}
const VACUUM_COMMANDS: VacuumCommand[] = [
{
translationKey: "start",
icon: "hass:play",
serviceName: "start",
isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_START),
},
{
translationKey: "pause",
icon: "hass:pause",
serviceName: "pause",
isVisible: (stateObj) =>
// We need also to check if Start is supported because if not we show play-pause
supportsFeature(stateObj, VACUUM_SUPPORT_START) &&
supportsFeature(stateObj, VACUUM_SUPPORT_PAUSE),
},
{
translationKey: "start_pause",
icon: "hass:play-pause",
serviceName: "start_pause",
isVisible: (stateObj) =>
// If start is supported, we don't show this button
!supportsFeature(stateObj, VACUUM_SUPPORT_START) &&
supportsFeature(stateObj, VACUUM_SUPPORT_PAUSE),
},
{
translationKey: "stop",
icon: "hass:stop",
serviceName: "stop",
isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_STOP),
},
{
translationKey: "clean_spot",
icon: "hass:broom",
serviceName: "clean_spot",
isVisible: (stateObj) =>
supportsFeature(stateObj, VACUUM_SUPPORT_CLEAN_SPOT),
},
{
translationKey: "locate",
icon: "hass:map-marker",
serviceName: "locate",
isVisible: (stateObj) => supportsFeature(stateObj, VACUUM_SUPPORT_LOCATE),
},
{
translationKey: "return_home",
icon: "hass:home-map-marker",
serviceName: "return_to_base",
isVisible: (stateObj) =>
supportsFeature(stateObj, VACUUM_SUPPORT_RETURN_HOME),
},
];
@customElement("more-info-vacuum")
class MoreInfoVacuum extends LitElement {
@property() public hass!: HomeAssistant;
@property() public stateObj?: VacuumEntity;
protected render(): TemplateResult {
if (!this.hass || !this.stateObj) {
return html``;
}
const stateObj = this.stateObj;
const filterExtraAttributes =
"fan_speed,fan_speed_list,status,battery_level,battery_icon";
return html`
<div class="flex-horizontal">
${supportsFeature(stateObj, VACUUM_SUPPORT_STATUS)
? html`
<div>
<span class="status-subtitle"
>${this.hass!.localize(
"ui.dialogs.more_info_control.vacuum.status"
)}:
</span>
<span><strong>${stateObj.attributes.status}</strong></span>
</div>
`
: ""}
${supportsFeature(stateObj, VACUUM_SUPPORT_BATTERY)
? html`
<div">
<span>
<iron-icon .icon=${stateObj.attributes.battery_icon}></iron-icon>
${stateObj.attributes.battery_level} %
</span>
</div>`
: ""}
</div>
${VACUUM_COMMANDS.some((item) => item.isVisible(stateObj))
? html`
<div>
<p></p>
<div class="status-subtitle">
${this.hass!.localize(
"ui.dialogs.more_info_control.vacuum.commands"
)}
</div>
<div class="flex-horizontal">
${VACUUM_COMMANDS.filter((item) =>
item.isVisible(stateObj)
).map(
(item) => html`
<div>
<paper-icon-button
.icon=${item.icon}
.entry=${item}
@click=${this.callService}
.title=${this.hass!.localize(
`ui.dialogs.more_info_control.vacuum.${item.translationKey}`
)}
></paper-icon-button>
</div>
`
)}
</div>
</div>
`
: ""}
${supportsFeature(stateObj, VACUUM_SUPPORT_FAN_SPEED)
? html`
<div>
<div class="flex-horizontal">
<ha-paper-dropdown-menu
.label=${this.hass!.localize(
"ui.dialogs.more_info_control.vacuum.fan_speed"
)}
>
<paper-listbox
slot="dropdown-content"
.selected=${stateObj.attributes.fan_speed}
@iron-select=${this.handleFanSpeedChanged}
attr-for-selected="item-name"
>
${stateObj.attributes.fan_speed_list!.map(
(mode) => html`
<paper-item .itemName=${mode}>
${mode}
</paper-item>
`
)}
</paper-listbox>
</ha-paper-dropdown-menu>
<div
style="justify-content: center; align-self: center; padding-top: 1.3em"
>
<span>
<iron-icon icon="hass:fan"></iron-icon>
${stateObj.attributes.fan_speed}
</span>
</div>
</div>
<p></p>
</div>
`
: ""}
<ha-attributes
.stateObj=${this.stateObj}
.extraFilters=${filterExtraAttributes}
></ha-attributes>
`;
}
private callService(ev: CustomEvent) {
const entry = (ev.target! as any).entry as VacuumCommand;
this.hass.callService("vacuum", entry.serviceName, {
entity_id: this.stateObj!.entity_id,
});
}
private handleFanSpeedChanged(ev: CustomEvent) {
const oldVal = this.stateObj!.attributes.fan_speed;
const newVal = ev.detail.item.itemName;
if (!newVal || oldVal === newVal) {
return;
}
this.hass.callService("vacuum", "set_fan_speed", {
entity_id: this.stateObj!.entity_id,
fan_speed: newVal,
});
}
static get styles(): CSSResult {
return css`
:host {
@apply --paper-font-body1;
line-height: 1.5;
}
.status-subtitle {
color: var(--secondary-text-color);
}
paper-item {
cursor: pointer;
}
.flex-horizontal {
display: flex;
flex-direction: row;
justify-content: space-between;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"more-info-vacuum": MoreInfoVacuum;
}
}

View File

@ -157,7 +157,7 @@ export default class HaAutomationActionRow extends LitElement {
`
: ""}
<ha-yaml-editor
.value=${this.action}
.defaultValue=${this.action}
@value-changed=${this._onYamlChange}
></ha-yaml-editor>
</div>
@ -238,6 +238,9 @@ export default class HaAutomationActionRow extends LitElement {
private _onYamlChange(ev: CustomEvent) {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
fireEvent(this, "value-changed", { value: ev.detail.value });
}

View File

@ -57,13 +57,17 @@ export class HaEventAction extends LitElement implements ActionElement {
"ui.panel.config.automation.editor.actions.type.event.service_data"
)}
.name=${"event_data"}
.value=${event_data}
.defaultValue=${event_data}
@value-changed=${this._dataChanged}
></ha-yaml-editor>
`;
}
private _dataChanged(ev: CustomEvent): void {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
this._actionData = ev.detail.value;
handleChangeEvent(this, ev);
}

View File

@ -94,13 +94,17 @@ export class HaServiceAction extends LitElement implements ActionElement {
"ui.panel.config.automation.editor.actions.type.service.service_data"
)}
.name=${"data"}
.value=${data}
.defaultValue=${data}
@value-changed=${this._dataChanged}
></ha-yaml-editor>
`;
}
private _dataChanged(ev: CustomEvent): void {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
this._actionData = ev.detail.value;
handleChangeEvent(this, ev);
}

View File

@ -54,7 +54,7 @@ export default class HaAutomationConditionEditor extends LitElement {
`
: ""}
<ha-yaml-editor
.value=${this.condition}
.defaultValue=${this.condition}
@value-changed=${this._onYamlChange}
></ha-yaml-editor>
</div>
@ -114,6 +114,9 @@ export default class HaAutomationConditionEditor extends LitElement {
private _onYamlChange(ev: CustomEvent) {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
fireEvent(this, "value-changed", { value: ev.detail.value });
}
}

View File

@ -28,7 +28,7 @@ import {
showAutomationEditor,
AutomationConfig,
} from "../../../data/automation";
import format_date_time from "../../../common/datetime/format_date_time";
import { formatDateTime } from "../../../common/datetime/format_date_time";
import { fireEvent } from "../../../common/dom/fire_event";
import { showThingtalkDialog } from "./show-dialog-thingtalk";
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
@ -102,7 +102,7 @@ class HaAutomationPicker extends LitElement {
"ui.card.automation.last_triggered"
)}: ${
automation.attributes.last_triggered
? format_date_time(
? formatDateTime(
new Date(automation.attributes.last_triggered),
this.hass.language
)

View File

@ -139,7 +139,7 @@ export default class HaAutomationTriggerRow extends LitElement {
`
: ""}
<ha-yaml-editor
.value=${this.trigger}
.defaultValue=${this.trigger}
@value-changed=${this._onYamlChange}
></ha-yaml-editor>
</div>
@ -213,6 +213,9 @@ export default class HaAutomationTriggerRow extends LitElement {
private _onYamlChange(ev: CustomEvent) {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
fireEvent(this, "value-changed", { value: ev.detail.value });
}

View File

@ -35,13 +35,17 @@ export class HaEventTrigger extends LitElement implements TriggerElement {
"ui.panel.config.automation.editor.triggers.type.event.event_data"
)}
.name=${"event_data"}
.value=${event_data}
.defaultValue=${event_data}
@value-changed=${this._valueChanged}
></ha-yaml-editor>
`;
}
private _valueChanged(ev: CustomEvent): void {
ev.stopPropagation();
if (!ev.detail.isValid) {
return;
}
handleChangeEvent(this, ev);
}
}

View File

@ -16,7 +16,7 @@ import "./cloud-remote-pref";
import { EventsMixin } from "../../../../mixins/events-mixin";
import { fetchCloudSubscriptionInfo } from "../../../../data/cloud";
import formatDateTime from "../../../../common/datetime/format_date_time";
import { formatDateTime } from "../../../../common/datetime/format_date_time";
import LocalizeMixin from "../../../../mixins/localize-mixin";
/*

View File

@ -16,7 +16,7 @@ import { HaPaperDialog } from "../../../../components/dialog/ha-paper-dialog";
import { HomeAssistant } from "../../../../types";
import { haStyle } from "../../../../resources/styles";
import { CloudCertificateParams as CloudCertificateDialogParams } from "./show-dialog-cloud-certificate";
import format_date_time from "../../../../common/datetime/format_date_time";
import { formatDateTime } from "../../../../common/datetime/format_date_time";
@customElement("dialog-cloud-certificate")
class DialogCloudCertificate extends LitElement {
@ -50,7 +50,7 @@ class DialogCloudCertificate extends LitElement {
${this.hass!.localize(
"ui.panel.config.cloud.dialog_certificate.certificate_expiration_date"
)}
${format_date_time(
${formatDateTime(
new Date(certificateInfo.expire_date),
this.hass!.language
)}<br />

View File

@ -177,26 +177,27 @@ export class EntityRegistrySettings extends LitElement {
}
}
private async _deleteEntry(): Promise<void> {
private async _confirmDeleteEntry(): Promise<void> {
if (
!(await showConfirmationDialog(this, {
text: this.hass.localize(
"ui.dialogs.entity_registry.editor.confirm_delete"
),
}))
) {
return;
}
this._submitting = true;
try {
await removeEntityRegistryEntry(this.hass!, this._entityId);
await removeEntityRegistryEntry(this.hass!, this._origEntityId);
fireEvent(this as HTMLElement, "close-dialog");
} finally {
this._submitting = false;
}
}
private _confirmDeleteEntry(): void {
showConfirmationDialog(this, {
text: this.hass.localize(
"ui.dialogs.entity_registry.editor.confirm_delete"
),
confirm: () => this._deleteEntry(),
});
}
private _disabledByChanged(ev: Event): void {
this._disabledBy = (ev.target as HaSwitch).checked ? null : "user";
}

View File

@ -13,7 +13,7 @@ import { HassEvent } from "home-assistant-js-websocket";
import { HomeAssistant } from "../../../types";
import { PolymerChangedEvent } from "../../../polymer-types";
import "../../../components/ha-card";
import format_time from "../../../common/datetime/format_time";
import { formatTime } from "../../../common/datetime/format_time";
@customElement("event-subscribe-card")
class EventSubscribeCard extends LitElement {
@ -78,7 +78,7 @@ class EventSubscribeCard extends LitElement {
"name",
ev.id
)}
${format_time(
${formatTime(
new Date(ev.event.time_fired),
this.hass!.language
)}:

View File

@ -11,6 +11,7 @@ import { HomeAssistant } from "../../../types";
import { haStyle } from "../../../resources/styles";
import "./system-health-card";
import "./integrations-card";
const JS_TYPE = __BUILD__;
const JS_VERSION = __VERSION__;
@ -149,6 +150,7 @@ class HaPanelDevInfo extends LitElement {
</div>
<div class="content">
<system-health-card .hass=${this.hass}></system-health-card>
<integrations-card .hass=${this.hass}></integrations-card>
</div>
`;
}
@ -205,7 +207,8 @@ class HaPanelDevInfo extends LitElement {
color: var(--dark-primary-color);
}
system-health-card {
system-health-card,
integrations-card {
display: block;
max-width: 600px;
margin: 0 auto;

View File

@ -0,0 +1,75 @@
import {
LitElement,
property,
TemplateResult,
html,
customElement,
CSSResult,
css,
} from "lit-element";
import { HomeAssistant } from "../../../types";
import memoizeOne from "memoize-one";
@customElement("integrations-card")
class IntegrationsCard extends LitElement {
@property() public hass!: HomeAssistant;
private _sortedIntegrations = memoizeOne((components: string[]) => {
return components.filter((comp) => !comp.includes(".")).sort();
});
protected render(): TemplateResult {
return html`
<ha-card header="Integrations">
<table class="card-content">
<tbody>
${this._sortedIntegrations(this.hass!.config.components).map(
(domain) => html`
<tr>
<td>${domain}</td>
<td>
<a
href=${`https://www.home-assistant.io/integrations/${domain}`}
target="_blank"
>
Documentation
</a>
</td>
<td>
<a
href=${`https://github.com/home-assistant/home-assistant/issues?q=is%3Aissue+is%3Aopen+label%3A%22integration%3A+${domain}%22`}
target="_blank"
>
Issues
</a>
</td>
</tr>
`
)}
</tbody>
</table>
</ha-card>
`;
}
static get styles(): CSSResult {
return css`
td {
line-height: 2em;
padding: 0 8px;
}
td:first-child {
padding-left: 0;
}
a {
color: var(--primary-color);
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"integrations-card": IntegrationsCard;
}
}

View File

@ -78,7 +78,7 @@ class SystemHealthCard extends LitElement {
}
return html`
<ha-card header="${this.hass.localize("domain.system_health")}">
<ha-card .header=${this.hass.localize("domain.system_health")}>
<div class="card-content">${sections}</div>
</ha-card>
`;

View File

@ -16,8 +16,8 @@ import "../../../components/buttons/ha-call-service-button";
import "../../../components/buttons/ha-progress-button";
import { HomeAssistant } from "../../../types";
import { LoggedError, fetchSystemLog } from "../../../data/system_log";
import formatDateTime from "../../../common/datetime/format_date_time";
import formatTime from "../../../common/datetime/format_time";
import { formatDateTimeWithSeconds } from "../../../common/datetime/format_date_time";
import { formatTimeWithSeconds } from "../../../common/datetime/format_time";
import { showSystemLogDetailDialog } from "./show-dialog-system-log-detail";
const formatLogTime = (date, language: string) => {
@ -26,8 +26,8 @@ const formatLogTime = (date, language: string) => {
const dateTimeDay = new Date(date * 1000).setHours(0, 0, 0, 0);
return dateTimeDay < today
? formatDateTime(dateTime, language)
: formatTime(dateTime, language);
? formatDateTimeWithSeconds(dateTime, language)
: formatTimeWithSeconds(dateTime, language);
};
@customElement("system-log-card")

View File

@ -120,10 +120,6 @@ class HaPanelDevMqtt extends LitElement {
direction: ltr;
}
mwc-button {
background-color: white;
}
mqtt-subscribe-card {
display: block;
margin: 16px auto;

View File

@ -11,7 +11,7 @@ import "@material/mwc-button";
import "@polymer/paper-input/paper-input";
import { HomeAssistant } from "../../../types";
import "../../../components/ha-card";
import format_time from "../../../common/datetime/format_time";
import { formatTime } from "../../../common/datetime/format_time";
import { subscribeMQTTTopic, MQTTMessage } from "../../../data/mqtt";
@ -85,7 +85,7 @@ class MqttSubscribeCard extends LitElement {
"topic",
msg.message.topic,
"time",
format_time(msg.time, this.hass!.language)
formatTime(msg.time, this.hass!.language)
)}
<pre>${msg.payload}</pre>
<div class="bottom">

View File

@ -16,7 +16,7 @@ import "../../data/ha-state-history-data";
import "../../resources/ha-date-picker-style";
import "../../resources/ha-style";
import formatDate from "../../common/datetime/format_date";
import { formatDate } from "../../common/datetime/format_date";
import LocalizeMixin from "../../mixins/localize-mixin";
import { computeRTL } from "../../common/util/compute_rtl";

View File

@ -59,7 +59,7 @@ class HaLogbookData extends PolymerElement {
this._setIsLoading(true);
this.getDate(this.filterDate, this.filterPeriod, this.filterEntity).then(
this.getData(this.filterDate, this.filterPeriod, this.filterEntity).then(
(logbookEntries) => {
this._setEntries(logbookEntries);
this._setIsLoading(false);
@ -67,7 +67,7 @@ class HaLogbookData extends PolymerElement {
);
}
getDate(date, period, entityId) {
getData(date, period, entityId) {
if (!entityId) entityId = ALL_ENTITIES;
if (!DATA_CACHE[period]) DATA_CACHE[period] = [];

View File

@ -1,6 +1,6 @@
import "../../components/ha-icon";
import formatTime from "../../common/datetime/format_time";
import formatDate from "../../common/datetime/format_date";
import { formatTimeWithSeconds } from "../../common/datetime/format_time";
import { formatDate } from "../../common/datetime/format_date";
import { domainIcon } from "../../common/entity/domain_icon";
import { stateIcon } from "../../common/entity/state_icon";
import { computeRTL } from "../../common/util/compute_rtl";
@ -25,19 +25,14 @@ class HaLogbook extends LitElement {
// @ts-ignore
private _rtl = false;
protected updated(changedProps: PropertyValues) {
super.updated(changedProps);
if (!changedProps.has("hass")) {
return;
}
protected shouldUpdate(changedProps: PropertyValues) {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
if (oldHass && oldHass.language !== this.hass.language) {
this._rtl = computeRTL(this.hass);
}
const languageChanged =
oldHass === undefined || oldHass.language !== this.hass.language;
return changedProps.has("entries") || languageChanged;
}
protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
protected updated(_changedProps: PropertyValues) {
this._rtl = computeRTL(this.hass);
}
@ -80,7 +75,7 @@ class HaLogbook extends LitElement {
<div class="entry">
<div class="time">
${formatTime(new Date(item.when), this.hass.language)}
${formatTimeWithSeconds(new Date(item.when), this.hass.language)}
</div>
<ha-icon
.icon=${state ? stateIcon(state) : domainIcon(item.domain)}
@ -131,7 +126,8 @@ class HaLogbook extends LitElement {
}
.time {
width: 55px;
width: 65px;
flex-shrink: 0;
font-size: 0.8em;
color: var(--secondary-text-color);
}
@ -142,6 +138,7 @@ class HaLogbook extends LitElement {
ha-icon {
margin: 0 8px 0 16px;
flex-shrink: 0;
color: var(--primary-text-color);
}

View File

@ -16,7 +16,7 @@ import "../../resources/ha-style";
import "./ha-logbook-data";
import "./ha-logbook";
import formatDate from "../../common/datetime/format_date";
import { formatDate } from "../../common/datetime/format_date";
import LocalizeMixin from "../../mixins/localize-mixin";
import { computeRTL } from "../../common/util/compute_rtl";
@ -64,6 +64,11 @@ class HaPanelLogbook extends LocalizeMixin(PolymerElement) {
margin-right: 16px;
}
:host([rtl]) vaadin-date-picker {
margin-right: 0;
margin-left: 16px;
}
paper-dropdown-menu {
max-width: 100px;
margin-right: 16px;
@ -74,10 +79,13 @@ class HaPanelLogbook extends LocalizeMixin(PolymerElement) {
:host([rtl]) paper-dropdown-menu {
text-align: right;
margin-right: 0;
margin-left: 16px;
}
paper-item {
cursor: pointer;
white-space: nowrap;
}
ha-entity-picker {

View File

@ -29,6 +29,8 @@ import { actionHandler } from "../common/directives/action-handler-directive";
import { hasAction } from "../common/has-action";
import { ActionHandlerEvent } from "../../../data/lovelace";
import { handleAction } from "../common/handle-action";
import { computeDomain } from "../../../common/entity/compute_domain";
import { UNAVAILABLE, UNKNOWN } from "../../../data/entity";
@customElement("hui-glance-card")
export class HuiGlanceCard extends LitElement implements LovelaceCard {
@ -242,7 +244,18 @@ export class HuiGlanceCard extends LitElement implements LovelaceCard {
${this._config!.show_state !== false && entityConf.show_state !== false
? html`
<div>
${entityConf.show_last_changed
${computeDomain(entityConf.entity) === "sensor" &&
stateObj.attributes.device_class === "timestamp" &&
stateObj.state !== UNAVAILABLE &&
stateObj.state !== UNKNOWN
? html`
<hui-timestamp-display
.hass=${this.hass}
.ts=${new Date(stateObj.state)}
.format=${entityConf.format}
></hui-timestamp-display>
`
: entityConf.show_last_changed
? relativeTime(
new Date(stateObj.last_changed),
this.hass!.localize

View File

@ -1,58 +0,0 @@
import { createErrorCardConfig } from "./hui-error-card";
import { computeDomain } from "../../../common/entity/compute_domain";
export default class LegacyWrapperCard extends HTMLElement {
constructor(tag, domain) {
super();
this._tag = tag.toUpperCase();
this._domain = domain;
this._element = null;
}
getCardSize() {
return 3;
}
setConfig(config) {
if (!config.entity) {
throw new Error("No entity specified");
}
if (computeDomain(config.entity) !== this._domain) {
throw new Error(
`Specified entity needs to be of domain ${this._domain}.`
);
}
this._config = config;
}
set hass(hass) {
const entityId = this._config.entity;
if (entityId in hass.states) {
this._ensureElement(this._tag);
this.lastChild.hass = hass;
this.lastChild.stateObj = hass.states[entityId];
this.lastChild.config = this._config;
} else {
this._ensureElement("HUI-ERROR-CARD");
this.lastChild.setConfig(
createErrorCardConfig(
`No state available for ${entityId}`,
this._config
)
);
}
}
_ensureElement(tag) {
if (this.lastChild && this.lastChild.tagName === tag) return;
if (this.lastChild) {
this.removeChild(this.lastChild);
}
this.appendChild(document.createElement(tag));
}
}

View File

@ -1,22 +0,0 @@
import "../../../cards/ha-media_player-card";
import LegacyWrapperCard from "./hui-legacy-wrapper-card";
class HuiMediaControlCard extends LegacyWrapperCard {
static async getConfigElement() {
await import(
/* webpackChunkName: "hui-media-control-card-editor" */ "../editor/config-elements/hui-media-control-card-editor"
);
return document.createElement("hui-media-control-card-editor");
}
static getStubConfig() {
return { entity: "" };
}
constructor() {
super("ha-media_player-card", "media_player");
}
}
customElements.define("hui-media-control-card", HuiMediaControlCard);

View File

@ -0,0 +1,306 @@
import {
html,
LitElement,
PropertyValues,
TemplateResult,
customElement,
property,
css,
CSSResult,
} from "lit-element";
import { classMap } from "lit-html/directives/class-map";
import { HassEntity } from "home-assistant-js-websocket";
import "@polymer/paper-icon-button/paper-icon-button";
import "../../../components/ha-card";
import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
import { computeStateName } from "../../../common/entity/compute_state_name";
import { supportsFeature } from "../../../common/entity/supports-feature";
import { OFF_STATES, SUPPORT_PAUSE } from "../../../data/media-player";
import { hasConfigOrEntityChanged } from "../common/has-changed";
import { HomeAssistant, MediaEntity } from "../../../types";
import { LovelaceCard, LovelaceCardEditor } from "../types";
import { fireEvent } from "../../../common/dom/fire_event";
import { MediaControlCardConfig } from "./types";
@customElement("hui-media-control-card")
export class HuiMediaControlCard extends LitElement implements LovelaceCard {
public static async getConfigElement(): Promise<LovelaceCardEditor> {
await import(
/* webpackChunkName: "hui-media-control-card-editor" */ "../editor/config-elements/hui-media-control-card-editor"
);
return document.createElement("hui-media-control-card-editor");
}
public static getStubConfig(): object {
return { entity: "" };
}
@property() public hass?: HomeAssistant;
@property() private _config?: MediaControlCardConfig;
public getCardSize(): number {
return 3;
}
public setConfig(config: MediaControlCardConfig): void {
if (!config.entity || config.entity.split(".")[0] !== "media_player") {
throw new Error("Specify an entity from within the media_player domain.");
}
this._config = { theme: "default", ...config };
}
protected render(): TemplateResult {
if (!this.hass || !this._config) {
return html``;
}
const stateObj = this.hass.states[this._config.entity] as MediaEntity;
if (!stateObj) {
return html`
<hui-warning
>${this.hass.localize(
"ui.panel.lovelace.warning.entity_not_found",
"entity",
this._config.entity
)}</hui-warning
>
`;
}
const image =
stateObj.attributes.entity_picture ||
"../static/images/card_media_player_bg.png";
return html`
<ha-card>
<div
class="${classMap({
"no-image": !stateObj.attributes.entity_picture,
ratio: true,
})}"
>
<div class="image" style="background-image: url(${image})"></div>
<div class="caption">
${this._config!.name ||
computeStateName(this.hass!.states[this._config!.entity])}
<div class="title">
${this._computeMediaTitle(stateObj)}
</div>
</div>
</div>
${OFF_STATES.includes(stateObj.state)
? ""
: html`
<paper-progress
.max="${stateObj.attributes.media_duration}"
.value="${stateObj.attributes.media_position}"
class="progress"
></paper-progress>
`}
<div class="controls">
<paper-icon-button
icon="hass:power"
.action=${stateObj.state === "off" ? "turn_on" : "turn_off"}
@click=${this._handleClick}
></paper-icon-button>
<div class="playback-controls">
<paper-icon-button
icon="hass:skip-previous"
.action=${"media_previous_track"}
@click=${this._handleClick}
></paper-icon-button>
<paper-icon-button
class="playPauseButton"
icon=${stateObj.state !== "playing"
? "hass:play"
: supportsFeature(stateObj, SUPPORT_PAUSE)
? "hass:pause"
: "hass:stop"}
.action=${"media_play_pause"}
@click=${this._handleClick}
></paper-icon-button>
<paper-icon-button
icon="hass:skip-next"
.action=${"media_next_track"}
@click=${this._handleClick}
></paper-icon-button>
</div>
<paper-icon-button
icon="hass:dots-vertical"
@click="${this._handleMoreInfo}"
></paper-icon-button>
</div>
</ha-card>
`;
}
protected shouldUpdate(changedProps: PropertyValues): boolean {
return hasConfigOrEntityChanged(this, changedProps);
}
protected updated(changedProps: PropertyValues): void {
super.updated(changedProps);
if (!this._config || !this.hass || !changedProps.has("hass")) {
return;
}
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
const oldConfig = changedProps.get("_config") as
| MediaControlCardConfig
| undefined;
if (
!oldHass ||
!oldConfig ||
oldHass.themes !== this.hass.themes ||
oldConfig.theme !== this._config.theme
) {
applyThemesOnElement(this, this.hass.themes, this._config.theme);
}
}
private _computeMediaTitle(stateObj: HassEntity): string {
let prefix;
let suffix;
switch (stateObj.attributes.media_content_type) {
case "music":
prefix = stateObj.attributes.media_artist;
suffix = stateObj.attributes.media_title;
break;
case "tvshow":
prefix = stateObj.attributes.media_series_title;
suffix = stateObj.attributes.media_title;
break;
default:
prefix =
stateObj.attributes.media_title ||
stateObj.attributes.app_name ||
this.hass!.localize(`state.media_player.${stateObj.state}`) ||
this.hass!.localize(`state.default.${stateObj.state}`) ||
stateObj.state;
suffix = "";
}
return prefix && suffix ? `${prefix}: ${suffix}` : prefix || suffix || "";
}
private _handleMoreInfo() {
fireEvent(this, "hass-more-info", {
entityId: this._config!.entity,
});
}
private _handleClick(e: MouseEvent) {
this.hass!.callService("media_player", (e.currentTarget! as any).action, {
entity_id: this._config!.entity,
});
}
static get styles(): CSSResult {
return css`
.ratio {
position: relative;
width: 100%;
height: 0;
padding-bottom: 56.25%;
}
.image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: block;
transition: filter 0.2s linear;
background-position: center center;
background-size: cover;
}
.no-image {
padding-bottom: 88px;
}
.no-image > .image {
background-position: center center;
background-repeat: no-repeat;
background-color: var(--primary-color);
background-size: initial;
}
.no-image > .caption {
background-color: initial;
box-sizing: border-box;
height: 88px;
}
.controls {
padding: 8px;
display: flex;
justify-content: space-between;
align-items: center;
}
.controls > div {
display: flex;
align-items: center;
}
.controls paper-icon-button {
width: 44px;
height: 44px;
}
paper-icon-button {
opacity: var(--dark-primary-opacity);
}
paper-icon-button[disabled] {
opacity: var(--dark-disabled-opacity);
}
.playPauseButton {
width: 56px !important;
height: 56px !important;
background-color: var(--primary-color);
color: white;
border-radius: 50%;
padding: 8px;
transition: background-color 0.5s;
}
.caption {
position: absolute;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, var(--dark-secondary-opacity));
padding: 8px 16px;
font-size: 14px;
font-weight: 500;
color: white;
transition: background-color 0.5s;
}
.title {
font-size: 1.2em;
margin: 8px 0 4px;
}
.progress {
width: 100%;
height: var(--paper-progress-height, 4px);
margin-top: calc(-1 * var(--paper-progress-height, 4px));
--paper-progress-active-color: var(--accent-color);
--paper-progress-container-color: rgba(200, 200, 200, 0.5);
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"hui-media-control-card": HuiMediaControlCard;
}
}

View File

@ -27,6 +27,17 @@ import { SensorCardConfig } from "./types";
import { hasConfigOrEntityChanged } from "../common/has-changed";
import { actionHandler } from "../common/directives/action-handler-directive";
const average = (items): number => {
return (
items.reduce((sum, entry) => sum + parseFloat(entry.state), 0) /
items.length
);
};
const lastValue = (items): number => {
return parseFloat(items[items.length - 1].state) || 0;
};
const midPoint = (
_Ax: number,
_Ay: number,
@ -69,34 +80,40 @@ const calcPoints = (
max: number
): number[][] => {
const coords = [] as number[][];
const margin = 5;
const height = 80;
width -= 10;
let yRatio = (max - min) / height;
yRatio = yRatio !== 0 ? yRatio : height;
let xRatio = width / (hours - (detail === 1 ? 1 : 0));
xRatio = isFinite(xRatio) ? xRatio : width;
const first = history.filter(Boolean)[0];
let last = [average(first), lastValue(first)];
const getCoords = (item, i, offset = 0, depth = 1) => {
if (depth > 1) {
return item.forEach((subItem, index) =>
getCoords(subItem, i, index, depth - 1)
);
}
const average =
item.reduce((sum, entry) => sum + parseFloat(entry.state), 0) /
item.length;
const x = xRatio * (i + offset / 6) + margin;
const y = height - (average - min) / yRatio + margin * 2;
const x = xRatio * (i + offset / 6);
if (item) {
last = [average(item), lastValue(item)];
}
const y = height - ((item ? last[0] : last[1]) - min) / yRatio;
return coords.push([x, y]);
};
history.forEach((item, i) => getCoords(item, i, 0, detail));
if (coords.length === 1) {
coords[1] = [width + margin, coords[0][1]];
for (let i = 0; i < history.length; i += 1) {
getCoords(history[i], i, 0, detail);
}
coords.push([width + margin, coords[coords.length - 1][1]]);
if (coords.length === 1) {
coords[1] = [width, coords[0][1]];
}
coords.push([width, coords[coords.length - 1][1]]);
return coords;
};
@ -227,14 +244,27 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
} else {
graph = svg`
<svg width="100%" height="100%" viewBox="0 0 500 100">
<path
d="${this._history}"
fill="none"
stroke="var(--accent-color)"
stroke-width="5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<g>
<mask id="fill">
<path
class='fill'
fill='white'
d="${this._history} L 500, 100 L 0, 100 z"
/>
</mask>
<rect height="100%" width="100%" id="fill-rect" fill="var(--accent-color)" mask="url(#fill)"></rect>
<mask id="line">
<path
fill="none"
stroke="var(--accent-color)"
stroke-width="5"
stroke-linecap="round"
stroke-linejoin="round"
d=${this._history}
></path>
</mask>
<rect height="100%" width="100%" id="rect" fill="var(--accent-color)" mask="url(#line)"></rect>
</g>
</svg>
`;
}
@ -247,17 +277,15 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
.actionHandler=${actionHandler()}
tabindex="0"
>
<div class="flex">
<div class="flex header">
<div class="name">
<span>${this._config.name || computeStateName(stateObj)}</span>
</div>
<div class="icon">
<ha-icon
.icon="${this._config.icon || stateIcon(stateObj)}"
></ha-icon>
</div>
<div class="header">
<span class="name"
>${this._config.name || computeStateName(stateObj)}</span
>
</div>
</div>
<div class="flex info">
<span id="value">${stateObj.state}</span>
@ -285,7 +313,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
protected updated(changedProps: PropertyValues) {
super.updated(changedProps);
if (!this._config || this._config.graph !== "line" || !this.hass) {
if (!this._config || !this.hass) {
return;
}
@ -303,11 +331,13 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
applyThemesOnElement(this, this.hass.themes, this._config!.theme);
}
const minute = 60000;
if (changedProps.has("_config")) {
this._getHistory();
} else if (Date.now() - this._date!.getTime() >= minute) {
this._getHistory();
if (this._config.graph === "line") {
const minute = 60000;
if (changedProps.has("_config")) {
this._getHistory();
} else if (Date.now() - this._date!.getTime() >= minute) {
this._getHistory();
}
}
}
@ -353,9 +383,9 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
display: flex;
flex-direction: column;
flex: 1;
padding: 16px;
position: relative;
cursor: pointer;
overflow: hidden;
}
ha-card:focus {
@ -368,6 +398,11 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
}
.header {
margin: 16px 16px 0;
justify-content: space-between;
}
.name {
align-items: center;
display: flex;
min-width: 0;
@ -375,13 +410,13 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
position: relative;
}
.name {
.name > span {
display: block;
display: -webkit-box;
font-size: 1.2rem;
font-weight: 500;
max-height: 1.4rem;
margin-top: 2px;
top: 2px;
opacity: 0.8;
overflow: hidden;
text-overflow: ellipsis;
@ -403,7 +438,7 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
.info {
flex-wrap: wrap;
margin: 16px 0 16px 8px;
margin: 16px;
}
#value {
@ -430,11 +465,17 @@ class HuiSensorCard extends LitElement implements LovelaceCard {
margin-bottom: 0px;
position: relative;
width: 100%;
overflow: hidden;
}
.graph > div {
align-self: flex-end;
margin: auto 8px;
margin: auto 0px;
display: flex;
}
.fill {
opacity: 0.1;
}
`;
}

View File

@ -41,6 +41,7 @@ import {
EntityRegistryEntry,
} from "../../../data/entity_registry";
import { processEditorEntities } from "../editor/process-editor-entities";
import { SENSOR_DEVICE_CLASS_BATTERY } from "../../../data/sensor";
const DEFAULT_VIEW_ENTITY_ID = "group.default_view";
const DOMAINS_BADGES = [
@ -52,6 +53,7 @@ const DOMAINS_BADGES = [
"timer",
];
const HIDE_DOMAIN = new Set([
"automation",
"configurator",
"device_tracker",
"geo_location",
@ -180,6 +182,11 @@ export const computeCards = (
conf.icon = stateObj.attributes.icon;
}
entities.push(conf);
} else if (
domain === "sensor" &&
stateObj?.attributes.device_class === SENSOR_DEVICE_CLASS_BATTERY
) {
// Do nothing.
} else {
let name: string;
const entityConf =

View File

@ -33,72 +33,79 @@ export class HuiCardOptions extends LitElement {
protected render(): TemplateResult {
return html`
<slot></slot>
<div class="options">
<div class="primary-actions">
<mwc-button @click="${this._editCard}"
>${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.edit"
)}</mwc-button
>
</div>
<div class="secondary-actions">
<paper-icon-button
title="Move card down"
class="move-arrow"
icon="hass:arrow-down"
@click="${this._cardDown}"
?disabled="${this.lovelace!.config.views[this.path![0]].cards!
.length ===
this.path![1] + 1}"
></paper-icon-button>
<paper-icon-button
title="Move card up"
class="move-arrow"
icon="hass:arrow-up"
@click="${this._cardUp}"
?disabled="${this.path![1] === 0}"
></paper-icon-button>
<paper-menu-button
horizontal-align="right"
vertical-align="bottom"
vertical-offset="40"
close-on-activate
>
<ha-card>
<div class="options">
<div class="primary-actions">
<mwc-button @click="${this._editCard}"
>${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.edit"
)}</mwc-button
>
</div>
<div class="secondary-actions">
<paper-icon-button
icon="hass:dots-vertical"
slot="dropdown-trigger"
aria-label=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.options"
)}
title="Move card down"
class="move-arrow"
icon="hass:arrow-down"
@click="${this._cardDown}"
?disabled="${this.lovelace!.config.views[this.path![0]].cards!
.length ===
this.path![1] + 1}"
></paper-icon-button>
<paper-listbox slot="dropdown-content">
<paper-item @tap="${this._moveCard}">
${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.move"
)}</paper-item
>
<paper-item .class="delete-item" @tap="${this._deleteCard}">
${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.delete"
)}</paper-item
>
</paper-listbox>
</paper-menu-button>
<paper-icon-button
title="Move card up"
class="move-arrow"
icon="hass:arrow-up"
@click="${this._cardUp}"
?disabled="${this.path![1] === 0}"
></paper-icon-button>
<paper-menu-button
horizontal-align="right"
vertical-align="bottom"
vertical-offset="40"
close-on-activate
>
<paper-icon-button
icon="hass:dots-vertical"
slot="dropdown-trigger"
aria-label=${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.options"
)}
></paper-icon-button>
<paper-listbox slot="dropdown-content">
<paper-item @tap="${this._moveCard}">
${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.move"
)}</paper-item
>
<paper-item .class="delete-item" @tap="${this._deleteCard}">
${this.hass!.localize(
"ui.panel.lovelace.editor.edit_card.delete"
)}</paper-item
>
</paper-listbox>
</paper-menu-button>
</div>
</div>
</div>
</ha-card>
`;
}
static get styles(): CSSResult {
return css`
div.options {
border-top: 1px solid #e8e8e8;
padding: 5px 8px;
background: var(--paper-card-background-color, white);
ha-card {
border-top-right-radius: 0;
border-top-left-radius: 0;
box-shadow: rgba(0, 0, 0, 0.14) 0px 2px 2px 0px,
rgba(0, 0, 0, 0.12) 0px 1px 5px -4px,
rgba(0, 0, 0, 0.2) 0px 3px 1px -2px;
}
div.options {
border-top: 1px solid #e8e8e8;
padding: 5px 8px;
display: flex;
margin-top: -1px;
}
div.options .primary-actions {

View File

@ -8,15 +8,15 @@ import {
} from "lit-element";
import { HomeAssistant } from "../../../types";
import format_date from "../../../common/datetime/format_date";
import format_date_time from "../../../common/datetime/format_date_time";
import format_time from "../../../common/datetime/format_time";
import { formatDate } from "../../../common/datetime/format_date";
import { formatDateTime } from "../../../common/datetime/format_date_time";
import { formatTime } from "../../../common/datetime/format_time";
import relativeTime from "../../../common/datetime/relative_time";
const FORMATS: { [key: string]: (ts: Date, lang: string) => string } = {
date: format_date,
datetime: format_date_time,
time: format_time,
date: formatDate,
datetime: formatDateTime,
time: formatTime,
};
const INTERVAL_FORMAT = ["relative", "total"];

View File

@ -84,7 +84,9 @@ export class HuiDialogSuggestCard extends LitElement {
${this._yamlMode && this._cardConfig
? html`
<div class="editor">
<ha-yaml-editor .value=${this._cardConfig}></ha-yaml-editor>
<ha-yaml-editor
.defaultValue=${this._cardConfig}
></ha-yaml-editor>
</div>
`
: ""}

View File

@ -11,9 +11,9 @@ import { EntitiesEditorEvent, EditorTarget } from "../types";
import { HomeAssistant } from "../../../../types";
import { LovelaceCardEditor } from "../../types";
import { fireEvent } from "../../../../common/dom/fire_event";
import { MediaControlCardConfig } from "../../cards/hui-media-control-card";
import "../../../../components/entity/ha-entity-picker";
import { MediaControlCardConfig } from "../../cards/types";
const cardConfigStruct = struct({
type: "string",

View File

@ -14,7 +14,7 @@ import "../../components/ha-menu-button";
import "../../components/ha-card";
import "../../resources/ha-style";
import formatDateTime from "../../common/datetime/format_date_time";
import { formatDateTime } from "../../common/datetime/format_date_time";
import LocalizeMixin from "../../mixins/localize-mixin";
import { EventsMixin } from "../../mixins/events-mixin";

View File

@ -35,7 +35,7 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) {
<app-toolbar>
<ha-menu-button hass="[[hass]]" narrow="[[narrow]]"></ha-menu-button>
<div main-title>[[localize('panel.map')]]</div>
<template is="dom-if" if="[[!computeDemo()]]">
<template is="dom-if" if="[[computeShowEditZone(hass)]]">
<paper-icon-button
icon="hass:pencil"
on-click="openZonesEditor"
@ -75,8 +75,8 @@ class HaPanelMap extends LocalizeMixin(PolymerElement) {
}
}
computeDemo() {
return __DEMO__;
computeShowEditZone(hass) {
return !__DEMO__ && hass.user.is_admin;
}
openZonesEditor() {

View File

@ -4,7 +4,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { EventsMixin } from "../../mixins/events-mixin";
import LocalizeMixin from "../../mixins/localize-mixin";
import formatDateTime from "../../common/datetime/format_date_time";
import { formatDateTime } from "../../common/datetime/format_date_time";
import "../../components/ha-card";
import "../../resources/ha-style";

View File

@ -7,7 +7,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { EventsMixin } from "../../mixins/events-mixin";
import LocalizeMixin from "../../mixins/localize-mixin";
import formatDateTime from "../../common/datetime/format_date_time";
import { formatDateTime } from "../../common/datetime/format_date_time";
import "./ha-settings-row";

View File

@ -1,6 +1,6 @@
import "@polymer/paper-styles/paper-styles";
import "@polymer/polymer/lib/elements/custom-style";
import { haStyle, haStyleDialog } from "./styles";
import { haStyle, haStyleDialog, derivedStyles } from "./styles";
const documentContainer = document.createElement("template");
documentContainer.setAttribute("style", "display: none;");
@ -33,46 +33,22 @@ documentContainer.innerHTML = `<custom-style>
--scrollbar-thumb-color: rgb(194, 194, 194);
--error-color: #db4437;
--error-state-color: var(--error-color);
/* states and badges */
--state-icon-color: #44739e;
--state-icon-active-color: #FDD835;
--state-icon-unavailable-color: var(--disabled-text-color);
/* background and sidebar */
--card-background-color: #ffffff;
--primary-background-color: #fafafa;
--secondary-background-color: #e5e5e5; /* behind the cards on state */
/* sidebar menu */
--sidebar-text-color: var(--primary-text-color);
--sidebar-background-color: var(--paper-listbox-background-color); /* backward compatible with existing themes */
--sidebar-icon-color: rgba(0, 0, 0, 0.5);
--sidebar-selected-text-color: var(--primary-color);
--sidebar-selected-icon-color: var(--primary-color);
/* controls */
--switch-checked-color: var(--primary-color);
/* --switch-unchecked-color: var(--accent-color); */
--switch-checked-button-color: var(--switch-checked-color, var(--paper-grey-50));
--switch-checked-track-color: var(--switch-checked-color, #000000);
--switch-unchecked-button-color: var(--switch-unchecked-color, var(--paper-grey-50));
--switch-unchecked-track-color: var(--switch-unchecked-color, #000000);
--slider-color: var(--primary-color);
--slider-secondary-color: var(--light-primary-color);
--slider-bar-color: var(--disabled-text-color);
/* for label-badge */
--label-badge-background-color: white;
--label-badge-text-color: rgb(76, 76, 76);
--label-badge-red: #DF4C1E;
--label-badge-blue: #039be5;
--label-badge-green: #0DA035;
--label-badge-yellow: #f4b400;
--label-badge-grey: var(--paper-grey-500);
/*
Paper-styles color.html dependency is stripped on build.
@ -89,7 +65,6 @@ documentContainer.innerHTML = `<custom-style>
--google-blue-500: #4285f4;
--google-green-500: #0f9d58;
--google-yellow-500: #f4b400;
--paper-spinner-color: var(--primary-color);
/* for paper-slider */
--paper-green-400: #66bb6a;
@ -108,26 +83,9 @@ documentContainer.innerHTML = `<custom-style>
--light-secondary-opacity: 0.7;
--light-primary-opacity: 1.0;
/* derived colors, to keep existing themes mostly working */
--paper-card-background-color: var(--card-background-color);
--paper-listbox-background-color: var(--card-background-color);
--paper-item-icon-color: var(--state-icon-color);
--paper-item-icon-active-color: var(--state-icon-active-color);
--table-row-background-color: var(--primary-background-color);
--table-row-alternative-background-color: var(--secondary-background-color);
/* set our slider style */
--paper-slider-knob-color: var(--slider-color);
--paper-slider-knob-start-color: var(--slider-color);
--paper-slider-pin-color: var(--slider-color);
--paper-slider-active-color: var(--slider-color);
--paper-slider-secondary-color: var(--slider-secondary-color);
--paper-slider-container-color: var(--slider-bar-color);
--ha-paper-slider-pin-font-size: 15px;
/* set data table style */
--data-table-background-color: var(--card-background-color);
/* rgb */
--rgb-primary-color: 3, 169, 244;
--rgb-accent-color: 255, 152, 0;
@ -135,21 +93,9 @@ documentContainer.innerHTML = `<custom-style>
--rgb-secondary-text-color: 114, 114, 114;
--rgb-text-primary-color: 255, 255, 255;
/* mwc */
--mdc-theme-primary: var(--primary-color);
--mdc-theme-secondary: var(--accent-color);
--mdc-theme-background: var(--primary-background-color);
--mdc-theme-surface: var(--paper-card-background-color, var(--card-background-color));
/* mwc text styles */
--mdc-theme-on-primary: var(--text-primary-color);
--mdc-theme-on-secondary: var(--text-primary-color);
--mdc-theme-on-surface: var(--primary-text-color);
/* app header background color */
--app-header-text-color: var(--text-primary-color);
--app-header-background-color: var(--primary-color);
${Object.entries(derivedStyles)
.map(([key, value]) => `--${key}: ${value};`)
.join("")}
}
</style>

View File

@ -1,5 +1,54 @@
import { css } from "lit-element";
export const derivedStyles = {
"paper-spinner-color": "var(--primary-color)",
"error-state-color": "var(--error-color)",
"state-icon-unavailable-color": "var(--disabled-text-color)",
"sidebar-text-color": "var(--primary-text-color)",
"sidebar-background-color": "var(--paper-listbox-background-color);",
"sidebar-selected-text-color": "var(--primary-color)",
"sidebar-selected-icon-color": "var(--primary-color)",
"sidebar-icon-color": "rgba(var(--rgb-primary-text-color), 0.6)",
"switch-checked-color": "var(--primary-color)",
"switch-checked-button-color":
"var(--switch-checked-color, var(--primary-background-color))",
"switch-checked-track-color": "var(--switch-checked-color, #000000)",
"switch-unchecked-button-color":
"var(--switch-unchecked-color, var(--primary-background-color))",
"switch-unchecked-track-color": "var(--switch-unchecked-color, #000000)",
"slider-color": "var(--primary-color)",
"slider-secondary-color": "var(--light-primary-color)",
"slider-bar-color": "var(--disabled-text-color)",
"label-badge-grey": "var(--paper-grey-500)",
"label-badge-background-color": "var(--card-background-color)",
"label-badge-text-color": "rgba(var(--rgb-primary-text-color), 0.8)",
"paper-card-background-color": "var(--card-background-color)",
"paper-listbox-background-color": "var(--card-background-color)",
"paper-item-icon-color": "var(--state-icon-color)",
"paper-item-icon-active-color": "var(--state-icon-active-color)",
"table-row-background-color": "var(--primary-background-color)",
"table-row-alternative-background-color": "var(--secondary-background-color)",
"paper-slider-knob-color": "var(--slider-color)",
"paper-slider-knob-start-color": "var(--slider-color)",
"paper-slider-pin-color": "var(--slider-color)",
"paper-slider-active-color": "var(--slider-color)",
"paper-slider-secondary-color": "var(--slider-secondary-color)",
"paper-slider-container-color": "var(--slider-bar-color)",
"data-table-background-color": "var(--card-background-color)",
"mdc-theme-primary": "var(--primary-color)",
"mdc-theme-secondary": "var(--accent-color)",
"mdc-theme-background": "var(--primary-background-color)",
"mdc-theme-surface": "var(--card-background-color)",
"mdc-theme-on-primary": "var(--text-primary-color)",
"mdc-theme-on-secondary": "var(--text-primary-color)",
"mdc-theme-on-surface": "var(--primary-text-color)",
"app-header-text-color": "var(--text-primary-color)",
"app-header-background-color": "var(--primary-color)",
"material-body-text-color": "var(--primary-text-color)",
"material-background-color": "var(--card-background-color)",
"material-secondary-background-color": "var(--secondary-background-color)",
};
export const haStyle = css`
:host {
@apply --paper-font-body1;

View File

@ -618,6 +618,18 @@
"remove_action": "Remove entity",
"confirm_remove_title": "Remove entity?",
"confirm_remove_text": "Are you sure you want to remove this entity?"
},
"vacuum": {
"status": "Status",
"commands": "Vacuum cleaner commands:",
"fan_speed": "Fan speed",
"start": "Start",
"pause": "Pause",
"stop": "Stop",
"clean_spot": "Clean spot",
"locate": "Locate",
"return_home": "Return home",
"start_pause": "Start/Pause"
}
},
"entity_registry": {
@ -778,8 +790,8 @@
"invalid": "Configuration invalid"
},
"reloading": {
"heading": "Configuration reloading",
"introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.",
"heading": "YAML configuration reloading",
"introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.",
"core": "Reload location & customizations",
"group": "Reload groups",
"automation": "Reload automations",
@ -1395,7 +1407,7 @@
"add_zone": "Add Zone",
"confirm_delete": "Are you sure you want to delete this zone?",
"configured_in_yaml": "Zones configured via configuration.yaml cannot be edited via the UI.",
"edit_home_zone": "The location of your home can be changed in the gerenal config.",
"edit_home_zone": "The location of your home can be changed in the general config.",
"detail": {
"new_zone": "New Zone",
"name": "Name",
@ -1405,7 +1417,7 @@
"latitude": "Latitude",
"longitude": "Longitude",
"passive": "Passive",
"passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is usefull if you just want to use it for automations.",
"passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is useful if you just want to use it for automations.",
"required_error_msg": "This field is required",
"delete": "Delete",
"create": "Create",

View File

@ -200,6 +200,13 @@ export type CameraEntity = HassEntityBase & {
};
};
export type MediaEntity = HassEntityBase & {
attributes: HassEntityAttributeBase & {
media_duration: number;
media_position: number;
};
};
export type InputSelectEntity = HassEntityBase & {
attributes: HassEntityAttributeBase & {
options: string[];

View File

@ -1,6 +1,6 @@
import { assert } from "chai";
import formatDate from "../../../src/common/datetime/format_date";
import { formatDate } from "../../../src/common/datetime/format_date";
describe("formatDate", () => {
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400);

View File

@ -1,9 +1,12 @@
import { assert } from "chai";
import formatDateTime from "../../../src/common/datetime/format_date_time";
import {
formatDateTime,
formatDateTimeWithSeconds,
} from "../../../src/common/datetime/format_date_time";
describe("formatDateTime", () => {
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400);
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400);
it("Formats English date times", () => {
assert.strictEqual(
@ -12,3 +15,14 @@ describe("formatDateTime", () => {
);
});
});
describe("formatDateTimeWithSeconds", () => {
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400);
it("Formats English date times with seconds", () => {
assert.strictEqual(
formatDateTimeWithSeconds(dateObj, "en"),
"November 18, 2017, 11:12:13 AM"
);
});
});

View File

@ -1,6 +1,9 @@
import { assert } from "chai";
import formatTime from "../../../src/common/datetime/format_time";
import {
formatTime,
formatTimeWithSeconds,
} from "../../../src/common/datetime/format_time";
describe("formatTime", () => {
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 1400);
@ -9,3 +12,11 @@ describe("formatTime", () => {
assert.strictEqual(formatTime(dateObj, "en"), "11:12 AM");
});
});
describe("formatTimeWithSeconds", () => {
const dateObj = new Date(2017, 10, 18, 11, 12, 13, 400);
it("Formats English times with seconds", () => {
assert.strictEqual(formatTimeWithSeconds(dateObj, "en"), "11:12:13 AM");
});
});

View File

@ -478,6 +478,9 @@
"script": {
"execute": "Executar"
},
"service": {
"run": "Executa"
},
"timer": {
"actions": {
"cancel": "cancel·la",
@ -533,6 +536,7 @@
},
"common": {
"cancel": "Cancel·la",
"close": "Tanca",
"loading": "Carregant",
"no": "No",
"save": "Desa",
@ -543,7 +547,10 @@
"area-picker": {
"add_dialog": {
"add": "Afegeix",
"name": "Nom"
"failed_create_area": "No s'ha pogut crear l'àrea.",
"name": "Nom",
"text": "Introdueix el nom de la nova àrea.",
"title": "Afegeix àrea nova"
},
"add_new": "Afegir àrea nova...",
"area": "Àrea",
@ -567,6 +574,16 @@
"loading_history": "Carregant historial d'estats...",
"no_history_found": "No s'ha trobat cap historial d'estats."
},
"related-items": {
"area": "Àrea",
"automation": "Part de les següents automatitzacions",
"device": "Dispositiu",
"entity": "Entitats relacionades",
"group": "Part dels següents grups",
"integration": "Integració",
"scene": "Part de les següents escenes",
"script": "Part dels següents programes (scripts)"
},
"relative_time": {
"duration": {
"day": "{count} {count, plural,\n one {dia}\n other {dies}\n}",
@ -597,14 +614,40 @@
"domain_toggler": {
"title": "Commutació de dominis"
},
"entity_registry": {
"control": "Control",
"dismiss": "Desestimar",
"editor": {
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
"delete": "ELIMINA",
"enabled_cause": "Desactivada per {cause}.",
"enabled_description": "Les entitats desactivades no safegiran a Home Assistant.",
"enabled_label": "Activa lentitat",
"entity_id": "ID de l'entitat",
"name": "Substitució de Nom",
"note": "Nota: podria no funcionar amb alguna de les integracions.",
"unavailable": "Aquesta entitat no està disponible actualment.",
"update": "ACTUALITZA"
},
"related": "Relacionades",
"settings": "Configuració"
},
"generic": {
"cancel": "Cancel·la",
"default_confirmation_title": "Estàs segur?"
"default_confirmation_title": "Estàs segur?",
"ok": "OK"
},
"more_info_control": {
"dismiss": "Desestimar el diàleg",
"edit": "Edita entitat",
"restored": {
"confirm_remove_title": "Eliminar l'entitat?",
"remove_action": "Elimina entitat",
"remove_intro": "Si l'entitat ja no s'utilitza, pots borrar-la eliminant-la."
},
"script": {
"last_action": "Última acció"
"last_action": "Última acció",
"last_triggered": "Disparada per última vegada"
},
"settings": "Configuració de l'entitat",
"sun": {
@ -1184,12 +1227,15 @@
"conditions": {
"caption": "Només fer alguna cosa si..."
},
"create": "Crea una automatització amb el dispositiu",
"no_automations": "No hi ha automatitzacions",
"no_device_automations": "No hi ha automatitzacions disponibles per a aquest dispositiu.",
"triggers": {
"caption": "Feu alguna cosa quan..."
}
},
"automations": "Automatitzacions",
"cant_edit": "Només pots editar els elements creats a la interfície d'usuari (UI).",
"caption": "Dispositius",
"confirm_rename_entity_ids": "Vols, també, canviar el nom dels ID's dentitat de les entitats?",
"data_table": {
@ -1203,18 +1249,25 @@
"description": "Gestiona els dispositius connectats",
"details": "Aquí tens tots els detalls del dispositiu.",
"device_not_found": "Dispositiu no trobat.",
"entities": {
"add_entities_lovelace": "Afegeix a Lovelace",
"entities": "Entitats",
"none": "Aquest dispositiu no té entitats"
},
"info": "Informació del dispositiu",
"name": "Nom",
"scene": {
"create": "Crea una escena amb el dispositiu",
"no_scenes": "No hi ha escenes",
"scenes": "Escenes"
},
"scenes": "Escenes",
"script": {
"create": "Crea un programa (script) amb el dispositiu",
"no_scripts": "No hi ha scripts",
"scripts": "Scripts"
},
"scripts": "Scripts",
"scripts": "Programes (scripts)",
"unknown_error": "Error desconegut",
"unnamed_device": "Dispositiu sense nom",
"update": "Actualitza"
@ -1223,29 +1276,58 @@
"caption": "Registre d'entitats",
"description": "Visió general de totes les entitats conegudes.",
"editor": {
"confirm_delete": "Estàs segur que vols eliminar aquesta entitat?",
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
"confirm_delete2": "Si suprimeixes una entrada, no suprimiras l'entitat de Home Assistant. Per fer-ho, has de suprimir la integració '{plataform}' de Home Assistant.",
"default_name": "Àrea nova",
"delete": "ELIMINA",
"enabled_cause": "Desactivat per {cause}.",
"enabled_cause": "Desactivada per {cause}.",
"enabled_description": "Les entitats desactivades no safegiran a Home Assistant.",
"enabled_label": "Activa lentitat",
"entity_id": "ID de l'entitat",
"name": "Substitució de Nom",
"note": "Nota: podria no funcionar amb alguna de les integracions.",
"unavailable": "Aquesta entitat no està disponible actualment.",
"update": "ACTUALITZAR"
},
"picker": {
"disable_selected": {
"button": "Desactiva seleccionada/es",
"confirm_text": "Les entitats desactivades no safegiran a Home Assistant.",
"confirm_title": "Vols desactivar {number} entitat/s?"
},
"enable_selected": {
"button": "Activa seleccionada/es",
"confirm_text": "Això farà que tornin a estar disponibles a Home Assistant si estan desactivades.",
"confirm_title": "Vols activar {number} entitat/s?"
},
"filter": {
"filter": "Filtre",
"show_disabled": "Mostra entitats desactivades",
"show_unavailable": "Mostra entitats no disponibles"
},
"header": "Registre d'entitats",
"headers": {
"enabled": "Habilitat",
"entity_id": "ID de l'entitat",
"integration": "Integració",
"name": "Nom"
"name": "Nom",
"status": "Estat"
},
"integrations_page": "Pàgina d'integracions",
"introduction": "Home Assistant manté un registre de totes les entitats que ha detectat alguna vegada les quals tenen una identificació única. Cadascuna d'aquestes entitats té un identificador (ID) assignat que està reservat només per a ella.",
"introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant de les entitats. Tingues en compte que eliminar-les del registre d'entitats no eliminarà l'entitat. Per fer-ho, segueix l'enllaç següent i elimineu-la dins la pàgina d'integracions.",
"introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant.",
"remove_selected": {
"button": "Elimina seleccionada/es",
"confirm_text": "Les entitats només poden eliminar-se quan la seva integració ja no les està proporcionant.",
"confirm_title": "Vols eliminar {number} entitat/s?"
},
"selected": "{number} seleccionada/es",
"show_disabled": "Mostra entitats desactivades",
"status": {
"disabled": "Desactivada/es",
"ok": "D'acord",
"unavailable": "No disponible/s"
},
"unavailable": "(no disponible)"
}
},
@ -1335,7 +1417,7 @@
},
"introduction": "Aquí pots definir cada persona d'interès en Home Assistant.",
"no_persons_created_yet": "Sembla que encara no has creat cap persona.",
"note_about_persons_configured_in_yaml": "Nota: les persones configurades mitjançant configuration.yaml no es poden editar a la UI."
"note_about_persons_configured_in_yaml": "Nota: les persones configurades mitjançant configuration.yaml no es poden editar des de la UI."
},
"scene": {
"activated": "Escena {name} activada.",
@ -1413,8 +1495,10 @@
"group": "Actualitza grups",
"heading": "Torna a carregar la configuració",
"introduction": "Algunes parts de la configuració de Home Assistant es poden recarregar sense necessitat de reiniciar. Els botons de sota esborraran la configuració antiga i en carregaran la nova.",
"person": "Actualitza persones",
"scene": "Actualitza escenes",
"script": "Actualitza programes"
"script": "Actualitza programes",
"zone": "Actualitza zones"
},
"server_management": {
"confirm_restart": "Segur que vols reiniciar Home Assistant?",
@ -1475,7 +1559,8 @@
"spinner": "S'estan cercant dispositius ZHA Zigbee..."
},
"add": {
"caption": "Afegeix dispositius"
"caption": "Afegeix dispositius",
"description": "Afegeix dispositius a la xarxa Zigbee"
},
"caption": "ZHA",
"cluster_attributes": {
@ -1497,7 +1582,8 @@
},
"clusters": {
"header": "Clústers",
"help_cluster_dropdown": "Selecciona un clúster per visualitzar-ne els atributs i comandes."
"help_cluster_dropdown": "Selecciona un clúster per visualitzar-ne els atributs i comandes.",
"introduction": "Els clústers són els blocs de construcció per dotar Zigbee de funcionalitat. Separen la funcionalitat en unitats lògiques. N'hi ha de tipus client i servidor; estan formats per atributs i comandes (ordres)."
},
"common": {
"add_devices": "Afegeix dispositius",
@ -1512,11 +1598,18 @@
"device_name_placeholder": "Nom donat per l'usuari",
"update_name_button": "Actualitzar Nom"
},
"devices": {
"header": "Domòtica Zigbee (ZHA) - Dispositiu"
},
"group_binding": {
"bind_button_help": "Vincula el grup seleccionat als clústers de dispositius seleccionats.",
"bind_button_label": "Vincula grup",
"cluster_selection_help": "Selecciona clústers per vincular-los al grup seleccionat.",
"group_picker_help": "Selecciona un grup per emetre una comanda de vinculació.",
"group_picker_label": "Grups vinculables",
"header": "Vinculació de grups",
"introduction": "Vincula i desvincula grups.",
"unbind_button_help": "Desvincula el grup seleccionat dels clústers de dispositius seleccionats.",
"unbind_button_label": "Desvincula grup"
},
"groups": {
@ -1546,6 +1639,7 @@
"removing_members": "Eliminant membres",
"zha_zigbee_groups": "Grups ZHA Zigbee"
},
"header": "Configuració domòtica Zigbee (ZHA)",
"network_management": {
"header": "Gestió de la xarxa",
"introduction": "Comandes que afecten tota la xarxa"
@ -1564,6 +1658,32 @@
},
"title": "Domòtica Zigbee (ZHA)"
},
"zone": {
"add_zone": "Afegeix zona",
"caption": "Zones",
"configured_in_yaml": "Les zones configurades mitjançant configuration.yaml no es poden editar des de la UI.",
"confirm_delete": "Estàs segur que vols eliminar aquesta zona?",
"create_zone": "Crea zona",
"description": "Gestiona les zones en les quals es fa seguiment de persones.",
"detail": {
"create": "Crea",
"delete": "Suprimeix",
"icon": "Icona",
"icon_error_msg": "El nom de la icona ha de tenir el format prefix:nom_icona, per exemple: mdi: home",
"latitude": "Latitud",
"longitude": "Longitud",
"name": "Nom",
"new_zone": "Zona nova",
"passive": "Passiva",
"passive_note": "Les zones passives estan amagades i no sutilitzen com a ubicacions per a dispositius rastrejables. Però són utils per a la creació d'automatitzacions.",
"radius": "Radi",
"required_error_msg": "Aquest camp és obligatori",
"update": "Actualitza"
},
"edit_home_zone": "La ubicació de casa es pot canviar des de la configuració general.",
"introduction": "Les zones et permeten definir certes regions del planeta. Quan una persona es trobi dins duna zona, lestat prendrà el nom d'aquesta zona. També es poden utilitzar com a disparadors o condicions durant la creació d'automatitzacions.",
"no_zones_created_yet": "Sembla que encara no has creat cap zona."
},
"zwave": {
"caption": "Z-Wave",
"common": {
@ -1744,6 +1864,11 @@
"showing_entries": "Mostrant entrades de"
},
"lovelace": {
"add_entities": {
"generated_unsupported": "Només pots utilitzar aquesta funció quan tinguis el control de la UI Lovelace.",
"saving_failed": "S'ha produït un error en desar la configuració de la UI Lovelace.",
"yaml_unsupported": "Només pots utilitzar aquesta funció si fas servir Lovelace en mode YAML."
},
"cards": {
"confirm_delete": "Estàs segur que vols eliminar aquesta targeta?",
"empty_state": {
@ -1751,6 +1876,9 @@
"no_devices": "Aquesta pàgina et permet controlar els teus dispositius, però sembla que encara no en tens cap configurat. Vés a la pàgina d'integracions per a començar.",
"title": "Benvingut/da a casa"
},
"entities": {
"never_triggered": "Mai disparada"
},
"picture-elements": {
"call_service": "Crida servei {name}",
"hold": "Manté:",
@ -1938,6 +2066,7 @@
"confirm_unsaved_comments": "La configuració conté comentaris que es descartaran. Vols continuar?",
"error_invalid_config": "La configuració no és vàlida: {error}",
"error_parse_yaml": "No es pot analitzar YAML: {error}",
"error_remove": "No s'ha pogut eliminar la configuració: {error}",
"error_save_yaml": "No es pot desar YAML: {error}",
"header": "Edita la configuració",
"save": "Desa",
@ -1952,6 +2081,7 @@
"save": "Prendre el control"
},
"suggest_card": {
"add": "Afegeix a la UI Lovelace",
"create_own": "Crea la teva"
},
"view": {

View File

@ -1177,7 +1177,7 @@
},
"server_control": {
"reloading": {
"automation": "Znovu načíst automatizace",
"automation": "Znovu načíst automatizaci",
"core": "Znovu načíst jádro",
"group": "Znovu načíst skupiny",
"heading": "Konfigurace se načítá",
@ -1226,14 +1226,19 @@
"actions": {
"caption": "Když je něco spuštěno ..."
},
"automations": "Automatizace",
"conditions": {
"caption": "Udělej něco, jen když ..."
},
"create": "Vytvořit automatizaci se zařízením",
"no_automations": "Žádné automatizace",
"no_device_automations": "Pro toto zařízení nejsou k dispozici žádné automatizace.",
"triggers": {
"caption": "Udělej něco, když ..."
}
},
"automations": "Automatizace",
"cant_edit": "Můžete upravovat pouze položky, které jsou vytvořeny v uživatelském rozhraní.",
"caption": "Zařízení",
"confirm_rename_entity_ids": "Chcete také přejmenovat ID entit vašich entit?",
"data_table": {
@ -1254,6 +1259,18 @@
},
"info": "Informace o zařízení",
"name": "Jméno",
"scene": {
"create": "Vytvořit scénu se zařízením",
"no_scenes": "Žádné scény",
"scenes": "Scény"
},
"scenes": "Scény",
"script": {
"create": "Vytvořit skript se zařízením",
"no_scripts": "Žádné skripty",
"scripts": "Skripty"
},
"scripts": "Skripty",
"unknown_error": "Neznámá chyba",
"unnamed_device": "Nepojmenované zařízení",
"update": "Aktualizovat"
@ -1476,8 +1493,8 @@
"description": "Restart a zastavení serveru Home Asistent",
"section": {
"reloading": {
"automation": "Znovu načíst automatizace",
"core": "Znovu načíst umístění a přispůsobení",
"automation": "Znovu načíst automatizaci",
"core": "Znovu načíst umístění a přizpůsobení",
"group": "Znovu načíst skupiny",
"heading": "Konfigurace se načítá",
"introduction": "Některé části Home Assistant lze načíst bez nutnosti restartování. Volba načtení zahodí jejich aktuální konfiguraci a načte novou.",

View File

@ -1232,6 +1232,7 @@
},
"create": "Opret automatisering med enhed",
"no_automations": "Ingen automatiseringer",
"no_device_automations": "Der er ingen automatiseringer til rådighed for denne enhed.",
"triggers": {
"caption": "Gør noget, når..."
}
@ -1678,7 +1679,7 @@
"name": "Navn",
"new_zone": "Ny zone",
"passive": "Passiv",
"passive_note": "Passive zoner er skjult i brugerfladen og bruges ikke som lokalitet for enhedssporere. Dette er nyttigt, hvis du bare vil bruge det til automatiseringer.",
"passive_note": "Passive zoner er skjult i brugerfladen og bruges ikke som lokalitet for enhedssporere. Dette er nyttigt, hvis du bare vil bruge dem til automatiseringer.",
"radius": "Radius",
"required_error_msg": "Dette felt er påkrævet",
"update": "Opdater"

View File

@ -394,15 +394,15 @@
},
"ui": {
"auth_store": {
"ask": "Möchtest du diesen Login speichern?",
"ask": "Möchten Sie diesen Login speichern?",
"confirm": "Login speichern",
"decline": "Nein Danke"
},
"card": {
"alarm_control_panel": {
"arm_away": "Aktivieren, unterwegs",
"arm_away": "Aktivieren - Unterwegs",
"arm_custom_bypass": "Benutzerdefinierter Bypass",
"arm_home": "Aktivieren, Zuhause",
"arm_home": "Aktivieren - Zuhause",
"arm_night": "Nacht aktiviert",
"armed_custom_bypass": "Benutzerdefinierter Bypass",
"clear_code": "Löschen",
@ -478,6 +478,9 @@
"script": {
"execute": "Ausführen"
},
"service": {
"run": "Ausführen"
},
"timer": {
"actions": {
"cancel": "Abbrechen",
@ -541,10 +544,24 @@
"yes": "Ja"
},
"components": {
"area-picker": {
"add_dialog": {
"add": "Hinzufügen",
"failed_create_area": "Der Bereich konnte nicht erstellt werden.",
"name": "Name",
"text": "Geben Sie den Namen des neuen Bereichs ein.",
"title": "Neuen Bereich hinzufügen"
},
"add_new": "Neuen Bereich hinzufügen...",
"area": "Bereich",
"clear": "Löschen",
"show_areas": "Bereiche anzeigen"
},
"device-picker": {
"clear": "Löschen",
"device": "Gerät",
"show_devices": "Geräte anzeigen"
"show_devices": "Geräte anzeigen",
"toggle": "Umschalten"
},
"entity": {
"entity-picker": {
@ -557,6 +574,16 @@
"loading_history": "Lade Zustandsverlauf...",
"no_history_found": "Kein Zustandsverlauf gefunden."
},
"related-items": {
"area": "Bereich",
"automation": "Teil der folgenden Automatisierungen",
"device": "Gerät",
"entity": "Verwandte Entitäten",
"group": "Teil der folgenden Gruppen",
"integration": "Integration",
"scene": "Teil der folgenden Szenen",
"script": "Teil der folgenden Skripte"
},
"relative_time": {
"duration": {
"day": "{count} {count, plural,\none {Tag}\nother {Tagen}\n}",
@ -582,23 +609,47 @@
"confirmation": {
"cancel": "Abbrechen",
"ok": "OK",
"title": "Bist du sicher?"
"title": "Bist Sie sicher?"
},
"domain_toggler": {
"title": "Domänen umschalten"
},
"entity_registry": {
"control": "Steuerung",
"dismiss": "Ausblenden",
"editor": {
"confirm_delete": "Möchten Sie diesen Eintrag wirklich löschen?",
"delete": "LÖSCHEN",
"enabled_cause": "Deaktiviert durch {cause}.",
"enabled_description": "Deaktivierte Entitäten werden nicht zu Home Assistant hinzugefügt.",
"enabled_label": "Entität aktivieren",
"entity_id": "Entitäts-ID",
"name": "Namen überschreiben",
"note": "Hinweis: Dies funktioniert möglicherweise noch nicht bei allen Integrationen.",
"unavailable": "Diese Entität ist derzeit nicht verfügbar.",
"update": "AKTUALISIEREN"
},
"related": "Verwandte",
"settings": "Einstellungen"
},
"generic": {
"cancel": "Abbrechen",
"default_confirmation_title": "Sind Sie sicher?",
"ok": "OK"
},
"more_info_control": {
"dismiss": "Dialog ausblenden",
"edit": "Entität bearbeiten",
"restored": {
"confirm_remove_text": "Bist du dir sicher, dass du diese Entität löschen möchtest?",
"confirm_remove_text": "Sind Sie sicher, dass Sie diese Entität löschen möchten?",
"confirm_remove_title": "Entität entfernen?",
"not_provided": "Diese Entität ist derzeit nicht verfügbar und ist verwitwet für eine entfernte, geänderte oder gestörte Integration oder ein Gerät.",
"remove_action": "Entität entfernen",
"remove_intro": "Wenn die Entität nicht mehr verwendet wird, kannst du sie bereinigen, indem du sie entfernst."
"remove_intro": "Wenn die Entität nicht mehr verwendet wird, können Sie sie bereinigen, indem Sie sie entfernen."
},
"script": {
"last_action": "Letzte Aktion"
"last_action": "Letzte Aktion",
"last_triggered": "Zuletzt ausgelöst"
},
"settings": "Entitätseinstellungen",
"sun": {
@ -701,14 +752,14 @@
"delete": "LÖSCHEN",
"update": "AKTUALISIEREN"
},
"no_areas": "Sieht aus, als hättest du noch keine Bereiche!",
"no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!",
"picker": {
"create_area": "BEREICH ERSTELLEN",
"header": "Bereiche",
"integrations_page": "Integrationsseite",
"introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um dich bei der Organisation deiner Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.",
"introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um Sie bei der Organisation Ihrer Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.",
"introduction2": "Um Geräte in einem Bereich zu platzieren, navigieren Sie mit dem Link unten zur Integrationsseite und klicken Sie dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.",
"no_areas": "Sieht aus, als hättest du noch keine Bereiche!"
"no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!"
}
},
"automation": {
@ -718,7 +769,7 @@
"actions": {
"add": "Aktion hinzufügen",
"delete": "Löschen",
"delete_confirm": "Möchtest du das wirklich löschen?",
"delete_confirm": "Möchten Sie das wirklich löschen?",
"duplicate": "Duplizieren",
"header": "Aktionen",
"introduction": "Aktionen werden von Home Assistant ausgeführt, wenn Automatisierungen ausgelöst werden.",
@ -763,10 +814,10 @@
"conditions": {
"add": "Bedingung hinzufügen",
"delete": "Löschen",
"delete_confirm": "Möchtest du das wirklich löschen?",
"delete_confirm": "Möchten Sie das wirklich löschen?",
"duplicate": "Duplizieren",
"header": "Bedingungen",
"introduction": "Bedingungen sind ein optionaler Bestandteil bei automatisierten Abläufen und können das Ausführen einer Aktion verhindern. Bedingungen sind Auslösern ähnlich, aber dennoch verschieden. Ein Auslöser beobachtet im System ablaufende Ereignisse, wohingegen Bedingungen nur den aktuellen Systemzustand betrachten. Ein Auslöser kann beobachten, ob ein Schalter aktiviert wird. Eine Bedingung kann lediglich sehen, ob ein Schalter aktuell an oder aus ist.",
"introduction": "Die Bedingungen sind optional und verhindern die weitere Ausführung, sofern nicht alle Bedingungen erfüllt sind.",
"learn_more": "Erfahre mehr über Bedingungen",
"name": "Zustand",
"type_select": "Bedingungstyp",
@ -835,7 +886,7 @@
"triggers": {
"add": "Auslöser hinzufügen",
"delete": "Löschen",
"delete_confirm": "Möchtest du das wirklich löschen?",
"delete_confirm": "Möchten Sie das wirklich löschen?",
"duplicate": "Duplizieren",
"header": "Auslöser",
"introduction": "Auslöser starten automatisierte Abläufe. Es ist möglich, mehrere Auslöser für dieselbe Abfolge zu definieren. Wenn ein Auslöser aktiviert wird, prüft Home Assistant die Bedingungen, sofern vorhanden, und führt die Aktion aus.",
@ -923,15 +974,15 @@
},
"unsupported_platform": "Nicht unterstützte Plattform: {platform}"
},
"unsaved_confirm": "Du hast ungespeicherte Änderungen. Bist du dir sicher, dass du den Editor verlassen möchtest?"
"unsaved_confirm": "Sie haben ungespeicherte Änderungen. Sind Sie sicher, dass Sie den Editor verlassen möchten?"
},
"picker": {
"add_automation": "Automatisierung hinzufügen",
"delete_automation": "Automatisierung löschen",
"delete_confirm": "Bist du sicher, dass du diese Automatisierung löschen willst?",
"delete_confirm": "Sind Sie sicher, dass Sie diese Automatisierung löschen wollen?",
"edit_automation": "Automatisierung bearbeiten",
"header": "Automatisierungseditor",
"introduction": "Mit dem Automationseditor können Automatisierungen erstellt und bearbeitet werden. Bitte folge dem nachfolgenden Link, um die Anleitung zu lesen, um sicherzustellen, dass du Home Assistant richtig konfiguriert hast.",
"introduction": "Mit dem Automations-Editor können Automatisierungen erstellt und bearbeitet werden. Bitte folgen Sie dem nachfolgenden Link, um die Anleitung zu lesen und um sicherzustellen, dass Sie Home Assistant richtig konfiguriert haben.",
"learn_more": "Erfahre mehr über Automatisierungen",
"no_automations": "Wir konnten keine editierbaren Automatisierungen finden",
"only_editable": "Nur Automatisierungen in automations.yaml sind editierbar.",
@ -947,7 +998,7 @@
"enable": "aktiviert",
"enable_ha_skill": "Aktiviere den Home Assistant-Skill für Alexa",
"enable_state_reporting": "Statusberichterstattung aktivieren",
"info": "Mit der Alexa-Integration für Home Assistant Cloud kannst du alle deine Home Assistant-Geräte über jedes Alexa-fähige Gerät steuern.",
"info": "Mit der Alexa-Integration für Home Assistant Cloud können Sie alle Ihre Home Assistant-Geräte über jedes Alexa-fähige Gerät steuern.",
"info_state_reporting": "Wenn die Statusberichterstellung aktiviert wird, sendet Home Assistant alle Statusänderungen exponierter Entitäten an Amazon. So wird in der Alexa-App immer der neueste Status angezeigt.",
"manage_entities": "Entitäten verwalten",
"state_reporting_error": "Der Berichtsstatus kann nicht {enable_disable} werden.",
@ -965,8 +1016,8 @@
"enable_state_reporting": "Statusberichterstattung aktivieren",
"enter_pin_error": "PIN kann nicht gespeichert werden:",
"enter_pin_hint": "Gib eine PIN ein, um Sicherheitsgeräte zu verwenden",
"enter_pin_info": "Bitte gib eine PIN ein, um mit Sicherheitsgeräten zu interagieren. Sicherheitsgeräte sind Türen, Garagentore und Schlösser. Du wirst aufgefordert, diese PIN zu sagen / einzugeben, wenn du mit solchen Geräten über Google Assistant interagierst.",
"info": "Mit der Google Assistant-Integration für Home Assistant Cloud kannst du alle deine Home Assistant-Geräte über jedes Google Assistant-fähige Gerät steuern.",
"enter_pin_info": "Bitte geben Sie eine PIN ein, um mit Sicherheitsgeräten zu interagieren. Sicherheitsgeräte sind Türen, Garagentore und Schlösser. Sie werden aufgefordert, diese PIN zu sagen/einzugeben, wenn Sie mit solchen Geräten über Google Assistant interagierst.",
"info": "Mit der Google Assistant-Integration für Home Assistant Cloud können Sie alle Ihre Home Assistant-Geräte über jedes Google Assistant-fähige Gerät steuern.",
"info_state_reporting": "Wenn die Statusberichterstellung aktiviert wird, sendet Home Assistant alle Statusänderungen exponierter Entitäten an Google. So wird in der Google-App immer der neueste Status angezeigt.",
"manage_entities": "Entitäten verwalten",
"security_devices": "Sicherheitsgeräte",
@ -975,7 +1026,7 @@
"title": "Google Assistant"
},
"integrations": "Integrationen",
"integrations_introduction": "Mit den Integrationen der Home Assistant Cloud können Diensten in der Cloud verbunden werden, ohne dass die Home Assistant Instalation öffentlich im Internet erreichbar sein muss.",
"integrations_introduction": "Mit den Integrationen der Home Assistant Cloud können Diensten in der Cloud verbunden werden, ohne dass die Home Assistant-Installation öffentlich im Internet erreichbar sein muss.",
"integrations_introduction2": "Überprüfe die Website für ",
"integrations_link_all_features": " alle verfügbaren Funktionen",
"manage_account": "Konto verwalten",
@ -984,7 +1035,7 @@
"remote": {
"access_is_being_prepared": "Der Fernzugriff wird vorbereitet. Wir werden dich benachrichtigen, wenn alles fertig ist.",
"certificate_info": "Zertifikatsinformationen",
"info": "Home Assistant Cloud bietet eine sichere Remote-Verbindung zu deiner Instanz, wenn du nicht zu Hause bist.",
"info": "Home Assistant Cloud bietet eine sichere Remote-Verbindung zu Ihrer Instanz, wenn Sie nicht zu Hause sind.",
"instance_is_available": "Ihre Instanz ist verfügbar unter",
"instance_will_be_available": "Ihre Instanz wird verfügbar sein unter",
"link_learn_how_it_works": "Lerne, wie es funktioniert",
@ -1026,9 +1077,9 @@
"dialog_cloudhook": {
"available_at": "Der Webhook ist unter der folgenden URL verfügbar:",
"close": "Schließen",
"confirm_disable": "Möchtest du diesen Webhook wirklich deaktivieren?",
"confirm_disable": "Möchten Sie diesen Webhook wirklich deaktivieren?",
"copied_to_clipboard": "In die Zwischenablage kopiert",
"info_disable_webhook": "Wenn du diesen Webhook nicht mehr nutzen willst, kannst du",
"info_disable_webhook": "Wenn Sie diesen Webhook nicht mehr nutzen wollen, können Sie ",
"link_disable_webhook": "deaktiviere es",
"managed_by_integration": "Dieser Webhook wird von einer Integration verwaltet und kann nicht deaktiviert werden.",
"view_documentation": "Dokumentation anzeigen",
@ -1135,14 +1186,14 @@
},
"server_management": {
"heading": "Serververwaltung",
"introduction": "Verwalte den Home Assistant Server",
"introduction": "Verwalten Sie Ihren Home Assistant-Server",
"restart": "Neu starten",
"stop": "Stoppen"
},
"validation": {
"check_config": "Konfiguration prüfen",
"heading": "Konfiguration überprüfen",
"introduction": "Überprüfe deine Konfiguration, wenn du kürzlich Änderungen vorgenommen hast und sicherstellen möchtest, dass alles ordnungsgemäß ist",
"introduction": "Überprüfen der Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alles ordnungsgemäß ist",
"invalid": "Konfiguration fehlerhaft",
"valid": "Konfiguration in Ordnung"
}
@ -1151,9 +1202,9 @@
},
"customize": {
"attributes_customize": "Folgende Attribute sind bereits in customize.yaml gesetzt",
"attributes_not_set": "Die folgenden Attribute wurden nicht gesetzt. Setze sie, wenn du möchtest.",
"attributes_not_set": "Die folgenden Attribute wurden nicht gesetzt. Setzen Sie sie, wenn Sie möchten.",
"attributes_outside": "Die folgenden Attribute werden außerhalb von customize.yaml angepasst.",
"attributes_override": "Du kannst sie überschreiben, wenn du möchtest.",
"attributes_override": "Sie können sie überschreiben, wenn Sie möchten.",
"attributes_set": "Die folgenden Attribute der Entität sind programmatisch festgelegt.",
"caption": "Anpassung",
"description": "Elemente anpassen",
@ -1161,7 +1212,7 @@
"pick_attribute": "Wähle ein Attribut zum Überschreiben aus.",
"picker": {
"header": "Anpassungen",
"introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte / bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird."
"introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte/bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird."
},
"warning": {
"include_link": "binde customize.yaml ein",
@ -1175,16 +1226,21 @@
"actions": {
"caption": "Wenn etwas ausgelöst wird ..."
},
"automations": "Automatisierungen",
"conditions": {
"caption": "Tue nur dann etwas, wenn....."
},
"create": "Automatisierung mit Gerät erstellen",
"no_automations": "Keine Automatisierungen",
"no_device_automations": "Für dieses Gerät sind keine Automatisierungen verfügbar.",
"triggers": {
"caption": "Tue etwas, wenn..."
}
},
"automations": "Automatisierungen",
"cant_edit": "Sie können nur Elemente bearbeiten, die in der Benutzeroberfläche erstellt wurden.",
"caption": "Geräte",
"confirm_rename_entity_ids": "Möchtest du auch die Entitäts-ID's deiner Entitäten umbenennen?",
"confirm_rename_entity_ids": "Möchten Sie auch die Entitäts-IDs Ihrer Entitäten umbenennen?",
"data_table": {
"area": "Bereich",
"battery": "Batterie",
@ -1197,13 +1253,27 @@
"details": "Hier sind alle Details deines Geräts.",
"device_not_found": "Gerät nicht gefunden.",
"entities": {
"add_entities_lovelace": "Alle Geräte-Entitäten zu Lovelace hinzufügen",
"add_entities_lovelace": "Zu Lovelace hinzufügen",
"entities": "Entitäten",
"none": "Dieses Gerät hat keine Entitäten"
},
"info": "Geräteinformationen",
"name": "Name",
"scene": {
"create": "Szene mit Gerät erstellen",
"no_scenes": "Keine Szenen",
"scenes": "Szenen"
},
"scenes": "Szenen",
"script": {
"create": "Szene mit Gerät erstellen",
"no_scripts": "Keine Skripte",
"scripts": "Skripte"
},
"scripts": "Skripte",
"unknown_error": "Unbekannter Fehler",
"unnamed_device": "Unbenanntes Gerät"
"unnamed_device": "Unbenanntes Gerät",
"update": "Aktualisieren"
},
"entities": {
"caption": "Entitäten",
@ -1216,6 +1286,8 @@
"enabled_cause": "Deaktiviert durch {cause}.",
"enabled_description": "Deaktivierte Entitäten werden in Home Assistant nicht hinzugefügt.",
"enabled_label": "Entität aktivieren",
"entity_id": "Entitäts-ID",
"name": "Namen überschreiben",
"note": "Hinweis: Dies funktioniert möglicherweise noch nicht bei allen Integrationen.",
"unavailable": "Diese Entität ist derzeit nicht verfügbar.",
"update": "UPDATE"
@ -1224,12 +1296,12 @@
"disable_selected": {
"button": "Ausgewählte deaktivieren",
"confirm_text": "Deaktivierte Entitäten werden Home Assistant nicht hinzugefügt.",
"confirm_title": "Willst du {number} Entitäten deaktivieren?"
"confirm_title": "Willen Sie {number} Entitäten deaktivieren?"
},
"enable_selected": {
"button": "Ausgewählte aktivieren",
"confirm_text": "Dadurch stehen sie in Home Assistant wieder zur Verfügung, wenn sie jetzt deaktiviert sind.",
"confirm_title": "Willst du {number} Entitäten aktivieren?"
"confirm_title": "Willen Sie {number} Entitäten aktivieren?"
},
"filter": {
"filter": "Filter",
@ -1245,12 +1317,12 @@
"status": "Status"
},
"integrations_page": "Integrationsseite",
"introduction": "Der Home Assistant führt eine Registrierung aller Entitäten, die er je gesehen hat und die eindeutig identifiziert werden können. Jeder dieser Entitäten wird eine Entitäts-ID zugewiesen, die nur für diese Entität reserviert ist.",
"introduction2": "Verwende die Entitätsregistrierung, um den Namen zu überschreiben, die Entität-ID zu ändern oder den Eintrag aus dem Home Assistant zu entfernen. Beachte, dass das Entfernen des Entitätsregistrierungseintrags die Entität nicht löscht. Folge dazu dem Link unten und entferne ihn in der Integrationsseite.",
"introduction": "Home Assistant führt eine Registrierung aller Entitäten, die er je gesehen hat und die eindeutig identifiziert werden können. Jeder dieser Entitäten wird eine Entitäts-ID zugewiesen, die nur für diese Entität reserviert ist.",
"introduction2": "Verwenden Sie die Entitätsregistrierung, um den Namen zu überschreiben, die Entität-ID zu ändern oder den Eintrag aus Home Assistant zu entfernen. Beachten Sie, dass das Entfernen des Entitätsregistrierungs-Eintrags die Entität nicht löscht. Folgen Sie dazu dem Link unten und entfernen Sie ihn in der Integrationsseite.",
"remove_selected": {
"button": "Ausgewählte entfernen",
"confirm_text": "Entitäten können nur entfernt werden, wenn die Integration die Entitäten nicht mehr bereitstellt.",
"confirm_title": "Willst du {number} Entitäten entfernen?"
"confirm_title": "Willen Sie {number} Entitäten entfernen?"
},
"selected": "{number} ausgewählt",
"show_disabled": "Anzeigen deaktivierter Entitäten",
@ -1268,7 +1340,7 @@
"config_entry": {
"area": "In {area}",
"delete_button": "{integration} löschen",
"delete_confirm": "Möchtest du diese Integration wirklich löschen?",
"delete_confirm": "Möchten Sie diese Integration wirklich löschen?",
"device_unavailable": "Gerät nicht verfügbar",
"entity_unavailable": "Entität nicht verfügbar",
"firmware": "Firmware: {version}",
@ -1291,7 +1363,7 @@
"dismiss": "Dialog schließen",
"error_saving_area": "Fehler beim Speichern des Bereichs: {error}",
"external_step": {
"description": "Für diesen Schritt musst du eine externe Website besuchen, um den Vorgang abzuschließen.",
"description": "Für diesen Schritt müssen Sie eine externe Website besuchen, um den Vorgang abzuschließen.",
"open_site": "Website öffnen"
},
"failed_create_area": "Der Bereich konnte nicht erstellt werden.",
@ -1309,7 +1381,7 @@
"ignore": {
"confirm_delete_ignore": "Dies wird die Integration in deinen entdeckten Integrationen wieder erscheinen lassen, wenn sie entdeckt wird. Dies kann einen Neustart erfordern oder einige Zeit dauern.",
"confirm_delete_ignore_title": "{name} nicht mehr ignorieren?",
"confirm_ignore": "Bist du sicher, dass du diese Integration nicht einrichten willst? Du kannst dies rückgängig machen, indem du im Kontextmenü oben rechts auf 'Ignorierte Integrationen anzeigen' klickst.",
"confirm_ignore": "Sind Sie sicher, dass Sie diese Integration nicht einrichten wollen? Sie können dies rückgängig machen, indem Sie im Kontextmenü oben rechts auf 'Ignorierte Integrationen anzeigen' klicken.",
"confirm_ignore_title": "Ignoriere die Entdeckung von {name}?",
"hide_ignored": "Ignorierte Integrationen ausblenden",
"ignore": "Ignorieren",
@ -1321,13 +1393,13 @@
"new": "Richte eine neue Integration ein",
"none": "Noch nichts konfiguriert",
"note_about_integrations": "Nicht alle Integrationen können über die Benutzeroberfläche konfiguriert werden.",
"note_about_website_reference": "Weitere Informationen findest du auf der "
"note_about_website_reference": "Weitere Informationen finden Sie auf der "
},
"introduction": "Hier ist es möglich, deine Komponenten und Home Assistant zu konfigurieren. Noch ist nicht alles über die GUI einstellbar, aber wir arbeiten daran.",
"person": {
"add_person": "Person hinzufügen",
"caption": "Personen",
"confirm_delete": "Möchtest du diese Person wirklich löschen?",
"confirm_delete": "Möchten Sie diese Person wirklich löschen?",
"confirm_delete2": "Alle Geräte, die zu dieser Person gehören, werden nicht mehr zugeordnet.",
"create_person": "Person erstellen",
"description": "Verwalte die Personen, die Home Assistant verfolgt.",
@ -1343,11 +1415,11 @@
"name": "Name",
"name_error_msg": "Name erforderlich",
"new_person": "Neue Person",
"no_device_tracker_available_intro": "Wenn du Geräte hast, die die Anwesenheit einer Person anzeigen, kannst du diese hier einer Person zuordnen. Du kannst dein erstes Gerät hinzufügen, indem du eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügst.",
"no_device_tracker_available_intro": "Wenn Sie Geräte haben, die die Anwesenheit einer Person anzeigen, können Sie diese hier einer Person zuordnen. Sie können Ihr erstes Gerät hinzufügen, indem Sie eine Integration zur Anwesenheitserkennung auf der Integrationsseite hinzufügen.",
"update": "Aktualisieren"
},
"introduction": "Hier kannst du jede Person von Interesse in Home Assistant definieren.",
"no_persons_created_yet": "Sieht so aus, als hättest du noch keine Personen angelegt.",
"introduction": "Hier können Sie jede Person von Interesse in Home Assistant definieren.",
"no_persons_created_yet": "Sieht so aus, als hätten Sie noch keine Personen angelegt.",
"note_about_persons_configured_in_yaml": "Hinweis: Personen, die über configuration.yaml konfiguriert wurden, können nicht über die Benutzeroberfläche bearbeitet werden."
},
"scene": {
@ -1360,17 +1432,17 @@
"add": "Ein Gerät hinzufügen",
"delete": "Gerät löschen",
"header": "Geräte",
"introduction": "Füge die Geräte hinzu, die in deine Szene aufgenommen werden sollen. Stelle alle Geräte so ein, wie sie in der Szene sein sollen."
"introduction": "Fügen Sie die Geräte hinzu, die in Ihrer Szene aufgenommen werden sollen. Stellen Sie alle Geräte so ein, wie sie in der Szene sein sollen."
},
"entities": {
"add": "Eine Entität hinzufügen",
"delete": "Entität löschen",
"device_entities": "Wenn du eine Entität hinzufügst, die zu einem Gerät gehört, wird das Gerät hinzugefügt.",
"device_entities": "Wenn Sie eine Entität hinzufügen, die zu einem Gerät gehört, wird das Gerät hinzugefügt.",
"header": "Entitäten",
"introduction": "Entitäten, die nicht zu einem Gerät gehören, können hier festgelegt werden.",
"without_device": "Entitäten ohne Gerät"
},
"introduction": "Benutze Szenen, um deinem Zuhause Leben einzuhauchen",
"introduction": "Benutzen Sie Szenen, um Ihrem Zuhause Leben einzuhauchen.",
"load_error_not_editable": "Nur Szenen in der scenes.yaml sind editierbar.",
"load_error_unknown": "Fehler beim Laden der Szene ({err_no}).",
"name": "Name",
@ -1379,7 +1451,7 @@
},
"picker": {
"add_scene": "Szene hinzufügen",
"delete_confirm": "Bist du dir sicher, dass du diese Szene löschen möchtest?",
"delete_confirm": "Sind Sie sicher, dass Sie diese Szene löschen möchten?",
"delete_scene": "Szene löschen",
"edit_scene": "Szene bearbeiten",
"header": "Szenen-Editor",
@ -1426,8 +1498,10 @@
"group": "Gruppen neu laden",
"heading": "Konfiguration neu laden",
"introduction": "Einige Komponenten von Home Assistant können ohne einen Neustart neu geladen werden. \"Neu laden\" entlädt dabei die aktuelle Konfiguration und lädt die neue Konfiguration.",
"person": "Personen neu laden",
"scene": "Szenen neu laden",
"script": "Skripte neu laden"
"script": "Skripte neu laden",
"zone": "Zonen neu laden"
},
"server_management": {
"confirm_restart": "Möchten Sie Home Assistant wirklich neu starten?",
@ -1440,7 +1514,7 @@
"validation": {
"check_config": "Konfiguration prüfen",
"heading": "Konfiguration überprüfen",
"introduction": "Überprüfe deine Konfiguration, wenn du kürzlich Änderungen vorgenommen hast und sicherstellen möchtest, dass alle Änderungen gültig sind",
"introduction": "Überprüfen Sie Ihre Konfiguration, wenn Sie kürzlich Änderungen vorgenommen haben und sicherstellen möchten, dass alle Änderungen gültig sind",
"invalid": "Konfiguration ungültig",
"valid": "Konfiguration in Ordnung"
}
@ -1461,7 +1535,7 @@
"active": "Aktiv",
"caption": "Benutzer anzeigen",
"change_password": "Passwort ändern",
"confirm_user_deletion": "Möchtest du {name} wirklich löschen?",
"confirm_user_deletion": "Möchten Sie {name} wirklich löschen?",
"deactivate_user": "Benutzer deaktivieren",
"delete_user": "Benutzer löschen",
"enter_new_name": "Neuen Namen eingeben",
@ -1499,14 +1573,14 @@
"help_attribute_dropdown": "Wähle ein Attribut aus, um dessen Wert anzuzeigen oder festzulegen.",
"help_get_zigbee_attribute": "Ruft den Wert für das ausgewählte Attribut ab.",
"help_set_zigbee_attribute": "Setzt den Attributwert für den angegebenen Cluster auf der angegebenen Entität.",
"introduction": "Anzeigen und Bearbeiten von Clusterattributen.",
"introduction": "Anzeigen und Bearbeiten von Cluster-Attributen.",
"set_zigbee_attribute": "Zigbee-Attribut setzen"
},
"cluster_commands": {
"commands_of_cluster": "Befehle des ausgewählten Clusters",
"header": "Cluster-Befehle",
"help_command_dropdown": "Wähle einen Befehl zur Interaktion aus.",
"introduction": "Anzeigen und Ausgeben von Clusterbefehlen.",
"introduction": "Anzeigen und Ausgeben von Cluster-Befehlen.",
"issue_zigbee_command": "Zigbee-Kommando absetzen"
},
"clusters": {
@ -1534,7 +1608,10 @@
"bind_button_help": "Binden Sie die ausgewählte Gruppe an die ausgewählten Geräte-Cluster.",
"bind_button_label": "Gruppe binden",
"cluster_selection_help": "Wählen Sie Cluster aus, die an die ausgewählte Gruppe gebunden werden sollen.",
"group_picker_help": "Wählen Sie eine Gruppe aus, um einen Bindungsbefehl zu erteilen.",
"group_picker_label": "Bindbare Gruppen",
"header": "Gruppenbindung",
"introduction": "Binden und Aufheben der Bindung von Gruppen.",
"unbind_button_help": "Trennen Sie die Bindung der ausgewählten Gruppe von den ausgewählten Geräte-Clustern.",
"unbind_button_label": "Gruppe auflösen"
},
@ -1544,20 +1621,20 @@
"caption": "Gruppen",
"create": "Gruppe erstellen",
"create_group": "Zigbee Home Automation - Gruppe erstellen",
"create_group_details": "Gebe die erforderlichen Details ein, um eine neue Zigbee-Gruppe zu erstellen",
"create_group_details": "Gib die erforderlichen Details ein, um eine neue Zigbee-Gruppe zu erstellen",
"creating_group": "Erstelle Gruppe",
"description": "Erstellen und Ändern von Zigbee-Gruppen",
"group_details": "Hier sind alle Details der ausgewählten Zigbee Gruppe.",
"group_id": "Gruppen ID",
"group_id": "Gruppen-ID",
"group_info": "Gruppen Information",
"group_name_placeholder": "Gruppenname",
"group_not_found": "Gruppe nicht gefunden!",
"group-header": "Zigbee Home Automation - Gruppen Details",
"group-header": "Zigbee Home Automation - Gruppen-Details",
"groups": "Gruppen",
"groups-header": "Zigbee Home Automation - Gruppen Management",
"groups-header": "Zigbee Home Automation - Gruppen-Verwaltung",
"header": "Zigbee Home Automation - Gruppen Management",
"introduction": "Erstelle oder bearbeite Zigbee Gruppen",
"manage_groups": "Zigbee Gruppen verwalten",
"manage_groups": "Zigbee-Gruppen verwalten",
"members": "Mitglieder",
"remove_groups": "Entferne Gruppe",
"remove_members": "Mitglieder entfernen",
@ -1576,15 +1653,41 @@
"help_node_dropdown": "Wähle ein Gerät aus, um die Geräteoptionen anzuzeigen.",
"hint_battery_devices": "Hinweis: Schlafende (batteriebetriebene) Geräte müssen wach sein, wenn Befehle für sie ausgeführt werden. Ein schlafendes Gerät kann meist durch eine Aktion am Gerät aufgeweckt werden.",
"hint_wakeup": "Einige Geräte, z. B. Xiaomi-Sensoren, verfügen über eine Wecktaste, die in Intervallen von ~5 Sekunden gedrückt werden kann, um die Geräte wach zu halten, während mit ihnen interagiert wird.",
"introduction": "Führe ZHA-Befehle aus, die sich auf ein einzelnes Gerät auswirken. Wähle ein Gerät aus, um eine Liste der verfügbaren Befehle anzuzeigen."
"introduction": "ZHA-Befehle ausführen, die sich auf ein einzelnes Gerät auswirken. Wählen Sie ein Gerät aus, um eine Liste der verfügbaren Befehle anzuzeigen."
},
"services": {
"reconfigure": "Rekonfiguriere ZHA-Gerät (Gerät heilen). Benutze dies, wenn du Probleme mit dem Gerät hast. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stelle sicher dass es wach ist und Kommandos akzeptiert wenn du diesen Dienst benutzt.",
"reconfigure": "Rekonfigurieren des ZHA-Geräts (Gerät heilen). Benutzen Sie dies, wenn Sie Probleme mit dem Gerät haben. Wenn es sich bei dem betroffenden Gerät um ein batteriebetriebenes Gerät handelt, stellen Sie sicher, dass es wach ist und Kommandos akzeptiert, wenn Sie diesen Dienst benutzen.",
"remove": "Entferne ein Gerät aus dem Zigbee-Netzwerk.",
"updateDeviceName": "Lege einen benutzerdefinierten Namen für dieses Gerät in der Geräteregistrierung fest."
},
"title": "Zigbee Home Automation"
},
"zone": {
"add_zone": "Zone hinzufügen",
"caption": "Zonen",
"configured_in_yaml": "Zonen, die über configuration.yaml konfiguriert wurden, können nicht über die Benutzeroberfläche bearbeitet werden.",
"confirm_delete": "Möchten Sie diesen Bereich wirklich löschen?",
"create_zone": "Zone erstellen",
"description": "Verwalten Sie die Zonen, in denen Sie Personen verfolgen möchten.",
"detail": {
"create": "Erstellen",
"delete": "Löschen",
"icon": "Icon",
"icon_error_msg": "Das Icon sollte das Format Präfix:ICONNAME haben, zum Beispiel: mdi:home",
"latitude": "Breitengrad",
"longitude": "Längengrad",
"name": "Name",
"new_zone": "Neue Zone",
"passive": "Passiv",
"passive_note": "Passive Zonen sind im Frontend versteckt und werden nicht als Ort für Device Tracker verwendet. Dies ist nützlich, wenn Sie es nur für Automatisierungen verwenden möchten.",
"radius": "Radius",
"required_error_msg": "Dieses Feld ist erforderlich",
"update": "Aktualisieren"
},
"edit_home_zone": "Der Standort Ihres Hauses kann in der allgemeinen Konfiguration geändert werden.",
"introduction": "Mit Zonen können Sie bestimmte Regionen auf der Erde angeben. Befindet sich eine Person in einer Zone, übernimmt der Zustand den Namen aus der Zone. Zonen können auch als Auslöser oder Bedingung in Automatisierungs-Setups verwendet werden.",
"no_zones_created_yet": "Es sieht so aus, als hätten Sie noch keine Zonen erstellt."
},
"zwave": {
"caption": "Z-Wave",
"common": {
@ -1620,7 +1723,7 @@
},
"ozw_log": {
"header": "OZW Log",
"introduction": "Schaue das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert."
"introduction": "Schauen Sie das Protokoll an. 0 ist das Minimum (lädt das gesamte Protokoll) und 1000 ist das Maximum. Beim Laden wird ein statisches Protokoll angezeigt und das Ende wird automatisch mit der zuletzt angegebenen Anzahl von Zeilen des Protokolls aktualisiert."
},
"services": {
"add_node": "Knoten hinzufügen",
@ -1643,7 +1746,7 @@
"external_panel": {
"complete_access": "Es wird Zugriff auf alle Daten in Home Assistant haben.",
"hide_message": "Überprüfe die Dokumentation für die panel_custom Komponente, um diese Meldung auszublenden.",
"question_trust": "Vertraust du dem externen Panel {name} unter {link}?"
"question_trust": "Vertrauen Sie dem externen Panel {name} unter {link}?"
}
},
"developer-tools": {
@ -1698,15 +1801,15 @@
"title": "Logs"
},
"mqtt": {
"description_listen": "Auf ein Thema lauschen",
"description_listen": "Auf einen Topic hören",
"description_publish": "Ein Paket veröffentlichen",
"listening_to": "Anhören von",
"message_received": "Nachricht {id} empfangen auf {topic} um {time} :",
"message_received": "Nachricht {id} empfangen auf {topic} um {time}:",
"payload": "Payload (Vorlage erlaubt)",
"publish": "Veröffentlichen",
"start_listening": "Anfangen zuzuhören",
"stop_listening": "Aufhören zuzuhören",
"subscribe_to": "Thema abonnieren",
"subscribe_to": "Topic abonnieren",
"title": "MQTT",
"topic": "Topic"
},
@ -1766,17 +1869,20 @@
},
"lovelace": {
"add_entities": {
"generated_unsupported": "Du kannst diese Funktion nur verwenden, wenn du die Kontrolle über Lovelace übernommen hast.",
"generated_unsupported": "Sie können diese Funktion nur verwenden, wenn Sie die Kontrolle über Lovelace übernommen haben.",
"saving_failed": "Speichern der Lovelace-Konfiguration ist fehlgeschlagen.",
"yaml_unsupported": "Du kannst diese Funktion nicht verwenden, wenn du Lovelace im YAML-Modus verwendest."
"yaml_unsupported": "Sie können diese Funktion nicht verwenden, wenn Sie Lovelace im YAML-Modus verwenden."
},
"cards": {
"confirm_delete": "Möchtest du diese Karte wirklich löschen?",
"confirm_delete": "Möchten Sie diese Karte wirklich löschen?",
"empty_state": {
"go_to_integrations_page": "Gehe zur Integrationsseite.",
"no_devices": "Auf dieser Seite kannst du deine Geräte steuern, es sieht jedoch so aus, als hättest du noch keine eingerichtet. Gehe zur Integrationsseite, um damit zu beginnen.",
"no_devices": "Auf dieser Seite können Sie Ihre Geräte steuern, es sieht jedoch so aus, als hätten Sie noch keine eingerichtet. Gehen Sie zur Integrationsseite, um damit zu beginnen.",
"title": "Willkommen zu Hause"
},
"entities": {
"never_triggered": "Nie ausgelöst"
},
"picture-elements": {
"call_service": "Dienst {name} ausführen",
"hold": "Halten:",
@ -1793,7 +1899,7 @@
}
},
"changed_toast": {
"message": "Die Lovelace-Konfiguration wurde aktualisiert, möchtest du sie aktualisieren?",
"message": "Die Lovelace-Konfiguration wurde aktualisiert, möchten Sie sie aktualisieren?",
"refresh": "Aktualisieren"
},
"editor": {
@ -1907,6 +2013,7 @@
"name": "Sensor"
},
"shopping-list": {
"integration_not_loaded": "Für diese Karte muss die `shopping_list`-Integration eingerichtet werden.",
"name": "Einkaufsliste"
},
"thermostat": {
@ -1927,7 +2034,7 @@
"move": "Zur Ansicht Bewegen",
"options": "Mehr Optionen",
"pick_card": "Karte auswählen, die hinzugefügt werden soll.",
"pick_card_view_title": "Welche Karte möchtest du deiner {name} -Ansicht hinzufügen?",
"pick_card_view_title": "Welche Karte möchten Sie Ihrer {name} -Ansicht hinzufügen?",
"save": "Speichern",
"show_code_editor": "Code-Editor anzeigen",
"show_visual_editor": "Visuellen Editor anzeigen",
@ -1955,14 +2062,14 @@
"migrate": {
"header": "Konfiguration inkompatibel",
"migrate": "Konfiguration migrieren",
"para_migrate": "Home Assistant kann für alle Ihre Karten und Ansichten die IDs automatisch generieren, wenn du den \"Konfiguration migrieren\"-Button klickst.",
"para_migrate": "Home Assistant kann für alle Ihre Karten und Ansichten die IDs automatisch generieren, wenn Sie den \"Konfiguration migrieren\"-Button klicken.",
"para_no_id": "Dieses Element hat keine ID. Bitte füge diesem Element eine ID in 'ui-lovelace.yaml' hinzu."
},
"raw_editor": {
"confirm_remove_config_text": "Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten, wenn du deine Lovelace-Konfiguration entfernst.",
"confirm_remove_config_title": "Bist du sicher, dass du deine Lovelace-Konfiguration entfernen möchtest? Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten.",
"confirm_unsaved_changes": "Du hast ungespeicherte Änderungen, bist du sicher, dass du sie beenden willst?",
"confirm_unsaved_comments": "Deine Konfiguration enthält einen oder mehrere Kommentare, diese werden nicht gespeichert. Möchtest du fortfahren?",
"confirm_remove_config_text": "Wir generieren automatisch deine Lovelace-Ansichten mit deinen Bereichen und Geräten, wenn Sie Ihre Lovelace-Konfiguration entfernen.",
"confirm_remove_config_title": "Bist Ssie sicher, dass Sie Ihre deine Lovelace-Konfiguration entfernen ollen? Wir generieren automatisch Ihre Lovelace-Ansichten mit Ihren Bereichen und Geräten.",
"confirm_unsaved_changes": "Sie haben ungespeicherte Änderungen, sind Sie sicher, dass Sie beenden willen?",
"confirm_unsaved_comments": "Ihre Konfiguration enthält einen oder mehrere Kommentare, diese werden nicht gespeichert. Möchten Sie fortfahren?",
"error_invalid_config": "Deine Konfiguration ist ungültig: {error}",
"error_parse_yaml": "YAML kann nicht geparsed werden: {error}",
"error_remove": "Konfiguration konnte nicht entfernt werden: {error}",
@ -1975,13 +2082,13 @@
"save_config": {
"cancel": "Abbrechen",
"header": "Lovelace Userinterface selbst verwalten",
"para": "Standardmäßig verwaltet Home Assistant Ihre Benutzeroberfläche und aktualisiert sie, sobald neue Entitäten oder Lovelace-Komponenten verfügbar sind. Wenn du die Verwaltung selbst übernehmen willst, nehmen wir für dich keine Änderungen mehr vor.",
"para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?",
"para": "Standardmäßig verwaltet Home Assistant Ihre Benutzeroberfläche und aktualisiert sie, sobald neue Entitäten oder Lovelace-Komponenten verfügbar sind. Wenn Sie die Verwaltung selbst übernehmen wollen, nehmen wir für Sie keine Änderungen mehr vor.",
"para_sure": "Sind Sie sicher, dass Sie die Benutzeroberfläche selbst verwalten möchten?",
"save": "Kontrolle übernehmen"
},
"suggest_card": {
"add": "Zu Lovelace hinzufügen",
"create_own": "Erstelle dein eigenes",
"create_own": "Wählen Sie eine andere Karte",
"header": "Wir haben einen Vorschlag für dich erstellt"
},
"view": {
@ -1994,24 +2101,24 @@
"menu": {
"close": "Schließen",
"configure_ui": "Benutzeroberfläche konfigurieren",
"exit_edit_mode": "Schließe den UI-Bearbeitungsmodus",
"exit_edit_mode": "Schließen des UI-Bearbeitungsmodus",
"help": "Hilfe",
"refresh": "Aktualisieren",
"unused_entities": "Ungenutzte Elemente"
},
"reload_lovelace": "Lovelace neu laden",
"reload_lovelace": "Benutzeroberfläche neu laden",
"unused_entities": {
"available_entities": "Dies sind die Entitäten, die du zur Verfügung hast, die aber noch nicht in deiner Lovelace-Benutzeroberfläche enthalten sind.",
"available_entities": "Dies sind die Entitäten, die Sie zur Verfügung haben, die aber noch nicht in Ihrer Lovelace-Benutzeroberfläche enthalten sind.",
"domain": "Domain",
"entity": "Entität",
"entity_id": "Entitäts-ID",
"last_changed": "Zuletzt geändert",
"select_to_add": "Wähle die Entitäten aus, die Du zur Karte hinzufügen möchtest und klicke auf den Karte hinzufügen Button.",
"select_to_add": "Wählen Sie die Entitäten aus, die Sie zur Karte hinzufügen möchten und klicken Sie auf den Karte hinzufügen Button.",
"title": "Nicht verwendete Entitäten"
},
"views": {
"confirm_delete": "Möchtest du diese Ansicht wirklich löschen?",
"existing_cards": "Du kannst eine Ansicht mit Karten nicht löschen. Entfernen zuerst die Karten."
"confirm_delete": "Möchten Sie diese Ansicht wirklich löschen?",
"existing_cards": "Sie können eine Ansicht mit Karten nicht löschen. Entfernen Sie zuerst die Karten."
},
"warning": {
"entity_non_numeric": "Die Entität ist nicht-numerisch: {entity}",
@ -2021,12 +2128,12 @@
"mailbox": {
"delete_button": "Löschen",
"delete_prompt": "Diese Nachricht löschen?",
"empty": "Du hast keine Nachrichten",
"empty": "Sie haben keine Nachrichten",
"playback_title": "Nachrichtenwiedergabe"
},
"page-authorize": {
"abort_intro": "Anmeldung abgebrochen",
"authorizing_client": "Du bist dabei, {clientId} Zugriff auf deine Home Assistant Instanz zu gewähren.",
"authorizing_client": "Sie sind dabei, {clientId} Zugriff auf Ihre Home Assistant-Instanz zu gewähren.",
"form": {
"providers": {
"command_line": {
@ -2048,7 +2155,7 @@
"data": {
"code": "Zwei-Faktor Authentifizierungscode"
},
"description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:"
"description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:"
}
}
},
@ -2071,14 +2178,14 @@
"data": {
"code": "Zwei-Faktor Authentifizierungscode"
},
"description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:"
"description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:"
}
}
},
"legacy_api_password": {
"abort": {
"login_expired": "Sitzung abgelaufen, bitte erneut anmelden.",
"no_api_password_set": "Du hast kein API-Passwort konfiguriert."
"no_api_password_set": "Sie haben kein API-Passwort konfiguriert."
},
"error": {
"invalid_auth": "Ungültiges API-Passwort",
@ -2095,7 +2202,7 @@
"data": {
"code": "Zwei-Faktor Authentifizierungscode"
},
"description": "Öffne das **{mfa_module_name}** auf deinem Gerät um den 2-Faktor Authentifizierungscode zu sehen und deine Identität zu bestätigen:"
"description": "Öffnen Sie das **{mfa_module_name}** auf Ihrem Gerät, um den 2-Faktor Authentifizierungscode zu sehen und Ihre Identität zu bestätigen:"
}
}
},
@ -2108,7 +2215,7 @@
"data": {
"user": "Benutzer"
},
"description": "Bitte wähle einen Benutzer aus, mit dem du dich anmelden möchtest:"
"description": "Bitte wählen Sie einen Benutzer aus, mit dem Sie sich anmelden möchten:"
}
}
}
@ -2124,7 +2231,7 @@
"cards": {
"demo": {
"demo_by": "von {name}",
"introduction": "Willkommen zu Hause! Du hast die Home Assistant Demo erreicht, in der wir die besten Benutzeroberflächen unserer Community präsentieren.",
"introduction": "Willkommen zu Hause! Sie haben die Home Assistant-Demo erreicht, in der wir die besten Benutzeroberflächen unserer Community präsentieren.",
"learn_more": "Erfahre mehr über Home Assistant",
"next_demo": "Nächste Demo"
}
@ -2168,8 +2275,8 @@
"core-config": {
"button_detect": "Erkennen",
"finish": "Weiter",
"intro": "Hallo {name}, willkommen bei der Home Assistant. Wie möchtest du dein Haus benennen?",
"intro_location": "Wir würden gerne wissen, wo du wohnst. Diese Information hilft bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb deines Netzwerks weitergegeben.",
"intro": "Hallo {name}, willkommen bei Home Assistant. Wie möchten Sie Ihre Haus benennen?",
"intro_location": "Wir würden gerne wissen, wo Sie wohnen. Diese Daten helfen bei der Anzeige von Informationen und der Einrichtung von Sonnenstands-basierten Automatisierungen. Diese Daten werden niemals außerhalb Ihres Netzwerks weitergegeben.",
"intro_location_detect": "Wir können helfen, diese Informationen auszufüllen, indem wir eine einmalige Anfrage an einen externen Dienstleister richten.",
"location_name_default": "Home"
},
@ -2178,7 +2285,7 @@
"intro": "Geräte und Dienste werden in Home Assistant als Integrationen dargestellt. Sie können jetzt oder später über die Konfigurationsseite eingerichtet werden.",
"more_integrations": "Mehr"
},
"intro": "Bist du bereit, dein Zuhause zu erwecken, deine Privatsphäre zurückzugewinnen und einer weltweiten Gemeinschaft von Tüftlern beizutreten?",
"intro": "Sind Sie bereit, dein Zuhause zu wecken, Ihre Privatsphäre zurückzugewinnen und einer weltweiten Gemeinschaft von Tüftlern beizutreten?",
"user": {
"create_account": "Benutzerkonto anlegen",
"data": {
@ -2197,7 +2304,8 @@
},
"profile": {
"advanced_mode": {
"description": "Home-Assistent verbirgt standardmäßig erweiterte Funktionen und Optionen. Mache diese Funktionen zugänglich, indem diese Option aktiviert wird. Dies ist eine benutzerspezifische Einstellung, die sich nicht auf andere Benutzer auswirkt, die Home Assistant verwenden.",
"description": "Home Assistent verbirgt standardmäßig erweiterte Funktionen und Optionen. Mache diese Funktionen zugänglich, indem diese Option aktiviert wird. Dies ist eine benutzerspezifische Einstellung, die sich nicht auf andere Benutzer auswirkt, die Home Assistant verwenden.",
"link_promo": "Mehr erfahren",
"title": "Erweiterter Modus"
},
"change_password": {
@ -2208,29 +2316,31 @@
"new_password": "Neues Passwort",
"submit": "Absenden"
},
"current_user": "Du bist derzeit als {fullName} angemeldet.",
"current_user": "Sie sind derzeit als {fullName} angemeldet.",
"force_narrow": {
"description": "Dies blendet die Seitenleiste standardmäßig aus, ähnlich der Nutzung auf Mobilgeräten.",
"header": "Verstecke die Seitenleiste immer"
},
"is_owner": "Du bist der Besitzer",
"is_owner": "Sie sind der Besitzer.",
"language": {
"dropdown_label": "Sprache",
"header": "Sprache",
"link_promo": "Hilf beim Übersetzen"
},
"logout": "Abmelden",
"logout_text": "Möchten Sie sich wirklich abmelden?",
"logout_title": "Abmelden?",
"long_lived_access_tokens": {
"confirm_delete": "Möchtest du den Zugriffs-Token für {name} wirklich löschen?",
"confirm_delete": "Möchten Sie den Zugriffs-Token für {name} wirklich löschen?",
"create": "Token erstellen",
"create_failed": "Das Zugriffs-Token konnte nicht erstellt werden.",
"created_at": "Erstellt am {date}",
"delete_failed": "Fehler beim Löschen des Zugriffs-Tokens.",
"description": "Erstelle langlebige Zugriffstoken, damit deine Skripte mit deiner Home Assistant-Instanz interagieren können. Jedes Token ist ab der Erstellung für 10 Jahre gültig. Die folgenden langlebigen Zugriffstoken sind derzeit aktiv.",
"empty_state": "Du hast noch keine langlebigen Zugangs-Token.",
"empty_state": "Sie haben noch keine langlebigen Zugangs-Token.",
"header": "Langlebige Zugangs-Token",
"last_used": "Zuletzt verwendet am {date} in {location}",
"learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.",
"learn_auth_requests": "Erfahren Sie, wie Sie authentifizierte Anfragen stellen können.",
"not_used": "Wurde noch nie benutzt",
"prompt_copy_token": "Kopiere deinen Zugangs-Token. Er wird nicht wieder angezeigt werden.",
"prompt_name": "Name?"
@ -2243,25 +2353,25 @@
"title_success": "Erfolgreich!"
},
"mfa": {
"confirm_disable": "Möchtest du {name} wirklich deaktivieren?",
"confirm_disable": "Möchten Sie {name} wirklich deaktivieren?",
"disable": "Deaktivieren",
"enable": "Aktivieren",
"header": "2-Faktor-Authentifizierung Module"
"header": "2-Faktor-Authentifizierung-Module"
},
"push_notifications": {
"description": "Sende Benachrichtigungen an dieses Gerät.",
"error_load_platform": "Konfiguriere notify.html5.",
"error_use_https": "Erfordert aktiviertes SSL für das Frontend.",
"error_use_https": "Erfordert aktiviertes SSL/TLS für das Frontend.",
"header": "Push-Benachrichtigungen",
"link_promo": "Mehr erfahren",
"push_notifications": "Push-Benachrichtigungen"
},
"refresh_tokens": {
"confirm_delete": "Möchtest du das Aktualisierungstoken für {name} wirklich löschen?",
"confirm_delete": "Möchten Sie das Aktualisierungs-Token für {name} wirklich löschen?",
"created_at": "Erstellt am {date}",
"current_token_tooltip": "Aktueller Refresh-Token konnte nicht gelöscht werden",
"delete_failed": "Fehler beim Löschen das Aktualisierungs-Token.",
"description": "Jedes Aktualisierungstoken stellt eine Anmeldesitzung dar. Aktualisierungstoken werden automatisch entfernt, wenn du auf Abmelden klickst. Die folgenden Aktualisierungstoken sind derzeit für dein Konto aktiv.",
"description": "Jedes Aktualisierungs-Token stellt eine Anmeldesitzung dar. Aktualisierungs-Token werden automatisch entfernt, wenn Sie Abmelden klicken. Die folgenden Aktualisierungs-Token sind derzeit für Ihr Konto aktiv.",
"header": "Aktualisierungs-Tokens",
"last_used": "Zuletzt verwendet am {date} in {location}",
"not_used": "Wurde noch nie benutzt",

View File

@ -543,10 +543,24 @@
"yes": "Ναι"
},
"components": {
"area-picker": {
"add_dialog": {
"add": "Προσθήκη",
"failed_create_area": "Αποτυχία δημιουργίας περιοχής.",
"name": "Όνομα",
"text": "Εισάγετε το όνομα της νέας περιοχής.",
"title": "Προσθήκη νέας περιοχής"
},
"add_new": "Προσθήκη νέας περιοχής...",
"area": "Περιοχή",
"clear": "Εκκαθάριση",
"show_areas": "Εμφάνιση περιοχών"
},
"device-picker": {
"clear": "Καθαρός",
"device": "Συσκευή",
"show_devices": "Εμφάνιση συσκευών"
"show_devices": "Εμφάνιση συσκευών",
"toggle": "Εναλλαγή"
},
"entity": {
"entity-picker": {
@ -597,6 +611,11 @@
"unavailable": "Αυτή η οντότητα δεν είναι προς το παρόν διαθέσιμη."
}
},
"generic": {
"cancel": "Ακύρωση",
"default_confirmation_title": "Είστε σίγουροι;",
"ok": "Εντάξει"
},
"more_info_control": {
"dismiss": "Κλείσιμο διαλόγου.",
"script": {
@ -1172,14 +1191,19 @@
"actions": {
"caption": "Όταν ενεργοποιείται κάτι…"
},
"automations": "Αυτοματισμοί",
"conditions": {
"caption": "Κάνε κάτι μόνο αν…"
},
"create": "Δημιουργία αυτοματισμού με τη συσκευή",
"no_automations": "Δεν υπάρχουν αυτοματισμοί",
"no_device_automations": "Δεν υπάρχουν διαθέσιμοι αυτοματισμοί για αυτήν τη συσκευή.",
"triggers": {
"caption": "Κάνε κάτι όταν…"
}
},
"automations": "Αυτοματισμοί",
"cant_edit": "Μπορείτε να επεξεργαστείτε μόνο στοιχεία που έχουν δημιουργηθεί στο UI.",
"caption": "Συσκευές",
"confirm_rename_entity_ids": "Θέλετε επίσης να μετονομάσετε τα αναγνωριστικά οντότητας των οντοτήτων σας;",
"data_table": {
@ -1194,8 +1218,16 @@
"details": "Δείτε όλες τις λεπτομέρειες της συσκευής σας.",
"device_not_found": "Η συσκευή δε βρέθηκε.",
"info": "Πληροφορίες συσκευής",
"name": "Όνομα",
"scene": {
"create": "Δημιουργία σκηνής με τη συσκευή",
"no_scenes": "Δεν υπάρχουν σκηνές",
"scenes": "Σκηνές"
},
"scenes": "Σκηνές",
"unknown_error": "Άγνωστο σφάλμα",
"unnamed_device": "Συσκευή χωρίς όνομα"
"unnamed_device": "Συσκευή χωρίς όνομα",
"update": "Ενημέρωση"
},
"entities": {
"caption": "Μητρώο οντοτήτων",
@ -1502,6 +1534,9 @@
"updateDeviceName": "Ορίστε ένα προσαρμοσμένο όνομα γι αυτήν τη συσκευή στο μητρώο συσκευών."
}
},
"zone": {
"edit_home_zone": "Η τοποθεσία του σπιτιού σας μπορεί να αλλαχτεί από τις γενικές ρυθμίσεις."
},
"zwave": {
"caption": "Z-Wave",
"common": {
@ -2102,6 +2137,7 @@
"profile": {
"advanced_mode": {
"description": "εξειδικευμένη λειτουργία",
"link_promo": "Μάθετε περισσότερα",
"title": "Εξειδικευμένη λειτουργία"
},
"change_password": {

View File

@ -659,6 +659,18 @@
},
"updater": {
"title": "Update Instructions"
},
"vacuum": {
"clean_spot": "Clean spot",
"commands": "Vacuum cleaner commands:",
"fan_speed": "Fan speed",
"locate": "Locate",
"pause": "Pause",
"return_home": "Return home",
"start": "Start",
"start_pause": "Start/Pause",
"status": "Status",
"stop": "Stop"
}
},
"more_info_settings": {
@ -1232,6 +1244,7 @@
},
"create": "Create automation with device",
"no_automations": "No automations",
"no_device_automations": "There are no automations available for this device.",
"triggers": {
"caption": "Do something when..."
}
@ -1495,8 +1508,8 @@
"automation": "Reload automations",
"core": "Reload location & customizations",
"group": "Reload groups",
"heading": "Configuration reloading",
"introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current configuration and load the new one.",
"heading": "YAML configuration reloading",
"introduction": "Some parts of Home Assistant can reload without requiring a restart. Hitting reload will unload their current YAML configuration and load the new one.",
"person": "Reload persons",
"scene": "Reload scenes",
"script": "Reload scripts",
@ -1678,12 +1691,12 @@
"name": "Name",
"new_zone": "New Zone",
"passive": "Passive",
"passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is usefull if you just want to use it for automations.",
"passive_note": "Passive zones are hidden in the frontend and are not used as location for device trackers. This is useful if you just want to use it for automations.",
"radius": "Radius",
"required_error_msg": "This field is required",
"update": "Update"
},
"edit_home_zone": "The location of your home can be changed in the gerenal config.",
"edit_home_zone": "The location of your home can be changed in the general config.",
"introduction": "Zones allow you to specify certain regions on earth. When a person is within a zone, the state will take the name from the zone. Zones can also be used as a trigger or condition inside automation setups.",
"no_zones_created_yet": "Looks like you have not created any zones yet."
},

File diff suppressed because it is too large Load Diff

View File

@ -544,10 +544,24 @@
"yes": "Sí"
},
"components": {
"area-picker": {
"add_dialog": {
"add": "Añadir",
"failed_create_area": "No se pudo crear el área.",
"name": "Nombre",
"text": "Introduce el nombre del área nueva.",
"title": "Añadir nueva área"
},
"add_new": "Añade una nueva área ...",
"area": "Área",
"clear": "Limpiar",
"show_areas": "Mostrar áreas"
},
"device-picker": {
"clear": "Limpiar",
"device": "Dispositivo",
"show_devices": "Mostrar dispositivos"
"show_devices": "Mostrar dispositivos",
"toggle": "Alternar"
},
"entity": {
"entity-picker": {
@ -604,13 +618,13 @@
"control": "Control",
"dismiss": "Descartar",
"editor": {
"confirm_delete": "¿Estás seguro de que quieres borrar este elemento?",
"delete": "BORRAR",
"confirm_delete": "¿Estás seguro de que quieres eliminar este elemento?",
"delete": "ELIMINAR",
"enabled_cause": "Desactivado por {cause}.",
"enabled_description": "Las entidades deshabilitadas no se agregarán a Home Assistant.",
"enabled_label": "Activar entidad",
"entity_id": "ID de la entidad",
"name": "Forzar el nombre",
"name": "Cambio de nombre",
"note": "Nota: puede que esto no funcione todavía con todas las integraciones",
"unavailable": "Esta entidad no está disponible actualmente.",
"update": "ACTUALIZAR"
@ -735,7 +749,7 @@
"editor": {
"create": "CREAR",
"default_name": "Área Nueva",
"delete": "BORRAR",
"delete": "ELIMINAR",
"update": "ACTUALIZAR"
},
"no_areas": "¡Parece que aún no tienes áreas!",
@ -750,7 +764,7 @@
},
"automation": {
"caption": "Automatizaciones",
"description": "Crear y editar automatizaciones",
"description": "Crea y edita automatizaciones",
"editor": {
"actions": {
"add": "Añadir acción",
@ -982,10 +996,10 @@
"config_documentation": "Documentación de configuración",
"disable": "deshabilitar",
"enable": "activar",
"enable_ha_skill": "Habilita la skill Home Assistant para Alexa",
"enable_state_reporting": "Habilitar informes de estado",
"enable_ha_skill": "Activa la skill Home Assistant para Alexa",
"enable_state_reporting": "Activar informes de estado",
"info": "Con la integración de Alexa para Home Assistant Cloud podrás controlar todos tus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Alexa.",
"info_state_reporting": "Si habilitas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Amazon. Esto te permite ver siempre los estados más recientes en la aplicación Alexa y usar los cambios de estado para crear rutinas.",
"info_state_reporting": "Si activas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Amazon. Esto te permite ver siempre los estados más recientes en la aplicación Alexa y usar los cambios de estado para crear rutinas.",
"manage_entities": "Administrar entidades",
"state_reporting_error": "No se puede {enable_disable} informar el estado.",
"sync_entities": "Sincronizar entidades",
@ -999,12 +1013,12 @@
"config_documentation": "Documentación de configuración",
"devices_pin": "Pin de dispositivos de seguridad",
"enable_ha_skill": "Activa la skill de Home Assistant para el Asistente de Google",
"enable_state_reporting": "Habilitar informes de estado",
"enable_state_reporting": "Activar informes de estado",
"enter_pin_error": "No se puede almacenar el pin:",
"enter_pin_hint": "Introduce un PIN para utilizar dispositivos de seguridad",
"enter_pin_info": "Por favor, introduce un pin para interactuar con los dispositivos de seguridad. Los dispositivos de seguridad son puertas, puertas de garaje y cerraduras. Se te pedirá que digas/introduzcas este pin cuando interactúes con dichos dispositivos a través del Asistente de Google.",
"info": "Con la integración del Asistente de Google para Home Assistant Cloud, podrás controlar todos tus dispositivos Home Assistant a través de cualquier dispositivo habilitado para Asistente de Google.",
"info_state_reporting": "Si habilitas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Google. Esto te permite ver siempre los últimos estados en la aplicación de Google.",
"info_state_reporting": "Si activas los informes de estado, Home Assistant enviará todos los cambios de estado de las entidades expuestas a Google. Esto te permite ver siempre los últimos estados en la aplicación de Google.",
"manage_entities": "Administrar entidades",
"security_devices": "Dispositivos de seguridad",
"sync_entities": "Sincronizar entidades con Google",
@ -1139,7 +1153,7 @@
},
"core": {
"caption": "Configuración general",
"description": "Cambiar la configuración general de Home Assistant",
"description": "Cambia la configuración general de Home Assistant",
"section": {
"core": {
"core_config": {
@ -1212,14 +1226,19 @@
"actions": {
"caption": "Cuando algo se activa...."
},
"automations": "Automatizaciones",
"conditions": {
"caption": "Sólo hacer algo si..."
},
"create": "Crear automatización con el dispositivo",
"no_automations": "Sin automatizaciones",
"no_device_automations": "No hay automatizaciones disponibles para este dispositivo.",
"triggers": {
"caption": "Hacer algo cuando..."
}
},
"automations": "Automatizaciones",
"cant_edit": "Solo puedes editar los elementos que se crean en la interfaz de usuario.",
"caption": "Dispositivos",
"confirm_rename_entity_ids": "¿También quieres cambiar el nombre de los identificadores de entidad de tus entidades?",
"data_table": {
@ -1234,13 +1253,27 @@
"details": "Aquí están todos los detalles de tu dispositivo.",
"device_not_found": "Dispositivo no encontrado.",
"entities": {
"add_entities_lovelace": "Agregar todas las entidades del dispositivo a Lovelace",
"add_entities_lovelace": "Añadir a Lovelace",
"entities": "Entidades",
"none": "Este dispositivo no tiene entidades"
},
"info": "Información del dispositivo",
"name": "Nombre",
"scene": {
"create": "Crear escena con el dispositivo",
"no_scenes": "Sin escenas",
"scenes": "Escenas"
},
"scenes": "Escenas",
"script": {
"create": "Crear script con el dispositivo",
"no_scripts": "Sin scripts",
"scripts": "Scripts"
},
"scripts": "Scripts",
"unknown_error": "Error desconocido",
"unnamed_device": "Dispositivo sin nombre"
"unnamed_device": "Dispositivo sin nombre",
"update": "Actualizar"
},
"entities": {
"caption": "Entidades",
@ -1249,12 +1282,12 @@
"confirm_delete": "¿Estás seguro de que deseas eliminar esta entrada?",
"confirm_delete2": "Eliminar una entrada no eliminará la entidad de Home Assistant. Para hacer esto, deberás eliminar la integración \"{platform}\" de Home Assistant.",
"default_name": "Área Nueva",
"delete": "BORRAR",
"delete": "ELIMINAR",
"enabled_cause": "Desactivado por {cause}.",
"enabled_description": "Las entidades desactivadas no se añadirán a Home Assistant.",
"enabled_label": "Activar entidad",
"entity_id": "ID de entidad",
"name": "Forzar el nombre",
"name": "Cambio de nombre",
"note": "Nota: es posible que esto no funcione aún con todas las integraciones.",
"unavailable": "Esta entidad no está disponible actualmente.",
"update": "ACTUALIZAR"
@ -1266,9 +1299,9 @@
"confirm_title": "¿Deseas deshabilitar {number} entidades?"
},
"enable_selected": {
"button": "Habilitar seleccionadas",
"button": "Activar seleccionadas",
"confirm_text": "Esto las hará disponibles en Home Assistant de nuevo si ahora están deshabilitadas.",
"confirm_title": "¿Deseas habilitar {number} entidades?"
"confirm_title": "¿Deseas activar {number} entidades?"
},
"filter": {
"filter": "Filtrar",
@ -1277,7 +1310,7 @@
},
"header": "Entidades",
"headers": {
"enabled": "Habilitado",
"enabled": "Activado",
"entity_id": "ID de entidad",
"integration": "Integración",
"name": "Nombre",
@ -1341,7 +1374,7 @@
},
"configure": "Configurar",
"configured": "Configurado",
"description": "Administrar y configurar integraciones",
"description": "Administra y configura integraciones",
"details": "Detalles de la integración",
"discovered": "Descubierto",
"home_assistant_website": "Sitio web de Home Assistant",
@ -1392,7 +1425,7 @@
"scene": {
"activated": "Activada escena {name}.",
"caption": "Escenas",
"description": "Crear y editar escenas",
"description": "Crea y edita escenas",
"editor": {
"default_name": "Nueva Escena",
"devices": {
@ -1432,7 +1465,7 @@
},
"script": {
"caption": "Scripts",
"description": "Crear y editar scripts",
"description": "Crea y edita scripts",
"editor": {
"alias": "Nombre",
"default_name": "Nuevo script",
@ -1496,7 +1529,7 @@
"username": "Nombre de usuario"
},
"caption": "Usuarios",
"description": "Administrar usuarios",
"description": "Administra usuarios",
"editor": {
"activate_user": "Activar usuario",
"active": "Activo",
@ -1504,7 +1537,7 @@
"change_password": "Cambiar la contraseña",
"confirm_user_deletion": "¿Seguro que quieres eliminar {name}?",
"deactivate_user": "Desactivar usuario",
"delete_user": "Borrar usuario",
"delete_user": "Eliminar usuario",
"enter_new_name": "Introduzca un nuevo nombre",
"group": "Grupo",
"group_update_failed": "La actualización del grupo falló:",
@ -1638,7 +1671,7 @@
"description": "Gestiona las zonas en las que deseas realizar un seguimiento de las personas.",
"detail": {
"create": "Crear",
"delete": "Borrar",
"delete": "Eliminar",
"icon": "Icono",
"icon_error_msg": "El icono debe estar en el formato prefijo:nombre_del_icono, por ejemplo: mdi:home",
"latitude": "Latitud",
@ -1651,7 +1684,7 @@
"required_error_msg": "Este campo es obligatorio",
"update": "Actualizar"
},
"edit_home_zone": "Es posible modificar la ubicación de tu casa en la configuración general",
"edit_home_zone": "La ubicación de tu casa se puede cambiar en la configuración general.",
"introduction": "Las zonas permiten especificar determinadas regiones de la tierra. Cuando una persona está dentro de una zona, su estado tomará el nombre de la zona. Las zonas también se pueden utilizar como desencadenante o condición dentro de las configuraciones de automatización.",
"no_zones_created_yet": "Parece que aún no has creado ninguna zona."
},
@ -1836,9 +1869,9 @@
},
"lovelace": {
"add_entities": {
"generated_unsupported": "Solo puedes usar esta función cuando hayas tomado el control de Lovelace.",
"saving_failed": "Error al guardar la configuración de Lovelace.",
"yaml_unsupported": "No puedes usar esta función cuando usas Lovelace en modo YAML."
"generated_unsupported": "Solo puedes usar esta función cuando hayas tomado el control de la IU Lovelace.",
"saving_failed": "Error al guardar la configuración de la IU Lovelace.",
"yaml_unsupported": "No puedes usar esta función cuando usas la IU Lovelace en modo YAML."
},
"cards": {
"confirm_delete": "¿Seguro que quieres eliminar esta tarjeta?",
@ -1866,7 +1899,7 @@
}
},
"changed_toast": {
"message": "La configuración de Lovelace se actualizó, ¿te gustaría volver a cargarla?",
"message": "La configuración de la IU Lovelace se actualizó, ¿te gustaría volver a cargarla?",
"refresh": "Actualizar"
},
"editor": {
@ -2009,12 +2042,12 @@
},
"edit_lovelace": {
"edit_title": "Editar título",
"explanation": "Este título se muestra sobre todas tus vistas en Lovelace.",
"explanation": "Este título se muestra sobre todas tus vistas en la IU Lovelace.",
"header": "Título de tu interfaz de usuario de Lovelace"
},
"edit_view": {
"add": "Añadir vista",
"delete": "Borrar vista",
"delete": "Eliminar vista",
"edit": "Editar vista",
"header": "Ver configuración",
"header_name": "{name} Ver configuración",
@ -2023,7 +2056,7 @@
},
"header": "Editar la interfaz de usuario",
"menu": {
"open": "Abrir el menú de Lovelace",
"open": "Abrir el menú de la IU Lovelace",
"raw_editor": "Editor de configuración en bruto"
},
"migrate": {
@ -2033,8 +2066,8 @@
"para_no_id": "Este elemento no tiene un ID. Por favor añade uno a este elemento en 'ui-lovelace.yaml'."
},
"raw_editor": {
"confirm_remove_config_text": "Generaremos automáticamente tus vistas de Lovelace con tus áreas y dispositivos si eliminas tu configuración de Lovelace.",
"confirm_remove_config_title": "¿Estás seguro de que deseas eliminar tu configuración de Lovelace? Generaremos automáticamente tus vistas de Lovelace con tus áreas y dispositivos.",
"confirm_remove_config_text": "Generaremos automáticamente tus vistas de la IU Lovelace con tus áreas y dispositivos si eliminas tu configuración de Lovelace.",
"confirm_remove_config_title": "¿Estás seguro de que deseas eliminar tu configuración de la IU Lovelace? Generaremos automáticamente tus vistas de la IU Lovelace con tus áreas y dispositivos.",
"confirm_unsaved_changes": "Tienes cambios sin guardar, ¿estás seguro de que quieres salir?",
"confirm_unsaved_comments": "Tu configuración contiene comentarios, estos no serán guardados. ¿Quieres continuar?",
"error_invalid_config": "Tu configuración no es válida: {error}",
@ -2054,7 +2087,7 @@
"save": "Tomar el control"
},
"suggest_card": {
"add": "Añadir a Lovelace",
"add": "Añadir a la IU Lovelace",
"create_own": "Elige una tarjeta diferente",
"header": "Hemos creado una sugerencia para ti"
},
@ -2073,7 +2106,7 @@
"refresh": "Actualizar",
"unused_entities": "Entidades no utilizadas"
},
"reload_lovelace": "Recargar Lovelace",
"reload_lovelace": "Recargar la IU Lovelace",
"unused_entities": {
"available_entities": "Estas son las entidades que tienes disponibles, pero aún no están en la interfaz de usuario de Lovelace.",
"domain": "Dominio",
@ -2271,7 +2304,7 @@
},
"profile": {
"advanced_mode": {
"description": "Home Assistant oculta las funciones y opciones avanzadas de forma predeterminada. Puedes hacer que estas funciones sean accesibles marcando esta opción. Esta es una configuración específica del usuario y no afecta a otros usuarios que usan Home Assistant.",
"description": "Desbloquea las funciones avanzadas.",
"link_promo": "Saber más",
"title": "Modo avanzado"
},
@ -2322,13 +2355,13 @@
"mfa": {
"confirm_disable": "¿Estás seguro de que deseas deshabilitar {name}?",
"disable": "Deshabilitar",
"enable": "Habilitar",
"enable": "Activar",
"header": "Módulos de autenticación multifactor"
},
"push_notifications": {
"description": "Enviar notificaciones a este dispositivo",
"error_load_platform": "Configurar notify.html5.",
"error_use_https": "Requiere SSL habilitado para frontend.",
"error_use_https": "Requiere SSL activado para frontend.",
"header": "Notificaciones push",
"link_promo": "Aprender más",
"push_notifications": "Notificaciones push"
@ -2351,7 +2384,7 @@
"link_promo": "Aprende sobre los temas"
},
"vibrate": {
"description": "Habilitar o deshabilitar la vibración en este dispositivo al controlar dispositivos.",
"description": "Activar o deshabilitar la vibración en este dispositivo al controlar dispositivos.",
"header": "Vibrar"
}
},

View File

@ -664,6 +664,7 @@
"header": "Toiminnot",
"introduction": "Home Assistant suorittaa toiminnot, kun automaatio laukaistaan.",
"learn_more": "Lisätietoja toiminnoista",
"name": "Toiminta",
"type_select": "Toiminnon tyyppi",
"type": {
"condition": {
@ -775,7 +776,7 @@
"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.",
"learn_more": "Lisätietoja triggereistä",
"name": "Laukaisuehto",
"name": "Käynnistysehto",
"type_select": "Laukaisimen tyyppi",
"type": {
"device": {
@ -817,7 +818,7 @@
"value_template": "Arvomalli (template)"
},
"state": {
"for": "Ajaksi",
"for": "Viive",
"from": "Lähtötila",
"label": "Tila",
"to": "Kohdetila"
@ -1040,7 +1041,11 @@
},
"devices": {
"area_picker_label": "Alue",
"automation": {
"no_device_automations": "Tälle laitteelle ei ole käytettävissä automaatioita."
},
"automations": "Automaatiot",
"cant_edit": "Voit muokata vain käyttöliittymässä luotuja kohteita.",
"caption": "Laitteet",
"data_table": {
"area": "Alue",
@ -1053,7 +1058,21 @@
"description": "Hallitse yhdistettyjä laitteita",
"details": "Tässä ovat kaikki laitteesi tiedot.",
"device_not_found": "Laitetta ei löydy.",
"entities": {
"add_entities_lovelace": "Lisää Lovelace näkymään"
},
"info": "Laitteen tiedot",
"scene": {
"create": "Luo tilanne laitteella",
"no_scenes": "Ei tilanteita",
"scenes": "Tilanteet"
},
"scenes": "Tilanteet",
"script": {
"create": "Luo tilanne laitteella",
"no_scripts": "Ei skriptejä"
},
"scripts": "Skriptit",
"unknown_error": "Tuntematon virhe",
"unnamed_device": "Nimeämätön laite"
},
@ -1094,7 +1113,7 @@
"hub": "Yhdistetty kautta",
"manuf": "{manufacturer}",
"no_area": "Ei aluetta",
"no_device": "Kokonaisuudet ilman laitteita",
"no_device": "Kohteet ilman laitteita",
"no_devices": "Tällä integraatiolla ei ole laitteita.",
"restart_confirm": "Käynnistä Home Assistant uudellen viimeistelläksesi tämän integraation poistamisen",
"settings_button": "Muokkaa {Integration}-asetuksia",
@ -1337,7 +1356,7 @@
"node_config": {
"config_parameter": "Asetusparametri",
"config_value": "Asetusarvo",
"false": "Eätosi",
"false": "Epätosi",
"header": "Solmun määritysasetukset",
"seconds": "sekuntia",
"set_config_parameter": "Aseta asetusparametri",
@ -1376,12 +1395,17 @@
"info": {
"developed_by": "Kehittänyt joukko mahtavia ihmisiä.",
"home_assistant_logo": "Home Assistant-logo",
"icons_by": "Kuvakkeet luonut",
"license": "Julkaistu Apache 2.0-lisenssillä",
"remove": "Poista",
"server": "palvelin",
"set": "Aseta",
"title": "Tiedot"
},
"logs": {
"refresh": "Päivitä",
"title": "Lokit"
},
"mqtt": {
"description_listen": "Kuuntele aihetta",
"description_publish": "Julkaise paketti",
@ -1409,6 +1433,7 @@
"title": "Tilat"
},
"templates": {
"editor": "Mallieditori",
"title": "Malli"
}
}
@ -1435,12 +1460,13 @@
"more_info": "Näytä lisätietoa: {name}",
"navigate_to": "Siirry kohtaan {location}",
"tap": "Napauta:",
"toggle": "Kytke {name}"
"toggle": "Kytke {name}",
"url": "Avaa ikkuna {url_path}"
},
"shopping-list": {
"add_item": "Lisää",
"checked_items": "Valitut",
"clear_items": "Tyhjää valitut"
"checked_items": "Valitut kohteet",
"clear_items": "Tyhjää valitut kohteet"
}
},
"changed_toast": {
@ -1557,7 +1583,7 @@
},
"edit_card": {
"add": "Lisää kortti",
"delete": "Poista",
"delete": "Poista kortti",
"edit": "Muokkaa",
"header": "Kortti-asetukset",
"move": "Siirrä",
@ -1591,6 +1617,8 @@
"para_no_id": "Elementillä ei ole ID. Lisää ID elementille 'ui-lovelace.yaml'-tiedostossa."
},
"raw_editor": {
"confirm_remove_config_text": "Lovelace käyttöliittymän näkymät luodaan automaattisesti alueistasi ja laitteistasi, jos poistat nykyisen määrityksen.",
"confirm_remove_config_title": "Haluatko varmasti poistaa Lovelace-käyttöliittymän asetukset? Lovelace käyttöliittymän asetukset luodaan automaattisesti alueistasi ja laitteistasi.",
"confirm_unsaved_changes": "Sinulla on tallentamattomia muutoksia. Haluatko varmasti poistua?",
"header": "Muokkaa asetuksia",
"save": "Tallenna",
@ -1603,6 +1631,9 @@
"para": "Oletuksena Home Assistant ylläpitää käyttöliittymääsi, päivittäen sitä uusien yksiköiden tai Lovelace komponenttien tullessa saataville. Jos muokkaat käyttöliittymääsi, emme enää tee muutoksia automaattisesti.",
"para_sure": "Oletko varma, että haluat ottaa haltuun käyttöliittymän?",
"save": "Ota hallintaan"
},
"suggest_card": {
"create_own": "Valitse toinen kortti"
}
},
"menu": {
@ -1781,7 +1812,7 @@
},
"integration": {
"finish": "Valmis",
"intro": "Laitteet ja palvelut ovat edustettuna Home Assistantissa integraatioina. Voit määrittää ne nyt tai tehdä sitä myöhemmin kokoonpanonäytöstä.",
"intro": "Laitteet ja palvelut on esitetty Home Assistantissa integraatioina. Voit määrittää ne nyt tai tehdä sen myöhemmin asetus valikosta.",
"more_integrations": "Lisää"
},
"intro": "Oletko valmis herättämään kotisi eloon, palauttamaan yksityisyytesi ja liittymään maailmanlaajuiseen nikkarien joukkoon?",
@ -1809,7 +1840,7 @@
"change_password": {
"confirm_new_password": "Vahvista uusi salasana",
"current_password": "Nykyinen salasana",
"error_required": "Edellytetään",
"error_required": "Pakollinen",
"header": "Vaihda salasana",
"new_password": "Uusi salasana",
"submit": "Lähetä"

View File

@ -411,7 +411,7 @@
},
"automation": {
"last_triggered": "Dernier déclenchement",
"trigger": "Exécutez"
"trigger": "Exécuter"
},
"camera": {
"not_available": "Image non disponible"
@ -772,7 +772,7 @@
"delete_confirm": "Voulez-vous vraiment effacer ?",
"duplicate": "Dupliquer",
"header": "Actions",
"introduction": "Les actions sont ce que Home Assistant fera quand une automatisation est déclenchée.",
"introduction": "Les actions sont ce que Home Assistant fera quand une automation est déclenchée.",
"learn_more": "En savoir plus sur les actions",
"name": "Action",
"type_select": "Type d'action",
@ -981,9 +981,9 @@
"delete_automation": "Supprimer l'automation",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer cette automation ?",
"edit_automation": "Modifier l'automation",
"header": "Éditeur d'automatisation",
"header": "Éditeur d'automation",
"introduction": "L'éditeur d'automations vous permet de créer et modifier des automations. Veuillez lire les instructions ci-dessous pour vous assurer d'avoir configuré Home Assistant correctement.",
"learn_more": "En savoir plus sur les automatisations",
"learn_more": "En savoir plus sur les automations",
"no_automations": "Il n'y a aucune automation modifiable.",
"only_editable": "Seules les automations définies dans automations.yaml sont modifiables.",
"pick_automation": "Choisissez l'automation à modifier",
@ -1046,7 +1046,7 @@
"webhooks": {
"disable_hook_error_msg": "Impossible de désactiver le Webhook:",
"info": "Tout ce qui est configuré pour être déclenché par un Webhook peut recevoir une URL accessible publiquement pour vous permettre de renvoyer des données à Home Assistant de nimporte où, sans exposer votre instance à Internet.",
"link_learn_more": "En savoir plus sur la création d'automatisations basées sur Webhook.",
"link_learn_more": "En savoir plus sur la création d'automations basées sur Webhook.",
"loading": "Chargement ...",
"manage": "Gérer",
"no_hooks_yet": "Il semble que vous n'ayez pas encore de Webhooks. Commencez en configurer un ",
@ -1226,12 +1226,13 @@
"actions": {
"caption": "Quand quelque chose est déclenché ..."
},
"automations": "Automatisations",
"automations": "Automations",
"conditions": {
"caption": "Ne faire quelque chose que si ..."
},
"create": "Créer une automatisation avec l'appareil",
"no_automations": "Aucune automatisation",
"create": "Créer une automation avec l'appareil",
"no_automations": "Aucune automation",
"no_device_automations": "Aucune automatisation n'est disponible pour cet appareil.",
"triggers": {
"caption": "Faire quelque chose quand ..."
}
@ -1252,7 +1253,7 @@
"details": "Voici tous les détails de votre appareil.",
"device_not_found": "Appareil non trouvé.",
"entities": {
"add_entities_lovelace": "Ajouter toutes les entités de l'appareil à l'interface utilisateur de Lovelace",
"add_entities_lovelace": "Ajouter à Lovelace",
"entities": "Entités",
"none": "Cet appareil n'a pas d'entités"
},
@ -1678,13 +1679,13 @@
"name": "Nom",
"new_zone": "Nouvelle zone",
"passive": "Passif",
"passive_note": "Les zones passives sont cachées dans le frontend et ne sont pas utilisées comme emplacement pour les traceurs de périphériques. C'est utile si vous voulez seulement les utiliser pour des automatisations.",
"passive_note": "Les zones passives sont cachées dans le frontend et ne sont pas utilisées comme emplacement pour les traceurs de périphériques. C'est utile si vous voulez seulement les utiliser pour des automations.",
"radius": "Rayon",
"required_error_msg": "Ce champ est requis",
"update": "Mettre à jour"
},
"edit_home_zone": "L'emplacement de votre maison peut être modifié dans la configuration générale.",
"introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automatisation.",
"introduction": "Les zones vous permettent de spécifier certaines régions sur la terre. Lorsqu'une personne se trouve dans une zone, l'état prend le nom de la zone. Les zones peuvent également être utilisées comme déclencheur ou condition dans les configurations d'automation.",
"no_zones_created_yet": "Il semble que vous n'ayez pas encore créé de zones."
},
"zwave": {
@ -2032,7 +2033,7 @@
"header": "Configuration de la carte",
"move": "Déplacer",
"options": "Plus d'options",
"pick_card": "Choisissez l'automatisation à ajouter",
"pick_card": "Choisissez l'automation à ajouter",
"pick_card_view_title": "Quelle carte souhaitez-vous ajouter à votre vue {name} ?",
"save": "Enregistrer",
"show_code_editor": "Afficher l'éditeur de code",

View File

@ -519,6 +519,9 @@
}
}
},
"devices": {
"scripts": "Scripts"
},
"integrations": {
"caption": "Integratione",
"config_entry": {

View File

@ -464,6 +464,9 @@
"script": {
"execute": "Izvršiti"
},
"service": {
"run": "Pokreni"
},
"timer": {
"actions": {
"cancel": "otkaži",
@ -526,10 +529,24 @@
"yes": "Da"
},
"components": {
"area-picker": {
"add_dialog": {
"add": "Dodaj",
"failed_create_area": "Nije uspjelo stvaranje područja.",
"name": "Naziv",
"text": "Unesite naziv novog područja.",
"title": "Dodajte novo područje"
},
"add_new": "Dodajte novo područje…",
"area": "Područje",
"clear": "Obriši",
"show_areas": "Pokažite područja"
},
"device-picker": {
"clear": "Obriši",
"device": "Uređaj",
"show_devices": "Prikaži uređaje"
"show_devices": "Prikaži uređaje",
"toggle": "Preklopi"
},
"entity": {
"entity-picker": {
@ -563,7 +580,31 @@
"enable_new_entities_label": "Aktiviraj novododane entitete.",
"title": "Mogućnosti sustava"
},
"entity_registry": {
"control": "Kontrola",
"dismiss": "Odbaci",
"editor": {
"confirm_delete": "Jeste li sigurni da želite izbrisati ovaj unos?",
"delete": "OBRIŠI",
"enabled_cause": "Deaktivirano zbog {cause}.",
"enabled_description": "Onemogućeni entiteti neće biti dodani u Home Assistant.",
"enabled_label": "Aktiviraj entitet",
"entity_id": "ID entiteta",
"name": "Premosti naziv",
"note": "Napomena: to možda neće raditi još sa svim integracijama.",
"unavailable": "Ovaj entitet trenutno nije dostupan.",
"update": "AŽURIRAJ"
},
"related": "Vezani",
"settings": "Postavke"
},
"generic": {
"cancel": "Otkaži",
"default_confirmation_title": "Jeste li sigurni?",
"ok": "U redu"
},
"more_info_control": {
"edit": "Uredi entitet",
"script": {
"last_action": "Posljednja akcija"
},
@ -602,6 +643,9 @@
"reconfigure": "Ponovno konfiguriraj uređaj",
"remove": "Ukloni uređaj"
},
"confirmations": {
"remove": "Jeste li sigurni da želite ukloniti uređaj?"
},
"last_seen": "Zadnje viđeno",
"manuf": "od {manufacturer}",
"no_area": "Nema područja",
@ -894,14 +938,19 @@
}
},
"cloud": {
"alexa": {
"title": "Alexa"
},
"caption": "Home Assistant Cloud",
"description_features": "Upravljajte kad ste izvan kuće, integrirajte se s Alexa i Google Assistantom.",
"description_login": "Prijavljeni ste kao {email}",
"description_not_login": "Niste prijavljeni",
"forgot_password": {
"check_your_email": "Provjerite e-poštu za upute o resetiranju zaporke.",
"email": "E-mail",
"email_error_msg": "Neispravan e-mail",
"instructions": "Unesite svoju e-mail adresu i poslat ćemo vam link za resetiranje lozinke.",
"send_reset_email": "Pošalji e-poštu za resetiranje",
"subtitle": "Zaboravili ste lozinku",
"title": "Zaboravljena lozinka"
},
@ -923,6 +972,20 @@
"start_trial": "Započnite besplatno probno razdoblje od 1 mjeseca",
"title": "Prijava putem clouda",
"trial_info": "Nisu potrebne informacije o plaćanju"
},
"register": {
"account_created": "Račun kreiran! Provjerite svoju e-poštu za upute o aktiviranju računa.",
"create_account": "Stvorite račun",
"email_address": "Email adresa",
"email_error_msg": "Neispravan e-mail",
"headline": "Započnite besplatno probno razdoblje",
"link_privacy_policy": "Pravila o privatnosti",
"link_terms_conditions": "Uvjeti i odredbe",
"password": "Lozinka",
"password_error_msg": "Lozinke imaju najmanje 8 znakova",
"resend_confirm_email": "Ponovno slanje potvrde e-pošte",
"start_trial": "Započnite besplatno probno razdoblje",
"title": "Registrirajte račun"
}
},
"common": {
@ -998,14 +1061,19 @@
"actions": {
"caption": "Kada se nešto pokrene..."
},
"automations": "Automatizacije",
"conditions": {
"caption": "Učini nešto samo ako..."
},
"create": "Stvorite automatizaciju s uređajem",
"no_automations": "Nema automatizacije",
"no_device_automations": "Nema dostupnih automatizacija za ovaj uređaj.",
"triggers": {
"caption": "Učini nešto kad..."
}
},
"automations": "Automatizacije",
"cant_edit": "Možete uređivati samo stavke stvorene u korisničkom sučelju (UI).",
"caption": "Uređaji",
"confirm_rename_entity_ids": "Želite li također preimenovati ID entiteta svojih entiteta?",
"data_table": {
@ -1020,8 +1088,22 @@
"details": "Ovdje su sve pojedinosti vašeg uređaja.",
"device_not_found": "Uređaj nije pronađen.",
"info": "Informacije o uređaju",
"name": "Naziv",
"scene": {
"create": "Stvorite scenu s uređajem",
"no_scenes": "Nema scena",
"scenes": "Scene"
},
"scenes": "Scene",
"script": {
"create": "Stvorite skriptu s uređajem",
"no_scripts": "Nema skripte",
"scripts": "Skripte"
},
"scripts": "Skripte",
"unknown_error": "Nepoznata pogreška",
"unnamed_device": "Neimenovani uređaj"
"unnamed_device": "Neimenovani uređaj",
"update": "Ažuriraj"
},
"entities": {
"caption": "Registar entiteta",
@ -1034,6 +1116,8 @@
"enabled_cause": "Deaktivirano zbog {cause}.",
"enabled_description": "Onemogućeni entiteti neće biti dodani u Home Assistant.",
"enabled_label": "Aktiviraj entitet",
"entity_id": "ID entiteta",
"name": "Premosti naziv",
"note": "Napomena: to možda neće raditi još sa svim integracijama.",
"unavailable": "Ovaj entitet trenutno nije dostupan.",
"update": "AŽURIRANJE"
@ -1069,6 +1153,7 @@
"area_picker_label": "Područje",
"close": "Zatvoriti",
"created_config": "Stvorena konfiguracija za {name}.",
"dismiss": "Odbacite dijaloški okvir",
"error_saving_area": "Pogreška pri spremanju područja: {error}",
"external_step": {
"description": "Ovaj korak zahtijeva da posjetite vanjsku web stranicu.",
@ -1222,19 +1307,68 @@
"header": "Zigbee Home Automation-Dodaj uređaje",
"spinner": "Traženje ZHA ZigBee uređaja..."
},
"add": {
"caption": "Dodaj uređaje"
},
"caption": "ZHA",
"clusters": {
"header": "klasteri"
},
"description": "Upravljanje Zigbee Home Automation mrežom",
"device_card": {
"area_picker_label": "Područje",
"device_name_placeholder": "Korisničko ime",
"update_name_button": "Ažuriraj naziv"
},
"devices": {
"header": "Zigbee kućna automatizacija - uređaj"
},
"group_binding": {
"bind_button_help": "Povežite odabranu skupinu s odabranim skupinama uređaja.",
"bind_button_label": "Poveži grupu",
"cluster_selection_help": "Odaberite klastere za povezivanje s odabranom skupinom.",
"group_picker_help": "Odaberite grupu za izdavanje naredbe za vezanje.",
"group_picker_label": "Grupe koje se mogu vezati",
"header": "Povezivanje grupe",
"unbind_button_help": "Prekini vezu s odabranom skupinom od odabranih skupina uređaja.",
"unbind_button_label": "Poništi vezu"
},
"groups": {
"caption": "Grupe",
"description": "Stvarajte i modificirajte Zigbee grupe",
"group-header": "Kućna automatizacija Zigbee - Pojedinosti o grupi",
"groups-header": "Zigbee Home Automation - Upravljanje grupama"
},
"services": {
"reconfigure": "Ponovno konfiguriaj ZHA uređaj (liječenje uređaja). Upotrijebite ovo ako imate problema s uređajem. Ako je uređaj u pitanju uređaj za bateriju, provjerite je li budan i prihvaća naredbe kada koristite ovu uslugu.",
"remove": "Uklonite uređaj iz ZigBee mreže.",
"updateDeviceName": "Postavite prilagođeni naziv za ovaj uređaj u registru uređaja."
}
},
"zone": {
"add_zone": "Dodajte zonu",
"caption": "Zone",
"configured_in_yaml": "Zone konfigurirane putem configuration.yaml ne mogu se uređivati putem korisničkog sučelja.",
"confirm_delete": "Jeste li sigurni da želite izbrisati ovu zonu?",
"create_zone": "Stvori zonu",
"description": "Upravljajte zonama u kojima želite pratiti osobe.",
"detail": {
"create": "Kreiraj",
"delete": "Izbriši",
"icon": "Ikona",
"icon_error_msg": "Ikona treba biti u obliku prefiksa: ime ikone, na primjer: mdi: home",
"latitude": "Zemljopisna širina",
"longitude": "Zemljopisna dužina",
"name": "Naziv",
"new_zone": "Nova zona",
"passive": "Pasivno",
"radius": "Radijus",
"required_error_msg": "Ovo polje je obavezno",
"update": "Ažuriraj"
},
"edit_home_zone": "Položaj vašeg doma može se promijeniti u globalnoj konfiguraciji.",
"no_zones_created_yet": "Izgleda da još niste stvorili nijednu zonu."
},
"zwave": {
"caption": "Z-Wave",
"common": {
@ -1297,10 +1431,13 @@
"title": "Događaji"
},
"info": {
"frontend_version": "Verzija sučelja: {version} - {type}",
"home_assistant_logo": "Logotip Home Assistanta",
"license": "Objavljeno pod licencom Apache 2.0",
"lovelace_ui": "Idi na Lovelace UI",
"path_configuration": "Put do configuration.yaml: {path}",
"source": "Izvorni kod:",
"states_ui": "Idi na states UI",
"title": "Informacije"
},
"logs": {
@ -1345,6 +1482,9 @@
"no_devices": "Ova stranica omogućuje upravljanje uređajima, ali izgleda da još niste postavili nikakve uređaje. Idite na stranicu integracije da biste započeli.",
"title": "Dobrodošli kući"
},
"entities": {
"never_triggered": "Nikada pokrenuto"
},
"picture-elements": {
"call_service": "Pozovi servis {name}",
"hold": "Držite:",
@ -1423,6 +1563,9 @@
"sensor": {
"graph_detail": "Detalj grafikona",
"graph_type": "Vrsta grafikona"
},
"shopping-list": {
"integration_not_loaded": "Ova kartica zahtijeva postavljanje integracije `shopping_list`."
}
},
"edit_card": {
@ -1676,6 +1819,9 @@
}
},
"profile": {
"advanced_mode": {
"link_promo": "Saznajte više"
},
"change_password": {
"confirm_new_password": "Potvrdite novu lozinku",
"current_password": "Trenutna lozinka",
@ -1696,6 +1842,8 @@
"link_promo": "Pomognite prevođenju"
},
"logout": "Odjava",
"logout_text": "Jeste li sigurni da se želite odjaviti?",
"logout_title": "Odjavite se?",
"long_lived_access_tokens": {
"confirm_delete": "Jeste li sigurni da želite izbrisati pristupni token za {name} ?",
"create": "Izradite token",

View File

@ -118,7 +118,7 @@
"default": {
"entity_not_found": "Entitás nem található",
"error": "Hiba",
"unavailable": "N.elér",
"unavailable": "N/A",
"unknown": "Ism"
},
"device_tracker": {
@ -546,10 +546,10 @@
"components": {
"area-picker": {
"add_dialog": {
"add": "hozzáadás",
"add": "Hozzáadás",
"failed_create_area": "Nem sikerült létrehozni a területet.",
"name": "Név",
"text": "Adja meg az új terület nevét.",
"text": "Add meg az új terület nevét.",
"title": "Új terület hozzáadása"
},
"add_new": "Új terület hozzáadása...",
@ -638,7 +638,7 @@
"ok": "OK"
},
"more_info_control": {
"dismiss": "Elvetés párbeszédpanel",
"dismiss": "Párbeszédpanel elvetése",
"edit": "Entitás szerkesztése",
"restored": {
"confirm_remove_text": "Biztosan el szeretnéd távolítani ezt az entitást?",
@ -690,7 +690,7 @@
"remove": "Eszköz eltávolítása"
},
"confirmations": {
"remove": "Biztos benne, hogy el akarja távolítani az eszközt?"
"remove": "Biztosan el akarod távolítani az eszközt?"
},
"last_seen": "Utolsó jelentés",
"manuf": "{manufacturer} által",
@ -817,7 +817,7 @@
"delete_confirm": "Biztos, hogy törölni szeretnéd?",
"duplicate": "Megkettőzés",
"header": "Feltételek",
"introduction": "A feltételek opcionális részei az automatizálási szabályoknak és arra lehet őket használni, hogy meggátoljuk egy művelet végrehajtását, ha triggerelődik. A feltételek hasonlítanak a triggerekre, mégis teljesen máshogy működnek. A triggerek a rendszerben történő események bekövetkezését figyelik, míg a feltételek csak azt látják, hogy milyen a rendszer pillanatnyi állapota. Egy trigger például észre tudja venni, ha egy kapcsoló fel lett kapcsolva. Egy feltétel csak azt látja, hogy a kapcsoló éppen fel vagy le van kapcsolva. Kattints az alábbi linkre, ha többet szeretnél megtudni a feltételekről.",
"introduction": "A feltételek opcionálisak és meggátolják a további végrehajtást, kivéve, ha minden feltétel teljesül.",
"learn_more": "Tudj meg többet a feltételekről",
"name": "Feltétel",
"type_select": "Feltétel típusa",
@ -1027,7 +1027,7 @@
},
"integrations": "Integrációk",
"integrations_introduction": "A Home Assistant Felhő integrációi úgy biztosítanak lehetőséget felhő szolgáltatásokhoz való csatlakozáshoz, hogy közben nem kell kinyitnod a Home Assistant rendszered publikusan az interneten.",
"integrations_introduction2": "Nézd meg a weboldalt a",
"integrations_introduction2": "Nézd meg a weboldalt a ",
"integrations_link_all_features": "az összes elérhető funkció",
"manage_account": "Fiók kezelése",
"nabu_casa_account": "Nabu Casa fiók",
@ -1049,7 +1049,7 @@
"link_learn_more": "Tudj meg többet a webhook-alapú automatizálások létrehozásáról.",
"loading": "Betöltés...",
"manage": "Kezelés",
"no_hooks_yet": "Úgy tűnik, még nincs egy webhookod sem. Kezdéshez konfigurálj egy",
"no_hooks_yet": "Úgy tűnik, még nincs egy webhookod sem. Kezdéshez konfigurálj egy ",
"no_hooks_yet_link_automation": "webhook automatizálást",
"no_hooks_yet_link_integration": "webhook-alapú integrációt",
"no_hooks_yet2": "vagy hozz létre egy",
@ -1111,8 +1111,8 @@
"email_error_msg": "Érvénytelen email",
"forgot_password": "elfelejtett jelszó?",
"introduction": "A Home Assistant Felhő biztonságos távoli kapcsolatot nyújt a példányodhoz, miközben távol vagy. Azt is lehetővé teszi, hogy csak felhőn alapuló szolgáltatásokhoz csatlakozz: Amazon Alexa, Google Asszisztens.",
"introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a",
"introduction2a": " vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.",
"introduction2": "Ezt a szolgáltatást partnerünk üzemelteti, a ",
"introduction2a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.",
"introduction3": "A Home Assistant Felhő egy előfizetéses szolgáltatás egy hónapos ingyenes próbaverzióval. Nincs szükség fizetési információk megadására.",
"learn_more_link": "Tudj meg többet a Home Assistant Felhőről",
"password": "Jelszó",
@ -1134,8 +1134,8 @@
"headline": "Indítsd el az ingyenes próbaidőszakot",
"information": "Hozz létre egy fiókot ahhoz, hogy elindíthasd az egy hónapos ingyenes Home Assistant Felhő próbaidőszakodat. Nincs szükség fizetési információk megadására.",
"information2": "A próbaidőszak hozzáférést biztosít a Home Assistant Felhő minden előnyéhez, beleértve a következőket:",
"information3": "Ezt a szolgáltatást partnerünk üzemelteti, a",
"information3a": ", vállalat üzemelteti, amelyet a Home Assistant és a Hass.io alapítói alapítottak.",
"information3": "Ezt a szolgáltatást partnerünk üzemelteti, a ",
"information3a": "vállalat, amelyet a Home Assistant és a Hass.io alapítói alapítottak.",
"information4": "Fiók regisztrálásával elfogadod az alábbi feltételeket.",
"link_privacy_policy": "Adatvédelmi irányelvek",
"link_terms_conditions": "Felhasználási feltételek",
@ -1192,8 +1192,8 @@
},
"validation": {
"check_config": "Ellenőrzés",
"heading": "Konfiguráció érvényesítés",
"introduction": "Érvényesítsd a konfigurációt, ha nemrégiben módosítottad azt, és meg szeretnél bizonyosodni róla, hogy minden érvényes",
"heading": "Konfiguráció ellenőrzése",
"introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes",
"invalid": "Érvénytelen konfiguráció",
"valid": "Érvényes konfiguráció!"
}
@ -1212,7 +1212,7 @@
"pick_attribute": "Válassz egy attribútumot a felülbíráláshoz",
"picker": {
"header": "Testreszabások",
"introduction": "Szabd testre az entitások attribútumait. A hozzáadott/szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül."
"introduction": "Szabd testre az entitások attribútumait. A hozzáadott, szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül."
},
"warning": {
"include_link": "customize.yaml fájlra",
@ -1226,14 +1226,19 @@
"actions": {
"caption": "Ha valami triggerelődik, akkor..."
},
"automations": "Automatizálások",
"conditions": {
"caption": "Csak akkor csinálj valamit, ha a(z)..."
},
"create": "Eszköz automatizálás létrehozása",
"no_automations": "Nincsenek automatizálások",
"no_device_automations": "Ehhez az eszközhöz nem állnak rendelkezésre automatizálások.",
"triggers": {
"caption": "Kezdj el csinálni valamit, amikor a(z)..."
}
},
"automations": "Automatizálások",
"cant_edit": "Kizárólag a felhasználói felületen létrehozott elemeket szerkesztheted.",
"caption": "Eszközök",
"confirm_rename_entity_ids": "Szeretnéd átnevezni az entitások ID-ját is?",
"data_table": {
@ -1248,12 +1253,24 @@
"details": "Itt található minden részlet az eszközről.",
"device_not_found": "Eszköz nem található.",
"entities": {
"add_entities_lovelace": "Az összes eszköz entitás hozzáadása a Lovelace felhasználói felülethez",
"add_entities_lovelace": "Mindet a Lovelace felületre",
"entities": "Entitások",
"none": "Ennek az eszköznek nincsenek entitásai"
},
"info": "Eszköz infó",
"name": "Név",
"scene": {
"create": "Jelenet létrehozása eszközzel",
"no_scenes": "Nincsenek jelenetek",
"scenes": "Jelenetek"
},
"scenes": "Jelenetek",
"script": {
"create": "Szkript létrehozása eszköz alapján",
"no_scripts": "Nincsenek szkriptek",
"scripts": "Szkriptek"
},
"scripts": "Szkriptek",
"unknown_error": "Ismeretlen hiba",
"unnamed_device": "Névtelen eszköz",
"update": "Frissítés"
@ -1301,7 +1318,7 @@
},
"integrations_page": "Integrációk oldal",
"introduction": "A Home Assistant nyilvántartást vezet minden olyan entitásról, melyet valaha látott, és egyedileg azonosítható. Ezen entitások mindegyikéhez létrejön egy entitás ID, amely csak az adott entitáshoz van rendelve.",
"introduction2": "Az entitás nyilvántartás használatával felülbírálhatod a nevet, módosíthatod az entitás ID-t vagy eltávolíthatod a bejegyzést a Home Assistant-ból. Megjegyzendő, hogy az entitás nyilvántartásból történő bejegyzés eltávolítás nem fogja eltávolítani magát az entitást. Ehhez kövesd az alábbi linket, és távolítsd el azt az integrációk oldalról.",
"introduction2": "Az entitás nyilvántartás használatával felülbírálhatod a nevet, módosíthatod az entitás ID-t vagy eltávolíthatod a bejegyzést a Home Assistant-ból.",
"remove_selected": {
"button": "Kiválasztottak eltávolítása",
"confirm_text": "Az entitások csak akkor távolíthatók el, ha az integráció már nem használja őket.",
@ -1343,7 +1360,7 @@
"area_picker_label": "Terület",
"close": "Bezárás",
"created_config": "Konfiguráció létrehozva a következőhöz: {name}.",
"dismiss": "Elvetés párbeszédpanel",
"dismiss": "Párbeszédpanel elvetése",
"error_saving_area": "Hiba a terület mentésekor: {error}",
"external_step": {
"description": "Ehhez a lépéshez egy külső weboldal meglátogatása szükséges.",
@ -1356,7 +1373,7 @@
"submit": "Küldés"
},
"configure": "Beállítás",
"configured": "Konfigurált",
"configured": "Konfigurálva",
"description": "Integrációk kezelése és beállítása",
"details": "Integráció részletei",
"discovered": "Felfedezett",
@ -1376,7 +1393,7 @@
"new": "Új integráció beállítása",
"none": "Még semmi sincs beállítva",
"note_about_integrations": "Még nem minden integráció konfigurálható a felhasználói felületen keresztül.",
"note_about_website_reference": "Továbbiak érhetőek el itt:"
"note_about_website_reference": "Továbbiak érhetőek el itt: "
},
"introduction": "Itt a komponenseket és a Home Assistant szervert lehet beállítani. Még nem lehet mindent a felületről, de dolgozunk rajta.",
"person": {
@ -1487,8 +1504,8 @@
"zone": "Zónák újratöltése"
},
"server_management": {
"confirm_restart": "Biztosan újra akarod indítani a Home Assistantet?",
"confirm_stop": "Biztosan le akarod állítani a Home Assistantet?",
"confirm_restart": "Biztosan újra szeretnéd indítani a Home Assistant-ot?",
"confirm_stop": "Biztosan le szeretnéd állítani a Home Assistant-ot?",
"heading": "Szerver menedzsment",
"introduction": "Home Assistant szerver vezérlése... a Home Assistant-ból.",
"restart": "Újraindítás",
@ -1496,8 +1513,8 @@
},
"validation": {
"check_config": "Konfiguráció ellenőrzése",
"heading": "Konfiguráció érvényesítés",
"introduction": "Érvényesítsd a konfigurációt, ha nemrégiben módosítottad azt, és meg szeretnél bizonyosodni róla, hogy minden érvényes",
"heading": "Konfiguráció ellenőrzése",
"introduction": "Konfiguráció helyességének ellenőrzése. Visszajelzést kérhetsz az elírásokról, ha nemrég módosított konfigurációd kapcsán meg szeretnél bizonyosodni róla, hogy minden érvényes",
"invalid": "Érvénytelen konfiguráció",
"valid": "Érvényes konfiguráció!"
}
@ -1591,7 +1608,7 @@
"bind_button_help": "Csatlakoztassa a kiválasztott csoportot a kiválasztott eszközfürtökhöz.",
"bind_button_label": "Csoporthoz fűzés",
"cluster_selection_help": "Jelölje ki a kijelölt csoporthoz kötni kívánt fürtöket.",
"group_picker_help": "Jelöljön ki egy csoportot a kötési parancs kiadásához.",
"group_picker_help": "Jelölj ki egy csoportot a kötési parancs kiadásához.",
"group_picker_label": "Köthető csoportok",
"header": "Csoportkötés",
"introduction": "Csoportok kötése és lebontása",
@ -1649,7 +1666,7 @@
"add_zone": "Zóna hozzáadása",
"caption": "Zónák",
"configured_in_yaml": "A configuration.yaml fájlban konfigurált zónák nem szerkeszthetők a felhasználói felületen.",
"confirm_delete": "Biztosan törli ezt a zónát?",
"confirm_delete": "Biztosan törölni szeretnéd ezt a zónát?",
"create_zone": "Zóna létrehozása",
"description": "Kezelje azokat a zónákat, ahol nyomon szeretné követni a személyeket.",
"detail": {
@ -1668,7 +1685,7 @@
"update": "Frissítés"
},
"edit_home_zone": "Az otthona címét az általános konfigurációnál változtathatja meg.",
"introduction": "A zónák lehetővé teszik a Föld bizonyos területeinek megadását. Ha egy személy egy zónán belül van, az állapota felveszi a zóna nevét veszi fel. A zónák eseményindítóként vagy feltételként is használhatók az automatizálási beállításokon belül.",
"introduction": "A zónák lehetővé teszik a Föld bizonyos területeinek megadását. Ha egy személy egy zónán belül van, az állapota felveszi a zóna nevét. A zónák eseményindítóként vagy feltételként is használhatók az automatizálási beállításokon belül.",
"no_zones_created_yet": "Úgy tűnik, még nem hoztál létre zónákat."
},
"zwave": {
@ -1852,7 +1869,7 @@
},
"lovelace": {
"add_entities": {
"generated_unsupported": "Ezt a funkciót csak akkor használhatja, ha átvette a Lovelace felhasználói felületének irányítását.",
"generated_unsupported": "Ezt a funkciót csak akkor használhatod, ha átvetted a Lovelace felhasználói felület irányítását.",
"saving_failed": "A Lovelace felhasználói felület beállításának mentése sikertelen.",
"yaml_unsupported": "Ezt a funkciót nem használhatja, ha YAML módban működteti a Lovelace felhasználói felületet."
},
@ -1882,7 +1899,7 @@
}
},
"changed_toast": {
"message": "A Lovelace config módosult, szeretnéd frissíteni?",
"message": "A Lovelace konfiguráció módosítva lett, szeretnéd frissíteni az aktualizáláshoz?",
"refresh": "Frissítés"
},
"editor": {
@ -2025,7 +2042,7 @@
},
"edit_lovelace": {
"edit_title": "Cím szerkesztése",
"explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace-ben.",
"explanation": "Ez a cím jelenik meg minden nézet felett a Lovelace felhasználói felületen.",
"header": "Lovelace UI címe"
},
"edit_view": {
@ -2049,8 +2066,8 @@
"para_no_id": "Ez az elem nem rendelkezik ID-val. Kérlek, adj hozzá egyet az 'ui-lovelace.yaml' fájlban!"
},
"raw_editor": {
"confirm_remove_config_text": "Automatikusan létrehozzuk a lovelace felhasználói felületi nézeteit területekkel és eszközökkel, ha eltávolítja a Lovelace felhasználói felületkonfigurációját.",
"confirm_remove_config_title": "Biztosan eltávolítja a Lovelace felhasználói felületkonfigurációját? A Lovelace felhasználói felületi nézeteit automatikusan létrehozzuk a területeivel és eszközeivel.",
"confirm_remove_config_text": "Automatikusan létrehozzuk a Lovelace felhasználói felületed nézeteit a területeiddel és eszközeiddel, ha eltávolítod a Lovelace konfigurációját.",
"confirm_remove_config_title": "Biztosan el szeretnéd távolítani a Lovelace felhasználói felület konfigurációját? Automatikusan létrehozzuk a Lovelace felhasználói felületed nézeteit a területeiddel és az eszközeiddel.",
"confirm_unsaved_changes": "Vannak nem mentett módosítások, biztosan ki akarsz lépni?",
"confirm_unsaved_comments": "A konfiguráció megjegyzéseket tartalmaz, amik nem kerülnek elmentésre. Biztosan folytatod?",
"error_invalid_config": "A konfiguráció érvénytelen: {error}",
@ -2072,7 +2089,7 @@
"suggest_card": {
"add": "Hozzáadás a Lovelace-hez",
"create_own": "Készítsd el a sajátod",
"header": "Létrehoztunk önnek egy javaslatot"
"header": "Létrehoztunk neked egy javaslatot"
},
"view": {
"panel_mode": {
@ -2089,7 +2106,7 @@
"refresh": "Frissítés",
"unused_entities": "Nem használt entitások"
},
"reload_lovelace": "Lovelace Újratöltése",
"reload_lovelace": "Felhasználói felület újratöltése",
"unused_entities": {
"available_entities": "Ezek azok az entitások, amelyek elérhetők, de még nincsenek elhelyezve a Lovelace felületen.",
"domain": "Domain",
@ -2287,7 +2304,7 @@
},
"profile": {
"advanced_mode": {
"description": "A Home Assistant alapértelmezés szerint elrejti a haladó funkciókat és beállításokat, de ezzel a kapcsolóval elérhetővé teheted őket. Ez egy felhasználó-specifikus beállítás, ami nem befolyásolja a többi felhasználó felületét.",
"description": "Haladó funkciók feloldása.",
"link_promo": "Tudj meg többet",
"title": "Haladó üzemmód"
},

View File

@ -109,17 +109,17 @@
"armed_custom_bypass": "Attivo",
"armed_home": "Attivo",
"armed_night": "Attivo",
"arming": "Attiva",
"disarmed": "Disattiva",
"disarming": "Disattiva",
"pending": "In attesa",
"arming": "Attivando",
"disarmed": "Disattivo",
"disarming": "Disattivando",
"pending": "Attende",
"triggered": "Attiv."
},
"default": {
"entity_not_found": "Entità non trovata!",
"error": "Errore",
"unavailable": "Non Disponibile",
"unknown": "Sconosciuto"
"unavailable": "Non Disp.",
"unknown": "Ignoto"
},
"device_tracker": {
"home": "In Casa",
@ -1226,14 +1226,19 @@
"actions": {
"caption": "Quando qualcosa si attiva..."
},
"automations": "Automazioni",
"conditions": {
"caption": "Fai qualcosa solo se..."
},
"create": "Crea l'Automazione con il dispositivo",
"no_automations": "Nessuna Automazione",
"no_device_automations": "Non ci sono Automazioni disponibili per questo dispositivo.",
"triggers": {
"caption": "Fai qualcosa quando..."
}
},
"automations": "Automazioni",
"cant_edit": "È possibile modificare solo gli elementi creati nell'Interfaccia Utente.",
"caption": "Dispositivi",
"confirm_rename_entity_ids": "Vuoi anche rinominare gli ID entità delle tue entità?",
"data_table": {
@ -1248,12 +1253,24 @@
"details": "Ecco tutti i dettagli del tuo dispositivo.",
"device_not_found": "Dispositivo non trovato.",
"entities": {
"add_entities_lovelace": "Aggiungere tutte le entità dispositivo all'Interfaccia Utente di Lovelace",
"add_entities_lovelace": "Aggiungi a Lovelace",
"entities": "Entità",
"none": "Questo dispositivo non ha entità"
},
"info": "Informazioni sul dispositivo",
"name": "Nome",
"scene": {
"create": "Crea una Scena con il dispositivo",
"no_scenes": "Nessuna Scena",
"scenes": "Scene"
},
"scenes": "Scene",
"script": {
"create": "Crea uno Script con il dispositivo",
"no_scripts": "Nessuno Script",
"scripts": "Script"
},
"scripts": "Script",
"unknown_error": "Errore sconosciuto",
"unnamed_device": "Dispositivo senza nome",
"update": "Aggiorna"
@ -1668,7 +1685,7 @@
"update": "Aggiorna"
},
"edit_home_zone": "La posizione della tua casa può essere cambiata nella configurazione generale.",
"introduction": "Le zone ti consentono di specificare determinate regioni sulla terra. Quando una persona si trova all'interno di una zona, lo stato prenderà il nome dalla zona. Le zone possono anche essere utilizzate come trigger o condizioni all'interno delle impostazioni di automazione.",
"introduction": "Le Zone consentono di specificare determinate regioni sulla Terra. Quando una persona si trova all'interno di una Zona, nel suo Stato ci sarà il nome dalla Zona. Le Zone possono anche essere utilizzate come Attivazioni (o Triggers) o Condizioni all'interno delle impostazioni di Automazione.",
"no_zones_created_yet": "Sembra che tu non abbia ancora creato nessuna zona."
},
"zwave": {

Some files were not shown because too many files have changed in this diff Show More