Compare commits

...
15 Commits
Author SHA1 Message Date
Paulus Schoutsen 368973b668 Add app alias 2020-06-21 12:37:12 -07:00
Paulus SchoutsenandGitHub b3b42b741d Upgrade to latest terser webpack plugin (#6199) 2020-06-20 22:51:29 -07:00
HomeAssistant Azure 020f115d7c [ci skip] Translation update 2020-06-21 00:32:58 +00:00
Bram Kragten 6891f1df1c Bumped version to 20200620.0 2020-06-20 15:56:19 +02:00
Bram KragtenandGitHub 497494620d Log cast config fetch errors (#6197) 2020-06-20 15:40:29 +02:00
7a13242077 Logbook + History allow date/time filter (#6192)
Co-authored-by: Paulus Schoutsen <[email protected]>
2020-06-20 15:39:52 +02:00
Bram KragtenandGitHub b9d6973a79 ZHA: Bring back clusters UI (#6191) 2020-06-20 15:38:27 +02:00
Bram KragtenandGitHub ed0e8c5e8d Move MQTT dev tools to integrations (#6189) 2020-06-20 14:52:56 +02:00
HomeAssistant Azure d8f530f8ac [ci skip] Translation update 2020-06-20 00:32:36 +00:00
HomeAssistant Azure a46874b7ff [ci skip] Translation update 2020-06-19 00:32:29 +00:00
Bram KragtenandGitHub cf68f25a03 Don't throw errors in card picker (#6188) 2020-06-18 16:26:31 -07:00
Joakim SørensenandGitHub 16c604937e Display docker version (#5989) 2020-06-18 11:54:21 +02:00
Paulus SchoutsenandGitHub 5cbffb23fd Remove check if config is loaded (#6123) 2020-06-18 11:18:33 +02:00
HomeAssistant Azure 6de38d3b85 [ci skip] Translation update 2020-06-18 00:32:18 +00:00
rajlaudandGitHub b34ce577d9 Add discovery to list of configuration flow sources whose entries can be ignored (#6185)
Add "discovery" to the list of configuration flow sources whose config flow entries can be ignored. For example, https://github.com/home-assistant/core/pull/35669. I've tested it on the squeezebox integration and it works.
2020-06-17 16:08:26 -07:00
105 changed files with 2549 additions and 1446 deletions
+1 -5
View File
@@ -66,11 +66,7 @@
"import/prefer-default-export": 0,
"import/no-unresolved": 0,
"import/no-cycle": 0,
"import/extensions": [
2,
"ignorePackages",
{ "ts": "never", "js": "never" }
],
"import/extensions": 0,
"no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
"object-curly-newline": 0,
"default-case": 0,
+2 -2
View File
@@ -1,3 +1,3 @@
import "../../../src/resources/ha-style";
import "../../../src/resources/roboto";
import "~app/resources/ha-style";
import "~app/resources/roboto";
import "./layout/hc-connect";
+3 -3
View File
@@ -1,7 +1,7 @@
/* eslint-disable no-undef */
import { CAST_NS } from "../../../src/cast/const";
import { HassMessage } from "../../../src/cast/receiver_messages";
import "../../../src/resources/custom-card-support";
import { CAST_NS } from "~app/cast/const";
import { HassMessage } from "~app/cast/receiver_messages";
import "~app/resources/custom-card-support";
import { castContext } from "./cast_context";
import { HcMain } from "./layout/hc-main";
import { ReceivedMessage } from "./types";
+2
View File
@@ -192,6 +192,8 @@ export class HcMain extends HassElement {
this._handleNewLovelaceConfig(lovelaceConfig)
);
} catch (err) {
// eslint-disable-next-line
console.log("Error fetching Lovelace configuration", err, msg);
// Generate a Lovelace config.
this._unsubLovelace = () => undefined;
await this._generateLovelaceConfig();
+2 -2
View File
@@ -2,8 +2,8 @@ import "@polymer/app-layout/app-toolbar/app-toolbar";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../../src/components/ha-switch";
import "../../../src/components/ha-formfield";
import "~app/components/ha-switch";
import "~app/components/ha-formfield";
import "./demo-card";
class DemoCards extends PolymerElement {
+2 -2
View File
@@ -1,5 +1,5 @@
import "../../src/resources/compatibility";
import "../../src/resources/roboto";
import "~app/resources/compatibility";
import "~app/resources/roboto";
import "./hassio-main";
const styleEl = document.createElement("style");
+9 -1
View File
@@ -14,7 +14,9 @@ import {
createHassioSession,
fetchHassioHomeAssistantInfo,
fetchHassioSupervisorInfo,
fetchHassioInfo,
HassioHomeAssistantInfo,
HassioInfo,
HassioPanelInfo,
HassioSupervisorInfo,
} from "../../src/data/hassio/supervisor";
@@ -75,6 +77,8 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
@property() private _hostInfo: HassioHostInfo;
@property() private _hassioInfo?: HassioInfo;
@property() private _hassOsInfo?: HassioHassOSInfo;
@property() private _hassInfo: HassioHomeAssistantInfo;
@@ -147,6 +151,7 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
hass: this.hass,
narrow: this.narrow,
supervisorInfo: this._supervisorInfo,
hassioInfo: this._hassioInfo,
hostInfo: this._hostInfo,
hassInfo: this._hassInfo,
hassOsInfo: this._hassOsInfo,
@@ -156,6 +161,7 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
el.hass = this.hass;
el.narrow = this.narrow;
el.supervisorInfo = this._supervisorInfo;
el.hassioInfo = this._hassioInfo;
el.hostInfo = this._hostInfo;
el.hassInfo = this._hassInfo;
el.hassOsInfo = this._hassOsInfo;
@@ -169,12 +175,14 @@ class HassioMain extends ProvideHassLitMixin(HassRouterPage) {
return;
}
const [supervisorInfo, hostInfo, hassInfo] = await Promise.all([
const [supervisorInfo, hostInfo, hassInfo, hassioInfo] = await Promise.all([
fetchHassioSupervisorInfo(this.hass),
fetchHassioHostInfo(this.hass),
fetchHassioHomeAssistantInfo(this.hass),
fetchHassioInfo(this.hass),
]);
this._supervisorInfo = supervisorInfo;
this._hassioInfo = hassioInfo;
this._hostInfo = hostInfo;
this._hassInfo = hassInfo;
+4
View File
@@ -3,6 +3,7 @@ import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host";
import {
HassioHomeAssistantInfo,
HassioSupervisorInfo,
HassioInfo,
} from "../../src/data/hassio/supervisor";
import {
HassRouterPage,
@@ -26,6 +27,8 @@ class HassioPanelRouter extends HassRouterPage {
@property({ attribute: false }) public supervisorInfo: HassioSupervisorInfo;
@property({ attribute: false }) public hassioInfo!: HassioInfo;
@property({ attribute: false }) public hostInfo: HassioHostInfo;
@property({ attribute: false }) public hassInfo: HassioHomeAssistantInfo;
@@ -54,6 +57,7 @@ class HassioPanelRouter extends HassRouterPage {
el.route = this.route;
el.narrow = this.narrow;
el.supervisorInfo = this.supervisorInfo;
el.hassioInfo = this.hassioInfo;
el.hostInfo = this.hostInfo;
el.hassInfo = this.hassInfo;
el.hassOsInfo = this.hassOsInfo;
+4
View File
@@ -10,6 +10,7 @@ import { HassioHassOSInfo, HassioHostInfo } from "../../src/data/hassio/host";
import {
HassioHomeAssistantInfo,
HassioSupervisorInfo,
HassioInfo,
} from "../../src/data/hassio/supervisor";
import type { PageNavigation } from "../../src/layouts/hass-tabs-subpage";
import { HomeAssistant, Route } from "../../src/types";
@@ -48,6 +49,8 @@ class HassioPanel extends LitElement {
@property({ attribute: false }) public supervisorInfo!: HassioSupervisorInfo;
@property({ attribute: false }) public hassioInfo!: HassioInfo;
@property({ attribute: false }) public hostInfo!: HassioHostInfo;
@property({ attribute: false }) public hassInfo!: HassioHomeAssistantInfo;
@@ -61,6 +64,7 @@ class HassioPanel extends LitElement {
.hass=${this.hass}
.narrow=${this.narrow}
.supervisorInfo=${this.supervisorInfo}
.hassioInfo=${this.hassioInfo}
.hostInfo=${this.hostInfo}
.hassInfo=${this.hassInfo}
.hassOsInfo=${this.hassOsInfo}
+9
View File
@@ -19,6 +19,7 @@ import {
shutdownHost,
updateOS,
} from "../../../src/data/hassio/host";
import { HassioInfo } from "../../../src/data/hassio/supervisor";
import {
showAlertDialog,
showConfirmationDialog,
@@ -35,6 +36,8 @@ class HassioHostInfo extends LitElement {
@property() public hostInfo!: HassioHostInfoType;
@property({ attribute: false }) public hassioInfo!: HassioInfo;
@property() public hassOsInfo!: HassioHassOSInfo;
@property() private _errors?: string;
@@ -54,6 +57,12 @@ class HassioHostInfo extends LitElement {
<td>System</td>
<td>${this.hostInfo.operating_system}</td>
</tr>
${!this.hostInfo.features.includes("hassos")
? html`<tr>
<td>Docker version</td>
<td>${this.hassioInfo.docker}</td>
</tr>`
: ""}
${this.hostInfo.deployment
? html`
<tr>
+8 -2
View File
@@ -11,7 +11,10 @@ import {
HassioHassOSInfo,
HassioHostInfo,
} from "../../../src/data/hassio/host";
import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor";
import {
HassioSupervisorInfo,
HassioInfo,
} from "../../../src/data/hassio/supervisor";
import "../../../src/layouts/hass-tabs-subpage";
import { haStyle } from "../../../src/resources/styles";
import { HomeAssistant, Route } from "../../../src/types";
@@ -31,9 +34,11 @@ class HassioSystem extends LitElement {
@property() public supervisorInfo!: HassioSupervisorInfo;
@property({ attribute: false }) public hassioInfo!: HassioInfo;
@property() public hostInfo!: HassioHostInfo;
@property() public hassOsInfo!: HassioHassOSInfo;
@property({ attribute: false }) public hassOsInfo!: HassioHassOSInfo;
public render(): TemplateResult | void {
return html`
@@ -55,6 +60,7 @@ class HassioSystem extends LitElement {
></hassio-supervisor-info>
<hassio-host-info
.hass=${this.hass}
.hassioInfo=${this.hassioInfo}
.hostInfo=${this.hostInfo}
.hassOsInfo=${this.hassOsInfo}
></hassio-host-info>
+5 -1
View File
@@ -22,6 +22,7 @@
"author": "Paulus Schoutsen <[email protected]> (http://paulusschoutsen.nl)",
"license": "Apache-2.0",
"dependencies": {
"~app": "file:./src",
"@formatjs/intl-pluralrules": "^1.5.8",
"@fullcalendar/core": "^5.0.0-beta.2",
"@fullcalendar/daygrid": "^5.0.0-beta.2",
@@ -74,6 +75,7 @@
"@thomasloven/round-slider": "0.5.0",
"@vaadin/vaadin-combo-box": "^5.0.10",
"@vaadin/vaadin-date-picker": "^4.0.7",
"@vue/web-component-wrapper": "^1.2.0",
"@webcomponents/webcomponentsjs": "^2.2.7",
"chart.js": "~2.8.0",
"chartjs-chart-timeline": "^0.3.0",
@@ -106,6 +108,8 @@
"roboto-fontface": "^0.10.0",
"superstruct": "^0.6.1",
"unfetch": "^4.1.0",
"vue": "^2.6.11",
"vue2-daterange-picker": "^0.5.1",
"web-animations-js": "^2.3.2",
"workbox-core": "^5.1.3",
"workbox-precaching": "^5.1.3",
@@ -185,7 +189,7 @@
"sinon": "^7.3.1",
"source-map-url": "^0.4.0",
"systemjs": "^6.3.2",
"terser-webpack-plugin": "^1.2.3",
"terser-webpack-plugin": "^3.0.6",
"ts-lit-plugin": "^1.1.10",
"ts-mocha": "^6.0.0",
"typescript": "^3.8.3",
+1 -1
View File
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
version="20200617.0",
version="20200620.0",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",
+228
View File
@@ -0,0 +1,228 @@
import Vue from "vue";
import wrap from "@vue/web-component-wrapper";
import DateRangePicker from "vue2-daterange-picker";
// @ts-ignore
import dateRangePickerStyles from "vue2-daterange-picker/dist/vue2-daterange-picker.css";
import { fireEvent } from "../common/dom/fire_event";
import { Constructor } from "../types";
import { customElement } from "lit-element/lib/decorators";
const Component = Vue.extend({
props: {
twentyfourHours: {
type: Boolean,
default: true,
},
disabled: {
type: Boolean,
default: false,
},
ranges: {
type: Boolean,
default: true,
},
startDate: {
type: [String, Date],
default() {
return new Date();
},
},
endDate: {
type: [String, Date],
default() {
return new Date();
},
},
},
render(createElement) {
// @ts-ignore
return createElement(DateRangePicker, {
props: {
"time-picker": true,
"auto-apply": false,
opens: "right",
"show-dropdowns": false,
"time-picker24-hour": this.twentyfourHours,
disabled: this.disabled,
ranges: this.ranges ? {} : false,
},
model: {
value: {
startDate: this.startDate,
endDate: this.endDate,
},
callback: (value) => {
// @ts-ignore
fireEvent(this.$el as HTMLElement, "change", value);
},
expression: "dateRange",
},
scopedSlots: {
input() {
return createElement("slot", {
domProps: { name: "input" },
});
},
header() {
return createElement("slot", {
domProps: { name: "header" },
});
},
ranges() {
return createElement("slot", {
domProps: { name: "ranges" },
});
},
footer() {
return createElement("slot", {
domProps: { name: "footer" },
});
},
},
});
},
});
const WrappedElement: Constructor<HTMLElement> = wrap(Vue, Component);
@customElement("date-range-picker")
class DateRangePickerElement extends WrappedElement {
constructor() {
super();
const style = document.createElement("style");
style.innerHTML = `
${dateRangePickerStyles}
.calendars {
display: flex;
}
.daterangepicker {
left: 0px !important;
top: auto;
background-color: var(--card-background-color);
border: none;
border-radius: var(--ha-card-border-radius, 4px);
box-shadow: var(
--ha-card-box-shadow,
0px 2px 1px -1px rgba(0, 0, 0, 0.2),
0px 1px 1px 0px rgba(0, 0, 0, 0.14),
0px 1px 3px 0px rgba(0, 0, 0, 0.12)
);
color: var(--primary-text-color);
min-width: initial !important;
}
.daterangepicker:after {
border-bottom: 6px solid var(--card-background-color);
}
.daterangepicker .calendar-table {
background-color: var(--card-background-color);
border: none;
}
.daterangepicker .calendar-table td,
.daterangepicker .calendar-table th {
background-color: transparent;
color: var(--secondary-text-color);
border-radius: 0;
outline: none;
width: 32px;
height: 32px;
}
.daterangepicker td.off,
.daterangepicker td.off.end-date,
.daterangepicker td.off.in-range,
.daterangepicker td.off.start-date {
background-color: var(--secondary-background-color);
color: var(--disabled-text-color);
}
.daterangepicker td.in-range {
background-color: var(--light-primary-color);
color: var(--primary-text-color);
}
.daterangepicker td.active,
.daterangepicker td.active:hover {
background-color: var(--primary-color);
color: var(--text-primary-color);
}
.daterangepicker td.start-date.end-date {
border-radius: 50%;
}
.daterangepicker td.start-date {
border-radius: 50% 0 0 50%;
}
.daterangepicker td.end-date {
border-radius: 0 50% 50% 0;
}
.reportrange-text {
background: none !important;
padding: 0 !important;
border: none !important;
}
.daterangepicker .calendar-table .next span,
.daterangepicker .calendar-table .prev span {
border: solid var(--primary-text-color);
border-width: 0 2px 2px 0;
}
.daterangepicker .ranges li {
outline: none;
}
.daterangepicker .ranges li:hover {
background-color: var(--secondary-background-color);
}
.daterangepicker .ranges li.active {
background-color: var(--primary-color);
color: var(--text-primary-color);
}
.daterangepicker select.ampmselect,
.daterangepicker select.hourselect,
.daterangepicker select.minuteselect,
.daterangepicker select.secondselect {
background: transparent;
border: 1px solid var(--divider-color);
color: var(--primary-color);
}
.daterangepicker .drp-buttons .btn {
border: 1px solid var(--primary-color);
background-color: transparent;
color: var(--primary-color);
border-radius: 4px;
padding: 8px;
cursor: pointer;
}
.calendars-container {
flex-direction: column;
align-items: center;
}
.drp-calendar.col.right .calendar-table {
display: none;
}
.daterangepicker.show-ranges .drp-calendar.left {
border-left: 0px;
}
.daterangepicker .drp-calendar.left {
padding: 8px;
}
.daterangepicker.show-calendar .ranges {
margin-top: 0;
padding-top: 8px;
border-right: 1px solid var(--divider-color);
}
@media only screen and (max-width: 800px) {
.calendars {
flex-direction: column;
}
}
.calendar-table {
padding: 0 !important;
}
`;
const shadowRoot = this.shadowRoot!;
shadowRoot.appendChild(style);
// Stop click events from reaching the document, otherwise it will close the picker immediately.
shadowRoot.addEventListener("click", (ev) => ev.stopPropagation());
}
}
declare global {
interface HTMLElementTagNameMap {
"date-range-picker": DateRangePickerElement;
}
}
+195
View File
@@ -0,0 +1,195 @@
import {
css,
CSSResult,
customElement,
html,
LitElement,
property,
TemplateResult,
PropertyValues,
} from "lit-element";
import { HomeAssistant } from "../types";
import { mdiCalendar } from "@mdi/js";
import { formatDateTime } from "../common/datetime/format_date_time";
import "@material/mwc-button/mwc-button";
import "@material/mwc-list/mwc-list-item";
import "./ha-svg-icon";
import "@polymer/paper-input/paper-input";
import "@material/mwc-list/mwc-list";
import "./date-range-picker";
export interface DateRangePickerRanges {
[key: string]: [Date, Date];
}
@customElement("ha-date-range-picker")
export class HaDateRangePicker extends LitElement {
@property() public hass!: HomeAssistant;
@property() public startDate!: Date;
@property() public endDate!: Date;
@property() public ranges?: DateRangePickerRanges;
@property({ type: Boolean }) public disabled = false;
@property({ type: Boolean }) private _hour24format = false;
protected updated(changedProps: PropertyValues) {
if (changedProps.has("hass")) {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
if (!oldHass || oldHass.language !== this.hass.language) {
this._hour24format = this._compute24hourFormat();
}
}
}
protected render(): TemplateResult {
return html`
<date-range-picker
?disabled=${this.disabled}
twentyfour-hours=${this._hour24format}
start-date=${this.startDate}
end-date=${this.endDate}
?ranges=${this.ranges !== undefined}
>
<div slot="input" class="date-range-inputs">
<ha-svg-icon path=${mdiCalendar}></ha-svg-icon>
<paper-input
.value=${formatDateTime(this.startDate, this.hass.language)}
.label=${this.hass.localize(
"ui.components.date-range-picker.start_date"
)}
.disabled=${this.disabled}
@click=${this._handleInputClick}
readonly
></paper-input>
<paper-input
.value=${formatDateTime(this.endDate, this.hass.language)}
label=${this.hass.localize(
"ui.components.date-range-picker.end_date"
)}
.disabled=${this.disabled}
@click=${this._handleInputClick}
readonly
></paper-input>
</div>
${this.ranges
? html`<div slot="ranges" class="date-range-ranges">
<mwc-list @click=${this._setDateRange}>
${Object.entries(this.ranges).map(
([name, dates]) => html`<mwc-list-item
.activated=${this.startDate.getTime() ===
dates[0].getTime() &&
this.endDate.getTime() === dates[1].getTime()}
.startDate=${dates[0]}
.endDate=${dates[1]}
>
${name}
</mwc-list-item>`
)}
</mwc-list>
</div>`
: ""}
<div slot="footer" class="date-range-footer">
<mwc-button @click=${this._cancelDateRange}
>${this.hass.localize("ui.common.cancel")}</mwc-button
>
<mwc-button @click=${this._applyDateRange}
>${this.hass.localize(
"ui.components.date-range-picker.select"
)}</mwc-button
>
</div>
</date-range-picker>
`;
}
private _compute24hourFormat() {
return (
new Intl.DateTimeFormat(this.hass.language, {
hour: "numeric",
})
.formatToParts(new Date(2020, 0, 1, 13))
.find((part) => part.type === "hour")!.value.length === 2
);
}
private _setDateRange(ev: Event) {
const target = ev.target as any;
const startDate = target.startDate;
const endDate = target.endDate;
const dateRangePicker = this._dateRangePicker;
dateRangePicker.clickRange([startDate, endDate]);
dateRangePicker.clickedApply();
}
private _cancelDateRange() {
this._dateRangePicker.clickCancel();
}
private _applyDateRange() {
this._dateRangePicker.clickedApply();
}
private get _dateRangePicker() {
const dateRangePicker = this.shadowRoot!.querySelector(
"date-range-picker"
) as any;
return dateRangePicker.vueComponent.$children[0];
}
private _handleInputClick() {
// close the date picker, so it will open again on the click event
if (this._dateRangePicker.open) {
this._dateRangePicker.open = false;
}
}
static get styles(): CSSResult {
return css`
ha-svg-icon {
margin-right: 8px;
}
.date-range-inputs {
display: flex;
align-items: center;
}
.date-range-ranges {
border-right: 1px solid var(--divider-color);
}
@media only screen and (max-width: 800px) {
.date-range-ranges {
border-right: none;
border-bottom: 1px solid var(--divider-color);
}
}
.date-range-footer {
display: flex;
justify-content: flex-end;
padding: 8px;
border-top: 1px solid var(--divider-color);
}
paper-input {
display: inline-block;
max-width: 200px;
}
paper-input:last-child {
margin-left: 8px;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-date-range-picker": HaDateRangePicker;
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ import { HomeAssistant } from "../types";
import { DataEntryFlowProgress, DataEntryFlowStep } from "./data_entry_flow";
import { domainToName } from "./integration";
export const DISCOVERY_SOURCES = ["unignore", "homekit", "ssdp", "zeroconf"];
export const DISCOVERY_SOURCES = ["unignore", "homekit", "ssdp", "zeroconf", "discovery"];
export const createConfigFlow = (hass: HomeAssistant, handler: string) =>
hass.callApi<DataEntryFlowStep>("POST", "config/config_entries/flow", {
+20
View File
@@ -4,6 +4,20 @@ import { hassioApiResultExtractor, HassioResponse } from "./common";
export type HassioHomeAssistantInfo = any;
export type HassioSupervisorInfo = any;
export type HassioInfo = {
arch: string;
channel: string;
docker: string;
hassos?: string;
homeassistant: string;
hostname: string;
logging: string;
maching: string;
supervisor: string;
supported_arch: string[];
timezone: string;
};
export type HassioPanelInfo = PanelInfo<
| undefined
| {
@@ -38,6 +52,12 @@ export const fetchHassioSupervisorInfo = async (hass: HomeAssistant) => {
);
};
export const fetchHassioInfo = async (hass: HomeAssistant) => {
return hassioApiResultExtractor(
await hass.callApi<HassioResponse<HassioInfo>>("GET", "hassio/info")
);
};
export const fetchHassioLogs = async (
hass: HomeAssistant,
provider: string
+59
View File
@@ -1,3 +1,5 @@
import { HomeAssistant } from "../types";
export interface LogbookEntry {
when: string;
name: string;
@@ -6,3 +8,60 @@ export interface LogbookEntry {
domain: string;
context_user_id?: string;
}
const DATA_CACHE: {
[cacheKey: string]: { [entityId: string]: Promise<LogbookEntry[]> };
} = {};
export const getLogbookData = (
hass: HomeAssistant,
startDate: string,
endDate: string,
entityId?: string
) => {
const ALL_ENTITIES = "*";
if (!entityId) {
entityId = ALL_ENTITIES;
}
const cacheKey = `${startDate}${endDate}`;
if (!DATA_CACHE[cacheKey]) {
DATA_CACHE[cacheKey] = {};
}
if (DATA_CACHE[cacheKey][entityId]) {
return DATA_CACHE[cacheKey][entityId];
}
if (entityId !== ALL_ENTITIES && DATA_CACHE[cacheKey][ALL_ENTITIES]) {
return DATA_CACHE[cacheKey][ALL_ENTITIES].then((entities) =>
entities.filter((entity) => entity.entity_id === entityId)
);
}
DATA_CACHE[cacheKey][entityId] = getLogbookDataFromServer(
hass,
startDate,
endDate,
entityId !== ALL_ENTITIES ? entityId : undefined
).then((entries) => entries.reverse());
return DATA_CACHE[cacheKey][entityId];
};
const getLogbookDataFromServer = async (
hass: HomeAssistant,
startDate: string,
endDate: string,
entityId?: string
) => {
const url = `logbook/${startDate}?end_time=${endDate}${
entityId ? `&entity=${entityId}` : ""
}`;
return hass.callApi<LogbookEntry[]>("GET", url);
};
export const clearLogbookCache = (startDate, endDate) => {
DATA_CACHE[`${startDate}${endDate}`] = {};
};
+1 -5
View File
@@ -86,7 +86,7 @@ class MoreInfoControls extends LocalizeMixin(EventsMixin(PolymerElement)) {
<div class="main-title" main-title="" on-click="enlarge">
[[_computeStateName(stateObj)]]
</div>
<template is="dom-if" if="[[_computeConfig(hass)]]">
<template is="dom-if" if="[[hass.user.is_admin]]">
<ha-icon-button
aria-label$="[[localize('ui.dialogs.more_info_control.settings')]]"
icon="hass:settings"
@@ -219,10 +219,6 @@ class MoreInfoControls extends LocalizeMixin(EventsMixin(PolymerElement)) {
return stateObj ? computeStateName(stateObj) : "";
}
_computeConfig(hass) {
return hass.user.is_admin && isComponentLoaded(hass, "config");
}
_computeEdit(hass, stateObj) {
const domain = this._computeDomain(stateObj);
return (
@@ -8,15 +8,18 @@ import {
property,
TemplateResult,
} from "lit-element";
import { computeStateName } from "../../common/entity/compute_state_name";
import "../../components/ha-dialog";
import "../../components/ha-switch";
import "../../components/ha-formfield";
import type { HaSwitch } from "../../components/ha-switch";
import { computeDeviceName } from "../../data/device_registry";
import { fetchMQTTDebugInfo, MQTTDeviceDebugInfo } from "../../data/mqtt";
import { haStyleDialog } from "../../resources/styles";
import { HomeAssistant } from "../../types";
import { computeStateName } from "../../../../../../common/entity/compute_state_name";
import "../../../../../../components/ha-dialog";
import "../../../../../../components/ha-switch";
import "../../../../../../components/ha-formfield";
import type { HaSwitch } from "../../../../../../components/ha-switch";
import { computeDeviceName } from "../../../../../../data/device_registry";
import {
fetchMQTTDebugInfo,
MQTTDeviceDebugInfo,
} from "../../../../../../data/mqtt";
import { haStyleDialog } from "../../../../../../resources/styles";
import { HomeAssistant } from "../../../../../../types";
import "./mqtt-discovery-payload";
import "./mqtt-messages";
import { MQTTDeviceDebugInfoDialogParams } from "./show-dialog-mqtt-device-debug-info";
@@ -187,19 +190,19 @@ class DialogMQTTDeviceDebugInfo extends LitElement {
<li class="triggerlistitem">
MQTT discovery data:
<ul class="discoverydata">
<li>
Topic:
<code>${trigger.discovery_data.topic}</code>
</li>
<li>
<mqtt-discovery-payload
.hass=${this.hass}
.payload=${trigger.discovery_data.payload}
.showAsYaml=${this._showAsYaml}
.summary=${"Payload"}
>
</li>
</mqtt-discovery-payload>
<li>
Topic:
<code>${trigger.discovery_data.topic}</code>
</li>
<li>
<mqtt-discovery-payload
.hass=${this.hass}
.payload=${trigger.discovery_data.payload}
.showAsYaml=${this._showAsYaml}
.summary=${"Payload"}
>
</mqtt-discovery-payload>
</li>
</ul>
</li>
`
@@ -7,12 +7,12 @@ import {
TemplateResult,
css,
} from "lit-element";
import { DeviceRegistryEntry } from "../../../../../data/device_registry";
import { removeMQTTDeviceEntry } from "../../../../../data/mqtt";
import { showConfirmationDialog } from "../../../../../dialogs/generic/show-dialog-box";
import { showMQTTDeviceDebugInfoDialog } from "../../../../../dialogs/mqtt-device-debug-info-dialog/show-dialog-mqtt-device-debug-info";
import { haStyle } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { DeviceRegistryEntry } from "../../../../../../data/device_registry";
import { removeMQTTDeviceEntry } from "../../../../../../data/mqtt";
import { showConfirmationDialog } from "../../../../../../dialogs/generic/show-dialog-box";
import { showMQTTDeviceDebugInfoDialog } from "./show-dialog-mqtt-device-debug-info";
import { haStyle } from "../../../../../../resources/styles";
import { HomeAssistant } from "../../../../../../types";
@customElement("ha-device-actions-mqtt")
export class HaDeviceActionsMqtt extends LitElement {
@@ -9,9 +9,9 @@ import {
TemplateResult,
} from "lit-element";
import { classMap } from "lit-html/directives/class-map";
import { formatTimeWithSeconds } from "../../common/datetime/format_time";
import { HomeAssistant } from "../../types";
import { MQTTMessage } from "../../data/mqtt";
import { formatTimeWithSeconds } from "../../../../../../common/datetime/format_time";
import { HomeAssistant } from "../../../../../../types";
import { MQTTMessage } from "../../../../../../data/mqtt";
@customElement("mqtt-messages")
class MQTTMessages extends LitElement {
@@ -1,5 +1,5 @@
import { fireEvent } from "../../common/dom/fire_event";
import { DeviceRegistryEntry } from "../../data/device_registry";
import { fireEvent } from "../../../../../../common/dom/fire_event";
import { DeviceRegistryEntry } from "../../../../../../data/device_registry";
export interface MQTTDeviceDebugInfoDialogParams {
device: DeviceRegistryEntry;
@@ -8,17 +8,18 @@ import {
css,
PropertyValues,
} from "lit-element";
import { DeviceRegistryEntry } from "../../../../../data/device_registry";
import { haStyle } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { DeviceRegistryEntry } from "../../../../../../data/device_registry";
import { haStyle } from "../../../../../../resources/styles";
import { HomeAssistant } from "../../../../../../types";
import {
ZHADevice,
fetchZHADevice,
reconfigureNode,
} from "../../../../../data/zha";
import { navigate } from "../../../../../common/navigate";
import { showZHADeviceZigbeeInfoDialog } from "../../../../../dialogs/zha-device-zigbee-signature-dialog/show-dialog-zha-device-zigbee-info";
import { showConfirmationDialog } from "../../../../../dialogs/generic/show-dialog-box";
} from "../../../../../../data/zha";
import { navigate } from "../../../../../../common/navigate";
import { showZHADeviceZigbeeInfoDialog } from "../../../../integrations/integration-panels/zha/show-dialog-zha-device-zigbee-info";
import { showConfirmationDialog } from "../../../../../../dialogs/generic/show-dialog-box";
import { showZHAClusterDialog } from "../../../../integrations/integration-panels/zha/show-dialog-zha-cluster";
@customElement("ha-device-actions-zha")
export class HaDeviceActionsZha extends LitElement {
@@ -72,6 +73,11 @@ export class HaDeviceActionsZha extends LitElement {
"ui.dialogs.zha_device_info.buttons.zigbee_information"
)}
</mwc-button>
<mwc-button @click=${this._showClustersDialog}>
${this.hass!.localize(
"ui.dialogs.zha_device_info.buttons.clusters"
)}
</mwc-button>
<mwc-button class="warning" @click=${this._removeDevice}>
${this.hass!.localize(
"ui.dialogs.zha_device_info.buttons.remove"
@@ -82,6 +88,10 @@ export class HaDeviceActionsZha extends LitElement {
`;
}
private async _showClustersDialog(): Promise<void> {
await showZHAClusterDialog(this, { device: this._zhaDevice! });
}
private async _onReconfigureNodeClick(): Promise<void> {
if (!this.hass) {
return;
@@ -8,11 +8,11 @@ import {
css,
PropertyValues,
} from "lit-element";
import { DeviceRegistryEntry } from "../../../../../data/device_registry";
import { haStyle } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { ZHADevice, fetchZHADevice } from "../../../../../data/zha";
import { formatAsPaddedHex } from "../../../integrations/integration-panels/zha/functions";
import { DeviceRegistryEntry } from "../../../../../../data/device_registry";
import { haStyle } from "../../../../../../resources/styles";
import { HomeAssistant } from "../../../../../../types";
import { ZHADevice, fetchZHADevice } from "../../../../../../data/zha";
import { formatAsPaddedHex } from "../../../../integrations/integration-panels/zha/functions";
@customElement("ha-device-info-zha")
export class HaDeviceActionsZha extends LitElement {
@@ -477,7 +477,9 @@ export class HaConfigDevicePage extends LitElement {
): TemplateResult[] {
const templates: TemplateResult[] = [];
if (integrations.includes("mqtt")) {
import("./device-detail/integration-elements/ha-device-actions-mqtt");
import(
"./device-detail/integration-elements/mqtt/ha-device-actions-mqtt"
);
templates.push(html`
<div class="card-actions" slot="actions">
<ha-device-actions-mqtt
@@ -488,8 +490,8 @@ export class HaConfigDevicePage extends LitElement {
`);
}
if (integrations.includes("zha")) {
import("./device-detail/integration-elements/ha-device-actions-zha");
import("./device-detail/integration-elements/ha-device-info-zha");
import("./device-detail/integration-elements/zha/ha-device-actions-zha");
import("./device-detail/integration-elements/zha/ha-device-info-zha");
templates.push(html`
<ha-device-info-zha
.hass=${this.hass}
+7
View File
@@ -323,6 +323,13 @@ class HaPanelConfig extends HassRouterPage {
/* webpackChunkName: "panel-config-zwave" */ "./integrations/integration-panels/zwave/ha-config-zwave"
),
},
mqtt: {
tag: "mqtt-config-panel",
load: () =>
import(
/* webpackChunkName: "panel-config-mqtt" */ "./integrations/integration-panels/mqtt/mqtt-config-panel"
),
},
},
};
@@ -46,6 +46,10 @@ declare global {
}
const integrationsWithPanel = {
mqtt: {
buttonLocalizeKey: "ui.panel.config.mqtt.button",
path: "/config/mqtt",
},
zha: {
buttonLocalizeKey: "ui.panel.config.zha.button",
path: "/config/zha/dashboard",
@@ -9,13 +9,14 @@ import {
property,
TemplateResult,
} from "lit-element";
import "../../../components/ha-card";
import "../../../components/ha-code-editor";
import { haStyle } from "../../../resources/styles";
import { HomeAssistant } from "../../../types";
import "../../../../../components/ha-card";
import "../../../../../components/ha-code-editor";
import { haStyle } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import "./mqtt-subscribe-card";
import "../../../../../layouts/hass-subpage";
@customElement("developer-tools-mqtt")
@customElement("mqtt-config-panel")
class HaPanelDevMqtt extends LitElement {
@property() public hass!: HomeAssistant;
@@ -37,43 +38,41 @@ class HaPanelDevMqtt extends LitElement {
protected render(): TemplateResult {
return html`
<div class="content">
<ha-card
header="${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.description_publish"
)}"
>
<div class="card-content">
<paper-input
label="${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.topic"
)}"
.value=${this.topic}
@value-changed=${this._handleTopic}
></paper-input>
<hass-subpage>
<div class="content">
<ha-card
header="${this.hass.localize(
"ui.panel.config.mqtt.description_publish"
)}"
>
<div class="card-content">
<paper-input
label="${this.hass.localize("ui.panel.config.mqtt.topic")}"
.value=${this.topic}
@value-changed=${this._handleTopic}
></paper-input>
<p>
${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.payload"
)}
</p>
<ha-code-editor
mode="jinja2"
.value="${this.payload}"
@value-changed=${this._handlePayload}
></ha-code-editor>
</div>
<div class="card-actions">
<mwc-button @click=${this._publish}
>${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.publish"
)}</mwc-button
>
</div>
</ha-card>
<p>
${this.hass.localize("ui.panel.config.mqtt.payload")}
</p>
<ha-code-editor
mode="jinja2"
.value="${this.payload}"
@value-changed=${this._handlePayload}
></ha-code-editor>
</div>
<div class="card-actions">
<mwc-button @click=${this._publish}
>${this.hass.localize(
"ui.panel.config.mqtt.publish"
)}</mwc-button
>
</div>
</ha-card>
<mqtt-subscribe-card .hass=${this.hass}></mqtt-subscribe-card>
</div>
<mqtt-subscribe-card .hass=${this.hass}></mqtt-subscribe-card>
</div>
</hass-subpage>
`;
}
@@ -9,10 +9,10 @@ import {
property,
TemplateResult,
} from "lit-element";
import { formatTime } from "../../../common/datetime/format_time";
import "../../../components/ha-card";
import { MQTTMessage, subscribeMQTTTopic } from "../../../data/mqtt";
import { HomeAssistant } from "../../../types";
import { formatTime } from "../../../../../common/datetime/format_time";
import "../../../../../components/ha-card";
import { MQTTMessage, subscribeMQTTTopic } from "../../../../../data/mqtt";
import { HomeAssistant } from "../../../../../types";
@customElement("mqtt-subscribe-card")
class MqttSubscribeCard extends LitElement {
@@ -43,18 +43,14 @@ class MqttSubscribeCard extends LitElement {
return html`
<ha-card
header="${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.description_listen"
"ui.panel.config.mqtt.description_listen"
)}"
>
<form>
<paper-input
.label=${this._subscribed
? this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.listening_to"
)
: this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.subscribe_to"
)}
? this.hass.localize("ui.panel.config.mqtt.listening_to")
: this.hass.localize("ui.panel.config.mqtt.subscribe_to")}
.disabled=${this._subscribed !== undefined}
.value=${this._topic}
@value-changed=${this._valueChanged}
@@ -65,12 +61,8 @@ class MqttSubscribeCard extends LitElement {
type="submit"
>
${this._subscribed
? this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.stop_listening"
)
: this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.start_listening"
)}
? this.hass.localize("ui.panel.config.mqtt.stop_listening")
: this.hass.localize("ui.panel.config.mqtt.start_listening")}
</mwc-button>
</form>
<div class="events">
@@ -78,7 +70,7 @@ class MqttSubscribeCard extends LitElement {
(msg) => html`
<div class="event">
${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.message_received",
"ui.panel.config.mqtt.message_received",
"id",
msg.id,
"topic",
@@ -0,0 +1,143 @@
import {
CSSResult,
customElement,
html,
LitElement,
property,
TemplateResult,
PropertyValues,
} from "lit-element";
import "../../../../../components/ha-code-editor";
import { createCloseHeading } from "../../../../../components/ha-dialog";
import { haStyleDialog } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { ZHADeviceZigbeeInfoDialogParams } from "./show-dialog-zha-device-zigbee-info";
import {
ZHADevice,
Cluster,
ZHAGroup,
fetchBindableDevices,
fetchGroups,
} from "../../../../../data/zha";
import { ZHAClusterSelectedParams } from "./types";
import "./zha-cluster-attributes";
import "./zha-cluster-commands";
import "./zha-clusters";
import "./zha-device-binding";
import "./zha-group-binding";
import { HASSDomEvent } from "../../../../../common/dom/fire_event";
import { sortZHADevices, sortZHAGroups } from "./functions";
@customElement("dialog-zha-cluster")
class DialogZHACluster extends LitElement {
@property() public hass!: HomeAssistant;
@property() private _device?: ZHADevice;
@property() private _selectedCluster?: Cluster;
@property() private _bindableDevices: ZHADevice[] = [];
@property() private _groups: ZHAGroup[] = [];
public async showDialog(
params: ZHADeviceZigbeeInfoDialogParams
): Promise<void> {
this._device = params.device;
}
protected updated(changedProperties: PropertyValues): void {
super.update(changedProperties);
if (changedProperties.has("_device")) {
this._fetchData();
}
}
protected render(): TemplateResult {
if (!this._device) {
return html``;
}
return html`
<ha-dialog
open
hideActions
@closing="${this._close}"
.heading=${createCloseHeading(
this.hass,
this.hass.localize("ui.panel.config.zha.clusters.header")
)}
>
<zha-clusters
.hass=${this.hass}
.selectedDevice="${this._device}"
@zha-cluster-selected="${this._onClusterSelected}"
></zha-clusters>
${this._selectedCluster
? html`
<zha-cluster-attributes
.hass=${this.hass}
.selectedNode="${this._device}"
.selectedCluster="${this._selectedCluster}"
></zha-cluster-attributes>
<zha-cluster-commands
.hass=${this.hass}
.selectedNode="${this._device}"
.selectedCluster="${this._selectedCluster}"
></zha-cluster-commands>
`
: ""}
${this._bindableDevices.length > 0
? html`
<zha-device-binding-control
.hass=${this.hass}
.selectedDevice="${this._device}"
.bindableDevices="${this._bindableDevices}"
></zha-device-binding-control>
`
: ""}
${this._device && this._groups.length > 0
? html`
<zha-group-binding-control
.hass=${this.hass}
.selectedDevice="${this._device}"
.groups="${this._groups}"
></zha-group-binding-control>
`
: ""}
</ha-dialog>
`;
}
private _onClusterSelected(
selectedClusterEvent: HASSDomEvent<ZHAClusterSelectedParams>
): void {
this._selectedCluster = selectedClusterEvent.detail.cluster;
}
private _close(): void {
this._device = undefined;
}
private async _fetchData(): Promise<void> {
if (this._device && this.hass) {
this._bindableDevices =
this._device && this._device.device_type !== "Coordinator"
? (await fetchBindableDevices(this.hass, this._device.ieee)).sort(
sortZHADevices
)
: [];
this._groups = (await fetchGroups(this.hass!)).sort(sortZHAGroups);
}
}
static get styles(): CSSResult {
return haStyleDialog;
}
}
declare global {
interface HTMLElementTagNameMap {
"dialog-zha-cluster": DialogZHACluster;
}
}
@@ -6,10 +6,10 @@ import {
property,
TemplateResult,
} from "lit-element";
import "../../components/ha-code-editor";
import { createCloseHeading } from "../../components/ha-dialog";
import { haStyleDialog } from "../../resources/styles";
import { HomeAssistant } from "../../types";
import "../../../../../components/ha-code-editor";
import { createCloseHeading } from "../../../../../components/ha-dialog";
import { haStyleDialog } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { ZHADeviceZigbeeInfoDialogParams } from "./show-dialog-zha-device-zigbee-info";
@customElement("dialog-zha-device-zigbee-info")
@@ -0,0 +1,22 @@
import { fireEvent } from "../../../../../common/dom/fire_event";
import { ZHADevice } from "../../../../../data/zha";
export interface ZHAClusterDialogParams {
device: ZHADevice;
}
export const loadZHAClusterDialog = () =>
import(
/* webpackChunkName: "dialog-zha-device-zigbee-info" */ "./dialog-zha-cluster"
);
export const showZHAClusterDialog = (
element: HTMLElement,
params: ZHAClusterDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-zha-cluster",
dialogImport: loadZHAClusterDialog,
dialogParams: params,
});
};
@@ -1,5 +1,5 @@
import { fireEvent } from "../../common/dom/fire_event";
import { ZHADevice } from "../../data/zha";
import { fireEvent } from "../../../../../common/dom/fire_event";
import { ZHADevice } from "../../../../../data/zha";
export interface ZHADeviceZigbeeInfoDialogParams {
device: ZHADevice;
@@ -64,9 +64,6 @@ export class ZHAClusters extends LitElement {
return html`
<ha-config-section .isWide="${this.isWide}">
<div class="header" slot="header">
<span>
${this.hass!.localize("ui.panel.config.zha.clusters.header")}
</span>
<ha-icon-button
class="toggle-help-icon"
@click="${this._onHelpTap}"
@@ -38,6 +38,10 @@ class HaConfigZwave extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
<style include="iron-flex ha-style ha-form-style">
app-toolbar {
border-bottom: 1px solid var(--divider-color);
}
.content {
margin-top: 24px;
}
@@ -25,10 +25,6 @@ class DeveloperToolsRouter extends HassRouterPage {
tag: "developer-tools-event",
load: () => import("./event/developer-tools-event"),
},
mqtt: {
tag: "developer-tools-mqtt",
load: () => import("./mqtt/developer-tools-mqtt"),
},
service: {
tag: "developer-tools-service",
load: () => import("./service/developer-tools-service"),
@@ -13,7 +13,6 @@ import {
property,
TemplateResult,
} from "lit-element";
import { isComponentLoaded } from "../../common/config/is_component_loaded";
import scrollToTarget from "../../common/dom/scroll-to-target";
import { navigate } from "../../common/navigate";
import "../../components/ha-menu-button";
@@ -72,15 +71,6 @@ class PanelDeveloperTools extends LitElement {
"ui.panel.developer-tools.tabs.events.title"
)}
</paper-tab>
${isComponentLoaded(this.hass, "mqtt")
? html`
<paper-tab page-name="mqtt">
${this.hass.localize(
"ui.panel.developer-tools.tabs.mqtt.title"
)}
</paper-tab>
`
: ""}
</paper-tabs>
</app-header>
<developer-tools-router
-215
View File
@@ -1,215 +0,0 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "@polymer/paper-dropdown-menu/paper-dropdown-menu";
import "@polymer/paper-input/paper-input";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker";
import { formatDate } from "../../common/datetime/format_date";
import { computeRTL } from "../../common/util/compute_rtl";
import "../../components/ha-menu-button";
import "../../components/state-history-charts";
import "../../data/ha-state-history-data";
import LocalizeMixin from "../../mixins/localize-mixin";
import "../../resources/ha-date-picker-style";
import "../../styles/polymer-ha-style";
/*
* @appliesMixin LocalizeMixin
*/
class HaPanelHistory extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
<style include="iron-flex ha-style">
.content {
padding: 0 16px 16px;
}
vaadin-date-picker {
margin-right: 16px;
max-width: 200px;
}
paper-dropdown-menu {
max-width: 100px;
margin-right: 16px;
margin-top: 5px;
--paper-input-container-label-floating: {
padding-bottom: 11px;
}
--paper-input-suffix: {
height: 24px;
}
}
:host([rtl]) paper-dropdown-menu {
text-align: right;
}
paper-item {
cursor: pointer;
white-space: nowrap;
}
</style>
<ha-state-history-data
hass="[[hass]]"
filter-type="[[_filterType]]"
start-time="[[_computeStartTime(_currentDate)]]"
end-time="[[endTime]]"
data="{{stateHistory}}"
is-loading="{{isLoadingData}}"
></ha-state-history-data>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button
hass="[[hass]]"
narrow="[[narrow]]"
></ha-menu-button>
<div main-title>[[localize('panel.history')]]</div>
</app-toolbar>
</app-header>
<div class="flex content">
<div class="flex layout horizontal wrap">
<vaadin-date-picker
id="picker"
value="{{_currentDate}}"
label="[[localize('ui.panel.history.showing_entries')]]"
disabled="[[isLoadingData]]"
required
></vaadin-date-picker>
<paper-dropdown-menu
label-float
label="[[localize('ui.panel.history.period')]]"
disabled="[[isLoadingData]]"
>
<paper-listbox
slot="dropdown-content"
selected="{{_periodIndex}}"
>
<paper-item
>[[localize('ui.duration.day', 'count', 1)]]</paper-item
>
<paper-item
>[[localize('ui.duration.day', 'count', 3)]]</paper-item
>
<paper-item
>[[localize('ui.duration.week', 'count', 1)]]</paper-item
>
</paper-listbox>
</paper-dropdown-menu>
</div>
<state-history-charts
hass="[[hass]]"
history-data="[[stateHistory]]"
is-loading-data="[[isLoadingData]]"
end-time="[[endTime]]"
no-single
>
</state-history-charts>
</div>
</app-header-layout>
`;
}
static get properties() {
return {
hass: Object,
narrow: Boolean,
stateHistory: {
type: Object,
value: null,
},
_periodIndex: {
type: Number,
value: 0,
},
isLoadingData: {
type: Boolean,
value: false,
},
endTime: {
type: Object,
computed: "_computeEndTime(_currentDate, _periodIndex)",
},
// ISO8601 formatted date string
_currentDate: {
type: String,
value: function () {
var value = new Date();
var today = new Date(
Date.UTC(value.getFullYear(), value.getMonth(), value.getDate())
);
return today.toISOString().split("T")[0];
},
},
_filterType: {
type: String,
value: "date",
},
rtl: {
type: Boolean,
reflectToAttribute: true,
computed: "_computeRTL(hass)",
},
};
}
datepickerFocus() {
this.datePicker.adjustPosition();
}
connectedCallback() {
super.connectedCallback();
// We are unable to parse date because we use intl api to render date
this.$.picker.set("i18n.parseDate", null);
this.$.picker.set("i18n.formatDate", (date) =>
formatDate(new Date(date.year, date.month, date.day), this.hass.language)
);
}
_computeStartTime(_currentDate) {
if (!_currentDate) return undefined;
var parts = _currentDate.split("-");
parts[1] = parseInt(parts[1]) - 1;
return new Date(parts[0], parts[1], parts[2]);
}
_computeEndTime(_currentDate, periodIndex) {
var startTime = this._computeStartTime(_currentDate);
var endTime = new Date(startTime);
endTime.setDate(startTime.getDate() + this._computeFilterDays(periodIndex));
return endTime;
}
_computeFilterDays(periodIndex) {
switch (periodIndex) {
case 1:
return 3;
case 2:
return 7;
default:
return 1;
}
}
_computeRTL(hass) {
return computeRTL(hass);
}
}
customElements.define("ha-panel-history", HaPanelHistory);
+204
View File
@@ -0,0 +1,204 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import { computeRTL } from "../../common/util/compute_rtl";
import "../../components/ha-menu-button";
import "../../components/state-history-charts";
import { LitElement, css, property, PropertyValues } from "lit-element";
import { html } from "lit-html";
import { haStyle } from "../../resources/styles";
import { HomeAssistant } from "../../types";
import type { DateRangePickerRanges } from "../../components/ha-date-range-picker";
import "../../components/ha-date-range-picker";
import { fetchDate, computeHistory } from "../../data/history";
import "@polymer/paper-spinner/paper-spinner";
class HaPanelHistory extends LitElement {
@property() hass!: HomeAssistant;
@property({ reflect: true, type: Boolean }) narrow!: boolean;
@property() _startDate: Date;
@property() _endDate: Date;
@property() _entityId = "";
@property() _isLoading = false;
@property() _stateHistory?;
@property({ reflect: true, type: Boolean }) rtl = false;
@property() private _ranges?: DateRangePickerRanges;
public constructor() {
super();
const start = new Date();
start.setHours(start.getHours() - 2);
start.setMinutes(0);
start.setSeconds(0);
this._startDate = start;
const end = new Date();
end.setHours(end.getHours() + 1);
end.setMinutes(0);
end.setSeconds(0);
this._endDate = end;
}
protected render() {
return html`
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button
.hass=${this.hass}
.narrow=${this.narrow}
></ha-menu-button>
<div main-title>${this.hass.localize("panel.history")}</div>
</app-toolbar>
</app-header>
<div class="flex content">
<div class="flex layout horizontal wrap">
<ha-date-range-picker
.hass=${this.hass}
?disabled=${this._isLoading}
.startDate=${this._startDate}
.endDate=${this._endDate}
.ranges=${this._ranges}
@change=${this._dateRangeChanged}
></ha-date-range-picker>
</div>
${this._isLoading
? html`<paper-spinner
active
alt=${this.hass.localize("ui.common.loading")}
></paper-spinner>`
: html`
<state-history-charts
.hass=${this.hass}
.historyData=${this._stateHistory}
.endTime=${this._endDate}
no-single
>
</state-history-charts>
`}
</div>
</app-header-layout>
`;
}
protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
const today = new Date();
today.setHours(0, 0, 0, 0);
const todayEnd = new Date(today);
todayEnd.setDate(todayEnd.getDate() + 1);
todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1);
const todayCopy = new Date(today);
const yesterday = new Date(todayCopy.setDate(today.getDate() - 1));
const yesterdayEnd = new Date(yesterday);
yesterdayEnd.setDate(yesterdayEnd.getDate() + 1);
yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1);
const thisWeekStart = new Date(
todayCopy.setDate(today.getDate() - today.getDay())
);
const thisWeekEnd = new Date(
todayCopy.setDate(today.getDate() - today.getDay() + 7)
);
thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1);
const lastWeekStart = new Date(
todayCopy.setDate(today.getDate() - today.getDay() - 7)
);
const lastWeekEnd = new Date(
todayCopy.setDate(today.getDate() - today.getDay())
);
lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1);
this._ranges = {
[this.hass.localize("ui.panel.history.ranges.today")]: [today, todayEnd],
[this.hass.localize("ui.panel.history.ranges.yesterday")]: [
yesterday,
yesterdayEnd,
],
[this.hass.localize("ui.panel.history.ranges.this_week")]: [
thisWeekStart,
thisWeekEnd,
],
[this.hass.localize("ui.panel.history.ranges.last_week")]: [
lastWeekStart,
lastWeekEnd,
],
};
}
protected updated(changedProps: PropertyValues) {
if (
changedProps.has("_startDate") ||
changedProps.has("_endDate") ||
changedProps.has("_entityId")
) {
this._getHistory();
}
if (changedProps.has("hass")) {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
if (!oldHass || oldHass.language !== this.hass.language) {
this.rtl = computeRTL(this.hass);
}
}
}
private async _getHistory() {
this._isLoading = true;
const dateHistory = await fetchDate(
this.hass,
this._startDate,
this._endDate
);
this._stateHistory = computeHistory(
this.hass,
dateHistory,
this.hass.localize,
this.hass.language
);
this._isLoading = false;
}
private _dateRangeChanged(ev) {
this._startDate = ev.detail.startDate;
const endDate = ev.detail.endDate;
if (endDate.getHours() === 0 && endDate.getMinutes() === 0) {
endDate.setDate(endDate.getDate() + 1);
endDate.setMilliseconds(endDate.getMilliseconds() - 1);
}
this._endDate = endDate;
}
static get styles() {
return [
haStyle,
css`
.content {
padding: 0 16px 16px;
}
paper-spinner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
`,
];
}
}
customElements.define("ha-panel-history", HaPanelHistory);
-120
View File
@@ -1,120 +0,0 @@
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
const DATA_CACHE = {};
const ALL_ENTITIES = "*";
class HaLogbookData extends PolymerElement {
static get properties() {
return {
hass: {
type: Object,
observer: "hassChanged",
},
filterDate: {
type: String,
observer: "filterDataChanged",
},
filterPeriod: {
type: Number,
observer: "filterDataChanged",
},
filterEntity: {
type: String,
observer: "filterDataChanged",
},
isLoading: {
type: Boolean,
value: true,
readOnly: true,
notify: true,
},
entries: {
type: Object,
value: null,
readOnly: true,
notify: true,
},
};
}
hassChanged(newHass, oldHass) {
if (!oldHass && this.filterDate) {
this.updateData();
}
}
filterDataChanged(newValue, oldValue) {
if (oldValue !== undefined) {
this.updateData();
}
}
updateData() {
if (!this.hass) return;
this._setIsLoading(true);
this.getData(this.filterDate, this.filterPeriod, this.filterEntity).then(
(logbookEntries) => {
this._setEntries(logbookEntries);
this._setIsLoading(false);
}
);
}
getData(date, period, entityId) {
if (!entityId) entityId = ALL_ENTITIES;
if (!DATA_CACHE[period]) DATA_CACHE[period] = [];
if (!DATA_CACHE[period][date]) DATA_CACHE[period][date] = [];
if (DATA_CACHE[period][date][entityId]) {
return DATA_CACHE[period][date][entityId];
}
if (entityId !== ALL_ENTITIES && DATA_CACHE[period][date][ALL_ENTITIES]) {
return DATA_CACHE[period][date][ALL_ENTITIES].then(function (entities) {
return entities.filter(function (entity) {
return entity.entity_id === entityId;
});
});
}
DATA_CACHE[period][date][entityId] = this._getFromServer(
date,
period,
entityId
);
return DATA_CACHE[period][date][entityId];
}
_getFromServer(date, period, entityId) {
let url = "logbook/" + date + "?period=" + period;
if (entityId !== ALL_ENTITIES) {
url += "&entity=" + entityId;
}
return this.hass.callApi("GET", url).then(
function (logbookEntries) {
logbookEntries.reverse();
return logbookEntries;
},
function () {
return null;
}
);
}
refreshLogbook() {
DATA_CACHE[this.filterPeriod][this.filterDate] = [];
this.updateData();
}
}
customElements.define("ha-logbook-data", HaLogbookData);
-283
View File
@@ -1,283 +0,0 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "../../components/ha-icon-button";
import "@polymer/paper-input/paper-input";
import "@polymer/paper-spinner/paper-spinner";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import "@vaadin/vaadin-date-picker/theme/material/vaadin-date-picker";
import { formatDate } from "../../common/datetime/format_date";
import { computeRTL } from "../../common/util/compute_rtl";
import "../../components/entity/ha-entity-picker";
import "../../components/ha-menu-button";
import LocalizeMixin from "../../mixins/localize-mixin";
import "../../resources/ha-date-picker-style";
import "../../styles/polymer-ha-style";
import "./ha-logbook";
import "./ha-logbook-data";
/*
* @appliesMixin LocalizeMixin
*/
class HaPanelLogbook extends LocalizeMixin(PolymerElement) {
static get template() {
return html`
<style include="ha-style">
ha-logbook {
height: calc(100vh - 136px);
}
:host([narrow]) ha-logbook {
height: calc(100vh - 198px);
}
paper-spinner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.wrap {
margin-bottom: 24px;
}
.filters {
display: flex;
align-items: flex-end;
padding: 0 16px;
}
:host([narrow]) .filters {
flex-wrap: wrap;
}
vaadin-date-picker {
max-width: 200px;
margin-right: 16px;
}
:host([rtl]) vaadin-date-picker {
margin-right: 0;
margin-left: 16px;
}
paper-dropdown-menu {
max-width: 100px;
margin-right: 16px;
--paper-input-container-label-floating: {
padding-bottom: 11px;
}
--paper-input-suffix: {
height: 24px;
}
}
:host([rtl]) paper-dropdown-menu {
text-align: right;
margin-right: 0;
margin-left: 16px;
}
paper-item {
cursor: pointer;
white-space: nowrap;
}
ha-entity-picker {
display: inline-block;
flex-grow: 1;
max-width: 400px;
--paper-input-suffix: {
height: 24px;
}
}
:host([narrow]) ha-entity-picker {
max-width: none;
width: 100%;
}
[hidden] {
display: none !important;
}
</style>
<ha-logbook-data
hass="[[hass]]"
is-loading="{{isLoading}}"
entries="{{entries}}"
filter-date="[[_computeFilterDate(_currentDate)]]"
filter-period="[[_computeFilterDays(_periodIndex)]]"
filter-entity="[[entityId]]"
></ha-logbook-data>
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button
hass="[[hass]]"
narrow="[[narrow]]"
></ha-menu-button>
<div main-title>[[localize('panel.logbook')]]</div>
<ha-icon-button
icon="hass:refresh"
on-click="refreshLogbook"
hidden$="[[isLoading]]"
></ha-icon-button>
</app-toolbar>
</app-header>
<paper-spinner
active="[[isLoading]]"
hidden$="[[!isLoading]]"
alt="[[localize('ui.common.loading')]]"
></paper-spinner>
<div class="filters">
<vaadin-date-picker
id="picker"
value="{{_currentDate}}"
label="[[localize('ui.panel.logbook.showing_entries')]]"
disabled="[[isLoading]]"
required
></vaadin-date-picker>
<paper-dropdown-menu
label-float
label="[[localize('ui.panel.logbook.period')]]"
disabled="[[isLoading]]"
>
<paper-listbox slot="dropdown-content" selected="{{_periodIndex}}">
<paper-item
>[[localize('ui.duration.day', 'count', 1)]]</paper-item
>
<paper-item
>[[localize('ui.duration.day', 'count', 3)]]</paper-item
>
<paper-item
>[[localize('ui.duration.week', 'count', 1)]]</paper-item
>
</paper-listbox>
</paper-dropdown-menu>
<ha-entity-picker
hass="[[hass]]"
value="{{_entityId}}"
label="[[localize('ui.components.entity.entity-picker.entity')]]"
disabled="[[isLoading]]"
on-change="_entityPicked"
></ha-entity-picker>
</div>
<ha-logbook
hass="[[hass]]"
entries="[[entries]]"
hidden$="[[isLoading]]"
></ha-logbook>
</app-header-layout>
`;
}
static get properties() {
return {
hass: Object,
narrow: { type: Boolean, reflectToAttribute: true },
// ISO8601 formatted date string
_currentDate: {
type: String,
value: function () {
const value = new Date();
const today = new Date(
Date.UTC(value.getFullYear(), value.getMonth(), value.getDate())
);
return today.toISOString().split("T")[0];
},
},
_periodIndex: {
type: Number,
value: 0,
},
_entityId: {
type: String,
value: "",
},
entityId: {
type: String,
value: "",
readOnly: true,
},
isLoading: {
type: Boolean,
},
entries: {
type: Array,
},
datePicker: {
type: Object,
},
rtl: {
type: Boolean,
reflectToAttribute: true,
computed: "_computeRTL(hass)",
},
};
}
ready() {
super.ready();
this.hass.loadBackendTranslation("title");
}
connectedCallback() {
super.connectedCallback();
// We are unable to parse date because we use intl api to render date
this.$.picker.set("i18n.parseDate", null);
this.$.picker.set("i18n.formatDate", (date) =>
formatDate(new Date(date.year, date.month, date.day), this.hass.language)
);
}
_computeFilterDate(_currentDate) {
if (!_currentDate) return undefined;
var parts = _currentDate.split("-");
parts[1] = parseInt(parts[1]) - 1;
return new Date(parts[0], parts[1], parts[2]).toISOString();
}
_computeFilterDays(periodIndex) {
switch (periodIndex) {
case 1:
return 3;
case 2:
return 7;
default:
return 1;
}
}
_entityPicked(ev) {
this._setEntityId(ev.target.value);
}
refreshLogbook() {
this.shadowRoot.querySelector("ha-logbook-data").refreshLogbook();
}
_computeRTL(hass) {
return computeRTL(hass);
}
}
customElements.define("ha-panel-logbook", HaPanelLogbook);
+279
View File
@@ -0,0 +1,279 @@
import "@polymer/app-layout/app-header-layout/app-header-layout";
import "@polymer/app-layout/app-header/app-header";
import "@polymer/app-layout/app-toolbar/app-toolbar";
import "../../components/ha-icon-button";
import "@polymer/paper-spinner/paper-spinner";
import { computeRTL } from "../../common/util/compute_rtl";
import "../../components/entity/ha-entity-picker";
import "../../components/ha-menu-button";
import "./ha-logbook";
import {
LitElement,
property,
customElement,
html,
css,
PropertyValues,
} from "lit-element";
import { HomeAssistant } from "../../types";
import { haStyle } from "../../resources/styles";
import {
clearLogbookCache,
getLogbookData,
LogbookEntry,
} from "../../data/logbook";
import { mdiRefresh } from "@mdi/js";
import "../../components/ha-date-range-picker";
import type { DateRangePickerRanges } from "../../components/ha-date-range-picker";
@customElement("ha-panel-logbook")
export class HaPanelLogbook extends LitElement {
@property() hass!: HomeAssistant;
@property({ reflect: true, type: Boolean }) narrow!: boolean;
@property() _startDate: Date;
@property() _endDate: Date;
@property() _entityId = "";
@property() _isLoading = false;
@property() _entries: LogbookEntry[] = [];
@property({ reflect: true, type: Boolean }) rtl = false;
@property() private _ranges?: DateRangePickerRanges;
public constructor() {
super();
const start = new Date();
start.setHours(start.getHours() - 2);
start.setMinutes(0);
start.setSeconds(0);
this._startDate = start;
const end = new Date();
end.setHours(end.getHours() + 1);
end.setMinutes(0);
end.setSeconds(0);
this._endDate = end;
}
protected render() {
return html`
<app-header-layout has-scrolling-region>
<app-header slot="header" fixed>
<app-toolbar>
<ha-menu-button
.hass=${this.hass}
.narrow=${this.narrow}
></ha-menu-button>
<div main-title>${this.hass.localize("panel.logbook")}</div>
<mwc-icon-button
@click=${this._refreshLogbook}
.disabled=${this._isLoading}
>
<ha-svg-icon path=${mdiRefresh}></ha-svg-icon>
</mwc-icon-button>
</app-toolbar>
</app-header>
${this._isLoading ? html`` : ""}
<div class="filters">
<ha-date-range-picker
.hass=${this.hass}
?disabled=${this._isLoading}
.startDate=${this._startDate}
.endDate=${this._endDate}
.ranges=${this._ranges}
@change=${this._dateRangeChanged}
></ha-date-range-picker>
<ha-entity-picker
.hass=${this.hass}
.value=${this._entityId}
.label=${this.hass.localize(
"ui.components.entity.entity-picker.entity"
)}
.disabled=${this._isLoading}
@change=${this._entityPicked}
></ha-entity-picker>
</div>
${this._isLoading
? html`<paper-spinner
active
alt=${this.hass.localize("ui.common.loading")}
></paper-spinner>`
: html`<ha-logbook
.hass=${this.hass}
.entries=${this._entries}
></ha-logbook>`}
</app-header-layout>
`;
}
protected firstUpdated(changedProps: PropertyValues) {
super.firstUpdated(changedProps);
this.hass.loadBackendTranslation("title");
const today = new Date();
today.setHours(0, 0, 0, 0);
const todayEnd = new Date(today);
todayEnd.setDate(todayEnd.getDate() + 1);
todayEnd.setMilliseconds(todayEnd.getMilliseconds() - 1);
const todayCopy = new Date(today);
const yesterday = new Date(todayCopy.setDate(today.getDate() - 1));
const yesterdayEnd = new Date(yesterday);
yesterdayEnd.setDate(yesterdayEnd.getDate() + 1);
yesterdayEnd.setMilliseconds(yesterdayEnd.getMilliseconds() - 1);
const thisWeekStart = new Date(
todayCopy.setDate(today.getDate() - today.getDay())
);
const thisWeekEnd = new Date(
todayCopy.setDate(today.getDate() - today.getDay() + 7)
);
thisWeekEnd.setMilliseconds(thisWeekEnd.getMilliseconds() - 1);
const lastWeekStart = new Date(
todayCopy.setDate(today.getDate() - today.getDay() - 7)
);
const lastWeekEnd = new Date(
todayCopy.setDate(today.getDate() - today.getDay())
);
lastWeekEnd.setMilliseconds(lastWeekEnd.getMilliseconds() - 1);
this._ranges = {
[this.hass.localize("ui.panel.logbook.ranges.today")]: [today, todayEnd],
[this.hass.localize("ui.panel.logbook.ranges.yesterday")]: [
yesterday,
yesterdayEnd,
],
[this.hass.localize("ui.panel.logbook.ranges.this_week")]: [
thisWeekStart,
thisWeekEnd,
],
[this.hass.localize("ui.panel.logbook.ranges.last_week")]: [
lastWeekStart,
lastWeekEnd,
],
};
}
protected updated(changedProps: PropertyValues) {
if (
changedProps.has("_startDate") ||
changedProps.has("_endDate") ||
changedProps.has("_entityId")
) {
this._getData();
}
if (changedProps.has("hass")) {
const oldHass = changedProps.get("hass") as HomeAssistant | undefined;
if (!oldHass || oldHass.language !== this.hass.language) {
this.rtl = computeRTL(this.hass);
}
}
}
private _dateRangeChanged(ev) {
this._startDate = ev.detail.startDate;
const endDate = ev.detail.endDate;
if (endDate.getHours() === 0 && endDate.getMinutes() === 0) {
endDate.setDate(endDate.getDate() + 1);
endDate.setMilliseconds(endDate.getMilliseconds() - 1);
}
this._endDate = endDate;
}
private _entityPicked(ev) {
this._entityId = ev.target.value;
}
private _refreshLogbook() {
this._entries = [];
clearLogbookCache(
this._startDate.toISOString(),
this._endDate.toISOString()
);
this._getData();
}
private async _getData() {
this._isLoading = true;
this._entries = await getLogbookData(
this.hass,
this._startDate.toISOString(),
this._endDate.toISOString(),
this._entityId
);
this._isLoading = false;
}
static get styles() {
return [
haStyle,
css`
ha-logbook {
height: calc(100vh - 136px);
}
:host([narrow]) ha-logbook {
height: calc(100vh - 198px);
}
ha-date-range-picker {
margin-right: 16px;
max-width: 100%;
}
:host([narrow]) ha-date-range-picker {
margin-right: 0;
}
paper-spinner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.wrap {
margin-bottom: 24px;
}
.filters {
display: flex;
align-items: flex-end;
padding: 0 16px;
}
:host([narrow]) .filters {
flex-wrap: wrap;
}
ha-entity-picker {
display: inline-block;
flex-grow: 1;
max-width: 400px;
--paper-input-suffix: {
height: 24px;
}
}
:host([narrow]) ha-entity-picker {
max-width: none;
width: 100%;
}
`,
];
}
}
@@ -228,6 +228,7 @@ class HuiEntitiesCard extends LitElement implements LovelaceCard {
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
}
.card-header {
display: flex;
@@ -12,7 +12,6 @@ import { classMap } from "lit-html/directives/class-map";
import "../../../components/ha-card";
import "../../../components/state-history-charts";
import { CacheConfig, getRecentWithCache } from "../../../data/cached-history";
import "../../../data/ha-state-history-data";
import { HomeAssistant } from "../../../types";
import { findEntities } from "../common/find-entites";
import { processConfigEntities } from "../common/process-config-entities";
@@ -14,6 +14,7 @@ import "../cards/hui-weather-forecast-card";
import {
createLovelaceElement,
getLovelaceElementClass,
tryCreateLovelaceElement,
} from "./create-element-base";
const ALWAYS_LOADED_TYPES = new Set([
@@ -52,6 +53,17 @@ const LAZY_LOAD_TYPES = {
picture: () => import("../cards/hui-picture-card"),
};
// This will not return an error card but will throw the error
export const tryCreateCardElement = (config: LovelaceCardConfig) =>
tryCreateLovelaceElement(
"card",
config,
ALWAYS_LOADED_TYPES,
LAZY_LOAD_TYPES,
undefined,
undefined
);
export const createCardElement = (config: LovelaceCardConfig) =>
createLovelaceElement(
"card",
@@ -73,15 +73,8 @@ const _createElement = <T extends keyof CreateElementConfigTypes>(
const element = document.createElement(
tag
) as CreateElementConfigTypes[T]["element"];
try {
// @ts-ignore
element.setConfig(config);
} catch (err) {
// eslint-disable-next-line
console.error(tag, err);
// eslint-disable-next-line @typescript-eslint/no-use-before-define
return _createErrorElement(err.message, config);
}
// @ts-ignore
element.setConfig(config);
return element;
};
@@ -152,9 +145,37 @@ export const createLovelaceElement = <T extends keyof CreateElementConfigTypes>(
domainTypes?: { _domain_not_found: string; [domain: string]: string },
// Default type if no type given. If given, entity types will not work.
defaultType?: string
): CreateElementConfigTypes[T]["element"] | HuiErrorCard => {
try {
return tryCreateLovelaceElement(
tagSuffix,
config,
alwaysLoadTypes,
lazyLoadTypes,
domainTypes,
defaultType
);
} catch (err) {
// eslint-disable-next-line
console.error(tagSuffix, config.type, err);
return _createErrorElement(err.message, config);
}
};
export const tryCreateLovelaceElement = <
T extends keyof CreateElementConfigTypes
>(
tagSuffix: T,
config: CreateElementConfigTypes[T]["config"],
alwaysLoadTypes?: Set<string>,
lazyLoadTypes?: { [domain: string]: () => Promise<unknown> },
// Allow looking at "entity" in config and mapping that to a type
domainTypes?: { _domain_not_found: string; [domain: string]: string },
// Default type if no type given. If given, entity types will not work.
defaultType?: string
): CreateElementConfigTypes[T]["element"] | HuiErrorCard => {
if (!config || typeof config !== "object") {
return _createErrorElement("Config is not an object", config);
throw new Error("Config is not an object");
}
if (
@@ -163,7 +184,7 @@ export const createLovelaceElement = <T extends keyof CreateElementConfigTypes>(
// If domain types is given, we can derive a type from "entity"
(!domainTypes || !("entity" in config))
) {
return _createErrorElement("No card type configured.", config);
throw new Error("No card type configured.");
}
const customTag = config.type ? _getCustomTag(config.type) : undefined;
@@ -185,7 +206,7 @@ export const createLovelaceElement = <T extends keyof CreateElementConfigTypes>(
}
if (type === undefined) {
return _createErrorElement(`No type specified`, config);
throw new Error("No type specified.");
}
const tag = `hui-${type}-${tagSuffix}`;
@@ -199,7 +220,7 @@ export const createLovelaceElement = <T extends keyof CreateElementConfigTypes>(
return _createElement(tag, config);
}
return _createErrorElement(`Unknown type encountered: ${type}.`, config);
throw new Error(`Unknown type encountered: ${type}`);
};
export const getLovelaceElementClass = async <
@@ -27,7 +27,7 @@ import {
calcUnusedEntities,
computeUsedEntities,
} from "../../common/compute-unused-entities";
import { createCardElement } from "../../create-element/create-card-element";
import { tryCreateCardElement } from "../../create-element/create-card-element";
import { LovelaceCard } from "../../types";
import { getCardStubConfig } from "../get-card-stub-config";
import { CardPickTarget, Card } from "../types";
@@ -307,8 +307,8 @@ export class HuiCardPicker extends LitElement {
fireEvent(this, "config-changed", { config });
}
private _createCardElement(cardConfig: LovelaceCardConfig) {
const element = createCardElement(cardConfig) as LovelaceCard;
private _tryCreateCardElement(cardConfig: LovelaceCardConfig) {
const element = tryCreateCardElement(cardConfig) as LovelaceCard;
element.hass = this.hass;
element.addEventListener(
"ll-rebuild",
@@ -325,7 +325,12 @@ export class HuiCardPicker extends LitElement {
cardElToReplace: LovelaceCard,
config: LovelaceCardConfig
): void {
const newCardEl = this._createCardElement(config);
let newCardEl: LovelaceCard;
try {
newCardEl = this._tryCreateCardElement(config);
} catch (err) {
return;
}
if (cardElToReplace.parentElement) {
cardElToReplace.parentElement!.replaceChild(newCardEl, cardElToReplace);
}
@@ -351,7 +356,11 @@ export class HuiCardPicker extends LitElement {
);
if (showElement) {
element = this._createCardElement(cardConfig);
try {
element = this._tryCreateCardElement(cardConfig);
} catch (err) {
element = undefined;
}
}
}
+33 -18
View File
@@ -278,6 +278,11 @@
"failed_create_area": "Failed to create area."
}
},
"date-range-picker": {
"start_date": "Start date",
"end_date": "End date",
"select": "Select"
},
"relative_time": {
"past": "{time} ago",
"future": "In {time}",
@@ -443,6 +448,7 @@
"buttons": {
"add": "Add Devices via this device",
"remove": "Remove Device",
"clusters": "Manage Clusters",
"reconfigure": "Reconfigure Device",
"zigbee_information": "Zigbee device signature"
},
@@ -1506,6 +1512,20 @@
"create": "Create"
}
},
"mqtt": {
"button": "Configure",
"title": "MQTT",
"description_publish": "Publish a packet",
"topic": "topic",
"payload": "Payload (template allowed)",
"publish": "Publish",
"description_listen": "Listen to a topic",
"listening_to": "Listening to",
"subscribe_to": "Topic to subscribe to",
"start_listening": "Start listening",
"stop_listening": "Stop listening",
"message_received": "Message {id} received on {topic} at {time}:"
},
"zha": {
"button": "Configure",
"header": "Configure Zigbee Home Automation",
@@ -1694,13 +1714,21 @@
}
},
"history": {
"showing_entries": "Showing entries for",
"period": "Period"
"ranges": {
"today": "Today",
"yesterday": "Yesterday",
"this_week": "This week",
"last_week": "Last week"
}
},
"logbook": {
"showing_entries": "[%key:ui::panel::history::showing_entries%]",
"period": "Period",
"entries_not_found": "No logbook entries found."
"entries_not_found": "No logbook entries found.",
"ranges": {
"today": "Today",
"yesterday": "Yesterday",
"this_week": "This week",
"last_week": "Last week"
}
},
"lovelace": {
"cards": {
@@ -2299,19 +2327,6 @@
"alert_event_type": "Event type is a mandatory field",
"notification_event_fired": "Event {type} successful fired!"
},
"mqtt": {
"title": "MQTT",
"description_publish": "Publish a packet",
"topic": "topic",
"payload": "Payload (template allowed)",
"publish": "Publish",
"description_listen": "Listen to a topic",
"listening_to": "Listening to",
"subscribe_to": "Topic to subscribe to",
"start_listening": "Start listening",
"stop_listening": "Stop listening",
"message_received": "Message {id} received on {topic} at {time}:"
},
"services": {
"title": "Services",
"description": "The service dev tool allows you to call any available service in Home Assistant.",
+3 -3
View File
@@ -1142,6 +1142,9 @@
}
}
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Persone",
"description": "Bestuur die persone wat Home Assistant op spoor.",
@@ -1377,9 +1380,6 @@
"events": {
"title": "Gebeure"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Dienste"
},
+3 -3
View File
@@ -920,6 +920,9 @@
}
}
},
"mqtt": {
"title": "MQTT"
},
"person": {
"detail": {
"device_tracker_pick": "اختر جهاز لتتبع"
@@ -1045,9 +1048,6 @@
"events": {
"title": "أحداث"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "الخدمات"
},
+3 -3
View File
@@ -939,6 +939,9 @@
"cant_edit_yaml": "Използвате Lovelace в YAML режим, следователно не можете да управлявате ресурсите си чрез потребителския интерфейс. Управлявайте ги в configuration.yaml."
}
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Хора",
"description": "Управлявайте хората, които следите от Home Assistant.",
@@ -1092,9 +1095,6 @@
"events": {
"title": "Събития"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Услуги"
},
+14 -3
View File
@@ -240,9 +240,23 @@
},
"panel": {
"config": {
"automation": {
"editor": {
"triggers": {
"type": {
"mqtt": {
"label": "MQTT"
}
}
}
}
},
"cloud": {
"caption": "Home Assistant Cloud"
},
"mqtt": {
"title": "MQTT"
},
"zwave": {
"caption": "Z-Wave",
"node_config": {
@@ -255,9 +269,6 @@
"events": {
"title": "Događanja"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Usluge"
},
+18 -13
View File
@@ -1391,6 +1391,11 @@
"system_health_error": "El component Estat del Sistema no està configurat. Afegeix 'system_health:' a configuration.yaml",
"title": "Informació"
},
"integration_panel_move": {
"link_integration_page": "pàgina d'integracions",
"missing_zha": "Trobes a faltar el panell de configuració de ZHA? S'ha traslladat a l'entrada ZHA de la {integrations_page}.",
"missing_zwave": "Trobes a faltar el panell de configuració de Z-Wave? S'ha traslladat a l'entrada Z-Wave de la {integrations_page}."
},
"integrations": {
"add_integration": "Afegeix integració",
"caption": "Integracions",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Escolta d'un tòpic",
"description_publish": "Publicació d'un paquet",
"listening_to": "Escoltant a",
"message_received": "Missatge {id} rebut a {topic} a les {time}:",
"payload": "Dades/missatge (plantilla permesa)",
"publish": "Publica",
"start_listening": "Comença a escoltar",
"stop_listening": "Deixa d'escoltar",
"subscribe_to": "Tòpic al qual subscriure's",
"title": "MQTT",
"topic": "tòpic"
},
"person": {
"add_person": "Afegeix persona",
"caption": "Persones",
@@ -1974,19 +1992,6 @@
"title": "Esdeveniments",
"type": "Tipus d'esdeveniment"
},
"mqtt": {
"description_listen": "Escolta d'un tòpic",
"description_publish": "Publicació d'un paquet",
"listening_to": "Escoltant a",
"message_received": "Missatge {id} rebut a {topic} a les {time}:",
"payload": "Dades/missatge (plantilla permesa)",
"publish": "Publica",
"start_listening": "Comença a escoltar",
"stop_listening": "Deixa d'escoltar",
"subscribe_to": "Tòpic al qual subscriure's",
"title": "MQTT",
"topic": "tòpic"
},
"services": {
"alert_parsing_yaml": "S'ha produït un error analitzant el codi YAML: {data}",
"call_service": "Crida servei",
+13 -13
View File
@@ -1541,6 +1541,19 @@
}
}
},
"mqtt": {
"description_listen": "Naslouchat tématu",
"description_publish": "Publikovat paket",
"listening_to": "Naslouchám",
"message_received": "Zpráva {id} přijata na {topic} v {time} :",
"payload": "Obsah",
"publish": "Publikovat",
"start_listening": "Začít naslouchat",
"stop_listening": "Přestat naslouchat",
"subscribe_to": "Téma k odběru",
"title": "MQTT",
"topic": "téma"
},
"person": {
"add_person": "Přidat osobu",
"caption": "Osoby",
@@ -1947,19 +1960,6 @@
"title": "Události",
"type": "Typ události"
},
"mqtt": {
"description_listen": "Naslouchat tématu",
"description_publish": "Publikovat paket",
"listening_to": "Naslouchám",
"message_received": "Zpráva {id} přijata na {topic} v {time} :",
"payload": "Obsah",
"publish": "Publikovat",
"start_listening": "Začít naslouchat",
"stop_listening": "Přestat naslouchat",
"subscribe_to": "Téma k odběru",
"title": "MQTT",
"topic": "téma"
},
"services": {
"alert_parsing_yaml": "Chyba při parsování YAML: {data}",
"call_service": "Zavolat službu",
+3 -3
View File
@@ -780,6 +780,9 @@
}
}
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Pobl",
"description": "Rheoli'r pobl mae Home Assistant yn tracio.",
@@ -935,9 +938,6 @@
"events": {
"title": "Digwyddiadau"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Gwasanaethau"
},
+41 -14
View File
@@ -1373,7 +1373,9 @@
},
"info": {
"built_using": "Bygget ved hjælp af",
"caption": "Oplysninger",
"custom_uis": "Tilpassede brugergrænseflader:",
"description": "Oplysninger om din Home Assistant-installation",
"developed_by": "Udviklet af en masse fantastiske mennesker.",
"documentation": "Dokumentation",
"frontend": "brugerflade",
@@ -1389,6 +1391,11 @@
"system_health_error": "System Health-komponenten er ikke indlæst. Føj 'system_health:' til 'config.yaml'",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "integrationssiden",
"missing_zha": "Mangler ZHA-konfigurationspanelet? Det er blevet flyttet til ZHA-posten på {integrations_page}.",
"missing_zwave": "Mangler Z-wave-konfigurationspanelet? Det er blevet flyttet til Z-wave-posten på {integrations_page}."
},
"integrations": {
"add_integration": "Tilføj integration",
"caption": "Integrationer",
@@ -1461,7 +1468,9 @@
},
"introduction": "Her er det muligt at konfigurere dine komponenter og Home Assistant. Ikke alt er muligt at konfigurere fra brugerfladen endnu, men vi arbejder på det.",
"logs": {
"caption": "Logs",
"clear": "Ryd",
"description": "Se logs for Home Assistant",
"details": "Logdetaljer ({level})",
"load_full_log": "Indlæs fuld Home Assistant-log",
"loading_log": "Indlæser fejllog...",
@@ -1548,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Lyt til et emne",
"description_publish": "Udsend en pakke",
"listening_to": "Lytter til",
"message_received": "Besked {id} er modtaget på {topic} kl. {time}:",
"payload": "Payload (skabelon tilladt)",
"publish": "Udsend",
"start_listening": "Start med at lytte",
"stop_listening": "Stop med at lytte",
"subscribe_to": "Emne at abonnere på",
"title": "MQTT",
"topic": "emne"
},
"person": {
"add_person": "Tilføj person",
"caption": "Personer",
@@ -1656,6 +1678,11 @@
"core": "Genindlæs lokalitet og tilpasninger",
"group": "Genindlæs grupper",
"heading": "Genindlæsning af YAML-konfiguration",
"input_boolean": "Genindlæs booleske input",
"input_datetime": "Genindlæs inputdatotider",
"input_number": "Genindlæs inputnumre",
"input_select": "Genindlæs inputvalg",
"input_text": "Genindlæs inputtekster",
"introduction": "Nogle dele af Home Assistant kan genindlæses uden en genstart. Tryk på genindlæs for at aflæse den nuværende YAML-konfiguration og indlæse den nye.",
"person": "Genindlæs personer",
"scene": "Genindlæs scener",
@@ -1719,8 +1746,11 @@
},
"zha": {
"add_device_page": {
"discovered_text": "Enheder vil dukke op her, når de er fundet.",
"discovery_text": "Fundne enheder vil dukke op her. Følg instruktionerne for din enhed(er) og sæt enhed(erne) i parringstilstand.",
"header": "Zigbee Home Automation - Tilføj enheder",
"no_devices_found": "Ingen enheder blev fundet. Sørg for at de er i paringtilstand, og hold dem vågne, mens opdagelsen kører.",
"pairing_mode": "Sørg for, at dine enheder er i parringstilstand. Se enhedens vejledning i, hvordan du gør dette.",
"search_again": "Søg igen",
"spinner": "Søger efter ZHA Zigbee-enheder..."
},
@@ -1728,6 +1758,7 @@
"caption": "Tilføj enheder",
"description": "Føj enheder til Zigbee-netværk"
},
"button": "Konfigurer",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Egenskaber for den valgte klynge",
@@ -1806,6 +1837,9 @@
"header": "Netværksstyring",
"introduction": "Kommandoer, der påvirker hele netværket"
},
"network": {
"caption": "Netværk"
},
"node_management": {
"header": "Enhedshåndtering",
"help_node_dropdown": "Vælg en enhed for at få vist enhedsspecifikke indstillinger.",
@@ -1845,6 +1879,7 @@
"no_zones_created_yet": "Det ser ud til, at du ikke har oprettet nogen zoner endnu."
},
"zwave": {
"button": "Konfigurer",
"caption": "Z-Wave",
"common": {
"index": "Indeks",
@@ -1886,12 +1921,17 @@
"add_node_secure": "Tilføj sikkert knudepunkt",
"cancel_command": "Annuller kommando",
"heal_network": "Helbred netværk",
"heal_node": "Helbred node",
"node_info": "Node information",
"print_node": "Udskriv node",
"refresh_entity": "Opdater entitet",
"remove_node": "Fjern knudepunkt",
"save_config": "Gem konfiguration",
"soft_reset": "Blød nulstilling",
"start_network": "Start netværk",
"stop_network": "Stop netværk",
"test_network": "Test netværk"
"test_network": "Test netværk",
"test_node": "Test node"
},
"values": {
"header": "Knudepunktsværdier"
@@ -1925,19 +1965,6 @@
"title": "Hændelser",
"type": "Hændelsestype"
},
"mqtt": {
"description_listen": "Lyt til et emne",
"description_publish": "Udsend en pakke",
"listening_to": "Lytter til",
"message_received": "Besked {id} er modtaget på {topic} kl. {time}:",
"payload": "Payload (skabelon tilladt)",
"publish": "Udsend",
"start_listening": "Start med at lytte",
"stop_listening": "Stop med at lytte",
"subscribe_to": "Emne at abonnere på",
"title": "MQTT",
"topic": "emne"
},
"services": {
"alert_parsing_yaml": "Fejl under afkodning af YAML: {data}",
"call_service": "Kald tjeneste",
+13 -13
View File
@@ -1551,6 +1551,19 @@
}
}
},
"mqtt": {
"description_listen": "Auf einen Topic hören",
"description_publish": "Ein Paket veröffentlichen",
"listening_to": "Anhören von",
"message_received": "Nachricht {id} empfangen auf {topic} um {time}:",
"payload": "Payload (Vorlage erlaubt)",
"publish": "Veröffentlichen",
"start_listening": "Anfangen zuzuhören",
"stop_listening": "Aufhören zuzuhören",
"subscribe_to": "Topic abonnieren",
"title": "MQTT",
"topic": "Topic"
},
"person": {
"add_person": "Person hinzufügen",
"caption": "Personen",
@@ -1968,19 +1981,6 @@
"title": "Ereignisse",
"type": "Ereignistyp"
},
"mqtt": {
"description_listen": "Auf einen Topic hören",
"description_publish": "Ein Paket veröffentlichen",
"listening_to": "Anhören von",
"message_received": "Nachricht {id} empfangen auf {topic} um {time}:",
"payload": "Payload (Vorlage erlaubt)",
"publish": "Veröffentlichen",
"start_listening": "Anfangen zuzuhören",
"stop_listening": "Aufhören zuzuhören",
"subscribe_to": "Topic abonnieren",
"title": "MQTT",
"topic": "Topic"
},
"services": {
"alert_parsing_yaml": "Fehler beim Parsen von YAML: {data}",
"call_service": "Dienst ausführen",
+13 -13
View File
@@ -1319,6 +1319,19 @@
}
}
},
"mqtt": {
"description_listen": "Ακούστε ένα θέμα",
"description_publish": "Δημοσιεύστε ένα πακέτο",
"listening_to": "Ακούγοντας το",
"message_received": "Το μήνυμα {id} ελήφθη στο {topic} στις {time}:",
"payload": "Τιμή φορτίου (επιτρέπεται το πρότυπο)",
"publish": "Δημοσιεύστε",
"start_listening": "Ξεκινήστε να ακούτε",
"stop_listening": "Σταματήστε να ακούτε",
"subscribe_to": "Θέμα για το οποίο θα εγγραφείτε",
"title": "MQTT",
"topic": "θέμα"
},
"person": {
"add_person": "Προσθέστε Άτομο",
"caption": "Άτομα",
@@ -1651,19 +1664,6 @@
"title": "Γεγονότα",
"type": "Τύπος συμβάντος"
},
"mqtt": {
"description_listen": "Ακούστε ένα θέμα",
"description_publish": "Δημοσιεύστε ένα πακέτο",
"listening_to": "Ακούγοντας το",
"message_received": "Το μήνυμα {id} ελήφθη στο {topic} στις {time}:",
"payload": "Τιμή φορτίου (επιτρέπεται το πρότυπο)",
"publish": "Δημοσιεύστε",
"start_listening": "Ξεκινήστε να ακούτε",
"stop_listening": "Σταματήστε να ακούτε",
"subscribe_to": "Θέμα για το οποίο θα εγγραφείτε",
"title": "MQTT",
"topic": "θέμα"
},
"services": {
"alert_parsing_yaml": "Σφάλμα ανάλυσης του YAML: {data}",
"call_service": "Κάλεσμα υπηρεσίας",
+32 -13
View File
@@ -506,6 +506,11 @@
"clear": "Clear",
"show_areas": "Show areas"
},
"date-range-picker": {
"end_date": "End date",
"select": "Select",
"start_date": "Start date"
},
"device-picker": {
"clear": "Clear",
"device": "Device",
@@ -695,6 +700,7 @@
"zha_device_info": {
"buttons": {
"add": "Add Devices via this device",
"clusters": "Manage Clusters",
"reconfigure": "Reconfigure Device",
"remove": "Remove Device",
"zigbee_information": "Zigbee device signature"
@@ -1557,6 +1563,20 @@
}
}
},
"mqtt": {
"button": "Configure",
"description_listen": "Listen to a topic",
"description_publish": "Publish a packet",
"listening_to": "Listening to",
"message_received": "Message {id} received on {topic} at {time}:",
"payload": "Payload (template allowed)",
"publish": "Publish",
"start_listening": "Start listening",
"stop_listening": "Stop listening",
"subscribe_to": "Topic to subscribe to",
"title": "MQTT",
"topic": "topic"
},
"person": {
"add_person": "Add Person",
"caption": "Persons",
@@ -1979,19 +1999,6 @@
"title": "Events",
"type": "Event Type"
},
"mqtt": {
"description_listen": "Listen to a topic",
"description_publish": "Publish a packet",
"listening_to": "Listening to",
"message_received": "Message {id} received on {topic} at {time}:",
"payload": "Payload (template allowed)",
"publish": "Publish",
"start_listening": "Start listening",
"stop_listening": "Stop listening",
"subscribe_to": "Topic to subscribe to",
"title": "MQTT",
"topic": "topic"
},
"services": {
"alert_parsing_yaml": "Error parsing YAML: {data}",
"call_service": "Call Service",
@@ -2035,11 +2042,23 @@
},
"history": {
"period": "Period",
"ranges": {
"last_week": "Last week",
"this_week": "This week",
"today": "Today",
"yesterday": "Yesterday"
},
"showing_entries": "Showing entries for"
},
"logbook": {
"entries_not_found": "No logbook entries found.",
"period": "Period",
"ranges": {
"last_week": "Last week",
"this_week": "This week",
"today": "Today",
"yesterday": "Yesterday"
},
"showing_entries": "Showing entries for"
},
"lovelace": {
+12 -12
View File
@@ -172,6 +172,18 @@
"no_issues": "Ne estas novaj aferoj!",
"refresh": "Refreŝigi"
},
"mqtt": {
"description_listen": "Aŭskulti temon",
"description_publish": "Publikigi pakaĵon",
"listening_to": "Aŭskulti",
"message_received": "Mesaĝo {id} ricevita sur {topic} je {time} :",
"payload": "Pagŝarĝo (ŝablono permesita)",
"publish": "Publikigi",
"start_listening": "Komenci aŭskulti",
"stop_listening": "Halti aŭskulti",
"subscribe_to": "Temo por aboni",
"topic": "temo"
},
"scene": {
"activated": "Aktivigita sceno {name}.",
"caption": "Scenoj",
@@ -316,18 +328,6 @@
"subscribe_to": "Evento por aboni",
"type": "Eventa Tipo"
},
"mqtt": {
"description_listen": "Aŭskulti temon",
"description_publish": "Publikigi pakaĵon",
"listening_to": "Aŭskulti",
"message_received": "Mesaĝo {id} ricevita sur {topic} je {time} :",
"payload": "Pagŝarĝo (ŝablono permesita)",
"publish": "Publikigi",
"start_listening": "Komenci aŭskulti",
"stop_listening": "Halti aŭskulti",
"subscribe_to": "Temo por aboni",
"topic": "temo"
},
"services": {
"alert_parsing_yaml": "Eraro dum analizado de YAML: {data}",
"call_service": "Voka Servo",
+14 -14
View File
@@ -955,7 +955,7 @@
"start": "Inicio"
},
"mqtt": {
"label": "MQTT",
"label": "",
"payload": "Payload (opcional)",
"topic": "Topic"
},
@@ -1551,6 +1551,19 @@
}
}
},
"mqtt": {
"description_listen": "Escuchar un tema",
"description_publish": "Publicar un paquete",
"listening_to": "Escuchando a",
"message_received": "Mensaje {id} recibido el {topic} a las {time} :",
"payload": "Carga útil (plantilla permitida)",
"publish": "Publicar",
"start_listening": "Comenzar a escuchar",
"stop_listening": "Deja de escuchar",
"subscribe_to": "Tema para suscribirse",
"title": "",
"topic": "tema"
},
"person": {
"add_person": "Agregar persona",
"caption": "Personas",
@@ -1964,19 +1977,6 @@
"title": "Eventos",
"type": "Tipo de evento"
},
"mqtt": {
"description_listen": "Escuchar un tema",
"description_publish": "Publicar un paquete",
"listening_to": "Escuchando a",
"message_received": "Mensaje {id} recibido el {topic} a las {time} :",
"payload": "Carga útil (plantilla permitida)",
"publish": "Publicar",
"start_listening": "Comenzar a escuchar",
"stop_listening": "Deja de escuchar",
"subscribe_to": "Tema para suscribirse",
"title": "",
"topic": "tema"
},
"services": {
"alert_parsing_yaml": "Error al analizar YAML: {data}",
"call_service": "Llamar al Servico",
+21 -16
View File
@@ -694,10 +694,10 @@
},
"zha_device_info": {
"buttons": {
"add": "Añadir dispositivos",
"add": "Añadir dispositivos a través de este dispositivo",
"reconfigure": "Reconfigurar dispositivo",
"remove": "Eliminar dispositivos",
"zigbee_information": "Información Zigbee"
"zigbee_information": "Firma del dispositivo Zigbee"
},
"confirmations": {
"remove": "¿Estás seguro de que quieres eliminar este dispositivo?"
@@ -717,7 +717,7 @@
"unknown": "Desconocido",
"zha_device_card": {
"area_picker_label": "Área",
"device_name_placeholder": "Nombre dado por el usuario",
"device_name_placeholder": "Cambiar el nombre del dispositivo",
"update_name_button": "Cambiar nombre"
}
}
@@ -1391,6 +1391,11 @@
"system_health_error": "El componente Estado del Sistema no está cargado. Añade 'system_health:' a configuration.yaml",
"title": "Información"
},
"integration_panel_move": {
"link_integration_page": "página de integraciones",
"missing_zha": "¿Echas de menos el panel de configuración de ZHA? Se ha movido a la entrada ZHA en la {integrations_page}.",
"missing_zwave": "¿Echas de menos el panel de configuración de Z-Wave? Se ha movido a la entrada Z-Wave en la {integrations_page}."
},
"integrations": {
"add_integration": "Añadir integración",
"caption": "Integraciones",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Escuchar un tema",
"description_publish": "Publicar un paquete",
"listening_to": "Escuchando",
"message_received": "Mensaje {id} recibido en {topic} a las {time}:",
"payload": "Payload (plantilla permitida)",
"publish": "Publicar",
"start_listening": "Empezar a escuchar",
"stop_listening": "Dejar de escuchar",
"subscribe_to": "Tema al que suscribirse",
"title": "MQTT",
"topic": "tema"
},
"person": {
"add_person": "Añadir persona",
"caption": "Personas",
@@ -1974,19 +1992,6 @@
"title": "Eventos",
"type": "Tipo de evento"
},
"mqtt": {
"description_listen": "Escuchar un tema",
"description_publish": "Publicar un paquete",
"listening_to": "Escuchando",
"message_received": "Mensaje {id} recibido en {topic} a las {time}:",
"payload": "Payload (plantilla permitida)",
"publish": "Publicar",
"start_listening": "Empezar a escuchar",
"stop_listening": "Dejar de escuchar",
"subscribe_to": "Tema al que suscribirse",
"title": "MQTT",
"topic": "tema"
},
"services": {
"alert_parsing_yaml": "Error al analizar YAML: {data}",
"call_service": "Llamar servicio",
+10 -10
View File
@@ -1223,6 +1223,16 @@
"refresh": "Värskenda",
"title": "Logid"
},
"mqtt": {
"description_listen": "Kuula teemat",
"listening_to": "Kuulamas",
"publish": "Avalda",
"start_listening": "Alusta kuulamist",
"stop_listening": "Lõpeta kuulamine",
"subscribe_to": "Teema, mida tellida",
"title": "MQTT",
"topic": "teema"
},
"person": {
"add_person": "Lisa isik",
"caption": "Isikud",
@@ -1534,16 +1544,6 @@
"title": "Sündmused",
"type": "Sündmuse tüüp"
},
"mqtt": {
"description_listen": "Kuula teemat",
"listening_to": "Kuulamas",
"publish": "Avalda",
"start_listening": "Alusta kuulamist",
"stop_listening": "Lõpeta kuulamine",
"subscribe_to": "Teema, mida tellida",
"title": "MQTT",
"topic": "teema"
},
"services": {
"alert_parsing_yaml": "Viga YAML'i parsimisel: {data}",
"call_service": "Kutsu teenus",
+3 -3
View File
@@ -569,6 +569,9 @@
"new": "Integrazio berri bat konfiguratu",
"none": "Ez dago ezer konfiguratuta"
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Pertsonak",
"description": "Kudeatu Home Assistantek jarraituko dituen pertsonak.",
@@ -620,9 +623,6 @@
"events": {
"title": "Gertaerak"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Zerbitzuak"
},
+8 -5
View File
@@ -755,6 +755,9 @@
"homeassistant": {
"label": "Home Assistant"
},
"mqtt": {
"label": "MQTT"
},
"numeric_state": {
"label": "حالت عددی"
},
@@ -1154,6 +1157,11 @@
}
}
},
"mqtt": {
"publish": "Publica",
"subscribe_to": "Subiect pentru abonare",
"title": "MQTT"
},
"person": {
"add_person": "Adauga Persoana",
"caption": "افراد",
@@ -1362,11 +1370,6 @@
"events": {
"title": "رویدادها"
},
"mqtt": {
"publish": "Publica",
"subscribe_to": "Subiect pentru abonare",
"title": "MQTT"
},
"services": {
"call_service": "Apeleaza serviciul",
"column_description": "Descriere",
+38 -13
View File
@@ -483,6 +483,7 @@
"menu": "Valikko",
"next": "Seuraava",
"no": "Ei",
"overflow_menu": "Ylivuotovalikko",
"previous": "Edellinen",
"refresh": "Päivitä",
"save": "Tallenna",
@@ -912,6 +913,8 @@
"introduction": "Käytä automaatioita herättääksesi kotisi eloon",
"load_error_not_editable": "Vain automaatiot tiedostossa automations.yaml ovat muokattavissa.",
"load_error_unknown": "Virhe ladatessa automaatiota ( {err_no} )",
"move_down": "Siirrä alaspäin",
"move_up": "Siirrä ylöspäin",
"save": "Tallenna",
"triggers": {
"add": "Laukaisuehto",
@@ -1370,7 +1373,9 @@
},
"info": {
"built_using": "Rakennettu käyttäen",
"caption": "Tiedot",
"custom_uis": "Mukautetut käyttöliittymät:",
"description": "Tietoja Home Assistant -asennuksesta",
"developed_by": "Kehittänyt joukko mahtavia ihmisiä.",
"documentation": "Dokumentointi",
"frontend": "frontend-ui",
@@ -1386,6 +1391,11 @@
"system_health_error": "Järjestelmän kunto-komponenttia ei ole ladattu. Lisää 'system_health:' kohteeseen configuration.yaml",
"title": "Tiedot"
},
"integration_panel_move": {
"link_integration_page": "Integraatiot",
"missing_zha": "Etsitkö ZHA-asetuspaneelia? Se siirrettiin kohtaan ZHA {integrations_page}.",
"missing_zwave": "Etsitkö Z-Wave-asetuspaneelia? Se siirrettiin Z-Wave-kohtaan {integrations_page}."
},
"integrations": {
"add_integration": "Lisää integraatio",
"caption": "Integraatiot",
@@ -1458,7 +1468,9 @@
},
"introduction": "Täällä voit säätää Home Assistanttia ja sen komponentteja. Huomioithan, ettei kaikkea voi vielä säätää käyttöliittymän kautta, mutta teemme jatkuvasti töitä sen mahdollistamiseksi.",
"logs": {
"caption": "Lokit",
"clear": "Tyhjennä",
"description": "Tarkastele Home Assistant -lokeja",
"details": "Lokitiedot ( {level} )",
"load_full_log": "Lataa Home Assistantin koko loki",
"loading_log": "Ladataan virhelokia...",
@@ -1545,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Kuuntele aihetta",
"description_publish": "Julkaise paketti",
"listening_to": "Kuunnellaan",
"message_received": "Viesti {id} vastaanotettu aiheessa {topic} {time}:",
"payload": "Tietosisältö (malli sallittu)",
"publish": "Julkaise",
"start_listening": "Aloita kuuntelu",
"stop_listening": "Lopeta kuuntelu",
"subscribe_to": "Tilaa aihe",
"title": "MQTT",
"topic": "aihe"
},
"person": {
"add_person": "Lisää henkilö",
"caption": "Henkilöt",
@@ -1653,6 +1678,11 @@
"core": "Lataa ydin uudelleen",
"group": "Lataa ryhmät uudelleen",
"heading": "Asetusten uudelleenlataus",
"input_boolean": "Lataa booleanit uudelleen",
"input_datetime": "Lataa syöttöpäivämäärät uudelleen",
"input_number": "Lataa syöttönumerot uudelleen",
"input_select": "Lataa valinnat uudelleen",
"input_text": "Lataa syöttötekstit uudelleen",
"introduction": "Jotkut Home Assistantin osat voidaan ladata uudelleen ilman, että tarvitaan uudelleenkäynnistystä. Painamalla uudelleenlatausta yaml-tiedosto luetaan uudelleen.",
"person": "Lataa henkilöt uudelleen",
"scene": "Lataa tilanteet uudelleen",
@@ -1716,8 +1746,11 @@
},
"zha": {
"add_device_page": {
"discovered_text": "Laitteet tulevat tänne, kun ne löydetään.",
"discovery_text": "Löydetyt laitteet näkyvät täällä. Noudata laitteen (laitteiden) ohjeita ja aseta laite pariliitostilaan.",
"header": "Zigbee Home Automation - Lisää laitteita",
"no_devices_found": "Mitään laitteita ei löydy. Varmista, että ne ovat paritustilassa ja pidä ne hereillä havaitsemisen ollessa käynnissä.",
"pairing_mode": "Varmista, että laitteesi ovat paritustilassa. Tarkista laitteen ohjeet, kuinka tämä tehdään.",
"search_again": "Etsi uudestaan",
"spinner": "Etsitään ZHA Zigbee laitteita..."
},
@@ -1725,6 +1758,7 @@
"caption": "Lisää laitteita",
"description": "Lisää laitteita Zigbee-verkkoon"
},
"button": "Määritä",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Valitun klusterin määritteet",
@@ -1803,6 +1837,9 @@
"header": "Verkon hallinta",
"introduction": "Koko verkkoon vaikuttavat komennot"
},
"network": {
"caption": "Verkko"
},
"node_management": {
"header": "Laitehallinta",
"help_node_dropdown": "Valitse laite tarkastellaksesi laitekohtaisia vaihtoehtoja.",
@@ -1842,6 +1879,7 @@
"no_zones_created_yet": "Näyttää siltä, että et ole vielä luonut vyöhykkeitä."
},
"zwave": {
"button": "Määritä",
"caption": "Z-Wave",
"common": {
"index": "Indeksi",
@@ -1954,19 +1992,6 @@
"title": "Tapahtumat",
"type": "Tapahtumatyyppi"
},
"mqtt": {
"description_listen": "Kuuntele aihetta",
"description_publish": "Julkaise paketti",
"listening_to": "Kuunnellaan",
"message_received": "Viesti {id} vastaanotettu aiheessa {topic} {time}:",
"payload": "Tietosisältö (malli sallittu)",
"publish": "Julkaise",
"start_listening": "Aloita kuuntelu",
"stop_listening": "Lopeta kuuntelu",
"subscribe_to": "Tilaa aihe",
"title": "MQTT",
"topic": "aihe"
},
"services": {
"alert_parsing_yaml": "Virhe jäsennetettäessä YAML:ää: {data}",
"call_service": "Kutsu palvelua",
+18 -13
View File
@@ -1391,6 +1391,11 @@
"system_health_error": "Le composant System Health n'est pas chargé. Ajouter 'system_health:' à configuration.yaml",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "page d'intégration",
"missing_zha": "Il manque le panneau de configuration de ZHA ? Il a été déplacé vers l'entrée ZHA sur la {integrations_page}.",
"missing_zwave": "Il manque le panneau de configuration Z-Wave ? Il a été déplacé vers l'entrée Z-Wave sur la {integrations_page}."
},
"integrations": {
"add_integration": "Ajouter l'intégration",
"caption": "Intégrations",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Écouter un sujet",
"description_publish": "Publier un paquet",
"listening_to": "Écouter",
"message_received": "Message {id} reçu sur {topic} à {time} :",
"payload": "Payload (modèle autorisé)",
"publish": "Publier",
"start_listening": "Commencer à écouter",
"stop_listening": "Arrêter d'écouter",
"subscribe_to": "Sujet auquel s'abonner",
"title": "MQTT",
"topic": "sujet"
},
"person": {
"add_person": "Ajouter une personne",
"caption": "Personnes",
@@ -1974,19 +1992,6 @@
"title": "Événements",
"type": "Type d'événement"
},
"mqtt": {
"description_listen": "Écouter un sujet",
"description_publish": "Publier un paquet",
"listening_to": "Écouter",
"message_received": "Message {id} reçu sur {topic} à {time} :",
"payload": "Payload (modèle autorisé)",
"publish": "Publier",
"start_listening": "Commencer à écouter",
"stop_listening": "Arrêter d'écouter",
"subscribe_to": "Sujet auquel s'abonner",
"title": "MQTT",
"topic": "sujet"
},
"services": {
"alert_parsing_yaml": "Erreur d'analyse de YAML : {data}",
"call_service": "Appeler le service",
+3 -7
View File
@@ -491,6 +491,9 @@
"none_found": "Keine Integrationen gefunden",
"none_found_detail": "Passen Sie Ihre Suchkriterien an."
},
"mqtt": {
"title": "MQTT"
},
"users": {
"caption": "Benutzer",
"editor": {
@@ -501,13 +504,6 @@
"caption": "Z-Wave"
}
},
"developer-tools": {
"tabs": {
"mqtt": {
"title": "MQTT"
}
}
},
"history": {
"period": "Periode"
},
+114 -17
View File
@@ -471,11 +471,15 @@
},
"common": {
"and": "וגם",
"back": "חזור",
"cancel": "ביטול",
"delete": "מחיקה",
"error_required": "חובה",
"loading": "טוען",
"menu": "תפריט",
"next": "הבא",
"no": "לא",
"overflow_menu": "תפריט גולש",
"previous": "הקודם",
"refresh": "רענן",
"save": "שמור",
@@ -488,6 +492,7 @@
"device-picker": {
"clear": "נקה",
"device": "התקן",
"no_area": "אין אזור",
"show_devices": "הצג התקנים"
},
"entity": {
@@ -530,17 +535,39 @@
"close": "סגור"
},
"helper_settings": {
"generic": {
"icon": "סמל",
"name": "שם"
},
"input_datetime": {
"date": "תאריך",
"datetime": "תאריך ושעה",
"time": "זמן"
},
"input_number": {
"box": "שדה קלט",
"max": "ערך מקסימאלי",
"min": "ערך מינימלי",
"mode": "מצב תצוגה",
"slider": "סליידר",
"step": "גודל צעד",
"unit_of_measurement": "יחידת מידה"
},
"input_select": {
"add": "הוסף",
"add_option": "הוסף אפשרות",
"no_options": "אין עדיין אפשרויות.",
"options": "אפשרויות"
}
},
"input_text": {
"max": "אורך מקסימאלי",
"min": "אורך מינימלי",
"mode": "מצב תצוגה",
"password": "סיסמה",
"pattern": "דפוס Regex לצורך אימות בצד הלקוח",
"text": "טקסט"
},
"required_error_msg": "שדה זה הוא חובה"
},
"more_info_control": {
"dismiss": "סגור",
@@ -629,6 +656,8 @@
"notification_toast": {
"connection_lost": "החיבור אבד. מתחבר מחדש...",
"service_call_failed": "נכשלה הקריאה לשירות {service} .",
"started": "Home Assistant עלה!",
"starting": "Home Assistant בעלייה, ייתכן שלא הכל יהיה זמין עד שהעליה תסתיים",
"triggered": "הופעל {שם}"
},
"panel": {
@@ -653,8 +682,12 @@
},
"description": "סקירה של כל האזורים בביתך",
"editor": {
"area_id": "מזהה אזור",
"create": "צור",
"delete": "מחק",
"name": "שם",
"name_required": "שם הוא חובה",
"unknown_error": "שגיאה לא ידועה",
"update": "עדכון"
},
"picker": {
@@ -687,6 +720,7 @@
"label": "עיכוב"
},
"device_id": {
"action": "פעולה",
"extra_fields": {
"code": "קוד"
},
@@ -728,6 +762,7 @@
"label": "וגם"
},
"device": {
"condition": "תנאי",
"extra_fields": {
"above": "מעל",
"below": "מתחת",
@@ -787,6 +822,8 @@
"introduction": "השתמש/י באוטומציות להפיח חיים בביתך.",
"load_error_not_editable": "רק אוטומציה ב automations.yaml ניתנים לעריכה.",
"load_error_unknown": "שגיאה בטעינת האוטומציה ( {err_no} ).",
"move_down": "הזז למטה",
"move_up": "הזז למעלה",
"save": "שמור",
"triggers": {
"add": "הוספת טריגר",
@@ -805,7 +842,8 @@
"below": "מתחת",
"for": "משך"
},
"label": "התקן"
"label": "התקן",
"trigger": "טריגר"
},
"event": {
"event_data": "נתוני אירוע",
@@ -1096,6 +1134,7 @@
"different_include": "יתכן דרך דומיין, גלובלי או כלול אחר.",
"pick_attribute": "בחר תכונה לדריסה",
"picker": {
"entity": "ישות",
"header": "התאמה אישית",
"introduction": "כוונן תכונות של כל ישות. ההתאמות הנוספות שנוספו / ייכנסו לתוקף באופן מיידי. התאמות אישיות שהוסרו ייכנסו לתוקף כאשר הישות תעודכן."
},
@@ -1127,12 +1166,16 @@
"integration": "אינטגרציה",
"manufacturer": "יצרן",
"model": "מודל",
"no_area": "אין אזור",
"no_devices": "אין התקנים"
},
"delete": "מחיקה",
"description": "ניהול התקנים מחוברים",
"device_info": "פרטי התקן",
"device_not_found": "ההתקן לא נמצא.",
"entities": {
"disabled_entities": "+{count} {count, plural,\n one {disabled entity}\n other {disabled entities}\n}"
},
"no_devices": "אין התקנים",
"unknown_error": "שגיאה לא ידועה",
"unnamed_device": "התקן ללא שם"
@@ -1163,11 +1206,14 @@
},
"header": "הגדר את Home Assistant",
"helpers": {
"caption": "עוזרים",
"description": "רכיבים שיכולים לסייע בבניית אוטומציות.",
"dialog": {
"add_platform": "הוסף {platform}",
"create": "צור"
},
"picker": {
"add_helper": "הוסף עוזר",
"headers": {
"editable": "ניתן לעריכה",
"entity_id": "מזהה ישות",
@@ -1176,14 +1222,18 @@
}
},
"types": {
"input_boolean": "החלף מצב",
"input_datetime": "תאריך ו/או שעה",
"input_number": "מספר",
"input_select": "תיבת בחירה",
"input_text": "טקסט"
}
},
"info": {
"built_using": "נבנה באמצעות",
"caption": "מידע",
"custom_uis": "ממשקי משתמש מותאמים אישית:",
"description": "מידע על ההתקנה של Home Assistant שלך",
"developed_by": "פותח על ידי חבורה של אנשים מדהימים.",
"documentation": "תיעוד",
"frontend": "frontend-ui",
@@ -1199,6 +1249,11 @@
"system_health_error": "רכיב ה System Health אינו טעון. הוסף 'system_health:' ל - configuration.yaml",
"title": "מידע"
},
"integration_panel_move": {
"link_integration_page": "עמוד אינטגרציות",
"missing_zha": "חסר את לוח התצורה של ZHA? הוא הועבר לכניסה של ZHA בדף {integrations_page} .",
"missing_zwave": "חסר את לוח התצורה של Z-Wave? הוא הועבר לכניסה של Z-Wave בכרטיסייה {integrations_page} ."
},
"integrations": {
"add_integration": "הוסף אינטגרציה",
"caption": "אינטגרציות",
@@ -1256,7 +1311,9 @@
},
"introduction": "כאן ניתן להגדיר את הרכיבים ואת ה Home Assistant. לא הכל ניתן להגדיר את ממשק המשתמש עדיין, אבל אנחנו עובדים על זה.",
"logs": {
"caption": "יומנים",
"clear": "נקה",
"description": "צפה ביומני Home Assistant",
"details": "פרטי יומן האירועים ({level})",
"load_full_log": "טען את הלוג המלא של Home Assistant",
"loading_log": "טוען יומן שגיאות ...",
@@ -1333,6 +1390,19 @@
}
}
},
"mqtt": {
"description_listen": "האזנה לנושא",
"description_publish": "פרסם חבילה",
"listening_to": "האזנה ל",
"message_received": "הודעה {id} התקבלה ב- {topic} בשעה {time}:",
"payload": "תוכן (תומך בתבניות)",
"publish": "פרסם",
"start_listening": "התחל להאזין",
"stop_listening": "הפסק להאזין",
"subscribe_to": "נושא להירשם אליו",
"title": "MQTT",
"topic": "נושא"
},
"person": {
"add_person": "הוסף אדם",
"caption": "אנשים",
@@ -1440,6 +1510,11 @@
"core": "טען מחדש את הליבה",
"group": "טען מחדש קבוצות",
"heading": "טען מחדש קונפיגורציה",
"input_boolean": "טען מחדש input boolean",
"input_datetime": "טען מחדש input date time",
"input_number": "טען מחדש input number",
"input_select": "טען מחדש input selects",
"input_text": "טען מחדש input text",
"introduction": "חלקים מסוימים של Home Assistant יכולים להטען מחדש ללא צורך בהפעלה מחדש.\nטעינה מחדש תשנה את הקונפיגורציה הנוכחית ותטען קונפיגורציה חדשה.",
"scene": "טען מחדש סצנות",
"script": "טען מחדש סקריפטים"
@@ -1496,15 +1571,20 @@
"name": "שם",
"system": "מערכת"
}
}
},
"users_privileges_note": "קבוצת המשתמשים הינה עבודה בעיצומה. המשתמש לא יוכל לנהל את המופע באמצעות ממשק המשתמש. אנו עדיין בודקים את כל נקודות הקצה של ממשק ה- API כדי לוודא שהם מגבילים נכון את הגישה למנהלים."
},
"zha": {
"add_device_page": {
"discovered_text": "מכשירים יופיעו כאן לאחר שהתגלו.",
"discovery_text": ". המכשירים שהתגלו יופיעו כאן. עקוב אחר ההוראות עבור ההתקנים שלך והצב את ההתקנים במצב תיאום.",
"header": "אוטומציית Zigbee - הוספת התקנים",
"no_devices_found": "לא נמצאו התקנים כלשהם, וודאו שהם במצב צימוד והקפידו שיהיו דולקים בזמן הגילוי.",
"pairing_mode": "ודא שהמכשירים שלך במצב צימוד. בדוק את הוראות המכשיר שלך כיצד לבצע זאת.",
"search_again": "חפש שוב",
"spinner": "מחפש מכשירי ZHA Zigbee..."
},
"button": "הגדר",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "תכונות של האשכול שנבחר",
@@ -1538,6 +1618,9 @@
"header": "ניהול רשת",
"introduction": "פקודות שמשפיעות על הרשת כולה"
},
"network": {
"caption": "רשת"
},
"node_management": {
"header": "ניהול התקן",
"help_node_dropdown": "בחר התקן להצגת האפשרויות.",
@@ -1547,6 +1630,7 @@
}
},
"zwave": {
"button": "הגדר",
"caption": "Z-Wave",
"common": {
"index": "אינדקס",
@@ -1579,6 +1663,22 @@
"set_wakeup": "בחירת מרווח פעולה",
"true": "True"
},
"node_management": {
"entities": "ישויות היחידה",
"entity_info": "מידע על הישות",
"exclude_entity": "אל תכלול ישות זו ב Home Assistant",
"group": "קְבוּצָה",
"header": "ניהול יחידות Z-Wave",
"introduction": "הפעל פקודות Z-Wave המשפיעות על יחידה בודדת. בחר יחידה כדי לראות רשימה של פקודות זמינות.",
"node_group_associations": "קישורי קבוצת היחידה",
"node_protection": "הגנת יחידה",
"node_to_control": "יחידה לניהול",
"nodes": "יחידות",
"nodes_hint": "בחר יחידה כדי להציג אפשרויות ליחידה",
"pooling_intensity": "עוצמת דגימה",
"protection": "הגנה",
"set_protection": "הגדרת הגנה"
},
"ozw_log": {
"header": "יומן OZW",
"introduction": "צפה ביומן. 0 הוא המינימום (טוען יומן שלם) ו -1000 הוא המקסימום. הטעינה תציג יומן סטטי והסוף יתעדכן אוטומטית במספר האחרון שצוין של שורות היומן."
@@ -1588,6 +1688,8 @@
"add_node_secure": "הוסף רכיב מאובטח",
"cancel_command": "ביטול פקודה",
"heal_network": "ריפוי רשת",
"node_info": "מידע על היחידה",
"refresh_entity": "רענן ישות",
"remove_node": "הסר רכיב",
"save_config": "שמור קונפיגורציה",
"soft_reset": "איפוס רך",
@@ -1627,19 +1729,6 @@
"title": "אירועים",
"type": "סוג אירוע"
},
"mqtt": {
"description_listen": "האזנה לנושא",
"description_publish": "פרסם חבילה",
"listening_to": "האזנה ל",
"message_received": "הודעה {id} התקבלה ב- {topic} בשעה {time}:",
"payload": "תוכן (תומך בתבניות)",
"publish": "פרסם",
"start_listening": "התחל להאזין",
"stop_listening": "הפסק להאזין",
"subscribe_to": "נושא להירשם אליו",
"title": "MQTT",
"topic": "נושא"
},
"services": {
"alert_parsing_yaml": "שגיאה בניתוח YAML: {data}",
"call_service": "קריאה לשירות",
@@ -1711,6 +1800,10 @@
"add_item": "הוסף פריט",
"checked_items": "פריטים מסומנים",
"clear_items": "נקה פריטים מסומנים"
},
"starting": {
"description": "Home Assistant בעלייה. אנא המתן...",
"header": "Home Assistant בעלייה..."
}
},
"changed_toast": {
@@ -1984,7 +2077,8 @@
"attribute_not_found": "השדה {attribute} אינו זמין ב־{entity}",
"entity_non_numeric": "הישות אינה מספרית: {entity}",
"entity_not_found": "הישות אינה זמינה: {entity}",
"entity_unavailable": "כרגע {entity} אינו זמין"
"entity_unavailable": "כרגע {entity} אינו זמין",
"starting": "Home Assistant בעלייה, ייתכן שלא הכל יהיה זמין"
}
},
"mailbox": {
@@ -1997,6 +2091,8 @@
"abort_intro": "הכניסה בוטלה",
"authorizing_client": "אתה עומד לתת גישה ל{clientId} עבור הHome Assistant שלך.",
"form": {
"error": "שגיאה: {error}",
"next": "הבא",
"providers": {
"command_line": {
"abort": {
@@ -2082,6 +2178,7 @@
}
}
},
"start_over": "התחל מחדש",
"unknown_error": "משהו השתבש",
"working": "אנא המתן"
},
+3 -3
View File
@@ -311,6 +311,9 @@
"logs": {
"title": "लॉग्स"
},
"mqtt": {
"title": "MQTT"
},
"script": {
"picker": {
"headers": {
@@ -352,9 +355,6 @@
"events": {
"title": "घटनाओं"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "सेवाएं"
},
+3 -3
View File
@@ -1056,6 +1056,9 @@
"logs": {
"title": "Logovi"
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Osobe",
"description": "Upravljajte osobama koje Home Assistant prati.",
@@ -1298,9 +1301,6 @@
"events": {
"title": "Događaji"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"alert_parsing_yaml": "Greška pri analiziranju YAML-a: {data}",
"column_parameter": "Parametar",
+13 -13
View File
@@ -1548,6 +1548,19 @@
}
}
},
"mqtt": {
"description_listen": "Téma figyelése",
"description_publish": "Csomag közzététele",
"listening_to": "Figyelés:",
"message_received": "Üzenet ({id}) érkezett a(z) {topic} témában {time}-kor:",
"payload": "Payload (sablon megengedett)",
"publish": "Közzététel",
"start_listening": "Figyelés indítása",
"stop_listening": "Figyelés befejezése",
"subscribe_to": "Feliratkozás erre a témára",
"title": "MQTT",
"topic": "téma"
},
"person": {
"add_person": "Személy hozzáadása",
"caption": "Személyek",
@@ -1930,19 +1943,6 @@
"title": "Események",
"type": "Esemény típusa"
},
"mqtt": {
"description_listen": "Téma figyelése",
"description_publish": "Csomag közzététele",
"listening_to": "Figyelés:",
"message_received": "Üzenet ({id}) érkezett a(z) {topic} témában {time}-kor:",
"payload": "Payload (sablon megengedett)",
"publish": "Közzététel",
"start_listening": "Figyelés indítása",
"stop_listening": "Figyelés befejezése",
"subscribe_to": "Feliratkozás erre a témára",
"title": "MQTT",
"topic": "téma"
},
"services": {
"alert_parsing_yaml": "Hiba a YAML elemzésekor: {data}",
"call_service": "Szolgáltatás meghívása",
+3 -3
View File
@@ -840,6 +840,9 @@
"logs": {
"title": "log-եր"
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Անձինք",
"description": "Կառավարել այն անձանց, որոնք հետապնդում են Home Assistant-ին:",
@@ -965,9 +968,6 @@
"events": {
"title": "Իրադարձություններ"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Սերվիսներ"
},
+3 -3
View File
@@ -776,6 +776,9 @@
"none": "Belum ada yang dikonfigurasi"
},
"introduction": "Tempat ini bisa digunakan untuk mengonfigurasi komponen dan Home Assistant. Belum semua dapat dikonfigurasikan melalui UI, kami sedang mengusahakannya.",
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Orang",
"description": "Kelola orang yang Home Assistant lacak",
@@ -821,9 +824,6 @@
"events": {
"title": "Peristiwa"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Layanan"
},
+3 -3
View File
@@ -1182,6 +1182,9 @@
}
}
},
"mqtt": {
"title": "MQTT"
},
"person": {
"add_person": "Bæta við persónu",
"caption": "Persónur",
@@ -1401,9 +1404,6 @@
"events": {
"title": "Viðburðir"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"call_service": "Kalla í þjónustu",
"column_description": "Lýsing",
+52 -47
View File
@@ -1147,7 +1147,7 @@
"email": "E-mail",
"email_error_msg": "E-mail non valida",
"forgot_password": "Hai dimenticato la password?",
"introduction": "Home Assistant Cloud fornisce una connessione remota sicura alla tua istanza quando sei lontano da casa. Consente inoltre di connettersi con i servizi cloud: Amazon Alexa e Google Assistant.",
"introduction": "Home Assistant Cloud fornisce una connessione remota sicura alla tua istanza quando sei lontano da casa. Consente inoltre di connettersi con i servizi solo su cloud: Amazon Alexa e Google Assistant.",
"introduction2": "Questo servizio è gestito dal nostro partner",
"introduction2a": ", una società fondata dai fondatori di Home Assistant e Hass.io.",
"introduction3": "Home Assistant Cloud è un servizio in abbonamento con un mese di prova gratuita. Non sono necessarie informazioni di pagamento.",
@@ -1228,7 +1228,7 @@
"picker": {
"entity": "Entità",
"header": "Personalizzazioni",
"introduction": "Modificare gli attributi per entità. Le personalizzazioni aggiunte / modificate avranno effetto immediato. Le personalizzazioni rimosse avranno effetto quando l'entità viene aggiornata."
"introduction": "Modificare gli attributi per entità. \nLe personalizzazioni aggiunte/modificate avranno effetto immediato. \nLe personalizzazioni rimosse avranno effetto quando l'entità sarà aggiornata."
},
"warning": {
"include_link": "includere customize.yaml",
@@ -1350,12 +1350,12 @@
"caption": "Aiutanti",
"description": "Elementi che possono aiutare a costruire le automazioni.",
"dialog": {
"add_helper": "Aggiungi aiuto",
"add_helper": "Aggiungi aiutante",
"add_platform": "Aggiungi {platform}",
"create": "Crea"
},
"picker": {
"add_helper": "Aggiungi aiuto",
"add_helper": "Aggiungi aiutante",
"headers": {
"editable": "Modificabile",
"entity_id": "ID Entità",
@@ -1382,7 +1382,7 @@
"frontend_version": "Versione Frontend: {version} - {type}",
"home_assistant_logo": "Logo Home Assistant",
"icons_by": "Icone di",
"integrations": "integrazioni",
"integrations": "Integrazioni",
"issues": "Problemi",
"license": "Pubblicato sotto la licenza Apache 2.0",
"path_configuration": "Percorso del file configuration.yaml: {path}",
@@ -1391,6 +1391,11 @@
"system_health_error": "Il componente System Health non è caricato. Aggiungere 'system_health:' a configuration.yaml",
"title": "Informazioni"
},
"integration_panel_move": {
"link_integration_page": "pagina integrazioni",
"missing_zha": "Manca il pannello di configurazione ZHA? È stato spostato alla voce ZHA nella {integrations_page}.",
"missing_zwave": "Manca il pannello di configurazione di Z-Wave? È stato spostato alla voce Z-Wave nella {integrations_page}."
},
"integrations": {
"add_integration": "Aggiungi integrazione",
"caption": "Integrazioni",
@@ -1427,7 +1432,7 @@
"description": "Questo passaggio richiede di visitare un sito Web esterno per essere completato.",
"open_site": "Apri sito Web"
},
"finish": "Finire",
"finish": "Finito",
"loading_first_time": "Si prega di attendere durante l'installazione dell'integrazione",
"not_all_required_fields": "Non tutti i campi obbligatori sono compilati.",
"submit": "Invia"
@@ -1476,27 +1481,27 @@
"title": "Registri"
},
"lovelace": {
"caption": "Cruscotti Lovelace",
"caption": "Plance di Lovelace",
"dashboards": {
"cant_edit_default": "Il cruscotto standard Lovelace non può essere modificato dall'Interfaccia Utente. È possibile nasconderlo impostando un altro cruscotto come predefinito.",
"cant_edit_yaml": "I cruscotti definiti in YAML non possono essere modificati dall'Interfaccia Utente. Modificarli in configuration.yaml.",
"caption": "Cruscotti",
"cant_edit_default": "La plancia standard Lovelace non può essere modificata dall'Interfaccia Utente. È possibile nasconderla impostando un'altra plancia come predefinita.",
"cant_edit_yaml": "Le plance definite in YAML non possono essere modificate dall'Interfaccia Utente. Modificarle in configuration.yaml.",
"caption": "Plance",
"conf_mode": {
"storage": "IU controllata",
"storage": "Controllata dell'Interfaccia Utente",
"yaml": "File YAML"
},
"confirm_delete": "Sei sicuro di voler eliminare questo cruscotto?",
"default_dashboard": "Questo è il cruscotto predefinito",
"confirm_delete": "Sei sicuro di voler eliminare questa plancia?",
"default_dashboard": "Questa è la plancia predefinita",
"detail": {
"create": "Crea",
"delete": "Elimina",
"dismiss": "Chiudi",
"edit_dashboard": "Modifica cruscotto",
"edit_dashboard": "Modifica plancia",
"icon": "Icona",
"new_dashboard": "Aggiungi nuovo cruscotto",
"remove_default": "Rimuovi come predefinito su questo dispositivo",
"new_dashboard": "Aggiungi nuova plancia",
"remove_default": "Rimuovi come predefinita su questo dispositivo",
"require_admin": "Solo per l'amministratore",
"set_default": "Imposta come predefinito su questo dispositivo",
"set_default": "Imposta come predefinita su questo dispositivo",
"show_sidebar": "Mostra nella barra laterale",
"title": "Titolo",
"title_required": "È richiesto il titolo.",
@@ -1505,10 +1510,10 @@
"url_error_msg": "L'URL dovrebbe contenere un - e non può contenere spazi o caratteri speciali, ad eccezione di _ e -"
},
"picker": {
"add_dashboard": "Aggiungi cruscotto",
"add_dashboard": "Aggiungi plancia",
"headers": {
"conf_mode": "Metodo di configurazione",
"default": "Predefinito",
"default": "Predefinita",
"filename": "Nome del file",
"require_admin": "Solo per l'amministratore",
"sidebar": "Mostra nella barra laterale",
@@ -1517,7 +1522,7 @@
"open": "Aprire"
}
},
"description": "Configurare i cruscotti Lovelace",
"description": "Configura le tue plance di Lovelace",
"resources": {
"cant_edit_yaml": "Si utilizza Lovelace in modalità YAML, pertanto non è possibile gestire le risorse tramite l'Interfaccia Utente. Gestirli in configuration.yaml.",
"caption": "Risorse",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Ascoltare un argomento",
"description_publish": "Pubblicare un pacchetto",
"listening_to": "Ascolto di",
"message_received": "Messaggio {id} ricevuto su {topic} alle {time}:",
"payload": "Payload (modello consentito)",
"publish": "Pubblicare",
"start_listening": "Inizia ad ascoltare",
"stop_listening": "Interrompere l'ascolto",
"subscribe_to": "Argomento a cui iscriversi",
"title": "MQTT",
"topic": "argomento"
},
"person": {
"add_person": "Aggiungi persona",
"caption": "Persone",
@@ -1624,7 +1642,7 @@
},
"script": {
"caption": "Script",
"description": "Crea e modifica Script",
"description": "Crea e modifica script",
"editor": {
"alias": "Nome",
"default_name": "Nuovo script",
@@ -1666,10 +1684,10 @@
"input_select": "Ricarica input a discesa",
"input_text": "Ricarica input testuali",
"introduction": "Alcune parti di Home Assistant possono essere ricaricate senza richiedere un riavvio. Premendo su Ricarica si rimuoverà la loro Configurazione YAML attuale e si caricherà la versione aggiornata.",
"person": "Ricarica persone",
"person": "Ricarica le persone",
"scene": "Ricarica le Scene",
"script": "Ricarica gli Script",
"zone": "Ricarica zone"
"zone": "Ricarica le zone"
},
"server_management": {
"confirm_restart": "Sei sicuro di voler riavviare Home Assistant?",
@@ -1682,7 +1700,7 @@
"validation": {
"check_config": "Verifica Configurazione",
"heading": "Convalida della configurazione",
"introduction": "Convalidare la configurazione se di recente sono state apportate alcune modifiche alla configurazione e si desidera assicurarsi che sia tutto valido",
"introduction": "Convalidare la configurazione se di recente sono state apportate alcune modifiche alla configurazione e ci si vuole assicurare che sia tutto valido",
"invalid": "Configurazione non valida",
"valid": "Configurazione valida!"
}
@@ -1974,19 +1992,6 @@
"title": "Eventi",
"type": "Tipo di Evento"
},
"mqtt": {
"description_listen": "Ascoltare un argomento",
"description_publish": "Pubblicare un pacchetto",
"listening_to": "Ascolto di",
"message_received": "Messaggio {id} ricevuto su {topic} alle {time}:",
"payload": "Payload (modello consentito)",
"publish": "Pubblicare",
"start_listening": "Inizia ad ascoltare",
"stop_listening": "Interrompere l'ascolto",
"subscribe_to": "Argomento a cui iscriversi",
"title": "MQTT",
"topic": "argomento"
},
"services": {
"alert_parsing_yaml": "Errore durante l'analisi di YAML: {data}",
"call_service": "Chiama il Servizio",
@@ -2077,7 +2082,7 @@
}
},
"changed_toast": {
"message": "La configurazione dell'Interfaccia Utente di Lovelace per questo cruscotto è stata aggiornata, ricaricare per vedere le modifiche?",
"message": "La configurazione dell'Interfaccia Utente di Lovelace per questa plancia è stata aggiornata, ricaricare per vedere le modifiche?",
"refresh": "Aggiorna"
},
"editor": {
@@ -2312,14 +2317,14 @@
"save_config": {
"cancel": "Rinuncia",
"close": "Chiudi",
"empty_config": "Iniziare con un cruscotto vuoto",
"empty_config": "Iniziare con una plancia vuota",
"header": "Prendi il controllo della tua interfaccia utente di Lovelace",
"para": "Questo cruscotto è attualmente gestito da Home Assistant. E' aggiornato automaticamente quando nuove entità o componenti dell'Interfaccia Utente Lovelace diventano disponibili. Se si assume il controllo, questo cruscotto non verrà più aggiornato automaticamente. È sempre possibile creare un nuovo cruscotto in configurazione con cui esperimentare.",
"para": "Questa plancia è attualmente gestita da Home Assistant. E' aggiornata automaticamente quando nuove entità o componenti dell'Interfaccia Utente Lovelace diventano disponibili. Se si assume il controllo, questa plancia non verrà più aggiornata automaticamente. È sempre possibile creare una nuova plancia in configurazione con cui esperimentare.",
"para_sure": "Sei sicuro di voler prendere il controllo della tua interfaccia utente?",
"save": "Prendere il controllo",
"yaml_config": "Per aiutarti a iniziare qui c'è la configurazione corrente di questo cruscotto:",
"yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella configurazione per questo cruscotto, o il predefinito 'ui-lovelace.yaml'.",
"yaml_mode": "Questo cruscotto sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questo cruscotto dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'."
"yaml_config": "Per aiutarti a iniziare qui c'è la configurazione attuale di questa plancia:",
"yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella tua configurazione per questa plancia, o il predefinito 'ui-lovelace.yaml'.",
"yaml_mode": "Questa plancia sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questa plancia dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'."
},
"suggest_card": {
"add": "Aggiungi all'interfaccia utente di Lovelace",
@@ -2529,7 +2534,7 @@
"location_name_default": "Casa"
},
"integration": {
"finish": "Finire",
"finish": "Finito",
"intro": "Dispositivi e servizi sono rappresentati in Home Assistant come integrazioni. È possibile impostarli ora, o farlo in seguito dalla schermata di configurazione.",
"more_integrations": "Di Più"
},
@@ -2566,9 +2571,9 @@
},
"current_user": "Sei attualmente connesso come {fullName}.",
"dashboard": {
"description": "Scegliere un cruscotto di default per questo dispositivo.",
"dropdown_label": "Cruscotto",
"header": "Cruscotto"
"description": "Scegliere una plancia di default per questo dispositivo.",
"dropdown_label": "Plancia",
"header": "Plancia"
},
"force_narrow": {
"description": "Questo nasconderà la barra laterale per impostazione predefinita, in modo simile all'esperienza mobile",
+12 -12
View File
@@ -981,6 +981,18 @@
}
}
},
"mqtt": {
"description_listen": "トピックをリッスン",
"description_publish": "パケットをパブリッシュ",
"listening_to": "リッスンします",
"payload": "ペイロード (テンプレート可)",
"publish": "パブリッシュ",
"start_listening": "リッスンを開始",
"stop_listening": "リッスンを停止",
"subscribe_to": "サブスクライブするトピック",
"title": "MQTT",
"topic": "トピック"
},
"person": {
"caption": "人",
"description": "Home Assistant を追跡している人の管理。",
@@ -1174,18 +1186,6 @@
"title": "イベント",
"type": "イベントの種類"
},
"mqtt": {
"description_listen": "トピックをリッスン",
"description_publish": "パケットをパブリッシュ",
"listening_to": "リッスンします",
"payload": "ペイロード (テンプレート可)",
"publish": "パブリッシュ",
"start_listening": "リッスンを開始",
"stop_listening": "リッスンを停止",
"subscribe_to": "サブスクライブするトピック",
"title": "MQTT",
"topic": "トピック"
},
"services": {
"alert_parsing_yaml": "YAMLの解析エラー: {error}",
"call_service": "サービスを呼ぶ",
+18 -13
View File
@@ -1391,6 +1391,11 @@
"system_health_error": "시스템 상태보기 구성요소가 로드되지 않았습니다. configuration.yaml 에 'system_health:' 를 추가해주세요.",
"title": "정보"
},
"integration_panel_move": {
"link_integration_page": "통합 구성요소 페이지",
"missing_zha": "ZHA 구성 패널이 보이지 않으신가요? {integrations_page} 의 ZHA 항목으로 이동되었습니다.",
"missing_zwave": "Z-Wave 구성 패널이 보이지 않으신가요? {integrations_page} 의 ZHA 항목으로 이동되었습니다."
},
"integrations": {
"add_integration": "통합 구성요소 추가",
"caption": "통합 구성요소",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "토픽 내용 들어보기",
"description_publish": "패킷 발행",
"listening_to": "토픽 청취 중",
"message_received": "{time} 에 {id} 메시지가 {topic} 에 수신되었습니다.",
"payload": "페이로드 (템플릿 허용)",
"publish": "발행",
"start_listening": "청취 시작",
"stop_listening": "그만 듣기",
"subscribe_to": "청취할 토픽",
"title": "MQTT",
"topic": "토픽"
},
"person": {
"add_person": "구성원 추가하기",
"caption": "구성원",
@@ -1974,19 +1992,6 @@
"title": "이벤트",
"type": "이벤트 유형"
},
"mqtt": {
"description_listen": "토픽 내용 들어보기",
"description_publish": "패킷 발행",
"listening_to": "토픽 청취 중",
"message_received": "{time} 에 {id} 메시지가 {topic} 에 수신되었습니다.",
"payload": "페이로드 (템플릿 허용)",
"publish": "발행",
"start_listening": "청취 시작",
"stop_listening": "그만 듣기",
"subscribe_to": "청취할 토픽",
"title": "MQTT",
"topic": "토픽"
},
"services": {
"alert_parsing_yaml": "YAML 구문 분석 오류: {data}",
"call_service": "서비스 호출",
+31 -13
View File
@@ -480,6 +480,7 @@
"delete": "Läschen",
"error_required": "Erfuerderlech",
"loading": "Lued",
"menu": "Menu",
"next": "Nächst",
"no": "Nee",
"previous": "Virdrun",
@@ -911,6 +912,8 @@
"introduction": "Benotzt Automatismen fir däin Haus zum Liewen ze bréngen",
"load_error_not_editable": "Nëmmen Automatiounen am automations.yaml kënnen editéiert ginn.",
"load_error_unknown": "Feeler beim luede vun der Automatioun ({err_no}).",
"move_down": "No ënne réckelen",
"move_up": "No uewe réckelen",
"save": "Späicheren",
"triggers": {
"add": "Ausléiser dobäisetzen",
@@ -1369,7 +1372,9 @@
},
"info": {
"built_using": "Erstallt mat",
"caption": "Info",
"custom_uis": "Personaliséierte Benotzer Interface:",
"description": "Informatioune zu denger Home Assistant Installation",
"developed_by": "Entwéckelt vun enger ganzer Rei fantastesche Leit.",
"documentation": "Dokumentatioun",
"frontend": "frontend-ui",
@@ -1385,6 +1390,11 @@
"system_health_error": "System Gesondheet Komponent net gelueden. Setz 'system_health:' zur configuration.yaml dobäi",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "Integratiouns Säit",
"missing_zha": "Vermëss du ZHA Konfig. Tableau? Et ass op ZHA Entrée op der {integrations_page} geplënnert.",
"missing_zwave": "Vermëss du Z-Wave Konfig. Tableau? Et ass op Z-Wave Entrée op der {integrations_page} geplënnert."
},
"integrations": {
"add_integration": "Integratioun dobäisetzen",
"caption": "Integratiounen",
@@ -1457,7 +1467,9 @@
},
"introduction": "Hei ass et méiglech är Komponenten vum Home Assistant ze konfiguréieren. Net alles ass méiglech fir iwwert den Interface anzestellen, mee mir schaffen drun.",
"logs": {
"caption": "Logbicher",
"clear": "Läschen",
"description": "Home Assistant Logbicher ukucken",
"details": "Detailler vum Log ({level})",
"load_full_log": "Kompletten Home Assistant Log lueden",
"loading_log": "Feeler Log gëtt gelueden...",
@@ -1544,6 +1556,19 @@
}
}
},
"mqtt": {
"description_listen": "Sujet lauschteren",
"description_publish": "Ee Pak publizéieren",
"listening_to": "Lauschtert op",
"message_received": "Noriicht {id} empfaangen am {topic} um {time}:",
"payload": "Payload (Modell erlaabt)",
"publish": "Publizéieren",
"start_listening": "Fänk un mam lauschteren",
"stop_listening": "Hal op mam lauschteren",
"subscribe_to": "Sujet fir unzemellen",
"title": "MQTT",
"topic": "Sujet"
},
"person": {
"add_person": "Persoun dobäisetzen",
"caption": "Persounen",
@@ -1715,6 +1740,7 @@
},
"zha": {
"add_device_page": {
"discovered_text": "Apparater tauchen hei op soubaal se entdeckt sinn.",
"discovery_text": "Entdeckten Apparater tauchen op dëser Platz op. Suivéiert d'Instruktiounen fir är Apparater an aktivéiert den Kupplung's Mod.",
"header": "Zigbee Home Automation - Apparater dobäisetzen",
"search_again": "Nach emol sichen",
@@ -1724,6 +1750,7 @@
"caption": "Apparater bäisetzen",
"description": "Apparater am Zigbee Netzwierk bäisetzen"
},
"button": "Astellen",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Attributer vum ausgewielten Cluster",
@@ -1802,6 +1829,9 @@
"header": "Verwaltung vum Netzwierk",
"introduction": "Kommandoe mat Impakt op d'gesamt Netzwierk"
},
"network": {
"caption": "Netzwierk"
},
"node_management": {
"header": "Verwaltung vun den Apparaten",
"help_node_dropdown": "Wielt een Apparat aus fir seng spezifesch Optioune ze gesinn.",
@@ -1841,6 +1871,7 @@
"no_zones_created_yet": "Et gesäit sou aus wéi wann nach keng Zone erstallt goufen."
},
"zwave": {
"button": "Astellen",
"caption": "Z-Wave",
"common": {
"index": "Index",
@@ -1953,19 +1984,6 @@
"title": "Evenementer",
"type": "Typ vun Evenement"
},
"mqtt": {
"description_listen": "Sujet lauschteren",
"description_publish": "Ee Pak publizéieren",
"listening_to": "Lauschtert op",
"message_received": "Noriicht {id} empfaangen am {topic} um {time}:",
"payload": "Payload (Modell erlaabt)",
"publish": "Publizéieren",
"start_listening": "Fänk un mam lauschteren",
"stop_listening": "Hal op mam lauschteren",
"subscribe_to": "Sujet fir unzemellen",
"title": "MQTT",
"topic": "Sujet"
},
"services": {
"alert_parsing_yaml": "Feeler beim Parse vum YAML: {data}",
"call_service": "Service opruffen",
+6 -7
View File
@@ -314,6 +314,9 @@
"source": "Šaltinis",
"zone": "Zona"
},
"mqtt": {
"label": "MQTT"
},
"sun": {
"event": "Ivykis"
},
@@ -379,6 +382,9 @@
},
"details": "Integravimo informacija"
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Asmenys",
"detail": {
@@ -422,13 +428,6 @@
"question_trust": "Ar pasitikite išoriniu skydeliu {name} adresu {link}?"
}
},
"developer-tools": {
"tabs": {
"mqtt": {
"title": "MQTT"
}
}
},
"logbook": {
"period": "Laikotarpis"
},
+5 -5
View File
@@ -1082,6 +1082,11 @@
"clear": "Notīrīt",
"refresh": "Atsvaidzināt"
},
"mqtt": {
"publish": "Publicēt",
"title": "MQTT",
"topic": "temats"
},
"person": {
"add_person": "Pievienot personu",
"caption": "Personas",
@@ -1355,11 +1360,6 @@
"events": {
"title": "Notikumi"
},
"mqtt": {
"publish": "Publicēt",
"title": "MQTT",
"topic": "temats"
},
"services": {
"column_description": "Apraksts",
"column_example": "Piemērs",
+19 -14
View File
@@ -956,7 +956,7 @@
"start": ""
},
"mqtt": {
"label": "",
"label": "MQTT",
"payload": "Nyttelast (valgfritt)",
"topic": "Emne"
},
@@ -1391,6 +1391,11 @@
"system_health_error": "System tilstand komponenten er ikke lastet inn. Legg til 'system_health:' i configuration.yaml",
"title": "Informasjon"
},
"integration_panel_move": {
"link_integration_page": "integrasjonsside",
"missing_zha": "Mangler ZHA-konfigurasjonspanelet? Den ble flyttet til ZHA-oppføringen på {integrations_page} .",
"missing_zwave": "Mangler Z-Wave-konfigurasjonspanelet? Den ble flyttet til Z-Wave-oppføringen på {integrations_page} ."
},
"integrations": {
"add_integration": "Legg til integrasjon",
"caption": "Integrasjoner",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Lytt til et emne",
"description_publish": "Publiser en pakke",
"listening_to": "Lytter til",
"message_received": "Meldingen {id} ble mottatt på {topic} klokken {time}:",
"payload": "Nyttelast (mal tillatt)",
"publish": "Publiser",
"start_listening": "Begynn å lytte",
"stop_listening": "Slutt å lytte",
"subscribe_to": "Emne å abonnere på",
"title": "MQTT",
"topic": "emne"
},
"person": {
"add_person": "Legg til person",
"caption": "Personer",
@@ -1974,19 +1992,6 @@
"title": "Hendelser",
"type": "Type hendelse"
},
"mqtt": {
"description_listen": "Lytt til et emne",
"description_publish": "Publiser en pakke",
"listening_to": "Lytter til",
"message_received": "Meldingen {id} ble mottatt på {topic} klokken {time}:",
"payload": "Nyttelast (mal tillatt)",
"publish": "Publiser",
"start_listening": "Begynn å lytte",
"stop_listening": "Slutt å lytte",
"subscribe_to": "Emne å abonnere på",
"title": "MQTT",
"topic": "emne"
},
"services": {
"alert_parsing_yaml": "Feil ved parsing av YAML: {data}",
"call_service": "Tilkall tjeneste",
+14 -14
View File
@@ -956,7 +956,7 @@
"start": "Opstarten"
},
"mqtt": {
"label": "",
"label": "MQTT",
"payload": "Payload (optioneel)",
"topic": "Onderwerp"
},
@@ -1552,6 +1552,19 @@
}
}
},
"mqtt": {
"description_listen": "Luisteren naar onderwerp",
"description_publish": "Publiceer een pakket",
"listening_to": "Luisteren naar",
"message_received": "Bericht {id} ontvangen op {topic} om {time} :",
"payload": "Payload (sjabloon toegestaan)",
"publish": "Publiceer",
"start_listening": "Begin te luisteren",
"stop_listening": "Stop met luisteren",
"subscribe_to": "Gebeurtenis om op te abonneren",
"title": "MQTT",
"topic": "onderwerp"
},
"person": {
"add_person": "Persoon toevoegen",
"caption": "Personen",
@@ -1945,19 +1958,6 @@
"title": "Gebeurtenissen",
"type": "Type gebeurtenis"
},
"mqtt": {
"description_listen": "Luisteren naar onderwerp",
"description_publish": "Publiceer een pakket",
"listening_to": "Luisteren naar",
"message_received": "Bericht {id} ontvangen op {topic} om {time} :",
"payload": "Payload (sjabloon toegestaan)",
"publish": "Publiceer",
"start_listening": "Begin te luisteren",
"stop_listening": "Stop met luisteren",
"subscribe_to": "Gebeurtenis om op te abonneren",
"title": "MQTT",
"topic": "onderwerp"
},
"services": {
"alert_parsing_yaml": "Fout bij het parseren van YAML: {data}",
"call_service": "Aanroepen service",
+3 -3
View File
@@ -1017,6 +1017,9 @@
"logs": {
"title": "Loggar"
},
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "Personar",
"description": "Administrer personane Home Assistant sporer.",
@@ -1238,9 +1241,6 @@
"events": {
"title": "Hendingar"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "Tenester"
},
+19 -14
View File
@@ -1391,6 +1391,11 @@
"system_health_error": "Komponent kondycji systemu nie jest załadowany. Dodaj 'system_health:' do pliku configuration.yaml",
"title": "Informacje"
},
"integration_panel_move": {
"link_integration_page": "stronie integracji",
"missing_zha": "Nie możesz znaleźć konfiguracji ZHA? Została ona przeniesiona do wpisu Z-Wave na {integrations_page}.",
"missing_zwave": "Nie możesz znaleźć konfiguracji Z-Wave? Została ona przeniesiona do wpisu Z-Wave na {integrations_page}."
},
"integrations": {
"add_integration": "Dodaj integrację",
"caption": "Integracje",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Nasłuch tematu",
"description_publish": "Opublikuj pakiet",
"listening_to": "Nasłuchiwanie...",
"message_received": "Wiadomość {id} otrzymana w {topic} o godzinie {time}:",
"payload": "Payload (z możliwością użycia szablonów)",
"publish": "Opublikuj",
"start_listening": "Rozpocznij nasłuch",
"stop_listening": "Zatrzymaj nasłuch",
"subscribe_to": "Temat do zasubskrybowania",
"title": "MQTT",
"topic": "temat"
},
"person": {
"add_person": "Dodaj osobę",
"caption": "Osoby",
@@ -1661,7 +1679,7 @@
"group": "Grupy",
"heading": "Ponowne wczytanie konfiguracji",
"input_boolean": "Pomocnicy typu przełącznik",
"input_datetime": "Wczytaj",
"input_datetime": "Pomocnicy typu data i czas",
"input_number": "Pomocnicy typu numer",
"input_select": "Pomocnicy typu pole wyboru",
"input_text": "Pomocnicy typu tekst",
@@ -1974,19 +1992,6 @@
"title": "Zdarzenia",
"type": "Typ zdarzenia"
},
"mqtt": {
"description_listen": "Nasłuch tematu",
"description_publish": "Opublikuj pakiet",
"listening_to": "Nasłuchiwanie...",
"message_received": "Wiadomość {id} otrzymana w {topic} o godzinie {time}:",
"payload": "Payload (z możliwością użycia szablonów)",
"publish": "Opublikuj",
"start_listening": "Rozpocznij nasłuch",
"stop_listening": "Zatrzymaj nasłuch",
"subscribe_to": "Temat do zasubskrybowania",
"title": "MQTT",
"topic": "temat"
},
"services": {
"alert_parsing_yaml": "Błąd parsowania YAML: {data}",
"call_service": "Wywołaj usługę",
+33 -14
View File
@@ -767,6 +767,7 @@
},
"description": "Visão geral de todas as áreas da sua casa.",
"editor": {
"area_id": "ID da Área",
"create": "Criar",
"default_name": "Nova Zona",
"delete": "Excluir",
@@ -910,6 +911,8 @@
"introduction": "Use automações para trazer vida à sua casa",
"load_error_not_editable": "Somente automações em automations.yaml são editáveis.",
"load_error_unknown": "Erro ao carregar a automação ({err_no}).",
"move_down": "Mover para baixo",
"move_up": "Mover para cima",
"save": "Salvar",
"triggers": {
"add": "Adicionar gatilho",
@@ -951,7 +954,7 @@
"start": "Iniciar"
},
"mqtt": {
"label": "MQTT",
"label": "",
"payload": "Valor (opcional)",
"topic": "Tópico"
},
@@ -1368,6 +1371,7 @@
},
"info": {
"built_using": "Construído usando",
"caption": "Informações",
"custom_uis": "UIs personalizadas:",
"developed_by": "Desenvolvido por um monte de pessoas incríveis.",
"documentation": "Documentação",
@@ -1384,6 +1388,9 @@
"system_health_error": "O componente System Health não foi carregado. Adicione 'system_health:' ao configuration.yaml",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "Página de integrações"
},
"integrations": {
"add_integration": "Adicionar integração",
"caption": "Integrações",
@@ -1456,6 +1463,7 @@
},
"introduction": "Aqui é possível configurar seus componentes e Home Assistant. Nem tudo é possível configurar via UI, mas estamos trabalhando nisso.",
"logs": {
"caption": "Logs",
"clear": "Limpar",
"details": "Detalhes do log ({Level})",
"load_full_log": "Carregar todos os logs do Home Assistant",
@@ -1543,6 +1551,19 @@
}
}
},
"mqtt": {
"description_listen": "Ouvir um tópico",
"description_publish": "Publicar um pacote",
"listening_to": "Ouvindo",
"message_received": "Mensagem {id} recebida em {topic} às {time}:",
"payload": "Valor (template permitido)",
"publish": "Publicar",
"start_listening": "Começar a ouvir",
"stop_listening": "Parar de ouvir",
"subscribe_to": "Evento para se inscrever",
"title": "",
"topic": "tópico"
},
"person": {
"add_person": "Adicionar pessoa",
"caption": "Pessoas",
@@ -1713,8 +1734,10 @@
},
"zha": {
"add_device_page": {
"discovered_text": "Os dispositivos descobertos aparecerão aqui.",
"discovery_text": "Dispositivos descobertos serão exibidos aqui. Siga as instruções para o(s) seu(s) dispositivo(s) e coloque o(s) dispositivo(s) no modo de emparelhamento.",
"header": "Zigbee Home Automation - Adicionar dispositivos",
"pairing_mode": "Certifique-se de que seus dispositivos estão em modo de pareamento. Verifique as instruções do seu dispositivo para saber como fazer isso.",
"search_again": "Pesquisar novamente",
"spinner": "Procurando por dispositivos ZHA Zigbee…"
},
@@ -1722,6 +1745,7 @@
"caption": "Adicionar Dispositivos",
"description": "Adicionar dispositivos à rede Zigbee"
},
"button": "Configurar",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Atributos do cluster selecionado",
@@ -1800,6 +1824,9 @@
"header": "Gerenciamento de Rede",
"introduction": "Comandos que afetam toda a rede"
},
"network": {
"caption": "Rede"
},
"node_management": {
"header": "Gerenciamento de Dispositivos",
"help_node_dropdown": "Selecione um dispositivo para visualizar as opções por dispositivo.",
@@ -1839,6 +1866,7 @@
"no_zones_created_yet": "Parece que você ainda não criou nenhuma zona."
},
"zwave": {
"button": "Configurar",
"caption": "",
"common": {
"index": "Índice",
@@ -1883,6 +1911,7 @@
"ozw_log": {
"header": "OZW Log",
"introduction": "Veja o log. 0 é o mínimo (carrega o log inteiro) e 1000 é o máximo. A carga mostrará um log estático e tail será atualizada automaticamente com o último número especificado de linhas do log.",
"last_log_lines": "Número da última linhas de log",
"load": "Carregar"
},
"services": {
@@ -1890,9 +1919,12 @@
"add_node_secure": "Adicionar Nó Seguro",
"cancel_command": "Cancelar Comando",
"heal_network": "Reparar rede",
"heal_node": "Repara nó",
"node_info": "Informações do Nó",
"print_node": "Imprimir nó",
"refresh_entity": "Atualizar Entidade",
"remove_node": "Remover Nó",
"replace_failed_node": "Substituir Nó com Falha",
"save_config": "Salvar Configuração",
"soft_reset": "Soft Reset",
"start_network": "Iniciar Rede",
@@ -1932,19 +1964,6 @@
"title": "Eventos",
"type": "Tipo de evento"
},
"mqtt": {
"description_listen": "Ouvir um tópico",
"description_publish": "Publicar um pacote",
"listening_to": "Ouvindo",
"message_received": "Mensagem {id} recebida em {topic} às {time}:",
"payload": "Valor (template permitido)",
"publish": "Publicar",
"start_listening": "Começar a ouvir",
"stop_listening": "Parar de ouvir",
"subscribe_to": "Evento para se inscrever",
"title": "",
"topic": "tópico"
},
"services": {
"alert_parsing_yaml": "Erro ao analisar o YAML: {data}",
"call_service": "Iniciar Serviço",
+13 -13
View File
@@ -1542,6 +1542,19 @@
}
}
},
"mqtt": {
"description_listen": "Ouvir um tópico",
"description_publish": "Publicar um pacote",
"listening_to": "A escutar",
"message_received": "Mensagem {id} recebida em {topic} às {time} :",
"payload": "Payload (é permitido template)",
"publish": "Publicar",
"start_listening": "Começar a escutar",
"stop_listening": "Parar de escutar",
"subscribe_to": "Tópico ao qual subscrever",
"title": "MQTT",
"topic": "tópico"
},
"person": {
"add_person": "Adicionar Pessoa",
"caption": "Pessoas",
@@ -1925,19 +1938,6 @@
"title": "Eventos",
"type": "Tipo de Evento"
},
"mqtt": {
"description_listen": "Ouvir um tópico",
"description_publish": "Publicar um pacote",
"listening_to": "A escutar",
"message_received": "Mensagem {id} recebida em {topic} às {time} :",
"payload": "Payload (é permitido template)",
"publish": "Publicar",
"start_listening": "Começar a escutar",
"stop_listening": "Parar de escutar",
"subscribe_to": "Tópico ao qual subscrever",
"title": "MQTT",
"topic": "tópico"
},
"services": {
"alert_parsing_yaml": "Erro na análise de YAML: {data}",
"call_service": "Chamar serviço",
+13 -13
View File
@@ -1331,6 +1331,19 @@
}
}
},
"mqtt": {
"description_listen": "Ascultă un subiect",
"description_publish": "Publică un pachet",
"listening_to": "Ascultand",
"message_received": "Mesajul {id} primit pe {topic} la {time} :",
"payload": "Sarcină utilă (șablon permis)",
"publish": "Publică",
"start_listening": "Începe ascultare",
"stop_listening": "Nu mai asculta",
"subscribe_to": "Topic la care să vă abonați",
"title": "MQTT",
"topic": "subiect"
},
"person": {
"caption": "Persoane",
"description": "Gestionează persoanele pe care Home Assistant le urmărește.",
@@ -1687,19 +1700,6 @@
"title": "Evenimente",
"type": "Tip eveniment"
},
"mqtt": {
"description_listen": "Ascultă un subiect",
"description_publish": "Publică un pachet",
"listening_to": "Ascultand",
"message_received": "Mesajul {id} primit pe {topic} la {time} :",
"payload": "Sarcină utilă (șablon permis)",
"publish": "Publică",
"start_listening": "Începe ascultare",
"stop_listening": "Nu mai asculta",
"subscribe_to": "Topic la care să vă abonați",
"title": "MQTT",
"topic": "subiect"
},
"services": {
"alert_parsing_yaml": "Eroare de parsare YAML: {date}",
"call_service": "Apelare serviciu",
+18 -13
View File
@@ -1391,6 +1391,11 @@
"system_health_error": "Компонент System Health не загружен. Добавьте 'system_health:' в файл configuration.yaml.",
"title": "О системе"
},
"integration_panel_move": {
"link_integration_page": "странице интеграций",
"missing_zha": "Отсутствует панель конфигурации ZHA? Настройки ZHA теперь находятся на {integrations_page} в карточке ZHA.",
"missing_zwave": "Отсутствует панель конфигурации Z-Wave? Настройки Z-Wave теперь находятся на {integrations_page} в карточке Z-Wave."
},
"integrations": {
"add_integration": "Добавить интеграцию",
"caption": "Интеграции",
@@ -1552,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Подписаться на топик",
"description_publish": "Опубликовать данные",
"listening_to": "Подписано на",
"message_received": "Сообщение {id} получено в {time} из {topic}:",
"payload": "Значение (включая шаблоны)",
"publish": "Опубликовать",
"start_listening": "Подписаться",
"stop_listening": "Отписаться",
"subscribe_to": "Топик",
"title": "MQTT",
"topic": "Топик"
},
"person": {
"add_person": "Добавить персону",
"caption": "Люди",
@@ -1974,19 +1992,6 @@
"title": "События",
"type": "Событие"
},
"mqtt": {
"description_listen": "Подписаться на топик",
"description_publish": "Опубликовать данные",
"listening_to": "Подписано на",
"message_received": "Сообщение {id} получено в {time} из {topic}:",
"payload": "Значение (включая шаблоны)",
"publish": "Опубликовать",
"start_listening": "Подписаться",
"stop_listening": "Отписаться",
"subscribe_to": "Топик",
"title": "MQTT",
"topic": "Топик"
},
"services": {
"alert_parsing_yaml": "Ошибка при разборе синтаксиса YAML: {data}",
"call_service": "Вызвать службу",
+13 -13
View File
@@ -1448,6 +1448,19 @@
}
}
},
"mqtt": {
"description_listen": "Počúvať tému",
"description_publish": "Publikovať paket",
"listening_to": "Počúvam",
"message_received": "Správa {id} prijatá v {topic} o {time} :",
"payload": "Obsah (šablóny sú povolené)",
"publish": "Publikovať",
"start_listening": "Začať počúvať",
"stop_listening": "Zastaviť počúvanie",
"subscribe_to": "Téma na odber",
"title": "MQTT",
"topic": "téma"
},
"person": {
"add_person": "Pridať osobu",
"caption": "Osoby",
@@ -1791,19 +1804,6 @@
"title": "Udalosti",
"type": "Typ udalosti"
},
"mqtt": {
"description_listen": "Počúvať tému",
"description_publish": "Publikovať paket",
"listening_to": "Počúvam",
"message_received": "Správa {id} prijatá v {topic} o {time} :",
"payload": "Obsah (šablóny sú povolené)",
"publish": "Publikovať",
"start_listening": "Začať počúvať",
"stop_listening": "Zastaviť počúvanie",
"subscribe_to": "Téma na odber",
"title": "MQTT",
"topic": "téma"
},
"services": {
"alert_parsing_yaml": "Chyba pri analýze YAML: {data}",
"call_service": "Zavolať službu",
+42 -16
View File
@@ -480,8 +480,10 @@
"delete": "Izbriši",
"error_required": "Zahtevano",
"loading": "Nalaganje",
"menu": "Meni",
"next": "Naslednji",
"no": "Ne",
"overflow_menu": "Prelivni meni",
"previous": "Prejšnji",
"refresh": "Osveži",
"save": "Shrani",
@@ -692,10 +694,10 @@
},
"zha_device_info": {
"buttons": {
"add": "Dodajte naprave",
"add": "Dodajte naprave prek te naprave",
"reconfigure": "Ponovno konfigurirajte napravo",
"remove": "Odstranite napravo",
"zigbee_information": "Zigbee Informacije"
"zigbee_information": "Podpis naprave Zigbee"
},
"confirmations": {
"remove": "Ali ste prepričani, da želite odstraniti napravo?"
@@ -715,7 +717,7 @@
"unknown": "Neznano",
"zha_device_card": {
"area_picker_label": "Območje",
"device_name_placeholder": "Ime, ki ga je dodelil uporabnik",
"device_name_placeholder": "Spremenite ime naprave",
"update_name_button": "Posodobi ime"
}
}
@@ -911,6 +913,8 @@
"introduction": "Uporabite avtomatizacije za oživitev vašega doma.",
"load_error_not_editable": "Urejati je mogoče le avtomatizacije v automations.yaml.",
"load_error_unknown": "Napaka pri nalaganju avtomatizacije ({err_no}).",
"move_down": "Premakni navzdol",
"move_up": "Premakni navzgor",
"save": "Shrani",
"triggers": {
"add": "Dodaj sprožilec",
@@ -1369,7 +1373,9 @@
},
"info": {
"built_using": "Zgrajen z uporabo",
"caption": "Info",
"custom_uis": "Uporabniški vmesniki po meri:",
"description": "Informacije o vaši namestitvi programa Home Assistant",
"developed_by": "Razvija ga kup osupljivih ljudi.",
"documentation": "Dokumentacija",
"frontend": "frontend-ui",
@@ -1385,6 +1391,11 @@
"system_health_error": "Komponenta \"system health\" ni naložena. Dodajte \"system_health:\" v svoj configuration.yaml",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "Stran za integracije",
"missing_zha": "Ali manjka konfiguracijska plošča ZHA? Premaknjen je bil v vnos ZHA na {integrations_page} .",
"missing_zwave": "Ali manjka konfiguracijska plošča Z-Wave? Premaknili so ga v vnos Z-Wave na {integrations_page} ."
},
"integrations": {
"add_integration": "Dodaj integracijo",
"caption": "Integracije",
@@ -1457,7 +1468,9 @@
},
"introduction": "Tukaj je mogoče konfigurirati vaše komponente in Home Assistanta. Vsega ni mogoče konfigurirati iz uporabniškega vmesnika (vendar delamo na tem).",
"logs": {
"caption": "Dnevniki",
"clear": "Počisti",
"description": "Oglejte si Home Assistant dnevnike",
"details": "Podrobnosti dnevnika ({level})",
"load_full_log": "Naloži celoten dnevnik Home Assistant-a",
"loading_log": "Nalaganje dnevnika napak ...",
@@ -1544,6 +1557,19 @@
}
}
},
"mqtt": {
"description_listen": "Poslušajte temi",
"description_publish": "Objavi paket",
"listening_to": "Poslušanje",
"message_received": "Sporočilo {id} prejeto v {topic} ob {time}:",
"payload": "Tovor (predloga je dovoljena)",
"publish": "Objavi",
"start_listening": "Začnite poslušati",
"stop_listening": "Nehajte poslušati",
"subscribe_to": "Tema, na katero se lahko naročite",
"title": "MQTT",
"topic": "tema"
},
"person": {
"add_person": "Dodaj osebo",
"caption": "Osebe",
@@ -1652,6 +1678,11 @@
"core": "Ponovno naloži lokacijo in prilagoditve",
"group": "Ponovno naloži skupine",
"heading": "Ponovno nalaganje konfiguracije YAML",
"input_boolean": "Ponovno naloži \"input booleans\"",
"input_datetime": "Ponovno naloži vhodne datumske čase",
"input_number": "Ponovno naloži vhodne številke",
"input_select": "Ponovno naloži izbirne vnose",
"input_text": "Ponovno naloži vhodna besedila",
"introduction": "Nekateri deli programa Home Assistant-a se lahko naložijo brez ponovnega zagona. S ponovnim nalaganjem se trenutna konfiguracija YAML zamenja in naloži nova.",
"person": "Ponovno naloži osebe",
"scene": "Ponovno naloži scene",
@@ -1715,8 +1746,11 @@
},
"zha": {
"add_device_page": {
"discovered_text": "Naprave se bodo prikazale tukaj, ko jih odkrijemo.",
"discovery_text": "Tukaj bodo prikazane odkrite naprave. Sledite navodilom za napravo in jo postavite v način seznanjanja.",
"header": "Zigbee Home Automation - Dodaj naprave",
"no_devices_found": "Najdene ni bilo nobene naprave, preverite, ali so v načinu združevanje ter jih držite budne medtem, ko je v odkrivanje v teku.",
"pairing_mode": "Prepričajte se, da so vaše naprave v načinu združevanja. Preverite navodila svoje naprave, kako to storiti.",
"search_again": "Ponovno iskanje",
"spinner": "Iskanje ZHA Zigbee naprav..."
},
@@ -1724,6 +1758,7 @@
"caption": "Dodajte naprave",
"description": "Dodajte naprave v omrežje Zigbee"
},
"button": "Konfiguriraj",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Atributi izbrane gruče",
@@ -1802,6 +1837,9 @@
"header": "Upravljanje omrežja",
"introduction": "Ukazi, ki vplivajo na celotno omrežje"
},
"network": {
"caption": "Omrežje"
},
"node_management": {
"header": "Upravljanje naprav",
"help_node_dropdown": "Izberite napravo za ogled njenih možnosti.",
@@ -1841,6 +1879,7 @@
"no_zones_created_yet": "Izgleda, da še niste ustvarili nobenih con."
},
"zwave": {
"button": "Konfiguriraj",
"caption": "Z-Wave",
"common": {
"index": "Indeks",
@@ -1953,19 +1992,6 @@
"title": "Dogodki",
"type": "Vrsta dogodka"
},
"mqtt": {
"description_listen": "Poslušajte temi",
"description_publish": "Objavi paket",
"listening_to": "Poslušanje",
"message_received": "Sporočilo {id} prejeto v {topic} ob {time}:",
"payload": "Tovor (predloga je dovoljena)",
"publish": "Objavi",
"start_listening": "Začnite poslušati",
"stop_listening": "Nehajte poslušati",
"subscribe_to": "Tema, na katero se lahko naročite",
"title": "MQTT",
"topic": "tema"
},
"services": {
"alert_parsing_yaml": "Napaka pri razčlenjevanju YAML-a: {data}",
"call_service": "Kliči Storitev",
+6 -7
View File
@@ -75,6 +75,9 @@
"editor": {
"triggers": {
"type": {
"mqtt": {
"label": "MQTT"
},
"numeric_state": {
"above": "Iznad",
"below": "Ispod",
@@ -95,19 +98,15 @@
"header": "Entiteter"
}
},
"mqtt": {
"title": "MQTT"
},
"zwave": {
"caption": "Z-Wave",
"node_config": {
"set_config_parameter": "Подесите параметар Цонфиг"
}
}
},
"developer-tools": {
"tabs": {
"mqtt": {
"title": "MQTT"
}
}
}
}
}
+9 -8
View File
@@ -57,7 +57,12 @@
"automation": {
"editor": {
"triggers": {
"learn_more": "Сазнајте више о окидачима"
"learn_more": "Сазнајте више о окидачима",
"type": {
"mqtt": {
"label": "MQTT"
}
}
}
},
"picker": {
@@ -75,6 +80,9 @@
}
}
},
"mqtt": {
"title": "MQTT"
},
"users": {
"add_user": {
"caption": "Додај корисника",
@@ -94,13 +102,6 @@
}
}
},
"developer-tools": {
"tabs": {
"mqtt": {
"title": "MQTT"
}
}
},
"lovelace": {
"cards": {
"picture-elements": {
+13 -13
View File
@@ -1552,6 +1552,19 @@
}
}
},
"mqtt": {
"description_listen": "Lyssna på ett ämne",
"description_publish": "Publicera ett paket",
"listening_to": "Lyssnar på",
"message_received": "Meddelande {id} mottaget på {topic} vid {time} :",
"payload": "Payload (mall tillåten)",
"publish": "Publicera",
"start_listening": "Börja lyssna",
"stop_listening": "Sluta lyssna",
"subscribe_to": "Ämne att prenumerera på",
"title": "MQTT",
"topic": "ämne"
},
"person": {
"add_person": "Lägg till person",
"caption": "Personer",
@@ -1974,19 +1987,6 @@
"title": "Händelser",
"type": "Händelsetyp"
},
"mqtt": {
"description_listen": "Lyssna på ett ämne",
"description_publish": "Publicera ett paket",
"listening_to": "Lyssnar på",
"message_received": "Meddelande {id} mottaget på {topic} vid {time} :",
"payload": "Payload (mall tillåten)",
"publish": "Publicera",
"start_listening": "Börja lyssna",
"stop_listening": "Sluta lyssna",
"subscribe_to": "Ämne att prenumerera på",
"title": "MQTT",
"topic": "ämne"
},
"services": {
"alert_parsing_yaml": "Fel vid tolkning av YAML: {data}",
"call_service": "Anropa tjänst",
+14 -7
View File
@@ -237,19 +237,26 @@
},
"panel": {
"config": {
"automation": {
"editor": {
"triggers": {
"type": {
"mqtt": {
"label": "MQTT"
}
}
}
}
},
"mqtt": {
"title": "MQTT"
},
"zwave": {
"caption": "Z-Wave",
"node_config": {
"set_config_parameter": "கட்டமைப்பு அளவுருவை அமைக்கவும்"
}
}
},
"developer-tools": {
"tabs": {
"mqtt": {
"title": "MQTT"
}
}
}
}
}
+3 -3
View File
@@ -476,6 +476,9 @@
"caption": "మార్పులు చేర్పులు"
},
"header": "కాన్ఫిగర్ Home Assistant",
"mqtt": {
"title": "MQTT"
},
"script": {
"caption": "స్క్రిప్ట్",
"description": "స్క్రిప్ట్లను సృష్టించండి మరియు సవరించండి"
@@ -499,9 +502,6 @@
"events": {
"title": "సంఘటనలు"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "సేవలు"
},
+3 -3
View File
@@ -836,6 +836,9 @@
"none": "ยังไม่มีการกำหนดค่าใดๆ เลย"
},
"introduction": "ดูสิ! สามารถกำหนดค่าส่วนประกอบต่างๆ ของคุณได้ด้วย รวมถึงส่วนของระบบของ Home Assistant เลยเชียวนะ! ถึงแม้ตอนนี้ส่วนการแสดงผลยังทำไม่ได้ก็ตาม แต่เรากำลังพัฒนามันอยู่ คงจะใช้ได้เร็วๆ นี้ละ",
"mqtt": {
"title": "MQTT"
},
"person": {
"caption": "บุคคล",
"description": "จัดการบุคคลที่ระบบจะทำการติดตาม",
@@ -933,9 +936,6 @@
"events": {
"title": "เหตุการณ์"
},
"mqtt": {
"title": "MQTT"
},
"services": {
"title": "บริการ"
},
+12 -12
View File
@@ -1476,6 +1476,18 @@
}
}
},
"mqtt": {
"description_listen": "Bir konuyu dinle",
"description_publish": "Bir paket yayınla",
"listening_to": "Dinliyorum",
"payload": "Yük (şablona izin verilir)",
"publish": "Yayınla",
"start_listening": "Dinlemeye başla",
"stop_listening": "Dinlemeyi bırak",
"subscribe_to": "Abone olunacak konu",
"title": "MQTT",
"topic": "konu"
},
"person": {
"add_person": "Kişi ekle",
"caption": "Kişiler",
@@ -1812,18 +1824,6 @@
"title": "Olaylar",
"type": "Olay Türü"
},
"mqtt": {
"description_listen": "Bir konuyu dinle",
"description_publish": "Bir paket yayınla",
"listening_to": "Dinliyorum",
"payload": "Yük (şablona izin verilir)",
"publish": "Yayınla",
"start_listening": "Dinlemeye başla",
"stop_listening": "Dinlemeyi bırak",
"subscribe_to": "Abone olunacak konu",
"title": "MQTT",
"topic": "konu"
},
"services": {
"alert_parsing_yaml": "YAML alınamadı: {data}",
"call_service": "Arama Servisi",

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