mirror of
https://github.com/home-assistant/frontend.git
synced 2026-09-07 11:58:45 +00:00
Compare commits
85
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e87accdfb4 | ||
|
|
4dcfe3031d | ||
|
|
1538fbb102 | ||
|
|
b9259b87eb | ||
|
|
30997dbc88 | ||
|
|
607eb6d130 | ||
|
|
f2e9b3577d | ||
|
|
cb2c6d8560 | ||
|
|
bfe8346ced | ||
|
|
88da9bb91b | ||
|
|
5e2ee1a16c | ||
|
|
2fdc746392 | ||
|
|
1667973a66 | ||
|
|
42f0101440 | ||
|
|
13b69bff1b | ||
|
|
2c2226dfd6 | ||
|
|
a3fdfe0e15 | ||
|
|
a0de209a55 | ||
|
|
0208b50ac7 | ||
|
|
4a61779aba | ||
|
|
05057ade05 | ||
|
|
6fb206853c | ||
|
|
fab68055bf | ||
|
|
d5a77ef3cd | ||
|
|
dcb2605de4 | ||
|
|
e6d38f4539 | ||
|
|
293b56cfa6 | ||
|
|
775e93d54b | ||
|
|
7f840e75df | ||
|
|
2113ea675e | ||
|
|
916a5c1a6b | ||
|
|
f684531315 | ||
|
|
fe8dda8996 | ||
|
|
4cd4b328c8 | ||
|
|
d844c89b94 | ||
|
|
177ea2b85a | ||
|
|
50c5c15f49 | ||
|
|
1810760dc7 | ||
|
|
4635b92e3f | ||
|
|
1c652626eb | ||
|
|
2000cfb1db | ||
|
|
f4d07828e7 | ||
|
|
95b552671c | ||
|
|
ef3bc3efe1 | ||
|
|
371ad899f5 | ||
|
|
2c54158d84 | ||
|
|
5d9e30bbdc | ||
|
|
e477fd567d | ||
|
|
6a6c2937fe | ||
|
|
09e17c4da8 | ||
|
|
fd00469d11 | ||
|
|
cbbeb795f3 | ||
|
|
bba40e0da8 | ||
|
|
d23165d06a | ||
|
|
405fef6f03 | ||
|
|
588f217826 | ||
|
|
3d8b7cf80e | ||
|
|
c0ef923ad3 | ||
|
|
3df44fc71e | ||
|
|
c1965492d9 | ||
|
|
1f56ffde80 | ||
|
|
f335fdc002 | ||
|
|
0c914b5ec8 | ||
|
|
d767b06858 | ||
|
|
d4e49f3944 | ||
|
|
7dfc5b3faf | ||
|
|
8a88033ab9 | ||
|
|
7b06b38c94 | ||
|
|
5409752817 | ||
|
|
909f3a3005 | ||
|
|
4930532c7b | ||
|
|
8a42e65c6a | ||
|
|
5d4121a9b4 | ||
|
|
a70e6c49a1 | ||
|
|
3d83d5f4b5 | ||
|
|
f9dece0743 | ||
|
|
ac0871d0e8 | ||
|
|
ffc19e591d | ||
|
|
c53380ca3d | ||
|
|
7c74a2026a | ||
|
|
adaed438d9 | ||
|
|
baf38305cb | ||
|
|
8254712521 | ||
|
|
53214781e3 | ||
|
|
88cbbbdf65 |
@@ -74,12 +74,12 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
|
||||
```
|
||||
|
||||
## Problem-relevant configuration
|
||||
## Problem-relevant frontend configuration
|
||||
|
||||
<!--
|
||||
An example configuration that caused the problem for you. Fill this out even
|
||||
if it seems unimportant to you. Please be sure to remove personal information
|
||||
like passwords, private URLs and other credentials.
|
||||
An example configuration that caused the problem for you, e.g. the YAML configuration
|
||||
of the used cards. Fill this out even if it seems unimportant to you. Please be sure
|
||||
to remove personal information like passwords, private URLs and other credentials.
|
||||
-->
|
||||
|
||||
```yaml
|
||||
@@ -89,7 +89,7 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
## Javascript errors shown in your browser console/inspector
|
||||
|
||||
<!--
|
||||
If you come across any javascript or other error logs, e.g., in your browser
|
||||
If you come across any Javascript or other error logs, e.g. in your browser
|
||||
console/inspector please provide them.
|
||||
-->
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ This is the repository for the official [Home Assistant](https://home-assistant.
|
||||
- Development: [Instructions](https://developers.home-assistant.io/docs/frontend/development/)
|
||||
- Production build: `script/build_frontend`
|
||||
- Gallery: `cd gallery && script/develop_gallery`
|
||||
- Hass.io: [Instructions](https://developers.home-assistant.io/docs/en/hassio_hass.html)
|
||||
- Supervisor: [Instructions](https://developers.home-assistant.io/docs/supervisor/developing)
|
||||
|
||||
## Frontend development
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ const createWebpackConfig = ({
|
||||
const ignorePackages = bundle.ignorePackages({ latestBuild });
|
||||
return {
|
||||
mode: isProdBuild ? "production" : "development",
|
||||
target: ["web", latestBuild ? "es2017" : "es5"],
|
||||
devtool: isProdBuild
|
||||
? "cheap-module-source-map"
|
||||
: "eval-cheap-module-source-map",
|
||||
@@ -131,22 +132,6 @@ const createWebpackConfig = ({
|
||||
}
|
||||
return `${chunk.name}.${chunk.hash.substr(0, 8)}.js`;
|
||||
},
|
||||
environment: {
|
||||
// The environment supports arrow functions ('() => { ... }').
|
||||
arrowFunction: latestBuild,
|
||||
// The environment supports BigInt as literal (123n).
|
||||
bigIntLiteral: false,
|
||||
// The environment supports const and let for variable declarations.
|
||||
const: latestBuild,
|
||||
// The environment supports destructuring ('{ a, b } = obj').
|
||||
destructuring: latestBuild,
|
||||
// The environment supports an async import() function to import EcmaScript modules.
|
||||
dynamicImport: latestBuild,
|
||||
// The environment supports 'for of' iteration ('for (const x of array) { ... }').
|
||||
forOf: latestBuild,
|
||||
// The environment supports ECMAScript Module syntax to import ECMAScript modules (import ... from '...').
|
||||
module: latestBuild,
|
||||
},
|
||||
chunkFilename:
|
||||
isProdBuild && !isStatsBuild
|
||||
? "chunk.[chunkhash].js"
|
||||
|
||||
@@ -9,30 +9,29 @@ class DemoMoreInfo extends PolymerElement {
|
||||
static get template() {
|
||||
return html`
|
||||
<style>
|
||||
:host {
|
||||
.root {
|
||||
display: flex;
|
||||
align-items: start;
|
||||
}
|
||||
|
||||
#card {
|
||||
max-width: 400px;
|
||||
width: 100vw;
|
||||
}
|
||||
ha-card {
|
||||
width: 333px;
|
||||
width: 352px;
|
||||
padding: 20px 24px;
|
||||
}
|
||||
|
||||
state-card-content {
|
||||
display: block;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
pre {
|
||||
width: 400px;
|
||||
margin: 0 16px;
|
||||
overflow: auto;
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
:host {
|
||||
.root {
|
||||
flex-direction: column;
|
||||
}
|
||||
pre {
|
||||
@@ -40,21 +39,25 @@ class DemoMoreInfo extends PolymerElement {
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<ha-card>
|
||||
<state-card-content
|
||||
state-obj="[[_stateObj]]"
|
||||
hass="[[hass]]"
|
||||
in-dialog
|
||||
></state-card-content>
|
||||
<div class="root">
|
||||
<div id="card">
|
||||
<ha-card>
|
||||
<state-card-content
|
||||
state-obj="[[_stateObj]]"
|
||||
hass="[[hass]]"
|
||||
in-dialog
|
||||
></state-card-content>
|
||||
|
||||
<more-info-content
|
||||
hass="[[hass]]"
|
||||
state-obj="[[_stateObj]]"
|
||||
></more-info-content>
|
||||
</ha-card>
|
||||
<template is="dom-if" if="[[showConfig]]">
|
||||
<pre>[[_jsonEntity(_stateObj)]]</pre>
|
||||
</template>
|
||||
<more-info-content
|
||||
hass="[[hass]]"
|
||||
state-obj="[[_stateObj]]"
|
||||
></more-info-content>
|
||||
</ha-card>
|
||||
</div>
|
||||
<template is="dom-if" if="[[showConfig]]">
|
||||
<pre>[[_jsonEntity(_stateObj)]]</pre>
|
||||
</template>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,18 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import "../../../src/components/ha-switch";
|
||||
import "../../../src/components/ha-formfield";
|
||||
import "./demo-more-info";
|
||||
import { applyThemesOnElement } from "../../../src/common/dom/apply_themes_on_element";
|
||||
|
||||
class DemoMoreInfos extends PolymerElement {
|
||||
static get template() {
|
||||
return html`
|
||||
<style>
|
||||
#container {
|
||||
min-height: calc(100vh - 128px);
|
||||
background: var(--primary-background-color);
|
||||
}
|
||||
.cards {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@@ -23,20 +29,31 @@ class DemoMoreInfos extends PolymerElement {
|
||||
.filters {
|
||||
margin-left: 60px;
|
||||
}
|
||||
ha-formfield {
|
||||
margin-right: 16px;
|
||||
}
|
||||
</style>
|
||||
<app-toolbar>
|
||||
<div class="filters">
|
||||
<ha-switch checked="{{_showConfig}}">Show entity</ha-switch>
|
||||
<ha-formfield label="Show entities">
|
||||
<ha-switch checked="[[_showConfig]]" on-change="_showConfigToggled">
|
||||
</ha-switch>
|
||||
</ha-formfield>
|
||||
<ha-formfield label="Dark theme">
|
||||
<ha-switch on-change="_darkThemeToggled"> </ha-switch>
|
||||
</ha-formfield>
|
||||
</div>
|
||||
</app-toolbar>
|
||||
<div class="cards">
|
||||
<template is="dom-repeat" items="[[entities]]">
|
||||
<demo-more-info
|
||||
entity-id="[[item]]"
|
||||
show-config="[[_showConfig]]"
|
||||
hass="[[hass]]"
|
||||
></demo-more-info>
|
||||
</template>
|
||||
<div id="container">
|
||||
<div class="cards">
|
||||
<template is="dom-repeat" items="[[entities]]">
|
||||
<demo-more-info
|
||||
entity-id="[[item]]"
|
||||
show-config="[[_showConfig]]"
|
||||
hass="[[hass]]"
|
||||
></demo-more-info>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
@@ -51,6 +68,16 @@ class DemoMoreInfos extends PolymerElement {
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
_showConfigToggled(ev) {
|
||||
this._showConfig = ev.target.checked;
|
||||
}
|
||||
|
||||
_darkThemeToggled(ev) {
|
||||
applyThemesOnElement(this.$.container, { themes: {} }, "default", {
|
||||
dark: ev.target.checked,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-more-infos", DemoMoreInfos);
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
|
||||
export const createPlantEntities = () => [
|
||||
getEntity("plant", "lemon_tree", "ok", {
|
||||
problem: "none",
|
||||
sensors: {
|
||||
moisture: "sensor.lemon_tree_moisture",
|
||||
battery: "sensor.lemon_tree_battery",
|
||||
temperature: "sensor.lemon_tree_temperature",
|
||||
conductivity: "sensor.lemon_tree_conductivity",
|
||||
brightness: "sensor.lemon_tree_brightness",
|
||||
},
|
||||
unit_of_measurement_dict: {
|
||||
temperature: "°C",
|
||||
moisture: "%",
|
||||
brightness: "lx",
|
||||
battery: "%",
|
||||
conductivity: "μS/cm",
|
||||
},
|
||||
moisture: 54,
|
||||
battery: 95,
|
||||
temperature: 15.6,
|
||||
conductivity: 1,
|
||||
brightness: 12,
|
||||
max_brightness: 20,
|
||||
friendly_name: "Lemon Tree",
|
||||
}),
|
||||
getEntity("plant", "apple_tree", "ok", {
|
||||
problem: "brightness",
|
||||
sensors: {
|
||||
moisture: "sensor.apple_tree_moisture",
|
||||
battery: "sensor.apple_tree_battery",
|
||||
temperature: "sensor.apple_tree_temperature",
|
||||
conductivity: "sensor.apple_tree_conductivity",
|
||||
brightness: "sensor.apple_tree_brightness",
|
||||
},
|
||||
unit_of_measurement_dict: {
|
||||
temperature: "°C",
|
||||
moisture: "%",
|
||||
brightness: "lx",
|
||||
battery: "%",
|
||||
conductivity: "μS/cm",
|
||||
},
|
||||
moisture: 54,
|
||||
battery: 2,
|
||||
temperature: 15.6,
|
||||
conductivity: 1,
|
||||
brightness: 25,
|
||||
max_brightness: 20,
|
||||
friendly_name: "Apple Tree",
|
||||
}),
|
||||
getEntity("plant", "sunflowers", "ok", {
|
||||
problem: "moisture, temperature, conductivity",
|
||||
sensors: {
|
||||
moisture: "sensor.sunflowers_moisture",
|
||||
temperature: "sensor.sunflowers_temperature",
|
||||
conductivity: "sensor.sunflowers_conductivity",
|
||||
brightness: "sensor.sunflowers_brightness",
|
||||
},
|
||||
unit_of_measurement_dict: {
|
||||
temperature: "°C",
|
||||
moisture: "%",
|
||||
brightness: "lx",
|
||||
conductivity: "μS/cm",
|
||||
},
|
||||
moisture: 54,
|
||||
temperature: 15.6,
|
||||
conductivity: 1,
|
||||
brightness: 25,
|
||||
entity_picture: "/images/sunflowers.jpg",
|
||||
}),
|
||||
];
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -71,28 +76,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoAlarmPanelEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-alarm-panel-card")
|
||||
class DemoAlarmPanelEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
this._setupDemo();
|
||||
}
|
||||
|
||||
private async _setupDemo() {
|
||||
const hass = provideHass(this.$.demos);
|
||||
await hass.updateTranslations(null, "en");
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -53,24 +58,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoConditional extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-conditional-card")
|
||||
class DemoConditional extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -217,24 +222,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoEntities extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-entities-card")
|
||||
class DemoEntities extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -69,24 +74,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoButtonEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-entity-button-card")
|
||||
class DemoButtonEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -89,26 +94,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoFilter extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-entity-filter-card")
|
||||
class DemoEntityFilter extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-entity-filter-card", DemoFilter);
|
||||
customElements.define("demo-hui-entity-filter-card", DemoEntityFilter);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -107,24 +112,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoGaugeEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-gauge-card")
|
||||
class DemoGaugeEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -218,26 +223,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoPicEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-glance-card")
|
||||
class DemoGlanceEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-glance-card", DemoPicEntity);
|
||||
customElements.define("demo-hui-glance-card", DemoGlanceEntity);
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import { html, LitElement, customElement, TemplateResult } from "lit-element";
|
||||
import "../components/demo-cards";
|
||||
|
||||
const CONFIGS = [
|
||||
@@ -37,18 +35,10 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoIframe extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards configs="[[_configs]]"></demo-cards> `;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
@customElement("demo-hui-iframe-card")
|
||||
class DemoIframe extends LitElement {
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -63,24 +68,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoLightEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-light-card")
|
||||
class DemoLightEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -161,24 +166,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoMap extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-map-card")
|
||||
class DemoMap extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { mockTemplate } from "../../../demo/src/stubs/template";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -254,23 +259,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoMarkdown extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-markdown-card")
|
||||
class DemoMarkdown extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
mockTemplate(hass);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
import { createMediaPlayerEntities } from "../data/media_players";
|
||||
@@ -158,26 +163,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoHuiMediControlCard extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-media-control-card")
|
||||
class DemoHuiMediaControlCard extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(createMediaPlayerEntities());
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-media-control-card", DemoHuiMediControlCard);
|
||||
customElements.define("demo-hui-media-control-card", DemoHuiMediaControlCard);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
import { createMediaPlayerEntities } from "../data/media_players";
|
||||
@@ -55,26 +60,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoHuiMediaPlayerRows extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-media-player-row")
|
||||
class DemoHuiMediaPlayerRow extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(createMediaPlayerEntities());
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-media-player-rows", DemoHuiMediaPlayerRows);
|
||||
customElements.define("demo-hui-media-player-row", DemoHuiMediaPlayerRow);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -125,26 +130,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoPicElements extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-picture-elements-card")
|
||||
class DemoPictureElements extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-picture-elements-card", DemoPicElements);
|
||||
customElements.define("demo-hui-picture-elements-card", DemoPictureElements);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -80,26 +85,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoPicEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-picture-entity-card")
|
||||
class DemoPictureEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-picture-entity-card", DemoPicEntity);
|
||||
customElements.define("demo-hui-picture-entity-card", DemoPictureEntity);
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -121,26 +126,21 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoPicGlance extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-picture-glance-card")
|
||||
class DemoPictureGlance extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-picture-glance-card", DemoPicGlance);
|
||||
customElements.define("demo-hui-picture-glance-card", DemoPictureGlance);
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
import { createPlantEntities } from "../data/plants";
|
||||
|
||||
const CONFIGS = [
|
||||
{
|
||||
heading: "Basic example",
|
||||
config: `
|
||||
- type: plant-status
|
||||
entity: plant.lemon_tree
|
||||
`,
|
||||
},
|
||||
{
|
||||
heading: "Problem (too bright) + low battery",
|
||||
config: `
|
||||
- type: plant-status
|
||||
entity: plant.apple_tree
|
||||
`,
|
||||
},
|
||||
{
|
||||
heading: "With picture + multiple problems",
|
||||
config: `
|
||||
- type: plant-status
|
||||
entity: plant.sunflowers
|
||||
name: Sunflowers Name Overwrite
|
||||
`,
|
||||
},
|
||||
];
|
||||
|
||||
@customElement("demo-hui-plant-card")
|
||||
export class DemoPlantEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(createPlantEntities());
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-hui-plant-card", DemoPlantEntity);
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
|
||||
@@ -20,24 +25,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoShoppingListEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-shopping-list-card")
|
||||
class DemoShoppingListEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
|
||||
hass.mockAPI("shopping_list", () => [
|
||||
{ name: "list", id: 1, complete: false },
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { mockHistory } from "../../../demo/src/stubs/history";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
@@ -132,24 +137,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoStack extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-stack-card")
|
||||
class DemoStack extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
mockHistory(hass);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,11 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-cards";
|
||||
@@ -74,24 +79,19 @@ const CONFIGS = [
|
||||
},
|
||||
];
|
||||
|
||||
class DemoThermostatEntity extends PolymerElement {
|
||||
static get template() {
|
||||
return html` <demo-cards id="demos" configs="[[_configs]]"></demo-cards> `;
|
||||
@customElement("demo-hui-thermostat-card")
|
||||
class DemoThermostatEntity extends LitElement {
|
||||
@query("#demos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`<demo-cards id="demos" .configs=${CONFIGS}></demo-cards>`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_configs: {
|
||||
type: Object,
|
||||
value: CONFIGS,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
const hass = provideHass(this.$.demos);
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.updateTranslations("lovelace", "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,27 @@
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import {
|
||||
html,
|
||||
LitElement,
|
||||
customElement,
|
||||
property,
|
||||
PropertyValues,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import "../../../src/components/ha-card";
|
||||
import { SUPPORT_BRIGHTNESS } from "../../../src/data/light";
|
||||
import {
|
||||
SUPPORT_BRIGHTNESS,
|
||||
SUPPORT_COLOR_TEMP,
|
||||
SUPPORT_EFFECT,
|
||||
SUPPORT_FLASH,
|
||||
SUPPORT_COLOR,
|
||||
SUPPORT_TRANSITION,
|
||||
SUPPORT_WHITE_VALUE,
|
||||
} from "../../../src/data/light";
|
||||
import { getEntity } from "../../../src/fake_data/entity";
|
||||
import { provideHass } from "../../../src/fake_data/provide_hass";
|
||||
import {
|
||||
provideHass,
|
||||
MockHomeAssistant,
|
||||
} from "../../../src/fake_data/provide_hass";
|
||||
import "../components/demo-more-infos";
|
||||
import "../../../src/dialogs/more-info/more-info-content";
|
||||
|
||||
@@ -14,38 +31,52 @@ const ENTITIES = [
|
||||
}),
|
||||
getEntity("light", "kitchen_light", "on", {
|
||||
friendly_name: "Brightness Light",
|
||||
brightness: 80,
|
||||
brightness: 200,
|
||||
supported_features: SUPPORT_BRIGHTNESS,
|
||||
}),
|
||||
getEntity("light", "color_temperature_light", "on", {
|
||||
friendly_name: "White Color Temperature Light",
|
||||
brightness: 128,
|
||||
color_temp: 75,
|
||||
min_mireds: 30,
|
||||
max_mireds: 150,
|
||||
supported_features: SUPPORT_BRIGHTNESS + SUPPORT_COLOR_TEMP,
|
||||
}),
|
||||
getEntity("light", "color_effectslight", "on", {
|
||||
friendly_name: "Color Effets Light",
|
||||
brightness: 255,
|
||||
hs_color: [30, 100],
|
||||
white_value: 36,
|
||||
supported_features:
|
||||
SUPPORT_BRIGHTNESS +
|
||||
SUPPORT_EFFECT +
|
||||
SUPPORT_FLASH +
|
||||
SUPPORT_COLOR +
|
||||
SUPPORT_TRANSITION +
|
||||
SUPPORT_WHITE_VALUE,
|
||||
effect_list: ["random", "colorloop"],
|
||||
}),
|
||||
];
|
||||
|
||||
class DemoMoreInfoLight extends PolymerElement {
|
||||
static get template() {
|
||||
@customElement("demo-more-info-light")
|
||||
class DemoMoreInfoLight extends LitElement {
|
||||
@property() public hass!: MockHomeAssistant;
|
||||
|
||||
@query("demo-more-infos") private _demoRoot!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
<demo-more-infos
|
||||
hass="[[hass]]"
|
||||
entities="[[_entities]]"
|
||||
.hass=${this.hass}
|
||||
.entities=${ENTITIES.map((ent) => ent.entityId)}
|
||||
></demo-more-infos>
|
||||
`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
_entities: {
|
||||
type: Array,
|
||||
value: ENTITIES.map((ent) => ent.entityId),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
public ready() {
|
||||
super.ready();
|
||||
this._setupDemo();
|
||||
}
|
||||
|
||||
private async _setupDemo() {
|
||||
const hass = provideHass(this);
|
||||
await hass.updateTranslations(null, "en");
|
||||
protected firstUpdated(changedProperties: PropertyValues) {
|
||||
super.firstUpdated(changedProperties);
|
||||
const hass = provideHass(this._demoRoot);
|
||||
hass.updateTranslations(null, "en");
|
||||
hass.addEntities(ENTITIES);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import "@material/mwc-button";
|
||||
import { html, LitElement, TemplateResult } from "lit-element";
|
||||
import { customElement, html, LitElement, TemplateResult } from "lit-element";
|
||||
import "../../../src/components/ha-card";
|
||||
import { ActionHandlerEvent } from "../../../src/data/lovelace";
|
||||
import { actionHandler } from "../../../src/panels/lovelace/common/directives/action-handler-directive";
|
||||
|
||||
@customElement("demo-util-long-press")
|
||||
export class DemoUtilLongPress extends LitElement {
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
@@ -20,7 +21,7 @@ export class DemoUtilLongPress extends LitElement {
|
||||
|
||||
<textarea></textarea>
|
||||
|
||||
<div>(try pressing and scrolling too!)</div>
|
||||
<div>Try pressing and scrolling too!</div>
|
||||
</ha-card>
|
||||
`
|
||||
)}
|
||||
@@ -62,5 +63,3 @@ export class DemoUtilLongPress extends LitElement {
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("demo-util-long-press", DemoUtilLongPress);
|
||||
|
||||
@@ -14,8 +14,6 @@ import "../../src/styles/polymer-ha-style";
|
||||
// eslint-disable-next-line import/extensions
|
||||
import { DEMOS } from "../build/import-demos";
|
||||
|
||||
const fixPath = (path) => path.substr(2, path.length - 5);
|
||||
|
||||
class HaGallery extends PolymerElement {
|
||||
static get template() {
|
||||
return html`
|
||||
|
||||
@@ -69,7 +69,7 @@ const STAGE_ICON = {
|
||||
const PERMIS_DESC = {
|
||||
stage: {
|
||||
title: "Add-on Stage",
|
||||
description: `Add-ons can have one of three stages:\n\n<ha-svg-icon .path='${STAGE_ICON.stable}'></ha-svg-icon> **Stable**: These are add-ons ready to be used in production.\n\n<ha-svg-icon .path='${STAGE_ICON.experimental}'></ha-svg-icon> **Experimental**: These may contain bugs, and may be unfinished.\n\n<ha-svg-icon .path='${STAGE_ICON.deprecated}'></ha-svg-icon> **Deprecated**: These add-ons will no longer receive any updates.`,
|
||||
description: `Add-ons can have one of three stages:\n\n<ha-svg-icon path="${STAGE_ICON.stable}"></ha-svg-icon> **Stable**: These are add-ons ready to be used in production.\n\n<ha-svg-icon path="${STAGE_ICON.experimental}"></ha-svg-icon> **Experimental**: These may contain bugs, and may be unfinished.\n\n<ha-svg-icon path="${STAGE_ICON.deprecated}"></ha-svg-icon> **Deprecated**: These add-ons will no longer receive any updates.`,
|
||||
},
|
||||
rating: {
|
||||
title: "Add-on Security Rating",
|
||||
|
||||
@@ -178,7 +178,7 @@ class HassioSupervisorInfo extends LitElement {
|
||||
</div>`}
|
||||
${!this.supervisor.supervisor.healthy
|
||||
? html`<div class="error">
|
||||
Your installtion is running in an unhealthy state.
|
||||
Your installation is running in an unhealthy state.
|
||||
<button
|
||||
class="link"
|
||||
title="Learn more about why your system is marked as unhealthy"
|
||||
|
||||
+16
-16
@@ -29,22 +29,22 @@
|
||||
"@fullcalendar/daygrid": "5.1.0",
|
||||
"@fullcalendar/interaction": "5.1.0",
|
||||
"@fullcalendar/list": "5.1.0",
|
||||
"@material/chips": "=8.0.0-canary.774dcfc8e.0",
|
||||
"@material/mwc-button": "^0.19.0",
|
||||
"@material/mwc-checkbox": "^0.19.0",
|
||||
"@material/mwc-circular-progress": "^0.19.0",
|
||||
"@material/mwc-dialog": "^0.19.0",
|
||||
"@material/mwc-fab": "^0.19.0",
|
||||
"@material/mwc-formfield": "^0.19.0",
|
||||
"@material/mwc-icon-button": "^0.19.0",
|
||||
"@material/mwc-list": "^0.19.0",
|
||||
"@material/mwc-menu": "^0.19.0",
|
||||
"@material/mwc-radio": "^0.19.0",
|
||||
"@material/mwc-ripple": "^0.19.0",
|
||||
"@material/mwc-switch": "^0.19.0",
|
||||
"@material/mwc-tab": "^0.19.0",
|
||||
"@material/mwc-tab-bar": "^0.19.0",
|
||||
"@material/top-app-bar": "=8.0.0-canary.774dcfc8e.0",
|
||||
"@material/chips": "=9.0.0-canary.1c156d69d.0",
|
||||
"@material/mwc-button": "^0.20.0",
|
||||
"@material/mwc-checkbox": "^0.20.0",
|
||||
"@material/mwc-circular-progress": "^0.20.0",
|
||||
"@material/mwc-dialog": "^0.20.0",
|
||||
"@material/mwc-fab": "^0.20.0",
|
||||
"@material/mwc-formfield": "^0.20.0",
|
||||
"@material/mwc-icon-button": "^0.20.0",
|
||||
"@material/mwc-list": "^0.20.0",
|
||||
"@material/mwc-menu": "^0.20.0",
|
||||
"@material/mwc-radio": "^0.20.0",
|
||||
"@material/mwc-ripple": "^0.20.0",
|
||||
"@material/mwc-switch": "^0.20.0",
|
||||
"@material/mwc-tab": "^0.20.0",
|
||||
"@material/mwc-tab-bar": "^0.20.0",
|
||||
"@material/top-app-bar": "=9.0.0-canary.1c156d69d.0",
|
||||
"@mdi/js": "5.6.55",
|
||||
"@mdi/svg": "5.6.55",
|
||||
"@polymer/app-layout": "^3.0.2",
|
||||
|
||||
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="home-assistant-frontend",
|
||||
version="20201204.0",
|
||||
version="20201229.0",
|
||||
description="The Home Assistant frontend",
|
||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||
author="The Home Assistant Authors",
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
export const copyToClipboard = (str) => {
|
||||
export const copyToClipboard = async (str) => {
|
||||
if (navigator.clipboard) {
|
||||
try {
|
||||
await navigator.clipboard.writeText(str);
|
||||
return;
|
||||
} catch {
|
||||
// just continue with the fallback coding below
|
||||
}
|
||||
}
|
||||
|
||||
const el = document.createElement("textarea");
|
||||
el.value = str;
|
||||
document.body.appendChild(el);
|
||||
|
||||
@@ -98,6 +98,12 @@ export class HaDataTable extends LitElement {
|
||||
|
||||
@property({ type: Boolean }) public hasFab = false;
|
||||
|
||||
/**
|
||||
* Add an extra row at the bottom of the data table
|
||||
* @type {TemplateResult}
|
||||
*/
|
||||
@property({ attribute: false }) public appendRow?;
|
||||
|
||||
@property({ type: Boolean, attribute: "auto-height" })
|
||||
public autoHeight = false;
|
||||
|
||||
@@ -126,6 +132,8 @@ export class HaDataTable extends LitElement {
|
||||
|
||||
@query("slot[name='header']") private _header!: HTMLSlotElement;
|
||||
|
||||
private _items: DataTableRowData[] = [];
|
||||
|
||||
private _checkableRowsCount?: number;
|
||||
|
||||
private _checkedRows: string[] = [];
|
||||
@@ -318,10 +326,13 @@ export class HaDataTable extends LitElement {
|
||||
@scroll=${this._saveScrollPos}
|
||||
>
|
||||
${scroll({
|
||||
items: !this.hasFab
|
||||
? this._filteredData
|
||||
: [...this._filteredData, ...[{ empty: true }]],
|
||||
items: this._items,
|
||||
renderItem: (row: DataTableRowData, index) => {
|
||||
if (row.append) {
|
||||
return html`
|
||||
<div class="mdc-data-table__row">${row.content}</div>
|
||||
`;
|
||||
}
|
||||
if (row.empty) {
|
||||
return html` <div class="mdc-data-table__row"></div> `;
|
||||
}
|
||||
@@ -447,6 +458,20 @@ export class HaDataTable extends LitElement {
|
||||
if (this.curRequest !== curRequest) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.appendRow || this.hasFab) {
|
||||
this._items = [...data];
|
||||
|
||||
if (this.appendRow) {
|
||||
this._items.push({ append: true, content: this.appendRow });
|
||||
}
|
||||
|
||||
if (this.hasFab) {
|
||||
this._items.push({ empty: true });
|
||||
}
|
||||
} else {
|
||||
this._items = data;
|
||||
}
|
||||
this._filteredData = data;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,6 +58,14 @@ const sortData = (
|
||||
valB = valB.toUpperCase();
|
||||
}
|
||||
|
||||
// Ensure "undefined" is always sorted to the bottom
|
||||
if (valA === undefined && valB !== undefined) {
|
||||
return 1;
|
||||
}
|
||||
if (valB === undefined && valA !== undefined) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (valA < valB) {
|
||||
return sort * -1;
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ class HaAttributes extends LitElement {
|
||||
justify-content: space-between;
|
||||
}
|
||||
.data-entry .value {
|
||||
max-width: 50%;
|
||||
max-width: 60%;
|
||||
overflow-wrap: break-word;
|
||||
text-align: right;
|
||||
}
|
||||
@@ -77,6 +77,9 @@ class HaAttributes extends LitElement {
|
||||
pre {
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
margin: 0px;
|
||||
overflow-wrap: break-word;
|
||||
white-space: pre-line;
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ class HaHLSPlayer extends LitElement {
|
||||
|
||||
// Parse playlist assuming it is a master playlist. Match group 1 is whether hevc, match group 2 is regular playlist url
|
||||
// See https://tools.ietf.org/html/rfc8216 for HLS spec details
|
||||
const playlistRegexp = /#EXT-X-STREAM-INF:.*?(?:CODECS=".*?(?<isHevc>hev1|hvc1)?\..*?".*?)?(?:\n|\r\n)(?<streamUrl>.+)/g;
|
||||
const playlistRegexp = /#EXT-X-STREAM-INF:.*?(?:CODECS=".*?(hev1|hvc1)?\..*?".*?)?(?:\n|\r\n)(.+)/g;
|
||||
const match = playlistRegexp.exec(masterPlaylist);
|
||||
const matchTwice = playlistRegexp.exec(masterPlaylist);
|
||||
|
||||
@@ -136,17 +136,13 @@ class HaHLSPlayer extends LitElement {
|
||||
let playlist_url: string;
|
||||
if (match !== null && matchTwice === null) {
|
||||
// Only send the regular playlist url if we match exactly once
|
||||
playlist_url = new URL(match.groups!.streamUrl, this.url).href;
|
||||
playlist_url = new URL(match[2], this.url).href;
|
||||
} else {
|
||||
playlist_url = this.url;
|
||||
}
|
||||
|
||||
// If codec is HEVC and ExoPlayer is supported, use ExoPlayer.
|
||||
if (
|
||||
this._useExoPlayer &&
|
||||
match !== null &&
|
||||
match.groups!.isHevc !== undefined
|
||||
) {
|
||||
if (this._useExoPlayer && match !== null && match[1] !== undefined) {
|
||||
this._renderHLSExoPlayer(playlist_url);
|
||||
} else if (hls.isSupported()) {
|
||||
this._renderHLSPolyfill(videoEl, hls, playlist_url);
|
||||
|
||||
@@ -10,7 +10,6 @@ class HaLabeledSlider extends PolymerElement {
|
||||
<style>
|
||||
:host {
|
||||
display: block;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.title {
|
||||
@@ -30,6 +29,7 @@ class HaLabeledSlider extends PolymerElement {
|
||||
ha-slider {
|
||||
flex-grow: 1;
|
||||
background-image: var(--ha-slider-background);
|
||||
border-radius: 4px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import type { HomeAssistant } from "../types";
|
||||
class HaRelativeTime extends UpdatingElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property({ attribute: false }) public datetime?: string;
|
||||
@property({ attribute: false }) public datetime?: string | Date;
|
||||
|
||||
private _interval?: number;
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ import {
|
||||
subscribeAreaRegistry,
|
||||
} from "../data/area_registry";
|
||||
import {
|
||||
computeDeviceName,
|
||||
DeviceRegistryEntry,
|
||||
subscribeDeviceRegistry,
|
||||
} from "../data/device_registry";
|
||||
@@ -135,7 +136,7 @@ export class HaTargetPicker extends SubscribeMixin(LitElement) {
|
||||
return this._renderChip(
|
||||
"device_id",
|
||||
device_id,
|
||||
device?.name || device_id,
|
||||
device ? computeDeviceName(device, this.hass) : device_id,
|
||||
undefined,
|
||||
mdiDevices
|
||||
);
|
||||
|
||||
+11
-7
@@ -124,13 +124,17 @@ export const getLogbookMessage = (
|
||||
switch (domain) {
|
||||
case "device_tracker":
|
||||
case "person":
|
||||
return state === "not_home"
|
||||
? hass.localize(`${LOGBOOK_LOCALIZE_PATH}.was_away`)
|
||||
: hass.localize(
|
||||
`${LOGBOOK_LOCALIZE_PATH}.was_at_state`,
|
||||
"state",
|
||||
state
|
||||
);
|
||||
if (state === "not_home") {
|
||||
return hass.localize(`${LOGBOOK_LOCALIZE_PATH}.was_away`);
|
||||
}
|
||||
if (state === "home") {
|
||||
return hass.localize(`${LOGBOOK_LOCALIZE_PATH}.was_at_home`);
|
||||
}
|
||||
return hass.localize(
|
||||
`${LOGBOOK_LOCALIZE_PATH}.was_at_state`,
|
||||
"state",
|
||||
state
|
||||
);
|
||||
|
||||
case "sun":
|
||||
return state === "above_horizon"
|
||||
|
||||
@@ -148,6 +148,11 @@ export interface CustomActionConfig extends BaseActionConfig {
|
||||
action: "fire-dom-event";
|
||||
}
|
||||
|
||||
export interface MultipleActionConfig extends BaseActionConfig {
|
||||
action: "multiple";
|
||||
actions: ActionConfig[];
|
||||
}
|
||||
|
||||
export interface BaseActionConfig {
|
||||
confirmation?: ConfirmationRestrictionConfig;
|
||||
}
|
||||
@@ -168,7 +173,8 @@ export type ActionConfig =
|
||||
| UrlActionConfig
|
||||
| MoreInfoActionConfig
|
||||
| NoActionConfig
|
||||
| CustomActionConfig;
|
||||
| CustomActionConfig
|
||||
| MultipleActionConfig;
|
||||
|
||||
type LovelaceUpdatedEvent = HassEventBase & {
|
||||
event_type: "lovelace_updated";
|
||||
|
||||
@@ -38,3 +38,12 @@ export const addItem = (
|
||||
type: "shopping_list/items/add",
|
||||
name,
|
||||
});
|
||||
|
||||
export const reorderItems = (
|
||||
hass: HomeAssistant,
|
||||
itemIds: [string]
|
||||
): Promise<ShoppingListItem> =>
|
||||
hass.callWS({
|
||||
type: "shopping_list/items/reorder",
|
||||
item_ids: itemIds,
|
||||
});
|
||||
|
||||
@@ -17,17 +17,17 @@ import "../../components/ha-switch";
|
||||
import { PolymerChangedEvent } from "../../polymer-types";
|
||||
import { haStyleDialog } from "../../resources/styles";
|
||||
import { HomeAssistant } from "../../types";
|
||||
import { DialogParams } from "./show-dialog-box";
|
||||
import { DialogBoxParams } from "./show-dialog-box";
|
||||
|
||||
@customElement("dialog-box")
|
||||
class DialogBox extends LitElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@internalProperty() private _params?: DialogParams;
|
||||
@internalProperty() private _params?: DialogBoxParams;
|
||||
|
||||
@internalProperty() private _value?: string;
|
||||
|
||||
public async showDialog(params: DialogParams): Promise<void> {
|
||||
public async showDialog(params: DialogBoxParams): Promise<void> {
|
||||
this._params = params;
|
||||
if (params.prompt) {
|
||||
this._value = params.defaultValue;
|
||||
@@ -55,8 +55,8 @@ class DialogBox extends LitElement {
|
||||
return html`
|
||||
<ha-dialog
|
||||
open
|
||||
?scrimClickAction=${this._params.prompt}
|
||||
?escapeKeyAction=${this._params.prompt}
|
||||
?scrimClickAction=${confirmPrompt}
|
||||
?escapeKeyAction=${confirmPrompt}
|
||||
@closed=${this._dialogClosed}
|
||||
defaultAction="ignore"
|
||||
.heading=${this._params.title
|
||||
@@ -140,10 +140,10 @@ class DialogBox extends LitElement {
|
||||
}
|
||||
|
||||
private _dialogClosed(ev) {
|
||||
if (ev.detail.action === "ignore") {
|
||||
if (this._params?.prompt && ev.detail.action === "ignore") {
|
||||
return;
|
||||
}
|
||||
this.closeDialog();
|
||||
this._dismiss();
|
||||
}
|
||||
|
||||
private _close(): void {
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
import { TemplateResult } from "lit-html";
|
||||
import { fireEvent } from "../../common/dom/fire_event";
|
||||
|
||||
interface BaseDialogParams {
|
||||
interface BaseDialogBoxParams {
|
||||
confirmText?: string;
|
||||
text?: string | TemplateResult;
|
||||
title?: string;
|
||||
warning?: boolean;
|
||||
}
|
||||
|
||||
export interface AlertDialogParams extends BaseDialogParams {
|
||||
export interface AlertDialogParams extends BaseDialogBoxParams {
|
||||
confirm?: () => void;
|
||||
}
|
||||
|
||||
export interface ConfirmationDialogParams extends BaseDialogParams {
|
||||
export interface ConfirmationDialogParams extends BaseDialogBoxParams {
|
||||
dismissText?: string;
|
||||
confirm?: () => void;
|
||||
cancel?: () => void;
|
||||
}
|
||||
|
||||
export interface PromptDialogParams extends BaseDialogParams {
|
||||
export interface PromptDialogParams extends BaseDialogBoxParams {
|
||||
inputLabel?: string;
|
||||
inputType?: string;
|
||||
defaultValue?: string;
|
||||
confirm?: (out?: string) => void;
|
||||
}
|
||||
|
||||
export interface DialogParams
|
||||
export interface DialogBoxParams
|
||||
extends ConfirmationDialogParams,
|
||||
PromptDialogParams {
|
||||
confirm?: (out?: string) => void;
|
||||
@@ -37,10 +37,10 @@ export const loadGenericDialog = () => import("./dialog-box");
|
||||
|
||||
const showDialogHelper = (
|
||||
element: HTMLElement,
|
||||
dialogParams: DialogParams,
|
||||
dialogParams: DialogBoxParams,
|
||||
extra?: {
|
||||
confirmation?: DialogParams["confirmation"];
|
||||
prompt?: DialogParams["prompt"];
|
||||
confirmation?: DialogBoxParams["confirmation"];
|
||||
prompt?: DialogBoxParams["prompt"];
|
||||
}
|
||||
) =>
|
||||
new Promise((resolve) => {
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { UNAVAILABLE_STATES } from "../../../data/entity";
|
||||
|
||||
@customElement("more-info-counter")
|
||||
class MoreInfoCounter extends LitElement {
|
||||
@@ -22,21 +23,29 @@ class MoreInfoCounter extends LitElement {
|
||||
return html``;
|
||||
}
|
||||
|
||||
const disabled = UNAVAILABLE_STATES.includes(this.stateObj!.state);
|
||||
|
||||
return html`
|
||||
<div class="actions">
|
||||
<mwc-button
|
||||
.action="${"increment"}"
|
||||
@click="${this._handleActionClick}"
|
||||
@click=${this._handleActionClick}
|
||||
.disabled=${disabled}
|
||||
>
|
||||
${this.hass!.localize("ui.card.counter.actions.increment")}
|
||||
</mwc-button>
|
||||
<mwc-button
|
||||
.action="${"decrement"}"
|
||||
@click="${this._handleActionClick}"
|
||||
@click=${this._handleActionClick}
|
||||
.disabled=${disabled}
|
||||
>
|
||||
${this.hass!.localize("ui.card.counter.actions.decrement")}
|
||||
</mwc-button>
|
||||
<mwc-button .action="${"reset"}" @click="${this._handleActionClick}">
|
||||
<mwc-button
|
||||
.action="${"reset"}"
|
||||
@click=${this._handleActionClick}
|
||||
.disabled=${disabled}
|
||||
>
|
||||
${this.hass!.localize("ui.card.counter.actions.reset")}
|
||||
</mwc-button>
|
||||
</div>
|
||||
@@ -53,8 +62,7 @@ class MoreInfoCounter extends LitElement {
|
||||
static get styles(): CSSResult {
|
||||
return css`
|
||||
.actions {
|
||||
margin: 0;
|
||||
padding-top: 20px;
|
||||
margin: 8px 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
|
||||
@@ -75,7 +75,7 @@ class MoreInfoPerson extends LitElement {
|
||||
justify-content: space-between;
|
||||
}
|
||||
.actions {
|
||||
margin: 36px 0 8px 0;
|
||||
margin: 8px 0;
|
||||
text-align: right;
|
||||
}
|
||||
ha-map {
|
||||
|
||||
@@ -44,7 +44,7 @@ class MoreInfoSun extends LitElement {
|
||||
>
|
||||
<ha-relative-time
|
||||
.hass=${this.hass}
|
||||
.datetimeObj=${item === "ris" ? risingDate : settingDate}
|
||||
.datetime=${item === "ris" ? risingDate : settingDate}
|
||||
></ha-relative-time>
|
||||
</div>
|
||||
<div class="value">
|
||||
@@ -80,6 +80,7 @@ class MoreInfoSun extends LitElement {
|
||||
}
|
||||
ha-relative-time {
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
}
|
||||
ha-relative-time::first-letter {
|
||||
text-transform: lowercase;
|
||||
|
||||
@@ -76,8 +76,7 @@ class MoreInfoTimer extends LitElement {
|
||||
static get styles(): CSSResult {
|
||||
return css`
|
||||
.actions {
|
||||
margin: 0;
|
||||
padding-top: 20px;
|
||||
margin: 8px 0;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
|
||||
@@ -60,6 +60,12 @@ export class HaTabsSubpageDataTable extends LitElement {
|
||||
*/
|
||||
@property({ type: Boolean }) public hasFab = false;
|
||||
|
||||
/**
|
||||
* Add an extra row at the bottom of the data table
|
||||
* @type {TemplateResult}
|
||||
*/
|
||||
@property({ attribute: false }) public appendRow?;
|
||||
|
||||
/**
|
||||
* Field with a unique id per entry in data.
|
||||
* @type {String}
|
||||
@@ -171,6 +177,7 @@ export class HaTabsSubpageDataTable extends LitElement {
|
||||
.noDataText=${this.noDataText}
|
||||
.dir=${computeRTLDirection(this.hass)}
|
||||
.clickable=${this.clickable}
|
||||
.appendRow=${this.appendRow}
|
||||
>
|
||||
${!this.narrow
|
||||
? html`
|
||||
|
||||
@@ -15,12 +15,14 @@ import {
|
||||
LitElement,
|
||||
property,
|
||||
PropertyValues,
|
||||
query,
|
||||
} from "lit-element";
|
||||
import { dynamicElement } from "../../../../common/dom/dynamic-element-directive";
|
||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||
import "../../../../components/ha-button-menu";
|
||||
import "../../../../components/ha-card";
|
||||
import "../../../../components/ha-svg-icon";
|
||||
import type { HaYamlEditor } from "../../../../components/ha-yaml-editor";
|
||||
import type { Action } from "../../../../data/script";
|
||||
import { showConfirmationDialog } from "../../../../dialogs/generic/show-dialog-box";
|
||||
import { haStyle } from "../../../../resources/styles";
|
||||
@@ -103,6 +105,8 @@ export default class HaAutomationActionRow extends LitElement {
|
||||
|
||||
@internalProperty() private _yamlMode = false;
|
||||
|
||||
@query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor;
|
||||
|
||||
protected updated(changedProperties: PropertyValues) {
|
||||
if (!changedProperties.has("action")) {
|
||||
return;
|
||||
@@ -111,6 +115,10 @@ export default class HaAutomationActionRow extends LitElement {
|
||||
if (!this._uiModeAvailable && !this._yamlMode) {
|
||||
this._yamlMode = true;
|
||||
}
|
||||
|
||||
if (this._yamlMode && this._yamlEditor) {
|
||||
this._yamlEditor.setValue(this.action);
|
||||
}
|
||||
}
|
||||
|
||||
protected render() {
|
||||
@@ -187,7 +195,7 @@ export default class HaAutomationActionRow extends LitElement {
|
||||
<ul>
|
||||
${this._warnings.map((warning) => html`<li>${warning}</li>`)}
|
||||
</ul>
|
||||
You can still edit your config in yaml.
|
||||
You can still edit your config in YAML.
|
||||
</div>`
|
||||
: ""}
|
||||
${yamlMode
|
||||
|
||||
@@ -19,12 +19,12 @@ import type { HaYamlEditor } from "../../../../../components/ha-yaml-editor";
|
||||
import { ServiceAction } from "../../../../../data/script";
|
||||
import type { PolymerChangedEvent } from "../../../../../polymer-types";
|
||||
import type { HomeAssistant } from "../../../../../types";
|
||||
import { EntityId } from "../../../../lovelace/common/structs/is-entity-id";
|
||||
import { EntityIdOrAll } from "../../../../lovelace/common/structs/is-entity-id";
|
||||
import { ActionElement, handleChangeEvent } from "../ha-automation-action-row";
|
||||
|
||||
const actionStruct = object({
|
||||
service: optional(string()),
|
||||
entity_id: optional(EntityId),
|
||||
entity_id: optional(EntityIdOrAll),
|
||||
data: optional(any()),
|
||||
});
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ export class HaBlueprintAutomationEditor extends LitElement {
|
||||
.selector=${value.selector}
|
||||
.key=${key}
|
||||
.value=${(this.config.use_blueprint.input &&
|
||||
this.config.use_blueprint.input[key]) ||
|
||||
this.config.use_blueprint.input[key]) ??
|
||||
value?.default}
|
||||
@value-changed=${this._inputChanged}
|
||||
></ha-selector>`
|
||||
|
||||
@@ -32,6 +32,7 @@ import "../../../components/ha-svg-icon";
|
||||
import "../../../components/ha-yaml-editor";
|
||||
import { showToast } from "../../../util/toast";
|
||||
import type { HaYamlEditor } from "../../../components/ha-yaml-editor";
|
||||
import { copyToClipboard } from "../../../common/util/copy-clipboard";
|
||||
import {
|
||||
AutomationConfig,
|
||||
AutomationEntity,
|
||||
@@ -394,9 +395,12 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) {
|
||||
return cleanConfig;
|
||||
}
|
||||
|
||||
private async _copyYaml() {
|
||||
private async _copyYaml(): Promise<void> {
|
||||
if (this._editor?.yaml) {
|
||||
navigator.clipboard.writeText(this._editor.yaml);
|
||||
await copyToClipboard(this._editor.yaml);
|
||||
showToast(this, {
|
||||
message: this.hass.localize("ui.common.copied_clipboard"),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -107,7 +107,16 @@ class DialogImportBlueprint extends LitElement {
|
||||
<pre>${this._result.raw_data}</pre>
|
||||
</ha-expansion-panel>`
|
||||
: html`${this.hass.localize(
|
||||
"ui.panel.config.blueprint.add.import_introduction"
|
||||
"ui.panel.config.blueprint.add.import_introduction_link",
|
||||
"community_link",
|
||||
html`<a
|
||||
href="https://www.home-assistant.io/get-blueprints"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>${this.hass.localize(
|
||||
"ui.panel.config.blueprint.add.community_forums"
|
||||
)}</a
|
||||
>`
|
||||
)}<paper-input
|
||||
id="input"
|
||||
.label=${this.hass.localize(
|
||||
|
||||
@@ -170,6 +170,23 @@ class HaBlueprintOverview extends LitElement {
|
||||
"ui.panel.config.blueprint.overview.no_blueprints"
|
||||
)}
|
||||
hasFab
|
||||
.appendRow=${html` <div
|
||||
class="mdc-data-table__cell"
|
||||
style="width: 100%; text-align: center;"
|
||||
role="cell"
|
||||
>
|
||||
<a
|
||||
href="https://www.home-assistant.io/get-blueprints"
|
||||
target="_blank"
|
||||
rel="noreferrer noopener"
|
||||
>
|
||||
<mwc-button
|
||||
>${this.hass.localize(
|
||||
"ui.panel.config.blueprint.overview.discover_more"
|
||||
)}</mwc-button
|
||||
>
|
||||
</a>
|
||||
</div>`}
|
||||
>
|
||||
<mwc-icon-button slot="toolbar-icon" @click=${this._showHelp}>
|
||||
<ha-svg-icon .path=${mdiHelpCircle}></ha-svg-icon>
|
||||
|
||||
@@ -92,7 +92,7 @@ class HaConfigCustomize extends LocalizeMixin(PolymerElement) {
|
||||
}
|
||||
|
||||
_computeTabs() {
|
||||
return configSections.general;
|
||||
return configSections.advanced;
|
||||
}
|
||||
|
||||
computeEntities(hass) {
|
||||
|
||||
@@ -189,9 +189,7 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
),
|
||||
model: device.model || "<unknown>",
|
||||
manufacturer: device.manufacturer || "<unknown>",
|
||||
area: device.area_id
|
||||
? areaLookup[device.area_id].name
|
||||
: this.hass.localize("ui.panel.config.devices.data_table.no_area"),
|
||||
area: device.area_id ? areaLookup[device.area_id].name : undefined,
|
||||
integration: device.config_entries.length
|
||||
? device.config_entries
|
||||
.filter((entId) => entId in entryLookup)
|
||||
|
||||
@@ -148,7 +148,7 @@ export class HaConfigHelpers extends LitElement {
|
||||
.narrow=${this.narrow}
|
||||
back-path="/config"
|
||||
.route=${this.route}
|
||||
.tabs=${configSections.automation}
|
||||
.tabs=${configSections.helpers}
|
||||
.columns=${this._columns(this.narrow, this.hass.language)}
|
||||
.data=${this._getItems(this._stateItems)}
|
||||
@row-click=${this._openEditDialog}
|
||||
|
||||
@@ -197,7 +197,7 @@ class SystemHealthCard extends LitElement {
|
||||
});
|
||||
}
|
||||
|
||||
private _copyInfo(ev: CustomEvent<ActionDetail>): void {
|
||||
private async _copyInfo(ev: CustomEvent<ActionDetail>): Promise<void> {
|
||||
const github = ev.detail.index === 1;
|
||||
let haContent: string | undefined;
|
||||
const domainParts: string[] = [];
|
||||
@@ -250,13 +250,15 @@ class SystemHealthCard extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
copyToClipboard(
|
||||
await copyToClipboard(
|
||||
`${github ? "## " : ""}System Health\n${haContent}\n\n${domainParts.join(
|
||||
"\n\n"
|
||||
)}`
|
||||
);
|
||||
|
||||
showToast(this, { message: this.hass.localize("ui.common.copied") });
|
||||
showToast(this, {
|
||||
message: this.hass.localize("ui.common.copied_clipboard"),
|
||||
});
|
||||
}
|
||||
|
||||
static get styles(): CSSResult {
|
||||
|
||||
@@ -141,11 +141,15 @@ class OZWNodeDashboard extends LitElement {
|
||||
${this._metadata.metadata.ResetHelp}
|
||||
</div>
|
||||
</ha-card>
|
||||
<ha-card class="content" header="WakeUp">
|
||||
<div class="card-content">
|
||||
${this._metadata.metadata.WakeupHelp}
|
||||
</div>
|
||||
</ha-card>
|
||||
${this._metadata.metadata.WakeupHelp
|
||||
? html`
|
||||
<ha-card class="content" header="WakeUp">
|
||||
<div class="card-content">
|
||||
${this._metadata.metadata.WakeupHelp}
|
||||
</div>
|
||||
</ha-card>
|
||||
`
|
||||
: ``}
|
||||
`
|
||||
: ``}
|
||||
`
|
||||
@@ -199,6 +203,10 @@ class OZWNodeDashboard extends LitElement {
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.content:last-child {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.sectionHeader {
|
||||
position: relative;
|
||||
padding-right: 40px;
|
||||
|
||||
+5
-7
@@ -49,19 +49,17 @@ class ZHADevicePairingStatusCard extends LitElement {
|
||||
class="discovered ${classMap({
|
||||
initialized: this.device.pairing_status === INITIALIZED,
|
||||
})}"
|
||||
><div
|
||||
class="header"
|
||||
>
|
||||
<h1>
|
||||
><div class="header">
|
||||
<h4>
|
||||
${this.hass!.localize(
|
||||
`ui.panel.config.zha.device_pairing_card.${this.device.pairing_status}`
|
||||
)}
|
||||
</h1>
|
||||
<h4>
|
||||
</h4>
|
||||
<h1>
|
||||
${this.hass!.localize(
|
||||
`ui.panel.config.zha.device_pairing_card.${this.device.pairing_status}_status_text`
|
||||
)}
|
||||
</h4>
|
||||
</h1>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
${[INTERVIEW_COMPLETE, CONFIGURED].includes(
|
||||
|
||||
+120
-4
@@ -15,6 +15,12 @@ import { fetchDevices, ZHADevice } from "../../../../../data/zha";
|
||||
import "../../../../../layouts/hass-subpage";
|
||||
import type { HomeAssistant } from "../../../../../types";
|
||||
import { Network, Edge, Node, EdgeOptions } from "vis-network";
|
||||
import "../../../../../common/search/search-input";
|
||||
import "../../../../../components/ha-button-menu";
|
||||
import "../../../../../components/device/ha-device-picker";
|
||||
import "../../../../../components/ha-svg-icon";
|
||||
import { formatAsPaddedHex } from "./functions";
|
||||
import { PolymerChangedEvent } from "../../../../../polymer-types";
|
||||
|
||||
@customElement("zha-network-visualization-page")
|
||||
export class ZHANetworkVisualizationPage extends LitElement {
|
||||
@@ -28,9 +34,21 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
@internalProperty()
|
||||
private _devices: Map<string, ZHADevice> = new Map();
|
||||
|
||||
@internalProperty()
|
||||
private _devicesByDeviceId: Map<string, ZHADevice> = new Map();
|
||||
|
||||
@internalProperty()
|
||||
private _nodes: Node[] = [];
|
||||
|
||||
@internalProperty()
|
||||
private _network?: Network;
|
||||
|
||||
@internalProperty()
|
||||
private _filter?: string;
|
||||
|
||||
@internalProperty()
|
||||
private _zoomedDeviceId?: string;
|
||||
|
||||
protected firstUpdated(changedProperties: PropertyValues): void {
|
||||
super.firstUpdated(changedProperties);
|
||||
if (this.hass) {
|
||||
@@ -91,6 +109,27 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
"ui.panel.config.zha.visualization.header"
|
||||
)}
|
||||
>
|
||||
<div class="table-header">
|
||||
<search-input
|
||||
no-label-float
|
||||
no-underline
|
||||
@value-changed=${this._handleSearchChange}
|
||||
.filter=${this._filter}
|
||||
.label=${this.hass.localize(
|
||||
"ui.panel.config.zha.visualization.highlight_label"
|
||||
)}
|
||||
>
|
||||
</search-input>
|
||||
<ha-device-picker
|
||||
.hass=${this.hass}
|
||||
.value=${this._zoomedDeviceId}
|
||||
.label=${this.hass.localize(
|
||||
"ui.panel.config.zha.visualization.zoom_label"
|
||||
)}
|
||||
.includeDomains="['zha']"
|
||||
@value-changed=${this._zoomToDevice}
|
||||
></ha-device-picker>
|
||||
</div>
|
||||
<div id="visualization"></div>
|
||||
</hass-subpage>
|
||||
`;
|
||||
@@ -101,15 +140,18 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
this._devices = new Map(
|
||||
devices.map((device: ZHADevice) => [device.ieee, device])
|
||||
);
|
||||
this._devicesByDeviceId = new Map(
|
||||
devices.map((device: ZHADevice) => [device.device_reg_id, device])
|
||||
);
|
||||
this._updateDevices(devices);
|
||||
}
|
||||
|
||||
private _updateDevices(devices: ZHADevice[]) {
|
||||
const nodes: Node[] = [];
|
||||
this._nodes = [];
|
||||
const edges: Edge[] = [];
|
||||
|
||||
devices.forEach((device) => {
|
||||
nodes.push({
|
||||
this._nodes.push({
|
||||
id: device.ieee,
|
||||
label: this._buildLabel(device),
|
||||
shape: this._getShape(device),
|
||||
@@ -137,7 +179,7 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
}
|
||||
});
|
||||
|
||||
this._network?.setData({ nodes: nodes, edges: edges });
|
||||
this._network?.setData({ nodes: this._nodes, edges: edges });
|
||||
}
|
||||
|
||||
private _getLQI(lqi: number): EdgeOptions["color"] {
|
||||
@@ -181,7 +223,7 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
label += `<b>IEEE: </b>${device.ieee}`;
|
||||
label += `\n<b>Device Type: </b>${device.device_type.replace("_", " ")}`;
|
||||
if (device.nwk != null) {
|
||||
label += `\n<b>NWK: </b>${device.nwk}`;
|
||||
label += `\n<b>NWK: </b>${formatAsPaddedHex(device.nwk)}`;
|
||||
}
|
||||
if (device.manufacturer != null && device.model != null) {
|
||||
label += `\n<b>Device: </b>${device.manufacturer} ${device.model}`;
|
||||
@@ -194,6 +236,56 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
return label;
|
||||
}
|
||||
|
||||
private _handleSearchChange(ev: CustomEvent) {
|
||||
this._filter = ev.detail.value;
|
||||
const filterText = this._filter!.toLowerCase();
|
||||
if (!this._network) {
|
||||
return;
|
||||
}
|
||||
if (this._filter) {
|
||||
const filteredNodeIds: (string | number)[] = [];
|
||||
this._nodes.forEach((node) => {
|
||||
if (node.label && node.label.toLowerCase().includes(filterText)) {
|
||||
filteredNodeIds.push(node.id!);
|
||||
}
|
||||
});
|
||||
this._zoomedDeviceId = "";
|
||||
this._zoomOut();
|
||||
this._network.selectNodes(filteredNodeIds, true);
|
||||
} else {
|
||||
this._network.unselectAll();
|
||||
}
|
||||
}
|
||||
|
||||
private _zoomToDevice(event: PolymerChangedEvent<string>) {
|
||||
event.stopPropagation();
|
||||
this._zoomedDeviceId = event.detail.value;
|
||||
if (!this._network) {
|
||||
return;
|
||||
}
|
||||
this._filter = "";
|
||||
if (!this._zoomedDeviceId) {
|
||||
this._zoomOut();
|
||||
} else {
|
||||
const device: ZHADevice | undefined = this._devicesByDeviceId.get(
|
||||
this._zoomedDeviceId
|
||||
);
|
||||
if (device) {
|
||||
this._network.fit({
|
||||
nodes: [device.ieee],
|
||||
animation: { duration: 500, easingFunction: "easeInQuad" },
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private _zoomOut() {
|
||||
this._network!.fit({
|
||||
nodes: [],
|
||||
animation: { duration: 500, easingFunction: "easeOutQuad" },
|
||||
});
|
||||
}
|
||||
|
||||
static get styles(): CSSResult[] {
|
||||
return [
|
||||
css`
|
||||
@@ -208,6 +300,30 @@ export class ZHANetworkVisualizationPage extends LitElement {
|
||||
line-height: var(--paper-font-display1_-_line-height);
|
||||
opacity: var(--dark-primary-opacity);
|
||||
}
|
||||
.table-header {
|
||||
border-bottom: 1px solid --divider-color;
|
||||
padding: 0 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: var(--header-height);
|
||||
}
|
||||
.search-toolbar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: var(--secondary-text-color);
|
||||
padding: 0 16px;
|
||||
}
|
||||
search-input {
|
||||
position: relative;
|
||||
top: 2px;
|
||||
flex: 1;
|
||||
}
|
||||
search-input.header {
|
||||
left: -8px;
|
||||
}
|
||||
ha-device-picker {
|
||||
flex: 1;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ import "../../../components/ha-header-bar";
|
||||
import "@material/mwc-icon-button/mwc-icon-button";
|
||||
import { mdiContentCopy, mdiClose } from "@mdi/js";
|
||||
import "@polymer/paper-tooltip/paper-tooltip";
|
||||
import type { PaperTooltipElement } from "@polymer/paper-tooltip/paper-tooltip";
|
||||
import {
|
||||
css,
|
||||
CSSResult,
|
||||
@@ -10,10 +9,10 @@ import {
|
||||
internalProperty,
|
||||
LitElement,
|
||||
property,
|
||||
query,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { fireEvent } from "../../../common/dom/fire_event";
|
||||
import { copyToClipboard } from "../../../common/util/copy-clipboard";
|
||||
import "../../../components/ha-dialog";
|
||||
import "../../../components/ha-svg-icon";
|
||||
import {
|
||||
@@ -27,6 +26,7 @@ import { haStyleDialog } from "../../../resources/styles";
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import type { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail";
|
||||
import { formatSystemLogTime } from "./util";
|
||||
import { showToast } from "../../../util/toast";
|
||||
|
||||
class DialogSystemLogDetail extends LitElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
@@ -35,8 +35,6 @@ class DialogSystemLogDetail extends LitElement {
|
||||
|
||||
@internalProperty() private _manifest?: IntegrationManifest;
|
||||
|
||||
@query("paper-tooltip") private _toolTip?: PaperTooltipElement;
|
||||
|
||||
public async showDialog(params: SystemLogDetailDialogParams): Promise<void> {
|
||||
this._params = params;
|
||||
this._manifest = undefined;
|
||||
@@ -83,15 +81,6 @@ class DialogSystemLogDetail extends LitElement {
|
||||
<mwc-icon-button id="copy" @click=${this._copyLog} slot="actionItems">
|
||||
<ha-svg-icon .path=${mdiContentCopy}></ha-svg-icon>
|
||||
</mwc-icon-button>
|
||||
<paper-tooltip
|
||||
slot="actionItems"
|
||||
manual-mode
|
||||
for="copy"
|
||||
position="left"
|
||||
animation-delay="0"
|
||||
offset="4"
|
||||
>${this.hass.localize("ui.common.copied")}</paper-tooltip
|
||||
>
|
||||
</ha-header-bar>
|
||||
<div class="contents">
|
||||
<p>
|
||||
@@ -162,23 +151,15 @@ class DialogSystemLogDetail extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
private _copyLog(): void {
|
||||
private async _copyLog(): Promise<void> {
|
||||
const copyElement = this.shadowRoot?.querySelector(
|
||||
".contents"
|
||||
) as HTMLElement;
|
||||
|
||||
const selection = window.getSelection()!;
|
||||
const range = document.createRange();
|
||||
|
||||
range.selectNodeContents(copyElement);
|
||||
selection.removeAllRanges();
|
||||
selection.addRange(range);
|
||||
|
||||
document.execCommand("copy");
|
||||
window.getSelection()!.removeAllRanges();
|
||||
|
||||
this._toolTip!.show();
|
||||
setTimeout(() => this._toolTip?.hide(), 3000);
|
||||
await copyToClipboard(copyElement.innerText);
|
||||
showToast(this, {
|
||||
message: this.hass.localize("ui.common.copied_clipboard"),
|
||||
});
|
||||
}
|
||||
|
||||
static get styles(): CSSResult[] {
|
||||
|
||||
@@ -35,6 +35,7 @@ import "../../../components/ha-icon-input";
|
||||
import "../../../components/ha-svg-icon";
|
||||
import "../../../components/ha-yaml-editor";
|
||||
import type { HaYamlEditor } from "../../../components/ha-yaml-editor";
|
||||
import { copyToClipboard } from "../../../common/util/copy-clipboard";
|
||||
import {
|
||||
Action,
|
||||
deleteScript,
|
||||
@@ -543,9 +544,12 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
|
||||
return this._config;
|
||||
}
|
||||
|
||||
private async _copyYaml() {
|
||||
private async _copyYaml(): Promise<void> {
|
||||
if (this._editor?.yaml) {
|
||||
navigator.clipboard.writeText(this._editor.yaml);
|
||||
await copyToClipboard(this._editor.yaml);
|
||||
showToast(this, {
|
||||
message: this.hass.localize("ui.common.copied_clipboard"),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
|
||||
${tag.last_scanned_datetime
|
||||
? html`<ha-relative-time
|
||||
.hass=${this.hass}
|
||||
.datetimeObj=${tag.last_scanned_datetime}
|
||||
.datetime=${tag.last_scanned_datetime}
|
||||
></ha-relative-time>`
|
||||
: this.hass.localize("ui.panel.config.tags.never_scanned")}
|
||||
</div>`
|
||||
@@ -103,7 +103,7 @@ export class HaConfigTags extends SubscribeMixin(LitElement) {
|
||||
${last_scanned_datetime
|
||||
? html`<ha-relative-time
|
||||
.hass=${this.hass}
|
||||
.datetimeObj=${last_scanned_datetime}
|
||||
.datetime=${last_scanned_datetime}
|
||||
></ha-relative-time>`
|
||||
: this.hass.localize("ui.panel.config.tags.never_scanned")}
|
||||
`,
|
||||
|
||||
@@ -119,27 +119,21 @@ class HaPanelHistory extends LitElement {
|
||||
todayEnd.setDate(todayEnd.getDate() + 1);
|
||||
todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1);
|
||||
|
||||
const todayCopy = new Date(today);
|
||||
|
||||
const yesterday = new Date(todayCopy.setDate(today.getDate() - 1));
|
||||
const yesterdayEnd = new Date(yesterday);
|
||||
yesterdayEnd.setDate(yesterdayEnd.getDate() + 1);
|
||||
const yesterday = new Date(today);
|
||||
yesterday.setDate(today.getDate() - 1);
|
||||
const yesterdayEnd = new Date(today);
|
||||
yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1);
|
||||
|
||||
const thisWeekStart = new Date(
|
||||
todayCopy.setDate(today.getDate() - today.getDay())
|
||||
);
|
||||
const thisWeekEnd = new Date(
|
||||
todayCopy.setDate(thisWeekStart.getDate() + 7)
|
||||
);
|
||||
const thisWeekStart = new Date(today);
|
||||
thisWeekStart.setDate(today.getDate() - today.getDay());
|
||||
const thisWeekEnd = new Date(thisWeekStart);
|
||||
thisWeekEnd.setDate(thisWeekStart.getDate() + 7);
|
||||
thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1);
|
||||
|
||||
const lastWeekStart = new Date(
|
||||
todayCopy.setDate(today.getDate() - today.getDay() - 7)
|
||||
);
|
||||
const lastWeekEnd = new Date(
|
||||
todayCopy.setDate(lastWeekStart.getDate() + 7)
|
||||
);
|
||||
const lastWeekStart = new Date(today);
|
||||
lastWeekStart.setDate(today.getDate() - today.getDay() - 7);
|
||||
const lastWeekEnd = new Date(lastWeekStart);
|
||||
lastWeekEnd.setDate(lastWeekStart.getDate() + 7);
|
||||
lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1);
|
||||
|
||||
this._ranges = {
|
||||
|
||||
@@ -24,7 +24,7 @@ class HaPanelIframe extends PolymerElement {
|
||||
|
||||
<iframe
|
||||
src="[[panel.config.url]]"
|
||||
sandbox="allow-forms allow-popups allow-pointer-lock allow-same-origin allow-scripts"
|
||||
sandbox="allow-forms allow-popups allow-pointer-lock allow-same-origin allow-scripts allow-modals"
|
||||
allowfullscreen="true"
|
||||
webkitallowfullscreen="true"
|
||||
mozallowfullscreen="true"
|
||||
|
||||
@@ -147,27 +147,21 @@ export class HaPanelLogbook extends LitElement {
|
||||
todayEnd.setDate(todayEnd.getDate() + 1);
|
||||
todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1);
|
||||
|
||||
const todayCopy = new Date(today);
|
||||
|
||||
const yesterday = new Date(todayCopy.setDate(today.getDate() - 1));
|
||||
const yesterdayEnd = new Date(yesterday);
|
||||
yesterdayEnd.setDate(yesterdayEnd.getDate() + 1);
|
||||
const yesterday = new Date(today);
|
||||
yesterday.setDate(today.getDate() - 1);
|
||||
const yesterdayEnd = new Date(today);
|
||||
yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1);
|
||||
|
||||
const thisWeekStart = new Date(
|
||||
todayCopy.setDate(today.getDate() - today.getDay())
|
||||
);
|
||||
const thisWeekEnd = new Date(
|
||||
todayCopy.setDate(thisWeekStart.getDate() + 7)
|
||||
);
|
||||
const thisWeekStart = new Date(today);
|
||||
thisWeekStart.setDate(today.getDate() - today.getDay());
|
||||
const thisWeekEnd = new Date(thisWeekStart);
|
||||
thisWeekEnd.setDate(thisWeekStart.getDate() + 7);
|
||||
thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1);
|
||||
|
||||
const lastWeekStart = new Date(
|
||||
todayCopy.setDate(today.getDate() - today.getDay() - 7)
|
||||
);
|
||||
const lastWeekEnd = new Date(
|
||||
todayCopy.setDate(lastWeekStart.getDate() + 7)
|
||||
);
|
||||
const lastWeekStart = new Date(today);
|
||||
lastWeekStart.setDate(today.getDate() - today.getDay() - 7);
|
||||
const lastWeekEnd = new Date(lastWeekStart);
|
||||
lastWeekEnd.setDate(lastWeekStart.getDate() + 7);
|
||||
lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1);
|
||||
|
||||
this._ranges = {
|
||||
|
||||
@@ -122,12 +122,14 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
|
||||
`;
|
||||
}
|
||||
|
||||
// Use `stateObj.state` as value to keep formatting (e.g trailing zeros)
|
||||
// for consistent value display across gauge, entity, entity-row, etc.
|
||||
return html`
|
||||
<ha-card @click=${this._handleClick} tabindex="0">
|
||||
<ha-gauge
|
||||
.min=${this._config.min!}
|
||||
.max=${this._config.max!}
|
||||
.value=${state}
|
||||
.value=${stateObj.state}
|
||||
.language=${this.hass!.language}
|
||||
.label=${this._config!.unit ||
|
||||
this.hass?.states[this._config!.entity].attributes
|
||||
|
||||
@@ -11,9 +11,12 @@ import {
|
||||
property,
|
||||
PropertyValues,
|
||||
TemplateResult,
|
||||
query,
|
||||
} from "lit-element";
|
||||
import { classMap } from "lit-html/directives/class-map";
|
||||
import { repeat } from "lit-html/directives/repeat";
|
||||
import { guard } from "lit-html/directives/guard";
|
||||
import { mdiDrag, mdiSort, mdiPlus, mdiNotificationClearAll } from "@mdi/js";
|
||||
import { applyThemesOnElement } from "../../../common/dom/apply_themes_on_element";
|
||||
import "../../../components/ha-card";
|
||||
import "../../../components/ha-icon";
|
||||
@@ -23,12 +26,15 @@ import {
|
||||
fetchItems,
|
||||
ShoppingListItem,
|
||||
updateItem,
|
||||
reorderItems,
|
||||
} from "../../../data/shopping-list";
|
||||
import { SubscribeMixin } from "../../../mixins/subscribe-mixin";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { LovelaceCard, LovelaceCardEditor } from "../types";
|
||||
import { SensorCardConfig, ShoppingListCardConfig } from "./types";
|
||||
|
||||
let Sortable;
|
||||
|
||||
@customElement("hui-shopping-list-card")
|
||||
class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
implements LovelaceCard {
|
||||
@@ -49,6 +55,14 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
|
||||
@internalProperty() private _checkedItems?: ShoppingListItem[];
|
||||
|
||||
@internalProperty() private _reordering = false;
|
||||
|
||||
@internalProperty() private _renderEmptySortable = false;
|
||||
|
||||
private _sortable?;
|
||||
|
||||
@query("#sortable") private _sortableEl?: HTMLElement;
|
||||
|
||||
public getCardSize(): number {
|
||||
return (this._config ? (this._config.title ? 2 : 0) : 0) + 3;
|
||||
}
|
||||
@@ -101,15 +115,15 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
})}
|
||||
>
|
||||
<div class="addRow">
|
||||
<ha-icon
|
||||
<ha-svg-icon
|
||||
class="addButton"
|
||||
icon="hass:plus"
|
||||
.path=${mdiPlus}
|
||||
.title=${this.hass!.localize(
|
||||
"ui.panel.lovelace.cards.shopping-list.add_item"
|
||||
)}
|
||||
@click=${this._addItem}
|
||||
>
|
||||
</ha-icon>
|
||||
</ha-svg-icon>
|
||||
<paper-input
|
||||
no-label-float
|
||||
class="addBox"
|
||||
@@ -118,28 +132,27 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
)}
|
||||
@keydown=${this._addKeyPress}
|
||||
></paper-input>
|
||||
<ha-svg-icon
|
||||
class="reorderButton"
|
||||
.path=${mdiSort}
|
||||
.title=${this.hass!.localize(
|
||||
"ui.panel.lovelace.cards.shopping-list.reorder_items"
|
||||
)}
|
||||
@click=${this._toggleReorder}
|
||||
>
|
||||
</ha-svg-icon>
|
||||
</div>
|
||||
${repeat(
|
||||
this._uncheckedItems!,
|
||||
(item) => item.id,
|
||||
(item) =>
|
||||
html`
|
||||
<div class="editRow">
|
||||
<paper-checkbox
|
||||
tabindex="0"
|
||||
?checked=${item.complete}
|
||||
.itemId=${item.id}
|
||||
@click=${this._completeItem}
|
||||
></paper-checkbox>
|
||||
<paper-input
|
||||
no-label-float
|
||||
.value=${item.name}
|
||||
.itemId=${item.id}
|
||||
@change=${this._saveEdit}
|
||||
></paper-input>
|
||||
${this._reordering
|
||||
? html`
|
||||
<div id="sortable">
|
||||
${guard([this._uncheckedItems, this._renderEmptySortable], () =>
|
||||
this._renderEmptySortable
|
||||
? ""
|
||||
: this._renderItems(this._uncheckedItems!)
|
||||
)}
|
||||
</div>
|
||||
`
|
||||
)}
|
||||
: this._renderItems(this._uncheckedItems!)}
|
||||
${this._checkedItems!.length > 0
|
||||
? html`
|
||||
<div class="divider"></div>
|
||||
@@ -149,16 +162,16 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
"ui.panel.lovelace.cards.shopping-list.checked_items"
|
||||
)}
|
||||
</span>
|
||||
<ha-icon
|
||||
<ha-svg-icon
|
||||
class="clearall"
|
||||
tabindex="0"
|
||||
icon="hass:notification-clear-all"
|
||||
.path=${mdiNotificationClearAll}
|
||||
.title=${this.hass!.localize(
|
||||
"ui.panel.lovelace.cards.shopping-list.clear_items"
|
||||
)}
|
||||
@click=${this._clearItems}
|
||||
>
|
||||
</ha-icon>
|
||||
</ha-svg-icon>
|
||||
</div>
|
||||
${repeat(
|
||||
this._checkedItems!,
|
||||
@@ -187,6 +200,44 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
`;
|
||||
}
|
||||
|
||||
private _renderItems(items: ShoppingListItem[]) {
|
||||
return html`
|
||||
${repeat(
|
||||
items,
|
||||
(item) => item.id,
|
||||
(item) =>
|
||||
html`
|
||||
<div class="editRow" item-id=${item.id}>
|
||||
<paper-checkbox
|
||||
tabindex="0"
|
||||
?checked=${item.complete}
|
||||
.itemId=${item.id}
|
||||
@click=${this._completeItem}
|
||||
></paper-checkbox>
|
||||
<paper-input
|
||||
no-label-float
|
||||
.value=${item.name}
|
||||
.itemId=${item.id}
|
||||
@change=${this._saveEdit}
|
||||
></paper-input>
|
||||
${this._reordering
|
||||
? html`
|
||||
<ha-svg-icon
|
||||
.title=${this.hass!.localize(
|
||||
"ui.panel.lovelace.cards.shopping-list.drag_and_drop"
|
||||
)}
|
||||
class="reorderButton"
|
||||
.path=${mdiDrag}
|
||||
>
|
||||
</ha-svg-icon>
|
||||
`
|
||||
: ""}
|
||||
</div>
|
||||
`
|
||||
)}
|
||||
`;
|
||||
}
|
||||
|
||||
private async _fetchData(): Promise<void> {
|
||||
if (!this.hass) {
|
||||
return;
|
||||
@@ -248,6 +299,54 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
}
|
||||
}
|
||||
|
||||
private async _toggleReorder() {
|
||||
if (!Sortable) {
|
||||
const sortableImport = await import(
|
||||
"sortablejs/modular/sortable.core.esm"
|
||||
);
|
||||
Sortable = sortableImport.Sortable;
|
||||
}
|
||||
this._reordering = !this._reordering;
|
||||
await this.updateComplete;
|
||||
if (this._reordering) {
|
||||
this._createSortable();
|
||||
} else {
|
||||
this._sortable?.destroy();
|
||||
this._sortable = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
private _createSortable() {
|
||||
const sortableEl = this._sortableEl;
|
||||
this._sortable = new Sortable(sortableEl, {
|
||||
animation: 150,
|
||||
fallbackClass: "sortable-fallback",
|
||||
dataIdAttr: "item-id",
|
||||
handle: "ha-svg-icon",
|
||||
onEnd: async (evt) => {
|
||||
// Since this is `onEnd` event, it's possible that
|
||||
// an item wa dragged away and was put back to its original position.
|
||||
if (evt.oldIndex !== evt.newIndex) {
|
||||
reorderItems(this.hass!, this._sortable.toArray()).catch(() =>
|
||||
this._fetchData()
|
||||
);
|
||||
// Move the shopping list item in memory.
|
||||
this._uncheckedItems!.splice(
|
||||
evt.newIndex,
|
||||
0,
|
||||
this._uncheckedItems!.splice(evt.oldIndex, 1)[0]
|
||||
);
|
||||
}
|
||||
this._renderEmptySortable = true;
|
||||
await this.updateComplete;
|
||||
while (sortableEl?.lastElementChild) {
|
||||
sortableEl.removeChild(sortableEl.lastElementChild);
|
||||
}
|
||||
this._renderEmptySortable = false;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
static get styles(): CSSResult {
|
||||
return css`
|
||||
ha-card {
|
||||
@@ -278,6 +377,11 @@ class HuiShoppingListCard extends SubscribeMixin(LitElement)
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.reorderButton {
|
||||
padding-left: 16px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
paper-checkbox {
|
||||
padding-left: 4px;
|
||||
padding-right: 20px;
|
||||
|
||||
@@ -4,6 +4,7 @@ import { forwardHaptic } from "../../../data/haptics";
|
||||
import { ActionConfig } from "../../../data/lovelace";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { toggleEntity } from "./entity/toggle-entity";
|
||||
import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
|
||||
|
||||
declare global {
|
||||
interface HASSDomEvents {
|
||||
@@ -11,7 +12,7 @@ declare global {
|
||||
}
|
||||
}
|
||||
|
||||
export const handleAction = (
|
||||
export const handleAction = async (
|
||||
node: HTMLElement,
|
||||
hass: HomeAssistant,
|
||||
config: {
|
||||
@@ -22,7 +23,7 @@ export const handleAction = (
|
||||
double_tap_action?: ActionConfig;
|
||||
},
|
||||
action: string
|
||||
): void => {
|
||||
): Promise<void> => {
|
||||
let actionConfig: ActionConfig | undefined;
|
||||
|
||||
if (action === "double_tap" && config.double_tap_action) {
|
||||
@@ -39,64 +40,78 @@ export const handleAction = (
|
||||
};
|
||||
}
|
||||
|
||||
if (
|
||||
actionConfig.confirmation &&
|
||||
(!actionConfig.confirmation.exemptions ||
|
||||
!actionConfig.confirmation.exemptions.some(
|
||||
(e) => e.user === hass!.user!.id
|
||||
))
|
||||
) {
|
||||
forwardHaptic("warning");
|
||||
const actionConfigs =
|
||||
actionConfig.action === "multiple"
|
||||
? Array.isArray(actionConfig.actions)
|
||||
? actionConfig.actions
|
||||
: [actionConfig.actions]
|
||||
: [actionConfig];
|
||||
|
||||
for await (actionConfig of actionConfigs) {
|
||||
if (
|
||||
!confirm(
|
||||
actionConfig.confirmation.text ||
|
||||
`Are you sure you want to ${actionConfig.action}?`
|
||||
)
|
||||
actionConfig.confirmation &&
|
||||
(!actionConfig.confirmation.exemptions ||
|
||||
!actionConfig.confirmation.exemptions.some(
|
||||
(e) => e.user === hass!.user!.id
|
||||
))
|
||||
) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
forwardHaptic("warning");
|
||||
|
||||
switch (actionConfig.action) {
|
||||
case "more-info": {
|
||||
if (config.entity || config.camera_image) {
|
||||
fireEvent(node, "hass-more-info", {
|
||||
entityId: config.entity ? config.entity : config.camera_image!,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "navigate":
|
||||
if (actionConfig.navigation_path) {
|
||||
navigate(node, actionConfig.navigation_path);
|
||||
}
|
||||
break;
|
||||
case "url": {
|
||||
if (actionConfig.url_path) {
|
||||
window.open(actionConfig.url_path);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "toggle": {
|
||||
if (config.entity) {
|
||||
toggleEntity(hass, config.entity!);
|
||||
forwardHaptic("light");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "call-service": {
|
||||
if (!actionConfig.service) {
|
||||
forwardHaptic("failure");
|
||||
if (
|
||||
!(await showConfirmationDialog(node, {
|
||||
text:
|
||||
actionConfig.confirmation.text ||
|
||||
hass.localize(
|
||||
"ui.panel.lovelace.cards.action_confirmation",
|
||||
"action",
|
||||
actionConfig.action
|
||||
),
|
||||
}))
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const [domain, service] = actionConfig.service.split(".", 2);
|
||||
hass.callService(domain, service, actionConfig.service_data);
|
||||
forwardHaptic("light");
|
||||
break;
|
||||
}
|
||||
case "fire-dom-event": {
|
||||
fireEvent(node, "ll-custom", actionConfig);
|
||||
|
||||
switch (actionConfig.action) {
|
||||
case "more-info": {
|
||||
if (config.entity || config.camera_image) {
|
||||
fireEvent(node, "hass-more-info", {
|
||||
entityId: config.entity ? config.entity : config.camera_image!,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "navigate":
|
||||
if (actionConfig.navigation_path) {
|
||||
navigate(node, actionConfig.navigation_path);
|
||||
}
|
||||
break;
|
||||
case "url": {
|
||||
if (actionConfig.url_path) {
|
||||
window.open(actionConfig.url_path);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "toggle": {
|
||||
if (config.entity) {
|
||||
toggleEntity(hass, config.entity!);
|
||||
forwardHaptic("light");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "call-service": {
|
||||
if (!actionConfig.service) {
|
||||
forwardHaptic("failure");
|
||||
return;
|
||||
}
|
||||
const [domain, service] = actionConfig.service.split(".", 2);
|
||||
hass.callService(domain, service, actionConfig.service_data);
|
||||
forwardHaptic("light");
|
||||
break;
|
||||
}
|
||||
case "fire-dom-event": {
|
||||
fireEvent(node, "ll-custom", actionConfig);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@ export const handleStructError = (err: Error): string[] => {
|
||||
for (const failure of err.failures()) {
|
||||
if (failure.type === "never") {
|
||||
errors.push(
|
||||
`Key "${failure.path[0]}" is not supported by the UI editor.`
|
||||
`Key "${failure.path.join(".")}" is not supported by the UI editor.`
|
||||
);
|
||||
} else {
|
||||
errors.push(
|
||||
|
||||
@@ -7,7 +7,7 @@ const isEntityId = (value: unknown, context: StructContext): StructResult => {
|
||||
if (!value.includes(".")) {
|
||||
return [
|
||||
context.fail({
|
||||
type: "entity id should be in the format 'domain.entity'",
|
||||
type: "Entity ID should be in the format 'domain.entity'",
|
||||
}),
|
||||
];
|
||||
}
|
||||
@@ -15,3 +15,16 @@ const isEntityId = (value: unknown, context: StructContext): StructResult => {
|
||||
};
|
||||
|
||||
export const EntityId = struct("entity-id", isEntityId);
|
||||
|
||||
const isEntityIdOrAll = (
|
||||
value: unknown,
|
||||
context: StructContext
|
||||
): StructResult => {
|
||||
if (typeof value === "string" && value === "all") {
|
||||
return true;
|
||||
}
|
||||
|
||||
return isEntityId(value, context);
|
||||
};
|
||||
|
||||
export const EntityIdOrAll = struct("entity-id-all", isEntityIdOrAll);
|
||||
|
||||
@@ -130,6 +130,15 @@ export class HuiActionEditor extends LitElement {
|
||||
</b>
|
||||
`
|
||||
: ""}
|
||||
${this.config?.action === "multiple"
|
||||
? html`
|
||||
<b>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.lovelace.editor.action-editor.editor_multiple_actions"
|
||||
)}
|
||||
</b>
|
||||
`
|
||||
: ""}
|
||||
`;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +164,8 @@ class HuiGenericEntityRow extends LitElement {
|
||||
}
|
||||
.info {
|
||||
margin-left: 16px;
|
||||
flex: 1 0 60px;
|
||||
margin-right: 8px;
|
||||
flex: 1 0 30%;
|
||||
}
|
||||
.info,
|
||||
.info > * {
|
||||
@@ -181,7 +182,6 @@ class HuiGenericEntityRow extends LitElement {
|
||||
}
|
||||
.secondary,
|
||||
ha-relative-time {
|
||||
display: block;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
state-badge {
|
||||
|
||||
@@ -57,7 +57,9 @@ class HuiTimestampDisplay extends LitElement {
|
||||
}
|
||||
|
||||
if (isNaN(this.ts.getTime())) {
|
||||
return html` Invalid date `;
|
||||
return html`${this.hass.localize(
|
||||
"ui.panel.lovelace.components.timestamp-display.invalid"
|
||||
)}`;
|
||||
}
|
||||
|
||||
const format = this._format;
|
||||
@@ -68,7 +70,9 @@ class HuiTimestampDisplay extends LitElement {
|
||||
if (format in FORMATS) {
|
||||
return html` ${FORMATS[format](this.ts, this.hass.language)} `;
|
||||
}
|
||||
return html` Invalid format `;
|
||||
return html`${this.hass.localize(
|
||||
"ui.panel.lovelace.components.timestamp-display.invalid_format"
|
||||
)}`;
|
||||
}
|
||||
|
||||
protected updated(changedProperties: PropertyValues): void {
|
||||
|
||||
@@ -71,7 +71,7 @@ const DOMAIN_TO_ELEMENT_TYPE = {
|
||||
switch: "toggle",
|
||||
vacuum: "toggle",
|
||||
// Temporary. Once climate is rewritten,
|
||||
// water heater should get it's own row.
|
||||
// water heater should get its own row.
|
||||
water_heater: "climate",
|
||||
input_datetime: "input-datetime",
|
||||
weather: "weather",
|
||||
|
||||
@@ -46,6 +46,7 @@ const actions = [
|
||||
"url",
|
||||
"call-service",
|
||||
"none",
|
||||
"multiple",
|
||||
];
|
||||
|
||||
@customElement("hui-button-card-editor")
|
||||
@@ -115,7 +116,7 @@ export class HuiButtonCardEditor extends LitElement
|
||||
.label="${this.hass.localize(
|
||||
"ui.panel.lovelace.editor.card.generic.entity"
|
||||
)} (${this.hass.localize(
|
||||
"ui.panel.lovelace.editor.card.config.required"
|
||||
"ui.panel.lovelace.editor.card.config.optional"
|
||||
)})"
|
||||
.hass=${this.hass}
|
||||
.value=${this._entity}
|
||||
|
||||
@@ -82,6 +82,7 @@ export class HuiLightCardEditor extends LitElement
|
||||
"url",
|
||||
"call-service",
|
||||
"none",
|
||||
"multiple",
|
||||
];
|
||||
|
||||
return html`
|
||||
|
||||
@@ -60,7 +60,7 @@ export class HuiPictureCardEditor extends LitElement
|
||||
return html``;
|
||||
}
|
||||
|
||||
const actions = ["navigate", "url", "call-service", "none"];
|
||||
const actions = ["navigate", "url", "call-service", "none", "multiple"];
|
||||
|
||||
return html`
|
||||
<div class="card-config">
|
||||
|
||||
@@ -104,7 +104,14 @@ export class HuiPictureEntityCardEditor extends LitElement
|
||||
return html``;
|
||||
}
|
||||
|
||||
const actions = ["more-info", "toggle", "navigate", "call-service", "none"];
|
||||
const actions = [
|
||||
"more-info",
|
||||
"toggle",
|
||||
"navigate",
|
||||
"call-service",
|
||||
"none",
|
||||
"multiple",
|
||||
];
|
||||
const views = ["auto", "live"];
|
||||
const dir = computeRTLDirection(this.hass!);
|
||||
|
||||
|
||||
@@ -108,7 +108,14 @@ export class HuiPictureGlanceCardEditor extends LitElement
|
||||
return html``;
|
||||
}
|
||||
|
||||
const actions = ["more-info", "toggle", "navigate", "call-service", "none"];
|
||||
const actions = [
|
||||
"more-info",
|
||||
"toggle",
|
||||
"navigate",
|
||||
"call-service",
|
||||
"none",
|
||||
"multiple",
|
||||
];
|
||||
const views = ["auto", "live"];
|
||||
|
||||
return html`
|
||||
|
||||
@@ -98,6 +98,7 @@ export const actionConfigStruct = object({
|
||||
url_path: optional(string()),
|
||||
service: optional(string()),
|
||||
service_data: optional(object()),
|
||||
actions: optional(array()),
|
||||
});
|
||||
|
||||
const buttonEntitiesRowConfigStruct = object({
|
||||
|
||||
@@ -48,9 +48,9 @@ export class HuiServiceButtonElement extends LitElement
|
||||
return html`
|
||||
<ha-call-service-button
|
||||
.hass=${this.hass}
|
||||
.domain="${this._domain}"
|
||||
.service="${this._service}"
|
||||
.serviceData="${this._config.service_data}"
|
||||
.domain=${this._domain}
|
||||
.service=${this._service}
|
||||
.serviceData=${this._config.service_data}
|
||||
>${this._config.title}</ha-call-service-button
|
||||
>
|
||||
`;
|
||||
|
||||
@@ -25,7 +25,7 @@ import { handleAction } from "../common/handle-action";
|
||||
import { UNAVAILABLE_STATES } from "../../../data/entity";
|
||||
|
||||
interface SensorEntityConfig extends EntitiesCardEntityConfig {
|
||||
format?: "relative" | "date" | "time" | "datetime";
|
||||
format?: "relative" | "total" | "date" | "time" | "datetime";
|
||||
}
|
||||
|
||||
@customElement("hui-sensor-entity-row")
|
||||
|
||||
@@ -173,8 +173,8 @@ class LovelaceFullConfigEditor extends LitElement {
|
||||
text: this.hass.localize(
|
||||
"ui.panel.lovelace.editor.raw_editor.confirm_unsaved_changes"
|
||||
),
|
||||
dismissText: this.hass!.localize("ui.common.leave"),
|
||||
confirmText: this.hass!.localize("ui.common.stay"),
|
||||
dismissText: this.hass!.localize("ui.common.stay"),
|
||||
confirmText: this.hass!.localize("ui.common.leave"),
|
||||
}))
|
||||
) {
|
||||
return;
|
||||
|
||||
@@ -33,7 +33,8 @@ export default <T extends Constructor<HassBaseEl>>(superClass: T) =>
|
||||
duration: 0,
|
||||
dismissable: false,
|
||||
action: {
|
||||
text: this.hass!.localize("ui.notification_toast.dismiss"),
|
||||
text:
|
||||
this.hass!.localize("ui.notification_toast.dismiss") || "Dismiss",
|
||||
action: () => {},
|
||||
},
|
||||
});
|
||||
|
||||
+28
-13
@@ -291,7 +291,8 @@
|
||||
"successfully_saved": "Successfully saved",
|
||||
"successfully_deleted": "Successfully deleted",
|
||||
"error_required": "Required",
|
||||
"copied": "Copied"
|
||||
"copied": "Copied",
|
||||
"copied_clipboard": "Copied to clipboard"
|
||||
},
|
||||
"components": {
|
||||
"logbook": {
|
||||
@@ -854,7 +855,7 @@
|
||||
"new_tag": "New tag",
|
||||
"name": "Name",
|
||||
"description": "Description",
|
||||
"tag_id": "Tag id",
|
||||
"tag_id": "Tag ID",
|
||||
"tag_id_placeholder": "Autogenerated when left empty",
|
||||
"delete": "Delete",
|
||||
"update": "Update",
|
||||
@@ -1049,7 +1050,7 @@
|
||||
"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.",
|
||||
"reload": "Reload {domain}",
|
||||
"core": "Reload location & customizations",
|
||||
"group": "Reload groups, group entities, and notify services",
|
||||
"group": "Reload groups, group entities, and group notify services",
|
||||
"automation": "Reload automations",
|
||||
"script": "Reload scripts",
|
||||
"scene": "Reload scenes",
|
||||
@@ -1062,7 +1063,7 @@
|
||||
"input_select": "Reload input selects",
|
||||
"template": "Reload template entities",
|
||||
"universal": "Reload universal media player entities",
|
||||
"rest": "Reload rest entities and notify services",
|
||||
"rest": "Reload rest entities, and rest notify services",
|
||||
"command_line": "Reload command line entities",
|
||||
"filter": "Reload filter entities",
|
||||
"statistics": "Reload statistics entities",
|
||||
@@ -1148,7 +1149,7 @@
|
||||
},
|
||||
"editor": {
|
||||
"enable_disable": "Enable/Disable automation",
|
||||
"introduction": "Use automations to bring your home to live.",
|
||||
"introduction": "Use automations to bring your home to life.",
|
||||
"default_name": "New Automation",
|
||||
"load_error_not_editable": "Only automations in automations.yaml are editable.",
|
||||
"load_error_unknown": "Error loading automation ({err_no}).",
|
||||
@@ -1472,12 +1473,14 @@
|
||||
"confirm_delete_text": "Are you sure you want to delete this blueprint?",
|
||||
"add_blueprint": "Import blueprint",
|
||||
"use_blueprint": "Create automation",
|
||||
"delete_blueprint": "Delete blueprint"
|
||||
"delete_blueprint": "Delete blueprint",
|
||||
"discover_more": "Discover more blueprints"
|
||||
},
|
||||
"add": {
|
||||
"header": "Import a blueprint",
|
||||
"import_header": "Blueprint \"{name}\"",
|
||||
"import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.",
|
||||
"import_introduction_link": "You can import blueprints of other users from Github and the {community_link}. Enter the URL of the blueprint below.",
|
||||
"community_forums": "community forums",
|
||||
"url": "URL of the blueprint",
|
||||
"raw_blueprint": "Blueprint content",
|
||||
"importing": "Loading blueprint...",
|
||||
@@ -1560,7 +1563,7 @@
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"introduction": "Use scenes to bring your home to live.",
|
||||
"introduction": "Use scenes to bring your home to life.",
|
||||
"default_name": "New Scene",
|
||||
"load_error_not_editable": "Only scenes in scenes.yaml are editable.",
|
||||
"load_error_unknown": "Error loading scene ({err_no}).",
|
||||
@@ -1825,8 +1828,7 @@
|
||||
"area": "Area",
|
||||
"integration": "Integration",
|
||||
"battery": "Battery",
|
||||
"no_devices": "No devices",
|
||||
"no_area": "No area"
|
||||
"no_devices": "No devices"
|
||||
},
|
||||
"delete": "Delete",
|
||||
"confirm_delete": "Are you sure you want to delete this device?",
|
||||
@@ -2269,7 +2271,9 @@
|
||||
},
|
||||
"visualization": {
|
||||
"header": "Network Visualization",
|
||||
"caption": "Visualization"
|
||||
"caption": "Visualization",
|
||||
"highlight_label": "Highlight Devices",
|
||||
"zoom_label": "Zoom To Device"
|
||||
},
|
||||
"group_binding": {
|
||||
"header": "Group Binding",
|
||||
@@ -2388,6 +2392,7 @@
|
||||
"lovelace": {
|
||||
"cards": {
|
||||
"confirm_delete": "Are you sure you want to delete this card?",
|
||||
"action_confirmation": "Are you sure you want to exectue action \"{action}\"?",
|
||||
"empty_state": {
|
||||
"title": "Welcome Home",
|
||||
"no_devices": "This page allows you to control your devices, however it looks like you have no devices set up yet. Head to the integrations page to get started.",
|
||||
@@ -2399,7 +2404,9 @@
|
||||
"shopping-list": {
|
||||
"checked_items": "Checked items",
|
||||
"clear_items": "Clear checked items",
|
||||
"add_item": "Add item"
|
||||
"add_item": "Add item",
|
||||
"reorder_items": "Reorder items",
|
||||
"drag_and_drop": "Drag and drop"
|
||||
},
|
||||
"picture-elements": {
|
||||
"hold": "Hold:",
|
||||
@@ -2557,6 +2564,7 @@
|
||||
"action-editor": {
|
||||
"navigation_path": "Navigation Path",
|
||||
"url_path": "URL Path",
|
||||
"editor_multiple_actions": "Multiple actions can only be entered in the code editor",
|
||||
"editor_service_data": "Service data can only be entered in the code editor",
|
||||
"actions": {
|
||||
"default_action": "Default Action",
|
||||
@@ -2565,7 +2573,8 @@
|
||||
"toggle": "Toggle",
|
||||
"navigate": "Navigate",
|
||||
"url": "URL",
|
||||
"none": "No Action"
|
||||
"none": "No Action",
|
||||
"multiple": "Multiple actions"
|
||||
}
|
||||
},
|
||||
"card": {
|
||||
@@ -2832,6 +2841,12 @@
|
||||
"changed_toast": {
|
||||
"message": "The Lovelace UI configuration for this dashboard was updated. Refresh to see changes?"
|
||||
},
|
||||
"components": {
|
||||
"timestamp-display": {
|
||||
"invalid": "Invalid timestamp",
|
||||
"invalid_format": "Invalid display format"
|
||||
}
|
||||
},
|
||||
"reload_lovelace": "Reload UI"
|
||||
},
|
||||
"mailbox": {
|
||||
|
||||
@@ -9,6 +9,9 @@
|
||||
"bg": {
|
||||
"nativeName": "Български"
|
||||
},
|
||||
"bn": {
|
||||
"nativeName": "বাংলা"
|
||||
},
|
||||
"bs": {
|
||||
"nativeName": "Bosanski"
|
||||
},
|
||||
|
||||
@@ -437,6 +437,7 @@
|
||||
"add_new": "إضافة منطقة جديدة ...",
|
||||
"area": "المنطقة",
|
||||
"clear": "مسح",
|
||||
"no_match": "لم يتم العثور على مناطق مطابقة",
|
||||
"show_areas": "إظهار المناطق"
|
||||
},
|
||||
"data-table": {
|
||||
@@ -449,6 +450,7 @@
|
||||
},
|
||||
"device-picker": {
|
||||
"no_area": "لا مجال",
|
||||
"no_match": "لم يتم العثور على أجهزة مطابقة",
|
||||
"toggle": "تبديل"
|
||||
},
|
||||
"entity": {
|
||||
|
||||
+1119
-143
File diff suppressed because it is too large
Load Diff
+123
-49
@@ -2,11 +2,13 @@
|
||||
"config_entry": {
|
||||
"disabled_by": {
|
||||
"config_entry": "Entrada de configuració",
|
||||
"device": "Dispositiu",
|
||||
"integration": "Integració",
|
||||
"user": "Usuari"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"owner": "Propietari",
|
||||
"system-admin": "Administradors",
|
||||
"system-read-only": "Usuaris de només lectura",
|
||||
"system-users": "Usuaris"
|
||||
@@ -545,12 +547,14 @@
|
||||
"add_new": "Afegir àrea nova...",
|
||||
"area": "Àrea",
|
||||
"clear": "Esborra",
|
||||
"no_areas": "No tens cap àrea",
|
||||
"no_match": "No s'han trobat àrees coincidents",
|
||||
"show_areas": "Mostra àrees"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
"add_user": "Afegeix usuari",
|
||||
"remove_user": "Elimina usuari",
|
||||
"select_blueprint": "Selecciona un plànol"
|
||||
"select_blueprint": "Selecciona un blueprint"
|
||||
},
|
||||
"data-table": {
|
||||
"no-data": "No hi ha dades",
|
||||
@@ -565,6 +569,8 @@
|
||||
"clear": "Esborra",
|
||||
"device": "Dispositiu",
|
||||
"no_area": "Sense àrees",
|
||||
"no_devices": "No tens cap dispositiu",
|
||||
"no_match": "No s'han trobat dispositius coincidents",
|
||||
"show_devices": "Mostra dispositius",
|
||||
"toggle": "Commuta"
|
||||
},
|
||||
@@ -576,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Esborra",
|
||||
"entity": "Entitat",
|
||||
"no_match": "No s'han trobat entitats coincidents",
|
||||
"show_entities": "Mostra entitats"
|
||||
}
|
||||
},
|
||||
@@ -709,6 +716,16 @@
|
||||
"service-picker": {
|
||||
"service": "Servei"
|
||||
},
|
||||
"target-picker": {
|
||||
"add_area_id": "Selecciona àrea",
|
||||
"add_device_id": "Selecciona dispositiu",
|
||||
"add_entity_id": "Selecciona entitat",
|
||||
"expand_area_id": "Expandeix aquesta àrea en els dispositius i entitats que conté. Després d'expandir-la, no s'actualitzaran els dispositius i les entitats quan l'àrea canviï.",
|
||||
"expand_device_id": "Expandeix aquest dispositiu en entitats separades. Després d'expandir-lo, no s'actualitzaran les entitats quan el dispositiu canviï.",
|
||||
"remove_area_id": "Elimina àrea",
|
||||
"remove_device_id": "Elimina dispositiu",
|
||||
"remove_entity_id": "Elimina entitat"
|
||||
},
|
||||
"user-picker": {
|
||||
"add_user": "Afegeix usuari",
|
||||
"no_user": "Cap usuari",
|
||||
@@ -732,6 +749,7 @@
|
||||
"editor": {
|
||||
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
|
||||
"delete": "Elimina",
|
||||
"device_disabled": "El dispositiu d'aquesta entitat està desactivat.",
|
||||
"enabled_cause": "Desactivada per {cause}.",
|
||||
"enabled_delay_confirm": "Les entitats activades s'afegiran a Home Assistant d'aquí a {delay} segons",
|
||||
"enabled_description": "Les entitats desactivades no s'afegiran a Home Assistant.",
|
||||
@@ -742,6 +760,7 @@
|
||||
"icon_error": "Els icones han de tenir el format 'prefix:nom_icona', per exemple: 'mdi:home'",
|
||||
"name": "Nom",
|
||||
"note": "Nota: podria no funcionar amb alguna de les integracions.",
|
||||
"open_device_settings": "Obre la configuració del dispositiu",
|
||||
"unavailable": "Aquesta entitat no està disponible actualment.",
|
||||
"update": "Actualitza"
|
||||
},
|
||||
@@ -882,7 +901,7 @@
|
||||
"navigation": {
|
||||
"areas": "Àrees",
|
||||
"automation": "Automatització",
|
||||
"blueprint": "Plànols",
|
||||
"blueprint": "Blueprints",
|
||||
"core": "General",
|
||||
"customize": "Personalització",
|
||||
"devices": "Dispositius",
|
||||
@@ -1029,7 +1048,7 @@
|
||||
"confirmation_text": "Tots els dispositius d'aquesta àrea quedaran sense assignar.",
|
||||
"confirmation_title": "Estàs segur que vols eliminar aquesta àrea?"
|
||||
},
|
||||
"description": "Gestiona les àrees de la casa",
|
||||
"description": "Agrupa dispositius i entitats en àrees",
|
||||
"editor": {
|
||||
"area_id": "ID d'àrea",
|
||||
"create": "Crea",
|
||||
@@ -1051,10 +1070,10 @@
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automatització",
|
||||
"description": "Gestiona les automatitzacions",
|
||||
"description": "Crea regles de comportament personalitzades per a casa teva",
|
||||
"dialog_new": {
|
||||
"blueprint": {
|
||||
"use_blueprint": "Utilitza un plànol"
|
||||
"use_blueprint": "Utilitza un blueprint"
|
||||
},
|
||||
"header": "Creació d'una nova automatització",
|
||||
"how": "Com vols crear la nova automatització?",
|
||||
@@ -1147,12 +1166,12 @@
|
||||
},
|
||||
"alias": "Nom",
|
||||
"blueprint": {
|
||||
"blueprint_to_use": "Plànol a utilitzar",
|
||||
"header": "Plànol",
|
||||
"blueprint_to_use": "Blueprint a utilitzar",
|
||||
"header": "Blueprint",
|
||||
"inputs": "Entrades",
|
||||
"manage_blueprints": "Gestiona els plànols",
|
||||
"no_blueprints": "No tens plànols",
|
||||
"no_inputs": "Aquest plànol no té entrades."
|
||||
"manage_blueprints": "Gestiona els blueprints",
|
||||
"no_blueprints": "No tens blueprints",
|
||||
"no_inputs": "Aquest blueprint no té entrades."
|
||||
},
|
||||
"conditions": {
|
||||
"add": "Afegir condició",
|
||||
@@ -1239,7 +1258,7 @@
|
||||
"edit_ui": "Edita a través d'interfície",
|
||||
"edit_yaml": "Edita com a YAML",
|
||||
"enable_disable": "Activa/desactiva automatització",
|
||||
"introduction": "Utilitza les automatitzacions per donar més vida a la teva casa",
|
||||
"introduction": "Utilitza les automatitzacions per donar vida a casa teva.",
|
||||
"load_error_not_editable": "Només es poden editar les automatitzacions de l'arxiu automations.yaml.",
|
||||
"load_error_unknown": "Error en carregar l'automatització ({err_no}).",
|
||||
"max": {
|
||||
@@ -1398,29 +1417,38 @@
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"error_no_url": "Introdueix l'URL del plànol.",
|
||||
"header": "Afegiu plànol nou",
|
||||
"import_btn": "Importa plànol",
|
||||
"import_header": "Importa {name} ({domain})",
|
||||
"import_introduction": "Pots importar plànols d'altres usuaris des de Github i els fòrums de la comunitat. Introdueix, a sota, l'URL del plànol.",
|
||||
"importing": "Important plànol",
|
||||
"save_btn": "Desa plànol",
|
||||
"saving": "Desant plànol...",
|
||||
"unsupported_blueprint": "Aquest plànols no és compatible",
|
||||
"url": "URL del plànol"
|
||||
"community_forums": "fòrums de la comunitat",
|
||||
"error_no_url": "Introdueix l'URL del blueprint.",
|
||||
"file_name": "Directori del blueprint",
|
||||
"header": "Importa un blueprint nou",
|
||||
"import_btn": "Vista prèvia del blueprint",
|
||||
"import_header": "Blueprint \"{name}\"",
|
||||
"import_introduction": "Pots importar blueprints d'altres usuaris des de Github i els fòrums de la comunitat. Introdueix, a sota, l'URL del blueprint.",
|
||||
"import_introduction_link": "Pots importar blueprints d'altres usuaris des de Github i des dels {community_link}. Introdueix, a sota, l'URL del blueprint.",
|
||||
"importing": "Carregant blueprint...",
|
||||
"raw_blueprint": "Contingut del blueprint",
|
||||
"save_btn": "Importa blueprint",
|
||||
"saving": "Important blueprint...",
|
||||
"unsupported_blueprint": "Aquest blueprint no és compatible",
|
||||
"url": "URL del blueprint"
|
||||
},
|
||||
"caption": "Plànols",
|
||||
"description": "Gestiona els plànols",
|
||||
"caption": "Blueprints",
|
||||
"description": "Gestiona els blueprints",
|
||||
"overview": {
|
||||
"add_blueprint": "Afegiu plànol",
|
||||
"confirm_delete_header": "Eliminar aquest plànol?",
|
||||
"confirm_delete_text": "Segur que vols eliminar aquest plànol?",
|
||||
"header": "Editor de plànols",
|
||||
"add_blueprint": "Importa blueprint",
|
||||
"confirm_delete_header": "Eliminar aquest blueprint?",
|
||||
"confirm_delete_text": "Segur que vols eliminar aquest blueprint?",
|
||||
"delete_blueprint": "Elimina blueprint",
|
||||
"discover_more": "Descobreix més blueprints",
|
||||
"header": "Editor de blueprints",
|
||||
"headers": {
|
||||
"domain": "Domini",
|
||||
"file_name": "Nom de l'arxiu",
|
||||
"name": "Nom"
|
||||
},
|
||||
"introduction": "L'editor de plànols et permet crear i editar plànols.",
|
||||
"learn_more": "Més informació sobre els plànols"
|
||||
"introduction": "La configuració dels blueprints et permet importar-ne i gestionar-los.",
|
||||
"learn_more": "Més informació sobre l'ús dels blueprints",
|
||||
"use_blueprint": "Crea automatització"
|
||||
}
|
||||
},
|
||||
"cloud": {
|
||||
@@ -1503,7 +1531,7 @@
|
||||
"title": "Alexa"
|
||||
},
|
||||
"caption": "Home Assistant Cloud",
|
||||
"description_features": "Controla la casa des de fora, pots integrar Alexa i Google Assistant.",
|
||||
"description_features": "Controla la casa quan siguis fora i integra-hi Alexa i Google Assistant",
|
||||
"description_login": "Sessió iniciada com a {email}",
|
||||
"description_not_login": "No has iniciat sessió",
|
||||
"dialog_certificate": {
|
||||
@@ -1598,7 +1626,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "General",
|
||||
"description": "Canvia la configuració general de Home Assistant",
|
||||
"description": "Sistema d'unitats, ubicació, zona horària i altres paràmetres generals",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -1660,6 +1688,7 @@
|
||||
"unknown_condition": "Condició desconeguda"
|
||||
},
|
||||
"create": "Crea una automatització amb el dispositiu",
|
||||
"create_disable": "No es pot crear una automatització amb dispositius desactivats",
|
||||
"no_automations": "No hi ha automatitzacions",
|
||||
"no_device_automations": "No hi ha automatitzacions disponibles per a aquest dispositiu.",
|
||||
"triggers": {
|
||||
@@ -1685,9 +1714,18 @@
|
||||
"no_devices": "Sense dispositius"
|
||||
},
|
||||
"delete": "Elimina",
|
||||
"description": "Gestiona els dispositius connectats",
|
||||
"description": "Gestiona els dispositius configurats",
|
||||
"device_info": "Informació del dispositiu",
|
||||
"device_not_found": "Dispositiu no trobat.",
|
||||
"disabled": "Desactivat",
|
||||
"disabled_by": {
|
||||
"config_entry": "Entrada de configuració",
|
||||
"integration": "Integració",
|
||||
"user": "Usuari"
|
||||
},
|
||||
"enabled_cause": "El dispositiu està desactivat per {cause}.",
|
||||
"enabled_description": "Els dispositius desactivats no es mostraran i les entitats que hi pertanyin es desactivaran i no s'afegiran a Home Assistant.",
|
||||
"enabled_label": "Activa dispositiu",
|
||||
"entities": {
|
||||
"add_entities_lovelace": "Afegeix a Lovelace",
|
||||
"disabled_entities": "+{count} {count, plural,\n one {entitat desabilitada}\n other {entitats desabilitades}\n}",
|
||||
@@ -1697,14 +1735,25 @@
|
||||
},
|
||||
"name": "Nom",
|
||||
"no_devices": "No hi ha dispositius",
|
||||
"picker": {
|
||||
"filter": {
|
||||
"filter": "Filtre",
|
||||
"hidden_devices": "{number} {number, plural,\n one {dispositiu amagat}\n other {dispositius amagats}\n}",
|
||||
"show_all": "Mostra-ho tot",
|
||||
"show_disabled": "Mostra dispositius desactivats"
|
||||
},
|
||||
"search": "Cerca dispositius"
|
||||
},
|
||||
"scene": {
|
||||
"create": "Crea una escena amb el dispositiu",
|
||||
"create_disable": "No es pot crear una escena amb dispositius desactivats",
|
||||
"no_scenes": "No hi ha escenes",
|
||||
"scenes": "Escenes"
|
||||
},
|
||||
"scenes": "Escenes",
|
||||
"script": {
|
||||
"create": "Crea un programa (script) amb el dispositiu",
|
||||
"create_disable": "No es pot crear un script amb dispositius desactivats",
|
||||
"no_scripts": "No hi ha scripts",
|
||||
"scripts": "Scripts"
|
||||
},
|
||||
@@ -1737,6 +1786,7 @@
|
||||
},
|
||||
"header": "Entitats",
|
||||
"headers": {
|
||||
"area": "Àrea",
|
||||
"entity_id": "ID de l'entitat",
|
||||
"integration": "Integració",
|
||||
"name": "Nom",
|
||||
@@ -1769,7 +1819,7 @@
|
||||
"header": "Configuració de Home Assistant",
|
||||
"helpers": {
|
||||
"caption": "Ajudants",
|
||||
"description": "Gestiona elements útils per a construir automatitzacions",
|
||||
"description": "Elements útils per a construir automatitzacions",
|
||||
"dialog": {
|
||||
"add_helper": "Afegeix ajudant",
|
||||
"add_platform": "Afegeix {platform}",
|
||||
@@ -1801,7 +1851,7 @@
|
||||
"copy_github": "Per GitHub",
|
||||
"copy_raw": "Text en brut",
|
||||
"custom_uis": "Interfícies d'usuari personalitzades:",
|
||||
"description": "Consulta informació de la teva instal·lació de Home Assistant",
|
||||
"description": "Versió, estat del sistema i enllaços a la documentació",
|
||||
"developed_by": "Desenvolupat per un munt de gent fantàstica.",
|
||||
"documentation": "Documentació",
|
||||
"frontend": "frontend-ui",
|
||||
@@ -1907,7 +1957,7 @@
|
||||
},
|
||||
"configure": "Configurar",
|
||||
"configured": "Configurades",
|
||||
"description": "Gestiona les integracions",
|
||||
"description": "Gestiona les integracions amb serveis, dispositius, ...",
|
||||
"details": "Detalls de la integració",
|
||||
"discovered": "Descobertes",
|
||||
"home_assistant_website": "lloc web de Home Assistant",
|
||||
@@ -1992,7 +2042,7 @@
|
||||
"open": "Obrir"
|
||||
}
|
||||
},
|
||||
"description": "Gestiona els teus panells Lovelace",
|
||||
"description": "Crea conjunts de panells personalitzats per controlar la teva casa",
|
||||
"resources": {
|
||||
"cant_edit_yaml": "Estàs utilitzant Lovelace en mode YAML per tant no pots gestionar els recursos des de la interfície d'usuari. Els pots gestionar des del fitxer 'configuration.yaml'.",
|
||||
"caption": "Recursos",
|
||||
@@ -2135,7 +2185,7 @@
|
||||
"refresh_node": {
|
||||
"battery_note": "Si el node funciona amb bateria, assegura't de que estigui actiu abans de continuar",
|
||||
"button": "Actualitza node",
|
||||
"complete": "Actualització del node completa",
|
||||
"complete": "Actualització del node completada",
|
||||
"description": "Això farà que OpenZWave torni a consultar el node i n'actualitzi les classes de comandes, funcions i valors.",
|
||||
"node_status": "Estat del node",
|
||||
"refreshing_description": "Actualitzant la informació del node...",
|
||||
@@ -2191,7 +2241,7 @@
|
||||
"scene": {
|
||||
"activated": "Escena {name} activada.",
|
||||
"caption": "Escenes",
|
||||
"description": "Gestiona les escenes",
|
||||
"description": "Captura els estats dels dispositius i recorda'ls més tard",
|
||||
"editor": {
|
||||
"default_name": "Nova escena",
|
||||
"devices": {
|
||||
@@ -2209,7 +2259,7 @@
|
||||
"without_device": "Entitats sense dispositiu"
|
||||
},
|
||||
"icon": "Icona",
|
||||
"introduction": "Utilitza les escenes per donar més vida a la teva llar.",
|
||||
"introduction": "Utilitza les escenes per donar més vida a la teva casa.",
|
||||
"load_error_not_editable": "Només es poden editar les escenes de l'arxiu scenes.yaml.",
|
||||
"load_error_unknown": "Error en carregar l'escena ({err_no}).",
|
||||
"name": "Nom",
|
||||
@@ -2235,7 +2285,7 @@
|
||||
},
|
||||
"script": {
|
||||
"caption": "Programació (scripts)",
|
||||
"description": "Gestiona els programes (scripts)",
|
||||
"description": "Executa una seqüència d'accions",
|
||||
"editor": {
|
||||
"alias": "Nom",
|
||||
"default_name": "Nou script",
|
||||
@@ -2346,7 +2396,7 @@
|
||||
"confirm_remove": "Estàs segur que vols eliminar l'etiqueta {tag}?",
|
||||
"confirm_remove_title": "Elimina l'etiqueta?",
|
||||
"create_automation": "Crea una automatització amb una etiqueta",
|
||||
"description": "Gestiona les etiquetes",
|
||||
"description": "Dispara automatitzacions quan una etiqueta NFC, un codi QR, etc; s'escanegi",
|
||||
"detail": {
|
||||
"companion_apps": "aplicacions de companion",
|
||||
"create": "Crea",
|
||||
@@ -2381,10 +2431,11 @@
|
||||
"username": "Nom d'usuari"
|
||||
},
|
||||
"caption": "Usuaris",
|
||||
"description": "Gestiona els usuaris",
|
||||
"description": "Gestiona els comptes d'usuari de Home Assistant",
|
||||
"editor": {
|
||||
"activate_user": "Activar usuari",
|
||||
"active": "Actiu",
|
||||
"active_tooltip": "Controla si l'usuari pot iniciar sessió",
|
||||
"admin": "Administrador",
|
||||
"caption": "Mostra usuari",
|
||||
"change_password": "Canviar contrasenya",
|
||||
@@ -2393,7 +2444,7 @@
|
||||
"delete_user": "Eliminar usuari",
|
||||
"group": "Grup",
|
||||
"id": "ID",
|
||||
"name": "Nom",
|
||||
"name": "Nom de visualització",
|
||||
"new_password": "Nova contrasenya",
|
||||
"owner": "Propietari",
|
||||
"password_changed": "La contrasenya s'ha canviat correctament",
|
||||
@@ -2401,19 +2452,24 @@
|
||||
"system_generated_users_not_editable": "No es poden actualitzar usuaris generats pel sistema.",
|
||||
"system_generated_users_not_removable": "No es poden eliminar usuaris generats pel sistema.",
|
||||
"unnamed_user": "Usuari sense nom",
|
||||
"update_user": "Actualitza"
|
||||
"update_user": "Actualitza",
|
||||
"username": "Nom d'usuari"
|
||||
},
|
||||
"picker": {
|
||||
"add_user": "Afegeix usuari",
|
||||
"headers": {
|
||||
"group": "Grup",
|
||||
"name": "Nom",
|
||||
"system": "Sistema"
|
||||
"is_active": "Actiu",
|
||||
"is_owner": "Propietari",
|
||||
"name": "Nom de visualització",
|
||||
"system": "Generat pel sistema",
|
||||
"username": "Nom d'usuari"
|
||||
}
|
||||
},
|
||||
"users_privileges_note": "El grup d'usuaris encara no està del tot acabat. L'usuari no podrà administrar la instància a través de la interfície d'usuari. Encara estem verificant tots els punts de l'API de gestió per assegurar-nos que limiten correctament l'accés als administradors."
|
||||
},
|
||||
"zha": {
|
||||
"add_device": "Afegeix dispositiu",
|
||||
"add_device_page": {
|
||||
"discovered_text": "Els dispositius apareixeran aquí un cop descoberts.",
|
||||
"discovery_text": "Els dispositius descoberts apareixeran aquí. Segueix les instruccions del/s teu/s dispositiu/s i posa el dispositiu/s en mode d'emparellament.",
|
||||
@@ -2459,6 +2515,16 @@
|
||||
"value": "Valor"
|
||||
},
|
||||
"description": "Gestiona la xarxa domòtica Zigbee (ZHA)",
|
||||
"device_pairing_card": {
|
||||
"CONFIGURED": "Configuració completada",
|
||||
"CONFIGURED_status_text": "Inicialitzant",
|
||||
"INITIALIZED": "Inicialització completada",
|
||||
"INITIALIZED_status_text": "El dispositiu està llest per a utilitzar-se",
|
||||
"INTERVIEW_COMPLETE": "Consulta completada",
|
||||
"INTERVIEW_COMPLETE_status_text": "Configurant",
|
||||
"PAIRED": "Dispositiu trobat",
|
||||
"PAIRED_status_text": "Iniciant consulta"
|
||||
},
|
||||
"devices": {
|
||||
"header": "Domòtica Zigbee (ZHA) - Dispositiu"
|
||||
},
|
||||
@@ -2474,6 +2540,7 @@
|
||||
"unbind_button_label": "Desvincula grup"
|
||||
},
|
||||
"groups": {
|
||||
"add_group": "Afegeix grup",
|
||||
"add_members": "Afegeix membres",
|
||||
"adding_members": "Afegint membres",
|
||||
"caption": "Grups",
|
||||
@@ -2516,7 +2583,11 @@
|
||||
"hint_wakeup": "Alguns dispositius com els sensors Xiaomi tenen un botó per despertar-los que pots prémer a intervals de 5 segons per mantenir-los desperts mentre hi interactues.",
|
||||
"introduction": "Executa comandes ZHA que afecten un sol dispositiu. Tria un dispositiu per veure el seu llistat de comandes disponibles."
|
||||
},
|
||||
"title": "Domòtica Zigbee (ZHA)"
|
||||
"title": "Domòtica Zigbee (ZHA)",
|
||||
"visualization": {
|
||||
"caption": "Visualització",
|
||||
"header": "Visualització de xarxa"
|
||||
}
|
||||
},
|
||||
"zone": {
|
||||
"add_zone": "Afegeix zona",
|
||||
@@ -3116,7 +3187,7 @@
|
||||
"close": "Tanca",
|
||||
"empty_config": "Comença amb un panell buit",
|
||||
"header": "Pren el control de la interfície d'usuari Lovelace",
|
||||
"para": "Aquest panell Lovelace s'està gestionant per Home Assistant. S'actualitza automàticament quan hi ha noves entitats o nous components de Lovelace disponibles. Si prens el control, aquest panell no s'actualitzarà automàticament. Sempre pots crear un nou panell a configuració i fer-hi proves.",
|
||||
"para": "Aquest panell Lovelace està gestionat per Home Assistant. S'actualitza automàticament quan hi ha noves entitats o nous components de Lovelace disponibles. Si prens el control, aquest panell no s'actualitzarà automàticament. Sempre pots crear un nou panell a configuració i fer-hi proves.",
|
||||
"para_sure": "Estàs segur que vols prendre el control de la interfície d'usuari?",
|
||||
"save": "Prendre el control",
|
||||
"yaml_config": "Per ajudar a familiaritzar-te, aquí tens la configuració actual del teu panell Lovelace:",
|
||||
@@ -3383,10 +3454,13 @@
|
||||
"change_password": {
|
||||
"confirm_new_password": "Confirmar contrasenya nova",
|
||||
"current_password": "Contrasenya actual",
|
||||
"error_new_is_old": "La contrasenya nova ha de ser diferent de la contrasenya actual",
|
||||
"error_new_mismatch": "Els valors introduïts de la nova contrasenya no coincideixen",
|
||||
"error_required": "Obligatori",
|
||||
"header": "Canvi de contrasenya",
|
||||
"new_password": "Contrasenya nova",
|
||||
"submit": "Envia"
|
||||
"submit": "Envia",
|
||||
"success": "La contrasenya s'ha canviat correctament"
|
||||
},
|
||||
"current_user": "Has iniciat la sessió com a {fullName}.",
|
||||
"customize_sidebar": {
|
||||
|
||||
@@ -547,11 +547,14 @@
|
||||
"add_new": "Přidat novou oblast ...",
|
||||
"area": "Oblast",
|
||||
"clear": "Vymazat",
|
||||
"no_areas": "Nemáte žádné oblasti",
|
||||
"no_match": "Nebyly nalezeny žádné odpovídající oblasti",
|
||||
"show_areas": "Zobrazit oblasti"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
"add_user": "Přidat uživatele",
|
||||
"remove_user": "Odebrat uživatele"
|
||||
"remove_user": "Odebrat uživatele",
|
||||
"select_blueprint": "Vyberte šablonu"
|
||||
},
|
||||
"data-table": {
|
||||
"no-data": "Žádná data",
|
||||
@@ -566,6 +569,8 @@
|
||||
"clear": "Zrušit",
|
||||
"device": "Zařízení",
|
||||
"no_area": "Žádná oblast",
|
||||
"no_devices": "Nemáte žádná zařízení",
|
||||
"no_match": "Nebyla nalezena žádná odpovídající zařízení",
|
||||
"show_devices": "Zobrazit zařízení",
|
||||
"toggle": "Přepnout"
|
||||
},
|
||||
@@ -577,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Zrušit",
|
||||
"entity": "Entita",
|
||||
"no_match": "Nebyly nalezeny žádné odpovídající entity",
|
||||
"show_entities": "Zobrazit entity"
|
||||
}
|
||||
},
|
||||
@@ -714,6 +720,8 @@
|
||||
"add_area_id": "Vyberte oblast",
|
||||
"add_device_id": "Vyberte zařízení",
|
||||
"add_entity_id": "Vyberte entitu",
|
||||
"expand_area_id": "Rozdělit tuto oblast na jednotlivá zařízení a entity, které obsahuje. Po rozdělení nebudou zařízení a entity aktualizovány, pokud dojde ke změnám oblasti.",
|
||||
"expand_device_id": "Rozdělit toto zařízení na jednotlivé entity. Po rozdělení nebudou entity aktualizovány, pokud dojde ke změnám zařízení.",
|
||||
"remove_area_id": "Odebrat oblast",
|
||||
"remove_device_id": "Odebrat zařízení",
|
||||
"remove_entity_id": "Odebrat entitu"
|
||||
@@ -893,6 +901,7 @@
|
||||
"navigation": {
|
||||
"areas": "Oblasti",
|
||||
"automation": "Automatizace",
|
||||
"blueprint": "Šablony",
|
||||
"core": "Obecné",
|
||||
"customize": "Přizpůsobení",
|
||||
"devices": "Zařízení",
|
||||
@@ -901,7 +910,7 @@
|
||||
"info": "Informace",
|
||||
"integrations": "Integrace",
|
||||
"logs": "Logy",
|
||||
"lovelace": "Lovelace Dashboardy",
|
||||
"lovelace": "Ovládací panely Lovelace",
|
||||
"navigate_to": "Přejít na {panel}",
|
||||
"navigate_to_config": "Přejít na nastavení {panel}",
|
||||
"person": "Osoby",
|
||||
@@ -964,7 +973,7 @@
|
||||
"zha_device_info": {
|
||||
"buttons": {
|
||||
"add": "Přidejte zařízení prostřednictvím tohoto zařízení",
|
||||
"clusters": "Clustery",
|
||||
"clusters": "Správa clusterů",
|
||||
"reconfigure": "Přenastavit zařízení",
|
||||
"remove": "Odebrat zařízení",
|
||||
"zigbee_information": "Podpis zařízení Zigbee"
|
||||
@@ -1039,7 +1048,7 @@
|
||||
"confirmation_text": "Všechna zařízení v této oblasti budou nastavena jako nepřiřazena.",
|
||||
"confirmation_title": "Opravdu chcete tuto oblast smazat?"
|
||||
},
|
||||
"description": "Seskupte zařízení do oblastí",
|
||||
"description": "Seskupte zařízení a entity do oblastí",
|
||||
"editor": {
|
||||
"area_id": "ID oblasti",
|
||||
"create": "VYTVOŘIT",
|
||||
@@ -1063,9 +1072,12 @@
|
||||
"caption": "Automatizace",
|
||||
"description": "Vytvořte si pro svůj domov vlastní pravidla chování",
|
||||
"dialog_new": {
|
||||
"blueprint": {
|
||||
"use_blueprint": "Použít šablonu"
|
||||
},
|
||||
"header": "Vytvoření automatizace",
|
||||
"how": "Jak chcete vytvořit svou novou automatizaci?",
|
||||
"start_empty": "Začněte s prázdnou automatizací",
|
||||
"start_empty": "Začít s prázdnou automatizací",
|
||||
"thingtalk": {
|
||||
"create": "Vytvořit",
|
||||
"header": "Popište automatizaci, kterou chcete vytvořit",
|
||||
@@ -1098,8 +1110,8 @@
|
||||
"label": "Stav"
|
||||
},
|
||||
"delay": {
|
||||
"delay": "Zpoždění",
|
||||
"label": "Zpoždění"
|
||||
"delay": "Pozdržení",
|
||||
"label": "Pozdržení"
|
||||
},
|
||||
"device_id": {
|
||||
"action": "Akce",
|
||||
@@ -1154,7 +1166,12 @@
|
||||
},
|
||||
"alias": "Název",
|
||||
"blueprint": {
|
||||
"inputs": "Vstupy"
|
||||
"blueprint_to_use": "Šablona k použití",
|
||||
"header": "Šablona",
|
||||
"inputs": "Vstupy",
|
||||
"manage_blueprints": "Správa šablon",
|
||||
"no_blueprints": "Nemáme žádné šablony",
|
||||
"no_inputs": "Šablona nemá žádné vstupy."
|
||||
},
|
||||
"conditions": {
|
||||
"add": "Přidat podmínku",
|
||||
@@ -1400,24 +1417,37 @@
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"error_no_url": "Zadejte adresu URL šablonky konfigurace",
|
||||
"header": "Přidat novou šablonku konfigurace",
|
||||
"import_btn": "Importovat šablonku konfigurace",
|
||||
"import_header": "Importovat \"{name}\" (typ: {domain})",
|
||||
"import_introduction": "Z Githubu a komunitních fór můžete importovat šablonky konfigurace sdílené ostatními uživateli. Zadejte adresu URL šablonky konfigurace.",
|
||||
"importing": "Importuje se šablonka konfigurace",
|
||||
"save_btn": "Uložit šablonku konfigurace",
|
||||
"saving": "Ukládání konfigurační šablonky",
|
||||
"url": "URL šablonky konfigurace"
|
||||
"community_forums": "komunitních fór",
|
||||
"error_no_url": "Zadejte adresu URL adresu šablony",
|
||||
"file_name": "Cesta k šabloně",
|
||||
"header": "Import šablony",
|
||||
"import_btn": "Náhled šablony",
|
||||
"import_header": "Šablona \"{name}\"",
|
||||
"import_introduction": "Můžete importovat šablony od ostatních uživatelů z GitHubu a komunitních fór. Níže zadejte URL adresu šablony.",
|
||||
"import_introduction_link": "Můžete importovat šablony od ostatních uživatelů z GitHubu a {community_link}. Níže zadejte URL adresu šablony.",
|
||||
"importing": "Načítám šablonu...",
|
||||
"raw_blueprint": "Obsah šablony",
|
||||
"save_btn": "Importovat šablonu",
|
||||
"saving": "Importuji šablonu...",
|
||||
"unsupported_blueprint": "Tato šablona není podporována.",
|
||||
"url": "URL adresa šablony"
|
||||
},
|
||||
"caption": "Šablony",
|
||||
"description": "Správa šablon",
|
||||
"overview": {
|
||||
"confirm_delete_header": "Odstranit tuto šablonku konfigurace?",
|
||||
"add_blueprint": "Import šablony",
|
||||
"confirm_delete_header": "Odstranit tuto šablonu?",
|
||||
"confirm_delete_text": "Opravdu chcete smazat tuto šablonu?",
|
||||
"delete_blueprint": "Smazat šablonu",
|
||||
"discover_more": "Objevte další šablony",
|
||||
"header": "Editor šablon",
|
||||
"headers": {
|
||||
"domain": "Doména",
|
||||
"file_name": "Název souboru",
|
||||
"name": "Jméno"
|
||||
},
|
||||
"learn_more": "Další informace o šablonkách konfigurace",
|
||||
"introduction": "Nastavení šablon vám umožňuje importovat a spravovat vaše šablony.",
|
||||
"learn_more": "Další informace o používání šablon",
|
||||
"use_blueprint": "Vytvořit automatizaci"
|
||||
}
|
||||
},
|
||||
@@ -1431,7 +1461,7 @@
|
||||
"enable_state_reporting": "Povolit hlášení stavu",
|
||||
"info": "Díky integraci Alexa pro Home Assistant Cloud budete moci ovládat všechna zařízení v Home Assistant pomocí jakéhokoli zařízení podporujícího Alexa.",
|
||||
"info_state_reporting": "Pokud povolíte hlášení stavu, Home Assistant bude posílat veškeré změny stavů všech exponovaných entit do Amazonu. Toto vám umožní sledovat aktuální stavy entity v aplikaci Alexa a použít tyto stavy k vytvoření rutin.",
|
||||
"manage_entities": "Spravovat entity",
|
||||
"manage_entities": "Správa entit",
|
||||
"state_reporting_error": "Nelze {enable_disable} hlášení stavu.",
|
||||
"sync_entities": "Synchronizovat entity",
|
||||
"sync_entities_error": "Chyba při synchronizaci entit:",
|
||||
@@ -1460,7 +1490,7 @@
|
||||
"integrations_introduction": "Integrace pro Home Assistant Cloud vám umožní připojit se ke cloudovým službám, aniž byste museli veřejně zpřístupnit vaší instanci Home Assistant na internetu.",
|
||||
"integrations_introduction2": "Na webových stránkách najdete ",
|
||||
"integrations_link_all_features": " všechny dostupné funkce",
|
||||
"manage_account": "Spravovat účet",
|
||||
"manage_account": "Správa účtu",
|
||||
"nabu_casa_account": "Účet Nabu Casa",
|
||||
"not_connected": "Není připojeno",
|
||||
"remote": {
|
||||
@@ -1501,7 +1531,7 @@
|
||||
"title": "Alexa"
|
||||
},
|
||||
"caption": "Home Assistant Cloud",
|
||||
"description_features": "Ovládejte vzdáleně, integrace s Alexou a Google Assistant.",
|
||||
"description_features": "Ovládejte, i když nejste doma, a propojte s Alexou a Google Assistantem",
|
||||
"description_login": "Přihlášen jako {email}",
|
||||
"description_not_login": "Nepřihlášen",
|
||||
"dialog_certificate": {
|
||||
@@ -1672,7 +1702,7 @@
|
||||
"caption": "Zařízení",
|
||||
"confirm_delete": "Opravdu chcete toto zařízení odstranit?",
|
||||
"confirm_rename_entity_ids": "Chcete také přejmenovat ID entit?",
|
||||
"confirm_rename_entity_ids_warning": "Žádná nastavení (např. automatizace, skripty, scény, dashboardy), která tyto entity aktuálně používá, nebudou změněna! Vše budete muset aktualizovat sami, aby se používaly nová ID entit!",
|
||||
"confirm_rename_entity_ids_warning": "Žádná nastavení (např. automatizace, skripty, scény, ovládací panely), která tyto entity aktuálně používá, nebudou změněna! Vše budete muset aktualizovat sami, aby se používaly nová ID entit!",
|
||||
"data_table": {
|
||||
"area": "Oblast",
|
||||
"battery": "Baterie",
|
||||
@@ -1684,7 +1714,7 @@
|
||||
"no_devices": "Žádná zařízení"
|
||||
},
|
||||
"delete": "Odstranit",
|
||||
"description": "Spravujte připojená zařízení",
|
||||
"description": "Správa připojených zařízení",
|
||||
"device_info": "Informace o zařízení",
|
||||
"device_not_found": "Zařízení nebylo nalezeno.",
|
||||
"disabled": "Zakázáno",
|
||||
@@ -1807,7 +1837,7 @@
|
||||
},
|
||||
"types": {
|
||||
"counter": "Počítadlo",
|
||||
"input_boolean": "Přepnout",
|
||||
"input_boolean": "Přepínač",
|
||||
"input_datetime": "Datum a/nebo čas",
|
||||
"input_number": "Číslo",
|
||||
"input_select": "Výběr",
|
||||
@@ -1863,7 +1893,7 @@
|
||||
"virtualenv": "Virtuální prostředí"
|
||||
},
|
||||
"lovelace": {
|
||||
"dashboards": "Dashboardy",
|
||||
"dashboards": "Ovládací panely",
|
||||
"mode": "Režim",
|
||||
"resources": "Zdroje"
|
||||
}
|
||||
@@ -1927,7 +1957,7 @@
|
||||
},
|
||||
"configure": "Nastavit",
|
||||
"configured": "Nastaveno",
|
||||
"description": "Spravujte integrace a jejich služby, zařízení, ...",
|
||||
"description": "Správa integrací a jejich služeb, zařízení, ...",
|
||||
"details": "Podrobnosti o integraci",
|
||||
"discovered": "Objeveno",
|
||||
"home_assistant_website": "stránky Home Assistant",
|
||||
@@ -1971,24 +2001,24 @@
|
||||
"title": "Logy"
|
||||
},
|
||||
"lovelace": {
|
||||
"caption": "Lovelace Dashboardy",
|
||||
"caption": "Ovládací panely Lovelace",
|
||||
"dashboards": {
|
||||
"cant_edit_default": "Standardní Lovelace dashboard nelze upravovat z uživatelského rozhraní. Můžete jej skrýt nastavením jiného dashboardu jako výchozího.",
|
||||
"cant_edit_yaml": "Dashboardy definované v YAML nelze upravovat z uživatelského rozhraní. Změňte je v configuration.yaml.",
|
||||
"caption": "Dashboardy",
|
||||
"cant_edit_default": "Standardní ovládací panel Lovelace nelze upravovat z uživatelského rozhraní. Můžete jej skrýt nastavením jiného ovládacího panelu jako výchozího.",
|
||||
"cant_edit_yaml": "Ovládací panely definované v YAML nelze upravovat z uživatelského rozhraní. Změňte je v configuration.yaml.",
|
||||
"caption": "Ovládací panely",
|
||||
"conf_mode": {
|
||||
"storage": "Řízeno uživatelským rozhraním",
|
||||
"yaml": "Soubor YAML"
|
||||
},
|
||||
"confirm_delete": "Opravdu chcete odstranit tento dashboard?",
|
||||
"default_dashboard": "Toto je výchozí dashboard",
|
||||
"confirm_delete": "Opravdu chcete odstranit tento ovládací panel?",
|
||||
"default_dashboard": "Toto je výchozí ovládací panel",
|
||||
"detail": {
|
||||
"create": "Vytvořit",
|
||||
"delete": "Smazat",
|
||||
"dismiss": "Zavřít",
|
||||
"edit_dashboard": "Upravit dashboard",
|
||||
"edit_dashboard": "Upravit ovládací panel",
|
||||
"icon": "Ikona",
|
||||
"new_dashboard": "Přidat nový dashboard",
|
||||
"new_dashboard": "Přidat nový ovládací panel",
|
||||
"remove_default": "Odebrat jako výchozí na tomto zařízení",
|
||||
"require_admin": "Pouze správce",
|
||||
"set_default": "Nastavit jako výchozí na tomto zařízení",
|
||||
@@ -2000,7 +2030,7 @@
|
||||
"url_error_msg": "Adresa URL by měla obsahovat - a nesmí obsahovat mezery ani speciální znaky, s výjimkou _ a -"
|
||||
},
|
||||
"picker": {
|
||||
"add_dashboard": "Přidat dashboard",
|
||||
"add_dashboard": "Přidat ovládací panel",
|
||||
"headers": {
|
||||
"conf_mode": "Metoda nastavení",
|
||||
"default": "Výchozí",
|
||||
@@ -2053,7 +2083,7 @@
|
||||
"description_publish": "Publikovat paket",
|
||||
"listening_to": "Naslouchám",
|
||||
"message_received": "Zpráva {id} přijata na {topic} v {time} :",
|
||||
"payload": "Obsah",
|
||||
"payload": "Obsah (povolena šablona)",
|
||||
"publish": "Publikovat",
|
||||
"start_listening": "Začít naslouchat",
|
||||
"stop_listening": "Přestat naslouchat",
|
||||
@@ -2082,7 +2112,7 @@
|
||||
"network": "Síť",
|
||||
"node": {
|
||||
"config": "Nastavení",
|
||||
"dashboard": "Dashboard"
|
||||
"dashboard": "Ovládací panel"
|
||||
},
|
||||
"nodes": "Uzly",
|
||||
"select_instance": "Vyberte instanci"
|
||||
@@ -2115,7 +2145,7 @@
|
||||
"node_config": {
|
||||
"header": "Nastavení uzlu",
|
||||
"help_source": "Popisy parametrů nastavení a text nápovědy poskytuje projekt OpenZWave.",
|
||||
"introduction": "Spravujte různé parametry nastavení uzlu Z-Wave.",
|
||||
"introduction": "Správa různých parametrů nastavení uzlu Z-Wave.",
|
||||
"wakeup_help": "Uzly napájené z baterie musí být vzhůru, aby mohly změnit své nastavení. Pokud uzel není vzhůru, OpenZWave se pokusí aktualizovat nastavení uzlu při příštím probuzení, což může být o několik hodin (nebo dní) později. Zařízení probudíte takto:"
|
||||
},
|
||||
"node_metadata": {
|
||||
@@ -2316,7 +2346,7 @@
|
||||
"generic": "Nově načíst entity integrace Generic IP camera",
|
||||
"generic_thermostat": "Nově načíst entity integrace Generic thermostat",
|
||||
"group": "Nově načíst skupiny, skupiny entit a notifikační služby",
|
||||
"heading": "Nastavení z YAML se načítá",
|
||||
"heading": "Nové načtení YAML konfigurace",
|
||||
"history_stats": "Nově načíst entity integrace History stats",
|
||||
"homekit": "Nově načíst entity integrace HomeKit",
|
||||
"input_boolean": "Nově načíst pomocníky - přepínače",
|
||||
@@ -2401,7 +2431,7 @@
|
||||
"username": "Uživatelské jméno"
|
||||
},
|
||||
"caption": "Uživatelé",
|
||||
"description": "Správa uživatelů",
|
||||
"description": "Správa uživatelských účtů pro Home Assistant",
|
||||
"editor": {
|
||||
"activate_user": "Aktivovat uživatele",
|
||||
"active": "Aktivní",
|
||||
@@ -2598,7 +2628,7 @@
|
||||
"value": "Hodnota",
|
||||
"wakeup_interval": "Interval probuzení"
|
||||
},
|
||||
"description": "Spravujte svou síť Z-Wave",
|
||||
"description": "Správa síťě Z-Wave",
|
||||
"learn_more": "Další informace o Z-Wave",
|
||||
"network_management": {
|
||||
"header": "Správa sítě Z-Wave",
|
||||
@@ -2737,11 +2767,11 @@
|
||||
},
|
||||
"templates": {
|
||||
"all_listeners": "Tato šablona naslouchá všem změnám stavu.",
|
||||
"description": "Šablony jsou vykreslovány pomocí Jinja2 šablonového enginu s některými specifickými rozšířeními pro Home Assistant.",
|
||||
"description": "Šablony jsou vykreslovány pomocí šablonovacího systému Jinja2 s některými specifickými rozšířeními pro Home Assistant.",
|
||||
"domain": "Doména",
|
||||
"editor": "Editor šablon",
|
||||
"entity": "Entita",
|
||||
"jinja_documentation": "Dokumentace šablony Jinja2",
|
||||
"jinja_documentation": "Dokumentace šablon Jinja2",
|
||||
"listeners": "Tato šablona naslouchá následujícím změnám stavu:",
|
||||
"no_listeners": "Tato šablona nenaslouchá žádným událostem a nebude automaticky aktualizována.",
|
||||
"reset": "Obnovit ukázkovou šablonu",
|
||||
@@ -2749,7 +2779,7 @@
|
||||
"template_extensions": "Rozšíření šablony Home Assistant",
|
||||
"time": "Tato šablona se aktualizuje na začátku každé minuty.",
|
||||
"title": "Šablony",
|
||||
"unknown_error_template": "Šablona vykreslování neznámých chyb"
|
||||
"unknown_error_template": "Neznámá chyba při vykreslení šablony"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2814,7 +2844,7 @@
|
||||
}
|
||||
},
|
||||
"changed_toast": {
|
||||
"message": "Nastavení Lovelace pro tento dashboard bylo aktualizováno. Chcete obnovit stránku?",
|
||||
"message": "Nastavení Lovelace pro tento ovládací panel bylo aktualizováno. Chcete obnovit stránku?",
|
||||
"refresh": "Obnovit"
|
||||
},
|
||||
"editor": {
|
||||
@@ -3155,17 +3185,17 @@
|
||||
"save_config": {
|
||||
"cancel": "Zahodit změnu",
|
||||
"close": "Zavřít",
|
||||
"empty_config": "Začít s prázdným dashboardem",
|
||||
"empty_config": "Začít s prázdným ovládacím panel",
|
||||
"header": "Převzít kontrolu nad vaší Lovelace UI",
|
||||
"para": "Tento dashboard momentálně spravuje Home Assistant. Je automaticky aktualizován při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás. Vždy si můžete vytvořit nový dashboard na hraní.",
|
||||
"para": "Tento ovládací panel momentálně spravuje Home Assistant. Je automaticky aktualizován při přidání nové entity nebo Lovelace komponenty. Pokud převezmete kontrolu, nebudeme již provádět změny automaticky za vás. Vždy si můžete vytvořit nový ovládací panel na hraní.",
|
||||
"para_sure": "Opravdu chcete převzít kontrolu nad uživalským rozhraním ?",
|
||||
"save": "Převzít kontrolu",
|
||||
"yaml_config": "Abyste mohli snadněji začít, zde je aktuální nastavení tohoto dashboardu:",
|
||||
"yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve svém nastavení pro tento dashboard, nebo výchozí \"ui-lovelace.yaml\".",
|
||||
"yaml_config": "Abyste mohli snadněji začít, zde je aktuální nastavení tohoto ovládacího panelu:",
|
||||
"yaml_control": "Chcete-li převzít kontrolu v režimu YAML, vytvořte soubor YAML s názvem, který jste uvedli ve svém nastavení pro tento ovládací panel, nebo výchozí \"ui-lovelace.yaml\".",
|
||||
"yaml_mode": "Používáte režim YAML, což znamená, že nemůžete změnit nastavení Lovelace z uživatelského rozhraní. Pokud chcete měnit Lovelace z uživatelského rozhraní, odstraňte \"mode: yaml\" z vašeho nastavení Lovelace v \"configuration.yaml\"."
|
||||
},
|
||||
"select_view": {
|
||||
"dashboard_label": "Dashboard",
|
||||
"dashboard_label": "Ovládací panel",
|
||||
"header": "Vyberte pohled"
|
||||
},
|
||||
"sub-element-editor": {
|
||||
@@ -3190,7 +3220,7 @@
|
||||
},
|
||||
"menu": {
|
||||
"close": "Zavřít",
|
||||
"configure_ui": "Upravit Dashboard",
|
||||
"configure_ui": "Upravit ovládací panel",
|
||||
"exit_edit_mode": "Ukončit režim úprav uživatelského rozhraní",
|
||||
"help": "Nápověda",
|
||||
"refresh": "Obnovit",
|
||||
@@ -3439,9 +3469,9 @@
|
||||
"header": "Změna pořadí a skrytí položek postranního panelu"
|
||||
},
|
||||
"dashboard": {
|
||||
"description": "Vyberte výchozí dashboard pro toto zařízení.",
|
||||
"dropdown_label": "Dashboard",
|
||||
"header": "Dashboard"
|
||||
"description": "Vyberte výchozí ovládací panel pro toto zařízení.",
|
||||
"dropdown_label": "Ovládací panel",
|
||||
"header": "Ovládací panel"
|
||||
},
|
||||
"enable_shortcuts": {
|
||||
"description": "Povolte nebo zakažte klávesové zkratky pro provádění různých akcí v uživatelském rozhraní.",
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
"config_entry": {
|
||||
"disabled_by": {
|
||||
"config_entry": "Konfigurationstilstand",
|
||||
"device": "Enhed",
|
||||
"integration": "Integration",
|
||||
"user": "Bruger"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"owner": "Ejer",
|
||||
"system-admin": "Administratorer",
|
||||
"system-read-only": "Skrivebeskyttede brugere",
|
||||
"system-users": "Brugere"
|
||||
@@ -501,6 +503,8 @@
|
||||
"continue": "Fortsæt",
|
||||
"copied": "Kopieret",
|
||||
"delete": "Slet",
|
||||
"disable": "Deaktiver",
|
||||
"enable": "Aktiver",
|
||||
"error_required": "Påkrævet",
|
||||
"loading": "Indlæser",
|
||||
"menu": "Menu",
|
||||
@@ -509,6 +513,8 @@
|
||||
"overflow_menu": "Overløbsmenu",
|
||||
"previous": "Forrige",
|
||||
"refresh": "Opdater",
|
||||
"remove": "Fjern",
|
||||
"rename": "Omdøb",
|
||||
"save": "Gem",
|
||||
"successfully_deleted": "Slettet",
|
||||
"successfully_saved": "Gemt",
|
||||
@@ -527,8 +533,14 @@
|
||||
"add_new": "Tilføj nyt område...",
|
||||
"area": "Område",
|
||||
"clear": "Ryd",
|
||||
"no_areas": "Du har ikke nogen områder",
|
||||
"no_match": "Ingen matchende områder fundet",
|
||||
"show_areas": "Vis områder"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
"add_user": "Tilføj bruger",
|
||||
"remove_user": "Fjern bruger"
|
||||
},
|
||||
"data-table": {
|
||||
"no-data": "Ingen data",
|
||||
"search": "Søg"
|
||||
@@ -542,6 +554,8 @@
|
||||
"clear": "Ryd",
|
||||
"device": "Enhed",
|
||||
"no_area": "Intet område",
|
||||
"no_devices": "Du har ingen enheder",
|
||||
"no_match": "Ingen matchende enheder fundet",
|
||||
"show_devices": "Vis enheder",
|
||||
"toggle": "Til/fra"
|
||||
},
|
||||
@@ -552,6 +566,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Ryd",
|
||||
"entity": "Entitet",
|
||||
"no_match": "Ingen matchende entiteter fundet",
|
||||
"show_entities": "Vis entiteter"
|
||||
}
|
||||
},
|
||||
@@ -618,6 +633,13 @@
|
||||
"service-picker": {
|
||||
"service": "Tjeneste"
|
||||
},
|
||||
"target-picker": {
|
||||
"add_device_id": "Vælg enhed",
|
||||
"add_entity_id": "Vælg entitet",
|
||||
"remove_area_id": "Fjern område",
|
||||
"remove_device_id": "Fjern enhed",
|
||||
"remove_entity_id": "Fjern entitet"
|
||||
},
|
||||
"user-picker": {
|
||||
"add_user": "Tilføj bruger",
|
||||
"no_user": "Ingen bruger",
|
||||
@@ -640,6 +662,7 @@
|
||||
"editor": {
|
||||
"confirm_delete": "Er du sikker på, at du vil slette denne post?",
|
||||
"delete": "Slet",
|
||||
"device_disabled": "Denne entitets enheden er deaktiveret.",
|
||||
"enabled_cause": "Deaktiveret af {cause}.",
|
||||
"enabled_description": "Deaktiverede entiteter tilføjes ikke til Home Assistant.",
|
||||
"enabled_label": "Aktivér entitet",
|
||||
@@ -648,6 +671,7 @@
|
||||
"icon_error": "Ikoner skal være i formatet 'præfiks:ikonnavn', fx. 'mdi:home'",
|
||||
"name": "Brugerdefineret navn",
|
||||
"note": "Bemærk: Dette virker muligvis ikke med alle integrationer endnu.",
|
||||
"open_device_settings": "Åbn enhedsindstillinger",
|
||||
"unavailable": "Denne entitet er ikke tilgængelig i øjeblikket.",
|
||||
"update": "Opdater"
|
||||
},
|
||||
@@ -700,6 +724,10 @@
|
||||
"yaml_not_editable": "Indstillingerne for denne entitet kan ikke redigeres fra brugerfladen. Det er kun entiteter, der er konfigureret fra brugerfladen, der kan konfigureres herfra."
|
||||
},
|
||||
"more_info_control": {
|
||||
"cover": {
|
||||
"close_cover": "Luk cover",
|
||||
"open_cover": "Åbn cover"
|
||||
},
|
||||
"details": "Detaljer",
|
||||
"dismiss": "Afvis dialog",
|
||||
"edit": "Rediger entitet",
|
||||
@@ -759,6 +787,25 @@
|
||||
"description": "Indstillingerne blev gemt."
|
||||
}
|
||||
},
|
||||
"quick-bar": {
|
||||
"commands": {
|
||||
"navigation": {
|
||||
"blueprint": "Tegninger",
|
||||
"core": "Generelt",
|
||||
"customize": "Tilpasninger",
|
||||
"entities": "Entiteter",
|
||||
"info": "Information",
|
||||
"server_control": "Serverstyring",
|
||||
"users": "Brugere",
|
||||
"zone": "Zoner"
|
||||
},
|
||||
"server_control": {
|
||||
"perform_action": "{action} server",
|
||||
"restart": "Genstart",
|
||||
"stop": "Stop"
|
||||
}
|
||||
}
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant hørte ikke noget",
|
||||
"error": "Ups, der er opstået en fejl",
|
||||
@@ -867,6 +914,20 @@
|
||||
"automation": {
|
||||
"caption": "Automatiseringer",
|
||||
"description": "Administrer automatiseringer",
|
||||
"dialog_new": {
|
||||
"blueprint": {
|
||||
"use_blueprint": "Brug en tegning"
|
||||
},
|
||||
"header": "Opret en ny automatisering",
|
||||
"how": "Hvordan vil du oprette din nye automatisering?",
|
||||
"start_empty": "Start med en tom automatisering",
|
||||
"thingtalk": {
|
||||
"create": "Opret",
|
||||
"header": "Beskriv automationen du vil lave",
|
||||
"input_label": "Hvad skal denne automation gøre?",
|
||||
"intro": "Og vi vil forsøge at skabe den for dig. For eksempel: Sluk lyset, når jeg forlader hjemmet."
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"actions": {
|
||||
"add": "Tilføj handling",
|
||||
@@ -941,6 +1002,13 @@
|
||||
"unsupported_action": "Ikke-understøttet handling: {action}"
|
||||
},
|
||||
"alias": "Navn",
|
||||
"blueprint": {
|
||||
"blueprint_to_use": "Tegninger klar til brug",
|
||||
"header": "Tegninger",
|
||||
"inputs": "Indgange",
|
||||
"manage_blueprints": "Administrer tegninger",
|
||||
"no_blueprints": "Du har ingen tegninger"
|
||||
},
|
||||
"conditions": {
|
||||
"add": "Tilføj betingelse",
|
||||
"delete": "Slet",
|
||||
@@ -1006,6 +1074,7 @@
|
||||
},
|
||||
"unsupported_condition": "Ikke-understøttet betingelse: {condition}"
|
||||
},
|
||||
"copy_to_clipboard": "Kopier til udklipsholder",
|
||||
"default_name": "Ny automatisering",
|
||||
"description": {
|
||||
"label": "Beskrivelse",
|
||||
@@ -1146,6 +1215,33 @@
|
||||
"only_editable": "Kun automatiseringer, der er defineret i 'automations.yaml', er redigerbare.",
|
||||
"pick_automation": "Vælg automatisering for at redigere",
|
||||
"show_info_automation": "Vis info om automatisering"
|
||||
},
|
||||
"thingtalk": {
|
||||
"create": "Opret automation",
|
||||
"task_selection": {
|
||||
"header": "Opret en ny automation",
|
||||
"introduction": "Skriv nedenfor, hvad denne automation skal gøre, og vi vil forsøge at konvertere den til en Home Assistant automation."
|
||||
}
|
||||
}
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"community_forums": "Fællesskabsfora",
|
||||
"file_name": "Tegningssti",
|
||||
"import_introduction": "Du kan importere skabeloner af andre brugere fra Github og {community_link} . Indtast URL'en til skabelonen nedenfor.",
|
||||
"import_introduction_link": "Du kan importere tegninger af andre brugere fra Github og {community_link} . Indtast webadressen til tegningen nedenfor.",
|
||||
"raw_blueprint": "Tegningsindhold",
|
||||
"unsupported_blueprint": "Denne tegning understøttes ikke"
|
||||
},
|
||||
"overview": {
|
||||
"add_blueprint": "Importer tegning",
|
||||
"delete_blueprint": "Slet tegning",
|
||||
"discover_more": "Find flere tegninger",
|
||||
"headers": {
|
||||
"domain": "Domæne",
|
||||
"file_name": "Filnavn"
|
||||
},
|
||||
"use_blueprint": "Opret automation"
|
||||
}
|
||||
},
|
||||
"cloud": {
|
||||
@@ -1360,13 +1456,16 @@
|
||||
"devices": {
|
||||
"automation": {
|
||||
"actions": {
|
||||
"caption": "Når noget udløses..."
|
||||
"caption": "Når noget udløses...",
|
||||
"no_actions": "Ingen handlinger",
|
||||
"unknown_action": "Ukendt handling"
|
||||
},
|
||||
"automations": "Automatiseringer",
|
||||
"conditions": {
|
||||
"caption": "Gør kun noget, hvis..."
|
||||
},
|
||||
"create": "Opret automatisering med enhed",
|
||||
"create_disable": "Kan ikke oprette automation med deaktiveret enhed",
|
||||
"no_automations": "Ingen automatiseringer",
|
||||
"no_device_automations": "Der er ingen automatiseringer til rådighed for denne enhed.",
|
||||
"triggers": {
|
||||
@@ -1391,6 +1490,15 @@
|
||||
"description": "Administrer tilsluttede enheder",
|
||||
"device_info": "Enhedsoplysninger",
|
||||
"device_not_found": "Enhed blev ikke fundet.",
|
||||
"disabled": "Deaktiveret",
|
||||
"disabled_by": {
|
||||
"config_entry": "Konfigurationsparameter",
|
||||
"integration": "Integration",
|
||||
"user": "Bruger"
|
||||
},
|
||||
"enabled_cause": "Enheden er deaktiveret pga. {cause} .",
|
||||
"enabled_description": "Deaktiverede enheder vises ikke, og entiteter, der hører til enheden, deaktiveres og tilføjes ikke til Home Assistant.",
|
||||
"enabled_label": "Aktiver enhed",
|
||||
"entities": {
|
||||
"add_entities_lovelace": "Tilføj til Lovelace",
|
||||
"disabled_entities": "+{count} {count, plural,\n one {deaktiveret entitet}\n other {deaktiverede entiteter}\n}",
|
||||
@@ -1400,14 +1508,24 @@
|
||||
},
|
||||
"name": "Navn",
|
||||
"no_devices": "Ingen enheder",
|
||||
"picker": {
|
||||
"filter": {
|
||||
"filter": "Filtrer",
|
||||
"show_all": "Vis alle",
|
||||
"show_disabled": "Vis deaktiverede enheder"
|
||||
},
|
||||
"search": "Søg efter enheder"
|
||||
},
|
||||
"scene": {
|
||||
"create": "Opret scene med enhed",
|
||||
"create_disable": "Kan ikke oprette scene med deaktiveret enhed",
|
||||
"no_scenes": "Ingen scener",
|
||||
"scenes": "Scener"
|
||||
},
|
||||
"scenes": "Scener",
|
||||
"script": {
|
||||
"create": "Opret script med enhed",
|
||||
"create_disable": "Kan ikke oprette script med deaktiveret enhed",
|
||||
"no_scripts": "Ingen scripts",
|
||||
"scripts": "Scripts"
|
||||
},
|
||||
@@ -1432,12 +1550,14 @@
|
||||
},
|
||||
"filter": {
|
||||
"filter": "Filtrer",
|
||||
"show_all": "Vis alle",
|
||||
"show_disabled": "Vis deaktiverede entiteter",
|
||||
"show_readonly": "Vis skrivebeskyttede entiteter",
|
||||
"show_unavailable": "Vis utilgængelige entiteter"
|
||||
},
|
||||
"header": "Entiteter",
|
||||
"headers": {
|
||||
"area": "Område",
|
||||
"entity_id": "Entitets-id",
|
||||
"integration": "Integration",
|
||||
"name": "Navn",
|
||||
@@ -1497,6 +1617,8 @@
|
||||
"info": {
|
||||
"built_using": "Bygget ved hjælp af",
|
||||
"caption": "Oplysninger",
|
||||
"copy_github": "Til GitHub",
|
||||
"copy_raw": "Rå tekst",
|
||||
"custom_uis": "Tilpassede brugergrænseflader:",
|
||||
"description": "Se oplysninger om din Home Assistant-installation",
|
||||
"developed_by": "Udviklet af en masse fantastiske mennesker.",
|
||||
@@ -1512,6 +1634,21 @@
|
||||
"server": "server",
|
||||
"source": "Kilde:",
|
||||
"system_health_error": "System Health-komponenten er ikke indlæst. Føj 'system_health:' til 'config.yaml'",
|
||||
"system_health": {
|
||||
"checks": {
|
||||
"homeassistant": {
|
||||
"dev": "Udvikling",
|
||||
"docker": "Docker",
|
||||
"hassio": "HassOS",
|
||||
"installation_type": "Installationstype",
|
||||
"os_version": "Styresystem version",
|
||||
"python_version": "Python version",
|
||||
"timezone": "Tidszone",
|
||||
"version": "Version"
|
||||
}
|
||||
},
|
||||
"manage": "Administrer"
|
||||
},
|
||||
"title": "Info"
|
||||
},
|
||||
"integration_panel_move": {
|
||||
@@ -1898,6 +2035,7 @@
|
||||
"editor": {
|
||||
"activate_user": "Aktivér bruger",
|
||||
"active": "Aktiv",
|
||||
"active_tooltip": "Kontrollerer, om brugeren kan logge ind",
|
||||
"admin": "Administrator",
|
||||
"caption": "Vis bruger",
|
||||
"change_password": "Skift adgangskode",
|
||||
@@ -1914,18 +2052,24 @@
|
||||
"system_generated_users_not_editable": "Systemoprettede brugere kan ikke opdateres.",
|
||||
"system_generated_users_not_removable": "Kan ikke fjerne systemgenererede brugere.",
|
||||
"unnamed_user": "Unavngiven bruger",
|
||||
"update_user": "Opdater"
|
||||
"update_user": "Opdater",
|
||||
"username": "Brugernavn"
|
||||
},
|
||||
"picker": {
|
||||
"add_user": "Tilføj bruger",
|
||||
"headers": {
|
||||
"group": "Gruppe",
|
||||
"is_active": "Aktiv",
|
||||
"is_owner": "Ejer",
|
||||
"name": "Navn",
|
||||
"system": "System"
|
||||
"system": "System",
|
||||
"username": "Brugernavn"
|
||||
}
|
||||
},
|
||||
"users_privileges_note": "Bruger-gruppen stadig under udvikling. Brugeren vil ikke være i stand til at administrere instansen via brugerfladen. Vi kigger stadig alle administrations-API-slutpunkter igennem for at sikre, at de korrekt begrænser adgangen til administratorer."
|
||||
},
|
||||
"zha": {
|
||||
"add_device": "Tilføj enhed",
|
||||
"add_device_page": {
|
||||
"discovered_text": "Enheder vil dukke op her, når de er fundet.",
|
||||
"discovery_text": "Fundne enheder vil dukke op her. Følg instruktionerne for din enhed(er) og sæt enhed(erne) i parringstilstand.",
|
||||
@@ -1971,6 +2115,16 @@
|
||||
"value": "Værdi"
|
||||
},
|
||||
"description": "Zigbee Home Automation-opsætning",
|
||||
"device_pairing_card": {
|
||||
"CONFIGURED": "Konfiguration fuldført",
|
||||
"CONFIGURED_status_text": "Initialiserer",
|
||||
"INITIALIZED": "Initialiseringen er fuldført",
|
||||
"INITIALIZED_status_text": "Enheden er klar til brug",
|
||||
"INTERVIEW_COMPLETE": "Interview fuldført",
|
||||
"INTERVIEW_COMPLETE_status_text": "Konfigurerer",
|
||||
"PAIRED": "Enhed fundet",
|
||||
"PAIRED_status_text": "Starter Interview"
|
||||
},
|
||||
"devices": {
|
||||
"header": "Zigbee Home Automation - Enhed"
|
||||
},
|
||||
@@ -1986,6 +2140,7 @@
|
||||
"unbind_button_label": "Fjern sammenføjning af gruppe"
|
||||
},
|
||||
"groups": {
|
||||
"add_group": "Tilføj gruppe",
|
||||
"add_members": "Tilføj medlemmer",
|
||||
"adding_members": "Tilføjer medlemmer",
|
||||
"caption": "Grupper",
|
||||
@@ -2028,7 +2183,11 @@
|
||||
"hint_wakeup": "Nogle enheder som Xiaomi-sensorer har en vækkeknap, som du kan trykke på med ~5 sekunders intervaller, der holder enheder vågne, mens du interagerer med dem.",
|
||||
"introduction": "Kør ZHA-kommandoer, der påvirker en enkelt enhed. Vælg en enhed for at se en liste over tilgængelige kommandoer."
|
||||
},
|
||||
"title": "Zigbee Home Automation"
|
||||
"title": "Zigbee Home Automation",
|
||||
"visualization": {
|
||||
"caption": "Visualisering",
|
||||
"header": "Netværksvisualisering"
|
||||
}
|
||||
},
|
||||
"zone": {
|
||||
"add_zone": "Tilføj zone",
|
||||
@@ -2197,6 +2356,8 @@
|
||||
"filter_attributes": "Filtrer egenskaber",
|
||||
"filter_entities": "Filtrer entiteter",
|
||||
"filter_states": "Filtrer tilstande",
|
||||
"last_changed": "Senest ændret",
|
||||
"last_updated": "Senest opdateret",
|
||||
"more_info": "Mere information",
|
||||
"no_entities": "Ingen entiteter",
|
||||
"set_state": "Sæt tilstand",
|
||||
@@ -2393,6 +2554,9 @@
|
||||
"description": "Lys-kortet giver dig mulighed for at ændre lysets lysstyrke.",
|
||||
"name": "Lys"
|
||||
},
|
||||
"logbook": {
|
||||
"name": "Logbog"
|
||||
},
|
||||
"map": {
|
||||
"dark_mode": "Mørk tilstand?",
|
||||
"default_zoom": "Standard-zoom",
|
||||
@@ -2421,7 +2585,8 @@
|
||||
},
|
||||
"picture-glance": {
|
||||
"description": "Billedblik-kortet viser et billede og den tilsvarende entitetstilstand som et ikon. Entiteterne på højre side tillader at skifte handlinger, andre viser dialogboksen for mere information.",
|
||||
"name": "Billedblik"
|
||||
"name": "Billedblik",
|
||||
"state_entity": "Entitet status"
|
||||
},
|
||||
"picture": {
|
||||
"description": "Billedkortet giver dig mulighed for at indstille et billede, der skal bruges til navigation til forskellige stier i brugerfladen eller til at kalde en tjeneste.",
|
||||
@@ -2785,10 +2950,13 @@
|
||||
"change_password": {
|
||||
"confirm_new_password": "Bekræft ny adgangskode",
|
||||
"current_password": "Nuværende adgangskode",
|
||||
"error_new_is_old": "Ny adgangskode skal være forskellig fra den aktuelle adgangskode",
|
||||
"error_new_mismatch": "Indtastede nye adgangskoder er ikke ens",
|
||||
"error_required": "Påkrævet",
|
||||
"header": "Skift adgangskode",
|
||||
"new_password": "Ny adgangskode",
|
||||
"submit": "Indsend"
|
||||
"submit": "Indsend",
|
||||
"success": "Adgangskoden blev ændret"
|
||||
},
|
||||
"current_user": "Du er logget ind som {fullName}.",
|
||||
"customize_sidebar": {
|
||||
|
||||
+174
-124
@@ -2,6 +2,7 @@
|
||||
"config_entry": {
|
||||
"disabled_by": {
|
||||
"config_entry": "Konfigurationseintrag",
|
||||
"device": "Gerät",
|
||||
"integration": "Integration",
|
||||
"user": "Benutzer"
|
||||
}
|
||||
@@ -531,7 +532,7 @@
|
||||
"stay": "Bleiben",
|
||||
"successfully_deleted": "Erfolgreich gelöscht",
|
||||
"successfully_saved": "Erfolgreich gespeichert",
|
||||
"undo": "Rückgängig machen",
|
||||
"undo": "Rückgängig",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"components": {
|
||||
@@ -546,12 +547,14 @@
|
||||
"add_new": "Neuen Bereich hinzufügen...",
|
||||
"area": "Bereich",
|
||||
"clear": "Löschen",
|
||||
"no_areas": "Du hast keine Bereiche",
|
||||
"no_match": "Keine übereinstimmende Bereiche gefunden",
|
||||
"show_areas": "Bereiche anzeigen"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
"add_user": "Benutzer hinzufügen",
|
||||
"remove_user": "Benutzer entfernen",
|
||||
"select_blueprint": "Wähle einen Bauplan aus"
|
||||
"select_blueprint": "Wähle eine Vorlage aus"
|
||||
},
|
||||
"data-table": {
|
||||
"no-data": "Keine Daten",
|
||||
@@ -566,6 +569,8 @@
|
||||
"clear": "Löschen",
|
||||
"device": "Gerät",
|
||||
"no_area": "Kein Bereich",
|
||||
"no_devices": "Du hast keine Geräte",
|
||||
"no_match": "Keine übereinstimmende Geräte gefunden",
|
||||
"show_devices": "Geräte anzeigen",
|
||||
"toggle": "Umschalten"
|
||||
},
|
||||
@@ -577,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Löschen",
|
||||
"entity": "Entität",
|
||||
"no_match": "Keine übereinstimmende Entitäten gefunden",
|
||||
"show_entities": "Entitäten anzeigen"
|
||||
}
|
||||
},
|
||||
@@ -593,7 +599,7 @@
|
||||
"changed_to_state": "wechselte zu {state}",
|
||||
"cleared_device_class": "gelöscht (keine {device_class} erkannt)",
|
||||
"detected_device_class": "erkannt {device_class}",
|
||||
"rose": "gestiegen",
|
||||
"rose": "aufgegangen",
|
||||
"set": "einstellen",
|
||||
"turned_off": "ausgeschaltet",
|
||||
"turned_on": "eingeschaltet",
|
||||
@@ -656,7 +662,7 @@
|
||||
"media-player-browser": "Medien-Browser",
|
||||
"no_items": "Keine Einträge",
|
||||
"no_local_media_found": "Keine lokalen Medien gefunden",
|
||||
"no_media_folder": "Es sieht so aus, als hätten Sie noch kein Medienverzeichnis erstellt.",
|
||||
"no_media_folder": "Es sieht so aus, als hättest du noch kein Medienverzeichnis erstellt.",
|
||||
"pick": "Auswählen",
|
||||
"pick-media": "Medien auswählen",
|
||||
"play": "Abspielen",
|
||||
@@ -700,16 +706,26 @@
|
||||
"never": "Noch nie",
|
||||
"past": "Vor {time}",
|
||||
"past_duration": {
|
||||
"day": "vor {count} {count, plural,\n one {Tag}\n other {Tagen}\n}",
|
||||
"hour": "vor {count} {count, plural,\n one {Stunde}\n other {Stunden}\n}",
|
||||
"minute": "vor {count} {count, plural,\n one {Minute}\n other {Minuten}\n}",
|
||||
"second": "vor {count} {count, plural,\n one {Sekunde}\n other {Sekunden}\n}",
|
||||
"week": "vor {count} {count, plural,\n one {Woche}\n other {Wochen}\n}"
|
||||
"day": "Vor {count} {count, plural,\n one {Tag}\n other {Tagen}\n}",
|
||||
"hour": "Vor {count} {count, plural,\n one {Stunde}\n other {Stunden}\n}",
|
||||
"minute": "Vor {count} {count, plural,\n one {Minute}\n other {Minuten}\n}",
|
||||
"second": "Vor {count} {count, plural,\n one {Sekunde}\n other {Sekunden}\n}",
|
||||
"week": "Vor {count} {count, plural,\n one {Woche}\n other {Wochen}\n}"
|
||||
}
|
||||
},
|
||||
"service-picker": {
|
||||
"service": "Dienst"
|
||||
},
|
||||
"target-picker": {
|
||||
"add_area_id": "Bereich auswählen",
|
||||
"add_device_id": "Gerät auswählen",
|
||||
"add_entity_id": "Entität auswählen",
|
||||
"expand_area_id": "Erweitere diesen Bereich in einzelne Geräte und Entitäten. Nach der Erweiterung werden die Geräte und Entitäten nicht aktualisiert, wenn sich der Bereich ändert.",
|
||||
"expand_device_id": "Erweitern Sie dieses Gerät in separate Entitäten. Nach dem Erweitern werden die Entitäten nicht aktualisiert, wenn sich das Gerät ändert.",
|
||||
"remove_area_id": "Bereich entfernen",
|
||||
"remove_device_id": "Gerät entfernen",
|
||||
"remove_entity_id": "Entität entfernen"
|
||||
},
|
||||
"user-picker": {
|
||||
"add_user": "Benutzer hinzufügen",
|
||||
"no_user": "Kein Benutzer",
|
||||
@@ -733,6 +749,7 @@
|
||||
"editor": {
|
||||
"confirm_delete": "Möchtest du diesen Eintrag wirklich löschen?",
|
||||
"delete": "Löschen",
|
||||
"device_disabled": "Das Gerät dieser Entität ist deaktiviert.",
|
||||
"enabled_cause": "Deaktiviert durch {cause}.",
|
||||
"enabled_delay_confirm": "Die aktivierten Entitäten werden in {delay} Sekunden zu Home Assistant hinzugefügt",
|
||||
"enabled_description": "Deaktivierte Entitäten werden nicht zu Home Assistant hinzugefügt.",
|
||||
@@ -743,6 +760,7 @@
|
||||
"icon_error": "Symbole sollten das Format 'Präfix:iconname' haben, z. B. 'mdi:home'",
|
||||
"name": "Namen",
|
||||
"note": "Hinweis: Dies funktioniert möglicherweise noch nicht bei allen Integrationen.",
|
||||
"open_device_settings": "Geräteeinstellungen öffnen",
|
||||
"unavailable": "Diese Entität ist derzeit nicht verfügbar.",
|
||||
"update": "Aktualisieren"
|
||||
},
|
||||
@@ -798,7 +816,7 @@
|
||||
"pattern": "Regex-Muster für die clientseitige Validierung",
|
||||
"text": "Text"
|
||||
},
|
||||
"platform_not_loaded": "Die {platform} -Komponente ist nicht geladen. Füge sie bitte deiner Konfiguration hinzu. Entweder durch Hinzufügen von 'default_config:' oder ''{platform}:''.",
|
||||
"platform_not_loaded": "Die {platform}-Integration ist nicht geladen. Bitte füge sie deiner Konfiguration hinzu, indem du entweder 'default_config:' oder ''{platform}:'' einfügst.",
|
||||
"required_error_msg": "Dieses Feld ist erforderlich",
|
||||
"timer": {
|
||||
"duration": "Dauer"
|
||||
@@ -822,7 +840,7 @@
|
||||
"edit": "Entität bearbeiten",
|
||||
"history": "Verlauf",
|
||||
"last_changed": "Zuletzt geändert",
|
||||
"last_updated": "Letztes Update",
|
||||
"last_updated": "Zuletzt aktualisiert",
|
||||
"person": {
|
||||
"create_zone": "Zone vom aktuellen Standort erstellen"
|
||||
},
|
||||
@@ -883,7 +901,7 @@
|
||||
"navigation": {
|
||||
"areas": "Bereiche",
|
||||
"automation": "Automatisierungen",
|
||||
"blueprint": "Baupläne",
|
||||
"blueprint": "Vorlagen",
|
||||
"core": "Allgemein",
|
||||
"customize": "Anpassungen",
|
||||
"devices": "Geräte",
|
||||
@@ -905,13 +923,13 @@
|
||||
},
|
||||
"reload": {
|
||||
"automation": "Automationen neu laden",
|
||||
"command_line": "Komandozeilen Entätien neu laden",
|
||||
"core": "Positionsdaten & Anpassungen neu laden",
|
||||
"command_line": "Komandozeilenentätien neu laden",
|
||||
"core": "Positionsdaten und Anpassungen neu laden",
|
||||
"filesize": "Dateigröße-Entitäten neu laden",
|
||||
"filter": "Filter Entitäten neu laden",
|
||||
"generic": "Allgemeine IP Kamera Entitäten neu laden",
|
||||
"generic_thermostat": "Allgemeine Thermostat Entitäte neu laden",
|
||||
"group": "Gruppen, Gruppen Entitäten und Benachrichtigungsservices neu laden",
|
||||
"filter": "Filterentitäten neu laden",
|
||||
"generic": "Allgemeine IP-Kamera-Entitäten neu laden",
|
||||
"generic_thermostat": "Allgemeine Thermostat-Entitäten neu laden",
|
||||
"group": "Gruppen, Gruppenentitäten und Benachrichtigungsservices neu laden",
|
||||
"history_stats": "Verlaufsstatistiken neu laden",
|
||||
"homekit": "HomeKit neu laden",
|
||||
"input_boolean": "Input-Booleans neu laden",
|
||||
@@ -924,16 +942,16 @@
|
||||
"person": "Personen neu laden",
|
||||
"ping": "Binäre-Ping-Entitäten neu laden",
|
||||
"reload": "{domain} neu laden",
|
||||
"rest": "Rest Entitäten und Benachrichtigunsdienste neu laden",
|
||||
"rest": "REST-Entitäten und Benachrichtigunsdienste neu laden",
|
||||
"rpi_gpio": "Raspberry Pi GPIO Entitäten neu laden",
|
||||
"scene": "Szenen neu laden",
|
||||
"script": "Skripte neu laden",
|
||||
"smtp": "SMTP-Benachrichtigungsdienst neu laden",
|
||||
"statistics": "Statistik Entitäten neu laden",
|
||||
"statistics": "Statistikentitäten neu laden",
|
||||
"telegram": "Telegram-Benachrichtigungsdienst neu laden",
|
||||
"template": "Templates neu laden",
|
||||
"trend": "Trend Entitäten neu laden",
|
||||
"universal": "Universelle Medien Player Entitäten neu laden",
|
||||
"trend": "Trend-Entitäten neu laden",
|
||||
"universal": "Universelle Medien-Player-Entitäten neu laden",
|
||||
"zone": "Zonen neu laden"
|
||||
},
|
||||
"server_control": {
|
||||
@@ -1021,16 +1039,16 @@
|
||||
"link_profile_page": "deine Profilseite"
|
||||
},
|
||||
"areas": {
|
||||
"caption": "Bereichsregister",
|
||||
"caption": "Bereiche",
|
||||
"data_table": {
|
||||
"area": "Bereich",
|
||||
"devices": "Geräte"
|
||||
},
|
||||
"delete": {
|
||||
"confirmation_text": "Alle Geräte in diesem Bereich werden nicht mehr zugewiesen sein.",
|
||||
"confirmation_text": "Die Zuordnung aller Geräte zu diesem Bereich wird aufgelöst.",
|
||||
"confirmation_title": "Möchtest du diesen Bereich wirklich löschen?"
|
||||
},
|
||||
"description": "Bereiche in deinem Zuhause verwalten",
|
||||
"description": "Geräte und Entitäten in Bereiche gruppieren",
|
||||
"editor": {
|
||||
"area_id": "Bereich-ID",
|
||||
"create": "Erstellen",
|
||||
@@ -1047,15 +1065,15 @@
|
||||
"integrations_page": "Integrationsseite",
|
||||
"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, navigiere mit dem Link unten zur Integrationsseite und klicke dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen.",
|
||||
"no_areas": "Sieht aus, als hätten Sie noch keine Bereiche!"
|
||||
"no_areas": "Sieht aus als hättest du noch keine Bereiche!"
|
||||
}
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automatisierung",
|
||||
"description": "Automatisierungen verwalten",
|
||||
"caption": "Automatisierungen",
|
||||
"description": "Individuelle Regeln für dein Zuhause erstellen",
|
||||
"dialog_new": {
|
||||
"blueprint": {
|
||||
"use_blueprint": "Einen Bauplan benutzen"
|
||||
"use_blueprint": "Eine Vorlage verwenden"
|
||||
},
|
||||
"header": "Erstelle eine neue Automatisierung",
|
||||
"how": "Wie möchtest du deine neue Automatisierung erstellen?",
|
||||
@@ -1064,7 +1082,7 @@
|
||||
"create": "Erstellen",
|
||||
"header": "Beschreibe die Automatisierung, die du erstellen möchtest",
|
||||
"input_label": "Was soll diese Automatisierung tun?",
|
||||
"intro": "Und wir werden versuchen, es für dich zu erstellen. Zum Beispiel: Schalten das Licht aus, wenn ich gehe."
|
||||
"intro": "Und wir werden versuchen, sie für dich zu erstellen. Zum Beispiel: Schalte das Licht aus, wenn ich gehe."
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
@@ -1116,11 +1134,11 @@
|
||||
"label": "Anzahl"
|
||||
},
|
||||
"until": {
|
||||
"conditions": "Bis Bedingungen",
|
||||
"conditions": "Bis-Bedingungen",
|
||||
"label": "Bis"
|
||||
},
|
||||
"while": {
|
||||
"conditions": "Während Bedingungen",
|
||||
"conditions": "Während-Bedingungen",
|
||||
"label": "Während"
|
||||
}
|
||||
}
|
||||
@@ -1148,12 +1166,12 @@
|
||||
},
|
||||
"alias": "Name",
|
||||
"blueprint": {
|
||||
"blueprint_to_use": "Zu verwendender Bauplan",
|
||||
"header": "Bauplan",
|
||||
"blueprint_to_use": "Zu verwendende Vorlage",
|
||||
"header": "Vorlage",
|
||||
"inputs": "Eingänge",
|
||||
"manage_blueprints": "Baupläne verwalten",
|
||||
"no_blueprints": "Du hast keine Baupläne",
|
||||
"no_inputs": "Dieser Bauplan hat keine Eingänge."
|
||||
"manage_blueprints": "Vorlagen verwalten",
|
||||
"no_blueprints": "Du hast keine Vorlagen",
|
||||
"no_inputs": "Diese Vorlage hat keine Eingänge."
|
||||
},
|
||||
"conditions": {
|
||||
"add": "Bedingung hinzufügen",
|
||||
@@ -1248,7 +1266,7 @@
|
||||
"queued": "Länge der Warteschlange"
|
||||
},
|
||||
"modes": {
|
||||
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Überprüfen Sie den {documentation_link} für weitere Informationen.",
|
||||
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Lies {documentation_link} für weitere Informationen.",
|
||||
"documentation": "Automatisierungs-Dokumentation",
|
||||
"label": "Modus",
|
||||
"parallel": "Parallel",
|
||||
@@ -1342,7 +1360,7 @@
|
||||
"time": {
|
||||
"at": "Um",
|
||||
"label": "Zeit",
|
||||
"type_input": "Wert eines Datum/Zeit-Helfers",
|
||||
"type_input": "Wert eines Datums-/Zeit-Helfers",
|
||||
"type_value": "Feste Zeit"
|
||||
},
|
||||
"webhook": {
|
||||
@@ -1399,31 +1417,37 @@
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"error_no_url": "Bitte gebe die URL des Bauplans ein.",
|
||||
"header": "Neuen Bauplan hinzufügen",
|
||||
"import_btn": "Bauplan importieren",
|
||||
"import_header": "{name}({domain}) importieren",
|
||||
"import_introduction": "Du kannst Baupläne anderer Benutzer aus GitHub und den Community-Foren importieren. Gib die URL des Bauplans unten ein.",
|
||||
"importing": "Bauplan wird importiert...",
|
||||
"save_btn": "Bauplan speichern",
|
||||
"saving": "Bauplan wir gespeichert...",
|
||||
"unsupported_blueprint": "Dieser Bauplan wird nicht unterstützt",
|
||||
"url": "URL des Bauplans"
|
||||
"community_forums": "Community-Foren",
|
||||
"error_no_url": "Bitte gebe die URL der Vorlage ein.",
|
||||
"file_name": "Vorlagenpfad",
|
||||
"header": "Vorlage importieren",
|
||||
"import_btn": "Vorschau Vorlage",
|
||||
"import_header": "Vorlage \"{name}\"",
|
||||
"import_introduction": "Du kannst Vorlagen anderer Benutzer aus GitHub und den Community-Foren importieren. Gib die URL der Vorlage unten ein.",
|
||||
"import_introduction_link": "Du kannst Vorlagen anderer Benutzer aus GitHub und den {community_link} importieren. Gib unten die URL der Vorlage ein.",
|
||||
"importing": "Vorlage wird geladen...",
|
||||
"raw_blueprint": "Inhalt der Vorlage",
|
||||
"save_btn": "Vorlage importieren",
|
||||
"saving": "Vorlage wird importiert...",
|
||||
"unsupported_blueprint": "Diese Vorlage wird nicht unterstützt",
|
||||
"url": "URL der Vorlage"
|
||||
},
|
||||
"caption": "Baupläne",
|
||||
"description": "Baupläne verwalten",
|
||||
"caption": "Vorlagen",
|
||||
"description": "Vorlagen verwalten",
|
||||
"overview": {
|
||||
"add_blueprint": "Bauplan hinzufügen",
|
||||
"confirm_delete_header": "Diesen Bauplan löschen?",
|
||||
"confirm_delete_text": "Bist du sicher, dass du diesen Bauplan löschen möchtest?",
|
||||
"header": "Bauplan-Editor",
|
||||
"add_blueprint": "Vorlage hinzufügen",
|
||||
"confirm_delete_header": "Diese Vorlage löschen?",
|
||||
"confirm_delete_text": "Bist du sicher, dass du diese Vorlage löschen möchtest?",
|
||||
"delete_blueprint": "Vorlage löschen",
|
||||
"discover_more": "Entdecke weitere Vorlagen",
|
||||
"header": "Vorlagen-Editor",
|
||||
"headers": {
|
||||
"domain": "Domain",
|
||||
"file_name": "Dateiname",
|
||||
"name": "Name"
|
||||
},
|
||||
"introduction": "Mit dem Bauplan-Editor kannst du Baupläne erstellen und bearbeiten.",
|
||||
"learn_more": "Erfahre mehr über Baupläne",
|
||||
"introduction": "Mit der Vorlagenkonfiguration kannst du deine Vorlagen importieren und verwalten.",
|
||||
"learn_more": "Erfahre mehr über die Benutzung von Vorlagen",
|
||||
"use_blueprint": "Automatisierung erstellen"
|
||||
}
|
||||
},
|
||||
@@ -1507,7 +1531,7 @@
|
||||
"title": "Alexa"
|
||||
},
|
||||
"caption": "Home Assistant Cloud",
|
||||
"description_features": "Fernsteuerung und Integration mit Alexa und Google Assistant.",
|
||||
"description_features": "Fernsteuerung und Integration mit Alexa und Google Assistant",
|
||||
"description_login": "Angemeldet als {email}",
|
||||
"description_not_login": "Nicht angemeldet",
|
||||
"dialog_certificate": {
|
||||
@@ -1602,7 +1626,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "Allgemein",
|
||||
"description": "Bearbeite die allgemeine Konfiguration von Home Assistant",
|
||||
"description": "Mengeneinheiten, Standort, Zeitzone & andere allgemeine Parameter",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -1634,7 +1658,7 @@
|
||||
"attributes_override": "Du kannst sie überschreiben, wenn du möchtest.",
|
||||
"attributes_set": "Die folgenden Attribute der Entität sind programmatisch festgelegt.",
|
||||
"caption": "Anpassung",
|
||||
"description": "Elemente anpassen",
|
||||
"description": "Entitäten individuell anpassen",
|
||||
"different_include": "Möglich über eine Domain, einen Glob oder einen anderen Include.",
|
||||
"pick_attribute": "Wähle ein Attribut zum Überschreiben aus.",
|
||||
"picker": {
|
||||
@@ -1664,6 +1688,7 @@
|
||||
"unknown_condition": "Unbekannte Bedingung"
|
||||
},
|
||||
"create": "Automatisierung mit Gerät erstellen",
|
||||
"create_disable": "Kann keine Automatisierung mit deaktiviertem Gerät erstellen",
|
||||
"no_automations": "Keine Automatisierungen",
|
||||
"no_device_automations": "Für dieses Gerät sind keine Automatisierungen verfügbar.",
|
||||
"triggers": {
|
||||
@@ -1677,7 +1702,7 @@
|
||||
"caption": "Geräte",
|
||||
"confirm_delete": "Möchtest du dieses Gerät wirklich löschen?",
|
||||
"confirm_rename_entity_ids": "Möchten Sie auch die Entitäts-IDs Ihrer Entitäten umbenennen?",
|
||||
"confirm_rename_entity_ids_warning": "Dies ändert keine Konfiguration (wie Automatisierungen, Skripte, Szenen, Dashboards), die derzeit diese Entitäten verwendet! Sie müssen sie selbst aktualisieren, um die neuen Entitäts-IDs zu verwenden!",
|
||||
"confirm_rename_entity_ids_warning": "Dies ändert keine Konfiguration (wie Automatisierungen, Skripte, Szenen, Dashboards), die derzeit diese Entitäten verwendet! Du musst sie selbst aktualisieren, um die neuen Entitäts-IDs zu verwenden!",
|
||||
"data_table": {
|
||||
"area": "Bereich",
|
||||
"battery": "Batterie",
|
||||
@@ -1692,23 +1717,43 @@
|
||||
"description": "Verbundene Geräte verwalten",
|
||||
"device_info": "Geräteinformationen",
|
||||
"device_not_found": "Gerät nicht gefunden.",
|
||||
"disabled": "Deaktiviert",
|
||||
"disabled_by": {
|
||||
"config_entry": "Konfigurationseintrag",
|
||||
"integration": "Integration",
|
||||
"user": "Benutzer"
|
||||
},
|
||||
"enabled_cause": "Das Gerät ist durch {cause} deaktiviert.",
|
||||
"enabled_description": "Deaktivierte Geräte werden nicht angezeigt und zum Gerät gehörende Entitäten werden deaktiviert und nicht zum Home Assistant hinzugefügt.",
|
||||
"enabled_label": "Gerät aktivieren",
|
||||
"entities": {
|
||||
"add_entities_lovelace": "Zu Lovelace hinzufügen",
|
||||
"disabled_entities": "+{count} {count, plural,\n one {deaktivierte Entität}\n other {deaktivierte Entitäten}\n}",
|
||||
"entities": "Entitäten",
|
||||
"hide_disabled": "Ausblenden deaktiviert",
|
||||
"hide_disabled": "Deaktivierte ausblenden",
|
||||
"none": "Dieses Gerät hat keine Entitäten"
|
||||
},
|
||||
"name": "Name",
|
||||
"no_devices": "Keine Geräte",
|
||||
"picker": {
|
||||
"filter": {
|
||||
"filter": "Filter",
|
||||
"hidden_devices": "{number} {number, plural,\n one {verstecktes Gerät}\n other {versteckte Geräte}\n}",
|
||||
"show_all": "Alle anzeigen",
|
||||
"show_disabled": "Deaktivierte Geräte anzeigen"
|
||||
},
|
||||
"search": "Geräte suchen"
|
||||
},
|
||||
"scene": {
|
||||
"create": "Szene mit Gerät erstellen",
|
||||
"create_disable": "Kann keine Szene mit deaktiviertem Gerät erstellen",
|
||||
"no_scenes": "Keine Szenen",
|
||||
"scenes": "Szenen"
|
||||
},
|
||||
"scenes": "Szenen",
|
||||
"script": {
|
||||
"create": "Szene mit Gerät erstellen",
|
||||
"create_disable": "Kann kein Skript mit deaktiviertem Gerät erstellen",
|
||||
"no_scripts": "Keine Skripte",
|
||||
"scripts": "Skripte"
|
||||
},
|
||||
@@ -1774,7 +1819,7 @@
|
||||
"header": "Home Assistant konfigurieren",
|
||||
"helpers": {
|
||||
"caption": "Helfer",
|
||||
"description": "Elemente verwalten, die beim Aufbau von Automatisierungen helfen können.",
|
||||
"description": "Elemente verwalten, die beim Aufbau von Automatisierungen helfen",
|
||||
"dialog": {
|
||||
"add_helper": "Helfer hinzufügen",
|
||||
"add_platform": "{platform} hinzufügen",
|
||||
@@ -1806,7 +1851,7 @@
|
||||
"copy_github": "Für GitHub",
|
||||
"copy_raw": "Roher Text",
|
||||
"custom_uis": "Benutzerdefinierte UIs:",
|
||||
"description": "Informationen über deine Home Assistant Installation",
|
||||
"description": "Version, Systemzustand und Links zur Dokumentation",
|
||||
"developed_by": "Entwickelt von einem Haufen toller Leute.",
|
||||
"documentation": "Dokumentation",
|
||||
"frontend": "Frontend-UI",
|
||||
@@ -1886,7 +1931,7 @@
|
||||
"options": "Optionen",
|
||||
"reload": "Neu laden",
|
||||
"reload_confirm": "Die Integration wurde neu geladen",
|
||||
"reload_restart_confirm": "Home Assistant neustarten, um das Neuladen dieser Integration abzuschließen",
|
||||
"reload_restart_confirm": "Home Assistant neu starten, um das Neuladen dieser Integration abzuschließen",
|
||||
"rename": "Umbenennen",
|
||||
"restart_confirm": "Starte Home Assistant neu, um das Entfernen dieser Integration abzuschließen",
|
||||
"services": "{count} {count, plural,\n one {Dienst}\n other {Dienste}\n}",
|
||||
@@ -1912,7 +1957,7 @@
|
||||
},
|
||||
"configure": "Konfigurieren",
|
||||
"configured": "Konfiguriert",
|
||||
"description": "Verbundene Integrationen verwalten",
|
||||
"description": "Integrationen zu Diensten, Geräten, usw. verwalten",
|
||||
"details": "Details zur Integration",
|
||||
"discovered": "Entdeckt",
|
||||
"home_assistant_website": "Home Assistant Website",
|
||||
@@ -1930,7 +1975,7 @@
|
||||
"integration": "Integration",
|
||||
"integration_not_found": "Integration nicht gefunden.",
|
||||
"new": "Richte eine neue Integration ein",
|
||||
"no_integrations": "Du hast anscheinend noch keine Integrationen konfiguriert. Klicke auf die Schaltfläche unten, um Deine erste Integration hinzuzufügen!",
|
||||
"no_integrations": "Du hast anscheinend noch keine Integrationen konfiguriert. Klicke auf die Schaltfläche unten, um eine erste Integration hinzuzufügen!",
|
||||
"none": "Noch nichts konfiguriert",
|
||||
"none_found": "Keine Integrationen gefunden",
|
||||
"none_found_detail": "Passe deine Suchkriterien an.",
|
||||
@@ -1945,7 +1990,7 @@
|
||||
"logs": {
|
||||
"caption": "Logs",
|
||||
"clear": "Leeren",
|
||||
"description": "Die Home Assistant Logs anschauen",
|
||||
"description": "Home Assistant Logs einsehen",
|
||||
"details": "Protokolldetails ( {level} )",
|
||||
"load_full_log": "Vollständiges Home Assistant-Protokoll laden",
|
||||
"loading_log": "Fehlerprotokoll wird geladen...",
|
||||
@@ -1962,7 +2007,7 @@
|
||||
"cant_edit_yaml": "In YAML definierte Dashboards können nicht über die Benutzeroberfläche bearbeitet werden. Du kannst sie aber in der configuration.yaml ändern.",
|
||||
"caption": "Dashboards",
|
||||
"conf_mode": {
|
||||
"storage": "UI gesteuert",
|
||||
"storage": "Grafischer Editor",
|
||||
"yaml": "YAML-Datei"
|
||||
},
|
||||
"confirm_delete": "Bist du sicher, dass du dieses Dashboard löschen möchtest?",
|
||||
@@ -1990,14 +2035,14 @@
|
||||
"conf_mode": "Konfigurationsmethode",
|
||||
"default": "Standard",
|
||||
"filename": "Dateiname",
|
||||
"require_admin": "Nur für Administratoren",
|
||||
"require_admin": "Nur Admin",
|
||||
"sidebar": "In der Seitenleiste anzeigen",
|
||||
"title": "Titel"
|
||||
},
|
||||
"open": "Öffnen"
|
||||
}
|
||||
},
|
||||
"description": "Konfiguriere deine Lovelace-Dashboards",
|
||||
"description": "Erstelle individuelle Oberflächen, um dein Zuhause zu steuern",
|
||||
"resources": {
|
||||
"cant_edit_yaml": "Du verwendest Lovelace im YAML-Modus. Daher kannst du deine Ressourcen nicht über die Benutzeroberfläche verwalten. Verwalte sie in der configuration.yaml.",
|
||||
"caption": "Ressourcen",
|
||||
@@ -2012,7 +2057,7 @@
|
||||
"url": "URL",
|
||||
"url_error_msg": "URL ist ein Pflichtfeld",
|
||||
"warning_header": "Sei vorsichtig!",
|
||||
"warning_text": "Das Hinzufügen von Ressourcen kann gefährlich sein. Stelle sicher, dass du die Quelle der Ressource kennst und ihr vertraust. Schlechte Ressourcen können dein System ernsthaft beschädigen."
|
||||
"warning_text": "Das Hinzufügen von Ressourcen kann gefährlich sein. Stelle sicher, dass du die Quelle der Ressource kennst und ihr vertraust. Ressourcen aus bösartigen Quellen können dein System ernsthaft beschädigen."
|
||||
},
|
||||
"picker": {
|
||||
"add_resource": "Ressource hinzufügen",
|
||||
@@ -2055,7 +2100,7 @@
|
||||
"node_id": "Knoten-ID",
|
||||
"ozw_instance": "OpenZWave-Instanz",
|
||||
"query_stage": "Abfragephase",
|
||||
"wakeup_instructions": "Weckanleitung",
|
||||
"wakeup_instructions": "Aufweckanleitung",
|
||||
"zwave": "Z-Wave"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -2094,12 +2139,12 @@
|
||||
},
|
||||
"network": {
|
||||
"header": "Netzwerkverwaltung",
|
||||
"introduction": "Verwalten Sie netzwerkweite Funktionen.",
|
||||
"introduction": "Verwalten der Netzwerk-Funktionen.",
|
||||
"node_count": "{count} Knoten"
|
||||
},
|
||||
"node_config": {
|
||||
"header": "Knotenkonfiguration",
|
||||
"help_source": "Konfigurationsparameterbeschreibungen und Hilfetexte werden vom OpenZWave-Projekt bereitgestellt.",
|
||||
"help_source": "Hilfetexte und Beschreibungen der Konfigurationsparameter stellt das OpenZWave-Projekt zur Verfügung.",
|
||||
"introduction": "Verwalten Sie die verschiedenen Konfigurationsparameter für einen Z-Wave Knoten.",
|
||||
"wakeup_help": "Batteriebetriebene Knoten müssen wach sein, um ihre Konfiguration zu ändern. Wenn der Knoten nicht aktiv ist, versucht OpenZWave beim nächsten Aufwachen, die Konfiguration des Knotens zu aktualisieren. Dies kann mehrere Stunden (oder Tage) später sein. Führen Sie die folgenden Schritte aus, um Ihr Gerät zu aktivieren:"
|
||||
},
|
||||
@@ -2152,8 +2197,8 @@
|
||||
},
|
||||
"select_instance": {
|
||||
"header": "OpenZWave Instanz auswählen",
|
||||
"introduction": "Sie haben mehr als eine OpenZWave-Instanz ausgeführt. Welche Instanz möchten Sie verwalten?",
|
||||
"none_found": "Wir haben keine OpenZWave-Instanz gefunden. Wenn Sie der Meinung sind, dass dies nicht korrekt ist, überprüfen Sie Ihre OpenZWave- und MQTT-Setups und stellen Sie sicher, dass der Home Assistant mit Ihrem MQTT-Broker kommunizieren kann."
|
||||
"introduction": "Du hast mehr als eine aktive OpenZWave-Instanz. Welche möchtest du verwalten?",
|
||||
"none_found": "Wir haben keine OpenZWave-Instanz gefunden. Wenn du der Meinung bist, dass dies nicht korrekt ist, überprüfe deine OpenZWave- und MQTT-Setups und stelle sicher, dass der Home Assistant mit dem MQTT-Broker kommunizieren kann."
|
||||
},
|
||||
"services": {
|
||||
"add_node": "Knoten hinzufügen",
|
||||
@@ -2167,11 +2212,11 @@
|
||||
"confirm_delete": "Möchtest du 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": "Personen verwalten, denen Home Assistant folgt.",
|
||||
"description": "Personen verwalten, denen Home Assistant folgt",
|
||||
"detail": {
|
||||
"admin": "Administrator",
|
||||
"allow_login": "Erlauben Sie dieser Person, sich einzuloggen.",
|
||||
"confirm_delete_user": "Bist Du sicher, dass Du das Benutzerkonto von {name} löschen möchtest? Du kannst der Person immer noch folgen, aber sie kann sich nicht mehr anmelden.",
|
||||
"allow_login": "Erlaube dieser Person, sich einzuloggen.",
|
||||
"confirm_delete_user": "Bist Du sicher, dass Du das Benutzerkonto für {name} löschen möchtest? Du kannst der Person immer noch folgen, aber sie kann sich nicht mehr anmelden.",
|
||||
"create": "Erstellen",
|
||||
"delete": "Löschen",
|
||||
"device_tracker_intro": "Wähle die Geräte, die dieser Person gehören.",
|
||||
@@ -2196,7 +2241,7 @@
|
||||
"scene": {
|
||||
"activated": "Aktivierte Szene {name}.",
|
||||
"caption": "Szenen",
|
||||
"description": "Szenen verwalten",
|
||||
"description": "Gerätezustände erfassen und später einfach wieder abrufen",
|
||||
"editor": {
|
||||
"default_name": "Neue Szene",
|
||||
"devices": {
|
||||
@@ -2214,7 +2259,7 @@
|
||||
"without_device": "Entitäten ohne Gerät"
|
||||
},
|
||||
"icon": "Symbol",
|
||||
"introduction": "Benutze Szenen um deinem Zuhause Leben einzuhauchen.",
|
||||
"introduction": "Benutze Szenen, um deinem 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",
|
||||
@@ -2239,8 +2284,8 @@
|
||||
}
|
||||
},
|
||||
"script": {
|
||||
"caption": "Skript",
|
||||
"description": "Skripte verwalten",
|
||||
"caption": "Skripte",
|
||||
"description": "Eine Sequenz aus Aktionen ausführen",
|
||||
"editor": {
|
||||
"alias": "Name",
|
||||
"default_name": "Neues Skript",
|
||||
@@ -2259,7 +2304,7 @@
|
||||
"queued": "Länge der Warteschlange"
|
||||
},
|
||||
"modes": {
|
||||
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Überprüfen Sie den {documentation_link} für weitere Informationen.",
|
||||
"description": "Der Modus steuert, was passiert, wenn ein Skript aufgerufen wird, während es noch von einem oder mehreren vorherigen Aufrufen ausgeführt wird. Lies {documentation_link} für weitere Informationen.",
|
||||
"documentation": "Skript-Dokumentation",
|
||||
"label": "Modus",
|
||||
"parallel": "Parallel",
|
||||
@@ -2315,7 +2360,7 @@
|
||||
"person": "Personen neu laden",
|
||||
"ping": "Binäre Ping-Sensorentitäten neu laden",
|
||||
"reload": "{domain} neu laden",
|
||||
"rest": "Rest Entitäten und Benachrichtigungsdienste neu laden",
|
||||
"rest": "Rest-Entitäten und Benachrichtigungsdienste neu laden",
|
||||
"rpi_gpio": "Raspberry Pi GPIO Entitäten neu laden",
|
||||
"scene": "Szenen neu laden",
|
||||
"script": "Skripte neu laden",
|
||||
@@ -2323,7 +2368,7 @@
|
||||
"statistics": "Statistik-Entitäten neu laden",
|
||||
"telegram": "Telegram-Benachrichtigungsdienste neu laden",
|
||||
"template": "Vorlagenentitäten neu laden",
|
||||
"trend": "Trendentitäten neu laden",
|
||||
"trend": "Trend-Entitäten neu laden",
|
||||
"universal": "Universelle Media Player-Entitäten neu laden",
|
||||
"zone": "Zonen neu laden"
|
||||
},
|
||||
@@ -2339,7 +2384,7 @@
|
||||
"check_config": "Konfiguration prüfen",
|
||||
"heading": "Konfiguration überprüfen",
|
||||
"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",
|
||||
"invalid": "Konfiguration fehlerhaft",
|
||||
"valid": "Konfiguration in Ordnung"
|
||||
}
|
||||
}
|
||||
@@ -2351,7 +2396,7 @@
|
||||
"confirm_remove": "Möchtest du den Tag {tag} wirklich entfernen?",
|
||||
"confirm_remove_title": "Tag entfernen?",
|
||||
"create_automation": "Automatisierung mit NFC Tag erstellen",
|
||||
"description": "NFC Tags verwalten",
|
||||
"description": "Automatisierungen auslösen wenn NFC Tag, QR Code, usw. gescannt wird",
|
||||
"detail": {
|
||||
"companion_apps": "Mobile Apps",
|
||||
"create": "Erstellen",
|
||||
@@ -2363,7 +2408,7 @@
|
||||
"tag_id": "NFC Tag ID",
|
||||
"tag_id_placeholder": "Automatisch generiert, wenn leer gelassen",
|
||||
"update": "Aktualisieren",
|
||||
"usage": "Ein Tag kann eine Automatisierung auslösen, wenn er gescannt wird. Sie können NFC-Tags, QR-Codes oder jede andere Art von Tags verwenden. Verwenden Sie unsere {companion_link}, um diesen Tag in ein programmierbares NFC-Tag zu schreiben oder einen QR-Code zu erstellen."
|
||||
"usage": "Ein Tag kann eine Automatisierung auslösen, wenn er gescannt wird. Du kannst NFC-Tags, QR-Codes oder jede andere Art von Tags verwenden. Verwende unsere {companion_link}, um diesen Tag in ein programmierbares NFC-Tag zu schreiben oder einen QR-Code zu erstellen."
|
||||
},
|
||||
"edit": "Bearbeiten",
|
||||
"headers": {
|
||||
@@ -2386,10 +2431,11 @@
|
||||
"username": "Benutzername"
|
||||
},
|
||||
"caption": "Benutzer",
|
||||
"description": "Benutzer verwalten",
|
||||
"description": "Home Assistant-Benutzerkonten verwalten",
|
||||
"editor": {
|
||||
"activate_user": "Benutzer aktivieren",
|
||||
"active": "Aktiv",
|
||||
"active_tooltip": "Steuert, ob sich der Benutzer anmelden kann",
|
||||
"admin": "Administrator",
|
||||
"caption": "Benutzer anzeigen",
|
||||
"change_password": "Passwort ändern",
|
||||
@@ -2398,14 +2444,14 @@
|
||||
"delete_user": "Benutzer löschen",
|
||||
"group": "Gruppe",
|
||||
"id": "ID",
|
||||
"name": "Name",
|
||||
"name": "Anzeigename",
|
||||
"new_password": "Neues Passwort",
|
||||
"owner": "Besitzer",
|
||||
"password_changed": "Das Passwort wurde erfolgreich geändert",
|
||||
"system_generated": "System generiert",
|
||||
"system_generated": "Systemgeneriert",
|
||||
"system_generated_users_not_editable": "Systemgenerierte Benutzer können nicht aktualisiert werden.",
|
||||
"system_generated_users_not_removable": "Vom System generierte Benutzer können nicht entfernt werden.",
|
||||
"unnamed_user": "Unbenannter Benutzer",
|
||||
"system_generated_users_not_removable": "Systemgenerierte Benutzer können nicht entfernt werden.",
|
||||
"unnamed_user": "Namenloser Benutzer",
|
||||
"update_user": "Aktualisieren",
|
||||
"username": "Benutzername"
|
||||
},
|
||||
@@ -2415,12 +2461,12 @@
|
||||
"group": "Gruppe",
|
||||
"is_active": "Aktiv",
|
||||
"is_owner": "Besitzer",
|
||||
"name": "Name",
|
||||
"system": "System",
|
||||
"name": "Anzeigename",
|
||||
"system": "System generiert",
|
||||
"username": "Benutzername"
|
||||
}
|
||||
},
|
||||
"users_privileges_note": "Benutzergruppen sind derzeit noch in Entwicklung. Der Benutzer wird nicht in der Lage sein, Änderungen an der Instanz über das UI vorzunehmen. Derzeit überprüfen wir noch alle API Endpunkte um sicherzustellen dass diese nur von Administratoren genutzt werden können."
|
||||
"users_privileges_note": "Benutzergruppen befinden sich derzeit noch in Entwicklung. Der Benutzer wird nicht in der Lage sein, Änderungen an der Instanz über die Benutzeroberfläche vorzunehmen. Derzeit überprüfen wir noch alle API Endpunkte und stellen sicher, dass diese nur von Administratoren genutzt werden können."
|
||||
},
|
||||
"zha": {
|
||||
"add_device": "Gerät hinzufügen",
|
||||
@@ -2476,7 +2522,8 @@
|
||||
"INITIALIZED_status_text": "Das Gerät ist einsatzbereit",
|
||||
"INTERVIEW_COMPLETE": "Interview abgeschlossen",
|
||||
"INTERVIEW_COMPLETE_status_text": "Konfigurieren",
|
||||
"PAIRED": "Gerät gefunden"
|
||||
"PAIRED": "Gerät gefunden",
|
||||
"PAIRED_status_text": "Interview starten"
|
||||
},
|
||||
"devices": {
|
||||
"header": "Zigbee Home Automation - Gerät"
|
||||
@@ -2548,7 +2595,7 @@
|
||||
"configured_in_yaml": "Zonen, die über configuration.yaml konfiguriert wurden, können nicht über die Benutzeroberfläche bearbeitet werden.",
|
||||
"confirm_delete": "Möchtest du diesen Bereich wirklich löschen?",
|
||||
"create_zone": "Zone erstellen",
|
||||
"description": "Verwalte die Zonen, in denen du Personen folgen möchtest.",
|
||||
"description": "Verwalte die Zonen, in denen du Personen folgen möchtest",
|
||||
"detail": {
|
||||
"create": "Erstellen",
|
||||
"delete": "Löschen",
|
||||
@@ -2609,12 +2656,12 @@
|
||||
"add_to_group": "Zur Gruppe hinzufügen",
|
||||
"entities": "Entitäten dieses Knotens",
|
||||
"entity_info": "Entitätsinformationen",
|
||||
"exclude_entity": "Schließe diese Entität vom Home Assistant aus",
|
||||
"exclude_entity": "Entität von Home Assistant ausschließen",
|
||||
"group": "Gruppe",
|
||||
"header": "Z-Wave-Knotenverwaltung",
|
||||
"introduction": "Führe Z-Wave-Befehle aus, die einen einzelnen Knoten betreffen. Wähle einen Knoten aus, um eine Liste der verfügbaren Befehle anzuzeigen.",
|
||||
"max_associations": "Max Assoziationen:",
|
||||
"node_group_associations": "Knotengruppenzuordnungen",
|
||||
"max_associations": "Maximale Zuordnungen:",
|
||||
"node_group_associations": "Zuordnungen zu Kontengruppen",
|
||||
"node_protection": "Knotenschutz",
|
||||
"node_to_control": "Zu steuernder Knoten",
|
||||
"nodes": "Knoten",
|
||||
@@ -2709,8 +2756,8 @@
|
||||
"filter_attributes": "Attribute filtern",
|
||||
"filter_entities": "Entitäten filtern",
|
||||
"filter_states": "Zustände filtern",
|
||||
"last_changed": "Letzte Änderung",
|
||||
"last_updated": "Letzte Aktualisierung",
|
||||
"last_changed": "Zuletzt geändert",
|
||||
"last_updated": "Zuletzt aktualisiert",
|
||||
"more_info": "Mehr Info",
|
||||
"no_entities": "Keine Entitäten",
|
||||
"set_state": "Status setzen",
|
||||
@@ -2803,7 +2850,7 @@
|
||||
"editor": {
|
||||
"action-editor": {
|
||||
"actions": {
|
||||
"call-service": "Dienst ausführen",
|
||||
"call-service": "Dienst aufrufen",
|
||||
"default_action": "Standardaktion",
|
||||
"more-info": "Mehr Info",
|
||||
"navigate": "Navigieren",
|
||||
@@ -2818,11 +2865,11 @@
|
||||
"card": {
|
||||
"alarm-panel": {
|
||||
"available_states": "Verfügbare Zustände",
|
||||
"description": "Mit der Alarmzentralen-Karte kannst du die Integrationen Ihrer Alarmzentrale aktivieren und deaktivieren.",
|
||||
"description": "Mit der Alarmzentralen-Karte kannst du integrierte Alarmzentralen scharfschalten oder deaktivieren.",
|
||||
"name": "Alarmpanel"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "Die Standardaktion hängt von den Funktionen der Entität ab, sie wird entweder umgeschaltet oder die weiteren Informationen werden angezeigt.",
|
||||
"default_action_help": "Die Standardaktion hängt von den Funktionen der Entität ab: sie wird entweder umgeschaltet oder die weiteren Informationen werden angezeigt.",
|
||||
"description": "Mit der Schaltflächen-Karte kannst du Schaltflächen hinzufügen, um Aufgaben auszuführen.",
|
||||
"name": "Schaltfläche"
|
||||
},
|
||||
@@ -2874,9 +2921,9 @@
|
||||
"last-changed": "Zuletzt geändert",
|
||||
"last-triggered": "Zuletzt ausgelöst",
|
||||
"last-updated": "Zuletzt aktualisiert",
|
||||
"none": "Keine Sekundärinformatrionen",
|
||||
"none": "Keine Sekundärinformation",
|
||||
"position": "Position",
|
||||
"tilt-position": "Neigungsposition"
|
||||
"tilt-position": "Neigung"
|
||||
},
|
||||
"show_header_toggle": "Schalter anzeigen?",
|
||||
"special_row": "spezielle Reihe",
|
||||
@@ -2887,7 +2934,7 @@
|
||||
"name": "Entität Filter"
|
||||
},
|
||||
"entity": {
|
||||
"description": "Mit der Entitätskarte erhältst du einen schnellen Überblick über den Status Ihrer Entität.",
|
||||
"description": "Mit der Entitätskarte erhältst du einen schnellen Überblick über den Status einer Entität.",
|
||||
"name": "Entität"
|
||||
},
|
||||
"gauge": {
|
||||
@@ -2969,7 +3016,7 @@
|
||||
"map": {
|
||||
"dark_mode": "Dunkler Modus?",
|
||||
"default_zoom": "Standard-Zoom",
|
||||
"description": "Mit der Map-Karte kannst du Objekte auf einer Karte anzeigen lassen.",
|
||||
"description": "Mit der Map-Karte kannst du Objekte auf einer Landkarte anzeigen lassen.",
|
||||
"geo_location_sources": "Geolocation-Quellen",
|
||||
"hours_to_show": "Zu zeigende Stunden",
|
||||
"name": "Karte",
|
||||
@@ -2985,7 +3032,7 @@
|
||||
"name": "Mediensteuerung"
|
||||
},
|
||||
"picture-elements": {
|
||||
"description": "Die Bilder-Karte ist eine der vielseitigsten Arten von Karten. Mit den Karten kannst du Symbole, Text und sogar Dienste positionieren! Auf einem Bild basierend auf Koordinaten.",
|
||||
"description": "Die Bilder-Karte ist eine der vielseitigsten Karten. Hier kannst du Symbole, Texte und sogar Dienste basierend auf Bildkoordinaten positionieren.",
|
||||
"name": "Picture Elements"
|
||||
},
|
||||
"picture-entity": {
|
||||
@@ -3083,7 +3130,7 @@
|
||||
"header_name": "{name} Konfiguration anzeigen",
|
||||
"move_left": "Ansicht nach links verschieben",
|
||||
"move_right": "Ansicht nach rechts verschieben",
|
||||
"tab_badges": "Abzeichen",
|
||||
"tab_badges": "Plaketten",
|
||||
"tab_settings": "Einstellungen",
|
||||
"tab_visibility": "Sichtbarkeit",
|
||||
"visibility": {
|
||||
@@ -3144,8 +3191,8 @@
|
||||
"para_sure": "Bist du dir sicher, dass du die Benutzeroberfläche selbst verwalten möchtest?",
|
||||
"save": "Kontrolle übernehmen",
|
||||
"yaml_config": "Um dir den Einstieg zu erleichtern, findest du hier die aktuelle Konfiguration dieses Dashboards:",
|
||||
"yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstelle eine YAML-Datei mit dem Namen, den du in Deiner Konfiguration für dieses Dashboard angegeben hast, oder mit der Standardeinstellung 'ui-lovelace.yaml'.",
|
||||
"yaml_mode": "Du verwendest den YAML-Modus für dieses Dashboard. Dies bedeutet, dass Du Deine Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern kannst. Wenn du dieses Dashboard über die Benutzeroberfläche verwalten möchtest, entferne \"mode: yaml\" aus Deiner Lovelace-Konfiguration in \"configuration.yaml\"."
|
||||
"yaml_control": "Um die Kontrolle im YAML-Modus zu übernehmen, erstelle eine YAML-Datei mit dem Namen, den du in deiner Konfiguration für dieses Dashboard angegeben hast, oder mit der Standardeinstellung 'ui-lovelace.yaml'.",
|
||||
"yaml_mode": "Du verwendest den YAML-Modus für dieses Dashboard. Dies bedeutet, dass du deine Lovelace-Konfiguration nicht über die Benutzeroberfläche ändern kannst. Wenn du dieses Dashboard über die Benutzeroberfläche verwalten möchtest, entferne \"mode: yaml\" aus Deiner Lovelace-Konfiguration in \"configuration.yaml\"."
|
||||
},
|
||||
"select_view": {
|
||||
"dashboard_label": "Dashboard",
|
||||
@@ -3165,7 +3212,7 @@
|
||||
},
|
||||
"view": {
|
||||
"panel_mode": {
|
||||
"description": "Dadurch wird die erste Karte in voller Breite angezeigt. Andere Karten und Marker in dieser Ansicht werden nicht angezeigt.",
|
||||
"description": "Hiermit wird die erste Karte in voller Breite angezeigt. Andere Karten und Marker in dieser Ansicht werden nicht angezeigt.",
|
||||
"title": "Panel-Modus?",
|
||||
"warning_multiple_cards": "Diese Ansicht enthält mehr als eine Karte, in einer Bedienfeldansicht kann jedoch nur eine Karte angezeigt werden."
|
||||
}
|
||||
@@ -3378,8 +3425,8 @@
|
||||
"intro": "Sind Sie bereit, dein Zuhause zu wecken, Ihre Privatsphäre zurückzugewinnen und einer weltweiten Gemeinschaft von Tüftlern beizutreten?",
|
||||
"restore": {
|
||||
"description": "Alternativ kannst du von einem vorherigen Snapshot wiederherstellen.",
|
||||
"hide_log": "Vollständiges Log verstecken",
|
||||
"in_progress": "Wiederherstellung im Prozess",
|
||||
"hide_log": "Vollständiges Protokoll ausblenden",
|
||||
"in_progress": "Wiederherstellung im Gange",
|
||||
"show_log": "Vollständiges Protokoll anzeigen"
|
||||
},
|
||||
"user": {
|
||||
@@ -3400,17 +3447,20 @@
|
||||
},
|
||||
"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 Assistant 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": {
|
||||
"confirm_new_password": "Neues Passwort Bestätigen",
|
||||
"current_password": "Aktuelles Passwort",
|
||||
"error_new_is_old": "Das neue Passwort muss sich von dem aktuellen Passwort unterscheiden.",
|
||||
"error_new_mismatch": "Eingegebene neue Passwörter stimmen nicht überein",
|
||||
"error_required": "Erforderlich",
|
||||
"header": "Passwort ändern",
|
||||
"new_password": "Neues Passwort",
|
||||
"submit": "Absenden"
|
||||
"submit": "Absenden",
|
||||
"success": "Passwort wurde erfolgreich geändert"
|
||||
},
|
||||
"current_user": "Du bist derzeit als {fullName} angemeldet.",
|
||||
"customize_sidebar": {
|
||||
@@ -3450,7 +3500,7 @@
|
||||
"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": "Sie haben noch keine langlebigen Zugangs-Token.",
|
||||
"header": "Langlebige Zugangs-Token",
|
||||
"last_used": "Zuletzt verwendet am {date} in {location}",
|
||||
"last_used": "Zuletzt verwendet {date} von {location}",
|
||||
"learn_auth_requests": "Erfahre, wie du authentifizierte Anfragen stellen kannst.",
|
||||
"name": "Name",
|
||||
"not_used": "Wurde noch nie benutzt",
|
||||
@@ -3473,7 +3523,7 @@
|
||||
"push_notifications": {
|
||||
"add_device_prompt": {
|
||||
"input_label": "Gerätename",
|
||||
"title": "Wie sollte dieses Gerät genannt werden?"
|
||||
"title": "Wie soll dieses Gerät genannt werden?"
|
||||
},
|
||||
"description": "Sende Benachrichtigungen an dieses Gerät.",
|
||||
"error_load_platform": "Konfiguriere notify.html5.",
|
||||
@@ -3489,7 +3539,7 @@
|
||||
"delete_failed": "Fehler beim Löschen das Aktualisierungs-Token.",
|
||||
"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}",
|
||||
"last_used": "Zuletzt verwendet {date} von {location}",
|
||||
"not_used": "Wurde noch nie benutzt",
|
||||
"token_title": "Aktualisierungs-Token für {clientId}"
|
||||
},
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
"config_entry": {
|
||||
"disabled_by": {
|
||||
"config_entry": "Παράμετρος διαμόρφωσης",
|
||||
"device": "Συσκευή",
|
||||
"integration": "Ενσωμάτωση",
|
||||
"user": "Χρήστης"
|
||||
}
|
||||
},
|
||||
"groups": {
|
||||
"owner": "Ιδιοκτήτης",
|
||||
"system-admin": "Διαχειριστές",
|
||||
"system-read-only": "Χρήστες μόνο για ανάγνωση",
|
||||
"system-users": "Χρήστες"
|
||||
@@ -545,8 +547,15 @@
|
||||
"add_new": "Προσθήκη νέας περιοχής...",
|
||||
"area": "Περιοχή",
|
||||
"clear": "Εκκαθάριση",
|
||||
"no_areas": "Δεν έχετε περιοχές",
|
||||
"no_match": "Δεν βρέθηκαν περιοχές που να ταιριάζουν",
|
||||
"show_areas": "Εμφάνιση περιοχών"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
"add_user": "Προσθήκη χρήστη",
|
||||
"remove_user": "Κατάργηση χρήστη",
|
||||
"select_blueprint": "Επιλέξτε ένα σχεδιάγραμμα"
|
||||
},
|
||||
"data-table": {
|
||||
"no-data": "Δεν υπάρχουν δεδομένα",
|
||||
"search": "Αναζήτηση"
|
||||
@@ -560,6 +569,8 @@
|
||||
"clear": "Καθαρός",
|
||||
"device": "Συσκευή",
|
||||
"no_area": "Καμία περιοχή",
|
||||
"no_devices": "Δεν έχετε συσκευές",
|
||||
"no_match": "Δεν βρέθηκαν συσκευές που να ταιριάζουν",
|
||||
"show_devices": "Εμφάνιση συσκευών",
|
||||
"toggle": "Εναλλαγή"
|
||||
},
|
||||
@@ -571,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Καθαρισμός",
|
||||
"entity": "Οντότητα",
|
||||
"no_match": "Δεν βρέθηκαν οντότητες που να ταιριάζουν",
|
||||
"show_entities": "Εμφάνιση οντοτήτων"
|
||||
}
|
||||
},
|
||||
@@ -587,8 +599,8 @@
|
||||
"changed_to_state": "άλλαξε σε {state}",
|
||||
"cleared_device_class": "παραγράφηκε (δεν εντοπίστηκε {device_class} )",
|
||||
"detected_device_class": "εντόπισε {device_class}",
|
||||
"rose": "αυξήθηκε",
|
||||
"set": "ορίστηκε",
|
||||
"rose": "ανέτειλε",
|
||||
"set": "έδυσε",
|
||||
"turned_off": "απενεργοποιήθηκε",
|
||||
"turned_on": "ενεργοποιήθηκε",
|
||||
"was_at_home": "ήταν στο σπίτι",
|
||||
@@ -704,6 +716,16 @@
|
||||
"service-picker": {
|
||||
"service": "Υπηρεσία"
|
||||
},
|
||||
"target-picker": {
|
||||
"add_area_id": "Επιλέξτε περιοχή",
|
||||
"add_device_id": "Επιλέξτε συσκευή",
|
||||
"add_entity_id": "Διαλέξτε οντότητα",
|
||||
"expand_area_id": "Αναπτύξτε αυτήν την περιοχή στις ξεχωριστές συσκευές και οντότητες που περιέχει. Μετά την επέκταση δεν θα ενημερώσει τις συσκευές και τις οντότητες όταν αλλάζει η περιοχή.",
|
||||
"expand_device_id": "Αναπτύξτε αυτήν τη συσκευή σε ξεχωριστές οντότητες. Μετά την επέκταση, δεν θα ενημερώσει τις οντότητες όταν αλλάξει η συσκευή.",
|
||||
"remove_area_id": "Κατάργηση περιοχής",
|
||||
"remove_device_id": "Αφαίρεση συσκευής",
|
||||
"remove_entity_id": "Αφαίρεση οντότητας"
|
||||
},
|
||||
"user-picker": {
|
||||
"add_user": "Προσθήκη χρήστη",
|
||||
"no_user": "Κανένας χρήστης",
|
||||
@@ -727,6 +749,7 @@
|
||||
"editor": {
|
||||
"confirm_delete": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτήν την καταχώριση;",
|
||||
"delete": "Διαγραφή",
|
||||
"device_disabled": "Η συσκευή αυτής της οντότητας είναι απενεργοποιημένη.",
|
||||
"enabled_cause": "Απενεργοποιήθηκε από {cause}.",
|
||||
"enabled_delay_confirm": "Τα ενεργοποιημένα στοιχεία θα προστεθούν στο Home Assistant σε {delay} δευτερόλεπτα",
|
||||
"enabled_description": "Οι απενεργοποιημένες οντότητες δεν θα προστεθούν στον Home Assistant.",
|
||||
@@ -737,6 +760,7 @@
|
||||
"icon_error": "Το εικονίδιο πρέπει να είναι στη μορφή 'πρόθεμα:όνομα_εικόνας', για παράδειγμα: 'mdi:home'",
|
||||
"name": "Όνομα",
|
||||
"note": "Σημείωση: Αυτό μπορεί να μην λειτουργεί ακόμη με όλες τις ενσωματώσεις.",
|
||||
"open_device_settings": "Άνοιγμα ρυθμίσεων συσκευής",
|
||||
"unavailable": "Αυτή η οντότητα δεν είναι προς το παρόν διαθέσιμη.",
|
||||
"update": "Ενημέρωση"
|
||||
},
|
||||
@@ -877,6 +901,7 @@
|
||||
"navigation": {
|
||||
"areas": "Περιοχές",
|
||||
"automation": "Αυτοματισμοί",
|
||||
"blueprint": "Σχεδιαγράμματα",
|
||||
"core": "Γενικά",
|
||||
"customize": "Μορφοποιήσεις",
|
||||
"devices": "Συσκευές",
|
||||
@@ -1046,6 +1071,20 @@
|
||||
"automation": {
|
||||
"caption": "Αυτοματισμοί",
|
||||
"description": "Διαχείριση αυτοματισμών",
|
||||
"dialog_new": {
|
||||
"blueprint": {
|
||||
"use_blueprint": "Χρησιμοποιήστε ένα σχεδιάγραμμα"
|
||||
},
|
||||
"header": "Δημιουργία νέου αυτοματισμού",
|
||||
"how": "Πώς θέλετε να δημιουργήσετε τον νέο σας αυτοματισμό;",
|
||||
"start_empty": "Ξεκινήστε με έναν κενό αυτοματισμό",
|
||||
"thingtalk": {
|
||||
"create": "Δημιουργία",
|
||||
"header": "Περιγράψτε τον αυτοματισμό που θέλετε να δημιουργήσετε",
|
||||
"input_label": "Τι πρέπει να κάνει αυτός ο αυτοματισμός;",
|
||||
"intro": "Και θα προσπαθήσουμε να το δημιουργήσουμε για εσάς. Για παράδειγμα: Σβήσε τα φώτα όταν φεύγω."
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
"actions": {
|
||||
"add": "Προσθήκη ενέργειας",
|
||||
@@ -1126,6 +1165,14 @@
|
||||
"unsupported_action": "Χωρίς υποστήριξη διεπαφής χρήστη για ενέργεια: {action}"
|
||||
},
|
||||
"alias": "Όνομα",
|
||||
"blueprint": {
|
||||
"blueprint_to_use": "Σχεδιάγραμμα για χρήση",
|
||||
"header": "Σχεδιάγραμμα",
|
||||
"inputs": "Είσοδοι",
|
||||
"manage_blueprints": "Διαχείριση σχεδιαγραμμάτων",
|
||||
"no_blueprints": "Δεν έχετε σχεδιαγράμματα",
|
||||
"no_inputs": "Αυτό το σχεδιάγραμμα δεν έχει καμία εισαγωγή."
|
||||
},
|
||||
"conditions": {
|
||||
"add": "Προσθήκη όρου",
|
||||
"delete": "Διαγραφή",
|
||||
@@ -1368,6 +1415,42 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"community_forums": "κοινοτικά φόρουμ",
|
||||
"error_no_url": "Εισαγάγετε τη διεύθυνση URL του σχεδιαγράμματος.",
|
||||
"file_name": "Διαδρομή σχεδιαγράμματος",
|
||||
"header": "Εισαγωγή σχεδιαγράμματος",
|
||||
"import_btn": "Προεπισκόπηση σχεδιαγράμματος",
|
||||
"import_header": "Σχεδιάγραμμα \"{name}\"",
|
||||
"import_introduction": "Μπορείτε να εισαγάγετε σχεδιαγράμματα άλλων χρηστών από το Github και τα φόρουμ της κοινότητας. Εισαγάγετε τη διεύθυνση URL του σχεδιαγράμματος παρακάτω.",
|
||||
"import_introduction_link": "Μπορείτε να εισαγάγετε σχεδιαγράμματα άλλων χρηστών από το Github και το {community_link} . Εισαγάγετε τη διεύθυνση URL του σχεδιαγράμματος παρακάτω.",
|
||||
"importing": "Φόρτωση σχεδιαγράμματος...",
|
||||
"raw_blueprint": "Περιεχόμενο σχεδιαγράμματος",
|
||||
"save_btn": "Εισαγωγή σχεδιαγράμματος",
|
||||
"saving": "Εισαγωγή σχεδιαγράμματος...",
|
||||
"unsupported_blueprint": "Αυτό το σχεδιάγραμμα δεν υποστηρίζεται",
|
||||
"url": "Διεύθυνση URL του σχεδιαγράμματος"
|
||||
},
|
||||
"caption": "Σχεδιαγράμματα",
|
||||
"description": "Διαχείριση σχεδιαγραμμάτων",
|
||||
"overview": {
|
||||
"add_blueprint": "Εισαγωγή σχεδιαγράμματος",
|
||||
"confirm_delete_header": "Διαγραφή αυτού του σχεδιαγράμματος;",
|
||||
"confirm_delete_text": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το σχεδιάγραμμα;",
|
||||
"delete_blueprint": "Διαγραφή σχεδιαγράμματος",
|
||||
"discover_more": "Ανακαλύψτε περισσότερα σχεδιαγράμματα",
|
||||
"header": "Πρόγραμμα επεξεργασίας σχεδιαγραμμάτων",
|
||||
"headers": {
|
||||
"domain": "Τομέας",
|
||||
"file_name": "Ονομα αρχείου",
|
||||
"name": "Όνομα"
|
||||
},
|
||||
"introduction": "Η διαμόρφωση του σχεδιαγράμματος σας επιτρέπει να εισάγετε και να διαχειρίζεστε τα σχεδιαγράμματά σας.",
|
||||
"learn_more": "Μάθετε περισσότερα σχετικά με τη χρήση σχεδιαγραμμάτων",
|
||||
"use_blueprint": "Δημιουργία αυτοματισμού"
|
||||
}
|
||||
},
|
||||
"cloud": {
|
||||
"account": {
|
||||
"alexa": {
|
||||
@@ -1605,6 +1688,7 @@
|
||||
"unknown_condition": "Άγνωστη κατάσταση"
|
||||
},
|
||||
"create": "Δημιουργία αυτοματισμού με τη συσκευή",
|
||||
"create_disable": "Δεν είναι δυνατή η δημιουργία αυτοματισμού με απενεργοποιημένη συσκευή",
|
||||
"no_automations": "Δεν υπάρχουν αυτοματισμοί",
|
||||
"no_device_automations": "Δεν υπάρχουν διαθέσιμοι αυτοματισμοί για αυτήν τη συσκευή.",
|
||||
"triggers": {
|
||||
@@ -1633,6 +1717,15 @@
|
||||
"description": "Διαχείριση συνδεδεμένων συσκευών",
|
||||
"device_info": "Πληροφορίες συσκευής",
|
||||
"device_not_found": "Η συσκευή δε βρέθηκε.",
|
||||
"disabled": "Απενεργοποιημένο",
|
||||
"disabled_by": {
|
||||
"config_entry": "Παράμετρος διαμόρφωσης",
|
||||
"integration": "Ενσωμάτωση",
|
||||
"user": "Χρήστης"
|
||||
},
|
||||
"enabled_cause": "Η συσκευή απενεργοποιείται από το {cause}.",
|
||||
"enabled_description": "Οι απενεργοποιημένες συσκευές δεν θα εμφανίζονται και οι οντότητες που ανήκουν στη συσκευή θα απενεργοποιούνται και δεν θα προστίθενται στο Home Assistant.",
|
||||
"enabled_label": "Ενεργοποίηση συσκευής",
|
||||
"entities": {
|
||||
"add_entities_lovelace": "Προσθήκη στο Lovelace",
|
||||
"disabled_entities": "+{count} {count, plural,\n one {απενεργοποιημένη οντότηταy}\n other {απενεργοποιημένες οντότητες}\n}",
|
||||
@@ -1642,14 +1735,25 @@
|
||||
},
|
||||
"name": "Όνομα",
|
||||
"no_devices": "Δεν υπάρχουν συσκευές",
|
||||
"picker": {
|
||||
"filter": {
|
||||
"filter": "Φίλτρο",
|
||||
"hidden_devices": "{number} κρυφή {number, plural,\n one {συσκευή}\n other {συσκευές}\n}",
|
||||
"show_all": "Εμφάνιση όλων",
|
||||
"show_disabled": "Εμφάνιση απενεργοποιημένων συσκευών"
|
||||
},
|
||||
"search": "Αναζήτηση συσκευών"
|
||||
},
|
||||
"scene": {
|
||||
"create": "Δημιουργία σκηνής με τη συσκευή",
|
||||
"create_disable": "Δεν είναι δυνατή η δημιουργία σκηνής με απενεργοποιημένη συσκευή",
|
||||
"no_scenes": "Καμία σκηνή",
|
||||
"scenes": "Σκηνές"
|
||||
},
|
||||
"scenes": "Σκηνές",
|
||||
"script": {
|
||||
"create": "Δημιουργία σεναρίου με συσκευή",
|
||||
"create_disable": "Δεν είναι δυνατή η δημιουργία σεναρίου με απενεργοποιημένη συσκευή",
|
||||
"no_scripts": "Χωρίς δέσμες ενεργειών",
|
||||
"scripts": "Δέσμες ενεργειών"
|
||||
},
|
||||
@@ -1682,6 +1786,7 @@
|
||||
},
|
||||
"header": "Μητρώο οντοτήτων",
|
||||
"headers": {
|
||||
"area": "Περιοχή",
|
||||
"entity_id": "Αναγνωριστικό οντότητας",
|
||||
"integration": "Ενσωμάτωση",
|
||||
"name": "Όνομα",
|
||||
@@ -2330,6 +2435,7 @@
|
||||
"editor": {
|
||||
"activate_user": "Ενεργοποίηση χρήστη",
|
||||
"active": "Ενεργό",
|
||||
"active_tooltip": "Ελέγχει εάν ο χρήστης μπορεί να συνδεθεί",
|
||||
"admin": "Διαχειριστής",
|
||||
"caption": "Προβολή χρήστη",
|
||||
"change_password": "Αλλαγή Κωδικού",
|
||||
@@ -2346,19 +2452,24 @@
|
||||
"system_generated_users_not_editable": "Δεν είναι δυνατή η ενημέρωση των χρηστών που δημιουργούνται από το σύστημα.",
|
||||
"system_generated_users_not_removable": "Δεν είναι δυνατή η διαγραφή χρηστών που δημιουργήθηκαν από το σύστημα",
|
||||
"unnamed_user": "Χρήστης χωρίς όνομα",
|
||||
"update_user": "Ενημέρωση"
|
||||
"update_user": "Ενημέρωση",
|
||||
"username": "Όνομα χρήστη"
|
||||
},
|
||||
"picker": {
|
||||
"add_user": "Προσθήκη χρήστη",
|
||||
"headers": {
|
||||
"group": "Ομάδα",
|
||||
"is_active": "Ενεργό",
|
||||
"is_owner": "Ιδιοκτήτης",
|
||||
"name": "Ονομασία",
|
||||
"system": "Σύστημα"
|
||||
"system": "Σύστημα",
|
||||
"username": "Όνομα χρήστη"
|
||||
}
|
||||
},
|
||||
"users_privileges_note": "Η ομάδα χρηστών είναι ένα έργο σε εξέλιξη. Ο χρήστης δεν θα μπορεί να διαχειριστεί την παρουσία μέσω της διεπαφής χρήστη. Εξακολουθούμε να ελέγχουμε όλα τα τελικά σημεία API διαχείρισης για να διασφαλίσουμε ότι περιορίζουν σωστά την πρόσβαση στους διαχειριστές."
|
||||
},
|
||||
"zha": {
|
||||
"add_device": "Προσθήκη συσκευής",
|
||||
"add_device_page": {
|
||||
"discovered_text": "Οι συσκευές θα εμφανιστούν εδώ μόλις ανακαλυφθούν.",
|
||||
"discovery_text": "Οι ανακαλυφθείσες συσκευές θα εμφανιστούν εδώ. Ακολουθήστε τις οδηγίες για τις συσκευές σας και τοποθετήστε τις συσκευές στη λειτουργία αντιστοίχισης.",
|
||||
@@ -2404,6 +2515,16 @@
|
||||
"value": "Τιμή"
|
||||
},
|
||||
"description": "Διαχείριση του δικτύου Zigbee Home Automation",
|
||||
"device_pairing_card": {
|
||||
"CONFIGURED": "Η διαμόρφωση ολοκληρώθηκε",
|
||||
"CONFIGURED_status_text": "Αρχικοποίηση",
|
||||
"INITIALIZED": "Η προετοιμασία ολοκληρώθηκε",
|
||||
"INITIALIZED_status_text": "Η συσκευή είναι έτοιμη για χρήση",
|
||||
"INTERVIEW_COMPLETE": "Η συνέντευξη ολοκληρώθηκε",
|
||||
"INTERVIEW_COMPLETE_status_text": "Διαμόρφωση",
|
||||
"PAIRED": "Βρέθηκε συσκευή",
|
||||
"PAIRED_status_text": "Έναρξη συνέντευξης"
|
||||
},
|
||||
"devices": {
|
||||
"header": "Zigbee Home Automation - Συσκευή"
|
||||
},
|
||||
@@ -2419,6 +2540,7 @@
|
||||
"unbind_button_label": "Αποσύνδεση ομάδας"
|
||||
},
|
||||
"groups": {
|
||||
"add_group": "Προσθήκη ομάδας",
|
||||
"add_members": "Προσθήκη Μελών",
|
||||
"adding_members": "Προσθήκη Μελών",
|
||||
"caption": "Ομάδες",
|
||||
@@ -2461,7 +2583,11 @@
|
||||
"hint_wakeup": "Μερικές συσκευές όπως οι αισθητήρες Xiaomi έχουν ένα κουμπί αφύπνισης το οποίο μπορείτε να πιέσετε για διαστήματα των ~5 δευτερολέπτων ώστε να κρατήσετε τις συσκευές αφυπνισμένες ενώ αλληλεπιδράτε μαζί τους.",
|
||||
"introduction": "Εκτελέστε εντολές ZHA που επηρεάζουν μια μόνο συσκευή. Επιλέξτε μια συσκευή για να δείτε μια λίστα διαθέσιμων εντολών."
|
||||
},
|
||||
"title": "Οικιακός Αυτοματισμός Zigbee"
|
||||
"title": "Οικιακός Αυτοματισμός Zigbee",
|
||||
"visualization": {
|
||||
"caption": "Απεικόνιση",
|
||||
"header": "Απεικόνιση δικτύου"
|
||||
}
|
||||
},
|
||||
"zone": {
|
||||
"add_zone": "Προσθήκη ζώνης",
|
||||
@@ -2915,7 +3041,8 @@
|
||||
},
|
||||
"picture-glance": {
|
||||
"description": "Η κάρτα \"Ματιά εικόνας\" εμφανίζει μια εικόνα και τις αντίστοιχες καταστάσεις οντότητας ως εικονίδιο. Οι οντότητες στη δεξιά πλευρά επιτρέπουν ενέργειες εναλλαγής, ενώ άλλες εμφανίζουν το παράθυρο διαλόγου περισσότερων πληροφοριών.",
|
||||
"name": "Στιγμιότυπο εικόνας"
|
||||
"name": "Στιγμιότυπο εικόνας",
|
||||
"state_entity": "Κρατική οντότητα"
|
||||
},
|
||||
"picture": {
|
||||
"description": "Η κάρτα Εικόνας σάς επιτρέπει να ορίσετε μια εικόνα που θα χρησιμοποιείται για πλοήγηση σε διάφορες διαδρομές στη διεπαφή σας ή να καλείτε μια υπηρεσία.",
|
||||
@@ -3327,10 +3454,13 @@
|
||||
"change_password": {
|
||||
"confirm_new_password": "Επιβεβαιώστε τον καινούριο κωδικό",
|
||||
"current_password": "Τρέχων κωδικός",
|
||||
"error_new_is_old": "Ο νέος κωδικός πρόσβασης πρέπει να είναι διαφορετικός από τον τρέχοντα κωδικό πρόσβασης",
|
||||
"error_new_mismatch": "Οι νέες τιμές κωδικού πρόσβασης που έχουν εισαχθεί δεν ταιριάζουν",
|
||||
"error_required": "Απαιτείται",
|
||||
"header": "Αλλαγή Κωδικού",
|
||||
"new_password": "Νέος κωδικός",
|
||||
"submit": "Υποβολή"
|
||||
"submit": "Υποβολή",
|
||||
"success": "Ο κωδικός άλλαξε επιτυχώς"
|
||||
},
|
||||
"current_user": "Αυτήν τη στιγμή είστε συνδεδεμένος ως {fullName}.",
|
||||
"customize_sidebar": {
|
||||
|
||||
@@ -547,6 +547,8 @@
|
||||
"add_new": "Add new area…",
|
||||
"area": "Area",
|
||||
"clear": "Clear",
|
||||
"no_areas": "You don't have any areas",
|
||||
"no_match": "No matching areas found",
|
||||
"show_areas": "Show areas"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
@@ -567,6 +569,8 @@
|
||||
"clear": "Clear",
|
||||
"device": "Device",
|
||||
"no_area": "No area",
|
||||
"no_devices": "You don't have any devices",
|
||||
"no_match": "No matching devices found",
|
||||
"show_devices": "Show devices",
|
||||
"toggle": "Toggle"
|
||||
},
|
||||
@@ -578,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Clear",
|
||||
"entity": "Entity",
|
||||
"no_match": "No matching entities found",
|
||||
"show_entities": "Show entities"
|
||||
}
|
||||
},
|
||||
@@ -924,7 +929,7 @@
|
||||
"filter": "Reload filter entities",
|
||||
"generic": "Reload generic IP camera entities",
|
||||
"generic_thermostat": "Reload generic thermostat entities",
|
||||
"group": "Reload groups, group entities, and notify services",
|
||||
"group": "Reload groups, group entities, and group notify services",
|
||||
"history_stats": "Reload history stats entities",
|
||||
"homekit": "Reload HomeKit",
|
||||
"input_boolean": "Reload input booleans",
|
||||
@@ -937,7 +942,7 @@
|
||||
"person": "Reload people",
|
||||
"ping": "Reload ping binary sensor entities",
|
||||
"reload": "Reload {domain}",
|
||||
"rest": "Reload rest entities and notify services",
|
||||
"rest": "Reload rest entities, and rest notify services",
|
||||
"rpi_gpio": "Reload Raspberry Pi GPIO entities",
|
||||
"scene": "Reload scenes",
|
||||
"script": "Reload scripts",
|
||||
@@ -1253,7 +1258,7 @@
|
||||
"edit_ui": "Edit with UI",
|
||||
"edit_yaml": "Edit as YAML",
|
||||
"enable_disable": "Enable/Disable automation",
|
||||
"introduction": "Use automations to bring your home to live.",
|
||||
"introduction": "Use automations to bring your home to life.",
|
||||
"load_error_not_editable": "Only automations in automations.yaml are editable.",
|
||||
"load_error_unknown": "Error loading automation ({err_no}).",
|
||||
"max": {
|
||||
@@ -1412,12 +1417,14 @@
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"community_forums": "community forums",
|
||||
"error_no_url": "Please enter the URL of the blueprint.",
|
||||
"file_name": "Blueprint Path",
|
||||
"header": "Import a blueprint",
|
||||
"import_btn": "Preview blueprint",
|
||||
"import_header": "Blueprint \"{name}\"",
|
||||
"import_introduction": "You can import blueprints of other users from Github and the community forums. Enter the URL of the blueprint below.",
|
||||
"import_introduction_link": "You can import blueprints of other users from Github and the {community_link}. Enter the URL of the blueprint below.",
|
||||
"importing": "Loading blueprint...",
|
||||
"raw_blueprint": "Blueprint content",
|
||||
"save_btn": "Import blueprint",
|
||||
@@ -1432,14 +1439,15 @@
|
||||
"confirm_delete_header": "Delete this blueprint?",
|
||||
"confirm_delete_text": "Are you sure you want to delete this blueprint?",
|
||||
"delete_blueprint": "Delete blueprint",
|
||||
"discover_more": "Discover more blueprints",
|
||||
"header": "Blueprint Editor",
|
||||
"headers": {
|
||||
"domain": "Domain",
|
||||
"file_name": "File name",
|
||||
"name": "Name"
|
||||
},
|
||||
"introduction": "The blueprint editor allows you to create and edit blueprints.",
|
||||
"learn_more": "Learn more about blueprints",
|
||||
"introduction": "The blueprint configuration allows you to import and manage your blueprints.",
|
||||
"learn_more": "Learn more about using blueprints",
|
||||
"use_blueprint": "Create automation"
|
||||
}
|
||||
},
|
||||
@@ -2251,7 +2259,7 @@
|
||||
"without_device": "Entities without device"
|
||||
},
|
||||
"icon": "Icon",
|
||||
"introduction": "Use scenes to bring your home to live.",
|
||||
"introduction": "Use scenes to bring your home to life.",
|
||||
"load_error_not_editable": "Only scenes in scenes.yaml are editable.",
|
||||
"load_error_unknown": "Error loading scene ({err_no}).",
|
||||
"name": "Name",
|
||||
@@ -2337,7 +2345,7 @@
|
||||
"filter": "Reload filter entities",
|
||||
"generic": "Reload generic IP camera entities",
|
||||
"generic_thermostat": "Reload generic thermostat entities",
|
||||
"group": "Reload groups, group entities, and notify services",
|
||||
"group": "Reload groups, group entities, and group notify services",
|
||||
"heading": "YAML configuration reloading",
|
||||
"history_stats": "Reload history stats entities",
|
||||
"homekit": "Reload HomeKit",
|
||||
@@ -2352,7 +2360,7 @@
|
||||
"person": "Reload people",
|
||||
"ping": "Reload ping binary sensor entities",
|
||||
"reload": "Reload {domain}",
|
||||
"rest": "Reload rest entities and notify services",
|
||||
"rest": "Reload rest entities, and rest notify services",
|
||||
"rpi_gpio": "Reload Raspberry Pi GPIO entities",
|
||||
"scene": "Reload scenes",
|
||||
"script": "Reload scripts",
|
||||
@@ -2397,7 +2405,7 @@
|
||||
"description": "Description",
|
||||
"name": "Name",
|
||||
"new_tag": "New tag",
|
||||
"tag_id": "Tag id",
|
||||
"tag_id": "Tag ID",
|
||||
"tag_id_placeholder": "Autogenerated when left empty",
|
||||
"update": "Update",
|
||||
"usage": "A tag can trigger an automation when scanned, you can use NFC tags, QR codes or any other kind of tag. Use our {companion_link} to write this tag to a programmable NFC tag or create a QR code below."
|
||||
|
||||
@@ -547,6 +547,8 @@
|
||||
"add_new": "Añade una nueva área ...",
|
||||
"area": "Área",
|
||||
"clear": "Limpiar",
|
||||
"no_areas": "No tienes áreas",
|
||||
"no_match": "No se han encontrado áreas coincidentes",
|
||||
"show_areas": "Mostrar áreas"
|
||||
},
|
||||
"blueprint-picker": {
|
||||
@@ -567,6 +569,8 @@
|
||||
"clear": "Limpiar",
|
||||
"device": "Dispositivo",
|
||||
"no_area": "Ningún área",
|
||||
"no_devices": "No tienes ningún dispositivo",
|
||||
"no_match": "No se han encontrado dispositivos coincidentes",
|
||||
"show_devices": "Mostrar dispositivos",
|
||||
"toggle": "Interruptor"
|
||||
},
|
||||
@@ -578,6 +582,7 @@
|
||||
"entity-picker": {
|
||||
"clear": "Limpiar",
|
||||
"entity": "Entidad",
|
||||
"no_match": "No se han encontrado entidades coincidentes",
|
||||
"show_entities": "Mostrar entidades"
|
||||
}
|
||||
},
|
||||
@@ -701,10 +706,10 @@
|
||||
"never": "Nunca",
|
||||
"past": "Hace {time}",
|
||||
"past_duration": {
|
||||
"day": "hace {count} {count, plural,\none {día}\nother {días}\n}",
|
||||
"hour": "hace {count} {count, plural,\none {hora}\nother {horas}\n}",
|
||||
"minute": "hace {count} {count, plural,\none {minuto}\nother {minutos}\n}",
|
||||
"second": "hace {count} {count, plural,\none {segundo}\nother {segundos}\n}",
|
||||
"day": "Hace {count} {count, plural,\none {día}\nother {días}\n}",
|
||||
"hour": "Hace {count} {count, plural,\none {hora}\nother {horas}\n}",
|
||||
"minute": "Hace {count} {count, plural,\none {minuto}\nother {minutos}\n}",
|
||||
"second": "Hace {count} {count, plural,\none {segundo}\nother {segundos}\n}",
|
||||
"week": "hace {count} {count, plural,\none {semana}\nother {semanas}\n}"
|
||||
}
|
||||
},
|
||||
@@ -1043,7 +1048,7 @@
|
||||
"confirmation_text": "Todos los dispositivos en esta área quedarán sin asignar.",
|
||||
"confirmation_title": "¿Estás seguro de que deseas eliminar esta área?"
|
||||
},
|
||||
"description": "Agrupa dispositivos en áreas",
|
||||
"description": "Agrupa dispositivos y entidades en áreas",
|
||||
"editor": {
|
||||
"area_id": "ID de área",
|
||||
"create": "Crear",
|
||||
@@ -1088,7 +1093,7 @@
|
||||
"duplicate": "Duplicar",
|
||||
"header": "Acciones",
|
||||
"introduction": "Las acciones son lo que hará Home Assistant cuando se desencadene la automatización.",
|
||||
"learn_more": "Saber más sobre las acciones.",
|
||||
"learn_more": "Aprende más sobre las acciones.",
|
||||
"name": "Acción",
|
||||
"type_select": "Tipo de acción",
|
||||
"type": {
|
||||
@@ -1164,7 +1169,7 @@
|
||||
"blueprint_to_use": "Plano a usar",
|
||||
"header": "Plano",
|
||||
"inputs": "Entradas",
|
||||
"manage_blueprints": "Administrar planos",
|
||||
"manage_blueprints": "Administra los planos",
|
||||
"no_blueprints": "No tienes ningún plano",
|
||||
"no_inputs": "Este plano no tiene ninguna entrada."
|
||||
},
|
||||
@@ -1175,7 +1180,7 @@
|
||||
"duplicate": "Duplicar",
|
||||
"header": "Condiciones",
|
||||
"introduction": "Las condiciones son opcionales e impedirán cualquier\nejecución posterior a menos que se cumplan todas las condiciones.",
|
||||
"learn_more": "Saber más sobre las condiciones",
|
||||
"learn_more": "Aprende más sobre las condiciones",
|
||||
"name": "Condición",
|
||||
"type_select": "Tipo de condición",
|
||||
"type": {
|
||||
@@ -1279,7 +1284,7 @@
|
||||
"duplicate": "Duplicar",
|
||||
"header": "Desencadenantes",
|
||||
"introduction": "Los desencadenantes son los que inician el funcionamiento de una regla de automatización. Es posible especificar varios desencadenantes para la misma regla. Una vez que se inicia un desencadenante, Home Assistant comprobará las condiciones, si las hubiere, y ejecutará la acción.",
|
||||
"learn_more": "Saber más sobre los desencadenantes",
|
||||
"learn_more": "Aprende más sobre los desencadenantes",
|
||||
"name": "Desencadenante",
|
||||
"type_select": "Tipo de desencadenante",
|
||||
"type": {
|
||||
@@ -1387,7 +1392,7 @@
|
||||
"name": "Nombre"
|
||||
},
|
||||
"introduction": "El editor de automatización te permite crear y editar automatizaciones. En el enlace siguiente puedes leer las instrucciones para asegurarte de que has configurado correctamente Home Assistant.",
|
||||
"learn_more": "Saber más sobre las automatizaciones",
|
||||
"learn_more": "Aprende más sobre las automatizaciones",
|
||||
"no_automations": "No pudimos encontrar ninguna automatización editable",
|
||||
"only_editable": "Solo las automatizaciones definidas en automations.yaml son editables.",
|
||||
"pick_automation": "Elije la automatización para editar",
|
||||
@@ -1412,34 +1417,37 @@
|
||||
},
|
||||
"blueprint": {
|
||||
"add": {
|
||||
"community_forums": "foros de la comunidad",
|
||||
"error_no_url": "Por favor, introduce la URL del plano.",
|
||||
"file_name": "Nombre de archivo del plano local",
|
||||
"header": "Añadir nuevo plano",
|
||||
"import_btn": "Importar plano",
|
||||
"import_header": "Importar {name} (tipo: {domain})",
|
||||
"file_name": "Ruta del plano",
|
||||
"header": "Importar un plano",
|
||||
"import_btn": "Vista previa del plano",
|
||||
"import_header": "Plano \"{name}\"",
|
||||
"import_introduction": "Puedes importar planos de otros usuarios desde Github y los foros de la comunidad. Introduce la URL del plano a continuación.",
|
||||
"importing": "Importando plano...",
|
||||
"import_introduction_link": "Puedes importar planos de otros usuarios desde Github y {community_link}. Introduce la URL del plano a continuación.",
|
||||
"importing": "Cargando plano...",
|
||||
"raw_blueprint": "Contenido del plano",
|
||||
"save_btn": "Guardar plano",
|
||||
"saving": "Guardando plano...",
|
||||
"save_btn": "Importar plano",
|
||||
"saving": "Importando plano...",
|
||||
"unsupported_blueprint": "Este plano no es compatible",
|
||||
"url": "URL del plano"
|
||||
},
|
||||
"caption": "Planos",
|
||||
"description": "Administrar planos",
|
||||
"description": "Administra los planos",
|
||||
"overview": {
|
||||
"add_blueprint": "Importar plano",
|
||||
"confirm_delete_header": "¿Eliminar este plano?",
|
||||
"confirm_delete_text": "¿Estás seguro de que quieres borrar este plano?",
|
||||
"delete_blueprint": "Eliminar plano",
|
||||
"discover_more": "Descubre más planos",
|
||||
"header": "Editor de planos",
|
||||
"headers": {
|
||||
"domain": "Dominio",
|
||||
"file_name": "Nombre de archivo",
|
||||
"name": "Nombre"
|
||||
},
|
||||
"introduction": "El editor de planos te permite crear y editar planos.",
|
||||
"learn_more": "Más información sobre planos",
|
||||
"introduction": "La configuración de planos te permite importar y administrar tus planos.",
|
||||
"learn_more": "Aprende más sobre el uso de planos",
|
||||
"use_blueprint": "Crear automatización"
|
||||
}
|
||||
},
|
||||
@@ -1499,7 +1507,7 @@
|
||||
"webhooks": {
|
||||
"disable_hook_error_msg": "No se pudo deshabilitar el webhook:",
|
||||
"info": "Cualquier cosa que esté configurada para ser activada por un webhook puede recibir una URL de acceso público para permitirte enviar datos a Home Assistant desde cualquier lugar, sin exponer tu instancia a Internet.",
|
||||
"link_learn_more": "Saber más sobre la creación de automatizaciones basadas en webhook.",
|
||||
"link_learn_more": "Aprende más sobre la creación de automatizaciones basadas en webhook.",
|
||||
"loading": "Cargando ...",
|
||||
"manage": "Administrar",
|
||||
"no_hooks_yet": "Parece que aún no tienes webhooks. Comienza configurando un",
|
||||
@@ -1579,7 +1587,7 @@
|
||||
"introduction2": "Este servicio está a cargo de nuestro socio.",
|
||||
"introduction2a": ", una compañía fundada por los fundadores de Home Assistant y Hass.io.",
|
||||
"introduction3": "Home Assistant Cloud es un servicio de suscripción con una prueba gratuita de un mes. No se necesita información de pago.",
|
||||
"learn_more_link": "Saber más sobre Home Assistant Cloud",
|
||||
"learn_more_link": "Aprende más sobre Home Assistant Cloud",
|
||||
"password": "Contraseña",
|
||||
"password_error_msg": "Las contraseñas tienen al menos 8 caracteres.",
|
||||
"sign_in": "Inicia sesión",
|
||||
@@ -1982,7 +1990,7 @@
|
||||
"logs": {
|
||||
"caption": "Registros",
|
||||
"clear": "Limpiar",
|
||||
"description": "Ver los registros de Home Assistant",
|
||||
"description": "Ve los registros de Home Assistant",
|
||||
"details": "Detalles de registro ({level})",
|
||||
"load_full_log": "Cargar registro completo de Home Assistant",
|
||||
"loading_log": "Cargando registro de errores...",
|
||||
@@ -2224,7 +2232,7 @@
|
||||
"update": "Actualizar"
|
||||
},
|
||||
"introduction": "Aquí puedes definir a cada persona de interés en Home Assistant.",
|
||||
"learn_more": "Saber más sobre las personas",
|
||||
"learn_more": "Aprende más sobre las personas",
|
||||
"no_persons_created_yet": "Parece que aún no has creado ninguna persona.",
|
||||
"note_about_persons_configured_in_yaml": "Nota: las personas configuradas a través de configuration.yaml no se pueden editar a través de la IU.",
|
||||
"person_not_found": "No pudimos encontrar a la persona que intentabas editar.",
|
||||
@@ -2268,7 +2276,7 @@
|
||||
"name": "Nombre"
|
||||
},
|
||||
"introduction": "El editor de escenas te permite crear y editar escenas. Por favor, sigue el siguiente enlace para leer las instrucciones para asegurarte de que has configurado Home Assistant correctamente.",
|
||||
"learn_more": "Saber más sobre las escenas",
|
||||
"learn_more": "Aprende más sobre las escenas",
|
||||
"no_scenes": "No pudimos encontrar ninguna escena editable",
|
||||
"only_editable": "Solo las escenas definidas en scenes.yaml son editables.",
|
||||
"pick_scene": "Elige una escena para editar",
|
||||
@@ -2289,7 +2297,7 @@
|
||||
"id_already_exists": "Este ID ya existe",
|
||||
"id_already_exists_save_error": "No puedes guardar este script porque el ID no es único, elije otro ID o déjalo en blanco para generar uno automáticamente.",
|
||||
"introduction": "Utiliza scripts para ejecutar una secuencia de acciones.",
|
||||
"link_available_actions": "Saber más sobre las acciones disponibles.",
|
||||
"link_available_actions": "Aprende más sobre las acciones disponibles.",
|
||||
"load_error_not_editable": "Solo los scripts dentro de scripts.yaml son editables.",
|
||||
"max": {
|
||||
"parallel": "Número máximo de ejecuciones paralelas",
|
||||
@@ -2318,7 +2326,7 @@
|
||||
"name": "Nombre"
|
||||
},
|
||||
"introduction": "El editor de scripts te permite crear y editar scripts. Por favor, sigue el siguiente enlace para leer las instrucciones para asegurarte de que has configurado Home Assistant correctamente.",
|
||||
"learn_more": "Saber más sobre los scripts",
|
||||
"learn_more": "Aprende más sobre los scripts",
|
||||
"no_scripts": "No hemos encontrado ningún script editable",
|
||||
"run_script": "Ejecutar script",
|
||||
"show_info": "Mostrar información sobre el script",
|
||||
@@ -2407,7 +2415,7 @@
|
||||
"last_scanned": "Última vez escaneada",
|
||||
"name": "Nombre"
|
||||
},
|
||||
"learn_more": "Más información sobre las etiquetas",
|
||||
"learn_more": "Aprende más sobre las etiquetas",
|
||||
"never_scanned": "Nunca escaneado",
|
||||
"no_tags": "Sin etiquetas",
|
||||
"write": "Escribir"
|
||||
@@ -2423,7 +2431,7 @@
|
||||
"username": "Nombre de usuario"
|
||||
},
|
||||
"caption": "Usuarios",
|
||||
"description": "Administra usuarios",
|
||||
"description": "Administra las cuentas de usuario de Home Assistant",
|
||||
"editor": {
|
||||
"activate_user": "Activar usuario",
|
||||
"active": "Activo",
|
||||
@@ -2621,7 +2629,7 @@
|
||||
"wakeup_interval": "Intervalo de activación"
|
||||
},
|
||||
"description": "Administra tu red Z-Wave",
|
||||
"learn_more": "Saber más sobre Z-Wave",
|
||||
"learn_more": "Aprende más sobre Z-Wave",
|
||||
"network_management": {
|
||||
"header": "Administración de red Z-Wave",
|
||||
"introduction": "Ejecutar comandos que afectan a la red Z-Wave. No recibirás comentarios sobre si la mayoría de los comandos tuvieron éxito, pero puedes consultar el Registro OZW para intentar averiguarlo."
|
||||
@@ -3360,7 +3368,7 @@
|
||||
"demo": {
|
||||
"demo_by": "por {name}",
|
||||
"introduction": "¡Bienvenido a casa! Has llegado a la demostración de Home Assistant donde mostramos las mejores interfaces de usuario creadas por nuestra comunidad.",
|
||||
"learn_more": "Saber más sobre Home Assistant",
|
||||
"learn_more": "Aprende más sobre Home Assistant",
|
||||
"next_demo": "Siguiente demostración"
|
||||
}
|
||||
},
|
||||
@@ -3440,7 +3448,7 @@
|
||||
"profile": {
|
||||
"advanced_mode": {
|
||||
"description": "Desbloquea las funciones avanzadas.",
|
||||
"link_promo": "Saber más",
|
||||
"link_promo": "Aprende más",
|
||||
"title": "Modo avanzado"
|
||||
},
|
||||
"change_password": {
|
||||
@@ -3521,7 +3529,7 @@
|
||||
"error_load_platform": "Configurar notify.html5.",
|
||||
"error_use_https": "Requiere SSL activado para frontend.",
|
||||
"header": "Notificaciones push",
|
||||
"link_promo": "Saber más",
|
||||
"link_promo": "Aprende más",
|
||||
"push_notifications": "Notificaciones push"
|
||||
},
|
||||
"refresh_tokens": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user