mirror of
https://github.com/home-assistant/frontend.git
synced 2025-09-14 23:49:44 +00:00
Compare commits
80 Commits
entity-fil
...
20220202.0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c85236e251 | ||
![]() |
a88da0e39a | ||
![]() |
21a8fac477 | ||
![]() |
ca5ce04a38 | ||
![]() |
7c4b9a0410 | ||
![]() |
de6f06ea6d | ||
![]() |
bbc8e323e8 | ||
![]() |
89b6863ae3 | ||
![]() |
3f1850e9eb | ||
![]() |
54d6b5b6f3 | ||
![]() |
fb55ab197f | ||
![]() |
cc2db9a761 | ||
![]() |
58ba3e5c22 | ||
![]() |
182ffccd0c | ||
![]() |
ce99d14ee0 | ||
![]() |
8ce160b9ce | ||
![]() |
fe33714c8b | ||
![]() |
afbe85625c | ||
![]() |
cb47ee7721 | ||
![]() |
5caa256f1b | ||
![]() |
c66dfb84f9 | ||
![]() |
df1d703e4e | ||
![]() |
ce0ced0b6a | ||
![]() |
730e9b144d | ||
![]() |
69ff8dd0c4 | ||
![]() |
389a100b46 | ||
![]() |
9fee7a2829 | ||
![]() |
a91897821a | ||
![]() |
815a2a07ff | ||
![]() |
b8d3eb76ac | ||
![]() |
ba75c2e7af | ||
![]() |
f04b844223 | ||
![]() |
242bad0a29 | ||
![]() |
8b20b2b63c | ||
![]() |
e0c8efc5e6 | ||
![]() |
f59c30ac04 | ||
![]() |
e4b9c08b45 | ||
![]() |
04e63eefe2 | ||
![]() |
a064ca0856 | ||
![]() |
6044ea92ad | ||
![]() |
17e8215420 | ||
![]() |
a4ae1bee79 | ||
![]() |
7d335d7d85 | ||
![]() |
7c194d8910 | ||
![]() |
a92100bb0a | ||
![]() |
303af611d1 | ||
![]() |
559b6e9d5b | ||
![]() |
75a95ff675 | ||
![]() |
3024ee43f9 | ||
![]() |
b34b92fa87 | ||
![]() |
1832ed0a48 | ||
![]() |
f398692e75 | ||
![]() |
68bee4dd58 | ||
![]() |
f1297e1f36 | ||
![]() |
953e3e060b | ||
![]() |
c37f660718 | ||
![]() |
02754369a6 | ||
![]() |
0df9e9932f | ||
![]() |
eddb392ad0 | ||
![]() |
e8ba349447 | ||
![]() |
5be22d46ab | ||
![]() |
ffaff30b46 | ||
![]() |
069f08b55e | ||
![]() |
204ccf8b40 | ||
![]() |
0ab8f8fd7c | ||
![]() |
9b0b2c5b71 | ||
![]() |
0800c702fb | ||
![]() |
b7bd7c1065 | ||
![]() |
61bae5da64 | ||
![]() |
bdd13db8cf | ||
![]() |
cdc3d11181 | ||
![]() |
8f729e2a95 | ||
![]() |
bc9195f7d5 | ||
![]() |
7f1a321075 | ||
![]() |
72b9f8636d | ||
![]() |
c9cd316c0c | ||
![]() |
6cf3580fb4 | ||
![]() |
5d91aefb55 | ||
![]() |
e3c0530941 | ||
![]() |
2c9223ed80 |
2
.github/workflows/release.yaml
vendored
2
.github/workflows/release.yaml
vendored
@@ -41,7 +41,7 @@ jobs:
|
||||
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
|
||||
- name: Build and release package
|
||||
run: |
|
||||
python3 -m pip install twine
|
||||
python3 -m pip install twine build
|
||||
export TWINE_USERNAME="__token__"
|
||||
export TWINE_PASSWORD="${{ secrets.TWINE_TOKEN }}"
|
||||
|
||||
|
@@ -1,5 +1,4 @@
|
||||
include README.md
|
||||
include LICENSE.md
|
||||
graft hass_frontend
|
||||
graft hass_frontend_es5
|
||||
recursive-exclude * *.py[co]
|
||||
|
@@ -26,11 +26,11 @@ module.exports = {
|
||||
},
|
||||
version() {
|
||||
const version = fs
|
||||
.readFileSync(path.resolve(paths.polymer_dir, "setup.py"), "utf8")
|
||||
.match(/\d{8}\.\d+/);
|
||||
.readFileSync(path.resolve(paths.polymer_dir, "setup.cfg"), "utf8")
|
||||
.match(/version\W+=\W(\d{8}\.\d)/);
|
||||
if (!version) {
|
||||
throw Error("Version not found");
|
||||
}
|
||||
return version[0];
|
||||
return version[1];
|
||||
},
|
||||
};
|
||||
|
@@ -188,6 +188,7 @@ class HaGallery extends LitElement {
|
||||
|
||||
.sidebar details {
|
||||
margin-top: 1em;
|
||||
margin-left: 1em;
|
||||
}
|
||||
|
||||
.sidebar summary {
|
||||
|
@@ -114,7 +114,7 @@ class HassioAddonConfig extends LitElement {
|
||||
<div class="card-menu">
|
||||
<ha-button-menu corner="BOTTOM_START" @action=${this._handleAction}>
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("common.menu")}
|
||||
.label=${this.supervisor.localize("common.menu")}
|
||||
.path=${mdiDotsVertical}
|
||||
slot="trigger"
|
||||
></ha-icon-button>
|
||||
|
@@ -191,7 +191,7 @@ export class HassioBackups extends LitElement {
|
||||
@action=${this._handleAction}
|
||||
>
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("common.menu")}
|
||||
.label=${this.supervisor?.localize("common.menu")}
|
||||
.path=${mdiDotsVertical}
|
||||
slot="trigger"
|
||||
></ha-icon-button>
|
||||
|
@@ -17,27 +17,27 @@ export class DialogHassioBackupUpload
|
||||
{
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
|
||||
@state() private _params?: HassioBackupUploadDialogParams;
|
||||
@state() private _dialogParams?: HassioBackupUploadDialogParams;
|
||||
|
||||
public async showDialog(
|
||||
params: HassioBackupUploadDialogParams
|
||||
dialogParams: HassioBackupUploadDialogParams
|
||||
): Promise<void> {
|
||||
this._params = params;
|
||||
this._dialogParams = dialogParams;
|
||||
await this.updateComplete;
|
||||
}
|
||||
|
||||
public closeDialog(): void {
|
||||
if (this._params && !this._params.onboarding) {
|
||||
if (this._params.reloadBackup) {
|
||||
this._params.reloadBackup();
|
||||
if (this._dialogParams && !this._dialogParams.onboarding) {
|
||||
if (this._dialogParams.reloadBackup) {
|
||||
this._dialogParams.reloadBackup();
|
||||
}
|
||||
}
|
||||
this._params = undefined;
|
||||
this._dialogParams = undefined;
|
||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||
}
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (!this._params) {
|
||||
if (!this._dialogParams) {
|
||||
return html``;
|
||||
}
|
||||
|
||||
@@ -52,9 +52,13 @@ export class DialogHassioBackupUpload
|
||||
>
|
||||
<div slot="heading">
|
||||
<ha-header-bar>
|
||||
<span slot="title"> Upload backup </span>
|
||||
<span slot="title"
|
||||
>${this.hass?.localize(
|
||||
"ui.panel.page-onboarding.restore.upload_backup"
|
||||
) || "Upload backup"}</span
|
||||
>
|
||||
<ha-icon-button
|
||||
.label=${this.hass?.localize("common.close") || "close"}
|
||||
.label=${this.hass?.localize("ui.common.close") || "Close"}
|
||||
.path=${mdiClose}
|
||||
slot="actionItems"
|
||||
dialogAction="cancel"
|
||||
@@ -71,7 +75,7 @@ export class DialogHassioBackupUpload
|
||||
|
||||
private _backupUploaded(ev) {
|
||||
const backup = ev.detail.backup;
|
||||
this._params?.showBackup(backup.slug);
|
||||
this._dialogParams?.showBackup(backup.slug);
|
||||
this.closeDialog();
|
||||
}
|
||||
|
||||
|
@@ -48,9 +48,9 @@ class HassioBackupDialog
|
||||
@query("supervisor-backup-content")
|
||||
private _backupContent!: SupervisorBackupContent;
|
||||
|
||||
public async showDialog(params: HassioBackupDialogParams) {
|
||||
this._backup = await fetchHassioBackupInfo(this.hass, params.slug);
|
||||
this._dialogParams = params;
|
||||
public async showDialog(dialogParams: HassioBackupDialogParams) {
|
||||
this._backup = await fetchHassioBackupInfo(this.hass, dialogParams.slug);
|
||||
this._dialogParams = dialogParams;
|
||||
this._restoringBackup = false;
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ class HassioBackupDialog
|
||||
<ha-header-bar>
|
||||
<span slot="title">${this._backup.name}</span>
|
||||
<ha-icon-button
|
||||
.label=${this.hass?.localize("common.close") || "close"}
|
||||
.label=${this.hass?.localize("ui.common.close") || "Close"}
|
||||
.path=${mdiClose}
|
||||
slot="actionItems"
|
||||
dialogAction="cancel"
|
||||
@@ -114,12 +114,20 @@ class HassioBackupDialog
|
||||
@closed=${stopPropagation}
|
||||
>
|
||||
<ha-icon-button
|
||||
.label=${this.hass!.localize("common.menu")}
|
||||
.label=${this.hass!.localize("ui.common.menu") || "Menu"}
|
||||
.path=${mdiDotsVertical}
|
||||
slot="trigger"
|
||||
></ha-icon-button>
|
||||
<mwc-list-item>Download Backup</mwc-list-item>
|
||||
<mwc-list-item class="error">Delete Backup</mwc-list-item>
|
||||
<mwc-list-item
|
||||
>${this._dialogParams.supervisor?.localize(
|
||||
"backup.download_backup"
|
||||
)}</mwc-list-item
|
||||
>
|
||||
<mwc-list-item class="error"
|
||||
>${this._dialogParams.supervisor?.localize(
|
||||
"backup.delete_backup_title"
|
||||
)}</mwc-list-item
|
||||
>
|
||||
</ha-button-menu>`
|
||||
: ""}
|
||||
</ha-dialog>
|
||||
|
@@ -30,8 +30,8 @@ class HassioCreateBackupDialog extends LitElement {
|
||||
@query("supervisor-backup-content")
|
||||
private _backupContent!: SupervisorBackupContent;
|
||||
|
||||
public showDialog(params: HassioCreateBackupDialogParams) {
|
||||
this._dialogParams = params;
|
||||
public showDialog(dialogParams: HassioCreateBackupDialogParams) {
|
||||
this._dialogParams = dialogParams;
|
||||
this._creatingBackup = false;
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ class HassioCreateBackupDialog extends LitElement {
|
||||
)}
|
||||
>
|
||||
${this._creatingBackup
|
||||
? html` <ha-circular-progress active></ha-circular-progress>`
|
||||
? html`<ha-circular-progress active></ha-circular-progress>`
|
||||
: html`<supervisor-backup-content
|
||||
.hass=${this.hass}
|
||||
.supervisor=${this._dialogParams.supervisor}
|
||||
|
@@ -39,8 +39,8 @@ class HassioHardwareDialog extends LitElement {
|
||||
|
||||
@state() private _filter?: string;
|
||||
|
||||
public showDialog(params: HassioHardwareDialogParams) {
|
||||
this._dialogParams = params;
|
||||
public showDialog(dialogParams: HassioHardwareDialogParams) {
|
||||
this._dialogParams = dialogParams;
|
||||
}
|
||||
|
||||
public closeDialog() {
|
||||
@@ -72,7 +72,7 @@ class HassioHardwareDialog extends LitElement {
|
||||
${this._dialogParams.supervisor.localize("dialog.hardware.title")}
|
||||
</h2>
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("common.close")}
|
||||
.label=${this._dialogParams.supervisor.localize("common.close")}
|
||||
.path=${mdiClose}
|
||||
dialogAction="close"
|
||||
></ha-icon-button>
|
||||
|
@@ -104,7 +104,7 @@ export class DialogHassioNetwork
|
||||
${this.supervisor.localize("dialog.network.title")}
|
||||
</span>
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("common.close")}
|
||||
.label=${this.supervisor.localize("common.close")}
|
||||
.path=${mdiClose}
|
||||
slot="actionItems"
|
||||
dialogAction="cancel"
|
||||
|
@@ -186,7 +186,7 @@ class HassioHostInfo extends LitElement {
|
||||
|
||||
<ha-button-menu corner="BOTTOM_START">
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("common.menu")}
|
||||
.label=${this.supervisor.localize("common.menu")}
|
||||
.path=${mdiDotsVertical}
|
||||
slot="trigger"
|
||||
></ha-icon-button>
|
||||
|
11
package.json
11
package.json
@@ -110,7 +110,7 @@
|
||||
"js-yaml": "^4.1.0",
|
||||
"leaflet": "^1.7.1",
|
||||
"leaflet-draw": "^1.0.4",
|
||||
"lit": "^2.0.2",
|
||||
"lit": "^2.1.2",
|
||||
"lit-vaadin-helpers": "^0.2.1",
|
||||
"marked": "^3.0.2",
|
||||
"memoize-one": "^5.2.1",
|
||||
@@ -168,6 +168,7 @@
|
||||
"@types/leaflet-draw": "^1",
|
||||
"@types/marked": "^2",
|
||||
"@types/mocha": "^8",
|
||||
"@types/qrcode": "^1.4.2",
|
||||
"@types/sortablejs": "^1",
|
||||
"@types/webspeechapi": "^0.0.29",
|
||||
"@typescript-eslint/eslint-plugin": "^4.32.0",
|
||||
@@ -235,10 +236,10 @@
|
||||
"resolutions": {
|
||||
"@polymer/polymer": "patch:@polymer/polymer@3.4.1#./.yarn/patches/@polymer/polymer/pr-5569.patch",
|
||||
"@webcomponents/webcomponentsjs": "^2.2.10",
|
||||
"lit": "^2.0.2",
|
||||
"lit-html": "2.0.1",
|
||||
"lit-element": "3.0.1",
|
||||
"@lit/reactive-element": "1.0.1"
|
||||
"lit": "^2.1.2",
|
||||
"lit-html": "2.1.2",
|
||||
"lit-element": "3.1.2",
|
||||
"@lit/reactive-element": "1.2.1"
|
||||
},
|
||||
"main": "src/home-assistant.js",
|
||||
"husky": {
|
||||
|
3
pyproject.toml
Normal file
3
pyproject.toml
Normal file
@@ -0,0 +1,3 @@
|
||||
[build-system]
|
||||
requires = ["setuptools~=60.5", "wheel~=0.37.1"]
|
||||
build-backend = "setuptools.build_meta"
|
@@ -11,6 +11,6 @@ yarn install
|
||||
|
||||
script/build_frontend
|
||||
|
||||
rm -rf dist
|
||||
python3 setup.py -q sdist
|
||||
rm -rf dist home_assistant_frontend.egg-info
|
||||
python3 -m build
|
||||
python3 -m twine upload dist/* --skip-existing
|
||||
|
@@ -50,14 +50,14 @@ async function main(args) {
|
||||
return;
|
||||
}
|
||||
|
||||
const setup = fs.readFileSync("setup.py", "utf8");
|
||||
const setup = fs.readFileSync("setup.cfg", "utf8");
|
||||
const version = setup.match(/\d{8}\.\d+/)[0];
|
||||
const newVersion = method(version);
|
||||
|
||||
console.log("Current version:", version);
|
||||
console.log("New version:", newVersion);
|
||||
|
||||
fs.writeFileSync("setup.py", setup.replace(version, newVersion), "utf-8");
|
||||
fs.writeFileSync("setup.cfg", setup.replace(version, newVersion), "utf-8");
|
||||
|
||||
if (!commit) {
|
||||
return;
|
||||
|
21
setup.cfg
Normal file
21
setup.cfg
Normal file
@@ -0,0 +1,21 @@
|
||||
[metadata]
|
||||
name = home-assistant-frontend
|
||||
version = 20220202.0
|
||||
author = The Home Assistant Authors
|
||||
author_email = hello@home-assistant.io
|
||||
license = Apache-2.0
|
||||
platforms = any
|
||||
description = The Home Assistant frontend
|
||||
long_description = file: README.md
|
||||
long_description_content_type = text/markdown
|
||||
url = https://github.com/home-assistant/frontend
|
||||
|
||||
[options]
|
||||
packages = find:
|
||||
zip_safe = False
|
||||
include_package_data = True
|
||||
python_requires = >= 3.4.0
|
||||
|
||||
[options.packages.find]
|
||||
include =
|
||||
hass_frontend*
|
19
setup.py
19
setup.py
@@ -1,14 +1,7 @@
|
||||
from setuptools import setup, find_packages
|
||||
"""
|
||||
Entry point for setuptools. Required for editable installs.
|
||||
TODO: Remove file after updating to pip 21.3
|
||||
"""
|
||||
from setuptools import setup
|
||||
|
||||
setup(
|
||||
name="home-assistant-frontend",
|
||||
version="20220124.0",
|
||||
description="The Home Assistant frontend",
|
||||
url="https://github.com/home-assistant/frontend",
|
||||
author="The Home Assistant Authors",
|
||||
author_email="hello@home-assistant.io",
|
||||
license="Apache-2.0",
|
||||
packages=find_packages(include=["hass_frontend", "hass_frontend.*"]),
|
||||
include_package_data=True,
|
||||
zip_safe=False,
|
||||
)
|
||||
setup()
|
||||
|
@@ -184,6 +184,7 @@ export const DOMAINS_WITH_MORE_INFO = [
|
||||
"person",
|
||||
"remote",
|
||||
"script",
|
||||
"scene",
|
||||
"sun",
|
||||
"timer",
|
||||
"vacuum",
|
||||
@@ -234,7 +235,7 @@ export const DOMAINS_INPUT_ROW = [
|
||||
];
|
||||
|
||||
/** Domains that should have the history hidden in the more info dialog. */
|
||||
export const DOMAINS_MORE_INFO_NO_HISTORY = ["camera", "configurator", "scene"];
|
||||
export const DOMAINS_MORE_INFO_NO_HISTORY = ["camera", "configurator"];
|
||||
|
||||
/** States that we consider "off". */
|
||||
export const STATES_OFF = ["closed", "locked", "off"];
|
||||
|
@@ -13,14 +13,19 @@ export const formatDateTime = (dateObj: Date, locale: FrontendLocaleData) =>
|
||||
|
||||
const formatDateTimeMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
// August 9, 2021, 8:23:15 AM
|
||||
@@ -31,15 +36,20 @@ export const formatDateTimeWithSeconds = (
|
||||
|
||||
const formatDateTimeWithSecondsMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
year: "numeric",
|
||||
month: "long",
|
||||
day: "numeric",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
// 9/8/2021, 8:23 AM
|
||||
@@ -50,12 +60,17 @@ export const formatDateTimeNumeric = (
|
||||
|
||||
const formatDateTimeNumericMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
year: "numeric",
|
||||
month: "numeric",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
year: "numeric",
|
||||
month: "numeric",
|
||||
day: "numeric",
|
||||
hour: "numeric",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@@ -13,11 +13,16 @@ export const formatTime = (dateObj: Date, locale: FrontendLocaleData) =>
|
||||
|
||||
const formatTimeMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
hour: "numeric",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
hour: "numeric",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
// 9:15:24 PM || 21:15:24
|
||||
@@ -28,12 +33,17 @@ export const formatTimeWithSeconds = (
|
||||
|
||||
const formatTimeWithSecondsMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
second: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
// Tuesday 7:00 PM || Tuesday 19:00
|
||||
@@ -42,10 +52,15 @@ export const formatTimeWeekday = (dateObj: Date, locale: FrontendLocaleData) =>
|
||||
|
||||
const formatTimeWeekdayMem = memoizeOne(
|
||||
(locale: FrontendLocaleData) =>
|
||||
new Intl.DateTimeFormat(locale.language, {
|
||||
weekday: "long",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
})
|
||||
new Intl.DateTimeFormat(
|
||||
locale.language === "en" && !useAmPm(locale)
|
||||
? "en-u-hc-h23"
|
||||
: locale.language,
|
||||
{
|
||||
weekday: "long",
|
||||
hour: useAmPm(locale) ? "numeric" : "2-digit",
|
||||
minute: "2-digit",
|
||||
hour12: useAmPm(locale),
|
||||
}
|
||||
)
|
||||
);
|
||||
|
@@ -120,6 +120,7 @@ export const computeStateDisplay = (
|
||||
if (
|
||||
domain === "button" ||
|
||||
domain === "input_button" ||
|
||||
domain === "scene" ||
|
||||
(domain === "sensor" && stateObj.attributes.device_class === "timestamp")
|
||||
) {
|
||||
return formatDateTime(new Date(compareState), locale);
|
||||
|
@@ -1,2 +1,10 @@
|
||||
export const clamp = (value: number, min: number, max: number) =>
|
||||
Math.min(Math.max(value, min), max);
|
||||
|
||||
// Variant that only applies the clamping to a border if the border is defined
|
||||
export const conditionalClamp = (value: number, min?: number, max?: number) => {
|
||||
let result: number;
|
||||
result = min ? Math.max(value, min) : value;
|
||||
result = max ? Math.min(value, max) : value;
|
||||
return result;
|
||||
};
|
||||
|
@@ -77,7 +77,7 @@ export const computeLocalize = async (
|
||||
|
||||
await loadPolyfillLocales(language);
|
||||
|
||||
// Everytime any of the parameters change, invalidate the strings cache.
|
||||
// Every time any of the parameters change, invalidate the strings cache.
|
||||
cache._localizationCache = {};
|
||||
|
||||
return (key, ...args) => {
|
||||
|
@@ -68,6 +68,7 @@ export class HaProgressButton extends LitElement {
|
||||
--mdc-theme-primary: white;
|
||||
background-color: var(--success-color);
|
||||
transition: none;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
mwc-button[raised].success {
|
||||
@@ -79,6 +80,7 @@ export class HaProgressButton extends LitElement {
|
||||
--mdc-theme-primary: white;
|
||||
background-color: var(--error-color);
|
||||
transition: none;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
mwc-button[raised].error {
|
||||
|
@@ -183,12 +183,7 @@ class StateHistoryChartLine extends LitElement {
|
||||
prevValues = datavalues;
|
||||
};
|
||||
|
||||
const addDataSet = (
|
||||
nameY: string,
|
||||
step = false,
|
||||
fill = false,
|
||||
color?: string
|
||||
) => {
|
||||
const addDataSet = (nameY: string, fill = false, color?: string) => {
|
||||
if (!color) {
|
||||
color = getGraphColorByIndex(colorIndex, computedStyles);
|
||||
colorIndex++;
|
||||
@@ -198,7 +193,7 @@ class StateHistoryChartLine extends LitElement {
|
||||
fill: fill ? "origin" : false,
|
||||
borderColor: color,
|
||||
backgroundColor: color + "7F",
|
||||
stepped: step ? "before" : false,
|
||||
stepped: "before",
|
||||
pointRadius: 0,
|
||||
data: [],
|
||||
});
|
||||
@@ -239,14 +234,12 @@ class StateHistoryChartLine extends LitElement {
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.climate.current_temperature", {
|
||||
name: name,
|
||||
})}`,
|
||||
true
|
||||
})}`
|
||||
);
|
||||
if (hasHeat) {
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.climate.heating", { name: name })}`,
|
||||
true,
|
||||
true,
|
||||
computedStyles.getPropertyValue("--state-climate-heat-color")
|
||||
);
|
||||
// The "heating" series uses steppedArea to shade the area below the current
|
||||
@@ -256,7 +249,6 @@ class StateHistoryChartLine extends LitElement {
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.climate.cooling", { name: name })}`,
|
||||
true,
|
||||
true,
|
||||
computedStyles.getPropertyValue("--state-climate-cool-color")
|
||||
);
|
||||
// The "cooling" series uses steppedArea to shade the area below the current
|
||||
@@ -268,22 +260,19 @@ class StateHistoryChartLine extends LitElement {
|
||||
`${this.hass.localize("ui.card.climate.target_temperature_mode", {
|
||||
name: name,
|
||||
mode: this.hass.localize("ui.card.climate.high"),
|
||||
})}`,
|
||||
true
|
||||
})}`
|
||||
);
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.climate.target_temperature_mode", {
|
||||
name: name,
|
||||
mode: this.hass.localize("ui.card.climate.low"),
|
||||
})}`,
|
||||
true
|
||||
})}`
|
||||
);
|
||||
} else {
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.climate.target_temperature_entity", {
|
||||
name: name,
|
||||
})}`,
|
||||
true
|
||||
})}`
|
||||
);
|
||||
}
|
||||
|
||||
@@ -318,14 +307,12 @@ class StateHistoryChartLine extends LitElement {
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.humidifier.target_humidity_entity", {
|
||||
name: name,
|
||||
})}`,
|
||||
true
|
||||
})}`
|
||||
);
|
||||
addDataSet(
|
||||
`${this.hass.localize("ui.card.humidifier.on_entity", {
|
||||
name: name,
|
||||
})}`,
|
||||
true,
|
||||
true
|
||||
);
|
||||
|
||||
@@ -337,9 +324,7 @@ class StateHistoryChartLine extends LitElement {
|
||||
pushData(new Date(entityState.last_changed), series);
|
||||
});
|
||||
} else {
|
||||
// Only interpolate for sensors
|
||||
const isStep = domain !== "sensor";
|
||||
addDataSet(name, isStep);
|
||||
addDataSet(name);
|
||||
|
||||
let lastValue: number;
|
||||
let lastDate: Date;
|
||||
|
@@ -14,9 +14,9 @@ import {
|
||||
import { ComboBoxLitRenderer, comboBoxRenderer } from "lit-vaadin-helpers";
|
||||
import { customElement, property, query } from "lit/decorators";
|
||||
import { fireEvent } from "../../common/dom/fire_event";
|
||||
import { formatAttributeName } from "../../data/entity_attributes";
|
||||
import { PolymerChangedEvent } from "../../polymer-types";
|
||||
import { HomeAssistant } from "../../types";
|
||||
import { formatAttributeName } from "../../util/hass-attributes-util";
|
||||
import "../ha-icon-button";
|
||||
import "../ha-svg-icon";
|
||||
import "./state-badge";
|
||||
|
@@ -1,12 +1,14 @@
|
||||
import { HassEntity } from "home-assistant-js-websocket";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { haStyle } from "../resources/styles";
|
||||
import { HomeAssistant } from "../types";
|
||||
import hassAttributeUtil, {
|
||||
import {
|
||||
formatAttributeName,
|
||||
formatAttributeValue,
|
||||
} from "../util/hass-attributes-util";
|
||||
STATE_ATTRIBUTES,
|
||||
} from "../data/entity_attributes";
|
||||
import { haStyle } from "../resources/styles";
|
||||
import { HomeAssistant } from "../types";
|
||||
|
||||
import "./ha-expansion-panel";
|
||||
|
||||
@customElement("ha-attributes")
|
||||
@@ -25,7 +27,7 @@ class HaAttributes extends LitElement {
|
||||
}
|
||||
|
||||
const attributes = this.computeDisplayAttributes(
|
||||
Object.keys(hassAttributeUtil.LOGIC_STATE_ATTRIBUTES).concat(
|
||||
STATE_ATTRIBUTES.concat(
|
||||
this.extraFilters ? this.extraFilters.split(",") : []
|
||||
)
|
||||
);
|
||||
|
@@ -1,141 +0,0 @@
|
||||
import "@polymer/iron-flex-layout/iron-flex-layout-classes";
|
||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
||||
/* eslint-plugin-disable lit */
|
||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
||||
import { EventsMixin } from "../mixins/events-mixin";
|
||||
import "./ha-icon";
|
||||
import "./ha-icon-button";
|
||||
|
||||
/*
|
||||
* @appliesMixin EventsMixin
|
||||
*/
|
||||
class HaClimateControl extends EventsMixin(PolymerElement) {
|
||||
static get template() {
|
||||
return html`
|
||||
<style include="iron-flex iron-flex-alignment"></style>
|
||||
<style>
|
||||
/* local DOM styles go here */
|
||||
:host {
|
||||
@apply --layout-flex;
|
||||
@apply --layout-horizontal;
|
||||
@apply --layout-justified;
|
||||
}
|
||||
.in-flux#target_temperature {
|
||||
color: var(--error-color);
|
||||
}
|
||||
#target_temperature {
|
||||
@apply --layout-self-center;
|
||||
font-size: 200%;
|
||||
direction: ltr;
|
||||
}
|
||||
.control-buttons {
|
||||
font-size: 200%;
|
||||
text-align: right;
|
||||
}
|
||||
ha-icon-button {
|
||||
--mdc-icon-size: 32px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- local DOM goes here -->
|
||||
<div id="target_temperature">[[value]] [[units]]</div>
|
||||
<div class="control-buttons">
|
||||
<div>
|
||||
<ha-icon-button on-click="incrementValue">
|
||||
<ha-icon icon="hass:chevron-up"></ha-icon>
|
||||
</ha-icon-button>
|
||||
</div>
|
||||
<div>
|
||||
<ha-icon-button on-click="decrementValue">
|
||||
<ha-icon icon="hass:chevron-down"></ha-icon>
|
||||
</ha-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
static get properties() {
|
||||
return {
|
||||
value: {
|
||||
type: Number,
|
||||
observer: "valueChanged",
|
||||
},
|
||||
units: {
|
||||
type: String,
|
||||
},
|
||||
min: {
|
||||
type: Number,
|
||||
},
|
||||
max: {
|
||||
type: Number,
|
||||
},
|
||||
step: {
|
||||
type: Number,
|
||||
value: 1,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
temperatureStateInFlux(inFlux) {
|
||||
this.$.target_temperature.classList.toggle("in-flux", inFlux);
|
||||
}
|
||||
|
||||
_round(val) {
|
||||
// round value to precision derived from step
|
||||
// insired by https://github.com/soundar24/roundSlider/blob/master/src/roundslider.js
|
||||
const s = this.step.toString().split(".");
|
||||
return s[1] ? parseFloat(val.toFixed(s[1].length)) : Math.round(val);
|
||||
}
|
||||
|
||||
incrementValue() {
|
||||
const newval = this._round(this.value + this.step);
|
||||
if (this.value < this.max) {
|
||||
this.last_changed = Date.now();
|
||||
this.temperatureStateInFlux(true);
|
||||
}
|
||||
if (newval <= this.max) {
|
||||
// If no initial target_temp
|
||||
// this forces control to start
|
||||
// from the min configured instead of 0
|
||||
if (newval <= this.min) {
|
||||
this.value = this.min;
|
||||
} else {
|
||||
this.value = newval;
|
||||
}
|
||||
} else {
|
||||
this.value = this.max;
|
||||
}
|
||||
}
|
||||
|
||||
decrementValue() {
|
||||
const newval = this._round(this.value - this.step);
|
||||
if (this.value > this.min) {
|
||||
this.last_changed = Date.now();
|
||||
this.temperatureStateInFlux(true);
|
||||
}
|
||||
if (newval >= this.min) {
|
||||
this.value = newval;
|
||||
} else {
|
||||
this.value = this.min;
|
||||
}
|
||||
}
|
||||
|
||||
valueChanged() {
|
||||
// when the last_changed timestamp is changed,
|
||||
// trigger a potential event fire in
|
||||
// the future, as long as last changed is far enough in the
|
||||
// past.
|
||||
if (this.last_changed) {
|
||||
window.setTimeout(() => {
|
||||
const now = Date.now();
|
||||
if (now - this.last_changed >= 2000) {
|
||||
this.fire("change");
|
||||
this.temperatureStateInFlux(false);
|
||||
this.last_changed = null;
|
||||
}
|
||||
}, 2010);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
customElements.define("ha-climate-control", HaClimateControl);
|
138
src/components/ha-climate-control.ts
Normal file
138
src/components/ha-climate-control.ts
Normal file
@@ -0,0 +1,138 @@
|
||||
import { mdiChevronDown, mdiChevronUp } from "@mdi/js";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, query } from "lit/decorators";
|
||||
import { fireEvent } from "../common/dom/fire_event";
|
||||
import { conditionalClamp } from "../common/number/clamp";
|
||||
import { HomeAssistant } from "../types";
|
||||
import "./ha-icon";
|
||||
import "./ha-icon-button";
|
||||
|
||||
@customElement("ha-climate-control")
|
||||
class HaClimateControl extends LitElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public value!: number;
|
||||
|
||||
@property() public unit = "";
|
||||
|
||||
@property() public min?: number;
|
||||
|
||||
@property() public max?: number;
|
||||
|
||||
@property() public step = 1;
|
||||
|
||||
private _lastChanged?: number;
|
||||
|
||||
@query("#target_temperature") private _targetTemperature!: HTMLElement;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
<div id="target_temperature">${this.value} ${this.unit}</div>
|
||||
<div class="control-buttons">
|
||||
<div>
|
||||
<ha-icon-button
|
||||
.path=${mdiChevronUp}
|
||||
.label=${this.hass.localize(
|
||||
"ui.components.climate-control.temperature_up"
|
||||
)}
|
||||
@click=${this._incrementValue}
|
||||
>
|
||||
</ha-icon-button>
|
||||
</div>
|
||||
<div>
|
||||
<ha-icon-button
|
||||
.path=${mdiChevronDown}
|
||||
.label=${this.hass.localize(
|
||||
"ui.components.climate-control.temperature_down"
|
||||
)}
|
||||
@click=${this._decrementValue}
|
||||
>
|
||||
</ha-icon-button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
protected updated(changedProperties) {
|
||||
if (changedProperties.has("value")) {
|
||||
this._valueChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private _temperatureStateInFlux(inFlux) {
|
||||
this._targetTemperature.classList.toggle("in-flux", inFlux);
|
||||
}
|
||||
|
||||
private _round(value) {
|
||||
// Round value to precision derived from step.
|
||||
// Inspired by https://github.com/soundar24/roundSlider/blob/master/src/roundslider.js
|
||||
const s = this.step.toString().split(".");
|
||||
return s[1] ? parseFloat(value.toFixed(s[1].length)) : Math.round(value);
|
||||
}
|
||||
|
||||
private _incrementValue() {
|
||||
const newValue = this._round(this.value + this.step);
|
||||
this._processNewValue(newValue);
|
||||
}
|
||||
|
||||
private _decrementValue() {
|
||||
const newValue = this._round(this.value - this.step);
|
||||
this._processNewValue(newValue);
|
||||
}
|
||||
|
||||
private _processNewValue(value) {
|
||||
const newValue = conditionalClamp(value, this.min, this.max);
|
||||
|
||||
if (this.value !== newValue) {
|
||||
this.value = newValue;
|
||||
this._lastChanged = Date.now();
|
||||
this._temperatureStateInFlux(true);
|
||||
}
|
||||
}
|
||||
|
||||
private _valueChanged() {
|
||||
// When the last_changed timestamp is changed,
|
||||
// trigger a potential event fire in the future,
|
||||
// as long as last_changed is far enough in the past.
|
||||
if (this._lastChanged) {
|
||||
window.setTimeout(() => {
|
||||
const now = Date.now();
|
||||
if (now - this._lastChanged! >= 2000) {
|
||||
fireEvent(this, "change");
|
||||
this._temperatureStateInFlux(false);
|
||||
this._lastChanged = undefined;
|
||||
}
|
||||
}, 2010);
|
||||
}
|
||||
}
|
||||
|
||||
static get styles(): CSSResultGroup {
|
||||
return css`
|
||||
:host {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.in-flux {
|
||||
color: var(--error-color);
|
||||
}
|
||||
#target_temperature {
|
||||
align-self: center;
|
||||
font-size: 28px;
|
||||
direction: ltr;
|
||||
}
|
||||
.control-buttons {
|
||||
font-size: 24px;
|
||||
text-align: right;
|
||||
}
|
||||
ha-icon-button {
|
||||
--mdc-icon-size: 32px;
|
||||
}
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
||||
declare global {
|
||||
interface HTMLElementTagNameMap {
|
||||
"ha-climate-control": HaClimateControl;
|
||||
}
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
import "@material/mwc-textfield";
|
||||
import type { TextField } from "@material/mwc-textfield";
|
||||
import "@material/mwc-slider";
|
||||
import type { Slider } from "@material/mwc-slider";
|
||||
import {
|
||||
css,
|
||||
@@ -14,6 +13,7 @@ import { customElement, property, query } from "lit/decorators";
|
||||
import { fireEvent } from "../../common/dom/fire_event";
|
||||
import { HaCheckbox } from "../ha-checkbox";
|
||||
import { HaFormElement, HaFormIntegerData, HaFormIntegerSchema } from "./types";
|
||||
import "../ha-slider";
|
||||
|
||||
@customElement("ha-form-integer")
|
||||
export class HaFormInteger extends LitElement implements HaFormElement {
|
||||
@@ -54,15 +54,16 @@ export class HaFormInteger extends LitElement implements HaFormElement {
|
||||
></ha-checkbox>
|
||||
`
|
||||
: ""}
|
||||
<mwc-slider
|
||||
discrete
|
||||
<ha-slider
|
||||
pin
|
||||
ignore-bar-touch
|
||||
.value=${this._value}
|
||||
.min=${this.schema.valueMin}
|
||||
.max=${this.schema.valueMax}
|
||||
.disabled=${this.disabled ||
|
||||
(this.data === undefined && this.schema.optional)}
|
||||
@change=${this._valueChanged}
|
||||
></mwc-slider>
|
||||
></ha-slider>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
@@ -168,7 +169,7 @@ export class HaFormInteger extends LitElement implements HaFormElement {
|
||||
.flex {
|
||||
display: flex;
|
||||
}
|
||||
mwc-slider {
|
||||
ha-slider {
|
||||
flex: 1;
|
||||
}
|
||||
mwc-textfield {
|
||||
|
@@ -104,7 +104,7 @@ export class HaForm extends LitElement implements HaFormElement {
|
||||
return css`
|
||||
.root {
|
||||
margin-bottom: -24px;
|
||||
overflow: auto;
|
||||
overflow: clip visible;
|
||||
}
|
||||
.root > * {
|
||||
display: block;
|
||||
|
@@ -17,6 +17,7 @@ import {
|
||||
import { Selector } from "../data/selector";
|
||||
import { PolymerChangedEvent } from "../polymer-types";
|
||||
import { HomeAssistant } from "../types";
|
||||
import { documentationUrl } from "../util/documentation-url";
|
||||
import "./ha-checkbox";
|
||||
import "./ha-icon-button";
|
||||
import "./ha-selector/ha-selector";
|
||||
@@ -230,7 +231,12 @@ export class HaServiceControl extends LitElement {
|
||||
<p>${serviceData?.description}</p>
|
||||
${this._manifest
|
||||
? html` <a
|
||||
href=${this._manifest.documentation}
|
||||
href=${this._manifest.is_built_in
|
||||
? documentationUrl(
|
||||
this.hass,
|
||||
`/integrations/${this._manifest.domain}`
|
||||
)
|
||||
: this._manifest.documentation}
|
||||
title=${this.hass.localize(
|
||||
"ui.components.service-control.integration_doc"
|
||||
)}
|
||||
|
@@ -1,9 +1,13 @@
|
||||
import "../ha-header-bar";
|
||||
import { mdiArrowLeft, mdiClose } from "@mdi/js";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { fireEvent, HASSDomEvent } from "../../common/dom/fire_event";
|
||||
import { computeRTLDirection } from "../../common/util/compute_rtl";
|
||||
import type {
|
||||
MediaPickedEvent,
|
||||
MediaPlayerBrowseAction,
|
||||
MediaPlayerItem,
|
||||
} from "../../data/media-player";
|
||||
import { haStyleDialog } from "../../resources/styles";
|
||||
import type { HomeAssistant } from "../../types";
|
||||
@@ -16,6 +20,8 @@ import { MediaPlayerBrowseDialogParams } from "./show-media-browser-dialog";
|
||||
class DialogMediaPlayerBrowse extends LitElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@state() private _currentItem?: MediaPlayerItem;
|
||||
|
||||
@state() private _navigateIds?: MediaPlayerItemId[];
|
||||
|
||||
@state() private _params?: MediaPlayerBrowseDialogParams;
|
||||
@@ -33,11 +39,12 @@ class DialogMediaPlayerBrowse extends LitElement {
|
||||
public closeDialog() {
|
||||
this._params = undefined;
|
||||
this._navigateIds = undefined;
|
||||
this._currentItem = undefined;
|
||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||
}
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (!this._params) {
|
||||
if (!this._params || !this._navigateIds) {
|
||||
return html``;
|
||||
}
|
||||
|
||||
@@ -48,8 +55,36 @@ class DialogMediaPlayerBrowse extends LitElement {
|
||||
escapeKeyAction
|
||||
hideActions
|
||||
flexContent
|
||||
.heading=${true}
|
||||
@closed=${this.closeDialog}
|
||||
>
|
||||
<ha-header-bar slot="heading">
|
||||
${this._navigateIds.length > 1
|
||||
? html`
|
||||
<ha-icon-button
|
||||
slot="navigationIcon"
|
||||
.path=${mdiArrowLeft}
|
||||
@click=${this._goBack}
|
||||
></ha-icon-button>
|
||||
`
|
||||
: ""}
|
||||
<span slot="title">
|
||||
${!this._currentItem
|
||||
? this.hass.localize(
|
||||
"ui.components.media-browser.media-player-browser"
|
||||
)
|
||||
: this._currentItem.title}
|
||||
</span>
|
||||
|
||||
<ha-icon-button
|
||||
.label=${this.hass.localize("ui.dialogs.generic.close")}
|
||||
.path=${mdiClose}
|
||||
dialogAction="close"
|
||||
slot="actionItems"
|
||||
class="header_button"
|
||||
dir=${computeRTLDirection(this.hass)}
|
||||
></ha-icon-button>
|
||||
</ha-header-bar>
|
||||
<ha-media-player-browse
|
||||
dialog
|
||||
.hass=${this.hass}
|
||||
@@ -64,8 +99,14 @@ class DialogMediaPlayerBrowse extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
private _mediaBrowsed(ev) {
|
||||
private _goBack() {
|
||||
this._navigateIds = this._navigateIds?.slice(0, -1);
|
||||
this._currentItem = undefined;
|
||||
}
|
||||
|
||||
private _mediaBrowsed(ev: { detail: HASSDomEvents["media-browsed"] }) {
|
||||
this._navigateIds = ev.detail.ids;
|
||||
this._currentItem = ev.detail.current;
|
||||
}
|
||||
|
||||
private _mediaPicked(ev: HASSDomEvent<MediaPickedEvent>): void {
|
||||
@@ -89,7 +130,7 @@ class DialogMediaPlayerBrowse extends LitElement {
|
||||
}
|
||||
|
||||
ha-media-player-browse {
|
||||
--media-browser-max-height: 100vh;
|
||||
--media-browser-max-height: calc(100vh - 65px);
|
||||
}
|
||||
|
||||
@media (min-width: 800px) {
|
||||
@@ -101,10 +142,17 @@ class DialogMediaPlayerBrowse extends LitElement {
|
||||
}
|
||||
ha-media-player-browse {
|
||||
position: initial;
|
||||
--media-browser-max-height: 100vh - 72px;
|
||||
--media-browser-max-height: 100vh - 137px;
|
||||
width: 700px;
|
||||
}
|
||||
}
|
||||
|
||||
ha-header-bar {
|
||||
--mdc-theme-on-primary: var(--primary-text-color);
|
||||
--mdc-theme-primary: var(--mdc-theme-surface);
|
||||
flex-shrink: 0;
|
||||
border-bottom: 1px solid var(--divider-color, rgba(0, 0, 0, 0.12));
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -51,11 +51,13 @@ export interface CloudStatusLoggedIn {
|
||||
google_registered: boolean;
|
||||
google_entities: EntityFilter;
|
||||
google_domains: string[];
|
||||
alexa_registered: boolean;
|
||||
alexa_entities: EntityFilter;
|
||||
prefs: CloudPreferences;
|
||||
remote_domain: string | undefined;
|
||||
remote_connected: boolean;
|
||||
remote_certificate: undefined | CertificateInformation;
|
||||
http_use_ssl: boolean;
|
||||
}
|
||||
|
||||
export type CloudStatus = CloudStatusNotLoggedIn | CloudStatusLoggedIn;
|
||||
|
@@ -104,18 +104,19 @@ export const localizeConfigFlowTitle = (
|
||||
localize: LocalizeFunc,
|
||||
flow: DataEntryFlowProgress
|
||||
) => {
|
||||
const placeholders = flow.context.title_placeholders || {};
|
||||
const placeholderKeys = Object.keys(placeholders);
|
||||
if (placeholderKeys.length === 0) {
|
||||
if (
|
||||
!flow.context.title_placeholders ||
|
||||
Object.keys(flow.context.title_placeholders).length === 0
|
||||
) {
|
||||
return domainToName(localize, flow.handler);
|
||||
}
|
||||
const args: string[] = [];
|
||||
placeholderKeys.forEach((key) => {
|
||||
args.push(key);
|
||||
args.push(placeholders[key]);
|
||||
});
|
||||
return localize(`component.${flow.handler}.config.flow_title`, ...args) ||
|
||||
"name" in placeholders
|
||||
? placeholders.name
|
||||
: domainToName(localize, flow.handler);
|
||||
return (
|
||||
localize(
|
||||
`component.${flow.handler}.config.flow_title`,
|
||||
flow.context.title_placeholders
|
||||
) ||
|
||||
("name" in flow.context.title_placeholders
|
||||
? flow.context.title_placeholders.name
|
||||
: domainToName(localize, flow.handler))
|
||||
);
|
||||
};
|
||||
|
@@ -1,5 +1,6 @@
|
||||
import { Connection, createCollection } from "home-assistant-js-websocket";
|
||||
import { computeStateName } from "../common/entity/compute_state_name";
|
||||
import { caseInsensitiveStringCompare } from "../common/string/compare";
|
||||
import { debounce } from "../common/util/debounce";
|
||||
import { HomeAssistant } from "../types";
|
||||
import { EntityRegistryEntry } from "./entity_registry";
|
||||
@@ -54,7 +55,13 @@ export const computeDeviceName = (
|
||||
device.name_by_user ||
|
||||
device.name ||
|
||||
(entities && fallbackDeviceName(hass, entities)) ||
|
||||
hass.localize("ui.panel.config.devices.unnamed_device");
|
||||
hass.localize(
|
||||
"ui.panel.config.devices.unnamed_device",
|
||||
"type",
|
||||
hass.localize(
|
||||
`ui.panel.config.devices.type.${device.entry_type || "device"}`
|
||||
)
|
||||
);
|
||||
|
||||
export const devicesInArea = (devices: DeviceRegistryEntry[], areaId: string) =>
|
||||
devices.filter((device) => device.area_id === areaId);
|
||||
@@ -99,3 +106,8 @@ export const subscribeDeviceRegistry = (
|
||||
conn,
|
||||
onChange
|
||||
);
|
||||
|
||||
export const sortDeviceRegistryByName = (entries: DeviceRegistryEntry[]) =>
|
||||
entries.sort((entry1, entry2) =>
|
||||
caseInsensitiveStringCompare(entry1.name || "", entry2.name || "")
|
||||
);
|
||||
|
105
src/data/entity_attributes.ts
Normal file
105
src/data/entity_attributes.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import { html, TemplateResult } from "lit";
|
||||
import { until } from "lit/directives/until";
|
||||
import checkValidDate from "../common/datetime/check_valid_date";
|
||||
import { formatDate } from "../common/datetime/format_date";
|
||||
import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time";
|
||||
import { formatNumber } from "../common/number/format_number";
|
||||
import { capitalizeFirstLetter } from "../common/string/capitalize-first-letter";
|
||||
import { isDate } from "../common/string/is_date";
|
||||
import { isTimestamp } from "../common/string/is_timestamp";
|
||||
import { HomeAssistant } from "../types";
|
||||
|
||||
let jsYamlPromise: Promise<typeof import("../resources/js-yaml-dump")>;
|
||||
|
||||
export const STATE_ATTRIBUTES = [
|
||||
"assumed_state",
|
||||
"attribution",
|
||||
"custom_ui_more_info",
|
||||
"custom_ui_state_card",
|
||||
"device_class",
|
||||
"editable",
|
||||
"emulated_hue_name",
|
||||
"emulated_hue",
|
||||
"entity_picture",
|
||||
"friendly_name",
|
||||
"haaska_hidden",
|
||||
"haaska_name",
|
||||
"icon",
|
||||
"initial_state",
|
||||
"last_reset",
|
||||
"restored",
|
||||
"state_class",
|
||||
"supported_features",
|
||||
"unit_of_measurement",
|
||||
];
|
||||
|
||||
// Convert from internal snake_case format to user-friendly format
|
||||
export function formatAttributeName(value: string): string {
|
||||
value = value
|
||||
.replace(/_/g, " ")
|
||||
.replace(/\bid\b/g, "ID")
|
||||
.replace(/\bip\b/g, "IP")
|
||||
.replace(/\bmac\b/g, "MAC")
|
||||
.replace(/\bgps\b/g, "GPS");
|
||||
return capitalizeFirstLetter(value);
|
||||
}
|
||||
|
||||
export function formatAttributeValue(
|
||||
hass: HomeAssistant,
|
||||
value: any
|
||||
): string | TemplateResult {
|
||||
if (value === null) {
|
||||
return "—";
|
||||
}
|
||||
|
||||
// YAML handling
|
||||
if (
|
||||
(Array.isArray(value) && value.some((val) => val instanceof Object)) ||
|
||||
(!Array.isArray(value) && value instanceof Object)
|
||||
) {
|
||||
if (!jsYamlPromise) {
|
||||
jsYamlPromise = import("../resources/js-yaml-dump");
|
||||
}
|
||||
const yaml = jsYamlPromise.then((jsYaml) => jsYaml.dump(value));
|
||||
return html`<pre>${until(yaml, "")}</pre>`;
|
||||
}
|
||||
|
||||
if (typeof value === "number") {
|
||||
return formatNumber(value, hass.locale);
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
// URL handling
|
||||
if (value.startsWith("http")) {
|
||||
try {
|
||||
// If invalid URL, exception will be raised
|
||||
const url = new URL(value);
|
||||
if (url.protocol === "http:" || url.protocol === "https:")
|
||||
return html`<a target="_blank" rel="noreferrer" href=${value}
|
||||
>${value}</a
|
||||
>`;
|
||||
} catch (_) {
|
||||
// Nothing to do here
|
||||
}
|
||||
}
|
||||
|
||||
// Date handling
|
||||
if (isDate(value, true)) {
|
||||
// Timestamp handling
|
||||
if (isTimestamp(value)) {
|
||||
const date = new Date(value);
|
||||
if (checkValidDate(date)) {
|
||||
return formatDateTimeWithSeconds(date, hass.locale);
|
||||
}
|
||||
}
|
||||
|
||||
// Value was not a timestamp, so only do date formatting
|
||||
const date = new Date(value);
|
||||
if (checkValidDate(date)) {
|
||||
return formatDate(date, hass.locale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Array.isArray(value) ? value.join(", ") : value;
|
||||
}
|
@@ -1,6 +1,7 @@
|
||||
import { Connection, createCollection } from "home-assistant-js-websocket";
|
||||
import { Store } from "home-assistant-js-websocket/dist/store";
|
||||
import { computeStateName } from "../common/entity/compute_state_name";
|
||||
import { caseInsensitiveStringCompare } from "../common/string/compare";
|
||||
import { debounce } from "../common/util/debounce";
|
||||
import { HomeAssistant } from "../types";
|
||||
|
||||
@@ -133,3 +134,8 @@ export const subscribeEntityRegistry = (
|
||||
conn,
|
||||
onChange
|
||||
);
|
||||
|
||||
export const sortEntityRegistryByName = (entries: EntityRegistryEntry[]) =>
|
||||
entries.sort((entry1, entry2) =>
|
||||
caseInsensitiveStringCompare(entry1.name || "", entry2.name || "")
|
||||
);
|
||||
|
@@ -8,3 +8,6 @@ export interface GoogleEntity {
|
||||
|
||||
export const fetchCloudGoogleEntities = (hass: HomeAssistant) =>
|
||||
hass.callWS<GoogleEntity[]>({ type: "cloud/google_assistant/entities" });
|
||||
|
||||
export const syncCloudGoogleEntities = (hass: HomeAssistant) =>
|
||||
hass.callApi("POST", "cloud/google_actions/sync");
|
||||
|
@@ -88,7 +88,7 @@ export const BROWSER_PLAYER = "browser";
|
||||
export type MediaClassBrowserSetting = {
|
||||
icon: string;
|
||||
thumbnail_ratio?: string;
|
||||
layout?: string;
|
||||
layout?: "grid";
|
||||
show_list_images?: boolean;
|
||||
};
|
||||
|
||||
@@ -185,15 +185,6 @@ export const browseMediaPlayer = (
|
||||
media_content_type: mediaContentType,
|
||||
});
|
||||
|
||||
export const browseLocalMediaPlayer = (
|
||||
hass: HomeAssistant,
|
||||
mediaContentId?: string
|
||||
): Promise<MediaPlayerItem> =>
|
||||
hass.callWS<MediaPlayerItem>({
|
||||
type: "media_source/browse_media",
|
||||
media_content_id: mediaContentId,
|
||||
});
|
||||
|
||||
export const getCurrentProgress = (stateObj: MediaPlayerEntity): number => {
|
||||
let progress = stateObj.attributes.media_position!;
|
||||
|
||||
@@ -321,8 +312,8 @@ export const computeMediaControls = (
|
||||
return buttons.length > 0 ? buttons : undefined;
|
||||
};
|
||||
|
||||
export const formatMediaTime = (seconds: number): string => {
|
||||
if (!seconds) {
|
||||
export const formatMediaTime = (seconds: number | undefined): string => {
|
||||
if (seconds === undefined) {
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import { HomeAssistant } from "../types";
|
||||
import { MediaPlayerItem } from "./media-player";
|
||||
|
||||
export interface ResolvedMediaSource {
|
||||
url: string;
|
||||
@@ -13,3 +14,12 @@ export const resolveMediaSource = (
|
||||
type: "media_source/resolve_media",
|
||||
media_content_id,
|
||||
});
|
||||
|
||||
export const browseLocalMediaPlayer = (
|
||||
hass: HomeAssistant,
|
||||
mediaContentId?: string
|
||||
): Promise<MediaPlayerItem> =>
|
||||
hass.callWS<MediaPlayerItem>({
|
||||
type: "media_source/browse_media",
|
||||
media_content_id: mediaContentId,
|
||||
});
|
||||
|
@@ -116,15 +116,14 @@ class DataEntryFlowDialog extends LitElement {
|
||||
params.continueFlowId
|
||||
);
|
||||
} catch (err: any) {
|
||||
this._step = undefined;
|
||||
this._params = undefined;
|
||||
this.closeDialog();
|
||||
showAlertDialog(this, {
|
||||
title: this.hass.localize(
|
||||
"ui.panel.config.integrations.config_flow.error"
|
||||
),
|
||||
text: this.hass.localize(
|
||||
text: `${this.hass.localize(
|
||||
"ui.panel.config.integrations.config_flow.could_not_load"
|
||||
),
|
||||
)}: ${err.message || err.body}`,
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -177,6 +176,7 @@ class DataEntryFlowDialog extends LitElement {
|
||||
});
|
||||
}
|
||||
|
||||
this._loading = undefined;
|
||||
this._step = undefined;
|
||||
this._params = undefined;
|
||||
this._devices = undefined;
|
||||
@@ -372,15 +372,14 @@ class DataEntryFlowDialog extends LitElement {
|
||||
try {
|
||||
step = await this._params!.flowConfig.createFlow(this.hass, handler);
|
||||
} catch (err: any) {
|
||||
this._step = undefined;
|
||||
this._params = undefined;
|
||||
this.closeDialog();
|
||||
showAlertDialog(this, {
|
||||
title: this.hass.localize(
|
||||
"ui.panel.config.integrations.config_flow.error"
|
||||
),
|
||||
text: this.hass.localize(
|
||||
text: `${this.hass.localize(
|
||||
"ui.panel.config.integrations.config_flow.could_not_load"
|
||||
),
|
||||
)}: ${err.message || err.body}`,
|
||||
});
|
||||
return;
|
||||
} finally {
|
||||
@@ -405,6 +404,15 @@ class DataEntryFlowDialog extends LitElement {
|
||||
this._loading = "loading_step";
|
||||
try {
|
||||
this._step = await step;
|
||||
} catch (err: any) {
|
||||
this.closeDialog();
|
||||
showAlertDialog(this, {
|
||||
title: this.hass.localize(
|
||||
"ui.panel.config.integrations.config_flow.error"
|
||||
),
|
||||
text: err.message || err.body,
|
||||
});
|
||||
return;
|
||||
} finally {
|
||||
this._loading = undefined;
|
||||
}
|
||||
|
@@ -26,6 +26,7 @@ interface ShowDialogParams<T> {
|
||||
dialogTag: keyof HTMLElementTagNameMap;
|
||||
dialogImport: () => Promise<unknown>;
|
||||
dialogParams: T;
|
||||
addHistory?: boolean;
|
||||
}
|
||||
|
||||
export interface DialogClosedParams {
|
||||
@@ -124,8 +125,15 @@ export const makeDialogManager = (
|
||||
element.addEventListener(
|
||||
"show-dialog",
|
||||
(e: HASSDomEvent<ShowDialogParams<unknown>>) => {
|
||||
const { dialogTag, dialogImport, dialogParams } = e.detail;
|
||||
showDialog(element, root, dialogTag, dialogParams, dialogImport);
|
||||
const { dialogTag, dialogImport, dialogParams, addHistory } = e.detail;
|
||||
showDialog(
|
||||
element,
|
||||
root,
|
||||
dialogTag,
|
||||
dialogParams,
|
||||
dialogImport,
|
||||
addHistory
|
||||
);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@@ -103,8 +103,9 @@ class MoreInfoClimate extends LitElement {
|
||||
stateObj.attributes.temperature !== null
|
||||
? html`
|
||||
<ha-climate-control
|
||||
.hass=${this.hass}
|
||||
.value=${stateObj.attributes.temperature}
|
||||
.units=${hass.config.unit_system.temperature}
|
||||
.unit=${hass.config.unit_system.temperature}
|
||||
.step=${temperatureStepSize}
|
||||
.min=${stateObj.attributes.min_temp}
|
||||
.max=${stateObj.attributes.max_temp}
|
||||
@@ -118,8 +119,9 @@ class MoreInfoClimate extends LitElement {
|
||||
stateObj.attributes.target_temp_high !== null)
|
||||
? html`
|
||||
<ha-climate-control
|
||||
.hass=${this.hass}
|
||||
.value=${stateObj.attributes.target_temp_low}
|
||||
.units=${hass.config.unit_system.temperature}
|
||||
.unit=${hass.config.unit_system.temperature}
|
||||
.step=${temperatureStepSize}
|
||||
.min=${stateObj.attributes.min_temp}
|
||||
.max=${stateObj.attributes.target_temp_high}
|
||||
@@ -127,8 +129,9 @@ class MoreInfoClimate extends LitElement {
|
||||
@change=${this._targetTemperatureLowChanged}
|
||||
></ha-climate-control>
|
||||
<ha-climate-control
|
||||
.hass=${this.hass}
|
||||
.value=${stateObj.attributes.target_temp_high}
|
||||
.units=${hass.config.unit_system.temperature}
|
||||
.unit=${hass.config.unit_system.temperature}
|
||||
.step=${temperatureStepSize}
|
||||
.min=${stateObj.attributes.target_temp_low}
|
||||
.max=${stateObj.attributes.max_temp}
|
||||
|
@@ -108,7 +108,9 @@ export class QuickBar extends LitElement {
|
||||
public async showDialog(params: QuickBarParams) {
|
||||
this._commandMode = params.commandMode || this._toggleIfAlreadyOpened();
|
||||
this._hint = params.hint;
|
||||
this._narrow = matchMedia("(max-width: 600px)").matches;
|
||||
this._narrow = matchMedia(
|
||||
"all and (max-width: 450px), all and (max-height: 500px)"
|
||||
).matches;
|
||||
this._initializeItemsIfNeeded();
|
||||
this._opened = true;
|
||||
}
|
||||
@@ -154,7 +156,7 @@ export class QuickBar extends LitElement {
|
||||
)}
|
||||
.value=${this._commandMode ? `>${this._search}` : this._search}
|
||||
.icon=${true}
|
||||
.iconTrailing=${this._search !== undefined}
|
||||
.iconTrailing=${this._search !== undefined || this._narrow}
|
||||
@input=${this._handleSearchChange}
|
||||
@keydown=${this._handleInputKeyDown}
|
||||
@focus=${this._setFocusFirstListItem}
|
||||
@@ -174,24 +176,27 @@ export class QuickBar extends LitElement {
|
||||
.path=${mdiMagnify}
|
||||
></ha-svg-icon>
|
||||
`}
|
||||
${this._search &&
|
||||
html`
|
||||
<ha-icon-button
|
||||
slot="trailingIcon"
|
||||
@click=${this._clearSearch}
|
||||
.label=${this.hass!.localize("ui.common.clear")}
|
||||
.path=${mdiClose}
|
||||
></ha-icon-button>
|
||||
`}
|
||||
${this._search || this._narrow
|
||||
? html`
|
||||
<div slot="trailingIcon">
|
||||
${this._search &&
|
||||
html`<ha-icon-button
|
||||
@click=${this._clearSearch}
|
||||
.label=${this.hass!.localize("ui.common.clear")}
|
||||
.path=${mdiClose}
|
||||
></ha-icon-button>`}
|
||||
${this._narrow
|
||||
? html`
|
||||
<mwc-button
|
||||
.label=${this.hass!.localize("ui.common.close")}
|
||||
@click=${this.closeDialog}
|
||||
></mwc-button>
|
||||
`
|
||||
: ""}
|
||||
</div>
|
||||
`
|
||||
: ""}
|
||||
</ha-textfield>
|
||||
${this._narrow
|
||||
? html`
|
||||
<mwc-button
|
||||
.label=${this.hass!.localize("ui.common.close")}
|
||||
@click=${this.closeDialog}
|
||||
></mwc-button>
|
||||
`
|
||||
: ""}
|
||||
</div>
|
||||
${!items
|
||||
? html`<ha-circular-progress
|
||||
@@ -210,10 +215,12 @@ export class QuickBar extends LitElement {
|
||||
@keydown=${this._handleListItemKeyDown}
|
||||
@selected=${this._handleSelected}
|
||||
style=${styleMap({
|
||||
height: `${Math.min(
|
||||
items.length * (this._commandMode ? 56 : 72) + 26,
|
||||
this._done ? 500 : 0
|
||||
)}px`,
|
||||
height: this._narrow
|
||||
? "calc(100vh - 56px)"
|
||||
: `${Math.min(
|
||||
items.length * (this._commandMode ? 56 : 72) + 26,
|
||||
this._done ? 500 : 0
|
||||
)}px`,
|
||||
})}
|
||||
>
|
||||
${scroll({
|
||||
@@ -705,6 +712,12 @@ export class QuickBar extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
@media all and (max-width: 450px), all and (max-height: 500px) {
|
||||
ha-textfield {
|
||||
--mdc-shape-small: 0;
|
||||
}
|
||||
}
|
||||
|
||||
ha-icon.entity,
|
||||
ha-svg-icon.entity {
|
||||
margin-left: 20px;
|
||||
@@ -758,6 +771,11 @@ export class QuickBar extends LitElement {
|
||||
padding: 16px 0px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div[slot="trailingIcon"] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
@@ -16,5 +16,6 @@ export const showQuickBar = (
|
||||
dialogTag: "ha-quick-bar",
|
||||
dialogImport: loadQuickBar,
|
||||
dialogParams,
|
||||
addHistory: false,
|
||||
});
|
||||
};
|
||||
|
@@ -1,9 +1,11 @@
|
||||
import { setPassiveTouchGestures } from "@polymer/polymer/lib/utils/settings";
|
||||
import {
|
||||
setPassiveTouchGestures,
|
||||
setCancelSyntheticClickEvents,
|
||||
} from "@polymer/polymer/lib/utils/settings";
|
||||
import "../layouts/home-assistant";
|
||||
import "../resources/ha-style";
|
||||
import "../resources/roboto";
|
||||
import "../util/legacy-support";
|
||||
|
||||
setPassiveTouchGestures(true);
|
||||
|
||||
(window as any).frontendVersion = __VERSION__;
|
||||
setCancelSyntheticClickEvents(false);
|
||||
|
@@ -1,11 +1,14 @@
|
||||
// Compat needs to be first import
|
||||
import "../resources/compatibility";
|
||||
import { setCancelSyntheticClickEvents } from "@polymer/polymer/lib/utils/settings";
|
||||
import "../auth/ha-authorize";
|
||||
import "../resources/ha-style";
|
||||
import "../resources/roboto";
|
||||
import "../resources/safari-14-attachshadow-patch";
|
||||
import "../resources/array.flat.polyfill";
|
||||
|
||||
setCancelSyntheticClickEvents(false);
|
||||
|
||||
/* polyfill for paper-dropdown */
|
||||
setTimeout(
|
||||
() => import("web-animations-js/web-animations-next-lite.min"),
|
||||
|
@@ -29,6 +29,7 @@ import { HomeAssistant } from "../types";
|
||||
import { MAIN_WINDOW_NAME } from "../data/main_window";
|
||||
|
||||
window.name = MAIN_WINDOW_NAME;
|
||||
(window as any).frontendVersion = __VERSION__;
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
|
@@ -1,5 +1,6 @@
|
||||
// Compat needs to be first import
|
||||
import "../resources/compatibility";
|
||||
import { setCancelSyntheticClickEvents } from "@polymer/polymer/lib/utils/settings";
|
||||
import "../resources/safari-14-attachshadow-patch";
|
||||
|
||||
import { PolymerElement } from "@polymer/polymer";
|
||||
@@ -15,6 +16,8 @@ import { createCustomPanelElement } from "../util/custom-panel/create-custom-pan
|
||||
import { loadCustomPanel } from "../util/custom-panel/load-custom-panel";
|
||||
import { setCustomPanelProperties } from "../util/custom-panel/set-custom-panel-properties";
|
||||
|
||||
setCancelSyntheticClickEvents(false);
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
loadES5Adapter: () => Promise<unknown>;
|
||||
@@ -47,7 +50,7 @@ function initialize(
|
||||
) {
|
||||
const style = document.createElement("style");
|
||||
|
||||
style.innerHTML = `body { margin:0; }
|
||||
style.innerHTML = `body { margin:0; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background-color: #111111;
|
||||
|
@@ -1,11 +1,14 @@
|
||||
// Compat needs to be first import
|
||||
import "../resources/compatibility";
|
||||
import { setCancelSyntheticClickEvents } from "@polymer/polymer/lib/utils/settings";
|
||||
import "../onboarding/ha-onboarding";
|
||||
import "../resources/ha-style";
|
||||
import "../resources/roboto";
|
||||
import "../resources/safari-14-attachshadow-patch";
|
||||
import "../resources/array.flat.polyfill";
|
||||
|
||||
setCancelSyntheticClickEvents(false);
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
stepsPromise: Promise<Response>;
|
||||
|
@@ -1,4 +1,4 @@
|
||||
<meta name='viewport' content='width=device-width, user-scalable=no, viewport-fit=cover'>
|
||||
<meta name='viewport' content='width=device-width, user-scalable=no, viewport-fit=cover, initial-scale=1'>
|
||||
<style>
|
||||
body {
|
||||
font-family: Roboto, sans-serif;
|
||||
|
@@ -1,13 +1,17 @@
|
||||
import "@material/mwc-button";
|
||||
import { mdiImagePlus, mdiPencil } from "@mdi/js";
|
||||
import "@polymer/paper-item/paper-item";
|
||||
import "@polymer/paper-item/paper-item-body";
|
||||
import { mdiImagePlus, mdiPencil } from "@mdi/js";
|
||||
import { HassEntity } from "home-assistant-js-websocket/dist/types";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { ifDefined } from "lit/directives/if-defined";
|
||||
import memoizeOne from "memoize-one";
|
||||
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
|
||||
import { computeDomain } from "../../../common/entity/compute_domain";
|
||||
import { computeStateName } from "../../../common/entity/compute_state_name";
|
||||
import { caseInsensitiveStringCompare } from "../../../common/string/compare";
|
||||
import { groupBy } from "../../../common/util/group-by";
|
||||
import { afterNextRender } from "../../../common/util/render-status";
|
||||
import "../../../components/ha-card";
|
||||
import "../../../components/ha-icon-button";
|
||||
@@ -17,14 +21,19 @@ import {
|
||||
deleteAreaRegistryEntry,
|
||||
updateAreaRegistryEntry,
|
||||
} from "../../../data/area_registry";
|
||||
import { AutomationEntity } from "../../../data/automation";
|
||||
import {
|
||||
computeDeviceName,
|
||||
DeviceRegistryEntry,
|
||||
sortDeviceRegistryByName,
|
||||
} from "../../../data/device_registry";
|
||||
import {
|
||||
computeEntityRegistryName,
|
||||
EntityRegistryEntry,
|
||||
sortEntityRegistryByName,
|
||||
} from "../../../data/entity_registry";
|
||||
import { SceneEntity } from "../../../data/scene";
|
||||
import { ScriptEntity } from "../../../data/script";
|
||||
import { findRelated, RelatedResult } from "../../../data/search";
|
||||
import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box";
|
||||
import { haStyle } from "../../../resources/styles";
|
||||
@@ -35,11 +44,11 @@ import {
|
||||
loadAreaRegistryDetailDialog,
|
||||
showAreaRegistryDetailDialog,
|
||||
} from "./show-dialog-area-registry-detail";
|
||||
import { computeDomain } from "../../../common/entity/compute_domain";
|
||||
import { SceneEntity } from "../../../data/scene";
|
||||
import { ScriptEntity } from "../../../data/script";
|
||||
import { AutomationEntity } from "../../../data/automation";
|
||||
import { groupBy } from "../../../common/util/group-by";
|
||||
|
||||
declare type NameAndEntity<EntityType extends HassEntity> = {
|
||||
name: string;
|
||||
entity: EntityType;
|
||||
};
|
||||
|
||||
@customElement("ha-config-area-page")
|
||||
class HaConfigAreaPage extends LitElement {
|
||||
@@ -136,10 +145,59 @@ class HaConfigAreaPage extends LitElement {
|
||||
this.entities
|
||||
);
|
||||
|
||||
const grouped = groupBy(entities, (entity) =>
|
||||
// Pre-compute the entity and device names, so we can sort by them
|
||||
if (devices) {
|
||||
devices.forEach((entry) => {
|
||||
entry.name = computeDeviceName(entry, this.hass);
|
||||
});
|
||||
sortDeviceRegistryByName(devices);
|
||||
}
|
||||
if (entities) {
|
||||
entities.forEach((entry) => {
|
||||
entry.name = computeEntityRegistryName(this.hass, entry);
|
||||
});
|
||||
sortEntityRegistryByName(entities);
|
||||
}
|
||||
|
||||
// Group entities by domain
|
||||
const groupedEntities = groupBy(entities, (entity) =>
|
||||
computeDomain(entity.entity_id)
|
||||
);
|
||||
|
||||
// Pre-compute the name also for the grouped and related entities so we can sort by them
|
||||
let groupedAutomations: NameAndEntity<AutomationEntity>[] = [];
|
||||
let groupedScenes: NameAndEntity<SceneEntity>[] = [];
|
||||
let groupedScripts: NameAndEntity<ScriptEntity>[] = [];
|
||||
let relatedAutomations: NameAndEntity<AutomationEntity>[] = [];
|
||||
let relatedScenes: NameAndEntity<SceneEntity>[] = [];
|
||||
let relatedScripts: NameAndEntity<ScriptEntity>[] = [];
|
||||
|
||||
if (isComponentLoaded(this.hass, "automation")) {
|
||||
({
|
||||
groupedEntities: groupedAutomations,
|
||||
relatedEntities: relatedAutomations,
|
||||
} = this._prepareEntities<AutomationEntity>(
|
||||
groupedEntities.automation,
|
||||
this._related?.automation
|
||||
));
|
||||
}
|
||||
|
||||
if (isComponentLoaded(this.hass, "scene")) {
|
||||
({ groupedEntities: groupedScenes, relatedEntities: relatedScenes } =
|
||||
this._prepareEntities<SceneEntity>(
|
||||
groupedEntities.scene,
|
||||
this._related?.scene
|
||||
));
|
||||
}
|
||||
|
||||
if (isComponentLoaded(this.hass, "script")) {
|
||||
({ groupedEntities: groupedScripts, relatedEntities: relatedScripts } =
|
||||
this._prepareEntities<ScriptEntity>(
|
||||
groupedEntities.script,
|
||||
this._related?.script
|
||||
));
|
||||
}
|
||||
|
||||
return html`
|
||||
<hass-tabs-subpage
|
||||
.hass=${this.hass}
|
||||
@@ -208,9 +266,7 @@ class HaConfigAreaPage extends LitElement {
|
||||
html`
|
||||
<a href="/config/devices/device/${device.id}">
|
||||
<paper-item>
|
||||
<paper-item-body>
|
||||
${computeDeviceName(device, this.hass)}
|
||||
</paper-item-body>
|
||||
<paper-item-body> ${device.name} </paper-item-body>
|
||||
<ha-icon-next></ha-icon-next>
|
||||
</paper-item>
|
||||
</a>
|
||||
@@ -240,9 +296,7 @@ class HaConfigAreaPage extends LitElement {
|
||||
@click=${this._openEntity}
|
||||
.entity=${entity}
|
||||
>
|
||||
<paper-item-body>
|
||||
${computeEntityRegistryName(this.hass, entity)}
|
||||
</paper-item-body>
|
||||
<paper-item-body> ${entity.name} </paper-item-body>
|
||||
<ha-icon-next></ha-icon-next>
|
||||
</paper-item>
|
||||
`
|
||||
@@ -261,46 +315,36 @@ class HaConfigAreaPage extends LitElement {
|
||||
? html`
|
||||
<ha-card
|
||||
.header=${this.hass.localize(
|
||||
"ui.panel.config.devices.automation.automations"
|
||||
"ui.panel.config.devices.automation.automations_heading"
|
||||
)}
|
||||
>
|
||||
${grouped.automation?.length
|
||||
${groupedAutomations?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.assigned_to_area"
|
||||
)}:
|
||||
</h3>
|
||||
${grouped.automation.map((entity) => {
|
||||
const entityState = this.hass.states[
|
||||
entity.entity_id
|
||||
] as AutomationEntity | undefined;
|
||||
return entityState
|
||||
? this._renderAutomation(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${groupedAutomations.map((automation) =>
|
||||
this._renderAutomation(
|
||||
automation.name,
|
||||
automation.entity
|
||||
)
|
||||
)}`
|
||||
: ""}
|
||||
${this._related?.automation?.filter(
|
||||
(entityId) =>
|
||||
!grouped.automation?.find(
|
||||
(entity) => entity.entity_id === entityId
|
||||
)
|
||||
).length
|
||||
${relatedAutomations?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.targeting_area"
|
||||
)}:
|
||||
</h3>
|
||||
${this._related.automation.map((scene) => {
|
||||
const entityState = this.hass.states[scene] as
|
||||
| AutomationEntity
|
||||
| undefined;
|
||||
return entityState
|
||||
? this._renderAutomation(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${relatedAutomations.map((automation) =>
|
||||
this._renderAutomation(
|
||||
automation.name,
|
||||
automation.entity
|
||||
)
|
||||
)}`
|
||||
: ""}
|
||||
${!grouped.automation?.length &&
|
||||
!this._related?.automation?.length
|
||||
${!groupedAutomations?.length && !relatedAutomations?.length
|
||||
? html`
|
||||
<paper-item class="no-link"
|
||||
>${this.hass.localize(
|
||||
@@ -318,42 +362,30 @@ class HaConfigAreaPage extends LitElement {
|
||||
? html`
|
||||
<ha-card
|
||||
.header=${this.hass.localize(
|
||||
"ui.panel.config.devices.scene.scenes"
|
||||
"ui.panel.config.devices.scene.scenes_heading"
|
||||
)}
|
||||
>
|
||||
${grouped.scene?.length
|
||||
${groupedScenes?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.assigned_to_area"
|
||||
)}:
|
||||
</h3>
|
||||
${grouped.scene.map((entity) => {
|
||||
const entityState =
|
||||
this.hass.states[entity.entity_id];
|
||||
return entityState
|
||||
? this._renderScene(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${groupedScenes.map((scene) =>
|
||||
this._renderScene(scene.name, scene.entity)
|
||||
)}`
|
||||
: ""}
|
||||
${this._related?.scene?.filter(
|
||||
(entityId) =>
|
||||
!grouped.scene?.find(
|
||||
(entity) => entity.entity_id === entityId
|
||||
)
|
||||
).length
|
||||
${relatedScenes?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.targeting_area"
|
||||
)}:
|
||||
</h3>
|
||||
${this._related.scene.map((scene) => {
|
||||
const entityState = this.hass.states[scene];
|
||||
return entityState
|
||||
? this._renderScene(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${relatedScenes.map((scene) =>
|
||||
this._renderScene(scene.name, scene.entity)
|
||||
)}`
|
||||
: ""}
|
||||
${!grouped.scene?.length && !this._related?.scene?.length
|
||||
${!groupedScenes?.length && !relatedScenes?.length
|
||||
? html`
|
||||
<paper-item class="no-link"
|
||||
>${this.hass.localize(
|
||||
@@ -369,45 +401,30 @@ class HaConfigAreaPage extends LitElement {
|
||||
? html`
|
||||
<ha-card
|
||||
.header=${this.hass.localize(
|
||||
"ui.panel.config.devices.script.scripts"
|
||||
"ui.panel.config.devices.script.scripts_heading"
|
||||
)}
|
||||
>
|
||||
${grouped.script?.length
|
||||
${groupedScripts?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.assigned_to_area"
|
||||
)}:
|
||||
</h3>
|
||||
${grouped.script.map((entity) => {
|
||||
const entityState = this.hass.states[
|
||||
entity.entity_id
|
||||
] as ScriptEntity | undefined;
|
||||
return entityState
|
||||
? this._renderScript(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${groupedScripts.map((script) =>
|
||||
this._renderScript(script.name, script.entity)
|
||||
)}`
|
||||
: ""}
|
||||
${this._related?.script?.filter(
|
||||
(entityId) =>
|
||||
!grouped.script?.find(
|
||||
(entity) => entity.entity_id === entityId
|
||||
)
|
||||
).length
|
||||
${relatedScripts?.length
|
||||
? html`<h3>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.areas.targeting_area"
|
||||
)}:
|
||||
</h3>
|
||||
${this._related.script.map((scene) => {
|
||||
const entityState = this.hass.states[scene] as
|
||||
| ScriptEntity
|
||||
| undefined;
|
||||
return entityState
|
||||
? this._renderScript(entityState)
|
||||
: "";
|
||||
})}`
|
||||
${relatedScripts.map((script) =>
|
||||
this._renderScript(script.name, script.entity)
|
||||
)}`
|
||||
: ""}
|
||||
${!grouped.script?.length && !this._related?.script?.length
|
||||
${!groupedScripts?.length && !relatedScripts?.length
|
||||
? html`
|
||||
<paper-item class="no-link"
|
||||
>${this.hass.localize(
|
||||
@@ -425,7 +442,51 @@ class HaConfigAreaPage extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
private _renderScene(entityState: SceneEntity) {
|
||||
private _prepareEntities<EntityType extends HassEntity>(
|
||||
entries?: EntityRegistryEntry[],
|
||||
relatedEntityIds?: string[]
|
||||
): {
|
||||
groupedEntities: NameAndEntity<EntityType>[];
|
||||
relatedEntities: NameAndEntity<EntityType>[];
|
||||
} {
|
||||
const groupedEntities: NameAndEntity<EntityType>[] = [];
|
||||
const relatedEntities: NameAndEntity<EntityType>[] = [];
|
||||
|
||||
if (entries?.length) {
|
||||
entries.forEach((entity) => {
|
||||
const entityState = this.hass.states[
|
||||
entity.entity_id
|
||||
] as unknown as EntityType;
|
||||
if (entityState) {
|
||||
groupedEntities.push({
|
||||
name: computeStateName(entityState),
|
||||
entity: entityState,
|
||||
});
|
||||
}
|
||||
});
|
||||
groupedEntities.sort((entry1, entry2) =>
|
||||
caseInsensitiveStringCompare(entry1.name!, entry2.name!)
|
||||
);
|
||||
}
|
||||
if (relatedEntityIds?.length) {
|
||||
relatedEntityIds.forEach((entity) => {
|
||||
const entityState = this.hass.states[entity] as EntityType;
|
||||
if (entityState) {
|
||||
relatedEntities.push({
|
||||
name: entityState ? computeStateName(entityState) : "",
|
||||
entity: entityState,
|
||||
});
|
||||
}
|
||||
});
|
||||
relatedEntities.sort((entry1, entry2) =>
|
||||
caseInsensitiveStringCompare(entry1.name!, entry2.name!)
|
||||
);
|
||||
}
|
||||
|
||||
return { groupedEntities, relatedEntities };
|
||||
}
|
||||
|
||||
private _renderScene(name: string, entityState: SceneEntity) {
|
||||
return html`<div>
|
||||
<a
|
||||
href=${ifDefined(
|
||||
@@ -435,7 +496,7 @@ class HaConfigAreaPage extends LitElement {
|
||||
)}
|
||||
>
|
||||
<paper-item .disabled=${!entityState.attributes.id}>
|
||||
<paper-item-body> ${computeStateName(entityState)} </paper-item-body>
|
||||
<paper-item-body> ${name} </paper-item-body>
|
||||
<ha-icon-next></ha-icon-next>
|
||||
</paper-item>
|
||||
</a>
|
||||
@@ -449,7 +510,7 @@ class HaConfigAreaPage extends LitElement {
|
||||
</div>`;
|
||||
}
|
||||
|
||||
private _renderAutomation(entityState: AutomationEntity) {
|
||||
private _renderAutomation(name: string, entityState: AutomationEntity) {
|
||||
return html`<div>
|
||||
<a
|
||||
href=${ifDefined(
|
||||
@@ -459,7 +520,7 @@ class HaConfigAreaPage extends LitElement {
|
||||
)}
|
||||
>
|
||||
<paper-item .disabled=${!entityState.attributes.id}>
|
||||
<paper-item-body> ${computeStateName(entityState)} </paper-item-body>
|
||||
<paper-item-body> ${name} </paper-item-body>
|
||||
<ha-icon-next></ha-icon-next>
|
||||
</paper-item>
|
||||
</a>
|
||||
@@ -473,10 +534,10 @@ class HaConfigAreaPage extends LitElement {
|
||||
</div>`;
|
||||
}
|
||||
|
||||
private _renderScript(entityState: ScriptEntity) {
|
||||
private _renderScript(name: string, entityState: ScriptEntity) {
|
||||
return html`<a href=${`/config/script/edit/${entityState.entity_id}`}>
|
||||
<paper-item>
|
||||
<paper-item-body> ${computeStateName(entityState)} </paper-item-body>
|
||||
<paper-item-body> ${name} </paper-item-body>
|
||||
<ha-icon-next></ha-icon-next>
|
||||
</paper-item>
|
||||
</a>`;
|
||||
|
@@ -1,5 +1,8 @@
|
||||
import "@material/mwc-button";
|
||||
import "@material/mwc-list/mwc-list-item";
|
||||
import type { ActionDetail } from "@material/mwc-list";
|
||||
import "@polymer/paper-item/paper-item-body";
|
||||
import { mdiDotsVertical } from "@mdi/js";
|
||||
import { LitElement, css, html, PropertyValues } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { formatDateTime } from "../../../../common/datetime/format_date_time";
|
||||
@@ -7,6 +10,8 @@ import { fireEvent } from "../../../../common/dom/fire_event";
|
||||
import { computeRTLDirection } from "../../../../common/util/compute_rtl";
|
||||
import "../../../../components/buttons/ha-call-api-button";
|
||||
import "../../../../components/ha-card";
|
||||
import "../../../../components/ha-button-menu";
|
||||
import "../../../../components/ha-icon-button";
|
||||
import {
|
||||
cloudLogout,
|
||||
CloudStatusLoggedIn,
|
||||
@@ -21,9 +26,10 @@ import "./cloud-google-pref";
|
||||
import "./cloud-remote-pref";
|
||||
import "./cloud-tts-pref";
|
||||
import "./cloud-webhooks";
|
||||
import { SubscribeMixin } from "../../../../mixins/subscribe-mixin";
|
||||
|
||||
@customElement("cloud-account")
|
||||
export class CloudAccount extends LitElement {
|
||||
export class CloudAccount extends SubscribeMixin(LitElement) {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property({ type: Boolean }) public isWide = false;
|
||||
@@ -43,6 +49,23 @@ export class CloudAccount extends LitElement {
|
||||
.narrow=${this.narrow}
|
||||
header="Home Assistant Cloud"
|
||||
>
|
||||
<ha-button-menu
|
||||
slot="toolbar-icon"
|
||||
corner="BOTTOM_START"
|
||||
@action=${this._handleMenuAction}
|
||||
activatable
|
||||
>
|
||||
<ha-icon-button
|
||||
slot="trigger"
|
||||
.label=${this.hass.localize("ui.common.menu")}
|
||||
.path=${mdiDotsVertical}
|
||||
></ha-icon-button>
|
||||
|
||||
<mwc-list-item>
|
||||
${this.hass.localize("ui.panel.config.cloud.account.sign_out")}
|
||||
</mwc-list-item>
|
||||
</ha-button-menu>
|
||||
|
||||
<div class="content">
|
||||
<ha-config-section .isWide=${this.isWide}>
|
||||
<span slot="header">Home Assistant Cloud</span>
|
||||
@@ -115,11 +138,6 @@ export class CloudAccount extends LitElement {
|
||||
)}
|
||||
</mwc-button>
|
||||
</a>
|
||||
<mwc-button @click=${this._handleLogout}
|
||||
>${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.sign_out"
|
||||
)}</mwc-button
|
||||
>
|
||||
</div>
|
||||
</ha-card>
|
||||
</ha-config-section>
|
||||
@@ -200,6 +218,33 @@ export class CloudAccount extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
protected override hassSubscribe() {
|
||||
const googleCheck = () => {
|
||||
if (!this.cloudStatus?.google_registered) {
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
}
|
||||
};
|
||||
return [
|
||||
this.hass.connection.subscribeEvents(() => {
|
||||
if (!this.cloudStatus?.alexa_registered) {
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
}
|
||||
}, "alexa_smart_home"),
|
||||
this.hass.connection.subscribeEvents(
|
||||
googleCheck,
|
||||
"google_assistant_command"
|
||||
),
|
||||
this.hass.connection.subscribeEvents(
|
||||
googleCheck,
|
||||
"google_assistant_query"
|
||||
),
|
||||
this.hass.connection.subscribeEvents(
|
||||
googleCheck,
|
||||
"google_assistant_sync"
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
private async _fetchSubscriptionInfo() {
|
||||
this._subscription = await fetchCloudSubscriptionInfo(this.hass);
|
||||
if (
|
||||
@@ -211,9 +256,12 @@ export class CloudAccount extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
private async _handleLogout() {
|
||||
await cloudLogout(this.hass);
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
private async _handleMenuAction(ev: CustomEvent<ActionDetail>) {
|
||||
switch (ev.detail.index) {
|
||||
case 0:
|
||||
await cloudLogout(this.hass);
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
}
|
||||
}
|
||||
|
||||
_computeRTLDirection(hass) {
|
||||
@@ -237,7 +285,7 @@ export class CloudAccount extends LitElement {
|
||||
}
|
||||
.card-actions {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-direction: row-reverse;
|
||||
}
|
||||
.card-actions a {
|
||||
text-decoration: none;
|
||||
|
@@ -10,7 +10,7 @@ import { CloudStatusLoggedIn, updateCloudPref } from "../../../../data/cloud";
|
||||
import type { HomeAssistant } from "../../../../types";
|
||||
|
||||
export class CloudAlexaPref extends LitElement {
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public cloudStatus?: CloudStatusLoggedIn;
|
||||
|
||||
@@ -21,6 +21,7 @@ export class CloudAlexaPref extends LitElement {
|
||||
return html``;
|
||||
}
|
||||
|
||||
const alexa_registered = this.cloudStatus.alexa_registered;
|
||||
const { alexa_enabled, alexa_report_state } = this.cloudStatus!.prefs;
|
||||
|
||||
return html`
|
||||
@@ -36,33 +37,49 @@ export class CloudAlexaPref extends LitElement {
|
||||
></ha-switch>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
${this.hass!.localize("ui.panel.config.cloud.account.alexa.info")}
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
href="https://skills-store.amazon.com/deeplink/dp/B0772J1QKB?deviceType=app"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.enable_ha_skill"
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://www.nabucasa.com/config/amazon_alexa/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.config_documentation"
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
${alexa_enabled
|
||||
<p>
|
||||
${this.hass!.localize("ui.panel.config.cloud.account.alexa.info")}
|
||||
</p>
|
||||
${!alexa_enabled
|
||||
? ""
|
||||
: !alexa_registered
|
||||
? html`
|
||||
<ha-alert
|
||||
.title=${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.alexa.not_configured_title"
|
||||
)}
|
||||
>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.alexa.not_configured_text"
|
||||
)}
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<a
|
||||
href="https://skills-store.amazon.com/deeplink/dp/B0772J1QKB?deviceType=app"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.enable_ha_skill"
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="https://www.nabucasa.com/config/amazon_alexa/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.config_documentation"
|
||||
)}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</ha-alert>
|
||||
`
|
||||
: html`
|
||||
<div class="state-reporting">
|
||||
<h3>
|
||||
${this.hass!.localize(
|
||||
@@ -81,18 +98,21 @@ export class CloudAlexaPref extends LitElement {
|
||||
"ui.panel.config.cloud.account.alexa.info_state_reporting"
|
||||
)}
|
||||
</p>
|
||||
`
|
||||
: ""}
|
||||
`}
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<mwc-button
|
||||
@click=${this._handleSync}
|
||||
.disabled=${!alexa_enabled || this._syncing}
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.sync_entities"
|
||||
)}
|
||||
</mwc-button>
|
||||
${alexa_registered
|
||||
? html`
|
||||
<mwc-button
|
||||
@click=${this._handleSync}
|
||||
.disabled=${!alexa_enabled || this._syncing}
|
||||
>
|
||||
${this.hass!.localize(
|
||||
"ui.panel.config.cloud.account.alexa.sync_entities"
|
||||
)}
|
||||
</mwc-button>
|
||||
`
|
||||
: ""}
|
||||
<div class="spacer"></div>
|
||||
<a href="/config/cloud/alexa">
|
||||
<mwc-button
|
||||
|
@@ -1,14 +1,14 @@
|
||||
import "@material/mwc-button";
|
||||
import "@polymer/paper-input/paper-input";
|
||||
import type { PaperInputElement } from "@polymer/paper-input/paper-input";
|
||||
import "@material/mwc-textfield/mwc-textfield";
|
||||
import type { TextField } from "@material/mwc-textfield/mwc-textfield";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { property } from "lit/decorators";
|
||||
import { property, state } from "lit/decorators";
|
||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||
import "../../../../components/buttons/ha-call-api-button";
|
||||
import "../../../../components/ha-card";
|
||||
import "../../../../components/ha-alert";
|
||||
import "../../../../components/ha-card";
|
||||
import type { HaSwitch } from "../../../../components/ha-switch";
|
||||
import { CloudStatusLoggedIn, updateCloudPref } from "../../../../data/cloud";
|
||||
import { syncCloudGoogleEntities } from "../../../../data/google_assistant";
|
||||
import { showAlertDialog } from "../../../../dialogs/generic/show-dialog-box";
|
||||
import type { HomeAssistant } from "../../../../types";
|
||||
import { showSaveSuccessToast } from "../../../../util/toast-saved-success";
|
||||
@@ -16,13 +16,16 @@ import { showSaveSuccessToast } from "../../../../util/toast-saved-success";
|
||||
export class CloudGooglePref extends LitElement {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public cloudStatus?: CloudStatusLoggedIn;
|
||||
@property({ attribute: false }) public cloudStatus?: CloudStatusLoggedIn;
|
||||
|
||||
@state() private _syncing = false;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (!this.cloudStatus) {
|
||||
return html``;
|
||||
}
|
||||
|
||||
const google_registered = this.cloudStatus.google_registered;
|
||||
const { google_enabled, google_report_state, google_secure_devices_pin } =
|
||||
this.cloudStatus.prefs;
|
||||
|
||||
@@ -43,7 +46,9 @@ export class CloudGooglePref extends LitElement {
|
||||
<p>
|
||||
${this.hass.localize("ui.panel.config.cloud.account.google.info")}
|
||||
</p>
|
||||
${google_enabled && !this.cloudStatus.google_registered
|
||||
${!google_enabled
|
||||
? ""
|
||||
: !google_registered
|
||||
? html`
|
||||
<ha-alert
|
||||
.title=${this.hass.localize(
|
||||
@@ -80,9 +85,30 @@ export class CloudGooglePref extends LitElement {
|
||||
</ul>
|
||||
</ha-alert>
|
||||
`
|
||||
: ""}
|
||||
${google_enabled
|
||||
? html`
|
||||
: html`
|
||||
${this.cloudStatus.http_use_ssl
|
||||
? html`
|
||||
<ha-alert
|
||||
alert-type="warning"
|
||||
.title=${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.http_use_ssl_warning_title"
|
||||
)}
|
||||
>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.http_use_ssl_warning_text"
|
||||
)}
|
||||
<a
|
||||
href="https://www.nabucasa.com/config/google_assistant/#local-communication"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>${this.hass.localize(
|
||||
"ui.panel.config.common.learn_more"
|
||||
)}</a
|
||||
>
|
||||
</ha-alert>
|
||||
`
|
||||
: ""}
|
||||
|
||||
<div class="state-reporting">
|
||||
<h3>
|
||||
${this.hass.localize(
|
||||
@@ -110,32 +136,34 @@ export class CloudGooglePref extends LitElement {
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.enter_pin_info"
|
||||
)}
|
||||
<paper-input
|
||||
label=${this.hass.localize(
|
||||
<mwc-textfield
|
||||
id="google_secure_devices_pin"
|
||||
.label=${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.devices_pin"
|
||||
)}
|
||||
id="google_secure_devices_pin"
|
||||
placeholder=${this.hass.localize(
|
||||
.placeholder=${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.enter_pin_hint"
|
||||
)}
|
||||
.value=${google_secure_devices_pin || ""}
|
||||
@change=${this._pinChanged}
|
||||
></paper-input>
|
||||
></mwc-textfield>
|
||||
</div>
|
||||
`
|
||||
: ""}
|
||||
`}
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<ha-call-api-button
|
||||
.hass=${this.hass}
|
||||
.disabled=${!google_enabled}
|
||||
@hass-api-called=${this._syncEntitiesCalled}
|
||||
path="cloud/google_actions/sync"
|
||||
>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.sync_entities"
|
||||
)}
|
||||
</ha-call-api-button>
|
||||
${google_registered
|
||||
? html`
|
||||
<mwc-button
|
||||
@click=${this._handleSync}
|
||||
.disabled=${!google_enabled || this._syncing}
|
||||
>
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.sync_entities"
|
||||
)}
|
||||
</mwc-button>
|
||||
`
|
||||
: ""}
|
||||
<div class="spacer"></div>
|
||||
<a href="/config/cloud/google-assistant">
|
||||
<mwc-button>
|
||||
${this.hass.localize(
|
||||
@@ -148,24 +176,31 @@ export class CloudGooglePref extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
private async _syncEntitiesCalled(ev: CustomEvent) {
|
||||
if (!ev.detail.success && ev.detail.response.status_code === 404) {
|
||||
this._syncFailed();
|
||||
private async _handleSync() {
|
||||
this._syncing = true;
|
||||
try {
|
||||
await syncCloudGoogleEntities(this.hass!);
|
||||
} catch (err: any) {
|
||||
showAlertDialog(this, {
|
||||
title: this.hass.localize(
|
||||
`ui.panel.config.cloud.account.google.${
|
||||
err.status_code === 404
|
||||
? "not_configured_title"
|
||||
: "sync_failed_title"
|
||||
}`
|
||||
),
|
||||
text: this.hass.localize(
|
||||
`ui.panel.config.cloud.account.google.${
|
||||
err.status_code === 404 ? "not_configured_text" : "sync_failed_text"
|
||||
}`
|
||||
),
|
||||
});
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
} finally {
|
||||
this._syncing = false;
|
||||
}
|
||||
}
|
||||
|
||||
private async _syncFailed() {
|
||||
showAlertDialog(this, {
|
||||
title: this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.not_configured_title"
|
||||
),
|
||||
text: this.hass.localize(
|
||||
"ui.panel.config.cloud.account.google.not_configured_text"
|
||||
),
|
||||
});
|
||||
fireEvent(this, "ha-refresh-cloud-status");
|
||||
}
|
||||
|
||||
private async _enableToggleChanged(ev) {
|
||||
const toggle = ev.target as HaSwitch;
|
||||
try {
|
||||
@@ -194,7 +229,7 @@ export class CloudGooglePref extends LitElement {
|
||||
}
|
||||
|
||||
private async _pinChanged(ev) {
|
||||
const input = ev.target as PaperInputElement;
|
||||
const input = ev.target as TextField;
|
||||
try {
|
||||
await updateCloudPref(this.hass, {
|
||||
[input.id]: input.value || null,
|
||||
@@ -207,7 +242,7 @@ export class CloudGooglePref extends LitElement {
|
||||
"ui.panel.config.cloud.account.google.enter_pin_error"
|
||||
)} ${err.message}`
|
||||
);
|
||||
input.value = this.cloudStatus!.prefs.google_secure_devices_pin;
|
||||
input.value = this.cloudStatus!.prefs.google_secure_devices_pin || "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,16 +260,13 @@ export class CloudGooglePref extends LitElement {
|
||||
right: auto;
|
||||
left: 24px;
|
||||
}
|
||||
ha-call-api-button {
|
||||
color: var(--primary-color);
|
||||
font-weight: 500;
|
||||
}
|
||||
paper-input {
|
||||
mwc-textfield {
|
||||
width: 250px;
|
||||
display: block;
|
||||
margin-top: 8px;
|
||||
}
|
||||
.card-actions {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.card-actions a {
|
||||
text-decoration: none;
|
||||
@@ -245,6 +277,10 @@ export class CloudGooglePref extends LitElement {
|
||||
.secure_devices {
|
||||
padding-top: 8px;
|
||||
}
|
||||
.spacer {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.state-reporting {
|
||||
display: flex;
|
||||
margin-top: 1.5em;
|
||||
|
@@ -6,6 +6,7 @@ import {
|
||||
mdiCloseBox,
|
||||
mdiCloseBoxMultiple,
|
||||
} from "@mdi/js";
|
||||
import type { UnsubscribeFunc } from "home-assistant-js-websocket";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { classMap } from "lit/directives/class-map";
|
||||
@@ -33,9 +34,14 @@ import {
|
||||
updateCloudAlexaEntityConfig,
|
||||
updateCloudPref,
|
||||
} from "../../../../data/cloud";
|
||||
import {
|
||||
EntityRegistryEntry,
|
||||
subscribeEntityRegistry,
|
||||
} from "../../../../data/entity_registry";
|
||||
import { showDomainTogglerDialog } from "../../../../dialogs/domain-toggler/show-dialog-domain-toggler";
|
||||
import "../../../../layouts/hass-loading-screen";
|
||||
import "../../../../layouts/hass-subpage";
|
||||
import { SubscribeMixin } from "../../../../mixins/subscribe-mixin";
|
||||
import { haStyle } from "../../../../resources/styles";
|
||||
import type { HomeAssistant } from "../../../../types";
|
||||
|
||||
@@ -43,7 +49,7 @@ const DEFAULT_CONFIG_EXPOSE = true;
|
||||
const IGNORE_INTERFACES = ["Alexa.EndpointHealth"];
|
||||
|
||||
@customElement("cloud-alexa")
|
||||
class CloudAlexa extends LitElement {
|
||||
class CloudAlexa extends SubscribeMixin(LitElement) {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property()
|
||||
@@ -53,9 +59,15 @@ class CloudAlexa extends LitElement {
|
||||
|
||||
@state() private _entities?: AlexaEntity[];
|
||||
|
||||
@property()
|
||||
@state()
|
||||
private _entityConfigs: CloudPreferences["alexa_entity_configs"] = {};
|
||||
|
||||
@state()
|
||||
private _entityCategories?: Record<
|
||||
string,
|
||||
EntityRegistryEntry["entity_category"]
|
||||
>;
|
||||
|
||||
private _popstateSyncAttached = false;
|
||||
|
||||
private _popstateReloadStatusAttached = false;
|
||||
@@ -72,7 +84,7 @@ class CloudAlexa extends LitElement {
|
||||
);
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (this._entities === undefined) {
|
||||
if (this._entities === undefined || this._entityCategories === undefined) {
|
||||
return html` <hass-loading-screen></hass-loading-screen> `;
|
||||
}
|
||||
const emptyFilter = isEmptyFilter(this.cloudStatus.alexa_entities);
|
||||
@@ -99,10 +111,17 @@ class CloudAlexa extends LitElement {
|
||||
should_expose: null,
|
||||
};
|
||||
const isExposed = emptyFilter
|
||||
? this._configIsExposed(entity.entity_id, config)
|
||||
? this._configIsExposed(
|
||||
entity.entity_id,
|
||||
config,
|
||||
this._entityCategories![entity.entity_id]
|
||||
)
|
||||
: filterFunc(entity.entity_id);
|
||||
const isDomainExposed = emptyFilter
|
||||
? this._configIsDomainExposed(entity.entity_id)
|
||||
? this._configIsDomainExposed(
|
||||
entity.entity_id,
|
||||
this._entityCategories![entity.entity_id]
|
||||
)
|
||||
: filterFunc(entity.entity_id);
|
||||
if (isExposed) {
|
||||
selected++;
|
||||
@@ -287,6 +306,23 @@ class CloudAlexa extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
protected override hassSubscribe(): (
|
||||
| UnsubscribeFunc
|
||||
| Promise<UnsubscribeFunc>
|
||||
)[] {
|
||||
return [
|
||||
subscribeEntityRegistry(this.hass.connection, (entries) => {
|
||||
const categories = {};
|
||||
|
||||
for (const entry of entries) {
|
||||
categories[entry.entity_id] = entry.entity_category;
|
||||
}
|
||||
|
||||
this._entityCategories = categories;
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
private async _fetchData() {
|
||||
const entities = await fetchCloudAlexaEntities(this.hass);
|
||||
entities.sort((a, b) => {
|
||||
@@ -305,15 +341,26 @@ class CloudAlexa extends LitElement {
|
||||
fireEvent(this, "hass-more-info", { entityId });
|
||||
}
|
||||
|
||||
private _configIsDomainExposed(entityId: string) {
|
||||
private _configIsDomainExposed(
|
||||
entityId: string,
|
||||
entityCategory: EntityRegistryEntry["entity_category"] | undefined
|
||||
) {
|
||||
const domain = computeDomain(entityId);
|
||||
return this.cloudStatus.prefs.alexa_default_expose
|
||||
? this.cloudStatus.prefs.alexa_default_expose.includes(domain)
|
||||
? !entityCategory &&
|
||||
this.cloudStatus.prefs.alexa_default_expose.includes(domain)
|
||||
: DEFAULT_CONFIG_EXPOSE;
|
||||
}
|
||||
|
||||
private _configIsExposed(entityId: string, config: AlexaEntityConfig) {
|
||||
return config.should_expose ?? this._configIsDomainExposed(entityId);
|
||||
private _configIsExposed(
|
||||
entityId: string,
|
||||
config: AlexaEntityConfig,
|
||||
entityCategory: EntityRegistryEntry["entity_category"] | undefined
|
||||
) {
|
||||
return (
|
||||
config.should_expose ??
|
||||
this._configIsDomainExposed(entityId, entityCategory)
|
||||
);
|
||||
}
|
||||
|
||||
private async _exposeChanged(ev: CustomEvent<ActionDetail>) {
|
||||
|
@@ -6,6 +6,7 @@ import {
|
||||
mdiCloseBox,
|
||||
mdiCloseBoxMultiple,
|
||||
} from "@mdi/js";
|
||||
import type { UnsubscribeFunc } from "home-assistant-js-websocket";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { classMap } from "lit/directives/class-map";
|
||||
@@ -35,6 +36,10 @@ import {
|
||||
updateCloudGoogleEntityConfig,
|
||||
updateCloudPref,
|
||||
} from "../../../../data/cloud";
|
||||
import {
|
||||
EntityRegistryEntry,
|
||||
subscribeEntityRegistry,
|
||||
} from "../../../../data/entity_registry";
|
||||
import {
|
||||
fetchCloudGoogleEntities,
|
||||
GoogleEntity,
|
||||
@@ -42,6 +47,7 @@ import {
|
||||
import { showDomainTogglerDialog } from "../../../../dialogs/domain-toggler/show-dialog-domain-toggler";
|
||||
import "../../../../layouts/hass-loading-screen";
|
||||
import "../../../../layouts/hass-subpage";
|
||||
import { SubscribeMixin } from "../../../../mixins/subscribe-mixin";
|
||||
import { haStyle } from "../../../../resources/styles";
|
||||
import type { HomeAssistant } from "../../../../types";
|
||||
import { showToast } from "../../../../util/toast";
|
||||
@@ -49,7 +55,7 @@ import { showToast } from "../../../../util/toast";
|
||||
const DEFAULT_CONFIG_EXPOSE = true;
|
||||
|
||||
@customElement("cloud-google-assistant")
|
||||
class CloudGoogleAssistant extends LitElement {
|
||||
class CloudGoogleAssistant extends SubscribeMixin(LitElement) {
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public cloudStatus!: CloudStatusLoggedIn;
|
||||
@@ -58,9 +64,15 @@ class CloudGoogleAssistant extends LitElement {
|
||||
|
||||
@state() private _entities?: GoogleEntity[];
|
||||
|
||||
@property()
|
||||
@state()
|
||||
private _entityConfigs: CloudPreferences["google_entity_configs"] = {};
|
||||
|
||||
@state()
|
||||
private _entityCategories?: Record<
|
||||
string,
|
||||
EntityRegistryEntry["entity_category"]
|
||||
>;
|
||||
|
||||
private _popstateSyncAttached = false;
|
||||
|
||||
private _popstateReloadStatusAttached = false;
|
||||
@@ -77,7 +89,7 @@ class CloudGoogleAssistant extends LitElement {
|
||||
);
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (this._entities === undefined) {
|
||||
if (this._entities === undefined || this._entityCategories === undefined) {
|
||||
return html` <hass-loading-screen></hass-loading-screen> `;
|
||||
}
|
||||
const emptyFilter = isEmptyFilter(this.cloudStatus.google_entities);
|
||||
@@ -105,10 +117,17 @@ class CloudGoogleAssistant extends LitElement {
|
||||
should_expose: null,
|
||||
};
|
||||
const isExposed = emptyFilter
|
||||
? this._configIsExposed(entity.entity_id, config)
|
||||
? this._configIsExposed(
|
||||
entity.entity_id,
|
||||
config,
|
||||
this._entityCategories![entity.entity_id]
|
||||
)
|
||||
: filterFunc(entity.entity_id);
|
||||
const isDomainExposed = emptyFilter
|
||||
? this._configIsDomainExposed(entity.entity_id)
|
||||
? this._configIsDomainExposed(
|
||||
entity.entity_id,
|
||||
this._entityCategories![entity.entity_id]
|
||||
)
|
||||
: filterFunc(entity.entity_id);
|
||||
if (isExposed) {
|
||||
selected++;
|
||||
@@ -311,15 +330,43 @@ class CloudGoogleAssistant extends LitElement {
|
||||
}
|
||||
}
|
||||
|
||||
private _configIsDomainExposed(entityId: string) {
|
||||
protected override hassSubscribe(): (
|
||||
| UnsubscribeFunc
|
||||
| Promise<UnsubscribeFunc>
|
||||
)[] {
|
||||
return [
|
||||
subscribeEntityRegistry(this.hass.connection, (entries) => {
|
||||
const categories = {};
|
||||
|
||||
for (const entry of entries) {
|
||||
categories[entry.entity_id] = entry.entity_category;
|
||||
}
|
||||
|
||||
this._entityCategories = categories;
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
private _configIsDomainExposed(
|
||||
entityId: string,
|
||||
entityCategory: EntityRegistryEntry["entity_category"] | undefined
|
||||
) {
|
||||
const domain = computeDomain(entityId);
|
||||
return this.cloudStatus.prefs.google_default_expose
|
||||
? this.cloudStatus.prefs.google_default_expose.includes(domain)
|
||||
? !entityCategory &&
|
||||
this.cloudStatus.prefs.google_default_expose.includes(domain)
|
||||
: DEFAULT_CONFIG_EXPOSE;
|
||||
}
|
||||
|
||||
private _configIsExposed(entityId: string, config: GoogleEntityConfig) {
|
||||
return config.should_expose ?? this._configIsDomainExposed(entityId);
|
||||
private _configIsExposed(
|
||||
entityId: string,
|
||||
config: GoogleEntityConfig,
|
||||
entityCategory: EntityRegistryEntry["entity_category"] | undefined
|
||||
) {
|
||||
return (
|
||||
config.should_expose ??
|
||||
this._configIsDomainExposed(entityId, entityCategory)
|
||||
);
|
||||
}
|
||||
|
||||
private async _fetchData() {
|
||||
|
@@ -3,7 +3,14 @@ import "@material/mwc-list/mwc-list-item";
|
||||
import type { ActionDetail } from "@material/mwc-list";
|
||||
import "@polymer/app-layout/app-header/app-header";
|
||||
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
||||
import {
|
||||
css,
|
||||
CSSResultGroup,
|
||||
html,
|
||||
LitElement,
|
||||
PropertyValues,
|
||||
TemplateResult,
|
||||
} from "lit";
|
||||
import { customElement, property } from "lit/decorators";
|
||||
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
|
||||
import "../../../components/ha-card";
|
||||
@@ -26,6 +33,7 @@ import "./ha-config-navigation";
|
||||
import "./ha-config-updates";
|
||||
import { fireEvent } from "../../../common/dom/fire_event";
|
||||
import { showAlertDialog } from "../../../dialogs/generic/show-dialog-box";
|
||||
import { showToast } from "../../../util/toast";
|
||||
|
||||
@customElement("ha-config-dashboard")
|
||||
class HaConfigDashboard extends LitElement {
|
||||
@@ -43,6 +51,8 @@ class HaConfigDashboard extends LitElement {
|
||||
|
||||
@property() public showAdvanced!: boolean;
|
||||
|
||||
private _notifyUpdates = false;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
<ha-app-layout>
|
||||
@@ -129,6 +139,26 @@ class HaConfigDashboard extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
protected override updated(changedProps: PropertyValues): void {
|
||||
super.updated(changedProps);
|
||||
|
||||
if (!changedProps.has("supervisorUpdates") || !this._notifyUpdates) {
|
||||
return;
|
||||
}
|
||||
this._notifyUpdates = false;
|
||||
if (this.supervisorUpdates?.length) {
|
||||
showToast(this, {
|
||||
message: this.hass.localize(
|
||||
"ui.panel.config.updates.updates_refreshed"
|
||||
),
|
||||
});
|
||||
} else {
|
||||
showToast(this, {
|
||||
message: this.hass.localize("ui.panel.config.updates.no_new_updates"),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private _showQuickBar(): void {
|
||||
showQuickBar(this, {
|
||||
commandMode: true,
|
||||
@@ -140,6 +170,7 @@ class HaConfigDashboard extends LitElement {
|
||||
switch (ev.detail.index) {
|
||||
case 0:
|
||||
if (isComponentLoaded(this.hass, "hassio")) {
|
||||
this._notifyUpdates = true;
|
||||
await refreshSupervisorAvailableUpdates(this.hass);
|
||||
fireEvent(this, "ha-refresh-supervisor");
|
||||
return;
|
||||
@@ -161,10 +192,6 @@ class HaConfigDashboard extends LitElement {
|
||||
return [
|
||||
haStyle,
|
||||
css`
|
||||
app-header {
|
||||
border-bottom: var(--app-header-border-bottom);
|
||||
--header-height: 55px;
|
||||
}
|
||||
:host(:not([narrow])) ha-card:last-child {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
@@ -8,7 +8,6 @@ import "../../../components/ha-alert";
|
||||
import "../../../components/ha-logo-svg";
|
||||
import "../../../components/ha-svg-icon";
|
||||
import { SupervisorAvailableUpdates } from "../../../data/supervisor/root";
|
||||
import { buttonLinkStyle } from "../../../resources/styles";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import "../../../components/ha-icon-next";
|
||||
|
||||
@@ -78,7 +77,7 @@ class HaConfigUpdates extends LitElement {
|
||||
)}
|
||||
${!this._showAll && this.supervisorUpdates.length >= 4
|
||||
? html`
|
||||
<button class="link show-all" @click=${this._showAllClicked}>
|
||||
<button class="show-more" @click=${this._showAllClicked}>
|
||||
${this.hass.localize("ui.panel.config.updates.more_updates", {
|
||||
count: this.supervisorUpdates!.length - updates.length,
|
||||
})}
|
||||
@@ -94,7 +93,6 @@ class HaConfigUpdates extends LitElement {
|
||||
|
||||
static get styles(): CSSResultGroup[] {
|
||||
return [
|
||||
buttonLinkStyle,
|
||||
css`
|
||||
.title {
|
||||
font-size: 16px;
|
||||
@@ -125,6 +123,22 @@ class HaConfigUpdates extends LitElement {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
}
|
||||
button.show-more {
|
||||
color: var(--primary-color);
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
border-width: initial;
|
||||
border-style: none;
|
||||
border-color: initial;
|
||||
border-image: initial;
|
||||
padding: 16px;
|
||||
font: inherit;
|
||||
}
|
||||
button.show-more:focus {
|
||||
outline: none;
|
||||
text-decoration: underline;
|
||||
}
|
||||
`,
|
||||
];
|
||||
}
|
||||
|
@@ -23,7 +23,15 @@ export class HaDeviceCard extends LitElement {
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
<ha-card
|
||||
.header=${this.hass.localize("ui.panel.config.devices.device_info")}
|
||||
.header=${this.hass.localize(
|
||||
"ui.panel.config.devices.device_info",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
this.device.entry_type || "device"
|
||||
}_heading`
|
||||
)
|
||||
)}
|
||||
>
|
||||
<div class="card-content">
|
||||
${this.device.model
|
||||
@@ -59,7 +67,12 @@ export class HaDeviceCard extends LitElement {
|
||||
? html`
|
||||
<div class="extra-info">
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.integrations.config_entry.firmware",
|
||||
`ui.panel.config.integrations.config_entry.${
|
||||
this.device.entry_type === "service" &&
|
||||
!this.device.hw_version
|
||||
? "version"
|
||||
: "firmware"
|
||||
}`,
|
||||
"version",
|
||||
this.device.sw_version
|
||||
)}
|
||||
|
@@ -82,12 +82,26 @@ class DialogDeviceRegistryDetail extends LitElement {
|
||||
</ha-switch>
|
||||
<div>
|
||||
<div>
|
||||
${this.hass.localize("ui.panel.config.devices.enabled_label")}
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.devices.enabled_label",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
<div class="secondary">
|
||||
${this._disabledBy && this._disabledBy !== "user"
|
||||
? this.hass.localize(
|
||||
"ui.panel.config.devices.enabled_cause",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
),
|
||||
"cause",
|
||||
this.hass.localize(
|
||||
`config_entry.disabled_by.${this._disabledBy}`
|
||||
|
@@ -296,6 +296,10 @@ export class HaConfigDevicePage extends LitElement {
|
||||
<ha-alert alert-type="warning">
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.devices.enabled_cause",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${device.entry_type || "device"}`
|
||||
),
|
||||
"cause",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.disabled_by.${device.disabled_by}`
|
||||
@@ -485,17 +489,29 @@ export class HaConfigDevicePage extends LitElement {
|
||||
<ha-card>
|
||||
<h1 class="card-header">
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.devices.automation.automations"
|
||||
"ui.panel.config.devices.automation.automations_heading"
|
||||
)}
|
||||
<ha-icon-button
|
||||
@click=${this._showAutomationDialog}
|
||||
.disabled=${device.disabled_by}
|
||||
.label=${device.disabled_by
|
||||
? this.hass.localize(
|
||||
"ui.panel.config.devices.automation.create_disabled"
|
||||
"ui.panel.config.devices.automation.create_disabled",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)
|
||||
: this.hass.localize(
|
||||
"ui.panel.config.devices.automation.create"
|
||||
"ui.panel.config.devices.automation.create",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
.path=${mdiPlusCircle}
|
||||
></ha-icon-button>
|
||||
@@ -547,6 +563,12 @@ export class HaConfigDevicePage extends LitElement {
|
||||
"name",
|
||||
this.hass.localize(
|
||||
"ui.panel.config.devices.automation.automations"
|
||||
),
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
@@ -561,7 +583,7 @@ export class HaConfigDevicePage extends LitElement {
|
||||
<ha-card>
|
||||
<h1 class="card-header">
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.devices.scene.scenes"
|
||||
"ui.panel.config.devices.scene.scenes_heading"
|
||||
)}
|
||||
|
||||
<ha-icon-button
|
||||
@@ -569,10 +591,22 @@ export class HaConfigDevicePage extends LitElement {
|
||||
.disabled=${device.disabled_by}
|
||||
.label=${device.disabled_by
|
||||
? this.hass.localize(
|
||||
"ui.panel.config.devices.scene.create_disabled"
|
||||
"ui.panel.config.devices.scene.create_disabled",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)
|
||||
: this.hass.localize(
|
||||
"ui.panel.config.devices.scene.create"
|
||||
"ui.panel.config.devices.scene.create",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
.path=${mdiPlusCircle}
|
||||
></ha-icon-button>
|
||||
@@ -627,6 +661,12 @@ export class HaConfigDevicePage extends LitElement {
|
||||
"name",
|
||||
this.hass.localize(
|
||||
"ui.panel.config.devices.scene.scenes"
|
||||
),
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
@@ -641,17 +681,29 @@ export class HaConfigDevicePage extends LitElement {
|
||||
<ha-card>
|
||||
<h1 class="card-header">
|
||||
${this.hass.localize(
|
||||
"ui.panel.config.devices.script.scripts"
|
||||
"ui.panel.config.devices.script.scripts_heading"
|
||||
)}
|
||||
<ha-icon-button
|
||||
@click=${this._showScriptDialog}
|
||||
.disabled=${device.disabled_by}
|
||||
.label=${device.disabled_by
|
||||
? this.hass.localize(
|
||||
"ui.panel.config.devices.script.create_disabled"
|
||||
"ui.panel.config.devices.script.create_disabled",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)
|
||||
: this.hass.localize(
|
||||
"ui.panel.config.devices.script.create"
|
||||
"ui.panel.config.devices.script.create",
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
.path=${mdiPlusCircle}
|
||||
></ha-icon-button>
|
||||
@@ -685,6 +737,12 @@ export class HaConfigDevicePage extends LitElement {
|
||||
"name",
|
||||
this.hass.localize(
|
||||
"ui.panel.config.devices.script.scripts"
|
||||
),
|
||||
"type",
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.type.${
|
||||
device.entry_type || "device"
|
||||
}`
|
||||
)
|
||||
)}
|
||||
</div>
|
||||
@@ -1065,6 +1123,7 @@ export class HaConfigDevicePage extends LitElement {
|
||||
align-self: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.column > *:not(:first-child) {
|
||||
|
@@ -338,7 +338,7 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
${this.hass.localize("ui.panel.config.devices.disabled")}
|
||||
</paper-tooltip>
|
||||
</div>`
|
||||
: "",
|
||||
: "—",
|
||||
};
|
||||
}
|
||||
return columns;
|
||||
|
@@ -42,7 +42,7 @@ import type { HomeAssistant } from "../../../types";
|
||||
import { showDeviceRegistryDetailDialog } from "../devices/device-registry-detail/show-dialog-device-registry-detail";
|
||||
|
||||
const OVERRIDE_DEVICE_CLASSES = {
|
||||
cover: ["window", "door", "garage"],
|
||||
cover: ["window", "door", "garage", "gate"],
|
||||
binary_sensor: ["window", "door", "garage_door", "opening"],
|
||||
};
|
||||
|
||||
|
@@ -76,7 +76,7 @@ export interface StateEntity extends EntityRegistryEntry {
|
||||
}
|
||||
|
||||
export interface EntityRow extends StateEntity {
|
||||
entity: HassEntity;
|
||||
entity?: HassEntity;
|
||||
unavailable: boolean;
|
||||
restored: boolean;
|
||||
status: string;
|
||||
@@ -165,13 +165,13 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
|
||||
);
|
||||
|
||||
private _columns = memoize(
|
||||
(narrow, _language, showDisabled): DataTableColumnContainer => ({
|
||||
(narrow, _language, showDisabled): DataTableColumnContainer<EntityRow> => ({
|
||||
icon: {
|
||||
title: "",
|
||||
type: "icon",
|
||||
template: (_, entry: any) => html`
|
||||
template: (_, entry: EntityRow) => html`
|
||||
<ha-state-icon
|
||||
.title=${entry.entity.state}
|
||||
.title=${entry.entity?.state}
|
||||
slot="item-icon"
|
||||
.state=${entry.entity}
|
||||
></ha-state-icon>
|
||||
@@ -186,7 +186,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
|
||||
direction: "asc",
|
||||
grows: true,
|
||||
template: narrow
|
||||
? (name, entity: any) =>
|
||||
? (name, entity: EntityRow) =>
|
||||
html`
|
||||
${name}<br />
|
||||
<div class="secondary">
|
||||
@@ -237,7 +237,9 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
|
||||
template: (disabled_by) =>
|
||||
this.hass.localize(
|
||||
`ui.panel.config.devices.disabled_by.${disabled_by}`
|
||||
) || disabled_by,
|
||||
) ||
|
||||
disabled_by ||
|
||||
"—",
|
||||
},
|
||||
status: {
|
||||
title: this.hass.localize(
|
||||
@@ -247,7 +249,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) {
|
||||
sortable: true,
|
||||
filterable: true,
|
||||
width: "68px",
|
||||
template: (_status, entity: any) =>
|
||||
template: (_status, entity: EntityRow) =>
|
||||
entity.unavailable || entity.disabled_by || entity.readonly
|
||||
? html`
|
||||
<div
|
||||
|
@@ -12,6 +12,7 @@ import {
|
||||
} from "../../../data/integration";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { brandsUrl } from "../../../util/brands-url";
|
||||
import { documentationUrl } from "../../../util/documentation-url";
|
||||
|
||||
@customElement("integrations-card")
|
||||
class IntegrationsCard extends LitElement {
|
||||
@@ -66,7 +67,12 @@ class IntegrationsCard extends LitElement {
|
||||
const manifest = this._manifests && this._manifests[domain];
|
||||
const docLink = manifest
|
||||
? html`<a
|
||||
href=${manifest.documentation}
|
||||
href=${manifest.is_built_in
|
||||
? documentationUrl(
|
||||
this.hass,
|
||||
`/integrations/${manifest.domain}`
|
||||
)
|
||||
: manifest.documentation}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>${this.hass.localize(
|
||||
|
@@ -15,6 +15,7 @@ import { showConfirmationDialog } from "../../../dialogs/generic/show-dialog-box
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import type { DataEntryFlowProgressExtended } from "./ha-config-integrations";
|
||||
import "./ha-integration-action-card";
|
||||
import { documentationUrl } from "../../../util/documentation-url";
|
||||
|
||||
@customElement("ha-config-flow-card")
|
||||
export class HaConfigFlowCard extends LitElement {
|
||||
@@ -82,7 +83,12 @@ export class HaConfigFlowCard extends LitElement {
|
||||
: ""}
|
||||
${this.manifest
|
||||
? html`<a
|
||||
href=${this.manifest.documentation}
|
||||
href=${this.manifest.is_built_in
|
||||
? documentationUrl(
|
||||
this.hass,
|
||||
`/integrations/${this.manifest.domain}`
|
||||
)
|
||||
: this.manifest.documentation}
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
|
@@ -46,6 +46,7 @@ import {
|
||||
} from "../../../dialogs/generic/show-dialog-box";
|
||||
import { haStyle, haStyleScrollbar } from "../../../resources/styles";
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import { documentationUrl } from "../../../util/documentation-url";
|
||||
import { fileDownload } from "../../../util/file_download";
|
||||
import type { ConfigEntryExtended } from "./ha-config-integrations";
|
||||
import "./ha-integration-header";
|
||||
@@ -331,7 +332,12 @@ export class HaIntegrationCard extends LitElement {
|
||||
</mwc-list-item>
|
||||
${this.manifest
|
||||
? html` <a
|
||||
href=${this.manifest.documentation}
|
||||
href=${this.manifest.is_built_in
|
||||
? documentationUrl(
|
||||
this.hass,
|
||||
`/integrations/${this.manifest.domain}`
|
||||
)
|
||||
: this.manifest.documentation}
|
||||
rel="noreferrer"
|
||||
target="_blank"
|
||||
>
|
||||
|
@@ -21,6 +21,7 @@ import type { PageNavigation } from "../../../../../layouts/hass-tabs-subpage";
|
||||
import { haStyle } from "../../../../../resources/styles";
|
||||
import type { HomeAssistant, Route } from "../../../../../types";
|
||||
import "../../../ha-config-section";
|
||||
import "../../../../../components/ha-alert";
|
||||
|
||||
export const ozwTabs: PageNavigation[] = [];
|
||||
|
||||
@@ -64,6 +65,30 @@ class OZWConfigDashboard extends LitElement {
|
||||
.tabs=${ozwTabs}
|
||||
back-path="/config/integrations"
|
||||
>
|
||||
<ha-alert
|
||||
alert-type="warning"
|
||||
title="This integration will stop working soon"
|
||||
>
|
||||
The OpenZWave integration is deprecated and will no longer receive any
|
||||
updates. The technical dependencies will render this integration
|
||||
unusable in the near future. We strongly advise you to migrate to the
|
||||
new
|
||||
<a
|
||||
href="https://www.home-assistant.io/integrations/zwave_js"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>Z-Wave JS integration</a
|
||||
>.
|
||||
<a
|
||||
slot="action"
|
||||
href="https://alerts.home-assistant.io/#ozw.markdown"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
<mwc-button>learn more</mwc-button>
|
||||
</a>
|
||||
</ha-alert>
|
||||
|
||||
<ha-config-section .narrow=${this.narrow} .isWide=${this.isWide}>
|
||||
<div slot="header">
|
||||
${this.hass.localize("ui.panel.config.ozw.select_instance.header")}
|
||||
@@ -162,6 +187,13 @@ class OZWConfigDashboard extends LitElement {
|
||||
:host([narrow]) ha-config-section {
|
||||
margin-top: -20px;
|
||||
}
|
||||
ha-alert {
|
||||
display: block;
|
||||
margin: 16px;
|
||||
}
|
||||
ha-alert a {
|
||||
text-decoration: none;
|
||||
}
|
||||
ha-card {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
@@ -55,6 +55,7 @@ class DialogZHAReconfigureDevice extends LitElement {
|
||||
this._status = undefined;
|
||||
this._stages = undefined;
|
||||
this._clusterConfigurationStatuses = undefined;
|
||||
this._showDetails = false;
|
||||
fireEvent(this, "dialog-closed", { dialog: this.localName });
|
||||
}
|
||||
|
||||
@@ -225,10 +226,10 @@ class DialogZHAReconfigureDevice extends LitElement {
|
||||
)}
|
||||
</h2>
|
||||
|
||||
${this._clusterConfigurationStatuses!.size > 0
|
||||
${this._clusterConfigurationStatuses?.size
|
||||
? html`
|
||||
${Array.from(
|
||||
this._clusterConfigurationStatuses!.values()
|
||||
this._clusterConfigurationStatuses.values()
|
||||
).map(
|
||||
(clusterStatus) => html`
|
||||
<div class="grid-item">
|
||||
|
@@ -12,6 +12,7 @@ import { computeStateName } from "../../../../../common/entity/compute_state_nam
|
||||
import { sortStatesByName } from "../../../../../common/entity/states_sort_by_name";
|
||||
import "../../../../../components/buttons/ha-call-service-button";
|
||||
import "../../../../../components/ha-card";
|
||||
import "../../../../../components/ha-alert";
|
||||
import "../../../../../components/ha-icon";
|
||||
import "../../../../../components/ha-icon-button";
|
||||
import "../../../../../components/ha-icon-button-arrow-prev";
|
||||
@@ -43,6 +44,14 @@ class HaConfigZwave extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
||||
border-bottom: 1px solid var(--divider-color);
|
||||
}
|
||||
|
||||
ha-alert {
|
||||
display: block;
|
||||
margin: 16px;
|
||||
}
|
||||
ha-alert a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: 24px;
|
||||
}
|
||||
@@ -101,6 +110,30 @@ class HaConfigZwave extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
||||
</app-toolbar>
|
||||
</app-header>
|
||||
|
||||
<ha-alert
|
||||
alert-type="warning"
|
||||
title="This integration will stop working soon"
|
||||
>
|
||||
This Z-Wave integration is deprecated and will no longer receive any
|
||||
updates. The technical dependencies will render this integration
|
||||
unusable in the near future. We strongly advise you to migrate to the
|
||||
new
|
||||
<a
|
||||
href="https://www.home-assistant.io/integrations/zwave_js"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>Z-Wave JS integration</a
|
||||
>.
|
||||
<a
|
||||
slot="action"
|
||||
href="https://alerts.home-assistant.io/#zwave.markdown"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
<mwc-button>learn more</mwc-button>
|
||||
</a>
|
||||
</ha-alert>
|
||||
|
||||
<ha-config-section is-wide="[[isWide]]">
|
||||
<ha-card
|
||||
class="content"
|
||||
|
@@ -21,6 +21,7 @@ import {
|
||||
} from "../../../data/system_log";
|
||||
import { haStyleDialog } from "../../../resources/styles";
|
||||
import type { HomeAssistant } from "../../../types";
|
||||
import { documentationUrl } from "../../../util/documentation-url";
|
||||
import { showToast } from "../../../util/toast";
|
||||
import type { SystemLogDetailDialogParams } from "./show-dialog-system-log-detail";
|
||||
import { formatSystemLogTime } from "./util";
|
||||
@@ -117,7 +118,12 @@ class DialogSystemLogDetail extends LitElement {
|
||||
? ""
|
||||
: html`
|
||||
(<a
|
||||
href=${this._manifest.documentation}
|
||||
href=${this._manifest.is_built_in
|
||||
? documentationUrl(
|
||||
this.hass,
|
||||
`/integrations/${this._manifest.domain}`
|
||||
)
|
||||
: this._manifest.documentation}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>documentation</a
|
||||
|
@@ -7,7 +7,9 @@ import {
|
||||
import "@polymer/paper-tooltip/paper-tooltip";
|
||||
import { html, LitElement, PropertyValues, TemplateResult } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { ifDefined } from "lit/directives/if-defined";
|
||||
import memoize from "memoize-one";
|
||||
import { isComponentLoaded } from "../../../../common/config/is_component_loaded";
|
||||
import { navigate } from "../../../../common/navigate";
|
||||
import { stringCompare } from "../../../../common/string/compare";
|
||||
import {
|
||||
@@ -52,9 +54,19 @@ export class HaConfigLovelaceDashboards extends LitElement {
|
||||
icon: {
|
||||
title: "",
|
||||
type: "icon",
|
||||
template: (icon) =>
|
||||
template: (icon, dashboard) =>
|
||||
icon
|
||||
? html` <ha-icon slot="item-icon" .icon=${icon}></ha-icon> `
|
||||
? html`
|
||||
<ha-icon
|
||||
slot="item-icon"
|
||||
.icon=${icon}
|
||||
style=${ifDefined(
|
||||
dashboard.iconColor
|
||||
? `color: ${dashboard.iconColor}`
|
||||
: undefined
|
||||
)}
|
||||
></ha-icon>
|
||||
`
|
||||
: html``,
|
||||
},
|
||||
title: {
|
||||
@@ -63,7 +75,6 @@ export class HaConfigLovelaceDashboards extends LitElement {
|
||||
),
|
||||
sortable: true,
|
||||
filterable: true,
|
||||
direction: "asc",
|
||||
grows: true,
|
||||
template: (title, dashboard: any) => {
|
||||
const titleTemplate = html`
|
||||
@@ -183,29 +194,41 @@ export class HaConfigLovelaceDashboards extends LitElement {
|
||||
).mode;
|
||||
const defaultUrlPath = this.hass.defaultPanel;
|
||||
const isDefault = defaultUrlPath === "lovelace";
|
||||
return [
|
||||
const result: Record<string, any>[] = [
|
||||
{
|
||||
icon: "hass:view-dashboard",
|
||||
title: this.hass.localize("panel.states"),
|
||||
default: isDefault,
|
||||
sidebar: isDefault,
|
||||
show_in_sidebar: isDefault,
|
||||
require_admin: false,
|
||||
url_path: "lovelace",
|
||||
mode: defaultMode,
|
||||
filename: defaultMode === "yaml" ? "ui-lovelace.yaml" : "",
|
||||
iconColor: "var(--primary-color)",
|
||||
},
|
||||
{
|
||||
];
|
||||
if (isComponentLoaded(this.hass, "energy")) {
|
||||
result.push({
|
||||
icon: "hass:lightning-bolt",
|
||||
title: this.hass.localize(`ui.panel.config.dashboard.energy.title`),
|
||||
show_in_sidebar: true,
|
||||
mode: "storage",
|
||||
url_path: "energy",
|
||||
filename: "",
|
||||
},
|
||||
...dashboards.map((dashboard) => ({
|
||||
filename: "",
|
||||
...dashboard,
|
||||
default: defaultUrlPath === dashboard.url_path,
|
||||
})),
|
||||
];
|
||||
iconColor: "var(--label-badge-yellow)",
|
||||
});
|
||||
}
|
||||
|
||||
result.push(
|
||||
...dashboards
|
||||
.sort((a, b) => stringCompare(a.title, b.title))
|
||||
.map((dashboard) => ({
|
||||
filename: "",
|
||||
...dashboard,
|
||||
default: defaultUrlPath === dashboard.url_path,
|
||||
}))
|
||||
);
|
||||
return result;
|
||||
});
|
||||
|
||||
protected render(): TemplateResult {
|
||||
|
@@ -42,6 +42,8 @@ class DialogTagDetail
|
||||
this._id = "";
|
||||
this._name = "";
|
||||
}
|
||||
|
||||
this._generateQR();
|
||||
}
|
||||
|
||||
public closeDialog(): void {
|
||||
@@ -121,16 +123,9 @@ class DialogTagDetail
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div id="qr">
|
||||
${this._qrCode
|
||||
? this._qrCode
|
||||
: html`
|
||||
<mwc-button @click=${this._generateQR}
|
||||
>Generate QR code
|
||||
</mwc-button>
|
||||
`}
|
||||
</div>
|
||||
${this._qrCode
|
||||
? html` <div id="qr">${this._qrCode}</div> `
|
||||
: ""}
|
||||
`
|
||||
: ``}
|
||||
</div>
|
||||
@@ -225,6 +220,9 @@ class DialogTagDetail
|
||||
{
|
||||
width: 180,
|
||||
errorCorrectionLevel: "Q",
|
||||
color: {
|
||||
light: "#fff",
|
||||
},
|
||||
}
|
||||
);
|
||||
const context = canvas.getContext("2d");
|
||||
|
@@ -51,7 +51,12 @@ export class EnergySetupWizard extends LitElement implements LovelaceCard {
|
||||
|
||||
protected render(): TemplateResult {
|
||||
return html`
|
||||
<p>Step ${this._step + 1} of 5</p>
|
||||
<p>
|
||||
${this.hass.localize("ui.panel.energy.setup.step", {
|
||||
step: this._step + 1,
|
||||
steps: 5,
|
||||
})}
|
||||
</p>
|
||||
${this._step === 0
|
||||
? html`<ha-energy-grid-settings
|
||||
.hass=${this.hass}
|
||||
|
@@ -12,7 +12,11 @@ import {
|
||||
} from "date-fns";
|
||||
import { css, html, LitElement, PropertyValues } from "lit";
|
||||
import { property, state } from "lit/decorators";
|
||||
import { extractSearchParam } from "../../common/url/search-params";
|
||||
import { navigate } from "../../common/navigate";
|
||||
import {
|
||||
createSearchParam,
|
||||
extractSearchParam,
|
||||
} from "../../common/url/search-params";
|
||||
import { computeRTL } from "../../common/util/compute_rtl";
|
||||
import "../../components/chart/state-history-charts";
|
||||
import "../../components/entity/ha-entity-picker";
|
||||
@@ -144,6 +148,10 @@ class HaPanelHistory extends LitElement {
|
||||
if (startDate) {
|
||||
this._startDate = new Date(startDate);
|
||||
}
|
||||
const endDate = extractSearchParam("end_date");
|
||||
if (endDate) {
|
||||
this._endDate = new Date(endDate);
|
||||
}
|
||||
}
|
||||
|
||||
protected updated(changedProps: PropertyValues) {
|
||||
@@ -191,10 +199,32 @@ class HaPanelHistory extends LitElement {
|
||||
endDate.setMilliseconds(endDate.getMilliseconds() - 1);
|
||||
}
|
||||
this._endDate = endDate;
|
||||
|
||||
this._updatePath();
|
||||
}
|
||||
|
||||
private _entityPicked(ev) {
|
||||
this._entityId = ev.target.value;
|
||||
|
||||
this._updatePath();
|
||||
}
|
||||
|
||||
private _updatePath() {
|
||||
const params: Record<string, string> = {};
|
||||
|
||||
if (this._entityId) {
|
||||
params.entity_id = this._entityId;
|
||||
}
|
||||
|
||||
if (this._startDate) {
|
||||
params.start_date = this._startDate.toISOString();
|
||||
}
|
||||
|
||||
if (this._endDate) {
|
||||
params.end_date = this._endDate.toISOString();
|
||||
}
|
||||
|
||||
navigate(`/history?${createSearchParam(params)}`, { replace: true });
|
||||
}
|
||||
|
||||
static get styles() {
|
||||
|
@@ -1,8 +1,6 @@
|
||||
import { mdiRefresh } from "@mdi/js";
|
||||
import "@polymer/app-layout/app-header/app-header";
|
||||
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
||||
import { css, html, LitElement, PropertyValues } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import {
|
||||
addDays,
|
||||
endOfToday,
|
||||
@@ -12,8 +10,15 @@ import {
|
||||
startOfWeek,
|
||||
startOfYesterday,
|
||||
} from "date-fns";
|
||||
import { css, html, LitElement, PropertyValues } from "lit";
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import { isComponentLoaded } from "../../common/config/is_component_loaded";
|
||||
import { computeStateDomain } from "../../common/entity/compute_state_domain";
|
||||
import { navigate } from "../../common/navigate";
|
||||
import {
|
||||
createSearchParam,
|
||||
extractSearchParam,
|
||||
} from "../../common/url/search-params";
|
||||
import { computeRTL } from "../../common/util/compute_rtl";
|
||||
import "../../components/entity/ha-entity-picker";
|
||||
import "../../components/ha-circular-progress";
|
||||
@@ -33,7 +38,6 @@ import "../../layouts/ha-app-layout";
|
||||
import { haStyle } from "../../resources/styles";
|
||||
import { HomeAssistant } from "../../types";
|
||||
import "./ha-logbook";
|
||||
import { extractSearchParam } from "../../common/url/search-params";
|
||||
|
||||
@customElement("ha-panel-logbook")
|
||||
export class HaPanelLogbook extends LitElement {
|
||||
@@ -166,6 +170,10 @@ export class HaPanelLogbook extends LitElement {
|
||||
if (startDate) {
|
||||
this._startDate = new Date(startDate);
|
||||
}
|
||||
const endDate = extractSearchParam("end_date");
|
||||
if (endDate) {
|
||||
this._endDate = new Date(endDate);
|
||||
}
|
||||
}
|
||||
|
||||
protected updated(changedProps: PropertyValues<this>) {
|
||||
@@ -223,10 +231,32 @@ export class HaPanelLogbook extends LitElement {
|
||||
endDate.setMilliseconds(endDate.getMilliseconds() - 1);
|
||||
}
|
||||
this._endDate = endDate;
|
||||
|
||||
this._updatePath();
|
||||
}
|
||||
|
||||
private _entityPicked(ev) {
|
||||
this._entityId = ev.target.value;
|
||||
|
||||
this._updatePath();
|
||||
}
|
||||
|
||||
private _updatePath() {
|
||||
const params: Record<string, string> = {};
|
||||
|
||||
if (this._entityId) {
|
||||
params.entity_id = this._entityId;
|
||||
}
|
||||
|
||||
if (this._startDate) {
|
||||
params.start_date = this._startDate.toISOString();
|
||||
}
|
||||
|
||||
if (this._endDate) {
|
||||
params.end_date = this._endDate.toISOString();
|
||||
}
|
||||
|
||||
navigate(`/logbook?${createSearchParam(params)}`, { replace: true });
|
||||
}
|
||||
|
||||
private _refreshLogbook() {
|
||||
|
@@ -170,6 +170,21 @@ export class HuiEnergyDevicesGraphCard
|
||||
dayDifference > 35 ? "month" : dayDifference > 2 ? "day" : "hour"
|
||||
);
|
||||
|
||||
const startMinHour = addHours(energyData.start, -1);
|
||||
|
||||
Object.values(this._data).forEach((stat) => {
|
||||
// if the start of the first value is after the requested period, we have the first data point, and should add a zero point
|
||||
if (stat.length && new Date(stat[0].start) > startMinHour) {
|
||||
stat.unshift({
|
||||
...stat[0],
|
||||
start: startMinHour.toISOString(),
|
||||
end: startMinHour.toISOString(),
|
||||
sum: 0,
|
||||
state: 0,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const data: Array<ChartDataset<"bar", ParsedDataType<"bar">>["data"]> = [];
|
||||
const borderColor: string[] = [];
|
||||
const backgroundColor: string[] = [];
|
||||
|
@@ -23,8 +23,8 @@ import { iconColorCSS } from "../../../common/style/icon_color_css";
|
||||
import "../../../components/ha-card";
|
||||
import "../../../components/ha-icon";
|
||||
import { UNAVAILABLE_STATES } from "../../../data/entity";
|
||||
import { formatAttributeValue } from "../../../data/entity_attributes";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { formatAttributeValue } from "../../../util/hass-attributes-util";
|
||||
import { computeCardSize } from "../common/compute-card-size";
|
||||
import { findEntities } from "../common/find-entities";
|
||||
import { hasConfigOrEntityChanged } from "../common/has-changed";
|
||||
|
@@ -130,6 +130,7 @@ class HUIRoot extends LitElement {
|
||||
></ha-icon-button>
|
||||
</div>
|
||||
<mwc-button
|
||||
outlined
|
||||
class="exit-edit-mode"
|
||||
.label=${this.hass!.localize(
|
||||
"ui.panel.lovelace.menu.exit_edit_mode"
|
||||
@@ -938,7 +939,8 @@ class HUIRoot extends LitElement {
|
||||
);
|
||||
}
|
||||
.exit-edit-mode {
|
||||
--mdc-theme-primary: var(--primary-text-color);
|
||||
--mdc-theme-primary: var(--app-header-edit-text-color, #fff);
|
||||
--mdc-button-outline-color: var(--app-header-edit-text-color, #fff);
|
||||
--mdc-typography-button-font-size: 14px;
|
||||
}
|
||||
`,
|
||||
|
@@ -9,8 +9,8 @@ import {
|
||||
import { customElement, property, state } from "lit/decorators";
|
||||
import checkValidDate from "../../../common/datetime/check_valid_date";
|
||||
import { formatNumber } from "../../../common/number/format_number";
|
||||
import { formatAttributeValue } from "../../../data/entity_attributes";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { formatAttributeValue } from "../../../util/hass-attributes-util";
|
||||
import { hasConfigOrEntityChanged } from "../common/has-changed";
|
||||
import "../components/hui-generic-entity-row";
|
||||
import "../components/hui-timestamp-display";
|
||||
|
@@ -3,7 +3,7 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded";
|
||||
import { subscribeOne } from "../../../common/util/subscribe-one";
|
||||
import { subscribeAreaRegistry } from "../../../data/area_registry";
|
||||
import { subscribeDeviceRegistry } from "../../../data/device_registry";
|
||||
import { EnergyPreferences, getEnergyPreferences } from "../../../data/energy";
|
||||
import { getEnergyPreferences } from "../../../data/energy";
|
||||
import { subscribeEntityRegistry } from "../../../data/entity_registry";
|
||||
import { generateDefaultViewConfig } from "../common/generate-lovelace-config";
|
||||
import {
|
||||
@@ -39,30 +39,18 @@ export class OriginalStatesStrategy {
|
||||
subscribeEntityRegistry(hass.connection, () => undefined);
|
||||
}
|
||||
|
||||
let energyPromise: Promise<EnergyPreferences> | undefined;
|
||||
|
||||
if (isComponentLoaded(hass, "energy")) {
|
||||
energyPromise = getEnergyPreferences(hass);
|
||||
}
|
||||
|
||||
const [areaEntries, deviceEntries, entityEntries, localize] =
|
||||
const [areaEntries, deviceEntries, entityEntries, localize, energyPrefs] =
|
||||
await Promise.all([
|
||||
subscribeOne(hass.connection, subscribeAreaRegistry),
|
||||
subscribeOne(hass.connection, subscribeDeviceRegistry),
|
||||
subscribeOne(hass.connection, subscribeEntityRegistry),
|
||||
hass.loadBackendTranslation("title"),
|
||||
isComponentLoaded(hass, "energy")
|
||||
? // It raises if not configured, just swallow that.
|
||||
getEnergyPreferences(hass).catch(() => undefined)
|
||||
: undefined,
|
||||
]);
|
||||
|
||||
let energyPrefs: EnergyPreferences | undefined;
|
||||
|
||||
if (energyPromise) {
|
||||
try {
|
||||
energyPrefs = await energyPromise;
|
||||
} catch (_) {
|
||||
// Nothing to do here
|
||||
}
|
||||
}
|
||||
|
||||
// User can override default view. If they didn't, we will add one
|
||||
// that contains all entities.
|
||||
const view = generateDefaultViewConfig(
|
||||
|
@@ -19,6 +19,7 @@ import {
|
||||
TemplateResult,
|
||||
} from "lit";
|
||||
import { customElement, property, query, state } from "lit/decorators";
|
||||
import { fireEvent } from "../../common/dom/fire_event";
|
||||
import { computeDomain } from "../../common/entity/compute_domain";
|
||||
import { computeStateDomain } from "../../common/entity/compute_state_domain";
|
||||
import { computeStateName } from "../../common/entity/compute_state_name";
|
||||
@@ -114,7 +115,9 @@ class BarMediaPlayer extends LitElement {
|
||||
protected render(): TemplateResult {
|
||||
const isBrowser = this.entityId === BROWSER_PLAYER;
|
||||
const stateObj = this._stateObj;
|
||||
const controls = !this.narrow
|
||||
const controls = !stateObj
|
||||
? undefined
|
||||
: !this.narrow
|
||||
? computeMediaControls(stateObj)
|
||||
: (stateObj.state === "playing" &&
|
||||
(supportsFeature(stateObj, SUPPORT_PAUSE) ||
|
||||
@@ -143,16 +146,22 @@ class BarMediaPlayer extends LitElement {
|
||||
},
|
||||
]
|
||||
: [{}];
|
||||
const mediaDescription = computeMediaDescription(stateObj);
|
||||
const mediaDuration = formatMediaTime(stateObj!.attributes.media_duration!);
|
||||
const mediaTitleClean = cleanupMediaTitle(stateObj.attributes.media_title);
|
||||
const mediaDescription = stateObj ? computeMediaDescription(stateObj) : "";
|
||||
const mediaDuration = formatMediaTime(stateObj?.attributes.media_duration);
|
||||
const mediaTitleClean = cleanupMediaTitle(
|
||||
stateObj?.attributes.media_title || ""
|
||||
);
|
||||
|
||||
const mediaArt =
|
||||
stateObj.attributes.entity_picture_local ||
|
||||
stateObj.attributes.entity_picture;
|
||||
const mediaArt = stateObj
|
||||
? stateObj.attributes.entity_picture_local ||
|
||||
stateObj.attributes.entity_picture
|
||||
: undefined;
|
||||
|
||||
return html`
|
||||
<div class="info">
|
||||
<div
|
||||
class="info ${!isBrowser ? "pointer" : ""}"
|
||||
@click=${this._openMoreInfo}
|
||||
>
|
||||
${mediaArt ? html`<img src=${this.hass.hassUrl(mediaArt)} />` : ""}
|
||||
<div class="media-info">
|
||||
<hui-marquee
|
||||
@@ -212,7 +221,7 @@ class BarMediaPlayer extends LitElement {
|
||||
slot="trigger"
|
||||
.label=${this.narrow
|
||||
? ""
|
||||
: `${computeStateName(stateObj)}
|
||||
: `${stateObj ? computeStateName(stateObj) : this.entityId}
|
||||
`}
|
||||
>
|
||||
<ha-svg-icon
|
||||
@@ -284,7 +293,7 @@ class BarMediaPlayer extends LitElement {
|
||||
if (
|
||||
!this._progressInterval &&
|
||||
this._showProgressBar &&
|
||||
stateObj.state === "playing"
|
||||
stateObj?.state === "playing"
|
||||
) {
|
||||
this._progressInterval = window.setInterval(
|
||||
() => this._updateProgressBar(),
|
||||
@@ -292,21 +301,27 @@ class BarMediaPlayer extends LitElement {
|
||||
);
|
||||
} else if (
|
||||
this._progressInterval &&
|
||||
(!this._showProgressBar || stateObj.state !== "playing")
|
||||
(!this._showProgressBar || stateObj?.state !== "playing")
|
||||
) {
|
||||
clearInterval(this._progressInterval);
|
||||
this._progressInterval = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
private get _stateObj(): MediaPlayerEntity {
|
||||
if (this._browserPlayer) {
|
||||
return this._browserPlayer.toStateObj();
|
||||
private get _stateObj(): MediaPlayerEntity | undefined {
|
||||
if (this.entityId === BROWSER_PLAYER) {
|
||||
return this._browserPlayer
|
||||
? this._browserPlayer.toStateObj()
|
||||
: BrowserMediaPlayer.idleStateObj();
|
||||
}
|
||||
return (
|
||||
(this.hass!.states[this.entityId] as MediaPlayerEntity | undefined) ||
|
||||
BrowserMediaPlayer.idleStateObj()
|
||||
);
|
||||
return this.hass!.states[this.entityId] as MediaPlayerEntity | undefined;
|
||||
}
|
||||
|
||||
private _openMoreInfo() {
|
||||
if (this._browserPlayer) {
|
||||
return;
|
||||
}
|
||||
fireEvent(this, "hass-more-info", { entityId: this.entityId });
|
||||
}
|
||||
|
||||
private get _showProgressBar() {
|
||||
@@ -317,6 +332,7 @@ class BarMediaPlayer extends LitElement {
|
||||
const stateObj = this._stateObj;
|
||||
|
||||
return (
|
||||
stateObj &&
|
||||
(stateObj.state === "playing" || stateObj.state === "paused") &&
|
||||
"media_duration" in stateObj.attributes &&
|
||||
"media_position" in stateObj.attributes
|
||||
@@ -332,19 +348,21 @@ class BarMediaPlayer extends LitElement {
|
||||
}
|
||||
|
||||
private _updateProgressBar(): void {
|
||||
if (!this._progressBar || !this._currentProgress) {
|
||||
const stateObj = this._stateObj;
|
||||
|
||||
if (!this._progressBar || !this._currentProgress || !stateObj) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this._stateObj.attributes.media_duration) {
|
||||
if (!stateObj.attributes.media_duration) {
|
||||
this._progressBar.progress = 0;
|
||||
this._currentProgress.innerHTML = "";
|
||||
return;
|
||||
}
|
||||
|
||||
const currentProgress = getCurrentProgress(this._stateObj);
|
||||
const currentProgress = getCurrentProgress(stateObj);
|
||||
this._progressBar.progress =
|
||||
currentProgress / this._stateObj.attributes.media_duration;
|
||||
currentProgress / stateObj.attributes.media_duration;
|
||||
|
||||
if (this._currentProgress) {
|
||||
this._currentProgress.innerHTML = formatMediaTime(currentProgress);
|
||||
@@ -418,6 +436,10 @@ class BarMediaPlayer extends LitElement {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.secondary,
|
||||
.progress {
|
||||
color: var(--secondary-text-color);
|
||||
@@ -433,6 +455,7 @@ class BarMediaPlayer extends LitElement {
|
||||
|
||||
.controls {
|
||||
height: 48px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.controls-progress {
|
||||
@@ -486,6 +509,7 @@ class BarMediaPlayer extends LitElement {
|
||||
|
||||
:host([narrow]) .controls {
|
||||
display: flex;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
:host([narrow]) .choose-player {
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import { mdiArrowLeft } from "@mdi/js";
|
||||
import "@polymer/app-layout/app-header/app-header";
|
||||
import "@polymer/app-layout/app-toolbar/app-toolbar";
|
||||
import {
|
||||
@@ -13,15 +14,21 @@ import { LocalStorage } from "../../common/decorators/local-storage";
|
||||
import { HASSDomEvent } from "../../common/dom/fire_event";
|
||||
import { navigate } from "../../common/navigate";
|
||||
import "../../components/ha-menu-button";
|
||||
import "../../components/ha-icon-button";
|
||||
import "../../components/media-player/ha-media-player-browse";
|
||||
import type { MediaPlayerItemId } from "../../components/media-player/ha-media-player-browse";
|
||||
import { BROWSER_PLAYER, MediaPickedEvent } from "../../data/media-player";
|
||||
import {
|
||||
BROWSER_PLAYER,
|
||||
MediaPickedEvent,
|
||||
MediaPlayerItem,
|
||||
} from "../../data/media-player";
|
||||
import { resolveMediaSource } from "../../data/media_source";
|
||||
import "../../layouts/ha-app-layout";
|
||||
import { haStyle } from "../../resources/styles";
|
||||
import type { HomeAssistant, Route } from "../../types";
|
||||
import "./ha-bar-media-player";
|
||||
import { showWebBrowserPlayMediaDialog } from "./show-media-player-dialog";
|
||||
import { showAlertDialog } from "../../dialogs/generic/show-dialog-box";
|
||||
|
||||
@customElement("ha-panel-media-browser")
|
||||
class PanelMediaBrowser extends LitElement {
|
||||
@@ -32,6 +39,8 @@ class PanelMediaBrowser extends LitElement {
|
||||
|
||||
@property() public route!: Route;
|
||||
|
||||
@property() _currentItem?: MediaPlayerItem;
|
||||
|
||||
private _navigateIds: MediaPlayerItemId[] = [
|
||||
{
|
||||
media_content_id: undefined,
|
||||
@@ -47,15 +56,26 @@ class PanelMediaBrowser extends LitElement {
|
||||
<ha-app-layout>
|
||||
<app-header fixed slot="header">
|
||||
<app-toolbar>
|
||||
<ha-menu-button
|
||||
.hass=${this.hass}
|
||||
.narrow=${this.narrow}
|
||||
></ha-menu-button>
|
||||
${this._navigateIds.length > 1
|
||||
? html`
|
||||
<ha-icon-button
|
||||
.path=${mdiArrowLeft}
|
||||
@click=${this._goBack}
|
||||
></ha-icon-button>
|
||||
`
|
||||
: html`
|
||||
<ha-menu-button
|
||||
.hass=${this.hass}
|
||||
.narrow=${this.narrow}
|
||||
></ha-menu-button>
|
||||
`}
|
||||
<div main-title class="heading">
|
||||
<div>
|
||||
${this.hass.localize(
|
||||
"ui.components.media-browser.media-player-browser"
|
||||
)}
|
||||
${!this._currentItem
|
||||
? this.hass.localize(
|
||||
"ui.components.media-browser.media-player-browser"
|
||||
)
|
||||
: this._currentItem.title}
|
||||
</div>
|
||||
</div>
|
||||
</app-toolbar>
|
||||
@@ -93,6 +113,23 @@ class PanelMediaBrowser extends LitElement {
|
||||
.split("/");
|
||||
|
||||
if (routePlayer !== this._entityId) {
|
||||
// Detect if picked player doesn't exist (anymore)
|
||||
// Can happen if URL bookmarked or stored in local storage
|
||||
if (
|
||||
routePlayer !== BROWSER_PLAYER &&
|
||||
this.hass.states[routePlayer] === undefined
|
||||
) {
|
||||
navigate(`/media-browser/${BROWSER_PLAYER}`, { replace: true });
|
||||
showAlertDialog(this, {
|
||||
text: this.hass.localize(
|
||||
"ui.panel.media-browser.error.player_not_exist",
|
||||
{
|
||||
name: routePlayer,
|
||||
}
|
||||
),
|
||||
});
|
||||
return;
|
||||
}
|
||||
this._entityId = routePlayer;
|
||||
}
|
||||
|
||||
@@ -110,13 +147,19 @@ class PanelMediaBrowser extends LitElement {
|
||||
};
|
||||
}),
|
||||
];
|
||||
this._currentItem = undefined;
|
||||
}
|
||||
|
||||
private _mediaBrowsed(ev) {
|
||||
if (ev.detail.back) {
|
||||
history.back();
|
||||
private _goBack() {
|
||||
history.back();
|
||||
}
|
||||
|
||||
private _mediaBrowsed(ev: { detail: HASSDomEvents["media-browsed"] }) {
|
||||
if (ev.detail.ids === this._navigateIds) {
|
||||
this._currentItem = ev.detail.current;
|
||||
return;
|
||||
}
|
||||
|
||||
let path = "";
|
||||
for (const item of ev.detail.ids.slice(1)) {
|
||||
path +=
|
||||
@@ -152,6 +195,7 @@ class PanelMediaBrowser extends LitElement {
|
||||
sourceUrl: resolvedUrl.url,
|
||||
sourceType: resolvedUrl.mime_type,
|
||||
title: item.title,
|
||||
can_play: item.can_play,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -4,6 +4,7 @@ export interface WebBrowserPlayMediaDialogParams {
|
||||
sourceUrl: string;
|
||||
sourceType: string;
|
||||
title?: string;
|
||||
can_play?: boolean;
|
||||
}
|
||||
|
||||
export const showWebBrowserPlayMediaDialog = (
|
||||
|
@@ -65,7 +65,7 @@ export class HaLongLivedAccessTokenDialog extends LitElement {
|
||||
|
||||
private async _generateQR() {
|
||||
const qrcode = await import("qrcode");
|
||||
const canvas = await qrcode.toCanvas(this._params?.token, {
|
||||
const canvas = await qrcode.toCanvas(this._params!.token, {
|
||||
width: 180,
|
||||
errorCorrectionLevel: "Q",
|
||||
});
|
||||
|
@@ -1,3 +1,4 @@
|
||||
// Caution before editing - For latest builds, this module is replaced with emptiness and thus not imported (see build-scripts/bundle.js)
|
||||
import "core-js";
|
||||
import "regenerator-runtime/runtime";
|
||||
import "lit/polyfill-support";
|
||||
|
@@ -184,6 +184,8 @@ export const haStyle = css`
|
||||
|
||||
app-toolbar {
|
||||
height: var(--header-height);
|
||||
border-bottom: var(--app-header-border-bottom);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
app-header div[sticky] {
|
||||
|
@@ -105,6 +105,9 @@
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
"backup": {
|
||||
"upload_backup": "Upload backup"
|
||||
},
|
||||
"card": {
|
||||
"alarm_control_panel": {
|
||||
"code": "Code",
|
||||
@@ -555,6 +558,10 @@
|
||||
"not_supported": "Your browser doesn't support QR scanning.",
|
||||
"manual_input": "You can scan the QR code with another QR scanner and paste the code in the input below",
|
||||
"enter_qr_code": "Enter QR code value"
|
||||
},
|
||||
"climate-control": {
|
||||
"temperature_up": "Increase temperature",
|
||||
"temperature_down": "Decrease temperature"
|
||||
}
|
||||
},
|
||||
"dialogs": {
|
||||
@@ -726,6 +733,7 @@
|
||||
"cover": {
|
||||
"door": "Door",
|
||||
"garage": "Garage door",
|
||||
"gate": "Gate",
|
||||
"window": "Window"
|
||||
}
|
||||
},
|
||||
@@ -1004,10 +1012,12 @@
|
||||
"description": "You need to run the Home Assistant operating system to be able to check and install updates from the Home Assistant user interface."
|
||||
},
|
||||
"check_updates": "Check for updates",
|
||||
"no_new_updates": "No new updates found",
|
||||
"updates_refreshed": "Updates refreshed",
|
||||
"title": "{count} {count, plural,\n one {update}\n other {updates}\n}",
|
||||
"unable_to_fetch": "Unable to load updates",
|
||||
"version_available": "Version {version_available} is available",
|
||||
"more_updates": "+ {count} Updates",
|
||||
"more_updates": "+{count} updates",
|
||||
"show": "show"
|
||||
},
|
||||
"areas": {
|
||||
@@ -2112,25 +2122,30 @@
|
||||
"sync_entities_error": "Failed to sync entities:",
|
||||
"state_reporting_error": "Unable to {enable_disable} report state.",
|
||||
"enable": "enable",
|
||||
"disable": "disable"
|
||||
"disable": "disable",
|
||||
"not_configured_title": "Alexa is not activated",
|
||||
"not_configured_text": "Before you can use Alexa, you need to activate the Home Assistant skill for Alexa in the Alexa app."
|
||||
},
|
||||
"google": {
|
||||
"title": "Google Assistant",
|
||||
"info": "With the Google Assistant integration for Home Assistant Cloud you'll be able to control all your Home Assistant devices via any Google Assistant-enabled device.",
|
||||
"http_use_ssl_warning_title": "Local communication unavailable",
|
||||
"http_use_ssl_warning_text": "Google devices will not be able to talk locally with Home Assistant because you have configured an SSL certificate for your HTTP integration.",
|
||||
"enable_ha_skill": "Activate the Home Assistant Cloud skill for Google Assistant",
|
||||
"config_documentation": "Configuration documentation",
|
||||
"enable_state_reporting": "Enable State Reporting",
|
||||
"info_state_reporting": "If you enable state reporting, Home Assistant will send all state changes of exposed entities to Google. This allows you to always see the latest states in the Google app.",
|
||||
"info_state_reporting": "If you enable state reporting, Home Assistant will send all state changes of exposed entities to Google. This speeds up voice commands and allows you to always see the latest states in the Google app.",
|
||||
"security_devices": "Security Devices",
|
||||
"enter_pin_info": "Please enter a PIN to interact with security devices. Security devices are doors, garage doors and locks. You will be asked to say/enter this PIN when interacting with such devices via Google Assistant.",
|
||||
"devices_pin": "Security Devices PIN",
|
||||
"enter_pin_hint": "Enter a PIN to use security devices",
|
||||
"sync_entities": "Sync Entities to Google",
|
||||
"sync_entities_404_message": "Failed to sync your entities to Google, ask Google 'Hey Google, sync my devices' to sync your entities.",
|
||||
"manage_entities": "Manage Entities",
|
||||
"enter_pin_error": "Unable to store PIN:",
|
||||
"not_configured_title": "Google Assistant is not activated",
|
||||
"not_configured_text": "Before you can use Google Assistant, you need to activate the Home Assistant Cloud skill for Google Assistant in the Google Home app."
|
||||
"not_configured_text": "Before you can use Google Assistant, you need to activate the Home Assistant Cloud skill for Google Assistant in the Google Home app.",
|
||||
"sync_failed_title": "Syncing failed",
|
||||
"sync_failed_text": "Syncing your entities failed, try again or check the logs."
|
||||
},
|
||||
"webhooks": {
|
||||
"title": "Webhooks",
|
||||
@@ -2193,18 +2208,18 @@
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "No {name} have been added using this device yet. You can add one by clicking the + button above.",
|
||||
"add_prompt": "No {name} have been added using this {type} yet. You can add one by clicking the + button above.",
|
||||
"caption": "Devices",
|
||||
"description": "Manage configured devices",
|
||||
"device_info": "Device info",
|
||||
"device_info": "{type} info",
|
||||
"edit_settings": "Edit settings",
|
||||
"unnamed_device": "Unnamed device",
|
||||
"unnamed_device": "Unnamed {type}",
|
||||
"unknown_error": "Unknown error",
|
||||
"name": "Name",
|
||||
"update": "Update",
|
||||
"no_devices": "No devices",
|
||||
"enabled_label": "Enable device",
|
||||
"enabled_cause": "The device is disabled by {cause}.",
|
||||
"enabled_label": "Enable {type}",
|
||||
"enabled_cause": "The {type} is disabled by {cause}.",
|
||||
"disabled_by": {
|
||||
"user": "User",
|
||||
"integration": "Integration",
|
||||
@@ -2214,12 +2229,19 @@
|
||||
"open_configuration_url_device": "Visit device",
|
||||
"open_configuration_url_service": "Visit service",
|
||||
"download_diagnostics": "Download diagnostics",
|
||||
"type": {
|
||||
"device_heading": "Device",
|
||||
"device": "device",
|
||||
"service_heading": "Service",
|
||||
"service": "service"
|
||||
},
|
||||
"automation": {
|
||||
"automations": "Automations",
|
||||
"automations_heading": "Automations",
|
||||
"automations": "automations",
|
||||
"no_automations": "No automations",
|
||||
"unknown_automation": "Unknown automation",
|
||||
"create": "Create automation with device",
|
||||
"create_disable": "Can't create automation with disabled device",
|
||||
"create": "Create automation with {type}",
|
||||
"create_disable": "Can't create automation with disabled {type}",
|
||||
"triggers": {
|
||||
"caption": "Do something when…",
|
||||
"no_triggers": "No triggers",
|
||||
@@ -2238,19 +2260,21 @@
|
||||
"no_device_automations": "There are no automations available for this device."
|
||||
},
|
||||
"script": {
|
||||
"scripts": "Scripts",
|
||||
"scripts_heading": "Scripts",
|
||||
"scripts": "scripts",
|
||||
"no_scripts": "No scripts",
|
||||
"create": "Create script with device",
|
||||
"create_disable": "Can't create script with disabled device"
|
||||
"create": "Create script with {type}",
|
||||
"create_disable": "Can't create script with disabled {type}"
|
||||
},
|
||||
"scene": {
|
||||
"scenes": "Scenes",
|
||||
"scenes_heading": "Scenes",
|
||||
"scenes": "scenes",
|
||||
"no_scenes": "No scenes",
|
||||
"create": "Create scene with device",
|
||||
"create_disable": "Can't create scene with disabled device"
|
||||
"create": "Create scene with {type}",
|
||||
"create_disable": "Can't create scene with disabled {type}"
|
||||
},
|
||||
"cant_edit": "You can only edit items that are created in the UI.",
|
||||
"device_not_found": "Device not found.",
|
||||
"device_not_found": "Device / service not found.",
|
||||
"entities": {
|
||||
"entities": "Entities",
|
||||
"control": "Controls",
|
||||
@@ -2262,8 +2286,6 @@
|
||||
"hide_disabled": "Hide disabled",
|
||||
"disabled_entities": "+{count} {count, plural,\n one {disabled entity}\n other {disabled entities}\n}"
|
||||
},
|
||||
"scripts": "Scripts",
|
||||
"scenes": "Scenes",
|
||||
"confirm_rename_entity_ids": "Do you also want to rename the entity IDs of your entities?",
|
||||
"confirm_rename_entity_ids_warning": "This will not change any configuration (like automations, scripts, scenes, dashboards) that is currently using these entities! You will have to update them yourself to use the new entity IDs!",
|
||||
"confirm_disable_config_entry": "There are no more devices for the config entry {entry_name}, do you want to instead disable the config entry?",
|
||||
@@ -2467,6 +2489,7 @@
|
||||
"via": "Connected via",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Hardware: {version}",
|
||||
"version": "Version: {version}",
|
||||
"unnamed_entry": "Unnamed entry",
|
||||
"unknown_via_device": "Unknown device",
|
||||
"area": "In {area}",
|
||||
@@ -3631,6 +3654,11 @@
|
||||
"delete_prompt": "Delete this message?",
|
||||
"delete_button": "Delete"
|
||||
},
|
||||
"media-browser": {
|
||||
"error": {
|
||||
"player_not_exist": "Media player {name} does not exist"
|
||||
}
|
||||
},
|
||||
"map": {
|
||||
"edit_zones": "Edit Zones"
|
||||
},
|
||||
@@ -4068,7 +4096,8 @@
|
||||
"addons": "[%key:supervisor::backup::addons%]",
|
||||
"password_protection": "[%key:supervisor::backup::password_protection%]",
|
||||
"password": "[%key:supervisor::backup::password%]",
|
||||
"confirm_password": "[%key:supervisor::backup::confirm_password%]"
|
||||
"confirm_password": "[%key:supervisor::backup::confirm_password%]",
|
||||
"upload_backup": "[%key:supervisor::backup::upload_backup%]"
|
||||
}
|
||||
},
|
||||
"custom": {
|
||||
@@ -4082,7 +4111,8 @@
|
||||
"setup": {
|
||||
"next": "Next",
|
||||
"back": "Back",
|
||||
"done": "Show me my energy dashboard!"
|
||||
"done": "Show me my energy dashboard!",
|
||||
"step": "Step {step} of {steps}"
|
||||
},
|
||||
"charts": {
|
||||
"stat_house_energy_meter": "Total energy consumption",
|
||||
@@ -4444,6 +4474,7 @@
|
||||
"failed_to_delete": "Failed to delete",
|
||||
"could_not_create": "Could not create backup",
|
||||
"upload_backup": "Upload backup",
|
||||
"download_backup": "Download backup",
|
||||
"create_backup": "Create backup",
|
||||
"create": "Create",
|
||||
"created": "Created",
|
||||
|
@@ -1,232 +0,0 @@
|
||||
import { html, TemplateResult } from "lit";
|
||||
import { until } from "lit/directives/until";
|
||||
import checkValidDate from "../common/datetime/check_valid_date";
|
||||
import { formatDate } from "../common/datetime/format_date";
|
||||
import { formatDateTimeWithSeconds } from "../common/datetime/format_date_time";
|
||||
import { formatNumber } from "../common/number/format_number";
|
||||
import { capitalizeFirstLetter } from "../common/string/capitalize-first-letter";
|
||||
import { isDate } from "../common/string/is_date";
|
||||
import { isTimestamp } from "../common/string/is_timestamp";
|
||||
import { HomeAssistant } from "../types";
|
||||
|
||||
let jsYamlPromise: Promise<typeof import("../resources/js-yaml-dump")>;
|
||||
|
||||
const hassAttributeUtil = {
|
||||
DOMAIN_DEVICE_CLASS: {
|
||||
binary_sensor: [
|
||||
"battery",
|
||||
"carbon_monoxide",
|
||||
"cold",
|
||||
"connectivity",
|
||||
"door",
|
||||
"garage_door",
|
||||
"gas",
|
||||
"heat",
|
||||
"light",
|
||||
"lock",
|
||||
"moisture",
|
||||
"motion",
|
||||
"moving",
|
||||
"occupancy",
|
||||
"opening",
|
||||
"plug",
|
||||
"power",
|
||||
"presence",
|
||||
"problem",
|
||||
"running",
|
||||
"safety",
|
||||
"smoke",
|
||||
"sound",
|
||||
"tamper",
|
||||
"vibration",
|
||||
"window",
|
||||
],
|
||||
button: ["restart", "update"],
|
||||
cover: [
|
||||
"awning",
|
||||
"blind",
|
||||
"curtain",
|
||||
"damper",
|
||||
"door",
|
||||
"garage",
|
||||
"gate",
|
||||
"shade",
|
||||
"shutter",
|
||||
"window",
|
||||
],
|
||||
humidifier: ["dehumidifier", "humidifier"],
|
||||
sensor: [
|
||||
"apparent_power",
|
||||
"aqi",
|
||||
"battery",
|
||||
"carbon_dioxide",
|
||||
"carbon_monoxide",
|
||||
"current",
|
||||
"date",
|
||||
"energy",
|
||||
"gas",
|
||||
"humidity",
|
||||
"illuminance",
|
||||
"monetary",
|
||||
"nitrogen_dioxide",
|
||||
"nitrogen_monoxide",
|
||||
"nitrous_oxide",
|
||||
"ozone",
|
||||
"pm1",
|
||||
"pm10",
|
||||
"pm25",
|
||||
"power",
|
||||
"power_factor",
|
||||
"pressure",
|
||||
"reactive_power",
|
||||
"signal_strength",
|
||||
"sulphur_dioxide",
|
||||
"temperature",
|
||||
"timestamp",
|
||||
"volatile_organic_compounds",
|
||||
"voltage",
|
||||
],
|
||||
switch: ["switch", "outlet"],
|
||||
},
|
||||
UNKNOWN_TYPE: "json",
|
||||
ADD_TYPE: "key-value",
|
||||
TYPE_TO_TAG: {
|
||||
string: "ha-customize-string",
|
||||
json: "ha-customize-string",
|
||||
icon: "ha-customize-icon",
|
||||
boolean: "ha-customize-boolean",
|
||||
array: "ha-customize-array",
|
||||
"key-value": "ha-customize-key-value",
|
||||
},
|
||||
LOGIC_STATE_ATTRIBUTES: {},
|
||||
};
|
||||
|
||||
// Attributes here serve dual purpose:
|
||||
// 1) Any key of this object won't be shown in more-info window.
|
||||
// 2) Any key which has value other than undefined will appear in customization
|
||||
// config according to its value.
|
||||
hassAttributeUtil.LOGIC_STATE_ATTRIBUTES = {
|
||||
entity_picture: undefined,
|
||||
friendly_name: { type: "string", description: "Name" },
|
||||
icon: { type: "icon" },
|
||||
emulated_hue: {
|
||||
type: "boolean",
|
||||
domains: ["emulated_hue"],
|
||||
},
|
||||
emulated_hue_name: {
|
||||
type: "string",
|
||||
domains: ["emulated_hue"],
|
||||
},
|
||||
haaska_hidden: undefined,
|
||||
haaska_name: undefined,
|
||||
supported_features: undefined,
|
||||
attribution: undefined,
|
||||
restored: undefined,
|
||||
editable: undefined,
|
||||
custom_ui_more_info: { type: "string" },
|
||||
custom_ui_state_card: { type: "string" },
|
||||
device_class: {
|
||||
type: "array",
|
||||
options: hassAttributeUtil.DOMAIN_DEVICE_CLASS,
|
||||
description: "Device class",
|
||||
domains: ["binary_sensor", "cover", "humidifier", "sensor", "switch"],
|
||||
},
|
||||
state_class: {
|
||||
type: "array",
|
||||
options: { sensor: ["measurement", "total", "total_increasing"] },
|
||||
description: "State class",
|
||||
domains: ["sensor"],
|
||||
},
|
||||
last_reset: undefined,
|
||||
assumed_state: {
|
||||
type: "boolean",
|
||||
domains: [
|
||||
"switch",
|
||||
"light",
|
||||
"cover",
|
||||
"climate",
|
||||
"fan",
|
||||
"humidifier",
|
||||
"group",
|
||||
"water_heater",
|
||||
],
|
||||
},
|
||||
initial_state: {
|
||||
type: "string",
|
||||
domains: ["automation"],
|
||||
},
|
||||
unit_of_measurement: { type: "string" },
|
||||
};
|
||||
|
||||
export default hassAttributeUtil;
|
||||
|
||||
// Convert from internal snake_case format to user-friendly format
|
||||
export function formatAttributeName(value: string): string {
|
||||
value = value
|
||||
.replace(/_/g, " ")
|
||||
.replace(/\bid\b/g, "ID")
|
||||
.replace(/\bip\b/g, "IP")
|
||||
.replace(/\bmac\b/g, "MAC")
|
||||
.replace(/\bgps\b/g, "GPS");
|
||||
return capitalizeFirstLetter(value);
|
||||
}
|
||||
|
||||
export function formatAttributeValue(
|
||||
hass: HomeAssistant,
|
||||
value: any
|
||||
): string | TemplateResult {
|
||||
if (value === null) {
|
||||
return "—";
|
||||
}
|
||||
|
||||
// YAML handling
|
||||
if (
|
||||
(Array.isArray(value) && value.some((val) => val instanceof Object)) ||
|
||||
(!Array.isArray(value) && value instanceof Object)
|
||||
) {
|
||||
if (!jsYamlPromise) {
|
||||
jsYamlPromise = import("../resources/js-yaml-dump");
|
||||
}
|
||||
const yaml = jsYamlPromise.then((jsYaml) => jsYaml.dump(value));
|
||||
return html`<pre>${until(yaml, "")}</pre>`;
|
||||
}
|
||||
|
||||
if (typeof value === "number") {
|
||||
return formatNumber(value, hass.locale);
|
||||
}
|
||||
|
||||
if (typeof value === "string") {
|
||||
// URL handling
|
||||
if (value.startsWith("http")) {
|
||||
try {
|
||||
// If invalid URL, exception will be raised
|
||||
const url = new URL(value);
|
||||
if (url.protocol === "http:" || url.protocol === "https:")
|
||||
return html`<a target="_blank" rel="noreferrer" href=${value}
|
||||
>${value}</a
|
||||
>`;
|
||||
} catch (_) {
|
||||
// Nothing to do here
|
||||
}
|
||||
}
|
||||
|
||||
// Date handling
|
||||
if (isDate(value, true)) {
|
||||
// Timestamp handling
|
||||
if (isTimestamp(value)) {
|
||||
const date = new Date(value);
|
||||
if (checkValidDate(date)) {
|
||||
return formatDateTimeWithSeconds(date, hass.locale);
|
||||
}
|
||||
}
|
||||
|
||||
// Value was not a timestamp, so only do date formatting
|
||||
const date = new Date(value);
|
||||
if (checkValidDate(date)) {
|
||||
return formatDate(date, hass.locale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Array.isArray(value) ? value.join(", ") : value;
|
||||
}
|
@@ -245,7 +245,7 @@
|
||||
"confirm_password": "Потвърдете паролата за резервното копие",
|
||||
"could_not_create": "Не може да се създаде резервно копие",
|
||||
"create": "Създаване",
|
||||
"create_backup": "Създайте резервно копие",
|
||||
"create_backup": "Създаване на резервно копие",
|
||||
"create_blocked_not_running": "Създаването на резервно копие в момента не е възможно, тъй като системата е в състояние {state}.",
|
||||
"created": "Създаден",
|
||||
"delete_backup_confirm": "Изтрий",
|
||||
@@ -264,6 +264,7 @@
|
||||
"passwords_not_matching": "Паролите не съвпадат",
|
||||
"select_type": "Изберете какво да възстановите",
|
||||
"selected": "{number} избрани",
|
||||
"size": "Размер",
|
||||
"type": "Тип",
|
||||
"upload_backup": "Качете резервно копие"
|
||||
},
|
||||
@@ -289,8 +290,10 @@
|
||||
"reset_options": "Нулиране на опциите",
|
||||
"restart": "Рестартиране",
|
||||
"restart_name": "Рестартиране на {name}",
|
||||
"review": "преглед",
|
||||
"running_version": "В момента използвате версия {version}",
|
||||
"save": "Запис",
|
||||
"show": "показване",
|
||||
"show_more": "Показване на повече информация за това",
|
||||
"update": "Актуализиране",
|
||||
"update_available": "{count}{count, plural,\n one {обновление изчаква}\n other {{count} обновления изчакват}\n}",
|
||||
@@ -323,6 +326,7 @@
|
||||
"cancel": "Отказ",
|
||||
"description": "В момента използвате ''{current_path}'' като диск за данни. Преместването на дискове с данни ще рестартира устройството ви и се очаква да отнеме {time} минути. Инсталацията на вашия Home Assistant няма да бъде достъпна през този период. Не изключвайте захранването по време на преместване!",
|
||||
"loading_devices": "Зареждане на устройства",
|
||||
"move": "Преместване",
|
||||
"moving": "Преместване на диск с данни",
|
||||
"moving_desc": "Рестартиране и преместване на диск с данни. Моля, имайте търпение",
|
||||
"no_devices": "Не са намерени подходящи свързани устройства",
|
||||
@@ -370,7 +374,8 @@
|
||||
"repositories": {
|
||||
"add": "Добавяне",
|
||||
"remove": "Премахване",
|
||||
"title": "Управление на хранилищата на добавки"
|
||||
"title": "Управление на хранилищата на добавки",
|
||||
"used": "Хранилището се използва за инсталирани добавки и не може да бъде премахнато."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Рестартиране на добавката",
|
||||
@@ -392,12 +397,14 @@
|
||||
"not_supported": "Тази препратка не се поддържа от вашата Home Assistant инсталация. Последвайте {link} за поддържани препратки както и версиите при тяхното пускане."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Добавки",
|
||||
"backups": "Резервни копия",
|
||||
"dashboard": "Табло",
|
||||
"store": "Хранилище за добавки",
|
||||
"system": "Система"
|
||||
},
|
||||
"store": {
|
||||
"check_updates": "Проверка за актуализации",
|
||||
"missing_addons": "Липсват добавки? Активирайте разширения режим в страницата на потребителския си профил",
|
||||
"no_results_found": "Няма намерени резултати в {repository}.",
|
||||
"registries": "Регистри",
|
||||
@@ -487,6 +494,15 @@
|
||||
"update_supervisor": "Актуализиране на Supervisor",
|
||||
"warning": "ВНИМАНИЕ"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"create_backup": "Създаване на резервно копие преди актуализиране",
|
||||
"creating_backup": "Създаване на резервно копие на {name}",
|
||||
"description": "Имате инсталирана версия {version}. Кликнете върху актуализиране, за да актуализирате до версия {newest_version}",
|
||||
"no_update": "Няма налична актуализация за {name}",
|
||||
"open_release_notes": "Отваряне на бележките за версията",
|
||||
"update_name": "Актуализиране на {name}",
|
||||
"updating": "Актуализиране на {name} до версия {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -506,6 +522,9 @@
|
||||
"code": "Код",
|
||||
"disarm": "Деактивирaне"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "Областта не е намерена."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Последно задействане",
|
||||
"trigger": "Изпълни"
|
||||
@@ -574,9 +593,15 @@
|
||||
"media_player": {
|
||||
"browse_media": "Преглед на мултимедия",
|
||||
"media_next_track": "Следващ",
|
||||
"media_pause": "Пауза",
|
||||
"media_play": "Възпроизвеждане",
|
||||
"media_play_pause": "Възпроизвеждане/пауза",
|
||||
"media_previous_track": "Предишен",
|
||||
"media_stop": "Стоп",
|
||||
"media_volume_down": "Намаляване на звука",
|
||||
"media_volume_mute": "Изключване на звука",
|
||||
"media_volume_unmute": "Включване на звука",
|
||||
"media_volume_up": "Увеличаване на звука",
|
||||
"sound_mode": "Режим на звука",
|
||||
"source": "Източник",
|
||||
"text_to_speak": "Текст за произнасяне",
|
||||
@@ -671,6 +696,7 @@
|
||||
"leave": "Излизане",
|
||||
"loading": "Зареждане",
|
||||
"menu": "Меню",
|
||||
"move": "Преместване",
|
||||
"next": "Следващ",
|
||||
"no": "Не",
|
||||
"not_now": "Не сега",
|
||||
@@ -682,6 +708,7 @@
|
||||
"save": "Запазване",
|
||||
"skip": "Пропускане",
|
||||
"stay": "Оставане",
|
||||
"submit": "Изпращане",
|
||||
"successfully_deleted": "Успешно изтриване",
|
||||
"successfully_saved": "Успешно запазено",
|
||||
"undo": "Отмяна",
|
||||
@@ -844,7 +871,12 @@
|
||||
"label": "Снимка",
|
||||
"unsupported_format": "Неподдържан формат, моля, изберете JPEG, PNG или GIF изображение."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"not_supported": "Вашият браузър не поддържа QR сканиране.",
|
||||
"select_camera": "Изберете камера"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Филтър",
|
||||
"filter_by_area": "Филтриране по област",
|
||||
"filter_by_device": "Филтриране по устройство",
|
||||
"filter_by_entity": "Филтриране по обект",
|
||||
@@ -946,6 +978,20 @@
|
||||
"change_device_area": "Промяна областта на устройството",
|
||||
"confirm_delete": "Наистина ли искате да изтриете този запис?",
|
||||
"delete": "Изтриване",
|
||||
"device_class": "Показване като",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Врата",
|
||||
"garage_door": "Гаражна врата",
|
||||
"opening": "Друго",
|
||||
"window": "Прозорец"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Врата",
|
||||
"garage": "Гаражна врата",
|
||||
"window": "Прозорец"
|
||||
}
|
||||
},
|
||||
"device_disabled": "Устройството на този обект е деактивирано.",
|
||||
"enabled_cause": "Деактивирано от {cause}.",
|
||||
"enabled_delay_confirm": "Активираните обекти ще бъдат добавени към Home Assistant след {delay} секунди",
|
||||
@@ -1127,6 +1173,7 @@
|
||||
"script": "Презареждане на скриптовете",
|
||||
"smtp": "SMTP услуги за уведомяване",
|
||||
"telegram": "Презареждане на Telegram услугите за нотификация",
|
||||
"themes": "Теми",
|
||||
"zone": "Презареждане на зоните"
|
||||
},
|
||||
"server_control": {
|
||||
@@ -1140,7 +1187,9 @@
|
||||
"server_control": "Сървър"
|
||||
}
|
||||
},
|
||||
"filter_placeholder": "Филтър на обектите"
|
||||
"filter_placeholder": "Филтър на обектите",
|
||||
"key_c_hint": "Натиснете 'c' на която и да е страница, за да отворите тази лента за търсене",
|
||||
"title": "Бързо търсене"
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant не чу нищо",
|
||||
@@ -1248,6 +1297,7 @@
|
||||
"panel": {
|
||||
"config": {
|
||||
"areas": {
|
||||
"add_picture": "Добавете изображение",
|
||||
"caption": "Области",
|
||||
"data_table": {
|
||||
"area": "Област",
|
||||
@@ -1259,6 +1309,7 @@
|
||||
"confirmation_title": "Сигурни ли сте, че искате да изтриете тази област?"
|
||||
},
|
||||
"description": "Групирайте устройствата и обектите в области",
|
||||
"edit_settings": "Настройки на областта",
|
||||
"editor": {
|
||||
"area_id": "ID на област",
|
||||
"create": "Създаване",
|
||||
@@ -1267,6 +1318,7 @@
|
||||
"linked_entities_caption": "Обекти",
|
||||
"name": "Име",
|
||||
"name_required": "Името е задължително",
|
||||
"no_linked_entities": "Няма обекти, свързани с тази област.",
|
||||
"unknown_error": "Неизвестна грешка",
|
||||
"update": "Актуализация"
|
||||
},
|
||||
@@ -1289,6 +1341,7 @@
|
||||
"header": "Създаване на нова автоматизация",
|
||||
"how": "Как искате да създадете новата си автоматизация?",
|
||||
"start_empty": "Започнете с празна автоматизация",
|
||||
"start_empty_description": "Създаване на нова автоматизация от нулата",
|
||||
"thingtalk": {
|
||||
"create": "Създаване",
|
||||
"header": "Опишете автоматизацията, която искате да създадете",
|
||||
@@ -1899,6 +1952,47 @@
|
||||
"include_link": "включва customize.yaml"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Управление на автоматизации, сцени, скриптове и помощници",
|
||||
"title": "Автоматизации и сцени"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Управление на планове",
|
||||
"title": "Планове"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Местоположение и известия"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Създаване на персонализирани набори от карти за управление на дома ви",
|
||||
"title": "Табла"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Интеграции, устройства, обекти и области",
|
||||
"title": "Устройства и услуги"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Наблюдавайте производството и потреблението на енергия",
|
||||
"title": "Енергия"
|
||||
},
|
||||
"people": {
|
||||
"description": "Управление на хората и зоните, които Home Assistant следи",
|
||||
"title": "Хора и зони"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Основни настройки, сървърни контроли, журнали и информация",
|
||||
"title": "Настройки"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Създаване на резервни копия, проверка на дневниците или рестартиране на системата",
|
||||
"title": "Добавки, резервни копия и Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Задействане на автоматизации при сканиране на NFC маркер, QR код и др.",
|
||||
"title": "Маркери"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "Все още не са добавени {name} с това устройство. Можете да добавите, като кликнете върху бутона + по-горе.",
|
||||
"automation": {
|
||||
@@ -2141,6 +2235,7 @@
|
||||
"types": {
|
||||
"counter": "Брояч",
|
||||
"input_boolean": "Превключване",
|
||||
"input_button": "Бутон",
|
||||
"input_datetime": "Дата и/или време",
|
||||
"input_text": "Текст",
|
||||
"timer": "Таймер"
|
||||
@@ -2198,7 +2293,9 @@
|
||||
"entities": "{count} {count, plural,\n one {обект}\n other {обекта}\n}",
|
||||
"entity_unavailable": "Обектът е недостъпен",
|
||||
"firmware": "Фърмуер: {version}",
|
||||
"hardware": "Хардуер: {version}",
|
||||
"hub": "Свързан чрез",
|
||||
"known_issues": "Известни проблеми",
|
||||
"manuf": "от {manufacturer}",
|
||||
"no_area": "Без област",
|
||||
"not_loaded": "Не е заредено, проверете {logs_link}",
|
||||
@@ -2215,7 +2312,9 @@
|
||||
"not_loaded": "Не е зареден"
|
||||
},
|
||||
"system_options": "Системни настройки",
|
||||
"unnamed_entry": "Запис без име"
|
||||
"unknown_via_device": "Неразпознато устройство",
|
||||
"unnamed_entry": "Запис без име",
|
||||
"via": "Свързанo чрез"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Прекъснат",
|
||||
@@ -2454,6 +2553,7 @@
|
||||
"device_tracker_picked": "Устройство за проследяване",
|
||||
"link_presence_detection_integrations": "Интеграции за откриване на присъствие",
|
||||
"linked_user": "Свързан потребител",
|
||||
"local_only": "Може да се влиза само от локалната мрежа",
|
||||
"name": "Име",
|
||||
"name_error_msg": "Името е задължително",
|
||||
"new_person": "Нов човек",
|
||||
@@ -2469,6 +2569,7 @@
|
||||
"activated": "Активирана сцена {name} .",
|
||||
"caption": "Сцени",
|
||||
"editor": {
|
||||
"area": "Област",
|
||||
"default_name": "Нова сцена",
|
||||
"devices": {
|
||||
"add": "Добавяне на устройство",
|
||||
@@ -2574,6 +2675,8 @@
|
||||
"script": "Презареждане на скриптовете",
|
||||
"smtp": "Презарежанде на smtp услугите за уведомяване",
|
||||
"telegram": "Презареждане на telegram услугите за уведомяване",
|
||||
"themes": "Теми",
|
||||
"timer": "Таймери",
|
||||
"zone": "Презаредете зони"
|
||||
},
|
||||
"server_management": {
|
||||
@@ -2611,7 +2714,7 @@
|
||||
"tag_id": "ID на маркера",
|
||||
"tag_id_placeholder": "Автоматично генериране, когато остане празно",
|
||||
"update": "Актуализиране",
|
||||
"usage": "Маркерът може да задейства автоматизация при сканиране, можете да използвате NFC маркери, QR кодове или всякакъв друг маркер. Използвайте нашия {companion_link}, за да запишете този маркер в програмируем NFC маркер или да създадете QR код по-долу."
|
||||
"usage": "Маркерът може да задейства автоматизация при сканиране. Можете да използвате NFC маркери, QR кодове или всякакъв друг маркер. Използвайте нашия {companion_link}, за да запишете този маркер в програмируем NFC маркер или да създадете QR код по-долу."
|
||||
},
|
||||
"edit": "Редактиране",
|
||||
"headers": {
|
||||
@@ -2623,10 +2726,20 @@
|
||||
"no_tags": "Няма маркери",
|
||||
"write": "Запис"
|
||||
},
|
||||
"updates": {
|
||||
"more_updates": "+ {count} актуализации",
|
||||
"review": "преглед",
|
||||
"show": "показване",
|
||||
"show_all_updates": "Показване на всички актуализации",
|
||||
"title": "{count} {count, plural,\n one {актуализация}\n other {актуализации}\n}",
|
||||
"unable_to_fetch": "Наличните актуализации не могат да бъдат извлечени",
|
||||
"version_available": "Налична е версия {version_available}"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Добавяне на потребител",
|
||||
"create": "Създаване",
|
||||
"local_only": "Само локално",
|
||||
"password": "Парола",
|
||||
"password_confirm": "Потвърди парола",
|
||||
"password_not_match": "Паролите не съвпадат"
|
||||
@@ -2645,6 +2758,7 @@
|
||||
"delete_user": "Изтриване на потребителя",
|
||||
"group": "Група",
|
||||
"id": "ID",
|
||||
"local_only": "Може да се влиза само от локалната мрежа",
|
||||
"name": "Показвано име",
|
||||
"new_password": "Нова парола",
|
||||
"owner": "Собственик",
|
||||
@@ -2656,12 +2770,16 @@
|
||||
"update_user": "Актуализиране",
|
||||
"username": "Потребителско име"
|
||||
},
|
||||
"is_local": "Локален потребител",
|
||||
"is_owner": "Собственик",
|
||||
"is_system": "Потребител на системата",
|
||||
"picker": {
|
||||
"add_user": "Добавяне на потребител",
|
||||
"headers": {
|
||||
"group": "Група",
|
||||
"is_active": "Активен",
|
||||
"is_owner": "Собственик",
|
||||
"local": "Само локално",
|
||||
"name": "Показвано име",
|
||||
"system": "Генерирано от системата",
|
||||
"username": "Потребителско име"
|
||||
@@ -2832,6 +2950,7 @@
|
||||
"inclusion_finished": "Възелът е добавен.",
|
||||
"interview_failed": "Разпита на устройството не бе успешен. Допълнителна информация може да е налична в логовете.",
|
||||
"interview_started": "Устройството се разпитва. Това може да отнеме известно време.",
|
||||
"qr_code": "QR код",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
"description": "Пример: Стари брави на врати без поддръжка на S2",
|
||||
@@ -2853,6 +2972,7 @@
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Добавяне на възел",
|
||||
"back": "Назад",
|
||||
"close": "Затвори",
|
||||
"heal_network": "Заздравяване на мрежата",
|
||||
"network": "Мрежа",
|
||||
@@ -2862,11 +2982,13 @@
|
||||
"source": "Източник"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {устройство}\n other {устройства}\n}",
|
||||
"driver_version": "Версия на драйвера",
|
||||
"dump_dead_nodes_title": "Някои от вашите възли са мъртви",
|
||||
"dump_not_ready_confirm": "Изтегляне",
|
||||
"dump_not_ready_title": "Не всички възли все още са готови",
|
||||
"introduction": "Управлявайте вашата Z-Wave мрежа и Z-Wave възли",
|
||||
"server_url": "URL адрес на сървъра",
|
||||
"server_version": "Версия на сървъра"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -2914,6 +3036,9 @@
|
||||
"node_status": {
|
||||
"unknown": "Неизвестен"
|
||||
},
|
||||
"provisioned": {
|
||||
"dsk": "DSK"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "Ще трябва да събудите устройствата, захранвани с батерии, преди да започнете повторното интервю. Вижте ръководството на вашето устройство за инструкции как да го събудите.",
|
||||
"in_progress": "Устройството се разпитва. Това може да отнеме известно време.",
|
||||
@@ -2933,10 +3058,19 @@
|
||||
"title": "Премахване на Z-Wave възел"
|
||||
},
|
||||
"security_classes": {
|
||||
"None": {
|
||||
"title": "Без"
|
||||
},
|
||||
"S0_Legacy": {
|
||||
"description": "Пример: Стари брави за врати без поддръжка на S2",
|
||||
"title": "S0 наследено"
|
||||
},
|
||||
"S2_AccessControl": {
|
||||
"description": "Пример: Брави на врати и гаражни врати",
|
||||
"title": "S2 контрол на достъпа"
|
||||
},
|
||||
"S2_Authenticated": {
|
||||
"description": "Пример: Осветление, сензори и системи за сигурност",
|
||||
"title": "S2 удостоверено"
|
||||
}
|
||||
}
|
||||
@@ -3145,6 +3279,9 @@
|
||||
"description": "Картата \"Алармен панел\" ви позволява да активирате и дезактивирате интеграциите на контролния панел на алармата.",
|
||||
"name": "Алармен панел"
|
||||
},
|
||||
"area": {
|
||||
"name": "Област"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "Действието по подразбиране зависи от възможностите на обекта, то ще бъде или превключване, или показване на повече информация.",
|
||||
"description": "Картата \"Бутон\" ви позволява да добавяте бутони ,които да изпълненяват задачи.",
|
||||
@@ -3308,7 +3445,14 @@
|
||||
},
|
||||
"statistics-graph": {
|
||||
"description": "Картата Графика на статистиката Ви позволява да показвате графика на статистиката за всеки от изброените обекти.",
|
||||
"name": "Графика на статистиката"
|
||||
"name": "Графика на статистиката",
|
||||
"period": "Период",
|
||||
"periods": {
|
||||
"5minute": "5 минути",
|
||||
"day": "Ден",
|
||||
"hour": "Час",
|
||||
"month": "Месец"
|
||||
}
|
||||
},
|
||||
"thermostat": {
|
||||
"description": "Картата \"Термостат\" дава контрол върху вашия климатичен обект. Позволява ви да промените температурата и режима на обекта.",
|
||||
|
@@ -22,15 +22,15 @@
|
||||
"logbook": "Diari de registre",
|
||||
"mailbox": "Bústia",
|
||||
"map": "Mapa",
|
||||
"media_browser": "Navegador multimèdia",
|
||||
"media_browser": "Multimèdia",
|
||||
"profile": "Perfil",
|
||||
"shopping_list": "Llista de la compra",
|
||||
"states": "Visualització principal"
|
||||
},
|
||||
"state": {
|
||||
"default": {
|
||||
"off": "Off",
|
||||
"on": "On",
|
||||
"off": "OFF",
|
||||
"on": "ON",
|
||||
"unavailable": "No disponible",
|
||||
"unknown": "Desconegut"
|
||||
}
|
||||
@@ -131,7 +131,7 @@
|
||||
"dashboard": {
|
||||
"action_error": {
|
||||
"get_changelog": "No s'ha pogut obtenir el registre de canvis del complement",
|
||||
"go_to_config": "No s'ha pogut iniciar el complement, ha fallat la validació de la configuració!",
|
||||
"go_to_config": "Edita la configuració",
|
||||
"install": "No s'ha pogut instal·lar el complement",
|
||||
"restart": "No s'ha pogut reiniciar el complement",
|
||||
"start": "No s'ha pogut iniciar el complement",
|
||||
@@ -286,6 +286,7 @@
|
||||
"delete_backup_text": "Vols suprimir {number} {number, plural,\n one {còpia de seguretat}\n other {còpies de seguretat}\n}?",
|
||||
"delete_backup_title": "Suprimeix còpia de seguretat",
|
||||
"delete_selected": "Suprimeix les còpies de seguretat seleccionades",
|
||||
"download_backup": "Baixa còpia de seguretat",
|
||||
"enter_password": "Introdueix una contrasenya.",
|
||||
"failed_to_delete": "No s'ha pogut suprimir",
|
||||
"folders": "Carpetes",
|
||||
@@ -298,6 +299,7 @@
|
||||
"passwords_not_matching": "Les contrasenyes no coincideixen",
|
||||
"select_type": "Selecciona què vols restaurar",
|
||||
"selected": "{number} seleccionada/es",
|
||||
"size": "Mida",
|
||||
"type": "Tipus de còpia de seguretat",
|
||||
"upload_backup": "Puja còpia de seguretat"
|
||||
},
|
||||
@@ -323,8 +325,10 @@
|
||||
"reset_options": "Opcions de reinici",
|
||||
"restart": "Reinicia",
|
||||
"restart_name": "Reinicia {name}",
|
||||
"review": "revisa",
|
||||
"running_version": "Estàs utilitzant la versió {version}",
|
||||
"save": "Desa",
|
||||
"show": "mostra",
|
||||
"show_more": "Mostra més informació al respecte",
|
||||
"update": "Actualitza",
|
||||
"update_available": "{count, plural,\n one {Actualització pendent}\n other {{count} actualitzacions pendents}\n}",
|
||||
@@ -405,7 +409,8 @@
|
||||
"repositories": {
|
||||
"add": "Afegeix",
|
||||
"remove": "Elimina",
|
||||
"title": "Gestiona els repositoris de complements"
|
||||
"title": "Gestiona els repositoris de complements",
|
||||
"used": "El repositori s'utilitza per a complements ja instal·lats i no es pot eliminar."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Reinicia el complement",
|
||||
@@ -428,12 +433,14 @@
|
||||
"not_supported": "La instància de Home Assistant no admet aquesta redirecció. Consulta {link} per veure les redireccions compatibles i en quina versió es van introduir."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Complements",
|
||||
"backups": "Còpies de seguretat",
|
||||
"dashboard": "Panell",
|
||||
"store": "Directori de complements",
|
||||
"system": "Sistema"
|
||||
},
|
||||
"store": {
|
||||
"check_updates": "Comprova si hi ha actualitzacions",
|
||||
"missing_addons": "Falten complements? Activa el mode avançat a la pàgina de perfil d'usuari",
|
||||
"no_results_found": "No s'han trobat resultats a {repository}.",
|
||||
"registries": "Registres",
|
||||
@@ -526,6 +533,16 @@
|
||||
"update_supervisor": "Actualitza el Supervisor",
|
||||
"warning": "ATENCIÓ"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"core_note": "El supervisor tornarà a la versió {version} després de l'actualització si la teva instància no s'inicia correctament.",
|
||||
"create_backup": "Crea una còpia de seguretat abans d'actualitzar",
|
||||
"creating_backup": "Creant còpia de seguretat de {name}",
|
||||
"description": "Tens instal·lada la versió {version}. Fes clic a Actualitza per instal·lar la versió {newest_version}",
|
||||
"no_update": "No hi ha cap actualització de {name} disponible",
|
||||
"open_release_notes": "Obre les notes de versió",
|
||||
"update_name": "Actualització {name}",
|
||||
"updating": "S'està actualitzant {name} a la versió {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -534,6 +551,9 @@
|
||||
"confirm": "Si",
|
||||
"decline": "No"
|
||||
},
|
||||
"backup": {
|
||||
"upload_backup": "Puja còpia de seguretat"
|
||||
},
|
||||
"card": {
|
||||
"alarm_control_panel": {
|
||||
"arm_away": "Activar, fora",
|
||||
@@ -545,6 +565,9 @@
|
||||
"code": "Codi",
|
||||
"disarm": "Desactivar"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "No s'ha trobat l'àrea."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Última execució",
|
||||
"trigger": "Executa accions"
|
||||
@@ -565,7 +588,7 @@
|
||||
"heating": "{name} escalfant",
|
||||
"high": "alt",
|
||||
"low": "baix",
|
||||
"on_off": "On / Off",
|
||||
"on_off": "ON / OFF",
|
||||
"operation": "Funcionament",
|
||||
"preset_mode": "Programat",
|
||||
"swing_mode": "Mode oscil·lació",
|
||||
@@ -596,7 +619,7 @@
|
||||
"humidifier": {
|
||||
"humidity": "Humitat desitjada",
|
||||
"mode": "Mode",
|
||||
"on_entity": "{name} on",
|
||||
"on_entity": "{name} ON",
|
||||
"target_humidity_entity": "Temperatura desitjada de {name}"
|
||||
},
|
||||
"light": {
|
||||
@@ -615,10 +638,17 @@
|
||||
},
|
||||
"media_player": {
|
||||
"browse_media": "Navega pels mitjans",
|
||||
"media_next_track": "Següent",
|
||||
"media_next_track": "Següent cançó",
|
||||
"media_pause": "Pausa",
|
||||
"media_play": "Reprodueix",
|
||||
"media_play_pause": "Reprodueix/pausa",
|
||||
"media_previous_track": "Anterior",
|
||||
"media_previous_track": "Cançó anterior",
|
||||
"media_stop": "Atura",
|
||||
"media_volume_down": "Abaixa el volum",
|
||||
"media_volume_mute": "Desactiva el volum",
|
||||
"media_volume_unmute": "Activa el volum",
|
||||
"media_volume_up": "Apuja el volum",
|
||||
"nothing_playing": "Res reproduint-se",
|
||||
"sound_mode": "Mode de so",
|
||||
"source": "Entrada",
|
||||
"text_to_speak": "Text a veu",
|
||||
@@ -659,7 +689,7 @@
|
||||
"water_heater": {
|
||||
"away_mode": "Mode fora",
|
||||
"currently": "Actual",
|
||||
"on_off": "On / Off",
|
||||
"on_off": "ON / OFF",
|
||||
"operation": "Funcionament",
|
||||
"target_temperature": "Temperatura desitjada"
|
||||
},
|
||||
@@ -726,6 +756,7 @@
|
||||
"save": "Desa",
|
||||
"skip": "Omet",
|
||||
"stay": "Queda't",
|
||||
"submit": "Envia",
|
||||
"successfully_deleted": "S'ha eliminat correctament",
|
||||
"successfully_saved": "S'ha desat correctament",
|
||||
"undo": "Desfés",
|
||||
@@ -736,11 +767,11 @@
|
||||
"addon": "Complement",
|
||||
"error": {
|
||||
"fetch_addons": {
|
||||
"description": "L'obtenció dels complements ha retornat un error.",
|
||||
"title": "S'ha produït un error en l'obtenció dels complements"
|
||||
"description": "S'ha produït un error durant la càrrega dels complements.",
|
||||
"title": "Error durant la càrrega dels complements"
|
||||
},
|
||||
"no_supervisor": {
|
||||
"description": "No s'ha trobat cap Supervisor, per tant, no es poden carregar complements.",
|
||||
"description": "Complements no compatibles.",
|
||||
"title": "Sense Supervisor"
|
||||
}
|
||||
}
|
||||
@@ -820,7 +851,7 @@
|
||||
"logbook": {
|
||||
"by": "per",
|
||||
"by_service": "pel servei",
|
||||
"entries_not_found": "No s'han trobat entrades al registre.",
|
||||
"entries_not_found": "No s'han trobat esdeveniments registrats.",
|
||||
"messages": {
|
||||
"became_unavailable": "no està disponible",
|
||||
"changed_to_state": "ha canviat a {state}",
|
||||
@@ -850,7 +881,7 @@
|
||||
"was_unplugged": "s'ha desendollat",
|
||||
"was_unsafe": "és insegur"
|
||||
},
|
||||
"retrieval_error": "Error durant l'obtenció de l'entrada del diari de registre",
|
||||
"retrieval_error": "No s'ha pogut carregar el registre",
|
||||
"show_trace": "Mostra la traça"
|
||||
},
|
||||
"media-browser": {
|
||||
@@ -881,7 +912,7 @@
|
||||
"documentation": "documentació",
|
||||
"learn_adding_local_media": "Més informació sobre com afegir contingut multimèdia a la {documentation}.",
|
||||
"local_media_files": "Col·loca els fitxers de vídeo, àudio i imatge al directori multimèdia i podràs navegar-hi i reproduir-los des del navegador o els reproductors multimèdia compatibles.",
|
||||
"media-player-browser": "Navegador multimèdia",
|
||||
"media-player-browser": "Multimèdia",
|
||||
"media_browsing_error": "Error de navegació multimèdia",
|
||||
"media_not_supported": "El reproductor multimèdia de navegador no és compatible amb aquest tipus de mitjà",
|
||||
"media_player": "Reproductor multimèdia",
|
||||
@@ -900,7 +931,15 @@
|
||||
"label": "Imatge",
|
||||
"unsupported_format": "Format no compatible, tria una imatge JPEG, PNG o GIF."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"enter_qr_code": "Introdueix el valor del codi QR",
|
||||
"manual_input": "Pots escanejar el codi QR amb un altre escàner de QR i enganxar el codi a l'entrada següent",
|
||||
"not_supported": "El navegador no admet l'escaneig de QR.",
|
||||
"only_https_supported": "Només pots escanejar un codi QR utilitzant una càmera a través d'HTTPS.",
|
||||
"select_camera": "Selecciona càmera"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Filtra",
|
||||
"filter_by_area": "Filtra per àrea",
|
||||
"filter_by_device": "Filtra per dispositiu",
|
||||
"filter_by_entity": "Filtra per entitat",
|
||||
@@ -976,8 +1015,8 @@
|
||||
"add_device_id": "Selecciona dispositiu",
|
||||
"add_entity_id": "Selecciona entitat",
|
||||
"expand": "Expandeix",
|
||||
"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 les entitats separades que conté. Després d'expandir-lo, no s'actualitzaran les entitats quan el dispositiu canviï.",
|
||||
"expand_area_id": "Expandeix aquesta àrea en entitats i dispositius separats.",
|
||||
"expand_device_id": "Expandeix aquest dispositiu en entitats separades.",
|
||||
"remove": "Elimina",
|
||||
"remove_area_id": "Elimina àrea",
|
||||
"remove_device_id": "Elimina dispositiu",
|
||||
@@ -1012,13 +1051,27 @@
|
||||
"area": "Defineix només l'àrea de l'entitat",
|
||||
"area_note": "De manera predeterminada, les entitats d'un dispositiu es troben a la mateixa àrea que el dispositiu. Si canvies l'àrea d'aquesta entitat, deixarà de seguir la del dispositiu.",
|
||||
"change_device_area": "Canvia l'àrea del dispositiu",
|
||||
"confirm_delete": "Estàs segur que vols eliminar aquesta entrada?",
|
||||
"confirm_delete": "Estàs segur que vols eliminar aquesta entitat?",
|
||||
"delete": "Elimina",
|
||||
"device_class": "Mostra com a",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Porta",
|
||||
"garage_door": "Porta de garatge",
|
||||
"opening": "Altre",
|
||||
"window": "Finestra"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Porta",
|
||||
"garage": "Porta de garatge",
|
||||
"window": "Finestra"
|
||||
}
|
||||
},
|
||||
"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.",
|
||||
"enabled_label": "Activa l'entitat",
|
||||
"enabled_label": "Activació d'entitat",
|
||||
"enabled_restart_confirm": "Reinicia Home Assistant per acabar d'activar les entitats",
|
||||
"entity_id": "ID de l'entitat",
|
||||
"follow_device_area": "Segueix l'àrea del dispositiu",
|
||||
@@ -1027,7 +1080,7 @@
|
||||
"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.",
|
||||
"unavailable": "Entitat no està disponible.",
|
||||
"update": "Actualitza"
|
||||
},
|
||||
"faq": "documentació",
|
||||
@@ -1038,7 +1091,7 @@
|
||||
},
|
||||
"generic": {
|
||||
"cancel": "Cancel·la",
|
||||
"close": "tanca",
|
||||
"close": "Tanca",
|
||||
"default_confirmation_title": "Estàs segur?",
|
||||
"ok": "OK"
|
||||
},
|
||||
@@ -1096,10 +1149,11 @@
|
||||
"more_info_control": {
|
||||
"cover": {
|
||||
"close_cover": "Tanca la coberta",
|
||||
"close_tile_cover": "Inclinació de la coberta tancada",
|
||||
"close_tile_cover": "Inclinació de coberta tancada",
|
||||
"close_tilt_cover": "Inclinació de coberta tancada",
|
||||
"open_cover": "Obre la coberta",
|
||||
"open_tilt_cover": "Inclinació de la coberta oberta",
|
||||
"stop_cover": "Atura el moviment de la coberta"
|
||||
"open_tilt_cover": "Inclinació de coberta oberta",
|
||||
"stop_cover": "Atura la coberta"
|
||||
},
|
||||
"details": "Detalls",
|
||||
"dismiss": "Omet el diàleg",
|
||||
@@ -1180,7 +1234,7 @@
|
||||
"core": "General",
|
||||
"customize": "Personalització",
|
||||
"devices": "Dispositius",
|
||||
"energy": "Energia",
|
||||
"energy": "Configuració d'energia",
|
||||
"entities": "Entitats",
|
||||
"helpers": "Ajudants",
|
||||
"info": "Informació",
|
||||
@@ -1200,7 +1254,7 @@
|
||||
"command_line": "Entitats de línia de comandes",
|
||||
"core": "Ubicació i personalitzacions",
|
||||
"filesize": "Entitats de mida de fitxer",
|
||||
"filter": "Entitats de filtre",
|
||||
"filter": "Filtra entitats",
|
||||
"generic": "Entitats genèriques de càmera IP",
|
||||
"generic_thermostat": "Entitats genèriques de termòstat",
|
||||
"group": "Grups, grups d'entitats i serveis de notificació",
|
||||
@@ -1224,6 +1278,7 @@
|
||||
"statistics": "Entitats d'estadístiques",
|
||||
"telegram": "Serveis de notificació de Telegram",
|
||||
"template": "Entitats de plantilla",
|
||||
"themes": "Temes",
|
||||
"trend": "Entitats de tendència",
|
||||
"universal": "Entitats del reproductor universal",
|
||||
"zone": "Zones"
|
||||
@@ -1239,7 +1294,10 @@
|
||||
"server_control": "Servidor"
|
||||
}
|
||||
},
|
||||
"filter_placeholder": "Filtre d'entitats"
|
||||
"filter_placeholder": "Filtre d'entitats",
|
||||
"key_c_hint": "Prem 'c' en qualsevol pàgina per obrir aquest cercador",
|
||||
"nothing_found": "No s'ha trobat res!",
|
||||
"title": "Cerca ràpida"
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant no ha sentit res",
|
||||
@@ -1315,6 +1373,7 @@
|
||||
"key_missing": "Falta la clau obligatòria ''{key}''.",
|
||||
"key_not_expected": "L'editor visual no espera o no és compatible amb la clau ''{key}''.",
|
||||
"key_wrong_type": "L'editor visual no admet el valor proporcionat de ''{key}''. ({type_correct}) és compatible, però s'ha rebut ({type_wrong}).",
|
||||
"no_state_array_support": "No s'admeten estats de múltiples valors a l'editor visual",
|
||||
"no_template_editor_support": "Les plantilles no són compatibles amb l'editor visual",
|
||||
"no_type_provided": "No s'ha proporcionat cap tipus."
|
||||
},
|
||||
@@ -1356,6 +1415,8 @@
|
||||
"link_profile_page": "la teva pàgina de perfil"
|
||||
},
|
||||
"areas": {
|
||||
"add_picture": "Afegeix imatge",
|
||||
"assigned_to_area": "Assignat a aquesta àrea",
|
||||
"caption": "Àrees",
|
||||
"data_table": {
|
||||
"area": "Àrea",
|
||||
@@ -1387,7 +1448,8 @@
|
||||
"introduction": "Les àrees s'utilitzen per organitzar la situació dels dispositius. Aquesta informació serà utilitzada per Home Assistant per ajudar-te a organitzar millor la teva interfície, els permisos i les integracions amb d'altres sistemes.",
|
||||
"introduction2": "Per col·locar dispositius en una àrea, utilitza l'enllaç de sota per anar a la pàgina d'integracions i, a continuació, fes clic a una integració configurada per accedir a les targetes del dispositiu.",
|
||||
"no_areas": "Sembla que encara no tens cap àrea configurada."
|
||||
}
|
||||
},
|
||||
"targeting_area": "Amb l'àrea com a objectiu"
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automatització",
|
||||
@@ -1399,11 +1461,12 @@
|
||||
"header": "Creació d'una nova automatització",
|
||||
"how": "Com vols crear la nova automatització?",
|
||||
"start_empty": "Comença amb una automatització buida",
|
||||
"start_empty_description": "Crea una nova automatització des de zero",
|
||||
"thingtalk": {
|
||||
"create": "Crea",
|
||||
"header": "Descriu l'automatització que vols crear",
|
||||
"input_label": "Què vols que faci aquesta automatització?",
|
||||
"intro": "I intentarem crear-la per tu. Per exemple: ''Turn the light on when I leave''."
|
||||
"intro": "I intentarem crear-la per tu. Per exemple: ''Turn the lights off when I leave''."
|
||||
}
|
||||
},
|
||||
"editor": {
|
||||
@@ -1616,8 +1679,9 @@
|
||||
"delete": "Elimina",
|
||||
"delete_confirm": "Segur que vols eliminar-ho?",
|
||||
"duplicate": "Duplica",
|
||||
"edit_id": "Edita l'ID de disparador",
|
||||
"header": "Disparadors",
|
||||
"id": "ID del disparador (utilitzat per la condició de disparador)",
|
||||
"id": "ID de disparador",
|
||||
"introduction": "Els disparadors són les regles que fan que s'executi una automatització. Pots definir més d'un disparador per a cada automatització. Una vegada salti un disparador, Home Assistant validarà les condicions (si n'hi ha) i finalment cridarà l'acció.",
|
||||
"learn_more": "Més informació sobre els disparadors",
|
||||
"name": "Disparador",
|
||||
@@ -1626,7 +1690,7 @@
|
||||
"extra_fields": {
|
||||
"above": "A sobre",
|
||||
"below": "A sota",
|
||||
"for": "Durada",
|
||||
"for": "Durada (opcional)",
|
||||
"zone": "Zona"
|
||||
},
|
||||
"label": "Dispositiu",
|
||||
@@ -1667,10 +1731,10 @@
|
||||
},
|
||||
"state": {
|
||||
"attribute": "Atribut (opcional)",
|
||||
"for": "Durant",
|
||||
"from": "Des de",
|
||||
"for": "Durant (opcional)",
|
||||
"from": "Des de (opcional)",
|
||||
"label": "Estat",
|
||||
"to": "A"
|
||||
"to": "A (opcional)"
|
||||
},
|
||||
"sun": {
|
||||
"event": "Esdeveniment:",
|
||||
@@ -1870,6 +1934,7 @@
|
||||
"tts": {
|
||||
"default_language": "Idioma predeterminat a utilitzar",
|
||||
"dialog": {
|
||||
"create_automation": "Crea automatització",
|
||||
"example_message": "Hola {name}, pots reproduir qualsevol text en els reproductors multimèdia compatibles!",
|
||||
"header": "Prova el text a veu",
|
||||
"play": "Reprodueix",
|
||||
@@ -1980,7 +2045,7 @@
|
||||
"feature_amazon_alexa": "Integració amb Amazon Alexa",
|
||||
"feature_google_home": "Integració amb Google Assistant",
|
||||
"feature_remote_control": "Control de Home Assistant fora de casa",
|
||||
"feature_webhook_apps": "Fàcil integració amb aplicacions basades an webhook com OwnTracks",
|
||||
"feature_webhook_apps": "Fàcil integració amb aplicacions basades en webhook com OwnTracks",
|
||||
"headline": "Inicia la prova gratuïta",
|
||||
"information": "Crea un compte per iniciar la prova gratuïta d'un mes amb Home Assistant Cloud. No és necessària la informació de pagament.",
|
||||
"information2": "La prova et donarà accés a tots els avantatges de Home Assistant Cloud, inclosos:",
|
||||
@@ -2004,7 +2069,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "General",
|
||||
"description": "Sistema d'unitats, ubicació, zona horària i altres paràmetres generals",
|
||||
"description": "Ubicació, xarxa i dades analítiques",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -2027,7 +2092,7 @@
|
||||
"unit_system_metric": "Mètric"
|
||||
},
|
||||
"header": "Configuració general",
|
||||
"introduction": "Sabem que canviar la configuració pot ser un procés molest. Aquesta secció intenta facilitar-te una mica més la vida."
|
||||
"introduction": "Gestiona la teva ubicació, xarxa i dades analítiques."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2052,6 +2117,48 @@
|
||||
"not_applied": "Els canvis realitzats aquí es desen, però no s'aplicaran fins que es torni a carregar la configuració, tret que la inclusió estigui present."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Gestiona automatitzacions, escenes, scripts i ajudants",
|
||||
"title": "Automatitzacions i escenes"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Automatitzacions i scripts creats per la comunitat",
|
||||
"title": "Blueprints"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Ubicació i notificacions",
|
||||
"title": "App Companion"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Crea conjunts de targetes personalitzades per controlar casa teva",
|
||||
"title": "Panells"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Integracions, dispositius, entitats i àrees",
|
||||
"title": "Dispositius i serveis"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Monitoritza la teva producció i consum d'energia",
|
||||
"title": "Energia"
|
||||
},
|
||||
"people": {
|
||||
"description": "Gestiona les persones i zones a les que Home Assistant fa seguiment",
|
||||
"title": "Persones i zones"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Configuració bàsica, controls del servidor, registres i informació",
|
||||
"title": "Configuració"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Crea còpies de seguretat, comprova els registres o reinicia el sistema",
|
||||
"title": "Complements, còpies de seguretat i Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Executa automatitzacions quan una etiqueta NFC, un codi QR, etc; s'escanegi",
|
||||
"title": "Etiquetes"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "Encara no s'han afegit {name} mitjançant aquest dispositiu. Pots afegir-ne fent clic al botó + a sobre.",
|
||||
"automation": {
|
||||
@@ -2090,7 +2197,8 @@
|
||||
"integration": "Integració",
|
||||
"manufacturer": "Fabricant",
|
||||
"model": "Model",
|
||||
"no_devices": "Sense dispositius"
|
||||
"no_devices": "Sense dispositius",
|
||||
"no_integration": "Sense integració"
|
||||
},
|
||||
"delete": "Elimina",
|
||||
"description": "Gestiona els dispositius configurats",
|
||||
@@ -2102,6 +2210,7 @@
|
||||
"integration": "Integració",
|
||||
"user": "Usuari"
|
||||
},
|
||||
"download_diagnostics": "Baixa diagnòstics",
|
||||
"edit_settings": "Edita la configuració",
|
||||
"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.",
|
||||
@@ -2124,7 +2233,7 @@
|
||||
"open_configuration_url_service": "Visita el servei",
|
||||
"picker": {
|
||||
"filter": {
|
||||
"filter": "Filtre",
|
||||
"filter": "Filtra",
|
||||
"hidden_devices": "{number} {number, plural,\n one {dispositiu amagat}\n other {dispositius amagats}\n}",
|
||||
"show_all": "Mostra-ho tot",
|
||||
"show_disabled": "Mostra dispositius desactivats"
|
||||
@@ -2195,7 +2304,7 @@
|
||||
"energy_stat": "Energia consumida (m³)",
|
||||
"gas_usage": "Consum de gas",
|
||||
"header": "Configura el consum de gas",
|
||||
"m3_or_kWh": "m³ o kWh",
|
||||
"m3_or_kWh": "ft³, m³, Wh, kWh o MWh",
|
||||
"no_cost": "No facis seguiment de costos",
|
||||
"paragraph": "El consum de gas és el volum de gas que flueix cap a casa teva."
|
||||
},
|
||||
@@ -2300,19 +2409,19 @@
|
||||
"title": "Classe d'estat inesperada"
|
||||
},
|
||||
"entity_unexpected_unit_energy": {
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada 'kWh' o 'Wh':",
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada 'Wh', 'kWh' o 'MWh':",
|
||||
"title": "Unitat de mesura inesperada"
|
||||
},
|
||||
"entity_unexpected_unit_energy_price": {
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada ''{currency}/kWh'' o ''{currency}/Wh'':",
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada ''{currency}/kWh'', ''{currency}/Wh'' o ''{currency}/MWh'':",
|
||||
"title": "Unitat de mesura inesperada"
|
||||
},
|
||||
"entity_unexpected_unit_gas": {
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada 'kWh', 'm³' o 'ft³':",
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada 'Wh', 'kWh', o 'MWh' pels sensors d'energia o 'm³' o 'ft³' pels sensors de gas:",
|
||||
"title": "Unitat de mesura inesperada"
|
||||
},
|
||||
"entity_unexpected_unit_gas_price": {
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/m³'' o ''{currency}/ft³'':",
|
||||
"description": "Les entitats següents no tenen la unitat de mesura esperada ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/MWh'', ''{currency}/m³'' o ''{currency}/ft³'':",
|
||||
"title": "Unitat de mesura inesperada"
|
||||
},
|
||||
"recorder_untracked": {
|
||||
@@ -2337,7 +2446,7 @@
|
||||
"confirm_title": "Vols activar {number} {number, plural,\n one {entitat}\n other {entitats}\n}?"
|
||||
},
|
||||
"filter": {
|
||||
"filter": "Filtre",
|
||||
"filter": "Filtra",
|
||||
"hidden_entities": "{number} {number, plural,\n one {entitat amagada}\n other {entitats amagades}\n}",
|
||||
"show_all": "Mostra-ho tot",
|
||||
"show_disabled": "Mostra entitats desactivades",
|
||||
@@ -2395,6 +2504,7 @@
|
||||
"types": {
|
||||
"counter": "Comptador",
|
||||
"input_boolean": "Interruptor",
|
||||
"input_button": "Botó",
|
||||
"input_datetime": "Data i/o hora",
|
||||
"input_number": "Número",
|
||||
"input_select": "Desplegable",
|
||||
@@ -2456,14 +2566,18 @@
|
||||
"disable_restart_confirm": "Reinicia Home Assistant per acabar de desactivar aquesta integració",
|
||||
"disabled_polling": "Sondeig automàtic per l'obtenció de dades actualitzades desactivat",
|
||||
"documentation": "Documentació",
|
||||
"download_diagnostics": "Baixa diagnòstics",
|
||||
"enable_restart_confirm": "Reinicia Home Assistant per acabar d'activar aquesta integració",
|
||||
"entities": "{count} {count, plural,\n one {entitat}\n other {entitats}\n}",
|
||||
"entity_unavailable": "Entitat no disponible",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Maquinari: {version}",
|
||||
"hub": "Connectat a través de",
|
||||
"known_issues": "Problemes coneguts",
|
||||
"manuf": "de {manufacturer}",
|
||||
"no_area": "Sense àrea",
|
||||
"not_loaded": "No carregada",
|
||||
"open_configuration_url": "Mira el dispositiu",
|
||||
"provided_by_custom_integration": "Proporcionada per una integració personalitzada",
|
||||
"reload": "Torna a carregar",
|
||||
"reload_confirm": "La integració s'ha tornat a carregar",
|
||||
@@ -2480,7 +2594,9 @@
|
||||
"setup_retry": "S'està tornant a provar de configurar"
|
||||
},
|
||||
"system_options": "Opcions de sistema",
|
||||
"unnamed_entry": "Entrada sense nom"
|
||||
"unknown_via_device": "Dispositiu desconegut",
|
||||
"unnamed_entry": "Entrada sense nom",
|
||||
"via": "Connectat mitjançant"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Avortat",
|
||||
@@ -2793,6 +2909,7 @@
|
||||
"link_integrations_page": "Pàgina d'integracions",
|
||||
"link_presence_detection_integrations": "Integracions de detecció de presència",
|
||||
"linked_user": "Usuari enllaçat",
|
||||
"local_only": "Només es pot iniciar sessió des de la xarxa local",
|
||||
"name": "Nom",
|
||||
"name_error_msg": "El nom és necessari",
|
||||
"new_person": "Persona nova",
|
||||
@@ -2811,6 +2928,7 @@
|
||||
"caption": "Escenes",
|
||||
"description": "Captura els estats dels dispositius i recorda'ls més tard",
|
||||
"editor": {
|
||||
"area": "Àrea",
|
||||
"default_name": "Nova escena",
|
||||
"devices": {
|
||||
"add": "Afegeix un dispositiu",
|
||||
@@ -2906,14 +3024,14 @@
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Controls del servidor",
|
||||
"description": "Reinicia o atura el servidor Home Assistant",
|
||||
"description": "Valida i reinicia el servidor Home Assistant",
|
||||
"section": {
|
||||
"reloading": {
|
||||
"automation": "Automatitzacions",
|
||||
"command_line": "Entitats de línia de comandes",
|
||||
"core": "Ubicació i personalitzacions",
|
||||
"filesize": "Entitats de mida de fitxer",
|
||||
"filter": "Entitats de filtre",
|
||||
"filter": "Filtra entitats",
|
||||
"generic": "Entitats genèriques de càmera IP",
|
||||
"generic_thermostat": "Entitats genèriques de termòstat",
|
||||
"group": "Grups, grups d'entitats i serveis de notificació",
|
||||
@@ -2921,6 +3039,7 @@
|
||||
"history_stats": "Entitats d'estadístiques històriques",
|
||||
"homekit": "HomeKit",
|
||||
"input_boolean": "Entrades booleanes",
|
||||
"input_button": "Entrades de botó",
|
||||
"input_datetime": "Entrades de data i hora",
|
||||
"input_number": "Entrades numèriques",
|
||||
"input_select": "Entrades de selecció",
|
||||
@@ -2939,6 +3058,8 @@
|
||||
"statistics": "Entitats d'estadístiques",
|
||||
"telegram": "Serveis de notificació de Telegram",
|
||||
"template": "Entitats de plantilla",
|
||||
"themes": "Temes",
|
||||
"timer": "Temporitzadors",
|
||||
"trend": "Entitats de tendència",
|
||||
"universal": "Entitats del reproductor universal",
|
||||
"zone": "Zones"
|
||||
@@ -2947,7 +3068,7 @@
|
||||
"confirm_restart": "Segur que vols reiniciar Home Assistant?",
|
||||
"confirm_stop": "Segur que vols aturar Home Assistant?",
|
||||
"heading": "Gestió del servidor",
|
||||
"introduction": "Controla el teu servidor de Home Assistant… des de Home Assistant.",
|
||||
"introduction": "Controla Home Assistant.",
|
||||
"restart": "Reinicia",
|
||||
"stop": "Atura"
|
||||
},
|
||||
@@ -2967,7 +3088,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": "Dispara automatitzacions quan una etiqueta NFC, un codi QR, etc; s'escanegi",
|
||||
"description": "Executa automatitzacions quan una etiqueta NFC, un codi QR, etc; s'escanegi",
|
||||
"detail": {
|
||||
"companion_apps": "aplicacions de companion",
|
||||
"create": "Crea",
|
||||
@@ -2991,10 +3112,25 @@
|
||||
"no_tags": "Sense etiquetes",
|
||||
"write": "Escriu"
|
||||
},
|
||||
"updates": {
|
||||
"check_unavailable": {
|
||||
"description": "Has d'utilitzar el sistema operatiu de Home Assistant per poder comprovar i instal·lar actualitzacions des de la interfície d'usuari.",
|
||||
"title": "No s'ha pogut comprovar si hi ha actualitzacions"
|
||||
},
|
||||
"check_updates": "Comprova si hi ha actualitzacions",
|
||||
"more_updates": "+ {count} actualitzacions",
|
||||
"review": "revisa",
|
||||
"show": "mostra",
|
||||
"show_all_updates": "Mostra totes les actualitzacions",
|
||||
"title": "{count} {count, plural,\n one {actualització}\n other {actualitzacions}\n}",
|
||||
"unable_to_fetch": "No s'han pogut obtenir les actualitzacions",
|
||||
"version_available": "Versió {version_available} disponible"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Afegir usuari",
|
||||
"create": "Crear",
|
||||
"local_only": "Només local",
|
||||
"password": "Contrasenya",
|
||||
"password_confirm": "Confirma la contrasenya",
|
||||
"password_not_match": "Les contrasenyes no coincideixen"
|
||||
@@ -3013,25 +3149,31 @@
|
||||
"delete_user": "Eliminar usuari",
|
||||
"group": "Grup",
|
||||
"id": "ID",
|
||||
"local_only": "Només es pot iniciar sessió des de la xarxa local",
|
||||
"name": "Nom de visualització",
|
||||
"new_password": "Nova contrasenya",
|
||||
"owner": "Propietari",
|
||||
"password_changed": "La contrasenya s'ha canviat correctament",
|
||||
"system_generated": "Generat pel sistema",
|
||||
"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.",
|
||||
"system_generated": "Usuari del sistema",
|
||||
"system_generated_users_not_editable": "No es poden actualitzar usuaris del sistema.",
|
||||
"system_generated_users_not_removable": "No es poden eliminar usuaris del sistema.",
|
||||
"unnamed_user": "Usuari sense nom",
|
||||
"update_user": "Actualitza",
|
||||
"username": "Nom d'usuari"
|
||||
},
|
||||
"is_local": "Usuari local",
|
||||
"is_not_active": "Desactivat",
|
||||
"is_owner": "Propietari",
|
||||
"is_system": "Usuari del sistema",
|
||||
"picker": {
|
||||
"add_user": "Afegeix usuari",
|
||||
"headers": {
|
||||
"group": "Grup",
|
||||
"is_active": "Actiu",
|
||||
"is_owner": "Propietari",
|
||||
"local": "Local",
|
||||
"name": "Nom de visualització",
|
||||
"system": "Generat pel sistema",
|
||||
"system": "Sistema",
|
||||
"username": "Nom d'usuari"
|
||||
}
|
||||
},
|
||||
@@ -3123,6 +3265,7 @@
|
||||
"visualization": {
|
||||
"auto_zoom": "Zoom automàtic",
|
||||
"caption": "Visualització",
|
||||
"enable_physics": "Activa físiques",
|
||||
"header": "Visualització de xarxa",
|
||||
"highlight_label": "Ressalta els dispositius",
|
||||
"refresh_topology": "Actualitza la topologia",
|
||||
@@ -3256,13 +3399,21 @@
|
||||
"zwave_js": {
|
||||
"add_node": {
|
||||
"cancel_inclusion": "Cancel·la la inclusió",
|
||||
"check_logs": "Consulta els registres per a més informació.",
|
||||
"choose_inclusion_strategy": "Com vols afegir el dispositiu",
|
||||
"controller_in_inclusion_mode": "El controlador Z-Wave ara està en mode d'inclusió.",
|
||||
"enter_qr_code": "Introdueix el valor del codi QR",
|
||||
"follow_device_instructions": "Segueix les instruccions del teu dispositiu per activar la vinculació al dispositiu.",
|
||||
"inclusion_failed": "No s'ha pogut afegir el dispositiu. Consulta els registres per a més informació.",
|
||||
"inclusion_failed": "No s'ha pogut afegir el dispositiu.",
|
||||
"inclusion_finished": "S'ha afegit el dispositiu.",
|
||||
"interview_failed": "Ha fallat la consulta del dispositiu. Pots trobar informació addicional als registres.",
|
||||
"interview_started": "S'està consultant el dispositiu. Això pot trigar una estona.",
|
||||
"introduction": "Aquest assistent et guiarà perquè afegeixis un node a la teva xarxa Z-Wave.",
|
||||
"provisioning_finished": "S'ha afegit el dispositiu. Estarà disponible un cop s'encengui.",
|
||||
"qr_code": "Codi QR",
|
||||
"qr_code_paragraph": "Si el teu dispositiu és compatible amb SmartStart, pots escanejar el codi QR per vincular-lo fàcilment.",
|
||||
"scan_qr_code": "Escaneja codi QR",
|
||||
"searching_device": "Cercant el dispositiu",
|
||||
"secure_inclusion_warning": "Els dispositius segurs necessiten una amplada de banda més gran; si tens molts dispositius segurs pot ser que la xarxa Z-Wave vagi més lenta. Et recomanem que utilitzis la inclusió segura només en dispositius que realment ho necessitin com ara panys i controls de portes.",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
@@ -3282,6 +3433,7 @@
|
||||
"title": "S2 Sense autenticació"
|
||||
}
|
||||
},
|
||||
"select_camera": "Selecciona càmera",
|
||||
"start_inclusion": "Inicia la inclusió",
|
||||
"start_secure_inclusion": "Inicia la inclusió segura",
|
||||
"title": "Afegeix un dispositiu Z-Wave",
|
||||
@@ -3290,6 +3442,7 @@
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Afegeix dispositiu",
|
||||
"back": "Enrere",
|
||||
"close": "Tanca",
|
||||
"heal_network": "Guareix la xarxa",
|
||||
"home_id": "ID principal",
|
||||
@@ -3300,10 +3453,11 @@
|
||||
"source": "Font"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {dispositiu}\n other {dispositius}\n}",
|
||||
"driver_version": "Versió del controlador",
|
||||
"dump_dead_nodes_text": "Alguns dels dispositius no han respost i s'han donat com a morts. Aquests no s'exportaran completament.",
|
||||
"dump_dead_nodes_title": "Alguns dels teus dispositius estan morts",
|
||||
"dump_debug": "Baixa un fitxer de buidatge de la xarxa per ajudar-te a diagnosticar problemes",
|
||||
"dump_debug": "Baixa les dades",
|
||||
"dump_not_ready_confirm": "Baixa",
|
||||
"dump_not_ready_text": "Si fas una exportació mentre no tots els dispositius estan preparats, pots perdre dades útils. Deixa més temps perque la xarxa consulti tots els dispositius. Vols seguir amb el procés?",
|
||||
"dump_not_ready_title": "Encara no estan preparats tots els dispositius",
|
||||
@@ -3311,6 +3465,9 @@
|
||||
"home_id": "ID principal",
|
||||
"introduction": "Gestiona la teva xarxa i dispositius Z-Wave",
|
||||
"nodes_ready": "Dispositius preparats",
|
||||
"not_ready": "{count} no preparat/s",
|
||||
"provisioned_devices": "Dispositius proveïts",
|
||||
"server_url": "URL del servidor",
|
||||
"server_version": "Versió del servidor"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -3351,6 +3508,7 @@
|
||||
"traffic_warning": "El procés de curació genera una gran quantitat de trànsit a la xarxa Z-Wave. Això pot fer que els dispositius responguin lentament (o gens) mentre dura el procés."
|
||||
},
|
||||
"logs": {
|
||||
"download_logs": "Baixa els registres",
|
||||
"log_level": "Nivell dels registres",
|
||||
"log_level_changed": "Nivell de registre canviat a: {level}",
|
||||
"subscribed_to_logs": "Subscrit als missatges de registre de Z-Wave JS…",
|
||||
@@ -3385,6 +3543,15 @@
|
||||
"dead": "Mort",
|
||||
"unknown": "Desconegut"
|
||||
},
|
||||
"provisioned": {
|
||||
"confirm_unprovision_text": "Si desproveeixes el dispositiu, no s'afegirà a Home Assistant quan aquest estigui encès. Si el dispositiu ja ha estat afegit a Home Assistant, no se l'eliminarà.",
|
||||
"confirm_unprovision_title": "Estàs segur que vols desproveir el dispositiu?",
|
||||
"dsk": "DSK",
|
||||
"included": "Inclosos",
|
||||
"not_included": "No inclosos",
|
||||
"security_classes": "Classes de seguretat",
|
||||
"unprovison": "Desproveir"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "Hauràs de despertar els dispositius amb bateria abans d'iniciar el procés de consulta. Fes un cop d'ull al manual del dispositiu per saber com despertar-lo.",
|
||||
"in_progress": "S'està consultant el dispositiu. Això pot trigar una estona.",
|
||||
@@ -3599,7 +3766,8 @@
|
||||
"grid": "Xarxa",
|
||||
"home": "Casa",
|
||||
"non_fossil": "No fòssil",
|
||||
"solar": "Solar"
|
||||
"solar": "Solar",
|
||||
"title_today": "Distribució d'energia d'avui"
|
||||
},
|
||||
"energy_solar_graph": {
|
||||
"forecast": "Previsió {name}",
|
||||
@@ -3708,9 +3876,14 @@
|
||||
"card": {
|
||||
"alarm-panel": {
|
||||
"available_states": "Estats disponibles",
|
||||
"description": "La targeta panell d'alarma et permet activar i desactivar les integracions d'alarma.",
|
||||
"description": "La targeta panell d'alarma et permet activar i desactivar les integracions amb panell de control d'alarma.",
|
||||
"name": "Panell d'alarma"
|
||||
},
|
||||
"area": {
|
||||
"description": "La targeta d'àrea mostra automàticament les entitats d'una àrea específica.",
|
||||
"name": "Àrea",
|
||||
"show_camera": "Mostra el canal de la càmera en lloc de la imatge d'àrea"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "L'acció predeterminada depèn de les funcionalitats de l'entitat, o es commutarà o es mostrarà el diàleg de més informació.",
|
||||
"description": "La targeta botó et permet afegir botons per realitzar diferents tasques.",
|
||||
@@ -3906,13 +4079,20 @@
|
||||
"show_more_detail": "Mostra més detalls"
|
||||
},
|
||||
"shopping-list": {
|
||||
"description": "La targeta de llista de compres et permet afegir, editar, marcar i borrar elements de la teva llista de compres.",
|
||||
"description": "La targeta de llista de compres et permet afegir, editar, marcar i esborrar elements de la llista de compres.",
|
||||
"integration_not_loaded": "Aquesta targeta necessita que la integració `shopping_list` estigui configurada.",
|
||||
"name": "Llista de compres"
|
||||
},
|
||||
"statistics-graph": {
|
||||
"description": "Amb la targeta gràfic d'estadístiques pot visualitzar un gràfic amb estadístiques de cadascuna de les entitats establertes.",
|
||||
"name": "Gràfic d'estadístiques"
|
||||
"name": "Gràfic d'estadístiques",
|
||||
"period": "Període",
|
||||
"periods": {
|
||||
"5minute": "5 minuts",
|
||||
"day": "Dia",
|
||||
"hour": "Hora",
|
||||
"month": "Mes"
|
||||
}
|
||||
},
|
||||
"thermostat": {
|
||||
"description": "La targeta termòstat et permet controlar una entitat de tipus climatització. Pots canviar-ne tant la temperatura com el mode.",
|
||||
@@ -4085,7 +4265,7 @@
|
||||
"menu": {
|
||||
"close": "Tanca",
|
||||
"configure_ui": "Edita panell",
|
||||
"exit_edit_mode": "Surt del mode d'edició d'interfície",
|
||||
"exit_edit_mode": "Fet",
|
||||
"help": "Ajuda",
|
||||
"reload_resources": "Actualitza recursos",
|
||||
"start_conversation": "Inicia conversa"
|
||||
@@ -4316,7 +4496,8 @@
|
||||
"password_protection": "Protecció amb contrasenya",
|
||||
"select_type": "Selecciona què vols restaurar",
|
||||
"show_log": "Mostra el registre complet",
|
||||
"type": "Tipus de còpia de seguretat"
|
||||
"type": "Tipus de còpia de seguretat",
|
||||
"upload_backup": "Puja còpia de seguretat"
|
||||
},
|
||||
"user": {
|
||||
"create_account": "Crear compte",
|
||||
@@ -4444,7 +4625,7 @@
|
||||
"token_title": "Token d'actualització de {clientId}"
|
||||
},
|
||||
"suspend": {
|
||||
"description": "Tancar la connexió amb el servidor després d'haver estat ocult durant 5 minuts?",
|
||||
"description": "Tanca la connexió amb el servidor després d'estar ocult durant 5 minuts.",
|
||||
"header": "Tanca la connexió automàticament"
|
||||
},
|
||||
"themes": {
|
||||
|
@@ -22,7 +22,7 @@
|
||||
"logbook": "Záznamy",
|
||||
"mailbox": "Schránka",
|
||||
"map": "Mapa",
|
||||
"media_browser": "Prohlížeč médií",
|
||||
"media_browser": "Média",
|
||||
"profile": "Profil",
|
||||
"shopping_list": "Nákupní seznam",
|
||||
"states": "Přehled"
|
||||
@@ -131,7 +131,7 @@
|
||||
"dashboard": {
|
||||
"action_error": {
|
||||
"get_changelog": "Nepodařilo se získat seznam změn doplňku",
|
||||
"go_to_config": "Spuštění doplňku se nezdařilo - ověření konfigurace selhalo!",
|
||||
"go_to_config": "Upravit nastavení",
|
||||
"install": "Instalace doplňku se nezdařila",
|
||||
"restart": "Restartování doplňku se nezdařilo",
|
||||
"start": "Spuštění doplňku se nezdařilo",
|
||||
@@ -242,7 +242,7 @@
|
||||
}
|
||||
},
|
||||
"protection_mode": {
|
||||
"content": "Režim ochrany v tomto doplňku je zakázán! To poskytuje doplněku plný přístup k celému systému, což zvyšuje bezpečnostní rizika a mohlo by poškodit systém při nesprávném použití. Režim ochrany zakažte pouze v případě, že víte, co děláte, je to potřeba a důvěřujete zdroji tohoto doplňku.",
|
||||
"content": "Režim ochrany je v tomto doplňku zakázán! To poskytuje doplňku plný přístup k celému systému, což zvyšuje bezpečnostní rizika a mohlo by poškodit systém při nesprávném použití. Režim ochrany zakažte pouze v případě, že víte, co děláte, je to potřeba a důvěřujete zdroji tohoto doplňku.",
|
||||
"enable": "Povolit",
|
||||
"title": "Ochranný režim je vypnut!"
|
||||
},
|
||||
@@ -260,7 +260,7 @@
|
||||
"failed_to_reset": "Obnovení konfigurace doplňku se nezdařilo, {error}",
|
||||
"failed_to_save": "Uložení konfigurace doplňku se nezdařilo, {error}",
|
||||
"logs": {
|
||||
"get_logs": "Nepodařilo se získat protokoly o doplňcích, {error}"
|
||||
"get_logs": "Nepodařilo se získat logy doplňků, {error}"
|
||||
},
|
||||
"panel": {
|
||||
"configuration": "Nastavení",
|
||||
@@ -298,6 +298,7 @@
|
||||
"passwords_not_matching": "Hesla se neshodují",
|
||||
"select_type": "Vyberte, co chcete obnovit",
|
||||
"selected": "{number} vybraných",
|
||||
"size": "Velikost",
|
||||
"type": "Typ zálohy",
|
||||
"upload_backup": "Nahrát zálohu"
|
||||
},
|
||||
@@ -323,8 +324,10 @@
|
||||
"reset_options": "Obnovit možnosti",
|
||||
"restart": "Restartovat",
|
||||
"restart_name": "Restartovat {name}",
|
||||
"review": "přezkoumání",
|
||||
"running_version": "Aktuálně používáte verzi {version}",
|
||||
"save": "Uložit",
|
||||
"show": "zobrazit",
|
||||
"show_more": "Zobrazit o tom více informací",
|
||||
"update": "Aktualizovat",
|
||||
"update_available": "{count, plural,\n one {Čekající aktualizace}\n few {{count} čekající aktualizace}\n other {{count} čekajících aktualizací}\n}",
|
||||
@@ -342,7 +345,7 @@
|
||||
},
|
||||
"update": {
|
||||
"text": "Opravdu chcete aktualizovat {name} na verzi {version}?",
|
||||
"title": "Aktualizovat {name}"
|
||||
"title": "Aktualizace {name}"
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
@@ -405,7 +408,8 @@
|
||||
"repositories": {
|
||||
"add": "Přidat",
|
||||
"remove": "Odebrat",
|
||||
"title": "Správa úložišť doplňků"
|
||||
"title": "Správa úložišť doplňků",
|
||||
"used": "Úložiště se používá pro nainstalované doplňky a nelze je odstranit."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Restartovat doplněk",
|
||||
@@ -428,12 +432,14 @@
|
||||
"not_supported": "Toto přesměrování není vaší instancí Home Assistant podporováno. Zkontrolujte {link} pro podporovaná přesměrování a verzi, ve které byla zavedena."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Doplňky",
|
||||
"backups": "Zálohy",
|
||||
"dashboard": "Ovládací panel",
|
||||
"store": "Obchod s doplňky",
|
||||
"system": "Systém"
|
||||
},
|
||||
"store": {
|
||||
"check_updates": "Vyhledat aktualizace",
|
||||
"missing_addons": "Chybí doplňky? Na stránce svého uživatelského profilu povolte pokročilý režim",
|
||||
"no_results_found": "V {repository} nebyly nalezeny žádné výsledky.",
|
||||
"registries": "Registry",
|
||||
@@ -470,8 +476,8 @@
|
||||
"used_space": "Použité místo"
|
||||
},
|
||||
"log": {
|
||||
"get_logs": "Nepodařilo se získat protokoly {provider}, {error}",
|
||||
"log_provider": "Poskytovatel protokolu"
|
||||
"get_logs": "Nepodařilo se získat logy {provider}, {error}",
|
||||
"log_provider": "Poskytovatel logů"
|
||||
},
|
||||
"supervisor": {
|
||||
"beta_backup": "Před aktivací této funkce se ujistěte, že máte zálohy svých dat.",
|
||||
@@ -526,6 +532,16 @@
|
||||
"update_supervisor": "Aktualizovat Supervisor",
|
||||
"warning": "VAROVÁNÍ"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"core_note": "Pokud vaše instance po aktualizaci nenaběhne, vrátí ji supervisor zpět na verzi {version}.",
|
||||
"create_backup": "Vytvořit zálohu před aktualizací",
|
||||
"creating_backup": "Vytváření zálohy {name}",
|
||||
"description": "Máte nainstalovanou verzi {version}. Kliknutím na tlačítko Aktualizovat aktualizujete na verzi {newest_version}",
|
||||
"no_update": "Pro {name} není k dispozici žádná aktualizace",
|
||||
"open_release_notes": "Otevřít poznámky k vydání",
|
||||
"update_name": "Aktualizovat {name}",
|
||||
"updating": "Aktualizuji {name} na verzi {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -545,6 +561,9 @@
|
||||
"code": "Kód",
|
||||
"disarm": "Odbezpečit"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "Oblast nenalezena."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Naposledy spuštěno",
|
||||
"trigger": "Spustit akce"
|
||||
@@ -615,10 +634,17 @@
|
||||
},
|
||||
"media_player": {
|
||||
"browse_media": "Procházet média",
|
||||
"media_next_track": "Další",
|
||||
"media_next_track": "Další skladba",
|
||||
"media_pause": "Pauza",
|
||||
"media_play": "Přehrát",
|
||||
"media_play_pause": "Přehrát/pozastavit",
|
||||
"media_previous_track": "Předchozí",
|
||||
"media_previous_track": "Předchozí skladba",
|
||||
"media_stop": "Stop",
|
||||
"media_volume_down": "Snížit hlasitost",
|
||||
"media_volume_mute": "Vypnout zvuk",
|
||||
"media_volume_unmute": "Zapnout zvuk",
|
||||
"media_volume_up": "Zvýšit hlasitost",
|
||||
"nothing_playing": "Nic se nepřehrává",
|
||||
"sound_mode": "Režim zvuku",
|
||||
"source": "Zdroj",
|
||||
"text_to_speak": "Převod textu na řeč",
|
||||
@@ -726,6 +752,7 @@
|
||||
"save": "Uložit",
|
||||
"skip": "Přeskočit",
|
||||
"stay": "Zůstat",
|
||||
"submit": "Odeslat",
|
||||
"successfully_deleted": "Úspěšně smazáno",
|
||||
"successfully_saved": "Úspěšně uloženo",
|
||||
"undo": "Zpět",
|
||||
@@ -736,11 +763,11 @@
|
||||
"addon": "Doplněk",
|
||||
"error": {
|
||||
"fetch_addons": {
|
||||
"description": "Načítání doplňků skončilo chybou.",
|
||||
"description": "Při načítání doplňků došlo k chybě.",
|
||||
"title": "Chyba při načítání doplňků"
|
||||
},
|
||||
"no_supervisor": {
|
||||
"description": "Nebyl nalezen žádný Supervisor, takže doplňky nelze načíst.",
|
||||
"description": "Doplňky nejsou podporovány.",
|
||||
"title": "Žádný Supervisor"
|
||||
}
|
||||
}
|
||||
@@ -820,7 +847,7 @@
|
||||
"logbook": {
|
||||
"by": "prostřednictvím",
|
||||
"by_service": "službou",
|
||||
"entries_not_found": "Nenalezeny žádné záznamy.",
|
||||
"entries_not_found": "Nebyly nalezeny žádné události v logu.",
|
||||
"messages": {
|
||||
"became_unavailable": "bylo nedostupné",
|
||||
"changed_to_state": "změněno na {state}",
|
||||
@@ -850,7 +877,7 @@
|
||||
"was_unplugged": "bylo odpojeno",
|
||||
"was_unsafe": "bylo v nebezpečí"
|
||||
},
|
||||
"retrieval_error": "Chyba při načítání záznamu",
|
||||
"retrieval_error": "Nelze načíst logy",
|
||||
"show_trace": "Zobrazit trasu"
|
||||
},
|
||||
"media-browser": {
|
||||
@@ -881,7 +908,7 @@
|
||||
"documentation": "dokumentace",
|
||||
"learn_adding_local_media": "Další informace o přidávání médií naleznete v {documentation}.",
|
||||
"local_media_files": "Umístěte svá videa, zvukové či obrazové soubory do adresáře médií, abyste je mohli procházet a přehrávat v prohlížeči nebo na podporovaných přehrávačích médií.",
|
||||
"media-player-browser": "Prohlížeč přehrávače médií",
|
||||
"media-player-browser": "Média",
|
||||
"media_browsing_error": "Chyba při procházení médií",
|
||||
"media_not_supported": "Přehrávač médií v prohlížeči nepodporuje tento typ média",
|
||||
"media_player": "Přehrávač médií",
|
||||
@@ -900,7 +927,15 @@
|
||||
"label": "Obrázek",
|
||||
"unsupported_format": "Nepodporovaný formát, prosím vyberte obrázek typu JPEG, PNG nebo GIF."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"enter_qr_code": "Zadejte hodnotu QR kódu",
|
||||
"manual_input": "QR kód můžete naskenovat pomocí jiného QR skeneru a vložit jej do níže uvedeného pole",
|
||||
"not_supported": "Váš prohlížeč nepodporuje skenování QR kódů.",
|
||||
"only_https_supported": "Kameru můžete použít ke skenování QR kódu pouze při použití protokolu HTTPS.",
|
||||
"select_camera": "Vybrat kameru"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Filtrovat",
|
||||
"filter_by_area": "Filtrovat dle oblasti",
|
||||
"filter_by_device": "Filtrovat dle zařízení",
|
||||
"filter_by_entity": "Filtrovat dle entity",
|
||||
@@ -976,8 +1011,8 @@
|
||||
"add_device_id": "Vyberte zařízení",
|
||||
"add_entity_id": "Vyberte entitu",
|
||||
"expand": "Rozbalit",
|
||||
"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, které obsahuje. Po rozdělení nebudou entity aktualizovány, pokud dojde ke změnám zařízení.",
|
||||
"expand_area_id": "Rozdělit tuto oblast na samostatná zařízení a entity.",
|
||||
"expand_device_id": "Rozdělit toto zařízení na samostatné entity.",
|
||||
"remove": "Odebrat",
|
||||
"remove_area_id": "Odebrat oblast",
|
||||
"remove_device_id": "Odebrat zařízení",
|
||||
@@ -1012,8 +1047,22 @@
|
||||
"area": "Nastavit pouze oblast entity",
|
||||
"area_note": "Ve výchozím nastavení jsou entity zařízení ve stejné oblasti jako zařízení. Pokud změníte oblast této entity, nebude již sledovat oblast zařízení.",
|
||||
"change_device_area": "Změna oblasti zařízení",
|
||||
"confirm_delete": "Opravdu chcete tuto položku smazat?",
|
||||
"confirm_delete": "Opravdu chcete tuto entitu smazat?",
|
||||
"delete": "Odstranit",
|
||||
"device_class": "Zobrazit jako",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Dveře",
|
||||
"garage_door": "Garážová vrata",
|
||||
"opening": "Jiný",
|
||||
"window": "Okno"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Dveře",
|
||||
"garage": "Garážová vrata",
|
||||
"window": "Okno"
|
||||
}
|
||||
},
|
||||
"device_disabled": "Zařízení této entity je zakázáno.",
|
||||
"enabled_cause": "Zakázáno {cause}.",
|
||||
"enabled_delay_confirm": "Povolené entity budou přidány do Home Assistant za {delay} sekund",
|
||||
@@ -1027,7 +1076,7 @@
|
||||
"name": "Jméno",
|
||||
"note": "Poznámka: U všech integrací to ještě nemusí fungovat.",
|
||||
"open_device_settings": "Otevřít nastavení zařízení",
|
||||
"unavailable": "Tato entita není momentálně k dispozici.",
|
||||
"unavailable": "Tato entita není dostupná.",
|
||||
"update": "Aktualizovat"
|
||||
},
|
||||
"faq": "dokumentace",
|
||||
@@ -1038,7 +1087,7 @@
|
||||
},
|
||||
"generic": {
|
||||
"cancel": "Zrušit",
|
||||
"close": "zavřít",
|
||||
"close": "Zavřít",
|
||||
"default_confirmation_title": "Opravdu?",
|
||||
"ok": "OK"
|
||||
},
|
||||
@@ -1096,10 +1145,11 @@
|
||||
"more_info_control": {
|
||||
"cover": {
|
||||
"close_cover": "Zavřít",
|
||||
"close_tile_cover": "Snížit náklon",
|
||||
"close_tile_cover": "Zaklopit",
|
||||
"close_tilt_cover": "Zaklopit",
|
||||
"open_cover": "Otevřít",
|
||||
"open_tilt_cover": "Zvýšit náklon",
|
||||
"stop_cover": "Zastavit pohyb"
|
||||
"open_tilt_cover": "Naklopit",
|
||||
"stop_cover": "Zastavit"
|
||||
},
|
||||
"details": "Podrobnosti",
|
||||
"dismiss": "Zavřít dialog",
|
||||
@@ -1180,7 +1230,7 @@
|
||||
"core": "Obecné",
|
||||
"customize": "Přizpůsobení",
|
||||
"devices": "Zařízení",
|
||||
"energy": "Energie",
|
||||
"energy": "Nastavení Energie",
|
||||
"entities": "Entity",
|
||||
"helpers": "Pomocníci",
|
||||
"info": "Informace",
|
||||
@@ -1224,6 +1274,7 @@
|
||||
"statistics": "Entity integrace Statistics",
|
||||
"telegram": "Notifikační služby integrace Telegram",
|
||||
"template": "Entity integrace Template",
|
||||
"themes": "Motivy",
|
||||
"trend": "Entity integrace Trend",
|
||||
"universal": "Entity integrace Universal media player",
|
||||
"zone": "Zóny"
|
||||
@@ -1239,7 +1290,9 @@
|
||||
"server_control": "Server"
|
||||
}
|
||||
},
|
||||
"filter_placeholder": "Filtr entit"
|
||||
"filter_placeholder": "Filtr entit",
|
||||
"key_c_hint": "Stisknutím „c“ na libovolné stránce otevřete tento vyhledávací panel",
|
||||
"title": "Rychlé vyhledávání"
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant nic neslyšel",
|
||||
@@ -1288,7 +1341,7 @@
|
||||
"button_show": "Podrobnosti",
|
||||
"cluster_header": "Klastr",
|
||||
"configuration_complete": "Změna konfigurace zařízení dokončena.",
|
||||
"configuration_failed": "Rekonfigurace zařízení se nezdařila. Další informace mohou být k dispozici v protokolech.",
|
||||
"configuration_failed": "Rekonfigurace zařízení se nezdařila. Další informace mohou být k dispozici v logách.",
|
||||
"configuring_alt": "Nastavuji",
|
||||
"heading": "Znovunastavení zařízení",
|
||||
"in_progress": "Zařízení se překonfigurová. Může to chvíli trvat.",
|
||||
@@ -1315,6 +1368,7 @@
|
||||
"key_missing": "Chybí požadovaný klíč \"{key}\".",
|
||||
"key_not_expected": "Klíč \"{key}\" není vizuálním editorem očekáván nebo podporován.",
|
||||
"key_wrong_type": "Zadávanou hodnotu \"{key}\" nepodporuje vizuální editor. Podporuje ({type_correct}), ale obdržel ({type_wrong}).",
|
||||
"no_state_array_support": "Vizuální editor nepodporuje více hodnot stavu",
|
||||
"no_template_editor_support": "Šablony nejsou podporovány v uživatelském rozhraní",
|
||||
"no_type_provided": "Není k dispozici žádný typ."
|
||||
},
|
||||
@@ -1356,6 +1410,8 @@
|
||||
"link_profile_page": "stránka vašeho profilu"
|
||||
},
|
||||
"areas": {
|
||||
"add_picture": "Přidat obrázek",
|
||||
"assigned_to_area": "Přiřazeno do této oblasti",
|
||||
"caption": "Oblasti",
|
||||
"data_table": {
|
||||
"area": "Oblast",
|
||||
@@ -1387,7 +1443,8 @@
|
||||
"introduction": "Oblasti se používají k uspořádání zařízení podle místa kde jsou. Tato informace bude použita k organizaci rozhraní, k nastavení oprávnění a v integraci s ostatnímy systémy.",
|
||||
"introduction2": "Pro přídání zařízení do oblasti přejděte na stránku integrací pomocí odkazu níže, tam klikněte na nastavenou integraci, abyste se dostali ke kartám zařízení.",
|
||||
"no_areas": "Vypadá to, že ještě nemáte žádné oblasti!"
|
||||
}
|
||||
},
|
||||
"targeting_area": "Zacílení na tuto oblast"
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automatizace",
|
||||
@@ -1399,6 +1456,7 @@
|
||||
"header": "Vytvoření automatizace",
|
||||
"how": "Jak chcete vytvořit svou novou automatizaci?",
|
||||
"start_empty": "Začít s prázdnou automatizací",
|
||||
"start_empty_description": "Vytvořit novou automatizaci od nuly",
|
||||
"thingtalk": {
|
||||
"create": "Vytvořit",
|
||||
"header": "Popište automatizaci, kterou chcete vytvořit",
|
||||
@@ -1616,8 +1674,9 @@
|
||||
"delete": "Smazat",
|
||||
"delete_confirm": "Opravdu smazat?",
|
||||
"duplicate": "Duplikovat",
|
||||
"edit_id": "Upravit ID spouštěče",
|
||||
"header": "Spouštěče",
|
||||
"id": "ID spouštěče (pro podmínku \"spouštěč\")",
|
||||
"id": "ID spouštěče",
|
||||
"introduction": "Spouštěče spouštějí automatizaci. Pro jednu automatizaci je možné zadat více spouštěčů. Po spuštění ověří Home Assistant případné podmínky a zavolá akci.",
|
||||
"learn_more": "Další informace o spouštěčích",
|
||||
"name": "Spouštěč",
|
||||
@@ -1626,7 +1685,7 @@
|
||||
"extra_fields": {
|
||||
"above": "Větší než",
|
||||
"below": "Menší než",
|
||||
"for": "Doba trvání",
|
||||
"for": "Doba trvání (nepovinné)",
|
||||
"zone": "Zóna"
|
||||
},
|
||||
"label": "Zařízení",
|
||||
@@ -1667,10 +1726,10 @@
|
||||
},
|
||||
"state": {
|
||||
"attribute": "Atribut (volitelný)",
|
||||
"for": "Po dobu",
|
||||
"from": "Z",
|
||||
"for": "Po dobu (volitelné)",
|
||||
"from": "Z (volitelné)",
|
||||
"label": "Stav",
|
||||
"to": "Do"
|
||||
"to": "Do (volitelné)"
|
||||
},
|
||||
"sun": {
|
||||
"event": "Událost:",
|
||||
@@ -1720,7 +1779,7 @@
|
||||
"add_automation": "Přidat automatizaci",
|
||||
"delete_automation": "Odstranit automatizaci",
|
||||
"delete_confirm": "Opravdu chcete odstranit tuto automatizaci?",
|
||||
"dev_automation": "Debugování automatizace",
|
||||
"dev_automation": "Debugovat automatizaci",
|
||||
"dev_only_editable": "Pouze automatizace s unikátní ID jsou debugovatelné.",
|
||||
"duplicate": "Duplikát",
|
||||
"duplicate_automation": "Duplikovat automatizaci",
|
||||
@@ -1870,6 +1929,7 @@
|
||||
"tts": {
|
||||
"default_language": "Výchozí jazyk, který se má použít",
|
||||
"dialog": {
|
||||
"create_automation": "Vytvořit automatizaci",
|
||||
"example_message": "Dobrý den, {name} , můžete přehrávat libovolný text na libovolném podporovaném přehrávači médií!",
|
||||
"header": "Zkuste převod textu na řeč",
|
||||
"play": "Přehrát",
|
||||
@@ -2004,7 +2064,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "Obecné",
|
||||
"description": "Jednotkový systém, umístění, časové pásmo a další obecné parametry",
|
||||
"description": "Poloha, síť a analytika",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -2027,7 +2087,7 @@
|
||||
"unit_system_metric": "Metrický"
|
||||
},
|
||||
"header": "Obecná nastavení",
|
||||
"introduction": "Moc dobře víme, že změna nastavení může být velmi únavný proces. Tato sekce se proto pokusí udělat váš život alespoň trochu jednodušší."
|
||||
"introduction": "Spravujte svou polohu, síť a analytiku."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2052,6 +2112,48 @@
|
||||
"not_applied": "Změny zde provedené jsou zapsány, ale nebudou použity při novém načtení konfigurace, pokud není \"customize\" konfigurace nastavena v globální konfiguraci."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Správa automatizací, scén, skriptů a pomocníků",
|
||||
"title": "Automatizace a scény"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Předpřipravené automatizace a skripty od komunity",
|
||||
"title": "Šablony"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Poloha a oznámení",
|
||||
"title": "Doprovodná aplikace"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Vytváření vlastních sad karet pro ovládání svého domova",
|
||||
"title": "Ovládací panely"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Integrace, zařízení, entity a oblasti",
|
||||
"title": "Zařízení a služby"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Sledování výroby a spotřeby energie",
|
||||
"title": "Energie"
|
||||
},
|
||||
"people": {
|
||||
"description": "Správa osob a zón, které Home Assistant sleduje",
|
||||
"title": "Lidé a zóny"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Základní nastavení, ovládání systému, logy a informace",
|
||||
"title": "Nastavení"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Vytváření záloh, kontrola logů nebo restartování systému",
|
||||
"title": "Doplňky, zálohy a Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Spouštění automatizací při naskenování NFC tagu, QR kódu atd.",
|
||||
"title": "Štítky"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "Pomocí tohoto zařízení dosud nebyly přidány žádné {name}. Můžete je přidat kliknutím na tlačítko + výše.",
|
||||
"automation": {
|
||||
@@ -2090,7 +2192,8 @@
|
||||
"integration": "Integrace",
|
||||
"manufacturer": "Výrobce",
|
||||
"model": "Model",
|
||||
"no_devices": "Žádná zařízení"
|
||||
"no_devices": "Žádná zařízení",
|
||||
"no_integration": "Žádné integrace"
|
||||
},
|
||||
"delete": "Odstranit",
|
||||
"description": "Správa připojených zařízení",
|
||||
@@ -2102,6 +2205,7 @@
|
||||
"integration": "Integrace",
|
||||
"user": "Uživatel"
|
||||
},
|
||||
"download_diagnostics": "Stáhnout diagnostická data",
|
||||
"edit_settings": "Upravit nastavení",
|
||||
"enabled_cause": "Zařízení je zakázáno přes {cause}.",
|
||||
"enabled_description": "Zakázaná zařízení se nebudou zobrazovat a entity patřící k těmto zařízením budou zakázány a nebudou přidány do Home Assistant.",
|
||||
@@ -2195,7 +2299,7 @@
|
||||
"energy_stat": "Spotřebovaná energie (m³)",
|
||||
"gas_usage": "Využití plynu",
|
||||
"header": "Nastavení spotřeby plynu",
|
||||
"m3_or_kWh": "m³ nebo kWh",
|
||||
"m3_or_kWh": "ft³, m³, Wh, kWh nebo MWh",
|
||||
"no_cost": "Nesledovat náklady",
|
||||
"paragraph": "Spotřeba plynu je objem plynu, který proudí do vaší domácnosti."
|
||||
},
|
||||
@@ -2300,19 +2404,19 @@
|
||||
"title": "Neočekávaná třída stavu"
|
||||
},
|
||||
"entity_unexpected_unit_energy": {
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"kWh\" nebo \"Wh\":",
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"Wh\", \"kWh\" nebo \"MWh\":",
|
||||
"title": "Neočekávaná měrná jednotka"
|
||||
},
|
||||
"entity_unexpected_unit_energy_price": {
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"{currency}/kWh\" nebo \"{currency}/Wh\":",
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"{currency}/Wh\", \"{currency}/kWh\" nebo \"{currency}/MWh\":",
|
||||
"title": "Neočekávaná měrná jednotka"
|
||||
},
|
||||
"entity_unexpected_unit_gas": {
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"kWh\", \"m³\" or \"ft³\":",
|
||||
"description": "Následující entity nemají očekávané měrné jednotky \"Wh\", \"kWh\" nebo \"MWh\" pro senzor energie nebo \"m³\" či \"ft³\" pro senzor plynu:",
|
||||
"title": "Neočekávaná měrná jednotka"
|
||||
},
|
||||
"entity_unexpected_unit_gas_price": {
|
||||
"description": "Následující entity nemají očekávané měrné jednotky ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/m³'' nebo ''{currency}/ft³'':",
|
||||
"description": "Následující entity nemají očekávané měrné jednotky ''{currency}/Wh'', ''{currency}/kWh'', ''{currency}/MWh'', ''{currency}/m³'' nebo ''{currency}/ft³'':",
|
||||
"title": "Neočekávaná měrná jednotka"
|
||||
},
|
||||
"recorder_untracked": {
|
||||
@@ -2395,6 +2499,7 @@
|
||||
"types": {
|
||||
"counter": "Počítadlo",
|
||||
"input_boolean": "Přepínač",
|
||||
"input_button": "Tlačítko",
|
||||
"input_datetime": "Datum a/nebo čas",
|
||||
"input_number": "Číslo",
|
||||
"input_select": "Výběr",
|
||||
@@ -2456,14 +2561,18 @@
|
||||
"disable_restart_confirm": "Restartujte Home Assistant pro dokončení odstranění této integrace",
|
||||
"disabled_polling": "Automatické dotazování na aktualizovaná data je zakázáno",
|
||||
"documentation": "Dokumentace",
|
||||
"download_diagnostics": "Stáhnout diagnostická data",
|
||||
"enable_restart_confirm": "Restartujte Home Assistant pro dokončení přidání této integrace",
|
||||
"entities": "{count} {count, plural,\n one {entita}\n other {entit}\n}",
|
||||
"entity_unavailable": "Entita není dostupná",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Hardware: {version}",
|
||||
"hub": "Připojeno přes",
|
||||
"known_issues": "Známé problémy",
|
||||
"manuf": "od {manufacturer}",
|
||||
"no_area": "Žádná oblast",
|
||||
"not_loaded": "Nenačteno",
|
||||
"open_configuration_url": "Navštívit zařízení",
|
||||
"provided_by_custom_integration": "Poskytováno vlastní integrací",
|
||||
"reload": "Nově načíst",
|
||||
"reload_confirm": "Integrace byla nově načtena",
|
||||
@@ -2480,7 +2589,9 @@
|
||||
"setup_retry": "Opakovaný pokus o nastavení"
|
||||
},
|
||||
"system_options": "Více možností",
|
||||
"unnamed_entry": "Nepojmenovaný záznam"
|
||||
"unknown_via_device": "Neznámé zařízení",
|
||||
"unnamed_entry": "Nepojmenovaný záznam",
|
||||
"via": "Připojeno přes"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Přerušeno",
|
||||
@@ -2549,10 +2660,10 @@
|
||||
"logs": {
|
||||
"caption": "Logy",
|
||||
"clear": "Zrušit",
|
||||
"copy": "Zkopírovat záznam v protokolu",
|
||||
"copy": "Zkopírovat log",
|
||||
"custom_integration": "vlastní integrace",
|
||||
"description": "Zobrazení logů Home Assistant",
|
||||
"details": "Detaily protokolu ({level})",
|
||||
"details": "Detaily logování ({level})",
|
||||
"error_from_custom_integration": "Tato chyba pochází z vlastní integrace.",
|
||||
"level": {
|
||||
"critical": "KRITICKÉ",
|
||||
@@ -2561,8 +2672,8 @@
|
||||
"info": "INFO",
|
||||
"warning": "VAROVÁNÍ"
|
||||
},
|
||||
"load_full_log": "Načíst úplný protokol Home Assistanta",
|
||||
"loading_log": "Načítání protokolu chyb…",
|
||||
"load_full_log": "Načíst úplné logy Home Assistanta",
|
||||
"loading_log": "Načítání logu chyb…",
|
||||
"multiple_messages": "zpráva se poprvé objevila v {time} a zobrazuje se {counter} krát",
|
||||
"no_errors": "Nebyly hlášeny žádné chyby",
|
||||
"no_issues": "Nejsou žádné nové problémy!",
|
||||
@@ -2793,6 +2904,7 @@
|
||||
"link_integrations_page": "Stránka integrací",
|
||||
"link_presence_detection_integrations": "Integrace detekce přítomnosti",
|
||||
"linked_user": "Propojený uživatel",
|
||||
"local_only": "Může se přihlásit pouze z místní sítě",
|
||||
"name": "Jméno",
|
||||
"name_error_msg": "Jméno je povinné",
|
||||
"new_person": "Nová osoba",
|
||||
@@ -2811,6 +2923,7 @@
|
||||
"caption": "Scény",
|
||||
"description": "Zachyťte stavy zařízení a snadno je později vyvolejte",
|
||||
"editor": {
|
||||
"area": "Oblast",
|
||||
"default_name": "Nová scéna",
|
||||
"devices": {
|
||||
"add": "Přidat zařízení",
|
||||
@@ -2906,7 +3019,7 @@
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Ovládání serveru",
|
||||
"description": "Restartování a zastavení serveru Home Asistent",
|
||||
"description": "Ověření a restartování serveru Home Assistant",
|
||||
"section": {
|
||||
"reloading": {
|
||||
"automation": "Automatizace",
|
||||
@@ -2921,6 +3034,7 @@
|
||||
"history_stats": "Entity integrace History stats",
|
||||
"homekit": "Integrace HomeKit",
|
||||
"input_boolean": "Pomocníci - přepínače",
|
||||
"input_button": "Pomocníci - tlačítka",
|
||||
"input_datetime": "Pomocníci - data/časy",
|
||||
"input_number": "Pomocníci - čísla",
|
||||
"input_select": "Pomocníci - výběry",
|
||||
@@ -2939,6 +3053,8 @@
|
||||
"statistics": "Entity integrace Statistics",
|
||||
"telegram": "Notifikační služby integrace Telegram",
|
||||
"template": "Entity integrace Template",
|
||||
"themes": "Motivy",
|
||||
"timer": "Časovače",
|
||||
"trend": "Entity integrace Trend",
|
||||
"universal": "Entity integrace Universal media player",
|
||||
"zone": "Zóny"
|
||||
@@ -2947,7 +3063,7 @@
|
||||
"confirm_restart": "Opravdu chcete restartovat Home Assistant?",
|
||||
"confirm_stop": "Opravdu chcete zastavit službu Home Assistant?",
|
||||
"heading": "Správa serveru",
|
||||
"introduction": "Ovládejte svůj Home Assistant server… z Home Assistant.",
|
||||
"introduction": "Ovládejte svůj Home Assistant.",
|
||||
"restart": "Restartovat",
|
||||
"stop": "Zastavit"
|
||||
},
|
||||
@@ -2967,7 +3083,7 @@
|
||||
"confirm_remove": "Opravdu chcete odebrat štítek {tag}?",
|
||||
"confirm_remove_title": "Odebrat štítek?",
|
||||
"create_automation": "Vytvořit automatizaci se štítkem",
|
||||
"description": "Spusťte automatizaci skenováním NFC tagu, QR kódu atd",
|
||||
"description": "Spouštění automatizací při naskenování NFC tagu, QR kódu atd.",
|
||||
"detail": {
|
||||
"companion_apps": "doprovodné aplikace",
|
||||
"create": "Vytvořit",
|
||||
@@ -2991,10 +3107,20 @@
|
||||
"no_tags": "Žádné štítky",
|
||||
"write": "Zapsat"
|
||||
},
|
||||
"updates": {
|
||||
"more_updates": "+ {count} aktualizací",
|
||||
"review": "přezkoumání",
|
||||
"show": "zobrazit",
|
||||
"show_all_updates": "Zobrazit všechny aktualizace",
|
||||
"title": "{count} {count, plural,\n one {aktualizace}\n few {aktualizace}\n other {aktualizací}\n}",
|
||||
"unable_to_fetch": "Nelze načíst aktualizace",
|
||||
"version_available": "Verze {version_available} je k dispozici"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Přidat uživatele",
|
||||
"create": "Vytvořit",
|
||||
"local_only": "Pouze místní",
|
||||
"password": "Heslo",
|
||||
"password_confirm": "Potvrzení hesla",
|
||||
"password_not_match": "Hesla se neshodují"
|
||||
@@ -3013,25 +3139,31 @@
|
||||
"delete_user": "Odstranit uživatele",
|
||||
"group": "Skupina",
|
||||
"id": "ID",
|
||||
"local_only": "Může se přihlásit pouze z místní sítě",
|
||||
"name": "Zobrazované jméno",
|
||||
"new_password": "Nové heslo",
|
||||
"owner": "Vlastník",
|
||||
"password_changed": "Heslo bylo změněno",
|
||||
"system_generated": "Generovaný systémem",
|
||||
"system_generated_users_not_editable": "Nelze aktualizovat uživatele generované systémem.",
|
||||
"system_generated_users_not_removable": "Nelze odebrat uživatele generované systémem.",
|
||||
"system_generated": "Systémový uživatel",
|
||||
"system_generated_users_not_editable": "Nelze upravovat systémové uživatele.",
|
||||
"system_generated_users_not_removable": "Nelze odebrat systémové uživatele.",
|
||||
"unnamed_user": "Nepojmenovaný uživatel",
|
||||
"update_user": "Aktualizovat",
|
||||
"username": "Uživatelské jméno"
|
||||
},
|
||||
"is_local": "Místní uživatel",
|
||||
"is_not_active": "Zakázaný",
|
||||
"is_owner": "Vlastník",
|
||||
"is_system": "Systémový uživatel",
|
||||
"picker": {
|
||||
"add_user": "Přidat uživatele",
|
||||
"headers": {
|
||||
"group": "Skupina",
|
||||
"is_active": "Aktivní",
|
||||
"is_owner": "Vlastník",
|
||||
"local": "Místní",
|
||||
"name": "Zobrazované jméno",
|
||||
"system": "Vygenerovaný systémem",
|
||||
"system": "Systémový",
|
||||
"username": "Uživatelské jméno"
|
||||
}
|
||||
},
|
||||
@@ -3123,6 +3255,7 @@
|
||||
"visualization": {
|
||||
"auto_zoom": "Automatické přiblížení",
|
||||
"caption": "Vizualizace",
|
||||
"enable_physics": "Povolit Physics",
|
||||
"header": "Vizualizace sítě",
|
||||
"highlight_label": "Zvýraznit zařízení",
|
||||
"refresh_topology": "Aktualizovat topologii",
|
||||
@@ -3181,7 +3314,7 @@
|
||||
},
|
||||
"network_management": {
|
||||
"header": "Správa sítě Z-Wave",
|
||||
"introduction": "Spouštějte příkazy, které ovlivňují síť Z-Wave. Nebudete mít žádnou zpětnou vazbu o tom, zda příkazy uspěly, ale můžete se podívat do OZW protokolu, kde to můžete zjistit."
|
||||
"introduction": "Spouštějte příkazy, které ovlivňují síť Z-Wave. Nebudete mít žádnou zpětnou vazbu o tom, zda příkazy uspěly, ale můžete se podívat do logů OZW, kde to můžete zjistit."
|
||||
},
|
||||
"network_status": {
|
||||
"network_started": "Síť Z-Wave spuštěna",
|
||||
@@ -3223,9 +3356,9 @@
|
||||
"set_protection": "Nastavit ochranu"
|
||||
},
|
||||
"ozw_log": {
|
||||
"header": "Protokol OZW",
|
||||
"introduction": "Zobrazit protokol. 0 je minimum (načte celý protokol) a 1000 je maximum. Načíst zobrazí statický protokol a Konec automaticky aktualizuje protokol s naposledy zvoleným počtem řádků.",
|
||||
"last_log_lines": "Počet řádků posledního protokolu",
|
||||
"header": "Logy OZW",
|
||||
"introduction": "Zobrazit log. 0 je minimum (načte celý log) a 1000 je maximum. \"Načíst\" zobrazí statický log a Konec automaticky bude logy aktualizovat s naposledy zvoleným počtem řádků.",
|
||||
"last_log_lines": "Počet posledních řádků logu",
|
||||
"load": "Načíst",
|
||||
"tail": "Konec"
|
||||
},
|
||||
@@ -3256,13 +3389,21 @@
|
||||
"zwave_js": {
|
||||
"add_node": {
|
||||
"cancel_inclusion": "Zrušit začlenění",
|
||||
"check_logs": "Další informace naleznete v logách.",
|
||||
"choose_inclusion_strategy": "Jak chcete přidat své zařízení",
|
||||
"controller_in_inclusion_mode": "Váš ovladač Z-Wave je nyní v režimu začlenění.",
|
||||
"enter_qr_code": "Zadejte hodnotu QR kódu",
|
||||
"follow_device_instructions": "Podle pokynů dodaných se zařízením aktivujte párování na zařízení.",
|
||||
"inclusion_failed": "Zařízení nelze přidat. Další informace najdete v protokolech.",
|
||||
"inclusion_failed": "Zařízení nelze přidat.",
|
||||
"inclusion_finished": "Zařízení bylo přidán.",
|
||||
"interview_failed": "Komunikace se zařízením se nezdařila. V logách mohou být k dispozici další informace.",
|
||||
"interview_started": "Zařízení je dotazováno. To může nějakou dobu trvat.",
|
||||
"introduction": "Tento průvodce vás provede přidáním uzlu do vaší sítě Z-Wave.",
|
||||
"provisioning_finished": "Zařízení bylo přidáno. Jakmile jej zapnete, bude k dispozici.",
|
||||
"qr_code": "QR kód",
|
||||
"qr_code_paragraph": "Pokud vaše zařízení podporuje funkci SmartStart, můžete pro snadné spárování naskenovat QR kód.",
|
||||
"scan_qr_code": "Naskenujte QR kód",
|
||||
"searching_device": "Probíhá hledání zařízení",
|
||||
"secure_inclusion_warning": "Zabezpečená zařízení vyžadují větší šířku pásma; příliš mnoho zabezpečených zařízení může zpomalit vaši síť Z-Wave. Bezpečné začlenění doporučujeme používat pouze u zařízení, která to vyžadují, jako jsou zámky nebo otvírače garážových vrat.",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
@@ -3282,6 +3423,7 @@
|
||||
"title": "S2 Neověřeno"
|
||||
}
|
||||
},
|
||||
"select_camera": "Vybrat kameru",
|
||||
"start_inclusion": "Zahájit začlenění",
|
||||
"start_secure_inclusion": "Spusťte zabezpečené začlenění",
|
||||
"title": "Přidání zařízení Z-Wave",
|
||||
@@ -3290,6 +3432,7 @@
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Přidat zařízení",
|
||||
"back": "Zpět",
|
||||
"close": "Zavřít",
|
||||
"heal_network": "Uzdravit síť",
|
||||
"home_id": "ID domácnosti",
|
||||
@@ -3300,10 +3443,11 @@
|
||||
"source": "Zdroj"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {zařízení}\n few {zařízení}\n other {zařízení}\n}",
|
||||
"driver_version": "Verze ovladače",
|
||||
"dump_dead_nodes_text": "Některá zařízení neodpověděla a předpokládá se, že jsou mrtvé. Ta nebudou plně exportována.",
|
||||
"dump_dead_nodes_title": "Některá zařízení jsou mrtvá",
|
||||
"dump_debug": "Stáhněte si výpis své sítě a pomozte diagnostikovat problémy",
|
||||
"dump_debug": "Stáhnout data",
|
||||
"dump_not_ready_confirm": "Stáhnout",
|
||||
"dump_not_ready_text": "Pokud vytvoříte export, zatímco všechny zařízení ještě nejsou připravena, mohla by vám chybět potřebná data. Dejte své síti nějaký čas na dotazování všech zařízení. Chcete pokračovat s výpisem?",
|
||||
"dump_not_ready_title": "Všechna zařízení ještě nejsou připravena",
|
||||
@@ -3311,6 +3455,9 @@
|
||||
"home_id": "ID domácnosti",
|
||||
"introduction": "Správa sítě Z-Wave a zařízení Z-Wave",
|
||||
"nodes_ready": "Zařízení připravena",
|
||||
"not_ready": "{count} není připraveno",
|
||||
"provisioned_devices": "Spravovaná zařízení",
|
||||
"server_url": "URL adresa serveru",
|
||||
"server_version": "Verze serveru"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -3330,7 +3477,7 @@
|
||||
"heal_network": {
|
||||
"healing_cancelled": "Uzdravení sítě bylo zrušeno.",
|
||||
"healing_complete": "Uzdravení sítě je dokončeno.",
|
||||
"healing_failed": "Uzdravení se nezdařilo. V protokolech mohou být k dispozici další informace.",
|
||||
"healing_failed": "Uzdravení se nezdařilo. V logách mohou být k dispozici další informace.",
|
||||
"in_progress": "Probíhá uzdravování sítě. Bude to chvíli trvat.",
|
||||
"introduction": "Zahajte v síti Z-Wave uzdravení sítě. Obnovení sítě způsobí, že všechna zařízení přepočítají své trasy zpět do řadiče, a je doporučeno, pokud jste nedávno přesunuli zařízení nebo váš ovladač.",
|
||||
"run_in_background": "Tento dialog můžete zavřít a uzdravování sítě bude pokračovat na pozadí.",
|
||||
@@ -3342,7 +3489,7 @@
|
||||
"heal_node": {
|
||||
"healing_complete": "{device} bylo uzdraveno.",
|
||||
"healing_failed": "{device} nemohlo být uzdraveno.",
|
||||
"healing_failed_check_logs": "Další informace mohou být k dispozici v protokolech.",
|
||||
"healing_failed_check_logs": "Další informace mohou být k dispozici v logách.",
|
||||
"in_progress": "Probíhá uzdravování {device}.",
|
||||
"introduction": "Požádejte {device}, aby aktualizoval své trasy zpět na řadič. To vám může pomoci s problémy s komunikací, pokud jste nedávno přesunuli zařízení nebo ovladač.",
|
||||
"network_heal_in_progress": "Uzdravení sítě Z-Wave již probíhá. Před léčením konkrétního zařízení počkejte, až se dokončí.",
|
||||
@@ -3351,13 +3498,14 @@
|
||||
"traffic_warning": "Proces uzdravování generuje v síti Z-Wave velké množství provozu. To může způsobit, že zařízení budou během léčení reagovat pomalu (nebo vůbec)."
|
||||
},
|
||||
"logs": {
|
||||
"log_level": "Úroveň protokolu",
|
||||
"log_level_changed": "Úroveň protokolu změněna na: {level}",
|
||||
"subscribed_to_logs": "Přihlášení k odběru zpráv protokolu Z-Wave JS…",
|
||||
"title": "Z-Wave JS protokoly"
|
||||
"download_logs": "Stáhnout logy",
|
||||
"log_level": "Úroveň logování",
|
||||
"log_level_changed": "Úroveň logování změněna na: {level}",
|
||||
"subscribed_to_logs": "Přihlášení k odběru zpráv logů Z-Wave JS…",
|
||||
"title": "Z-Wave JS logy"
|
||||
},
|
||||
"navigation": {
|
||||
"logs": "Protokoly",
|
||||
"logs": "Logy",
|
||||
"network": "Síť"
|
||||
},
|
||||
"network_status": {
|
||||
@@ -3385,11 +3533,20 @@
|
||||
"dead": "Mrtvý",
|
||||
"unknown": "Nezjištěno"
|
||||
},
|
||||
"provisioned": {
|
||||
"confirm_unprovision_text": "Pokud zrušíte správu zařízení, nebude přidáno do aplikace Home Assistant, když je zapnuté. Pokud je již přidán do Aplikace Home Assistant, odebrání spravovaného zařízení jej neodebere z Home Assistant.",
|
||||
"confirm_unprovision_title": "Opravdu chcete zrušit správu zařízení?",
|
||||
"dsk": "DSK",
|
||||
"included": "Zahrnuto",
|
||||
"not_included": "Nezahrnuto",
|
||||
"security_classes": "Bezpečnostní třídy",
|
||||
"unprovison": "Nespravovat"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "Před opakovaným představením je třeba probudit zařízení napájená z baterie. Pokyny k probuzení zařízení naleznete v příručce k zařízení.",
|
||||
"in_progress": "Zařízení je dotazováno. To může nějakou dobu trvat.",
|
||||
"interview_complete": "Představení zařízení dokončeno.",
|
||||
"interview_failed": "Dotazování zařízení se nezdařilo. Další informace mohou být k dispozici v protokolech.",
|
||||
"interview_failed": "Dotazování zařízení se nezdařilo. Další informace mohou být k dispozici v logách.",
|
||||
"introduction": "Znovu vyzpovídejte zařízení ve vaší Z-Wave síti. Tuto funkci použijte, pokud zařízení obsahuje chybějící nebo nesprávné funkce.",
|
||||
"run_in_background": "Toto dialogové okno můžete zavřít a představení bude pokračovat na pozadí.",
|
||||
"start_reinterview": "Znovu představit zařízení",
|
||||
@@ -3406,7 +3563,7 @@
|
||||
"remove_node": {
|
||||
"cancel_exclusion": "Zrušit vyloučení",
|
||||
"controller_in_exclusion_mode": "Kontroler Z-Wave je nyní v režimu vyloučení.",
|
||||
"exclusion_failed": "Zařízení nelze odstranit. Další informace najdete v protokolech.",
|
||||
"exclusion_failed": "Zařízení nelze odstranit. Další informace najdete v logách.",
|
||||
"exclusion_finished": "Zařízení {id} bylo odebráno z vaší sítě Z-Wave.",
|
||||
"follow_device_instructions": "Postupujte podle pokynů dodanéch se zařízením a aktivujte vyloučení na zařízení.",
|
||||
"introduction": "Odeberte zařízení ze sítě Z-Wave a odeberte přidružená zařízení a entity z Home Assistant.",
|
||||
@@ -3599,7 +3756,8 @@
|
||||
"grid": "Síť",
|
||||
"home": "Domov",
|
||||
"non_fossil": "Nefosilní",
|
||||
"solar": "Solární"
|
||||
"solar": "Solární",
|
||||
"title_today": "Dnešní distribuce energie"
|
||||
},
|
||||
"energy_solar_graph": {
|
||||
"forecast": "Předpověď {name}",
|
||||
@@ -3643,7 +3801,7 @@
|
||||
"never_triggered": "Nikdy nespuštěno"
|
||||
},
|
||||
"iframe": {
|
||||
"error_secure_context": "Nelze načíst iframe směřující na webové stránky používající {cílový_protokol}, pokud je Home Assistant obsluhován přes {kontextový_protokol}."
|
||||
"error_secure_context": "Nelze načíst iframe směřující na webové stránky používající {target_protocol}, pokud je Home Assistant obsluhován přes {context_protocol}."
|
||||
},
|
||||
"map": {
|
||||
"reset_focus": "Obnovit zaostření"
|
||||
@@ -3658,7 +3816,7 @@
|
||||
"url": "Otevřít okno adresy {url_path}"
|
||||
},
|
||||
"safe-mode": {
|
||||
"description": "Home Assistant se při načítání konfigurace setkal s problémy a nyní běží v nouzovém režimu. Podívejte se do protokolu chyb a zjistěte, co se pokazilo.",
|
||||
"description": "Home Assistant se při načítání konfigurace setkal s problémy a nyní běží v nouzovém režimu. Podívejte se do logu chyb a zjistěte, co se pokazilo.",
|
||||
"header": "Nouzový režim aktivován"
|
||||
},
|
||||
"shopping-list": {
|
||||
@@ -3708,9 +3866,14 @@
|
||||
"card": {
|
||||
"alarm-panel": {
|
||||
"available_states": "Dostupné režimy",
|
||||
"description": "Karta Ovládací panel alarmu umožňuje aktivovat či deaktivovat alarm integrací zabezpečovacích systémů.",
|
||||
"description": "Karta Ovládací panel alarmu umožňuje aktivovat či deaktivovat alarm integrovaných zabezpečovacích systémů.",
|
||||
"name": "Ovládací panel alarmu"
|
||||
},
|
||||
"area": {
|
||||
"description": "Karta Oblast automaticky zobrazuje entity konkrétní oblasti.",
|
||||
"name": "Oblast",
|
||||
"show_camera": "Zobrazit obraz z kamery místo obrázku oblasti"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "Výchozí akce závisí na vlastnostech entity - bude buď přepnuta, nebo se zobrazí další informace.",
|
||||
"description": "Karta Tlačítko umožňuje přidat tlačítka k provádění úkolů.",
|
||||
@@ -3912,7 +4075,14 @@
|
||||
},
|
||||
"statistics-graph": {
|
||||
"description": "Karta Statistický graf umožňuje zobrazit graf statistik pro každou z uvedených entit.",
|
||||
"name": "Statistický graf"
|
||||
"name": "Statistický graf",
|
||||
"period": "Období",
|
||||
"periods": {
|
||||
"5minute": "5 minut",
|
||||
"day": "Den",
|
||||
"hour": "Hodina",
|
||||
"month": "Měsíc"
|
||||
}
|
||||
},
|
||||
"thermostat": {
|
||||
"description": "Karta Termostat poskytuje kontrolu nad vaší klimatickou entitou. Umožňuje změnit teplotu a režim entity.",
|
||||
@@ -4085,7 +4255,7 @@
|
||||
"menu": {
|
||||
"close": "Zavřít",
|
||||
"configure_ui": "Upravit ovládací panel",
|
||||
"exit_edit_mode": "Ukončit režim úprav uživatelského rozhraní",
|
||||
"exit_edit_mode": "Hotovo",
|
||||
"help": "Nápověda",
|
||||
"reload_resources": "Nově načíst zdroje",
|
||||
"start_conversation": "Zahájit konverzaci"
|
||||
|
@@ -82,6 +82,7 @@
|
||||
"armed_custom_bypass": "Tilkoblet",
|
||||
"armed_home": "Tilkoblet",
|
||||
"armed_night": "Tilkoblet",
|
||||
"armed_vacation": "Tilkoblet",
|
||||
"arming": "Tilkobler",
|
||||
"disarmed": "Frakoblet",
|
||||
"disarming": "Frakob",
|
||||
@@ -242,8 +243,8 @@
|
||||
},
|
||||
"protection_mode": {
|
||||
"content": "Beskyttelsestilstand på dette tilføjelsesprogram er deaktiveret! Dette giver tilføjelsesprogrammet fuld adgang til hele systemet, hvilket medfører sikkerhedsrisici og kan beskadige dit system. Deaktiver kun beskyttelsestilstanden, hvis du kender, har brug for og har tillid til udvikleren bag dette tilføjelsesprogram.",
|
||||
"enable": "Aktivér beskyttelsestilstand",
|
||||
"title": "Advarsel: Beskyttelsestilstand er deaktiveret!"
|
||||
"enable": "Aktivér",
|
||||
"title": "Beskyttelsestilstand er deaktiveret!"
|
||||
},
|
||||
"ram_usage": "Tilføjelsesprogrammets forbrug af RAM",
|
||||
"rebuild": "genopbyg",
|
||||
@@ -275,28 +276,29 @@
|
||||
},
|
||||
"backup": {
|
||||
"addons": "Tilføjelsesprogrammer",
|
||||
"confirm_password": "Bekræft backup kodeord",
|
||||
"could_not_create": "Kunne ikke oprette backup",
|
||||
"confirm_password": "Bekræft adgangskode til sikkerhedskopi",
|
||||
"could_not_create": "Kunne ikke oprette sikkerhedskopi",
|
||||
"create": "Opret",
|
||||
"create_backup": "Opret sikkerhedskopi",
|
||||
"create_blocked_not_running": "Det er ikke muligt at oprette et backup lige nu, fordi systemet er i tilstanden {state}.",
|
||||
"create_blocked_not_running": "Det er ikke muligt at oprette en sikkerhedskopi lige nu, fordi systemet er i tilstanden {state}.",
|
||||
"created": "Oprettet",
|
||||
"delete_backup_confirm": "Slet",
|
||||
"delete_backup_text": "Vil du slette {number} {number, plural,\n one {sikkerhedskopi}\n other {sikkerhedskopier}\n}?",
|
||||
"delete_backup_title": "Slet sikkerhedskopi",
|
||||
"delete_selected": "Slet valgte backups",
|
||||
"enter_password": "Venligst indtast et kodeord.",
|
||||
"delete_selected": "Slet valgte sikkerhedskopier",
|
||||
"enter_password": "Angiv en adgangskode.",
|
||||
"failed_to_delete": "Kunne ikke slette",
|
||||
"folders": "Mapper",
|
||||
"full_backup": "Fuld sikkerhedskopiering",
|
||||
"name": "Navn",
|
||||
"name": "Navn på sikkerhedskopi",
|
||||
"no_backups": "Du har ingen sikkerhedskopier endnu.",
|
||||
"partial_backup": "Delvis sikkerhedskopiering",
|
||||
"password": "Kodeord",
|
||||
"password_protection": "Kodeordsbeskyttelse",
|
||||
"passwords_not_matching": "Kodeordene er forskellige",
|
||||
"password": "Adgangskode til sikkerhedskopi",
|
||||
"password_protection": "Adgangskodebeskyttelse",
|
||||
"passwords_not_matching": "Adgangskoderne stemmer ikke overens",
|
||||
"select_type": "Vælg, hvad der skal gendannes",
|
||||
"selected": "{number} valgt",
|
||||
"type": "Type",
|
||||
"type": "Sikkerhedskopitype",
|
||||
"upload_backup": "Overfør sikkerhedskopi"
|
||||
},
|
||||
"common": {
|
||||
@@ -321,8 +323,10 @@
|
||||
"reset_options": "Nulstil indstillinger",
|
||||
"restart": "Genstart",
|
||||
"restart_name": "Genstart {name}",
|
||||
"review": "gennemgå",
|
||||
"running_version": "Du bruger pt. version {version}",
|
||||
"save": "Gem",
|
||||
"show": "vis",
|
||||
"show_more": "Vis flere oplysninger om dette",
|
||||
"update": "Opdater",
|
||||
"update_available": "{count, plural,\n one {opdatering}\n other {{count} opdateringer}\n} afventer",
|
||||
@@ -352,6 +356,14 @@
|
||||
},
|
||||
"dialog": {
|
||||
"datadisk_move": {
|
||||
"cancel": "Annuller",
|
||||
"description": "Du bruger i øjeblikket ''{current_path}'' som datadisk. Flytning af datadiske vil genstarte din enhed, og det anslås at tage {time} minutter. Din Home Assistant-installation vil ikke være tilgængelig i denne periode. Afbryd ikke strømmen under flytningen!",
|
||||
"loading_devices": "Indlæser enheder",
|
||||
"move": "Flyt",
|
||||
"moving": "Flytter datadisk",
|
||||
"moving_desc": "Genstarter og flytter datadisk. Vent venligst.",
|
||||
"no_devices": "Ingen passende tilsluttede enheder fundet",
|
||||
"select_device": "Vælg ny datadisk",
|
||||
"title": "Flyt datadisk"
|
||||
},
|
||||
"hardware": {
|
||||
@@ -385,7 +397,7 @@
|
||||
"failed_to_add": "Fejl under tilføjelse af registry",
|
||||
"failed_to_remove": "fejlede i at fjerne registret",
|
||||
"no_registries": "Ingen registries er konfigurerede",
|
||||
"password": "Kodeord",
|
||||
"password": "Adgangskode",
|
||||
"registry": "Registreringsdatabasen",
|
||||
"remove": "Fjern",
|
||||
"title_add": "Tilføj nyt containerregister",
|
||||
@@ -395,7 +407,8 @@
|
||||
"repositories": {
|
||||
"add": "Tilføj",
|
||||
"remove": "Fjern",
|
||||
"title": "Administrer tilføjelsesregistre"
|
||||
"title": "Administrer tilføjelsesregistre",
|
||||
"used": "Repository er i brug til installerede tilføjelsesprogrammer og kan ikke fjernes."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Genstart tilføjelsesprogrammet",
|
||||
@@ -418,6 +431,7 @@
|
||||
"not_supported": "Denne omdirigering understøttes ikke af din Home Assistant installation. Kontroller {link} for de understøttede omdirigeringer og den version, de blev introduceret i."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Tilføjelsesprogrammer",
|
||||
"backups": "Sikkerhedskopier",
|
||||
"dashboard": "Betjeningspanel",
|
||||
"store": "Butik for tilføjelsesprogrammer",
|
||||
@@ -435,7 +449,7 @@
|
||||
"ram_usage": "Core RAM-forbrug"
|
||||
},
|
||||
"host": {
|
||||
"change": "Ændre",
|
||||
"change": "Ændr",
|
||||
"change_hostname": "Skift værtsnavn",
|
||||
"confirm_reboot": "Er du sikker på, at du vil genstarte værten?",
|
||||
"confirm_shutdown": "Er du sikker på, at du vil lukke værten ned?",
|
||||
@@ -444,6 +458,7 @@
|
||||
"emmc_lifetime_used": "Anvendt eMMC-levetid",
|
||||
"failed_to_get_hardware_list": "Hardwarelisten kunne ikke hentes",
|
||||
"failed_to_import_from_usb": "Import fra USB mislykkedes",
|
||||
"failed_to_move": "Datadisken kunne ikke flyttes",
|
||||
"failed_to_reboot": "Genstart af vært mislykkedes",
|
||||
"failed_to_set_hostname": "Indstilling af værtsnavn mislykkedes",
|
||||
"failed_to_shutdown": "Nedlukning af vært mislykkedes",
|
||||
@@ -497,6 +512,7 @@
|
||||
"apparmor": "AppArmor er ikke aktiveret på værten",
|
||||
"container": "Containere, der erfaringsmæssigt giver problemer",
|
||||
"content-trust": "Validering af indholds-tillid er deaktiveret",
|
||||
"content_trust": "Indholdstillidsvalidering er deaktiveret",
|
||||
"dbus": "DBUS",
|
||||
"docker_configuration": "Konfiguration af Docker",
|
||||
"docker_version": "Docker version",
|
||||
@@ -504,14 +520,26 @@
|
||||
"lxc": "LXC",
|
||||
"network_manager": "Netværksadministrator",
|
||||
"os": "Operativsystem",
|
||||
"os_agent": "OS-agent",
|
||||
"privileged": "Supervisor er ikke privilegeret",
|
||||
"software": "Ikke-understøttet software fundet",
|
||||
"source_mods": "Kildeændringer",
|
||||
"systemd": "Systemd"
|
||||
},
|
||||
"unsupported_title": "Du anvender en ikke-understøttet installation",
|
||||
"update_supervisor": "Opdater Supervisor",
|
||||
"warning": "ADVARSEL"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"core_note": "Supervisor vil rulle tilbage til version {version} hvis din instans ikke startes korrekt efter opdateringen.",
|
||||
"create_backup": "Opret sikkerhedskopi før opdatering",
|
||||
"creating_backup": "Opretter sikkerhedskopi af {name}",
|
||||
"description": "{version} er installeret. Klik på Opdater for at opdatere til version {newest_version}",
|
||||
"no_update": "Der er ingen tilgængelige opdateringer for {name}",
|
||||
"open_release_notes": "Åbn udgivelsesnoter",
|
||||
"update_name": "Opdater {name}",
|
||||
"updating": "Opdaterer {name} til version {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -526,10 +554,14 @@
|
||||
"arm_custom_bypass": "Brugerdefineret bypass",
|
||||
"arm_home": "Tilkobl hjemme",
|
||||
"arm_night": "Tilkoblet nat",
|
||||
"arm_vacation": "Tilkobl ferie",
|
||||
"clear_code": "Ryd",
|
||||
"code": "Kode",
|
||||
"disarm": "Frakobl"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "Område ikke fundet."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Senest udløst",
|
||||
"trigger": "Udfør"
|
||||
@@ -600,10 +632,16 @@
|
||||
},
|
||||
"media_player": {
|
||||
"browse_media": "Gennemse medier",
|
||||
"media_next_track": "Næste",
|
||||
"media_next_track": "Næste nummer",
|
||||
"media_pause": "Pause",
|
||||
"media_play": "Afspil",
|
||||
"media_play_pause": "Afspil/pause",
|
||||
"media_previous_track": "Forrige",
|
||||
"media_previous_track": "Forrige nummer",
|
||||
"media_stop": "Stop",
|
||||
"media_volume_down": "Lydstyrke ned",
|
||||
"media_volume_mute": "Slå lyden fra",
|
||||
"media_volume_unmute": "Slå lyden til",
|
||||
"media_volume_up": "Lydstyrke op",
|
||||
"sound_mode": "Lydtilstand",
|
||||
"source": "Kilde",
|
||||
"text_to_speak": "Tekst til tale",
|
||||
@@ -711,6 +749,7 @@
|
||||
"save": "Gem",
|
||||
"skip": "Spring over",
|
||||
"stay": "Bliv",
|
||||
"submit": "Indsend",
|
||||
"successfully_deleted": "Slettet",
|
||||
"successfully_saved": "Gemt",
|
||||
"undo": "Fortryd",
|
||||
@@ -725,7 +764,7 @@
|
||||
"title": "Fejl ved indlæsning af tilføjelsesprogrammer"
|
||||
},
|
||||
"no_supervisor": {
|
||||
"description": "Ingen supervisor blev fundet, så tilføjelsesprogrammer kunne ikke indlæses.",
|
||||
"description": "Tilføjelsesprogrammer understøttes ikke.",
|
||||
"title": "Supervisor blev ikke fundet"
|
||||
}
|
||||
}
|
||||
@@ -805,12 +844,14 @@
|
||||
"logbook": {
|
||||
"by": "af",
|
||||
"by_service": "efter tjeneste",
|
||||
"entries_not_found": "Der blev ikke fundet nogen logbogsregistreringer.",
|
||||
"entries_not_found": "Der blev ikke fundet nogen logbogshændelser.",
|
||||
"messages": {
|
||||
"became_unavailable": "blev utilgængelig",
|
||||
"changed_to_state": "ændret til {state}",
|
||||
"cleared_device_class": "ingen {device_class} registreret",
|
||||
"cleared_tampering": "manipulation ikke registreret",
|
||||
"detected_device_class": "registreret {device_class}",
|
||||
"detected_tampering": "registrerede manipulation",
|
||||
"is_closing": "lukker",
|
||||
"is_opening": "åbner",
|
||||
"rose": "stod op",
|
||||
@@ -833,7 +874,7 @@
|
||||
"was_unplugged": "blev frakoblet strøm",
|
||||
"was_unsafe": "blev usikker"
|
||||
},
|
||||
"retrieval_error": "Fejl under indlæsning af logbogsregistreringer",
|
||||
"retrieval_error": "Logbogen kunne ikke indlæses",
|
||||
"show_trace": "Vis sporing"
|
||||
},
|
||||
"media-browser": {
|
||||
@@ -883,7 +924,15 @@
|
||||
"label": "Billede",
|
||||
"unsupported_format": "Ikke-understøttet format, vælg venligst et JPEG-, PNG- eller GIF-billede."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"enter_qr_code": "Indtast QR-kodeværdi",
|
||||
"manual_input": "Du kan scanne QR-koden med en anden QR-scanner og indsætte koden i input-feltet nedenfor",
|
||||
"not_supported": "Din browser understøtter ikke QR-scanning.",
|
||||
"only_https_supported": "Du kan kun bruge dit kamera til at scanne en QR-kode, når du bruger HTTPS.",
|
||||
"select_camera": "Vælg kamera"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Filter",
|
||||
"filter_by_area": "Filtrer efter område",
|
||||
"filter_by_device": "Filtrer efter enhed",
|
||||
"filter_by_entity": "Filtrer efter entitet",
|
||||
@@ -958,8 +1007,10 @@
|
||||
"add_area_id": "Vælg område",
|
||||
"add_device_id": "Vælg enhed",
|
||||
"add_entity_id": "Vælg entitet",
|
||||
"expand_area_id": "Udvid dette område i de separate enheder og entiteter, det indeholder. Efter udvidelsen opdateres enhederne og entiteterne ikke, når området ændres.",
|
||||
"expand_device_id": "Udvid denne enhed i separate entiteter. Efter udvidelsen vil den ikke opdatere entiteterne når enheden ændres.",
|
||||
"expand": "Udvid",
|
||||
"expand_area_id": "Opdel dette område i separate enheder og entiteter.",
|
||||
"expand_device_id": "Opdel denne enhed i separate entiteter.",
|
||||
"remove": "Fjern",
|
||||
"remove_area_id": "Fjern område",
|
||||
"remove_device_id": "Fjern enhed",
|
||||
"remove_entity_id": "Fjern entitet"
|
||||
@@ -992,9 +1043,23 @@
|
||||
"advanced": "Avancerede indstillinger",
|
||||
"area": "Angiv entitetsomåde",
|
||||
"area_note": "Som standard er entiteterne på en enhed i samme område som enheden. Hvis du ændrer området for denne entitet, følger den ikke længere enhedens område.",
|
||||
"change_device_area": "Ændre enhedsområde",
|
||||
"confirm_delete": "Er du sikker på, at du vil slette denne post?",
|
||||
"change_device_area": "Ændr enhedsområde",
|
||||
"confirm_delete": "Er du sikker på, at du vil slette denne entitet?",
|
||||
"delete": "Slet",
|
||||
"device_class": "Vis som",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Dør",
|
||||
"garage_door": "Garageport",
|
||||
"opening": "Anden",
|
||||
"window": "Vindue"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Dør",
|
||||
"garage": "Garageport",
|
||||
"window": "Vindue"
|
||||
}
|
||||
},
|
||||
"device_disabled": "Denne entitets enheden er deaktiveret.",
|
||||
"enabled_cause": "Deaktiveret af {cause}.",
|
||||
"enabled_delay_confirm": "De aktiverede entiteter vil blive tilføjet til Home Assistant om {delay} sekunder",
|
||||
@@ -1008,12 +1073,12 @@
|
||||
"name": "Navn",
|
||||
"note": "Bemærk: Alle integrationer virker muligvis ikke med endnu.",
|
||||
"open_device_settings": "Åbn enhedsindstillinger",
|
||||
"unavailable": "Denne entitet er ikke tilgængelig i øjeblikket.",
|
||||
"unavailable": "Denne entitet er ikke tilgængelig.",
|
||||
"update": "Opdater"
|
||||
},
|
||||
"faq": "dokumentation",
|
||||
"info_customize": "Du kan overskrive nogle attributter i afsnittet {customize_link}.",
|
||||
"no_unique_id": "Denne entitet (\" {entity_id} \") har ikke et unikt id, og dens indstillinger kan derfor ikke administreres fra brugergrænsefladen. Se {faq_link} for flere detaljer.",
|
||||
"no_unique_id": "Denne entitet (\" {entity_id} \") har ikke et unikt id, og dens indstillinger kan derfor ikke administreres fra brugerfladen. Se {faq_link} for flere detaljer.",
|
||||
"related": "Relaterede",
|
||||
"settings": "Indstillinger"
|
||||
},
|
||||
@@ -1078,9 +1143,10 @@
|
||||
"cover": {
|
||||
"close_cover": "Luk cover",
|
||||
"close_tile_cover": "Luk cover vippeposition",
|
||||
"close_tilt_cover": "Luk cover vippeposition",
|
||||
"open_cover": "Åbn cover",
|
||||
"open_tilt_cover": "Luk cover vippeposition",
|
||||
"stop_cover": "Stop cover fra bevægelse"
|
||||
"stop_cover": "Stop cover"
|
||||
},
|
||||
"details": "Detaljer",
|
||||
"dismiss": "Afvis dialog",
|
||||
@@ -1274,7 +1340,7 @@
|
||||
"heading": "Omkonfigurering af enhed",
|
||||
"in_progress": "Enheden rekonfigureres. Dette kan tage noget tid",
|
||||
"introduction": "Konfigurer en enhed på dit Zigbee netværk. Brug denne mulighed hvos din enhed ikke virker korrekt",
|
||||
"min_max_change": "Min/maks/ændre",
|
||||
"min_max_change": "min/maks/ændring",
|
||||
"reporting_header": "Rapportering",
|
||||
"run_in_background": "Du kan lukke denne dialogboks.Konfigurationen fortsætter i baggrunden",
|
||||
"start_reconfiguration": "Start konfiguration"
|
||||
@@ -1290,12 +1356,13 @@
|
||||
"errors": {
|
||||
"config": {
|
||||
"edit_in_yaml_supported": "Du kan stadig redigere din konfiguration i YAML.",
|
||||
"editor_not_available": "Ingen visuel editor tilgængelig for typen \" {type} \".",
|
||||
"editor_not_available": "Ingen visuel editor tilgængelig for typen \"{type}\".",
|
||||
"editor_not_supported": "Visuel editor understøttes ikke til denne konfiguration",
|
||||
"error_detected": "Der blev fundet konfigurationsfejl",
|
||||
"key_missing": "Påkrævede nøgle \"{key}\" mangler.",
|
||||
"key_missing": "Påkrævet nøgle \"{key}\" mangler.",
|
||||
"key_not_expected": "Nøglen \"{key}\" er ikke forventet eller understøttes ikke af den visuelle editor.",
|
||||
"key_wrong_type": "Den angivne værdi for \"{key}\" understøttes ikke af den visuelle editor. Vi understøtter ( {type_correct} ) men modtog ( {type_wrong} ).",
|
||||
"key_wrong_type": "Den angivne værdi for \"{key}\" understøttes ikke af den visuelle editor. Vi understøtter ({type_correct}) men modtog ({type_wrong}).",
|
||||
"no_state_array_support": "Flere tilstandsværdier understøttes ikke i visuel editor",
|
||||
"no_template_editor_support": "Skabeloner understøttes ikke i visuel editor",
|
||||
"no_type_provided": "Der er ikke angivet nogen type."
|
||||
},
|
||||
@@ -1337,6 +1404,7 @@
|
||||
"link_profile_page": "din profilside"
|
||||
},
|
||||
"areas": {
|
||||
"add_picture": "Tilføj et billede",
|
||||
"caption": "Områder",
|
||||
"data_table": {
|
||||
"area": "Område",
|
||||
@@ -1348,6 +1416,7 @@
|
||||
"confirmation_title": "Er du sikker på, at du vil slette dette område?"
|
||||
},
|
||||
"description": "Tilknyt enheder og entiteter til områder",
|
||||
"edit_settings": "Områdeindstillinger",
|
||||
"editor": {
|
||||
"area_id": "Område-id",
|
||||
"create": "Opret",
|
||||
@@ -1379,6 +1448,7 @@
|
||||
"header": "Opret en ny automatisering",
|
||||
"how": "Hvordan vil du oprette din nye automatisering?",
|
||||
"start_empty": "Start med en tom automatisering",
|
||||
"start_empty_description": "Opret en ny automatisering fra bunden",
|
||||
"thingtalk": {
|
||||
"create": "Opret",
|
||||
"header": "Beskriv automationen du vil lave",
|
||||
@@ -1410,8 +1480,8 @@
|
||||
"label": "Betingelse"
|
||||
},
|
||||
"delay": {
|
||||
"delay": "Forsinkelse",
|
||||
"label": "Forsinkelse"
|
||||
"delay": "Varighed",
|
||||
"label": "Vent på, at tiden er gået (forsinkelse)"
|
||||
},
|
||||
"device_id": {
|
||||
"action": "Handling",
|
||||
@@ -1606,7 +1676,7 @@
|
||||
"extra_fields": {
|
||||
"above": "Over",
|
||||
"below": "Under",
|
||||
"for": "Varighed",
|
||||
"for": "Varighed (valgfrit)",
|
||||
"zone": "Zone"
|
||||
},
|
||||
"label": "Enhed",
|
||||
@@ -1623,7 +1693,7 @@
|
||||
"geo_location": {
|
||||
"enter": "Ankommer",
|
||||
"event": "Hændelse:",
|
||||
"label": "Geolokation",
|
||||
"label": "Geolokalitet",
|
||||
"leave": "Forlad",
|
||||
"source": "Kilde",
|
||||
"zone": "Zone"
|
||||
@@ -1647,10 +1717,10 @@
|
||||
},
|
||||
"state": {
|
||||
"attribute": "Attribut (valgfri)",
|
||||
"for": "Varighed",
|
||||
"from": "Fra",
|
||||
"for": "Varighed (valgfrit)",
|
||||
"from": "Fra (valgfrit)",
|
||||
"label": "Tilstand",
|
||||
"to": "Til"
|
||||
"to": "Til (valgfrit)"
|
||||
},
|
||||
"sun": {
|
||||
"event": "Hændelse:",
|
||||
@@ -1731,6 +1801,13 @@
|
||||
"introduction": "Skriv nedenfor, hvad denne automation skal gøre, og vi vil forsøge at konvertere den til en Home Assistant automation.",
|
||||
"language_note": "Bemærk: Kun engelsk understøttes indtil videre."
|
||||
}
|
||||
},
|
||||
"trace": {
|
||||
"download_trace": "Download sporing",
|
||||
"edit_automation": "Rediger automatisering",
|
||||
"newer_trace": "Nyere sporing",
|
||||
"older_trace": "Tidligere sporing",
|
||||
"refresh": "Opdater"
|
||||
}
|
||||
},
|
||||
"blueprint": {
|
||||
@@ -1766,7 +1843,7 @@
|
||||
"name": "Navn",
|
||||
"type": "Type"
|
||||
},
|
||||
"introduction": "Blueprint konfigurationen giver dig mulighed for at importere og administrere dine blueprints.",
|
||||
"introduction": "Blueprint-konfigurationen giver dig mulighed for at importere og administrere dine blueprints.",
|
||||
"learn_more": "Lær mere om brugen af blueprints",
|
||||
"share_blueprint": "Del blueprint",
|
||||
"share_blueprint_no_url": "Kan ikke dele blueprint: ingen kilde-url",
|
||||
@@ -1831,7 +1908,7 @@
|
||||
"instance_will_be_available": "Din instans vil være tilgængelig på",
|
||||
"link_learn_how_it_works": "Lær hvordan det fungerer",
|
||||
"not_connected": "Ikke tilsluttet",
|
||||
"reconnecting": "Tilslutter igen",
|
||||
"reconnecting": "Ikke tilsluttet. Forsøger at genoprette forbindelsen.",
|
||||
"remote_enabled": {
|
||||
"caption": "Forbind automatisk",
|
||||
"description": "Slå denne indstilling til for at sikre din Home Assistant applikation er tilgængelig udefra "
|
||||
@@ -1935,7 +2012,7 @@
|
||||
"forgot_password": "Glemt adgangskode?",
|
||||
"introduction": "Home Assistant Cloud giver dig en sikker fjernforbindelse til din instans, når du er væk fra hjemmet. Det giver dig også mulighed for at oprette forbindelse til cloud-tjenesterne: Amazon Alexa og Google Assistant.",
|
||||
"introduction2": "Denne tjeneste drives af vores partner",
|
||||
"introduction2a": ", et selskab grundlagt af grundlæggerne af Home Assistant og Hass.io.",
|
||||
"introduction2a": ", et selskab grundlagt af grundlæggerne af Home Assistant.",
|
||||
"introduction3": "Home Assistant Cloud er en abonnementstjeneste med en gratis prøveperiode på en måned. Ingen betalingsoplysninger nødvendige.",
|
||||
"learn_more_link": "Lær mere om Home Assistant Cloud",
|
||||
"password": "Adgangskode",
|
||||
@@ -1958,7 +2035,7 @@
|
||||
"information": "Opret en konto for at starte din gratis prøveperiode på en måned med Home Assistant Cloud. Ingen betalingsoplysninger nødvendige.",
|
||||
"information2": "Prøveperioden giver dig adgang til alle fordelene ved Home Assistant Cloud, herunder:",
|
||||
"information3": "Denne tjeneste drives af vores partner",
|
||||
"information3a": ", et selskab grundlagt af grundlæggerne af Home Assistant og Hass.io.",
|
||||
"information3a": ", et selskab grundlagt af grundlæggerne af Home Assistant.",
|
||||
"information4": "Ved at registrere en konto, accepterer du følgende vilkår og betingelser.",
|
||||
"link_privacy_policy": "Fortrolighedspolitik",
|
||||
"link_terms_conditions": "Betingelser og vilkår",
|
||||
@@ -1977,7 +2054,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "Generelt",
|
||||
"description": "Ændre Home Assistants generelle konfiguration",
|
||||
"description": "Lokalitet, netværk og analyse",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -2000,7 +2077,7 @@
|
||||
"unit_system_metric": "Metriske"
|
||||
},
|
||||
"header": "Generel konfiguration",
|
||||
"introduction": "Ændring af din konfiguration kan være en trættende proces. Vi ved det. Dette afsnit vil forsøge at gøre dit liv en smule nemmere."
|
||||
"introduction": "Administrer din lokalitet, dit netværk og analyser."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2025,6 +2102,48 @@
|
||||
"not_applied": "Ændringer, der er foretaget her, er skrevet i den, men vil ikke blive anvendt efter en konfigurationsgenindlæsning, medmindre 'include' er på plads."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Administrer automatiseringer, scener, scripts og hjælpere",
|
||||
"title": "Automatiseringer og scener"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Automatiseringer og scripts, der er lavet på forhånd af fællesskabet",
|
||||
"title": "Blueprints"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Lokalitet og notifikationer",
|
||||
"title": "Companion App"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Opret tilpassede kortsæt til at styre dit hjem",
|
||||
"title": "Betjeningspaneler"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Integrationer, enheder, entiteter og områder",
|
||||
"title": "Enheder og tjenester"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Overvåg din energiproduktion og dit forbrug",
|
||||
"title": "Energi"
|
||||
},
|
||||
"people": {
|
||||
"description": "Administrer de personer og zoner, som Home Assistant følger",
|
||||
"title": "Personer og zoner"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Grundlæggende indstillinger, serverkontrolelementer, logfiler og oplysninger",
|
||||
"title": "Indstillinger"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Opret sikkerhedskopier, tjek logfiler eller genstart dit system",
|
||||
"title": "Tilføjelsesprogrammer, sikkerhedskopier og Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Udløs automatiseringer, når et NFC-tag, QR-kode osv. scannes",
|
||||
"title": "Tags"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "Intet {name} er blevet tilføjet ved hjælp af denne enhed endnu. Du kan tilføje et ved at klikke på + knappen ovenfor.",
|
||||
"automation": {
|
||||
@@ -2168,7 +2287,7 @@
|
||||
"energy_stat": "Forbrugt energi (m³)",
|
||||
"gas_usage": "Gasforbrug",
|
||||
"header": "Konfigurer gasforbrug",
|
||||
"m3_or_kWh": "m³ eller kWh",
|
||||
"m3_or_kWh": "ft³, m³, Wh, kWh eller MWh",
|
||||
"no_cost": "Spor ikke omkostninger",
|
||||
"paragraph": "Gasforbrug er den mængde gas du forbruger i hjemmet"
|
||||
},
|
||||
@@ -2285,7 +2404,7 @@
|
||||
"title": "Uventet måleenhed"
|
||||
},
|
||||
"entity_unexpected_unit_gas_price": {
|
||||
"description": "Følgende entiteter har ikke de forventede måleenheder ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/m³'' eller ''{currency}/ft³'':",
|
||||
"description": "Følgende enheder har ikke de forventede måleenheder ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/m³'' eller ''{currency}/ft³'':",
|
||||
"title": "Uventet måleenhed"
|
||||
},
|
||||
"recorder_untracked": {
|
||||
@@ -2320,6 +2439,7 @@
|
||||
"header": "Entiteter",
|
||||
"headers": {
|
||||
"area": "Område",
|
||||
"disabled_by": "Deaktiveret af",
|
||||
"entity_id": "Entitets-id",
|
||||
"integration": "Integration",
|
||||
"name": "Navn",
|
||||
@@ -2378,6 +2498,7 @@
|
||||
"built_using": "Bygget ved hjælp af",
|
||||
"caption": "Oplysninger",
|
||||
"copy_github": "Til GitHub",
|
||||
"copy_menu": "Kopier menu",
|
||||
"copy_raw": "Rå tekst",
|
||||
"custom_uis": "Tilpassede brugergrænseflader:",
|
||||
"description": "Version, systemtilstand og links til dokumentation",
|
||||
@@ -2409,7 +2530,7 @@
|
||||
"check_the_logs": "Kontroller logfilerne",
|
||||
"configure": "Konfigurer",
|
||||
"delete": "Slet",
|
||||
"delete_confirm": "Er du sikker på, at du vil fjerne denne integration?",
|
||||
"delete_confirm": "Er du sikker på, at du vil slette integrationen {title}?",
|
||||
"depends_on_cloud": "Afhængig af Cloud tjenester",
|
||||
"device_unavailable": "Enheden er utilgængelig",
|
||||
"devices": "{count} {count, plural,\n one {enhed}\n other {enheder}\n}",
|
||||
@@ -2431,6 +2552,7 @@
|
||||
"entities": "{count} {count, plural,\n one {entitet}\n other {entiteter}\n}",
|
||||
"entity_unavailable": "Entiteten er utilgængelig",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Hardware: {version}",
|
||||
"hub": "Forbundet via",
|
||||
"manuf": "af {manufacturer}",
|
||||
"no_area": "Intet område",
|
||||
@@ -2451,7 +2573,9 @@
|
||||
"setup_retry": "Forsøger konfigurationen igen"
|
||||
},
|
||||
"system_options": "Systemindstillinger",
|
||||
"unnamed_entry": "Unavngivet post"
|
||||
"unknown_via_device": "Ukendt enhed",
|
||||
"unnamed_entry": "Unavngivet post",
|
||||
"via": "Forbundet via"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Afbrudt",
|
||||
@@ -2520,6 +2644,7 @@
|
||||
"logs": {
|
||||
"caption": "Logs",
|
||||
"clear": "Ryd",
|
||||
"copy": "Kopiér logregistrering",
|
||||
"custom_integration": "brugerdefineret integration",
|
||||
"description": "Se logs for Home Assistant",
|
||||
"details": "Logdetaljer ({level})",
|
||||
@@ -2549,6 +2674,8 @@
|
||||
"yaml": "YAML-fil"
|
||||
},
|
||||
"confirm_delete": "Er du sikker på, at du vil slette dette betjeningspanel?",
|
||||
"confirm_delete_text": "Dit betjeningspanel slettes permanent.",
|
||||
"confirm_delete_title": "Slet {dashboard_title}?",
|
||||
"default_dashboard": "Dette er standardbetjeningspanelet",
|
||||
"detail": {
|
||||
"create": "Opret",
|
||||
@@ -2761,6 +2888,7 @@
|
||||
"link_integrations_page": "Integrationsside",
|
||||
"link_presence_detection_integrations": "Tilstedeværelsesdetektions-integrationer",
|
||||
"linked_user": "Tilknyttet bruger",
|
||||
"local_only": "Kan kun logge ind fra det lokale netværk",
|
||||
"name": "Navn",
|
||||
"name_error_msg": "Navn er påkrævet",
|
||||
"new_person": "Ny person",
|
||||
@@ -2779,6 +2907,7 @@
|
||||
"caption": "Scener",
|
||||
"description": "Administrer scener",
|
||||
"editor": {
|
||||
"area": "Område",
|
||||
"default_name": "Ny scene",
|
||||
"devices": {
|
||||
"add": "Tilføj en enhed",
|
||||
@@ -2874,7 +3003,7 @@
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Serveradministration",
|
||||
"description": "Genstart og stop Home Assistant-serveren",
|
||||
"description": "Validér og genstart Home Assistant-serveren",
|
||||
"section": {
|
||||
"reloading": {
|
||||
"automation": "Genindlæs automatiseringer",
|
||||
@@ -2907,6 +3036,7 @@
|
||||
"statistics": "Genindlæs statistik entiteter",
|
||||
"telegram": "Genindlæs Telegram notifikationstjenester",
|
||||
"template": "Genindlæs template entiteter",
|
||||
"timer": "Timere",
|
||||
"trend": "Genindlæs trend entiteter",
|
||||
"universal": "Genindlæs medieafspiller entiteter",
|
||||
"zone": "Genindlæs zoner"
|
||||
@@ -2915,7 +3045,7 @@
|
||||
"confirm_restart": "Er du sikker på, at du vil genstarte Home Assistant?",
|
||||
"confirm_stop": "Er du sikker på, at du vil stoppe Home Assistant?",
|
||||
"heading": "Serveradministration",
|
||||
"introduction": "Administrer din Home Assistant server...fra Home Assistant.",
|
||||
"introduction": "Administrer din Home Assistant.",
|
||||
"restart": "Genstart",
|
||||
"stop": "Stop"
|
||||
},
|
||||
@@ -2959,10 +3089,20 @@
|
||||
"no_tags": "Ingen tags",
|
||||
"write": "Skriv"
|
||||
},
|
||||
"updates": {
|
||||
"more_updates": "+ {count} opdateringer",
|
||||
"review": "gennemgå",
|
||||
"show": "vis",
|
||||
"show_all_updates": "Vis alle opdateringer",
|
||||
"title": "{count} {count, plural,\n one {opdatering}\n other {opdateringer}\n}",
|
||||
"unable_to_fetch": "Kan ikke indlæse opdateringer",
|
||||
"version_available": "Version {version_available} er tilgængelig"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Tilføj bruger",
|
||||
"create": "Opret",
|
||||
"local_only": "Kun lokalt",
|
||||
"password": "Adgangskode",
|
||||
"password_confirm": "Bekræft adgangskode",
|
||||
"password_not_match": "Adgangskoderne er ikke ens"
|
||||
@@ -2981,6 +3121,7 @@
|
||||
"delete_user": "Slet bruger",
|
||||
"group": "Gruppe",
|
||||
"id": "Id",
|
||||
"local_only": "Kan kun logge ind fra det lokale netværk",
|
||||
"name": "Navn",
|
||||
"new_password": "Ny Adgangskode",
|
||||
"owner": "Ejer",
|
||||
@@ -2998,6 +3139,7 @@
|
||||
"group": "Gruppe",
|
||||
"is_active": "Aktiv",
|
||||
"is_owner": "Ejer",
|
||||
"local": "Kun lokalt",
|
||||
"name": "Navn",
|
||||
"system": "Systemgenereret",
|
||||
"username": "Brugernavn"
|
||||
@@ -3141,6 +3283,10 @@
|
||||
"ozw": {
|
||||
"header": "Migrer til OpenZWave",
|
||||
"introduction": "Denne guide hjælper dig med at migrere fra den tidligere Z-Wave-integration til OpenZWave-integrationen, der i øjeblikket er i betaversion."
|
||||
},
|
||||
"zwave_js": {
|
||||
"header": "Migrer til Z-Wave JS",
|
||||
"introduction": "Denne integration vedligeholdes ikke længere, og vi anbefaler at migrere til den nye Z-Wave JS-integration. Denne guide hjælper dig med at migrere fra den ældre Z-Wave-integration til den nye Z-Wave JS-integration."
|
||||
}
|
||||
},
|
||||
"network_management": {
|
||||
@@ -3220,53 +3366,90 @@
|
||||
"zwave_js": {
|
||||
"add_node": {
|
||||
"cancel_inclusion": "Afbryd inklusionstilstand",
|
||||
"check_logs": "Kontroller logfilerne for at få flere oplysninger.",
|
||||
"choose_inclusion_strategy": "Hvordan vil du tilføje din enhed",
|
||||
"controller_in_inclusion_mode": "Din Z-Wave-controller er nu i inklusionstilstand.",
|
||||
"enter_qr_code": "Indtast QR-kodeværdi",
|
||||
"follow_device_instructions": "Følg instruktionerne, der fulgte med din enhed for at starte parring af enheden.",
|
||||
"inclusion_failed": "Noden kunne ikke tilføjes. Se i logfilerne for at få flere oplysninger.",
|
||||
"inclusion_finished": "Noden er blevet tilføjet. Det kan tage et par minutter før alle enheder dukker op, mens konfiguration af noden fuldføres.",
|
||||
"inclusion_failed": "Enheden kunne ikke tilføjes.",
|
||||
"inclusion_finished": "Enheden er blevet tilføjet.",
|
||||
"interview_failed": "Forespørgsel af enheden er mislykkedes. Der kan være yderligere oplysninger i logfilerne.",
|
||||
"interview_started": "Enheden forespørges. Dette kan tage noget tid.",
|
||||
"introduction": "Denne guide hjælper dig med at føje en node til dit Z-Wave-netværk.",
|
||||
"provisioning_finished": "Enheden er blevet tilføjet. Når du tænder for den, bliver den tilgængelig.",
|
||||
"qr_code": "QR kode",
|
||||
"qr_code_paragraph": "Hvis din enhed understøtter SmartStart, kan du scanne QR-koden for nem parring.",
|
||||
"scan_qr_code": "Scan QR-kode",
|
||||
"searching_device": "Søger efter enhed",
|
||||
"secure_inclusion_warning": "Sikre enheder kræver ekstra båndbredde. For mange sikre enheder kan gøre dit Z-Wave-netværk langsomt. Det anbefaler kun at bruge sikker inklusion til de enheder, hvor det er nødvendigt. For eksempel til låse eller garageportåbnere.",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
"description": "Eksempel: Ældre dørlåse uden S2-understøttelse",
|
||||
"title": "S0 Legacy"
|
||||
},
|
||||
"S2_AccessControl": {
|
||||
"description": "Eksempel: Dørlåse og garageporte",
|
||||
"title": "S2 Adgangskontrol"
|
||||
},
|
||||
"S2_Authenticated": {
|
||||
"description": "Eksempel: Lys, sensorer og sikkerhedssystemer",
|
||||
"title": "S2 Authenticated"
|
||||
},
|
||||
"S2_Unauthenticated": {
|
||||
"description": "Som S2 Authenticated, men uden bekræftelse på, at den korrekte enhed er inkluderet",
|
||||
"title": "S2 Unauthenticated"
|
||||
}
|
||||
},
|
||||
"select_camera": "Vælg kamera",
|
||||
"start_inclusion": "Start inklusionstilstand",
|
||||
"start_secure_inclusion": "Start sikker inklusionstilstand",
|
||||
"title": "Tilføj en Z-Wave-node",
|
||||
"title": "Tilføj en Z-Wave-enhed",
|
||||
"use_secure_inclusion": "Brug sikker inklusionstilstand",
|
||||
"view_device": "Vis enhed"
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Tilføj node",
|
||||
"add_node": "Tilføj enhed",
|
||||
"back": "Tilbage",
|
||||
"close": "Luk",
|
||||
"heal_network": "Helbred netværk",
|
||||
"home_id": "Hjem-id",
|
||||
"network": "Netværk",
|
||||
"node_id": "Node-id",
|
||||
"node_id": "Enheds-id",
|
||||
"reconfigure_server": "Konfigurer serveren igen",
|
||||
"remove_node": "Fjern node",
|
||||
"remove_node": "Fjern enhed",
|
||||
"source": "Kilde"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {enhed}\n other {enheder}\n}",
|
||||
"driver_version": "Driverversion",
|
||||
"dump_dead_nodes_text": "Nogle af dine noder svarede ikke og antages døde. De vil ikke blive eksporteret.",
|
||||
"dump_dead_nodes_title": "Nogle af dine noder er døde",
|
||||
"dump_debug": "Download et udtræk af dit netværk for at hjælpe med at diagnosticere problemer",
|
||||
"dump_dead_nodes_text": "Nogle af dine enheder svarede ikke og antages at være døde. De vil ikke blive eksporteret.",
|
||||
"dump_dead_nodes_title": "Nogle af dine enheder er døde",
|
||||
"dump_debug": "Download data",
|
||||
"dump_not_ready_confirm": "Hent",
|
||||
"dump_not_ready_text": "Hvis du opretter en eksport, når ikke alle noder er klar, kan du mangle nødvendige data i udtrækket. Vent på, at dit netværk søger på alle noder. Vil du fortsætte med eksporten?",
|
||||
"dump_not_ready_title": "Ikke alle noder er klar endnu",
|
||||
"dump_not_ready_text": "Hvis du opretter en eksport, mens ikke alle enheder er klar, kan du gå glip af nødvendige data. Giv netværket lidt tid til at forespørge på alle enheder. Vil du fortsætte med eksporten?",
|
||||
"dump_not_ready_title": "Ikke alle enheder er klar endnu",
|
||||
"header": "Administrer dit Z-Wave-netværk",
|
||||
"home_id": "Hjem-id",
|
||||
"introduction": "Administrer dit Z-Wave-netværk og Z-Wave-noder",
|
||||
"nodes_ready": "Noder er klar",
|
||||
"introduction": "Administrer dit Z-Wave-netværk og Z-Wave-enheder",
|
||||
"nodes_ready": "Enheder er klar",
|
||||
"not_ready": "{count} ikke klar",
|
||||
"provisioned_devices": "Tildelte enheder",
|
||||
"server_url": "Server-URL",
|
||||
"server_version": "Serverversion"
|
||||
},
|
||||
"device_info": {
|
||||
"device_config": "Konfigurer enhed",
|
||||
"heal_node": "Helbred knudepunkt",
|
||||
"node_ready": "Node klar",
|
||||
"node_status": "Nodestatus",
|
||||
"heal_node": "Helbred enhed",
|
||||
"highest_security": "Højeste sikkerhed",
|
||||
"is_secure": "Sikker",
|
||||
"node_ready": "Enhed klar",
|
||||
"node_status": "Enhedsstatus",
|
||||
"reinterview_device": "Gentag forespørgsel af en Z-Wave enhed",
|
||||
"remove_failed": "Fjern fejlbehæftet enhed",
|
||||
"zwave_info": "Z-Wave-info"
|
||||
"unknown": "Ukendt",
|
||||
"zwave_info": "Z-Wave-info",
|
||||
"zwave_plus": "Z-Wave Plus",
|
||||
"zwave_plus_version": "Version {version}"
|
||||
},
|
||||
"heal_network": {
|
||||
"healing_cancelled": "Netværkshelbredelsen er blevet afbrudt.",
|
||||
@@ -3292,9 +3475,10 @@
|
||||
"traffic_warning": "Helbredelsen medfører stor trafik på Z-Wave-netværket. Dette kan få enheder til at reagere langsomt (eller slet ikke), mens helbredelsen er i gang."
|
||||
},
|
||||
"logs": {
|
||||
"download_logs": "Download logfiler",
|
||||
"log_level": "Log niveau",
|
||||
"log_level_changed": "Logniveauet er ændret til: {level}",
|
||||
"subscribed_to_logs": "Abboner på Z-Wave JS Log beskeder",
|
||||
"subscribed_to_logs": "Abonnerer på Z-Wave JS-logbeskeder...",
|
||||
"title": "Z-Wave JS-logfiler"
|
||||
},
|
||||
"navigation": {
|
||||
@@ -3311,7 +3495,7 @@
|
||||
"battery_device_notice": "Batterienheder skal være tændt for at opdatere deres konfiguration. Se din enhedsmanual for instruktioner om, hvordan du tænder enheden.",
|
||||
"error_device_not_found": "Enhed blev ikke fundet",
|
||||
"header": "Konfiguration af Z-Wave-enhed",
|
||||
"introduction": "Administrer og juster enheds (node) specifikke konfigurationsparametre for den valgte enhed",
|
||||
"introduction": "Administrer og juster enhedsspecifikke konfigurationsparametre for den valgte enhed",
|
||||
"parameter": "Parameter",
|
||||
"parameter_is_read_only": "Denne parameter er skrivebeskyttet.",
|
||||
"set_param_accepted": "Parameteren er blevet opdateret.",
|
||||
@@ -3326,6 +3510,15 @@
|
||||
"dead": "Død",
|
||||
"unknown": "Ukendt"
|
||||
},
|
||||
"provisioned": {
|
||||
"confirm_unprovision_text": "Hvis du ophæver tildelingen af enheden, vil den ikke blive tilføjet til Home Assistant, når den tændes. Hvis den allerede er tilføjet til Home Assistant, fjernes den ikke fra Home Assistant, hvis du fjerner den tildelte enhed.",
|
||||
"confirm_unprovision_title": "Er du sikker på, at du vil fjerne tildelingen af enheden?",
|
||||
"dsk": "DSK",
|
||||
"included": "Inkluderet",
|
||||
"not_included": "Ikke inkluderet",
|
||||
"security_classes": "Sikkerhedsklasser",
|
||||
"unprovison": "Fjern tildeling"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "Du skal vække batteridrevne enheder, inden du starter forespørgslen. Se enhedens manual for instruktioner om, hvordan du vækker enheden.",
|
||||
"in_progress": "Enheden forespørges. Dette kan tage noget tid.",
|
||||
@@ -3340,19 +3533,40 @@
|
||||
"in_progress": "Fjernelse af enheden er i gang.",
|
||||
"introduction": "Fjern en fejlbehæftet enhed fra dit Z-Wave-netværk. Brug denne funktion, hvis du ikke kan udelukke en enhed normalt, fordi den er defekt.",
|
||||
"removal_failed": "Enheden kunne ikke fjernes fra dit Z-Wave-netværk.",
|
||||
"removal_finished": "Noden {id} er fjernet fra dit Z-Wave-netværk.",
|
||||
"removal_finished": "Enheden {id} er fjernet fra dit Z-Wave-netværk.",
|
||||
"remove_device": "Fjern enhed",
|
||||
"title": "Fjern en mislykket Z-Wave-enhed"
|
||||
},
|
||||
"remove_node": {
|
||||
"cancel_exclusion": "Annuller udelukkelse",
|
||||
"controller_in_exclusion_mode": "Din Z-Wave-controller er nu i eksklusionstilstand.",
|
||||
"exclusion_failed": "Noden kunne ikke fjernes. Se i logfilerne for at få flere oplysninger.",
|
||||
"exclusion_finished": "Node {id} er fjernet fra dit Z-Wave-netværk.",
|
||||
"exclusion_failed": "Enheden kunne ikke fjernes. Se i logfilerne for at få flere oplysninger.",
|
||||
"exclusion_finished": "Enhed {id} er fjernet fra dit Z-Wave-netværk.",
|
||||
"follow_device_instructions": "Følg de anvisninger, der fulgte med enheden, for at foretage eksklusion på enheden.",
|
||||
"introduction": "Fjern en node fra dit Z-Wave-netværk, og fjern den tilknyttede enhed og entiteter fra Home Assistant.",
|
||||
"introduction": "Fjern en enhed fra dit Z-Wave-netværk, og fjern den tilknyttede enhed og entiteter fra Home Assistant.",
|
||||
"start_exclusion": "Start udelukkelse",
|
||||
"title": "Fjern en Z-Wave-node"
|
||||
"title": "Fjern en Z-Wave-enhed"
|
||||
},
|
||||
"security_classes": {
|
||||
"None": {
|
||||
"title": "Ingen"
|
||||
},
|
||||
"S0_Legacy": {
|
||||
"description": "Eksempel: Ældre dørlåse uden S2-understøttelse",
|
||||
"title": "S0 Legacy"
|
||||
},
|
||||
"S2_AccessControl": {
|
||||
"description": "Eksempel: Dørlåse og garageporte",
|
||||
"title": "S2 Adgangskontrol"
|
||||
},
|
||||
"S2_Authenticated": {
|
||||
"description": "Eksempel: Lys, sensorer og sikkerhedssystemer",
|
||||
"title": "S2 Authenticated"
|
||||
},
|
||||
"S2_Unauthenticated": {
|
||||
"description": "Som S2 Authenticated, men uden bekræftelse på, at den korrekte enhed er inkluderet",
|
||||
"title": "S2 Unauthenticated"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -3424,10 +3638,23 @@
|
||||
"fix_issue": {
|
||||
"fix": "Løs problem",
|
||||
"units_changed": {
|
||||
"fix": "Løs problem"
|
||||
"clear": "Slet alle gamle statistiske data for denne entitet",
|
||||
"fix": "Løs problem",
|
||||
"title": "Enheden for denne entitet er ændret",
|
||||
"update": "Opdater de historiske statistiske værdier fra ''{metadata_unit}'' til ''{state_unit}''"
|
||||
}
|
||||
},
|
||||
"issue": "Problem",
|
||||
"issues": {
|
||||
"entity_no_longer_recorded": "Der registreres ikke længere historik for denne entitet.",
|
||||
"entity_not_recorded": "Der registreres ikke historik for denne entitet.",
|
||||
"no_state": "Der er ingen tilstand tilgængelig for denne entitet.",
|
||||
"units_changed": "Enheden for denne entitet blev ændret fra ''{metadata_unit}'' til ''{state_unit}''.",
|
||||
"unsupported_state_class": "Tilstandsklassen ''{state_class}'' for denne entitet understøttes ikke.",
|
||||
"unsupported_unit": "Enheden ('' {state_unit} '') for denne entitet matcher ikke en enhed af enhedsklassen '' {device_class} ''.",
|
||||
"unsupported_unit_metadata": "Enheden (''{metadata_unit}'') i den gemte historik matcher ikke den understøttede enhed ''{supported_unit}'' af enhedsklassen ''{device_class}''.",
|
||||
"unsupported_unit_state": "Enheden (''{state_unit}'') for denne entitet matcher ikke en enhed af enhedsklassen ''{device_class}''."
|
||||
},
|
||||
"no_issue": "Intet problem",
|
||||
"title": "Statistik"
|
||||
},
|
||||
@@ -3477,7 +3704,7 @@
|
||||
},
|
||||
"cards": {
|
||||
"actions": {
|
||||
"action_confirmation": "Er du sikker på, at du vil afvikle handlingen \" {action} \"?",
|
||||
"action_confirmation": "Er du sikker på, at du vil afvikle handlingen \"{action} \"?",
|
||||
"no_entity_more_info": "Der er ikke angivet en entitet til visning af dialogboksen med flere oplysninger",
|
||||
"no_entity_toggle": "Der er ikke angivet en entitet, som skal slås til/fra",
|
||||
"no_navigation_path": "Der er ikke angivet nogen navigationssti",
|
||||
@@ -3506,7 +3733,8 @@
|
||||
"grid": "Elnet",
|
||||
"home": "Hjem",
|
||||
"non_fossil": "Ikke-fossilt",
|
||||
"solar": "Sol"
|
||||
"solar": "Sol",
|
||||
"title_today": "Energidistribution i dag"
|
||||
},
|
||||
"energy_solar_graph": {
|
||||
"forecast": "Prognose {name}",
|
||||
@@ -3529,7 +3757,7 @@
|
||||
},
|
||||
"grid_neutrality_gauge": {
|
||||
"color_explain": "Hvis nålen er i lilla, eksporterede du mere energi til elnettet, end du brugte fra det. Hvis den er i det blå, brugte du mere energi fra elnettet, end du eksporterede.",
|
||||
"energy_dependency": "Dette kort repræsenterer din energiafhængighed.",
|
||||
"energy_dependency": "Dette kort angiver dit nettoenergiforbrug.",
|
||||
"grid_neutrality_not_calculated": "Elnets-neutralitet kunne ikke udregnes",
|
||||
"net_consumed_grid": "Nettoforbrug fra elnettet",
|
||||
"net_returned_grid": "Netto eksporteret til elnettet",
|
||||
@@ -3549,6 +3777,12 @@
|
||||
"entities": {
|
||||
"never_triggered": "Aldrig udløst"
|
||||
},
|
||||
"iframe": {
|
||||
"error_secure_context": "Kan ikke indlæse iframes, der peger på websteder, der bruger {target_protocol} hvis Home Assistant kører med {context_protocol} ."
|
||||
},
|
||||
"map": {
|
||||
"reset_focus": "Nulstil fokus"
|
||||
},
|
||||
"picture-elements": {
|
||||
"call_service": "Kald tjeneste {name}",
|
||||
"hold": "Hold:",
|
||||
@@ -3612,6 +3846,11 @@
|
||||
"description": "Alarmpanelkortet giver dig mulighed for at aktivere og deaktivere alarmkontrolpanelets integrationer.",
|
||||
"name": "Alarmpanel"
|
||||
},
|
||||
"area": {
|
||||
"description": "Kortet Område viser automatisk entiteter i et bestemt område.",
|
||||
"name": "Område",
|
||||
"show_camera": "Vis kamerafeed i stedet for områdebillede"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "Standardhandlingen afhænger af entitetens muligheder. Den skifter enten tilstand eller flere oplysninger vises.",
|
||||
"description": "Med knapkortet kan du tilføje knapper til at udføre opgaver.",
|
||||
@@ -3640,8 +3879,8 @@
|
||||
"state_not_equal": "Tilstand er ikke lig med"
|
||||
},
|
||||
"config": {
|
||||
"optional": "Valgfri",
|
||||
"required": "Påkrævet"
|
||||
"optional": "valgfrit",
|
||||
"required": "påkrævet"
|
||||
},
|
||||
"entities": {
|
||||
"description": "Entiteter-kortet er det mest almindelige type kort. Det grupperer elementer på lister.",
|
||||
@@ -3847,7 +4086,8 @@
|
||||
"none": "Ingen"
|
||||
},
|
||||
"edit_badges": {
|
||||
"panel_mode": "Disse badges vises ikke, fordi visningen er i \"Paneltilstand\"."
|
||||
"panel_mode": "Disse badges vises ikke, fordi visningen er i \"Paneltilstand\".",
|
||||
"view_no_badges": "Badges understøttes ikke af den aktuelle visningstype."
|
||||
},
|
||||
"edit_card": {
|
||||
"add": "Tilføj kort",
|
||||
@@ -4042,7 +4282,7 @@
|
||||
"authorizing_client": "Du er ved at give {clientId} adgang til din Home Assistant-instans.",
|
||||
"form": {
|
||||
"error": "Fejl: {error}",
|
||||
"next": "Næste",
|
||||
"next": "Login",
|
||||
"providers": {
|
||||
"command_line": {
|
||||
"abort": {
|
||||
@@ -4205,18 +4445,18 @@
|
||||
"next": "Næste",
|
||||
"restore": {
|
||||
"addons": "Tilføjelsesprogrammer",
|
||||
"confirm_password": "Bekræft backup kodeord",
|
||||
"description": "Alternativt kan du gendanne fra et tidligere backup.",
|
||||
"confirm_password": "Bekræft adgangskode til sikkerhedskopi",
|
||||
"description": "Alternativt kan du gendanne fra en tidligere sikkerhedskopi.",
|
||||
"folders": "Mapper",
|
||||
"full_backup": "Fuld sikkerhedskopiering",
|
||||
"hide_log": "Skjul fuld log",
|
||||
"in_progress": "Gendannelse er i gang",
|
||||
"partial_backup": "Delvis sikkerhedskopiering",
|
||||
"password": "Kodeord",
|
||||
"password_protection": "Kodeordsbeskyttelse",
|
||||
"password": "Adgangskode til sikkerhedskopi",
|
||||
"password_protection": "Adgangskodebeskyttelse",
|
||||
"select_type": "Vælg, hvad der skal gendannes",
|
||||
"show_log": "Vis den fulde log",
|
||||
"type": "Type"
|
||||
"type": "Sikkerhedskopitype"
|
||||
},
|
||||
"user": {
|
||||
"create_account": "Opret konto",
|
||||
|
@@ -22,7 +22,7 @@
|
||||
"logbook": "Logbuch",
|
||||
"mailbox": "Posteingang",
|
||||
"map": "Karte",
|
||||
"media_browser": "Medien-Browser",
|
||||
"media_browser": "Medien",
|
||||
"profile": "Profil",
|
||||
"shopping_list": "Einkaufsliste",
|
||||
"states": "Übersicht"
|
||||
@@ -131,7 +131,7 @@
|
||||
"dashboard": {
|
||||
"action_error": {
|
||||
"get_changelog": "Add-on-Änderungsprotokoll konnte nicht abgerufen werden",
|
||||
"go_to_config": "Starten des Add-on fehlgeschlagen - Validierung der Konfiguration nicht erfolgreich",
|
||||
"go_to_config": "Konfiguration bearbeiten",
|
||||
"install": "Add-on konnte nicht installiert werden",
|
||||
"restart": "Neustart des Add-on fehlgeschlagen",
|
||||
"start": "Starten des Add-on fehlgeschlagen",
|
||||
@@ -283,9 +283,10 @@
|
||||
"create_blocked_not_running": "Das Erstellen eines Backups ist derzeit nicht möglich, da sich das System im Zustand {state} befindet.",
|
||||
"created": "Erstellt",
|
||||
"delete_backup_confirm": "löschen",
|
||||
"delete_backup_text": "Möchtest du {number} {number, plural,\n one {das Backup}\n other {die Backups}\n} löschen?",
|
||||
"delete_backup_text": "Möchtest du {number, plural,\n one {das}\n other {die}\n} {number} {number, plural,\n one {Backup}\n other {Backups}\n} löschen?",
|
||||
"delete_backup_title": "Backup löschen",
|
||||
"delete_selected": "Ausgewählten Backup löschen",
|
||||
"delete_selected": "Ausgewählte Backups löschen",
|
||||
"download_backup": "Backup herunterladen",
|
||||
"enter_password": "Bitte Passwort eingeben.",
|
||||
"failed_to_delete": "Löschen fehlgeschlagen",
|
||||
"folders": "Ordner",
|
||||
@@ -298,6 +299,7 @@
|
||||
"passwords_not_matching": "Passwörter stimmen nicht überein",
|
||||
"select_type": "Wähle aus, was wiederhergestellt werden soll",
|
||||
"selected": "{number} ausgewählt",
|
||||
"size": "Größe",
|
||||
"type": "Backup-Typ",
|
||||
"upload_backup": "Backup hochladen"
|
||||
},
|
||||
@@ -323,8 +325,10 @@
|
||||
"reset_options": "Einstellungen zurücksetzen",
|
||||
"restart": "Neustart",
|
||||
"restart_name": "{name} neu starten",
|
||||
"review": "Überprüfung",
|
||||
"running_version": "Du verwendest Version {version}",
|
||||
"save": "Speichern",
|
||||
"show": "anzeigen",
|
||||
"show_more": "Zeige mehr Informationen",
|
||||
"update": "Aktualisieren",
|
||||
"update_available": "{count, plural,\n one {Aktualisierung}\n other {{count} Aktualisierungen}\n} ausstehend",
|
||||
@@ -405,7 +409,8 @@
|
||||
"repositories": {
|
||||
"add": "Hinzufügen",
|
||||
"remove": "Entfernen",
|
||||
"title": "Add-on Repositorys verwalten"
|
||||
"title": "Add-on Repositorys verwalten",
|
||||
"used": "Das Repository wird für installierte Add-ons verwendet und kann nicht entfernt werden."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Add-on neu starten",
|
||||
@@ -428,12 +433,14 @@
|
||||
"not_supported": "Diese Weiterleitung wird von deiner Home Assistant-Instanz nicht unterstützt. Überprüfe den {link} auf die unterstützten Weiterleitungen und die Version, in der sie eingeführt wurden."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Add-ons",
|
||||
"backups": "Backups",
|
||||
"dashboard": "Dashboard",
|
||||
"store": "Add-on Store",
|
||||
"system": "System"
|
||||
},
|
||||
"store": {
|
||||
"check_updates": "Auf Updates prüfen",
|
||||
"missing_addons": "Fehlende Add-ons? Aktiviere den erweiterten Modus auf deiner Benutzerprofilseite",
|
||||
"no_results_found": "Keine Ergebnisse in {repository} gefunden",
|
||||
"registries": "Einträge",
|
||||
@@ -526,6 +533,16 @@
|
||||
"update_supervisor": "Supervisor aktualisieren",
|
||||
"warning": "WARNUNG"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"core_note": "Der Supervisor führt ein Rollback auf Version {version} durch, wenn Ihre Instance nach dem Update nicht mehr auftaucht.",
|
||||
"create_backup": "Vor der Aktualisierung ein Backup erstellen",
|
||||
"creating_backup": "Erstellen eines Backups von {name}",
|
||||
"description": "Du hast {version} installiert. Klicke auf Aktualisieren, um auf Version {newest_version} zu aktualisieren.",
|
||||
"no_update": "Kein Update für {name} verfügbar",
|
||||
"open_release_notes": "Versionshinweise öffnen",
|
||||
"update_name": "Aktualisiere {name}",
|
||||
"updating": "Aktualisiere {name} auf Version {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -534,6 +551,9 @@
|
||||
"confirm": "Ja",
|
||||
"decline": "Nein"
|
||||
},
|
||||
"backup": {
|
||||
"upload_backup": "Backup hochladen"
|
||||
},
|
||||
"card": {
|
||||
"alarm_control_panel": {
|
||||
"arm_away": "Aktivieren - Unterwegs",
|
||||
@@ -545,12 +565,15 @@
|
||||
"code": "Code",
|
||||
"disarm": "Deaktivieren"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "Bereich nicht gefunden."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Zuletzt ausgelöst",
|
||||
"trigger": "Aktionen ausführen"
|
||||
},
|
||||
"button": {
|
||||
"press": "Drücke"
|
||||
"press": "Drücken"
|
||||
},
|
||||
"camera": {
|
||||
"not_available": "Bild nicht verfügbar"
|
||||
@@ -615,10 +638,17 @@
|
||||
},
|
||||
"media_player": {
|
||||
"browse_media": "Medien durchsuchen",
|
||||
"media_next_track": "Weiter",
|
||||
"media_next_track": "Nächster Titel",
|
||||
"media_pause": "Pause",
|
||||
"media_play": "Abspielen",
|
||||
"media_play_pause": "Spielen/Pause",
|
||||
"media_previous_track": "Vorheriger Titel",
|
||||
"media_stop": "Stopp",
|
||||
"media_volume_down": "Lautstärke verringern",
|
||||
"media_volume_mute": "Lautstärke stumm",
|
||||
"media_volume_unmute": "Stummschaltung aufheben",
|
||||
"media_volume_up": "Lautstärke erhöhen",
|
||||
"nothing_playing": "Nichts wird abgespielt",
|
||||
"sound_mode": "Sound-Modus",
|
||||
"source": "Quelle",
|
||||
"text_to_speak": "Text zum Sprechen",
|
||||
@@ -714,7 +744,7 @@
|
||||
"leave": "Verlassen",
|
||||
"loading": "Laden",
|
||||
"menu": "Menü",
|
||||
"move": "Bewegen",
|
||||
"move": "Verschieben",
|
||||
"next": "Weiter",
|
||||
"no": "Nein",
|
||||
"not_now": "Später",
|
||||
@@ -726,6 +756,7 @@
|
||||
"save": "Speichern",
|
||||
"skip": "Überspringen",
|
||||
"stay": "Bleiben",
|
||||
"submit": "Absenden",
|
||||
"successfully_deleted": "Erfolgreich gelöscht",
|
||||
"successfully_saved": "Erfolgreich gespeichert",
|
||||
"undo": "Rückgängig",
|
||||
@@ -736,11 +767,11 @@
|
||||
"addon": "Add-on",
|
||||
"error": {
|
||||
"fetch_addons": {
|
||||
"description": "Das Abrufen von Add-ons hat einen Fehler zurückgegeben.",
|
||||
"title": "Fehler beim Abrufen der Add-ons"
|
||||
"description": "Beim Laden von Add-ons ist ein Fehler aufgetreten.",
|
||||
"title": "Fehler beim Laden von Add-ons"
|
||||
},
|
||||
"no_supervisor": {
|
||||
"description": "Kein Supervisor gefunden, daher konnten Add-ons nicht geladen werden.",
|
||||
"description": "Add-ons werden nicht unterstützt.",
|
||||
"title": "Kein Supervisor"
|
||||
}
|
||||
}
|
||||
@@ -820,7 +851,7 @@
|
||||
"logbook": {
|
||||
"by": "durch",
|
||||
"by_service": "durch Service",
|
||||
"entries_not_found": "Keine Logbucheinträge gefunden.",
|
||||
"entries_not_found": "Keine Logbuch-Ereignisse gefunden.",
|
||||
"messages": {
|
||||
"became_unavailable": "nicht mehr verfügbar",
|
||||
"changed_to_state": "wechselte zu {state}",
|
||||
@@ -850,7 +881,7 @@
|
||||
"was_unplugged": "wurde ausgesteckt",
|
||||
"was_unsafe": "war unsicher"
|
||||
},
|
||||
"retrieval_error": "Fehler beim Abrufen von Logbucheinträgen",
|
||||
"retrieval_error": "Logbuch konnte nicht geladen werden",
|
||||
"show_trace": "Trace anzeigen"
|
||||
},
|
||||
"media-browser": {
|
||||
@@ -881,7 +912,7 @@
|
||||
"documentation": "Dokumentation",
|
||||
"learn_adding_local_media": "Erfahre mehr über das Hinzufügen von Medien in der {documentation}.",
|
||||
"local_media_files": "Platziere deine Video-, Audio- und Bilddateien im Medienverzeichnis, um sie im Browser oder auf unterstützten Mediaplayern durchsuchen und abspielen zu können.",
|
||||
"media-player-browser": "Medien-Browser",
|
||||
"media-player-browser": "Medien",
|
||||
"media_browsing_error": "Fehler beim Durchsuchen der Medien",
|
||||
"media_not_supported": "Der Browser Media Player unterstützt diese Art von Medien nicht",
|
||||
"media_player": "Media Player",
|
||||
@@ -900,7 +931,15 @@
|
||||
"label": "Bild",
|
||||
"unsupported_format": "Nicht unterstütztes Format, bitte wähle ein JPEG-, PNG- oder GIF-Bild."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"enter_qr_code": "QR-Code Wert eingeben",
|
||||
"manual_input": "Du kannst den QR-Code mit einem anderen QR-Scanner einscannen und den Code in die untenstehende Eingabe einfügen",
|
||||
"not_supported": "Dein Browser unterstützt kein Scannen von QR-Codes.",
|
||||
"only_https_supported": "Du kannst deine Kamera nur dann zum Scannen eines QR-Codes verwenden, wenn du HTTPS verwendest.",
|
||||
"select_camera": "Kamera auswählen"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Filter",
|
||||
"filter_by_area": "Nach Bereich filtern",
|
||||
"filter_by_device": "Nach Gerät filtern",
|
||||
"filter_by_entity": "Nach Entität filtern",
|
||||
@@ -976,8 +1015,8 @@
|
||||
"add_device_id": "Gerät auswählen",
|
||||
"add_entity_id": "Entität auswählen",
|
||||
"expand": "Erweitern",
|
||||
"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": "Erweitere dieses Gerät in separate Entitäten. Nach dem Erweitern werden die Entitäten nicht aktualisiert, wenn sich das Gerät ändert.",
|
||||
"expand_area_id": "Teile diesen Bereich in separate Geräte und Entitäten auf.",
|
||||
"expand_device_id": "Teile dieses Gerät in separate Entitäten auf.",
|
||||
"remove": "Entfernen",
|
||||
"remove_area_id": "Bereich entfernen",
|
||||
"remove_device_id": "Gerät entfernen",
|
||||
@@ -1012,8 +1051,22 @@
|
||||
"area": "Nur Entitätsbereich festlegen",
|
||||
"area_note": "Standardmäßig befinden sich die Entitäten eines Geräts in demselben Bereich wie das Gerät. Wenn du den Bereich dieser Entität änderst, folgt sie nicht mehr dem Bereich des Geräts.",
|
||||
"change_device_area": "Gerätebereich ändern",
|
||||
"confirm_delete": "Möchtest du diesen Eintrag wirklich löschen?",
|
||||
"confirm_delete": "Möchtest du diese Entität wirklich löschen?",
|
||||
"delete": "Löschen",
|
||||
"device_class": "Anzeigen als",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Tür",
|
||||
"garage_door": "Garagentor",
|
||||
"opening": "Andere",
|
||||
"window": "Fenster"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Tür",
|
||||
"garage": "Garagentor",
|
||||
"window": "Fenster"
|
||||
}
|
||||
},
|
||||
"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",
|
||||
@@ -1027,7 +1080,7 @@
|
||||
"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.",
|
||||
"unavailable": "Diese Entität ist nicht verfügbar.",
|
||||
"update": "Aktualisieren"
|
||||
},
|
||||
"faq": "Dokumentation",
|
||||
@@ -1038,7 +1091,7 @@
|
||||
},
|
||||
"generic": {
|
||||
"cancel": "Abbrechen",
|
||||
"close": "schließen",
|
||||
"close": "Schließen",
|
||||
"default_confirmation_title": "Bist du sicher?",
|
||||
"ok": "OK"
|
||||
},
|
||||
@@ -1097,9 +1150,10 @@
|
||||
"cover": {
|
||||
"close_cover": "Abdeckung schließen",
|
||||
"close_tile_cover": "Abdeckung kippend schließen",
|
||||
"close_tilt_cover": "Abdeckung kippend schließen",
|
||||
"open_cover": "Abdeckung öffnen",
|
||||
"open_tilt_cover": "Abdeckung kippend öffnen",
|
||||
"stop_cover": "Abdeckung anhalten"
|
||||
"stop_cover": "Abdeckung stoppen"
|
||||
},
|
||||
"details": "Details",
|
||||
"dismiss": "Dialog ausblenden",
|
||||
@@ -1180,7 +1234,7 @@
|
||||
"core": "Allgemein",
|
||||
"customize": "Anpassung",
|
||||
"devices": "Geräte",
|
||||
"energy": "Energie",
|
||||
"energy": "Energiekonfiguration",
|
||||
"entities": "Entitäten",
|
||||
"helpers": "Helfer",
|
||||
"info": "Info",
|
||||
@@ -1224,6 +1278,7 @@
|
||||
"statistics": "Statistik-Entitäten",
|
||||
"telegram": "Telegram-Benachrichtigungsdienste",
|
||||
"template": "Template-Entitäten",
|
||||
"themes": "Themes",
|
||||
"trend": "Trend-Entitäten",
|
||||
"universal": "Universelle Media Player-Entitäten",
|
||||
"zone": "Zonen"
|
||||
@@ -1239,7 +1294,10 @@
|
||||
"server_control": "Server"
|
||||
}
|
||||
},
|
||||
"filter_placeholder": "Entitätsfilter"
|
||||
"filter_placeholder": "Entitätsfilter",
|
||||
"key_c_hint": "Drücke auf einer beliebigen Seite 'c', um diese Suchleiste zu öffnen",
|
||||
"nothing_found": "Nichts gefunden!",
|
||||
"title": "Schnelle Suche"
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant hat nichts gehört",
|
||||
@@ -1315,6 +1373,7 @@
|
||||
"key_missing": "Erforderlicher Schlüssel \"{key}\" fehlt.",
|
||||
"key_not_expected": "Der Schlüssel \"{key}\" wird vom visuellen Editor nicht erwartet oder nicht unterstützt.",
|
||||
"key_wrong_type": "Der angegebene Wert für \"{key}\" wird vom visuellen Editor nicht unterstützt. Wir unterstützen ({type_correct}), haben aber ({type_wrong}) erhalten.",
|
||||
"no_state_array_support": "Mehrere Statuswerte werden im visuellen Editor nicht unterstützt",
|
||||
"no_template_editor_support": "Templates werden im visuellen Editor nicht unterstützt",
|
||||
"no_type_provided": "Kein Typ angegeben."
|
||||
},
|
||||
@@ -1356,6 +1415,8 @@
|
||||
"link_profile_page": "deine Profilseite"
|
||||
},
|
||||
"areas": {
|
||||
"add_picture": "Bild hinzufügen",
|
||||
"assigned_to_area": "Diesem Bereich zugewiesen",
|
||||
"caption": "Bereiche",
|
||||
"data_table": {
|
||||
"area": "Bereich",
|
||||
@@ -1387,7 +1448,8 @@
|
||||
"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ättest du noch keine Bereiche!"
|
||||
}
|
||||
},
|
||||
"targeting_area": "Ausrichtung auf diesen Bereich"
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automatisierungen",
|
||||
@@ -1399,6 +1461,7 @@
|
||||
"header": "Erstelle eine neue Automatisierung",
|
||||
"how": "Wie möchtest du deine neue Automatisierung erstellen?",
|
||||
"start_empty": "Mit einer leeren Automatisierung starten",
|
||||
"start_empty_description": "Erstelle eine neue Automatisierung von Grund auf",
|
||||
"thingtalk": {
|
||||
"create": "Erstellen",
|
||||
"header": "Beschreibe die Automatisierung, die du erstellen möchtest",
|
||||
@@ -1616,8 +1679,9 @@
|
||||
"delete": "Löschen",
|
||||
"delete_confirm": "Möchtest du das wirklich löschen?",
|
||||
"duplicate": "Duplizieren",
|
||||
"edit_id": "Trigger-ID bearbeiten",
|
||||
"header": "Auslöser",
|
||||
"id": "Trigger-ID (wird von der Triggerbedingung verwendet)",
|
||||
"id": "Trigger-ID",
|
||||
"introduction": "Auslöser starten automatisierte Abläufe. Es ist möglich, mehrere Auslöser für dieselbe Abfolge zu definieren. Wenn ein Auslöser aktiviert wird, prüft Home Assistant die Bedingungen, sofern vorhanden, und führt die Aktion aus.",
|
||||
"learn_more": "Erfahre mehr über Auslöser",
|
||||
"name": "Auslöser",
|
||||
@@ -1626,7 +1690,7 @@
|
||||
"extra_fields": {
|
||||
"above": "Über",
|
||||
"below": "Unter",
|
||||
"for": "Dauer",
|
||||
"for": "Dauer (optional)",
|
||||
"zone": "Zone"
|
||||
},
|
||||
"label": "Gerät",
|
||||
@@ -1667,10 +1731,10 @@
|
||||
},
|
||||
"state": {
|
||||
"attribute": "Attribut (Optional)",
|
||||
"for": "Für",
|
||||
"from": "Von",
|
||||
"for": "Für (optional)",
|
||||
"from": "Von (optional)",
|
||||
"label": "Zustand",
|
||||
"to": "Zu"
|
||||
"to": "Zu (optional)"
|
||||
},
|
||||
"sun": {
|
||||
"event": "Ereignis:",
|
||||
@@ -1870,6 +1934,7 @@
|
||||
"tts": {
|
||||
"default_language": "Zu verwendende Standardsprache",
|
||||
"dialog": {
|
||||
"create_automation": "Automatisierung erstellen",
|
||||
"example_message": "Hallo {name} , du kannst beliebigen Text auf jedem unterstützten Media Player abspielen!",
|
||||
"header": "Text-zu-Sprache ausprobieren",
|
||||
"play": "Abspielen",
|
||||
@@ -2004,7 +2069,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "Allgemein",
|
||||
"description": "Maßeinheiten, Standort, Zeitzone & andere allgemeine Parameter",
|
||||
"description": "Standort, Netzwerk und Analysen",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -2027,7 +2092,7 @@
|
||||
"unit_system_metric": "Metrisch"
|
||||
},
|
||||
"header": "Allgemeine Einstellungen",
|
||||
"introduction": "Die Konfiguration zu ändern ist ein mühsamer Prozess. Das wissen wir. Dieser Bereich versucht dir das Leben etwas leichter zu gestalten."
|
||||
"introduction": "Verwalte deinen Standort, dein Netzwerk und deine Analysen."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2052,6 +2117,48 @@
|
||||
"not_applied": "Die hier vorgenommenen Änderungen werden eingetragen, aber erst nach einem erneuten Laden der Konfiguration angewendet, wenn das Include vorhanden ist."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Automatisierungen, Szenen, Skripte und Helfer verwalten",
|
||||
"title": "Automatisierungen & Szenen"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Vorgefertigte Automatisierungen und Skripte von der Community",
|
||||
"title": "Vorlagen"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Standort und Benachrichtigungen",
|
||||
"title": "Mobile App"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Individuelle Oberflächen erstellen, um dein Zuhause zu steuern",
|
||||
"title": "Dashboards"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Integrationen, Geräte, Entitäten und Bereiche",
|
||||
"title": "Geräte & Dienste"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Energieproduktion und Verbrauch überwachen",
|
||||
"title": "Energie"
|
||||
},
|
||||
"people": {
|
||||
"description": "Personen und Zonen verwalten, die von Home Assistant verfolgt werden",
|
||||
"title": "Personen & Zonen"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Allgemeine Einstellungen, Serversteuerung, Logs und Info",
|
||||
"title": "Einstellungen"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Backups erstellen, Protokolle prüfen oder System neu starten",
|
||||
"title": "Add-ons, Backups & Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Automatisierungen auslösen, wenn ein NFC-Tag, QR-Code usw. gescannt wird",
|
||||
"title": "NFC Tags"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "Es existiert noch kein(e) {name} mit diesem Gerät. Füge ein(e) hinzu, indem du auf den + Knopf drückst.",
|
||||
"automation": {
|
||||
@@ -2090,7 +2197,8 @@
|
||||
"integration": "Integration",
|
||||
"manufacturer": "Hersteller",
|
||||
"model": "Modell",
|
||||
"no_devices": "keine Geräte"
|
||||
"no_devices": "keine Geräte",
|
||||
"no_integration": "Keine Integration"
|
||||
},
|
||||
"delete": "Löschen",
|
||||
"description": "Verbundene Geräte verwalten",
|
||||
@@ -2102,6 +2210,7 @@
|
||||
"integration": "Integration",
|
||||
"user": "Benutzer"
|
||||
},
|
||||
"download_diagnostics": "Diagnoseinformationen herunterladen",
|
||||
"edit_settings": "Einstellungen bearbeiten",
|
||||
"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.",
|
||||
@@ -2169,7 +2278,7 @@
|
||||
"description": "Überwache deine Energieproduktion und deinen Verbrauch",
|
||||
"device_consumption": {
|
||||
"add_device": "Gerät hinzufügen",
|
||||
"add_stat": "Wähle eine Entität aus, um deren Energie zu tracken",
|
||||
"add_stat": "Wähle eine Entität aus, um deren Energie zu verfolgen",
|
||||
"devices": "Geräte",
|
||||
"dialog": {
|
||||
"device_consumption_energy": "Geräteverbrauch Energie (kWh)",
|
||||
@@ -2177,7 +2286,7 @@
|
||||
"selected_stat_intro": "Wähle die Entität, die den Energieverbrauch des Geräts darstellt."
|
||||
},
|
||||
"learn_more": "Weitere Informationen zum Einstieg.",
|
||||
"selected_stat": "Energie tracken für",
|
||||
"selected_stat": "Energie verfolgen für",
|
||||
"sub": "Durch die Nachverfolgung des Energieverbrauchs einzelner Geräte kann Home Assistant deinen Energieverbrauch nach Geräten aufteilen.",
|
||||
"title": "Einzelne Geräte"
|
||||
},
|
||||
@@ -2195,7 +2304,7 @@
|
||||
"energy_stat": "Verbrauchte Energie (m³)",
|
||||
"gas_usage": "Gasverbrauch",
|
||||
"header": "Gasverbrauch konfigurieren",
|
||||
"m3_or_kWh": "m³ oder kWh",
|
||||
"m3_or_kWh": "ft³, m³, Wh, kWh oder MWh",
|
||||
"no_cost": "Kosten nicht verfolgen",
|
||||
"paragraph": "Der Gasverbrauch ist die Gasmenge, die zu dir nach Hause fließt."
|
||||
},
|
||||
@@ -2300,19 +2409,19 @@
|
||||
"title": "Unerwartete Zustandsklasse"
|
||||
},
|
||||
"entity_unexpected_unit_energy": {
|
||||
"description": "Die folgenden Einheiten haben nicht die erwarteten Maßeinheiten 'kWh' oder 'Wh':",
|
||||
"description": "Die folgenden Entitäten haben nicht die erwarteten Maßeinheiten \"Wh\", \"kWh\" oder \"MWh\":",
|
||||
"title": "Unerwartete Maßeinheit"
|
||||
},
|
||||
"entity_unexpected_unit_energy_price": {
|
||||
"description": "Die folgenden Einheiten haben nicht die erwarteten Maßeinheiten ''{currency}/kWh'' oder ''{currency}/Wh'':",
|
||||
"description": "Die folgenden Einheiten haben nicht die erwarteten Maßeinheiten '' {currency}/kWh'', '' {currency}/Wh'' oder '' {currency}/MWh'':",
|
||||
"title": "Unerwartete Maßeinheit"
|
||||
},
|
||||
"entity_unexpected_unit_gas": {
|
||||
"description": "Die folgenden Entitäten haben nicht die erwarteten Maßeinheiten 'kWh', 'm³' oder 'ft³':",
|
||||
"description": "Die folgenden Entitäten haben nicht die erwarteten Maßeinheiten \"Wh\", \"kWh\" oder \"MWh\" für einen Energiesensor oder \"m³\" oder \"ft³\" für einen Gassensor:",
|
||||
"title": "Unerwartete Maßeinheit"
|
||||
},
|
||||
"entity_unexpected_unit_gas_price": {
|
||||
"description": "Die folgenden Einheiten haben nicht die erwarteten Maßeinheiten '' {currency} /kWh'', '' {currency} /Wh'', '' {currency} /m³'' oder '' {currency} /ft³'' :",
|
||||
"description": "Die folgenden Entitäten haben nicht die erwarteten Maßeinheiten '' {currency}/kWh'', '' {currency}/Wh'', '' {currency}/MWh'', '' {currency}/m³'' oder '' {currency}/ft³'':",
|
||||
"title": "Unerwartete Maßeinheit"
|
||||
},
|
||||
"recorder_untracked": {
|
||||
@@ -2395,6 +2504,7 @@
|
||||
"types": {
|
||||
"counter": "Zähler",
|
||||
"input_boolean": "Umschalten",
|
||||
"input_button": "Taste",
|
||||
"input_datetime": "Datum und/oder Uhrzeit",
|
||||
"input_number": "Nummer",
|
||||
"input_select": "Dropdown",
|
||||
@@ -2456,14 +2566,18 @@
|
||||
"disable_restart_confirm": "Home Assistant neu starten, um das Deaktivieren dieser Integration abzuschließen",
|
||||
"disabled_polling": "Automatisches Abfragen von aktualisierten Daten deaktiviert",
|
||||
"documentation": "Dokumentation",
|
||||
"download_diagnostics": "Diagnoseinformationen herunterladen",
|
||||
"enable_restart_confirm": "Home Assistant neu starten, um das Aktivieren dieser Integration abzuschließen",
|
||||
"entities": "{count} {count, plural,\none {Entität}\nother {Entitäten}\n}",
|
||||
"entity_unavailable": "Entität nicht verfügbar",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Hardware: {version}",
|
||||
"hub": "Verbunden über",
|
||||
"known_issues": "Bekannte Probleme",
|
||||
"manuf": "von {manufacturer}",
|
||||
"no_area": "Kein Bereich",
|
||||
"not_loaded": "Nicht geladen",
|
||||
"open_configuration_url": "Gerät besuchen",
|
||||
"provided_by_custom_integration": "Bereitgestellt durch eine benutzerdefinierte Integration",
|
||||
"reload": "Neu laden",
|
||||
"reload_confirm": "Die Integration wurde neu geladen",
|
||||
@@ -2480,7 +2594,9 @@
|
||||
"setup_retry": "Setup erneut versuchen"
|
||||
},
|
||||
"system_options": "Systemoptionen",
|
||||
"unnamed_entry": "Unbenannter Eintrag"
|
||||
"unknown_via_device": "Unbekanntes Gerät",
|
||||
"unnamed_entry": "Unbenannter Eintrag",
|
||||
"via": "Verbunden über"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Abgebrochen",
|
||||
@@ -2793,6 +2909,7 @@
|
||||
"link_integrations_page": "Integrationsseite",
|
||||
"link_presence_detection_integrations": "Integrationen zur Anwesenheitserkennung",
|
||||
"linked_user": "Verknüpfter Benutzer",
|
||||
"local_only": "Anmeldung nur über das lokale Netzwerk möglich",
|
||||
"name": "Name",
|
||||
"name_error_msg": "Name erforderlich",
|
||||
"new_person": "Neue Person",
|
||||
@@ -2811,6 +2928,7 @@
|
||||
"caption": "Szenen",
|
||||
"description": "Gerätezustände erfassen und später einfach wieder abrufen",
|
||||
"editor": {
|
||||
"area": "Bereich",
|
||||
"default_name": "Neue Szene",
|
||||
"devices": {
|
||||
"add": "Ein Gerät hinzufügen",
|
||||
@@ -2906,7 +3024,7 @@
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Serversteuerung",
|
||||
"description": "Neustarten und Stoppen des Home Assistant Servers",
|
||||
"description": "Validierung und Neustart des Home Assistant-Servers",
|
||||
"section": {
|
||||
"reloading": {
|
||||
"automation": "Automatisierungen",
|
||||
@@ -2921,6 +3039,7 @@
|
||||
"history_stats": "Verlaufsstatistik-Entitäten",
|
||||
"homekit": "HomeKit",
|
||||
"input_boolean": "Eingabe-Booleans",
|
||||
"input_button": "Eingabe-Tasten",
|
||||
"input_datetime": "Eingabe-Datums- und Zeitfelder",
|
||||
"input_number": "Eingabenummern",
|
||||
"input_select": "Eingabe-Auswahl",
|
||||
@@ -2939,6 +3058,8 @@
|
||||
"statistics": "Statistik-Entitäten",
|
||||
"telegram": "Telegram-Benachrichtigungsdienste",
|
||||
"template": "Template-Entitäten",
|
||||
"themes": "Themes",
|
||||
"timer": "Timer",
|
||||
"trend": "Trend-Entitäten",
|
||||
"universal": "Universelle Media Player-Entitäten",
|
||||
"zone": "Zonen"
|
||||
@@ -2947,7 +3068,7 @@
|
||||
"confirm_restart": "Möchtest du Home Assistant wirklich neu starten?",
|
||||
"confirm_stop": "Möchtest du Home Assistant wirklich beenden?",
|
||||
"heading": "Serververwaltung",
|
||||
"introduction": "Verwalte Home Assistant… von Home Assistant aus.",
|
||||
"introduction": "Steuere deinen Home Assistant.",
|
||||
"restart": "Neu starten",
|
||||
"stop": "Stoppen"
|
||||
},
|
||||
@@ -2967,7 +3088,7 @@
|
||||
"confirm_remove": "Möchtest du den Tag {tag} wirklich entfernen?",
|
||||
"confirm_remove_title": "Tag entfernen?",
|
||||
"create_automation": "Automatisierung mit NFC Tag erstellen",
|
||||
"description": "Automatisierungen auslösen wenn NFC Tag, QR Code, usw. gescannt wird",
|
||||
"description": "Automatisierungen auslösen, wenn ein NFC-Tag, QR-Code usw. gescannt wird",
|
||||
"detail": {
|
||||
"companion_apps": "Mobile Apps",
|
||||
"create": "Erstellen",
|
||||
@@ -2991,10 +3112,25 @@
|
||||
"no_tags": "Keine NFC Tags",
|
||||
"write": "Schreiben"
|
||||
},
|
||||
"updates": {
|
||||
"check_unavailable": {
|
||||
"description": "Du musst das Home Assistant Betriebssystem verwenden, um Updates von Home Assistant über die Benutzeroberfläche prüfen und installieren zu können.",
|
||||
"title": "Suche nach Updates nicht möglich"
|
||||
},
|
||||
"check_updates": "Auf Updates prüfen",
|
||||
"more_updates": "+ {count} Updates",
|
||||
"review": "Überprüfung",
|
||||
"show": "anzeigen",
|
||||
"show_all_updates": "Alle Updates anzeigen",
|
||||
"title": "{count} {count, plural,\n one {Update}\n other {Updates}\n}",
|
||||
"unable_to_fetch": "Updates können nicht geladen werden",
|
||||
"version_available": "Version {version_available} ist verfügbar"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Benutzer hinzufügen",
|
||||
"create": "Benutzerkonto anlegen",
|
||||
"local_only": "Nur lokal",
|
||||
"password": "Passwort",
|
||||
"password_confirm": "Passwort bestätigen",
|
||||
"password_not_match": "Passwörter stimmen nicht überein"
|
||||
@@ -3013,25 +3149,31 @@
|
||||
"delete_user": "Benutzer löschen",
|
||||
"group": "Gruppe",
|
||||
"id": "ID",
|
||||
"local_only": "Anmeldung nur über das lokale Netzwerk möglich",
|
||||
"name": "Anzeigename",
|
||||
"new_password": "Neues Passwort",
|
||||
"owner": "Besitzer",
|
||||
"password_changed": "Das Passwort wurde erfolgreich geändert",
|
||||
"system_generated": "Systemgeneriert",
|
||||
"system_generated_users_not_editable": "Systemgenerierte Benutzer können nicht aktualisiert werden.",
|
||||
"system_generated_users_not_removable": "Systemgenerierte Benutzer können nicht entfernt werden.",
|
||||
"system_generated": "Systembenutzer",
|
||||
"system_generated_users_not_editable": "Systembenutzer können nicht aktualisiert werden.",
|
||||
"system_generated_users_not_removable": "Systembenutzer können nicht entfernt werden.",
|
||||
"unnamed_user": "Namenloser Benutzer",
|
||||
"update_user": "Aktualisieren",
|
||||
"username": "Benutzername"
|
||||
},
|
||||
"is_local": "Lokaler Benutzer",
|
||||
"is_not_active": "Deaktiviert",
|
||||
"is_owner": "Besitzer",
|
||||
"is_system": "Systembenutzer",
|
||||
"picker": {
|
||||
"add_user": "Benutzer hinzufügen",
|
||||
"headers": {
|
||||
"group": "Gruppe",
|
||||
"is_active": "Aktiv",
|
||||
"is_owner": "Besitzer",
|
||||
"local": "Lokal",
|
||||
"name": "Anzeigename",
|
||||
"system": "System generiert",
|
||||
"system": "System",
|
||||
"username": "Benutzername"
|
||||
}
|
||||
},
|
||||
@@ -3123,6 +3265,7 @@
|
||||
"visualization": {
|
||||
"auto_zoom": "Automatischer Zoom",
|
||||
"caption": "Visualisierung",
|
||||
"enable_physics": "Physik aktivieren",
|
||||
"header": "Netzwerkvisualisierung",
|
||||
"highlight_label": "Geräte hervorheben",
|
||||
"refresh_topology": "Topologie aktualisieren",
|
||||
@@ -3256,13 +3399,21 @@
|
||||
"zwave_js": {
|
||||
"add_node": {
|
||||
"cancel_inclusion": "Erfassung abbrechen",
|
||||
"check_logs": "Weitere Informationen findest du in den Protokollen.",
|
||||
"choose_inclusion_strategy": "Wie möchtest du dein Gerät hinzufügen?",
|
||||
"controller_in_inclusion_mode": "Dein Z-Wave-Controller befindet sich jetzt im Inklusionsmodus.",
|
||||
"enter_qr_code": "QR-Code Wert eingeben",
|
||||
"follow_device_instructions": "Befolge die mit dem Gerät gelieferten Anweisungen, um die Kopplung am Gerät auszulösen.",
|
||||
"inclusion_failed": "Das Gerät konnte nicht hinzugefügt werden. Bitte überprüfe die Protokolle für weitere Informationen.",
|
||||
"inclusion_failed": "Das Gerät konnte nicht hinzugefügt werden.",
|
||||
"inclusion_finished": "Das Gerät wurde hinzugefügt.",
|
||||
"interview_failed": "Das Geräteinterview ist fehlgeschlagen. Zusätzliche Informationen sind möglicherweise in den Logs verfügbar.",
|
||||
"interview_started": "Das Gerät wird gerade eingerichtet. Dies könnte eine Weile dauern.",
|
||||
"introduction": "Dieser Assistent führt dich durch das Hinzufügen eines Knotens zu deinem Z-Wave-Netzwerk.",
|
||||
"provisioning_finished": "Das Gerät wurde hinzugefügt. Sobald du es einschaltest, wird es verfügbar sein.",
|
||||
"qr_code": "QR-Code",
|
||||
"qr_code_paragraph": "Wenn dein Gerät SmartStart unterstützt, kannst du den QR-Code für eine einfache Kopplung scannen.",
|
||||
"scan_qr_code": "QR-Code scannen",
|
||||
"searching_device": "Gerät suchen",
|
||||
"secure_inclusion_warning": "Sichere Geräte benötigen zusätzliche Bandbreite; zu viele sichere Geräte können dein Z-Wave-Netzwerk ausbremsen. Wir empfehlen, die sichere Einbindung nur für Geräte zu verwenden, die sie benötigen, wie Schlösser oder Garagentoröffner.",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
@@ -3282,6 +3433,7 @@
|
||||
"title": "S2 Nicht authentifiziert"
|
||||
}
|
||||
},
|
||||
"select_camera": "Kamera auswählen",
|
||||
"start_inclusion": "Starten der Erfassung",
|
||||
"start_secure_inclusion": "Starten der sicheren Erfassung",
|
||||
"title": "Hinzufügen eines Z-Wave-Geräts",
|
||||
@@ -3290,6 +3442,7 @@
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Gerät hinzufügen",
|
||||
"back": "Zurück",
|
||||
"close": "Schließen",
|
||||
"heal_network": "Netzwerk heilen",
|
||||
"home_id": "Heim-ID",
|
||||
@@ -3300,10 +3453,11 @@
|
||||
"source": "Quelle"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {Gerät}\n other {Geräte}\n}",
|
||||
"driver_version": "Treiberversion",
|
||||
"dump_dead_nodes_text": "Einige deiner Geräte haben nicht geantwortet und gelten als tot. Diese werden nicht vollständig exportiert.",
|
||||
"dump_dead_nodes_title": "Einige deiner Geräte sind tot",
|
||||
"dump_debug": "Lade einen Dump deines Netzwerks herunter, um Probleme zu diagnostizieren",
|
||||
"dump_debug": "Daten herunterladen",
|
||||
"dump_not_ready_confirm": "Herunterladen",
|
||||
"dump_not_ready_text": "Wenn du einen Export erstellst, während nicht alle Geräte bereit sind, können benötigte Daten fehlen. Gib deinem Netzwerk etwas Zeit, um alle Geräte abzufragen. Möchtest du mit dem Dump fortfahren?",
|
||||
"dump_not_ready_title": "Noch nicht alle Geräte sind bereit",
|
||||
@@ -3311,6 +3465,9 @@
|
||||
"home_id": "Heim-ID",
|
||||
"introduction": "Verwalte dein Z-Wave-Netzwerk und Z-Wave-Geräte",
|
||||
"nodes_ready": "Geräte bereit",
|
||||
"not_ready": "{count} nicht bereit",
|
||||
"provisioned_devices": "Bereitgestellte Geräte",
|
||||
"server_url": "Server-URL",
|
||||
"server_version": "Serverversion"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -3351,6 +3508,7 @@
|
||||
"traffic_warning": "Der Heilungsprozess erzeugt eine große Menge an Datenverkehr im Z-Wave-Netzwerk. Dies kann dazu führen, dass Geräte langsam (oder gar nicht) reagieren, während der Heilungsprozess läuft."
|
||||
},
|
||||
"logs": {
|
||||
"download_logs": "Protokolle herunterladen",
|
||||
"log_level": "Protokollstufe",
|
||||
"log_level_changed": "Log Level geändert auf: {level}",
|
||||
"subscribed_to_logs": "Abonniert Z-Wave JS-Protokollnachrichten …",
|
||||
@@ -3385,6 +3543,15 @@
|
||||
"dead": "Tot",
|
||||
"unknown": "Unbekannt"
|
||||
},
|
||||
"provisioned": {
|
||||
"confirm_unprovision_text": "Wenn du die Bereitstellung des Geräts aufhebst, wird es nicht zum Home Assistant hinzugefügt, wenn es eingeschaltet wird. Wenn das Gerät bereits zu Home Assistant hinzugefügt wurde, wird es durch das Entfernen des bereitgestellten Geräts nicht aus Home Assistant entfernt.",
|
||||
"confirm_unprovision_title": "Bist du sicher, dass du das Gerät nicht mehr bereitstellen willst?",
|
||||
"dsk": "DSK",
|
||||
"included": "Eingebunden",
|
||||
"not_included": "Nicht eingebunden",
|
||||
"security_classes": "Sicherheitsklassen",
|
||||
"unprovison": "Bereitstellung aufheben"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "Du musst batteriebetriebene Geräte aktivieren, bevor du den Neukonfigurationsvorgang startest. Anweisungen zum Aktivieren des Geräts findest du im Handbuch deines Geräts.",
|
||||
"in_progress": "Das Gerät wird interviewt. Dies könnte eine Weile dauern.",
|
||||
@@ -3513,7 +3680,7 @@
|
||||
"issue": "Problem",
|
||||
"issues": {
|
||||
"entity_no_longer_recorded": "Diese Entität wird nicht mehr erfasst.",
|
||||
"entity_not_recorded": "Diese Einheit ist von der Erfassung ausgeschlossen.",
|
||||
"entity_not_recorded": "Diese Entität ist von der Erfassung ausgeschlossen.",
|
||||
"no_state": "Für diese Entität ist kein Status verfügbar.",
|
||||
"units_changed": "Die Einheit dieser Entität wurde von ''{metadata_unit}'' auf ''{state_unit}'' geändert.",
|
||||
"unsupported_state_class": "Die Zustandsklasse ''{state_class}'' dieser Entität wird nicht unterstützt.",
|
||||
@@ -3599,7 +3766,8 @@
|
||||
"grid": "Netz",
|
||||
"home": "Zu Hause",
|
||||
"non_fossil": "Nicht-fossil",
|
||||
"solar": "Solar"
|
||||
"solar": "Solar",
|
||||
"title_today": "Energieverteilung heute"
|
||||
},
|
||||
"energy_solar_graph": {
|
||||
"forecast": "Vorhersage {name}",
|
||||
@@ -3708,9 +3876,14 @@
|
||||
"card": {
|
||||
"alarm-panel": {
|
||||
"available_states": "Verfügbare Zustände",
|
||||
"description": "Mit der Alarmzentralen-Karte kannst du integrierte Alarmzentralen scharfschalten oder deaktivieren.",
|
||||
"description": "Mit der Alarmzentralen-Karte kannst du deine Alarmzentralen-Integrationen scharf- und unscharfschalten.",
|
||||
"name": "Alarmpanel"
|
||||
},
|
||||
"area": {
|
||||
"description": "Die Bereichskarte zeigt automatisch Entitäten eines bestimmten Bereichs an.",
|
||||
"name": "Bereich",
|
||||
"show_camera": "Kamerabild anstelle des Bereichsbildes anzeigen"
|
||||
},
|
||||
"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.",
|
||||
"description": "Mit der Schaltflächen-Karte kannst du Schaltflächen hinzufügen, um Aufgaben auszuführen.",
|
||||
@@ -3912,7 +4085,14 @@
|
||||
},
|
||||
"statistics-graph": {
|
||||
"description": "Mit der Karte Statistikdiagramm kannst du ein Diagramm der Statistiken für jede der aufgelisteten Entitäten anzeigen.",
|
||||
"name": "Statistikdiagramm"
|
||||
"name": "Statistikdiagramm",
|
||||
"period": "Zeitraum",
|
||||
"periods": {
|
||||
"5minute": "5 Minuten",
|
||||
"day": "Tag",
|
||||
"hour": "Stunde",
|
||||
"month": "Monat"
|
||||
}
|
||||
},
|
||||
"thermostat": {
|
||||
"description": "Die Thermostatkarte gibt dir die Kontrolle über deine Klimaeinheit. Sie ermöglicht es, die Temperatur und den Modus der Einheit zu ändern.",
|
||||
@@ -3957,7 +4137,7 @@
|
||||
"duplicate": "Karte duplizieren",
|
||||
"edit": "Bearbeiten",
|
||||
"header": "Kartenkonfiguration",
|
||||
"move": "Ansicht wechseln",
|
||||
"move": "In Ansicht verschieben",
|
||||
"move_after": "Karte nach hinten verschieben",
|
||||
"move_before": "Karte nach vorne verschieben",
|
||||
"move_down": "Karte nach unten verschieben",
|
||||
@@ -4085,7 +4265,7 @@
|
||||
"menu": {
|
||||
"close": "Schließen",
|
||||
"configure_ui": "Benutzeroberfläche konfigurieren",
|
||||
"exit_edit_mode": "Schließen des UI-Bearbeitungsmodus",
|
||||
"exit_edit_mode": "Erledigt",
|
||||
"help": "Hilfe",
|
||||
"reload_resources": "Ressourcen neu laden",
|
||||
"start_conversation": "Konversation starten"
|
||||
@@ -4316,7 +4496,8 @@
|
||||
"password_protection": "Passwortschutz",
|
||||
"select_type": "Wähle aus, was wiederhergestellt werden soll",
|
||||
"show_log": "Vollständiges Protokoll anzeigen",
|
||||
"type": "Backup-Typ"
|
||||
"type": "Backup-Typ",
|
||||
"upload_backup": "Backup hochladen"
|
||||
},
|
||||
"user": {
|
||||
"create_account": "Benutzerkonto anlegen",
|
||||
@@ -4482,7 +4663,7 @@
|
||||
}
|
||||
},
|
||||
"sidebar": {
|
||||
"done": "fertig",
|
||||
"done": "Fertig",
|
||||
"external_app_configuration": "App-Konfiguration",
|
||||
"hide_panel": "Panel ausblenden",
|
||||
"show_panel": "Panel anzeigen",
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -22,7 +22,7 @@
|
||||
"logbook": "Logbook",
|
||||
"mailbox": "Mailbox",
|
||||
"map": "Map",
|
||||
"media_browser": "Media Browser",
|
||||
"media_browser": "Media",
|
||||
"profile": "Profile",
|
||||
"shopping_list": "Shopping List",
|
||||
"states": "Overview"
|
||||
@@ -131,7 +131,7 @@
|
||||
"dashboard": {
|
||||
"action_error": {
|
||||
"get_changelog": "Failed to get add-on changelog",
|
||||
"go_to_config": "Failed to start add-on - configuration validation failed!",
|
||||
"go_to_config": "Edit Config",
|
||||
"install": "Failed to install add-on",
|
||||
"restart": "Failed to restart add-on",
|
||||
"start": "Failed to start add-on",
|
||||
@@ -286,6 +286,7 @@
|
||||
"delete_backup_text": "Do you want to delete {number} {number, plural,\n one {backup}\n other {backups}\n}?",
|
||||
"delete_backup_title": "Delete backup",
|
||||
"delete_selected": "Delete selected backups",
|
||||
"download_backup": "Download backup",
|
||||
"enter_password": "Please enter a password.",
|
||||
"failed_to_delete": "Failed to delete",
|
||||
"folders": "Folders",
|
||||
@@ -298,6 +299,7 @@
|
||||
"passwords_not_matching": "The passwords does not match",
|
||||
"select_type": "Select what to restore",
|
||||
"selected": "{number} selected",
|
||||
"size": "Size",
|
||||
"type": "Backup type",
|
||||
"upload_backup": "Upload backup"
|
||||
},
|
||||
@@ -323,8 +325,10 @@
|
||||
"reset_options": "Reset options",
|
||||
"restart": "Restart",
|
||||
"restart_name": "Restart {name}",
|
||||
"review": "review",
|
||||
"running_version": "You are currently running version {version}",
|
||||
"save": "Save",
|
||||
"show": "show",
|
||||
"show_more": "Show more information about this",
|
||||
"update": "Update",
|
||||
"update_available": "{count, plural,\n one {Update}\n other {{count} updates}\n} pending",
|
||||
@@ -405,7 +409,8 @@
|
||||
"repositories": {
|
||||
"add": "Add",
|
||||
"remove": "Remove",
|
||||
"title": "Manage add-on repositories"
|
||||
"title": "Manage add-on repositories",
|
||||
"used": "Repository is in use for installed add-ons and can't be removed."
|
||||
},
|
||||
"restart_addon": {
|
||||
"confirm_text": "Restart add-on",
|
||||
@@ -428,12 +433,14 @@
|
||||
"not_supported": "This redirect is not supported by your Home Assistant instance. Check the {link} for the supported redirects and the version they where introduced."
|
||||
},
|
||||
"panel": {
|
||||
"addons": "Add-ons",
|
||||
"backups": "Backups",
|
||||
"dashboard": "Dashboard",
|
||||
"store": "Add-on Store",
|
||||
"system": "System"
|
||||
},
|
||||
"store": {
|
||||
"check_updates": "Check for updates",
|
||||
"missing_addons": "Missing add-ons? Enable advanced mode in your user profile page",
|
||||
"no_results_found": "No results found in {repository}.",
|
||||
"registries": "Registries",
|
||||
@@ -526,6 +533,16 @@
|
||||
"update_supervisor": "Update the Supervisor",
|
||||
"warning": "WARNING"
|
||||
}
|
||||
},
|
||||
"update_available": {
|
||||
"core_note": "The supervisor will roll back to version {version} if your instance does not come up after the update.",
|
||||
"create_backup": "Create backup before updating",
|
||||
"creating_backup": "Creating backup of {name}",
|
||||
"description": "You have {version} installed. Click update to update to version {newest_version}",
|
||||
"no_update": "No update available for {name}",
|
||||
"open_release_notes": "Open release notes",
|
||||
"update_name": "Update {name}",
|
||||
"updating": "Updating {name} to version {version}"
|
||||
}
|
||||
},
|
||||
"ui": {
|
||||
@@ -534,6 +551,9 @@
|
||||
"confirm": "Yes",
|
||||
"decline": "No"
|
||||
},
|
||||
"backup": {
|
||||
"upload_backup": "Upload backup"
|
||||
},
|
||||
"card": {
|
||||
"alarm_control_panel": {
|
||||
"arm_away": "Arm away",
|
||||
@@ -545,6 +565,9 @@
|
||||
"code": "Code",
|
||||
"disarm": "Disarm"
|
||||
},
|
||||
"area": {
|
||||
"area_not_found": "Area not found."
|
||||
},
|
||||
"automation": {
|
||||
"last_triggered": "Last triggered",
|
||||
"trigger": "Run Actions"
|
||||
@@ -615,10 +638,17 @@
|
||||
},
|
||||
"media_player": {
|
||||
"browse_media": "Browse media",
|
||||
"media_next_track": "Next",
|
||||
"media_next_track": "Next track",
|
||||
"media_pause": "Pause",
|
||||
"media_play": "Play",
|
||||
"media_play_pause": "Play/pause",
|
||||
"media_previous_track": "Previous",
|
||||
"media_previous_track": "Previous track",
|
||||
"media_stop": "Stop",
|
||||
"media_volume_down": "Volume down",
|
||||
"media_volume_mute": "Volume mute",
|
||||
"media_volume_unmute": "Volume unmute",
|
||||
"media_volume_up": "Volume up",
|
||||
"nothing_playing": "Nothing Playing",
|
||||
"sound_mode": "Sound mode",
|
||||
"source": "Source",
|
||||
"text_to_speak": "Text to speak",
|
||||
@@ -726,6 +756,7 @@
|
||||
"save": "Save",
|
||||
"skip": "Skip",
|
||||
"stay": "Stay",
|
||||
"submit": "Submit",
|
||||
"successfully_deleted": "Successfully deleted",
|
||||
"successfully_saved": "Successfully saved",
|
||||
"undo": "Undo",
|
||||
@@ -736,11 +767,11 @@
|
||||
"addon": "Add-on",
|
||||
"error": {
|
||||
"fetch_addons": {
|
||||
"description": "Fetching add-ons returned an error.",
|
||||
"title": "Error fetching add-ons"
|
||||
"description": "There was an error loading add-ons.",
|
||||
"title": "Error loading add-ons"
|
||||
},
|
||||
"no_supervisor": {
|
||||
"description": "No Supervisor found, so add-ons could not be loaded.",
|
||||
"description": "Add-ons are not supported.",
|
||||
"title": "No Supervisor"
|
||||
}
|
||||
}
|
||||
@@ -820,7 +851,7 @@
|
||||
"logbook": {
|
||||
"by": "by",
|
||||
"by_service": "by service",
|
||||
"entries_not_found": "No logbook entries found.",
|
||||
"entries_not_found": "No logbook events found.",
|
||||
"messages": {
|
||||
"became_unavailable": "became unavailable",
|
||||
"changed_to_state": "changed to {state}",
|
||||
@@ -850,7 +881,7 @@
|
||||
"was_unplugged": "was unplugged",
|
||||
"was_unsafe": "was unsafe"
|
||||
},
|
||||
"retrieval_error": "Error during logbook entry retrieval",
|
||||
"retrieval_error": "Could not load logbook",
|
||||
"show_trace": "Show trace"
|
||||
},
|
||||
"media-browser": {
|
||||
@@ -881,7 +912,7 @@
|
||||
"documentation": "documentation",
|
||||
"learn_adding_local_media": "Learn more about adding media in the {documentation}.",
|
||||
"local_media_files": "Place your video, audio and image files in the media directory to be able to browse and play them in the browser or on supported media players.",
|
||||
"media-player-browser": "Media Player Browser",
|
||||
"media-player-browser": "Media",
|
||||
"media_browsing_error": "Media Browsing Error",
|
||||
"media_not_supported": "The Browser Media Player does not support this type of media",
|
||||
"media_player": "Media Player",
|
||||
@@ -900,7 +931,15 @@
|
||||
"label": "Picture",
|
||||
"unsupported_format": "Unsupported format, please choose a JPEG, PNG or GIF image."
|
||||
},
|
||||
"qr-scanner": {
|
||||
"enter_qr_code": "Enter QR code value",
|
||||
"manual_input": "You can scan the QR code with another QR scanner and paste the code in the input below",
|
||||
"not_supported": "Your browser doesn't support QR scanning.",
|
||||
"only_https_supported": "You can only use your camera to scan a QR code when using HTTPS.",
|
||||
"select_camera": "Select camera"
|
||||
},
|
||||
"related-filter-menu": {
|
||||
"filter": "Filter",
|
||||
"filter_by_area": "Filter by area",
|
||||
"filter_by_device": "Filter by device",
|
||||
"filter_by_entity": "Filter by entity",
|
||||
@@ -972,12 +1011,12 @@
|
||||
}
|
||||
},
|
||||
"target-picker": {
|
||||
"add_area_id": "Pick area",
|
||||
"add_device_id": "Pick device",
|
||||
"add_entity_id": "Pick entity",
|
||||
"add_area_id": "Choose area",
|
||||
"add_device_id": "Choose device",
|
||||
"add_entity_id": "Choose entity",
|
||||
"expand": "Expand",
|
||||
"expand_area_id": "Expand this area into the separate devices and entities that it contains. After expanding, it will not update the devices and entities when the area changes.",
|
||||
"expand_device_id": "Expand this device into the separate entities that it contains. After expanding, it will not update the entities when the device changes.",
|
||||
"expand_area_id": "Split this area into separate devices and entities.",
|
||||
"expand_device_id": "Split this device into separate entities.",
|
||||
"remove": "Remove",
|
||||
"remove_area_id": "Remove area",
|
||||
"remove_device_id": "Remove device",
|
||||
@@ -1012,8 +1051,22 @@
|
||||
"area": "Set entity area only",
|
||||
"area_note": "By default the entities of a device are in the same area as the device. If you change the area of this entity, it will no longer follow the area of the device.",
|
||||
"change_device_area": "Change device area",
|
||||
"confirm_delete": "Are you sure you want to delete this entry?",
|
||||
"confirm_delete": "Are you sure you want to delete this entity?",
|
||||
"delete": "Delete",
|
||||
"device_class": "Show as",
|
||||
"device_classes": {
|
||||
"binary_sensor": {
|
||||
"door": "Door",
|
||||
"garage_door": "Garage door",
|
||||
"opening": "Other",
|
||||
"window": "Window"
|
||||
},
|
||||
"cover": {
|
||||
"door": "Door",
|
||||
"garage": "Garage door",
|
||||
"window": "Window"
|
||||
}
|
||||
},
|
||||
"device_disabled": "The device of this entity is disabled.",
|
||||
"enabled_cause": "Disabled by {cause}.",
|
||||
"enabled_delay_confirm": "The enabled entities will be added to Home Assistant in {delay} seconds",
|
||||
@@ -1027,7 +1080,7 @@
|
||||
"name": "Name",
|
||||
"note": "Note: This might not work yet with all integrations.",
|
||||
"open_device_settings": "Open device settings",
|
||||
"unavailable": "This entity is not currently available.",
|
||||
"unavailable": "This entity is unavailable.",
|
||||
"update": "Update"
|
||||
},
|
||||
"faq": "documentation",
|
||||
@@ -1038,7 +1091,7 @@
|
||||
},
|
||||
"generic": {
|
||||
"cancel": "Cancel",
|
||||
"close": "close",
|
||||
"close": "Close",
|
||||
"default_confirmation_title": "Are you sure?",
|
||||
"ok": "OK"
|
||||
},
|
||||
@@ -1097,9 +1150,10 @@
|
||||
"cover": {
|
||||
"close_cover": "Close cover",
|
||||
"close_tile_cover": "Close cover tilt",
|
||||
"close_tilt_cover": "Close cover tilt",
|
||||
"open_cover": "Open cover",
|
||||
"open_tilt_cover": "Open cover tilt",
|
||||
"stop_cover": "Stop cover from moving"
|
||||
"stop_cover": "Stop cover"
|
||||
},
|
||||
"details": "Details",
|
||||
"dismiss": "Dismiss dialog",
|
||||
@@ -1180,7 +1234,7 @@
|
||||
"core": "General",
|
||||
"customize": "Customizations",
|
||||
"devices": "Devices",
|
||||
"energy": "Energy",
|
||||
"energy": "Energy Configuration",
|
||||
"entities": "Entities",
|
||||
"helpers": "Helpers",
|
||||
"info": "Info",
|
||||
@@ -1224,6 +1278,7 @@
|
||||
"statistics": "Statistics entities",
|
||||
"telegram": "Telegram notify services",
|
||||
"template": "Template entities",
|
||||
"themes": "Themes",
|
||||
"trend": "Trend entities",
|
||||
"universal": "Universal media player entities",
|
||||
"zone": "Zones"
|
||||
@@ -1239,7 +1294,10 @@
|
||||
"server_control": "Server"
|
||||
}
|
||||
},
|
||||
"filter_placeholder": "Entity Filter"
|
||||
"filter_placeholder": "Entity Filter",
|
||||
"key_c_hint": "Press 'c' on any page to open this search bar",
|
||||
"nothing_found": "Nothing found!",
|
||||
"title": "Quick Search"
|
||||
},
|
||||
"voice_command": {
|
||||
"did_not_hear": "Home Assistant did not hear anything",
|
||||
@@ -1315,6 +1373,7 @@
|
||||
"key_missing": "Required key ''{key}'' is missing.",
|
||||
"key_not_expected": "Key ''{key}'' is not expected or not supported by the visual editor.",
|
||||
"key_wrong_type": "The provided value for ''{key}'' is not supported by the visual editor. We support ({type_correct}) but received ({type_wrong}).",
|
||||
"no_state_array_support": "Multiple state values not supported in visual editor",
|
||||
"no_template_editor_support": "Templates not supported in visual editor",
|
||||
"no_type_provided": "No type provided."
|
||||
},
|
||||
@@ -1356,6 +1415,8 @@
|
||||
"link_profile_page": "your profile page"
|
||||
},
|
||||
"areas": {
|
||||
"add_picture": "Add a picture",
|
||||
"assigned_to_area": "Assigned to this area",
|
||||
"caption": "Areas",
|
||||
"data_table": {
|
||||
"area": "Area",
|
||||
@@ -1387,7 +1448,8 @@
|
||||
"introduction": "Areas are used to organize where devices are. This information will be used throughout Home Assistant to help you in organizing your interface, permissions and integrations with other systems.",
|
||||
"introduction2": "To place devices in an area, use the link below to navigate to the integrations page and then click on a configured integration to get to the device cards.",
|
||||
"no_areas": "Looks like you have no areas yet!"
|
||||
}
|
||||
},
|
||||
"targeting_area": "Targeting this area"
|
||||
},
|
||||
"automation": {
|
||||
"caption": "Automations",
|
||||
@@ -1399,6 +1461,7 @@
|
||||
"header": "Create a new automation",
|
||||
"how": "How do you want to create your new automation?",
|
||||
"start_empty": "Start with an empty automation",
|
||||
"start_empty_description": "Create a new automation from scratch",
|
||||
"thingtalk": {
|
||||
"create": "Create",
|
||||
"header": "Describe the automation you want to create",
|
||||
@@ -1616,8 +1679,9 @@
|
||||
"delete": "Delete",
|
||||
"delete_confirm": "Are you sure you want to delete this?",
|
||||
"duplicate": "Duplicate",
|
||||
"edit_id": "Edit trigger ID",
|
||||
"header": "Triggers",
|
||||
"id": "Trigger ID (used by the trigger condition)",
|
||||
"id": "Trigger ID",
|
||||
"introduction": "Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action.",
|
||||
"learn_more": "Learn more about triggers",
|
||||
"name": "Trigger",
|
||||
@@ -1626,7 +1690,7 @@
|
||||
"extra_fields": {
|
||||
"above": "Above",
|
||||
"below": "Below",
|
||||
"for": "Duration",
|
||||
"for": "Duration (optional)",
|
||||
"zone": "Zone"
|
||||
},
|
||||
"label": "Device",
|
||||
@@ -1667,10 +1731,10 @@
|
||||
},
|
||||
"state": {
|
||||
"attribute": "Attribute (optional)",
|
||||
"for": "For",
|
||||
"from": "From",
|
||||
"for": "For (optional)",
|
||||
"from": "From (optional)",
|
||||
"label": "State",
|
||||
"to": "To"
|
||||
"to": "To (optional)"
|
||||
},
|
||||
"sun": {
|
||||
"event": "Event:",
|
||||
@@ -1870,6 +1934,7 @@
|
||||
"tts": {
|
||||
"default_language": "Default language to use",
|
||||
"dialog": {
|
||||
"create_automation": "Create Automation",
|
||||
"example_message": "Hello {name}, you can play any text on any supported media player!",
|
||||
"header": "Try Text to Speech",
|
||||
"play": "Play",
|
||||
@@ -2004,7 +2069,7 @@
|
||||
},
|
||||
"core": {
|
||||
"caption": "General",
|
||||
"description": "Unit system, location, time zone & other general parameters",
|
||||
"description": "Location, network and analytics",
|
||||
"section": {
|
||||
"core": {
|
||||
"core_config": {
|
||||
@@ -2027,7 +2092,7 @@
|
||||
"unit_system_metric": "Metric"
|
||||
},
|
||||
"header": "General Configuration",
|
||||
"introduction": "Changing your configuration can be a tiresome process. We know. This section will try to make your life a little bit easier."
|
||||
"introduction": "Manage your location, network and analytics."
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -2052,6 +2117,48 @@
|
||||
"not_applied": "Changes made here are written in it, but will not be applied after a configuration reload unless the include is in place."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"automations": {
|
||||
"description": "Manage automations, scenes, scripts and helpers",
|
||||
"title": "Automations & Scenes"
|
||||
},
|
||||
"blueprints": {
|
||||
"description": "Pre-made automations and scripts by the community",
|
||||
"title": "Blueprints"
|
||||
},
|
||||
"companion": {
|
||||
"description": "Location and notifications",
|
||||
"title": "Companion App"
|
||||
},
|
||||
"dashboards": {
|
||||
"description": "Create customized sets of cards to control your home",
|
||||
"title": "Dashboards"
|
||||
},
|
||||
"devices": {
|
||||
"description": "Integrations, devices, entities and areas",
|
||||
"title": "Devices & Services"
|
||||
},
|
||||
"energy": {
|
||||
"description": "Monitor your energy production and consumption",
|
||||
"title": "Energy"
|
||||
},
|
||||
"people": {
|
||||
"description": "Manage the people and zones that Home Assistant tracks",
|
||||
"title": "People & Zones"
|
||||
},
|
||||
"settings": {
|
||||
"description": "Basic settings, server controls, logs and info",
|
||||
"title": "Settings"
|
||||
},
|
||||
"supervisor": {
|
||||
"description": "Create backups, check logs or reboot your system",
|
||||
"title": "Add-ons, Backups & Supervisor"
|
||||
},
|
||||
"tags": {
|
||||
"description": "Trigger automations when an NFC tag, QR code, etc. is scanned",
|
||||
"title": "Tags"
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"add_prompt": "No {name} have been added using this device yet. You can add one by clicking the + button above.",
|
||||
"automation": {
|
||||
@@ -2090,7 +2197,8 @@
|
||||
"integration": "Integration",
|
||||
"manufacturer": "Manufacturer",
|
||||
"model": "Model",
|
||||
"no_devices": "No devices"
|
||||
"no_devices": "No devices",
|
||||
"no_integration": "No integration"
|
||||
},
|
||||
"delete": "Delete",
|
||||
"description": "Manage configured devices",
|
||||
@@ -2102,6 +2210,7 @@
|
||||
"integration": "Integration",
|
||||
"user": "User"
|
||||
},
|
||||
"download_diagnostics": "Download diagnostics",
|
||||
"edit_settings": "Edit settings",
|
||||
"enabled_cause": "The device is disabled by {cause}.",
|
||||
"enabled_description": "Disabled devices will not be shown and entities belonging to the device will be disabled and not added to Home Assistant.",
|
||||
@@ -2195,7 +2304,7 @@
|
||||
"energy_stat": "Consumed Energy (m³)",
|
||||
"gas_usage": "Gas usage",
|
||||
"header": "Configure gas consumption",
|
||||
"m3_or_kWh": "m³ or kWh",
|
||||
"m3_or_kWh": "ft³, m³, Wh, kWh or MWh",
|
||||
"no_cost": "Do not track costs",
|
||||
"paragraph": "Gas consumption is the volume of gas that flows to your home."
|
||||
},
|
||||
@@ -2300,19 +2409,19 @@
|
||||
"title": "Unexpected state class"
|
||||
},
|
||||
"entity_unexpected_unit_energy": {
|
||||
"description": "The following entities do not have the expected units of measurement 'kWh' or 'Wh':",
|
||||
"description": "The following entities do not have the expected units of measurement 'Wh', 'kWh' or 'MWh':",
|
||||
"title": "Unexpected unit of measurement"
|
||||
},
|
||||
"entity_unexpected_unit_energy_price": {
|
||||
"description": "The following entities do not have the expected units of measurement ''{currency}/kWh'' or ''{currency}/Wh'':",
|
||||
"description": "The following entities do not have the expected units of measurement ''{currency}/kWh'', ''{currency}/Wh'' or ''{currency}/MWh'':",
|
||||
"title": "Unexpected unit of measurement"
|
||||
},
|
||||
"entity_unexpected_unit_gas": {
|
||||
"description": "The following entities do not have the expected units of measurement 'kWh', 'm³' or 'ft³':",
|
||||
"description": "The following entities do not have the expected units of measurement 'Wh', 'kWh' or 'MWh' for an energy sensor or 'm³' or 'ft³' for a gas sensor:",
|
||||
"title": "Unexpected unit of measurement"
|
||||
},
|
||||
"entity_unexpected_unit_gas_price": {
|
||||
"description": "The following entities do not have the expected units of measurement ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/m³'' or ''{currency}/ft³'':",
|
||||
"description": "The following entities do not have the expected units of measurement ''{currency}/kWh'', ''{currency}/Wh'', ''{currency}/MWh'', ''{currency}/m³'' or ''{currency}/ft³'':",
|
||||
"title": "Unexpected unit of measurement"
|
||||
},
|
||||
"recorder_untracked": {
|
||||
@@ -2395,6 +2504,7 @@
|
||||
"types": {
|
||||
"counter": "Counter",
|
||||
"input_boolean": "Toggle",
|
||||
"input_button": "Button",
|
||||
"input_datetime": "Date and/or time",
|
||||
"input_number": "Number",
|
||||
"input_select": "Dropdown",
|
||||
@@ -2456,14 +2566,18 @@
|
||||
"disable_restart_confirm": "Restart Home Assistant to finish disabling this integration",
|
||||
"disabled_polling": "Automatic polling for updated data disabled",
|
||||
"documentation": "Documentation",
|
||||
"download_diagnostics": "Download diagnostics",
|
||||
"enable_restart_confirm": "Restart Home Assistant to finish enabling this integration",
|
||||
"entities": "{count} {count, plural,\n one {entity}\n other {entities}\n}",
|
||||
"entity_unavailable": "Entity unavailable",
|
||||
"firmware": "Firmware: {version}",
|
||||
"hardware": "Hardware: {version}",
|
||||
"hub": "Connected via",
|
||||
"known_issues": "Known issues",
|
||||
"manuf": "by {manufacturer}",
|
||||
"no_area": "No Area",
|
||||
"not_loaded": "Not loaded",
|
||||
"open_configuration_url": "Visit device",
|
||||
"provided_by_custom_integration": "Provided by a custom integration",
|
||||
"reload": "Reload",
|
||||
"reload_confirm": "The integration was reloaded",
|
||||
@@ -2480,7 +2594,9 @@
|
||||
"setup_retry": "Retrying setup"
|
||||
},
|
||||
"system_options": "System options",
|
||||
"unnamed_entry": "Unnamed entry"
|
||||
"unknown_via_device": "Unknown device",
|
||||
"unnamed_entry": "Unnamed entry",
|
||||
"via": "Connected via"
|
||||
},
|
||||
"config_flow": {
|
||||
"aborted": "Aborted",
|
||||
@@ -2793,6 +2909,7 @@
|
||||
"link_integrations_page": "Integrations page",
|
||||
"link_presence_detection_integrations": "Presence Detection Integrations",
|
||||
"linked_user": "Linked User",
|
||||
"local_only": "Can only log in from the local network",
|
||||
"name": "Name",
|
||||
"name_error_msg": "Name is required",
|
||||
"new_person": "New Person",
|
||||
@@ -2811,6 +2928,7 @@
|
||||
"caption": "Scenes",
|
||||
"description": "Capture device states and easily recall them later",
|
||||
"editor": {
|
||||
"area": "Area",
|
||||
"default_name": "New Scene",
|
||||
"devices": {
|
||||
"add": "Add a device",
|
||||
@@ -2906,7 +3024,7 @@
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Server Controls",
|
||||
"description": "Restart and stop the Home Assistant server",
|
||||
"description": "Validate and restart the Home Assistant server",
|
||||
"section": {
|
||||
"reloading": {
|
||||
"automation": "Automations",
|
||||
@@ -2921,6 +3039,7 @@
|
||||
"history_stats": "History stats entities",
|
||||
"homekit": "HomeKit",
|
||||
"input_boolean": "Input booleans",
|
||||
"input_button": "Input buttons",
|
||||
"input_datetime": "Input date times",
|
||||
"input_number": "Input numbers",
|
||||
"input_select": "Input selects",
|
||||
@@ -2939,6 +3058,8 @@
|
||||
"statistics": "Statistics entities",
|
||||
"telegram": "Telegram notify services",
|
||||
"template": "Template entities",
|
||||
"themes": "Themes",
|
||||
"timer": "Timers",
|
||||
"trend": "Trend entities",
|
||||
"universal": "Universal media player entities",
|
||||
"zone": "Zones"
|
||||
@@ -2947,7 +3068,7 @@
|
||||
"confirm_restart": "Are you sure you want to restart Home Assistant?",
|
||||
"confirm_stop": "Are you sure you want to stop Home Assistant?",
|
||||
"heading": "Server management",
|
||||
"introduction": "Control your Home Assistant server… from Home Assistant.",
|
||||
"introduction": "Control your Home Assistant.",
|
||||
"restart": "Restart",
|
||||
"stop": "Stop"
|
||||
},
|
||||
@@ -2967,7 +3088,7 @@
|
||||
"confirm_remove": "Are you sure you want to remove tag {tag}?",
|
||||
"confirm_remove_title": "Remove tag?",
|
||||
"create_automation": "Create automation with tag",
|
||||
"description": "Trigger automations when a NFC tag, QR code, etc. is scanned",
|
||||
"description": "Trigger automations when an NFC tag, QR code, etc. is scanned",
|
||||
"detail": {
|
||||
"companion_apps": "companion apps",
|
||||
"create": "Create",
|
||||
@@ -2991,10 +3112,25 @@
|
||||
"no_tags": "No tags",
|
||||
"write": "Write"
|
||||
},
|
||||
"updates": {
|
||||
"check_unavailable": {
|
||||
"description": "You need to run the Home Assistant operating system to be able to check and install updates from the Home Assistant user interface.",
|
||||
"title": "Unable to check for updates"
|
||||
},
|
||||
"check_updates": "Check for updates",
|
||||
"more_updates": "+ {count} Updates",
|
||||
"review": "review",
|
||||
"show": "show",
|
||||
"show_all_updates": "Show all updates",
|
||||
"title": "{count} {count, plural,\n one {update}\n other {updates}\n}",
|
||||
"unable_to_fetch": "Unable to load updates",
|
||||
"version_available": "Version {version_available} is available"
|
||||
},
|
||||
"users": {
|
||||
"add_user": {
|
||||
"caption": "Add user",
|
||||
"create": "Create",
|
||||
"local_only": "Local only",
|
||||
"password": "Password",
|
||||
"password_confirm": "Confirm Password",
|
||||
"password_not_match": "Passwords don't match"
|
||||
@@ -3013,25 +3149,31 @@
|
||||
"delete_user": "Delete user",
|
||||
"group": "Group",
|
||||
"id": "ID",
|
||||
"local_only": "Can only log in from the local network",
|
||||
"name": "Display name",
|
||||
"new_password": "New Password",
|
||||
"owner": "Owner",
|
||||
"password_changed": "Password was changed successfully",
|
||||
"system_generated": "System generated",
|
||||
"system_generated_users_not_editable": "Unable to update system generated users.",
|
||||
"system_generated_users_not_removable": "Unable to remove system generated users.",
|
||||
"system_generated": "System user",
|
||||
"system_generated_users_not_editable": "Unable to update system users.",
|
||||
"system_generated_users_not_removable": "Unable to remove system users.",
|
||||
"unnamed_user": "Unnamed User",
|
||||
"update_user": "Update",
|
||||
"username": "Username"
|
||||
},
|
||||
"is_local": "Local user",
|
||||
"is_not_active": "Disabled",
|
||||
"is_owner": "Owner",
|
||||
"is_system": "System user",
|
||||
"picker": {
|
||||
"add_user": "Add user",
|
||||
"headers": {
|
||||
"group": "Group",
|
||||
"is_active": "Active",
|
||||
"is_owner": "Owner",
|
||||
"local": "Local",
|
||||
"name": "Display name",
|
||||
"system": "System generated",
|
||||
"system": "System",
|
||||
"username": "Username"
|
||||
}
|
||||
},
|
||||
@@ -3123,6 +3265,7 @@
|
||||
"visualization": {
|
||||
"auto_zoom": "Auto Zoom",
|
||||
"caption": "Visualization",
|
||||
"enable_physics": "Enable Physics",
|
||||
"header": "Network Visualization",
|
||||
"highlight_label": "Highlight Devices",
|
||||
"refresh_topology": "Refresh Topology",
|
||||
@@ -3256,13 +3399,21 @@
|
||||
"zwave_js": {
|
||||
"add_node": {
|
||||
"cancel_inclusion": "Cancel Inclusion",
|
||||
"check_logs": "Please check the logs for more information.",
|
||||
"choose_inclusion_strategy": "How do you want to add your device",
|
||||
"controller_in_inclusion_mode": "Your Z-Wave controller is now in inclusion mode.",
|
||||
"enter_qr_code": "Enter QR code value",
|
||||
"follow_device_instructions": "Follow the directions that came with your device to trigger pairing on the device.",
|
||||
"inclusion_failed": "The device could not be added. Please check the logs for more information.",
|
||||
"inclusion_failed": "The device could not be added.",
|
||||
"inclusion_finished": "The device has been added.",
|
||||
"interview_failed": "The device interview failed. Additional information may be available in the logs.",
|
||||
"interview_started": "The device is being interviewed. This may take some time.",
|
||||
"introduction": "This wizard will guide you through adding a node to your Z-Wave network.",
|
||||
"provisioning_finished": "The device has been added. Once you power it on, it will become available.",
|
||||
"qr_code": "QR Code",
|
||||
"qr_code_paragraph": "If your device supports SmartStart you can scan the QR code for easy pairing.",
|
||||
"scan_qr_code": "Scan QR code",
|
||||
"searching_device": "Searching for device",
|
||||
"secure_inclusion_warning": "Secure devices require additional bandwidth; too many secure devices can slow down your Z-Wave network. We recommend only using secure inclusion for devices that require it, like locks or garage door openers.",
|
||||
"security_classes": {
|
||||
"S0_Legacy": {
|
||||
@@ -3282,6 +3433,7 @@
|
||||
"title": "S2 Unauthenticated"
|
||||
}
|
||||
},
|
||||
"select_camera": "Select camera",
|
||||
"start_inclusion": "Start Inclusion",
|
||||
"start_secure_inclusion": "Start Secure Inclusion",
|
||||
"title": "Add a Z-Wave Device",
|
||||
@@ -3290,6 +3442,7 @@
|
||||
},
|
||||
"common": {
|
||||
"add_node": "Add device",
|
||||
"back": "Back",
|
||||
"close": "Close",
|
||||
"heal_network": "Heal Network",
|
||||
"home_id": "Home ID",
|
||||
@@ -3300,10 +3453,11 @@
|
||||
"source": "Source"
|
||||
},
|
||||
"dashboard": {
|
||||
"devices": "{count} {count, plural,\n one {device}\n other {devices}\n}",
|
||||
"driver_version": "Driver Version",
|
||||
"dump_dead_nodes_text": "Some of your devices didn't respond and are assumed dead. These will not be fully exported.",
|
||||
"dump_dead_nodes_title": "Some of your devices are dead",
|
||||
"dump_debug": "Download a dump of your network to help diagnose issues",
|
||||
"dump_debug": "Download data",
|
||||
"dump_not_ready_confirm": "Download",
|
||||
"dump_not_ready_text": "If you create an export while not all devices are ready, you could miss needed data. Give your network some time to query all devices. Do you want to continue with the dump?",
|
||||
"dump_not_ready_title": "Not all devices are ready yet",
|
||||
@@ -3311,6 +3465,9 @@
|
||||
"home_id": "Home ID",
|
||||
"introduction": "Manage your Z-Wave network and Z-Wave devices",
|
||||
"nodes_ready": "Devices ready",
|
||||
"not_ready": "{count} not ready",
|
||||
"provisioned_devices": "Provisioned devices",
|
||||
"server_url": "Server URL",
|
||||
"server_version": "Server Version"
|
||||
},
|
||||
"device_info": {
|
||||
@@ -3351,6 +3508,7 @@
|
||||
"traffic_warning": "The healing process generates a large amount of traffic on the Z-Wave network. This may cause devices to respond slowly (or not at all) while the heal is in progress."
|
||||
},
|
||||
"logs": {
|
||||
"download_logs": "Download logs",
|
||||
"log_level": "Log Level",
|
||||
"log_level_changed": "Log Level changed to: {level}",
|
||||
"subscribed_to_logs": "Subscribed to Z-Wave JS Log Messages…",
|
||||
@@ -3385,6 +3543,15 @@
|
||||
"dead": "Dead",
|
||||
"unknown": "Unknown"
|
||||
},
|
||||
"provisioned": {
|
||||
"confirm_unprovision_text": "If you unprovision the device it will not be added to Home Assistant when it is powered on. If it is already added to Home Assistant, removing the provisioned device will not remove it from Home Assistant.",
|
||||
"confirm_unprovision_title": "Are you sure you want to unprovision the device?",
|
||||
"dsk": "DSK",
|
||||
"included": "Included",
|
||||
"not_included": "Not Included",
|
||||
"security_classes": "Security classes",
|
||||
"unprovison": "Unprovison"
|
||||
},
|
||||
"reinterview_node": {
|
||||
"battery_device_warning": "You will need to wake battery powered devices before starting the re-interview. Refer to your device's manual for instructions on how to wake the device.",
|
||||
"in_progress": "The device is being interviewed. This may take some time.",
|
||||
@@ -3599,7 +3766,8 @@
|
||||
"grid": "Grid",
|
||||
"home": "Home",
|
||||
"non_fossil": "Non-fossil",
|
||||
"solar": "Solar"
|
||||
"solar": "Solar",
|
||||
"title_today": "Energy distribution today"
|
||||
},
|
||||
"energy_solar_graph": {
|
||||
"forecast": "Forecast {name}",
|
||||
@@ -3708,9 +3876,14 @@
|
||||
"card": {
|
||||
"alarm-panel": {
|
||||
"available_states": "Available States",
|
||||
"description": "The Alarm Panel card allows you to Arm and Disarm your alarm control panel integrations.",
|
||||
"description": "The Alarm Panel card allows you to arm and disarm your alarm control panel integrations.",
|
||||
"name": "Alarm Panel"
|
||||
},
|
||||
"area": {
|
||||
"description": "The Area card automatically displays entities of a specific area.",
|
||||
"name": "Area",
|
||||
"show_camera": "Show camera feed instead of area picture"
|
||||
},
|
||||
"button": {
|
||||
"default_action_help": "The default action depends on the entity's capabilities, it will either be toggled or the more info dialog will be shown.",
|
||||
"description": "The Button card allows you to add buttons to perform tasks.",
|
||||
@@ -3912,7 +4085,14 @@
|
||||
},
|
||||
"statistics-graph": {
|
||||
"description": "The Statistics Graph card allows you to display a graph of the statistics for each of the entities listed.",
|
||||
"name": "Statistics Graph"
|
||||
"name": "Statistics Graph",
|
||||
"period": "Period",
|
||||
"periods": {
|
||||
"5minute": "5 Minutes",
|
||||
"day": "Day",
|
||||
"hour": "Hour",
|
||||
"month": "Month"
|
||||
}
|
||||
},
|
||||
"thermostat": {
|
||||
"description": "The Thermostat card gives control of your climate entity. Allowing you to change the temperature and mode of the entity.",
|
||||
@@ -4085,7 +4265,7 @@
|
||||
"menu": {
|
||||
"close": "Close",
|
||||
"configure_ui": "Edit Dashboard",
|
||||
"exit_edit_mode": "Exit UI edit mode",
|
||||
"exit_edit_mode": "Done",
|
||||
"help": "Help",
|
||||
"reload_resources": "Reload resources",
|
||||
"start_conversation": "Start conversation"
|
||||
@@ -4316,7 +4496,8 @@
|
||||
"password_protection": "Password protection",
|
||||
"select_type": "Select what to restore",
|
||||
"show_log": "Show full log",
|
||||
"type": "Backup type"
|
||||
"type": "Backup type",
|
||||
"upload_backup": "Upload backup"
|
||||
},
|
||||
"user": {
|
||||
"create_account": "Create Account",
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user