mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-21 16:26:43 +00:00
commit
e7ac95e314
@ -137,14 +137,14 @@ export class HcMain extends HassElement {
|
||||
}),
|
||||
});
|
||||
} catch (err) {
|
||||
this._error = err;
|
||||
this._error = this._getErrorMessage(err);
|
||||
return;
|
||||
}
|
||||
let connection;
|
||||
try {
|
||||
connection = await createConnection({ auth });
|
||||
} catch (err) {
|
||||
this._error = err;
|
||||
this._error = this._getErrorMessage(err);
|
||||
return;
|
||||
}
|
||||
if (this.hass) {
|
||||
@ -213,6 +213,23 @@ export class HcMain extends HassElement {
|
||||
});
|
||||
}
|
||||
|
||||
private _getErrorMessage(error: number): string {
|
||||
switch (error) {
|
||||
case 1:
|
||||
return "Unable to connect to the Home Assistant websocket API.";
|
||||
case 2:
|
||||
return "The supplied authentication is invalid.";
|
||||
case 3:
|
||||
return "The connection to Home Assistant was lost.";
|
||||
case 4:
|
||||
return "Missing hassUrl. This is required.";
|
||||
case 5:
|
||||
return "Home Assistant needs to be served over https:// to use with Home Assistant Cast.";
|
||||
default:
|
||||
return "Unknown Error";
|
||||
}
|
||||
}
|
||||
|
||||
private _breakFree() {
|
||||
const controls = document.body.querySelector("touch-controls");
|
||||
if (controls) {
|
||||
|
@ -115,10 +115,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
attributes: {
|
||||
friendly_name: "Abode Updates",
|
||||
icon: "hademo:security",
|
||||
templates: {
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
"input_boolean.tv": {
|
||||
@ -127,10 +123,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
attributes: {
|
||||
friendly_name: "TV",
|
||||
icon: "hademo:television",
|
||||
templates: {
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
"input_boolean.homeautomation": {
|
||||
@ -139,10 +131,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
attributes: {
|
||||
friendly_name: "Home Automation",
|
||||
icon: "hass:home-automation",
|
||||
templates: {
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
"input_boolean.tvtime": {
|
||||
@ -151,12 +139,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
attributes: {
|
||||
friendly_name: "TV Time",
|
||||
icon: "hademo:television-guide",
|
||||
templates: {
|
||||
icon:
|
||||
"if (state === 'on') return 'hademo:television-classic'; return 'hademo:television-classic-off';\n",
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
"input_select.livingroomharmony": {
|
||||
@ -560,12 +542,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
state: "off",
|
||||
attributes: {
|
||||
friendly_name: "Driveway Light",
|
||||
templates: {
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
icon:
|
||||
"if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
"switch.wemoporch": {
|
||||
@ -573,12 +549,6 @@ export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||
state: "off",
|
||||
attributes: {
|
||||
friendly_name: "Porch Lights",
|
||||
templates: {
|
||||
icon_color:
|
||||
"if (state === 'on') return 'rgb(251, 210, 41)'; return 'rgb(54, 95, 140)';\n",
|
||||
icon:
|
||||
"if (state === 'on') return 'hademo:lightbulb-on'; return 'hademo:lightbulb';\n",
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
@ -23,7 +23,7 @@
|
||||
"@material/mwc-checkbox": "^0.8.0",
|
||||
"@material/mwc-fab": "^0.8.0",
|
||||
"@material/mwc-ripple": "0.8.0",
|
||||
"@mdi/svg": "4.3.95",
|
||||
"@mdi/svg": "4.4.95",
|
||||
"@polymer/app-layout": "^3.0.2",
|
||||
"@polymer/app-localize-behavior": "^3.0.1",
|
||||
"@polymer/app-route": "^3.0.2",
|
||||
|
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
||||
|
||||
setup(
|
||||
name="home-assistant-frontend",
|
||||
version="20190918.0",
|
||||
version="20190918.1",
|
||||
description="The Home Assistant frontend",
|
||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||
author="The Home Assistant Authors",
|
||||
|
@ -36,6 +36,7 @@ class MoreInfoSettings extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
||||
app-toolbar mwc-button {
|
||||
font-size: 0.8em;
|
||||
margin: 0;
|
||||
--mdc-theme-primary: var(--more-info-header-color);
|
||||
}
|
||||
|
||||
.form {
|
||||
|
@ -35,6 +35,8 @@ import { EntityRegistryEntry } from "../../../data/entity_registry";
|
||||
import { ConfigEntry } from "../../../data/config_entries";
|
||||
import { AreaRegistryEntry } from "../../../data/area_registry";
|
||||
import { navigate } from "../../../common/navigate";
|
||||
import { LocalizeFunc } from "../../../common/translations/localize";
|
||||
import computeStateName from "../../../common/entity/compute_state_name";
|
||||
|
||||
interface DeviceRowData extends DeviceRegistryEntry {
|
||||
device?: DeviceRowData;
|
||||
@ -43,6 +45,10 @@ interface DeviceRowData extends DeviceRegistryEntry {
|
||||
battery_entity?: string;
|
||||
}
|
||||
|
||||
interface DeviceEntityLookup {
|
||||
[deviceId: string]: EntityRegistryEntry[];
|
||||
}
|
||||
|
||||
@customElement("ha-config-devices-dashboard")
|
||||
export class HaConfigDeviceDashboard extends LitElement {
|
||||
@property() public hass!: HomeAssistant;
|
||||
@ -59,37 +65,73 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
entries: ConfigEntry[],
|
||||
entities: EntityRegistryEntry[],
|
||||
areas: AreaRegistryEntry[],
|
||||
domain: string
|
||||
domain: string,
|
||||
localize: LocalizeFunc
|
||||
) => {
|
||||
// Some older installations might have devices pointing at invalid entryIDs
|
||||
// So we guard for that.
|
||||
|
||||
let outputDevices: DeviceRowData[] = devices;
|
||||
|
||||
const deviceLookup: { [deviceId: string]: DeviceRegistryEntry } = {};
|
||||
for (const device of devices) {
|
||||
deviceLookup[device.id] = device;
|
||||
}
|
||||
|
||||
const deviceEntityLookup: DeviceEntityLookup = {};
|
||||
for (const entity of entities) {
|
||||
if (!entity.device_id) {
|
||||
continue;
|
||||
}
|
||||
if (!(entity.device_id in deviceEntityLookup)) {
|
||||
deviceEntityLookup[entity.device_id] = [];
|
||||
}
|
||||
deviceEntityLookup[entity.device_id].push(entity);
|
||||
}
|
||||
|
||||
const entryLookup: { [entryId: string]: ConfigEntry } = {};
|
||||
for (const entry of entries) {
|
||||
entryLookup[entry.entry_id] = entry;
|
||||
}
|
||||
|
||||
const areaLookup: { [areaId: string]: AreaRegistryEntry } = {};
|
||||
for (const area of areas) {
|
||||
areaLookup[area.area_id] = area;
|
||||
}
|
||||
|
||||
if (domain) {
|
||||
outputDevices = outputDevices.filter(
|
||||
(device) =>
|
||||
entries.find((entry) =>
|
||||
device.config_entries.includes(entry.entry_id)
|
||||
)!.domain === domain
|
||||
outputDevices = outputDevices.filter((device) =>
|
||||
device.config_entries.find(
|
||||
(entryId) =>
|
||||
entryId in entryLookup && entryLookup[entryId].domain === domain
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
outputDevices = outputDevices.map((device) => {
|
||||
const output = { ...device };
|
||||
output.name = device.name_by_user || device.name || "No name";
|
||||
|
||||
output.area =
|
||||
!areas || !device || !device.area_id
|
||||
? "No area"
|
||||
: areas.find((area) => area.area_id === device.area_id)!.name;
|
||||
|
||||
output.integration =
|
||||
!entries || !device || !device.config_entries
|
||||
? "No integration"
|
||||
: entries.find((entry) =>
|
||||
device.config_entries.includes(entry.entry_id)
|
||||
)!.domain;
|
||||
|
||||
output.battery_entity = this._batteryEntity(device, entities);
|
||||
|
||||
return output;
|
||||
return {
|
||||
...device,
|
||||
name:
|
||||
device.name_by_user ||
|
||||
device.name ||
|
||||
this._fallbackDeviceName(device.id, deviceEntityLookup) ||
|
||||
"No name",
|
||||
model: device.model || "<unknown>",
|
||||
manufacturer: device.manufacturer || "<unknown>",
|
||||
area: device.area_id ? areaLookup[device.area_id].name : "No area",
|
||||
integration: device.config_entries.length
|
||||
? device.config_entries
|
||||
.filter((entId) => entId in entryLookup)
|
||||
.map(
|
||||
(entId) =>
|
||||
localize(
|
||||
`component.${entryLookup[entId].domain}.config.title`
|
||||
) || entryLookup[entId].domain
|
||||
)
|
||||
.join(", ")
|
||||
: "No integration",
|
||||
battery_entity: this._batteryEntity(device.id, deviceEntityLookup),
|
||||
};
|
||||
});
|
||||
|
||||
return outputDevices;
|
||||
@ -171,7 +213,7 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
></ha-state-icon>
|
||||
`
|
||||
: html`
|
||||
n/a
|
||||
-
|
||||
`;
|
||||
},
|
||||
},
|
||||
@ -190,7 +232,8 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
this.entries,
|
||||
this.entities,
|
||||
this.areas,
|
||||
this.domain
|
||||
this.domain,
|
||||
this.hass.localize
|
||||
).map((device: DeviceRowData) => {
|
||||
// We don't need a lot of this data for mobile view, but kept it for filtering...
|
||||
const data: DataTabelRowData = {
|
||||
@ -214,10 +257,12 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
private _batteryEntity(device, entities): string | undefined {
|
||||
const batteryEntity = entities.find(
|
||||
private _batteryEntity(
|
||||
deviceId: string,
|
||||
deviceEntityLookup: DeviceEntityLookup
|
||||
): string | undefined {
|
||||
const batteryEntity = (deviceEntityLookup[deviceId] || []).find(
|
||||
(entity) =>
|
||||
entity.device_id === device.id &&
|
||||
this.hass.states[entity.entity_id] &&
|
||||
this.hass.states[entity.entity_id].attributes.device_class === "battery"
|
||||
);
|
||||
@ -225,6 +270,20 @@ export class HaConfigDeviceDashboard extends LitElement {
|
||||
return batteryEntity ? batteryEntity.entity_id : undefined;
|
||||
}
|
||||
|
||||
private _fallbackDeviceName(
|
||||
deviceId: string,
|
||||
deviceEntityLookup: DeviceEntityLookup
|
||||
): string | undefined {
|
||||
for (const entity of deviceEntityLookup[deviceId] || []) {
|
||||
const stateObj = this.hass.states[entity.entity_id];
|
||||
if (stateObj) {
|
||||
return computeStateName(stateObj);
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
private _handleRowClicked(ev: CustomEvent) {
|
||||
const deviceId = (ev.detail as RowClickedEvent).id;
|
||||
navigate(this, `/config/devices/device/${deviceId}`);
|
||||
|
@ -34,6 +34,7 @@ class HaConfigDevices extends HassRouterPage {
|
||||
routes: {
|
||||
dashboard: {
|
||||
tag: "ha-config-devices-dashboard",
|
||||
cache: true,
|
||||
},
|
||||
device: {
|
||||
tag: "ha-config-device-page",
|
||||
@ -41,10 +42,10 @@ class HaConfigDevices extends HassRouterPage {
|
||||
},
|
||||
};
|
||||
|
||||
@property() private _configEntries?: ConfigEntry[];
|
||||
@property() private _entityRegistryEntries?: EntityRegistryEntry[];
|
||||
@property() private _deviceRegistryEntries?: DeviceRegistryEntry[];
|
||||
@property() private _areas?: AreaRegistryEntry[];
|
||||
@property() private _configEntries: ConfigEntry[] = [];
|
||||
@property() private _entityRegistryEntries: EntityRegistryEntry[] = [];
|
||||
@property() private _deviceRegistryEntries: DeviceRegistryEntry[] = [];
|
||||
@property() private _areas: AreaRegistryEntry[] = [];
|
||||
|
||||
private _unsubs?: UnsubscribeFunc[];
|
||||
|
||||
|
@ -37,25 +37,24 @@ import { HomeAssistant } from "../../../types";
|
||||
import { ConfigEntry } from "../../../data/config_entries";
|
||||
import { fireEvent } from "../../../common/dom/fire_event";
|
||||
import { EntityRegistryEntry } from "../../../data/entity_registry";
|
||||
import { DataEntryFlowProgress } from "../../../data/data_entry_flow";
|
||||
|
||||
@customElement("ha-config-entries-dashboard")
|
||||
export class HaConfigManagerDashboard extends LitElement {
|
||||
@property() public hass!: HomeAssistant;
|
||||
|
||||
@property() public isWide = false;
|
||||
|
||||
@property() private entries = [];
|
||||
@property() private configEntries!: ConfigEntry[];
|
||||
|
||||
/**
|
||||
* Entity Registry entries.
|
||||
*/
|
||||
@property() private entities: EntityRegistryEntry[] = [];
|
||||
@property() private entityRegistryEntries!: EntityRegistryEntry[];
|
||||
|
||||
/**
|
||||
* Current flows that are in progress and have not been started by a user.
|
||||
* For example, can be discovered devices that require more config.
|
||||
*/
|
||||
@property() private progress = [];
|
||||
@property() private configEntriesInProgress!: DataEntryFlowProgress[];
|
||||
|
||||
public connectedCallback() {
|
||||
super.connectedCallback();
|
||||
@ -67,7 +66,7 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
<hass-subpage
|
||||
header=${this.hass.localize("ui.panel.config.integrations.caption")}
|
||||
>
|
||||
${this.progress.length
|
||||
${this.configEntriesInProgress.length
|
||||
? html`
|
||||
<ha-config-section>
|
||||
<span slot="header"
|
||||
@ -76,7 +75,7 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
)}</span
|
||||
>
|
||||
<ha-card>
|
||||
${this.progress.map(
|
||||
${this.configEntriesInProgress.map(
|
||||
(flow) => html`
|
||||
<div class="config-entry-row">
|
||||
<paper-item-body>
|
||||
@ -102,8 +101,8 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
)}</span
|
||||
>
|
||||
<ha-card>
|
||||
${this.entities.length
|
||||
? this.entries.map(
|
||||
${this.entityRegistryEntries.length
|
||||
? this.configEntries.map(
|
||||
(item: any, idx) => html`
|
||||
<a
|
||||
href="/config/integrations/config_entry/${item.entry_id}"
|
||||
@ -155,7 +154,6 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
title=${this.hass.localize("ui.panel.config.integrations.new")}
|
||||
@click=${this._createFlow}
|
||||
?rtl=${computeRTL(this.hass!)}
|
||||
?isWide=${this.isWide}
|
||||
></ha-fab>
|
||||
</hass-subpage>
|
||||
`;
|
||||
@ -175,11 +173,11 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
}
|
||||
|
||||
private _getEntities(configEntry: ConfigEntry): HassEntity[] {
|
||||
if (!this.entities) {
|
||||
if (!this.entityRegistryEntries) {
|
||||
return [];
|
||||
}
|
||||
const states: HassEntity[] = [];
|
||||
this.entities.forEach((entity) => {
|
||||
this.entityRegistryEntries.forEach((entity) => {
|
||||
if (
|
||||
entity.config_entry_id === configEntry.entry_id &&
|
||||
entity.entity_id in this.hass.states
|
||||
@ -217,21 +215,10 @@ export class HaConfigManagerDashboard extends LitElement {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
ha-fab[is-wide] {
|
||||
bottom: 24px;
|
||||
right: 24px;
|
||||
}
|
||||
|
||||
ha-fab[rtl] {
|
||||
right: auto;
|
||||
left: 16px;
|
||||
}
|
||||
|
||||
ha-fab[rtl][is-wide] {
|
||||
bottom: 24px;
|
||||
right: auto;
|
||||
left: 24px;
|
||||
}
|
||||
`;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import "@polymer/app-route/app-route";
|
||||
import { property, customElement, PropertyValues } from "lit-element";
|
||||
|
||||
import "./ha-config-entries-dashboard";
|
||||
import "./config-entry/ha-config-entry-page";
|
||||
@ -11,7 +12,6 @@ import {
|
||||
HassRouterPage,
|
||||
RouterOptions,
|
||||
} from "../../../layouts/hass-router-page";
|
||||
import { property, customElement, PropertyValues } from "lit-element";
|
||||
import { HomeAssistant } from "../../../types";
|
||||
import { ConfigEntry, getConfigEntries } from "../../../data/config_entries";
|
||||
import {
|
||||
@ -42,7 +42,6 @@ class HaConfigIntegrations extends HassRouterPage {
|
||||
|
||||
protected routerOptions: RouterOptions = {
|
||||
defaultPage: "dashboard",
|
||||
preloadAll: true,
|
||||
routes: {
|
||||
dashboard: {
|
||||
tag: "ha-config-entries-dashboard",
|
||||
@ -53,11 +52,11 @@ class HaConfigIntegrations extends HassRouterPage {
|
||||
},
|
||||
};
|
||||
|
||||
@property() private _configEntries?: ConfigEntry[];
|
||||
@property() private _configEntriesInProgress?: DataEntryFlowProgress[];
|
||||
@property() private _entityRegistryEntries?: EntityRegistryEntry[];
|
||||
@property() private _deviceRegistryEntries?: DeviceRegistryEntry[];
|
||||
@property() private _areas?: AreaRegistryEntry[];
|
||||
@property() private _configEntries: ConfigEntry[] = [];
|
||||
@property() private _configEntriesInProgress: DataEntryFlowProgress[] = [];
|
||||
@property() private _entityRegistryEntries: EntityRegistryEntry[] = [];
|
||||
@property() private _deviceRegistryEntries: DeviceRegistryEntry[] = [];
|
||||
@property() private _areas: AreaRegistryEntry[] = [];
|
||||
|
||||
private _unsubs?: UnsubscribeFunc[];
|
||||
|
||||
@ -98,15 +97,14 @@ class HaConfigIntegrations extends HassRouterPage {
|
||||
protected updatePageEl(pageEl) {
|
||||
pageEl.hass = this.hass;
|
||||
|
||||
pageEl.entityRegistryEntries = this._entityRegistryEntries;
|
||||
pageEl.configEntries = this._configEntries;
|
||||
|
||||
if (this._currentPage === "dashboard") {
|
||||
pageEl.entities = this._entityRegistryEntries;
|
||||
pageEl.entries = this._configEntries;
|
||||
pageEl.progress = this._configEntriesInProgress;
|
||||
pageEl.configEntriesInProgress = this._configEntriesInProgress;
|
||||
return;
|
||||
}
|
||||
|
||||
pageEl.entityRegistryEntries = this._entityRegistryEntries;
|
||||
pageEl.configEntries = this._configEntries;
|
||||
pageEl.configEntryId = this.routeTail.path.substr(1);
|
||||
pageEl.deviceRegistryEntries = this._deviceRegistryEntries;
|
||||
pageEl.areas = this._areas;
|
||||
|
@ -39,7 +39,7 @@ export class HuiUnavailable extends LitElement {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
font-size: 50px;
|
||||
font-size: 24px;
|
||||
color: var(--primary-text-color);
|
||||
transform: translate(-50%, -50%);
|
||||
-ms-transform: translate(-50%, -50%);
|
||||
|
@ -681,7 +681,7 @@
|
||||
},
|
||||
"integrations": {
|
||||
"caption": "Integracions",
|
||||
"description": "Gestiona dispositius i serveis connectats",
|
||||
"description": "Gestiona i configura la integració",
|
||||
"discovered": "Descobertes",
|
||||
"configured": "Configurades",
|
||||
"new": "Configura una nova integració",
|
||||
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Segur que vols aturar Home Assistant?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Dispositius",
|
||||
"description": "Gestiona els dispositius connectats"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -681,7 +681,7 @@
|
||||
},
|
||||
"integrations": {
|
||||
"caption": "Integrations",
|
||||
"description": "Manage connected devices and services",
|
||||
"description": "Manage and setup integrations",
|
||||
"discovered": "Discovered",
|
||||
"configured": "Configured",
|
||||
"new": "Set up a new integration",
|
||||
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Are you sure you want to stop Home Assistant?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Devices",
|
||||
"description": "Manage connected devices"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "¿Seguro que quieres detener Home Assistant?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Dispositivos",
|
||||
"description": "Administrar dispositivos conectados"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -1301,6 +1301,11 @@
|
||||
},
|
||||
"config_entry_system_options": {
|
||||
"title": "אפשרויות מערכת"
|
||||
},
|
||||
"zha_device_info": {
|
||||
"services": {
|
||||
"remove": "הסר מכשיר מרשת ה-ZigBee"
|
||||
}
|
||||
}
|
||||
},
|
||||
"auth_store": {
|
||||
|
@ -681,7 +681,7 @@
|
||||
},
|
||||
"integrations": {
|
||||
"caption": "통합 구성요소",
|
||||
"description": "연결된 기기 및 서비스를 관리합니다",
|
||||
"description": "통합 구성요소를 관리하고 설정합니다",
|
||||
"discovered": "발견된 구성요소",
|
||||
"configured": "설정된 구성요소",
|
||||
"new": "새로운 통합 구성요소 설정",
|
||||
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Home Assistant 를 중지 하시겠습니까?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "기기",
|
||||
"description": "연결된 기기 관리"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Sécher fir Home Assistant ze stoppen?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Apparater",
|
||||
"description": "Verwalt verbonnen Apparater"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -681,7 +681,7 @@
|
||||
},
|
||||
"integrations": {
|
||||
"caption": "Integraties",
|
||||
"description": "Beheer verbonden apparaten en services",
|
||||
"description": "Beheer en installeer integraties",
|
||||
"discovered": "Ontdekt",
|
||||
"configured": "Geconfigureerd",
|
||||
"new": "Stel een nieuwe integratie in",
|
||||
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Weet je zeker dat je Home Assistant wilt afsluiten?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Apparaten",
|
||||
"description": "Beheer verbonden apparaten"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -544,6 +544,9 @@
|
||||
"label": "Zone",
|
||||
"entity": "Entitate cu localizare",
|
||||
"zone": "Zone"
|
||||
},
|
||||
"device": {
|
||||
"label": "Dispozitiv"
|
||||
}
|
||||
},
|
||||
"learn_more": "Aflați mai multe despre condiții"
|
||||
@ -578,6 +581,9 @@
|
||||
"label": "Eveniment declansare",
|
||||
"event": "Eveniment",
|
||||
"service_data": "Date serviciu"
|
||||
},
|
||||
"device_id": {
|
||||
"label": "Dispozitiv"
|
||||
}
|
||||
},
|
||||
"learn_more": "Aflați mai multe despre acțiuni"
|
||||
@ -626,6 +632,8 @@
|
||||
"header": "Valoare nod"
|
||||
},
|
||||
"node_config": {
|
||||
"true": "Adevărat",
|
||||
"false": "Fals",
|
||||
"set_config_parameter": "Setați parametrul de configurare"
|
||||
}
|
||||
},
|
||||
@ -738,7 +746,9 @@
|
||||
"unavailable": "Această entitate nu este disponibilă momentan.",
|
||||
"default_name": "Zonă nouă",
|
||||
"delete": "ȘTERGE",
|
||||
"update": "ACTUALIZAȚI"
|
||||
"update": "ACTUALIZAȚI",
|
||||
"enabled_label": "Activează entitatea",
|
||||
"enabled_description": "Entitățile dezactivate nu vof fi adăugate in Home Assistant"
|
||||
}
|
||||
},
|
||||
"person": {
|
||||
@ -750,6 +760,26 @@
|
||||
"device_tracker_picked": "Urmăriți dispozitivul",
|
||||
"device_tracker_pick": "Alegeți dispozitivul pentru a urmări"
|
||||
}
|
||||
},
|
||||
"server_control": {
|
||||
"caption": "Control server",
|
||||
"description": "Repornește si oprește serverul Home Assistant",
|
||||
"section": {
|
||||
"validation": {
|
||||
"heading": "Validare configurație",
|
||||
"introduction": "Validați configurația dvs. dacă ați făcut recent unele modificări și doriți să vă asigurați că aceasta este validă",
|
||||
"check_config": "Verificați configurația",
|
||||
"valid": "Configurația este validă!",
|
||||
"invalid": "Configurația este invalidă"
|
||||
},
|
||||
"reloading": {
|
||||
"heading": "Reîncărcarea configurației",
|
||||
"core": "Reîncărcați nucleul",
|
||||
"group": "Reîncărcați grupurile",
|
||||
"automation": "Reîncarcă automatizările",
|
||||
"script": "Reîncărcați script-uri"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
@ -1090,7 +1120,7 @@
|
||||
"week": "{count}{count, plural,\n one { săptămână }\n other { săptămâni }\n}",
|
||||
"second": "{count} {count, plural,\none {secunda}\nother {secunde}\n}",
|
||||
"minute": "{count} {count, plural,\n one { minut }\n other { minute }\n}",
|
||||
"hour": "{count}{count, plural,\n one { zi }\n other { zile }\n}"
|
||||
"hour": "{count}{count, plural,\n one { ora }\n other { ore }\n}"
|
||||
},
|
||||
"login-form": {
|
||||
"password": "Parola",
|
||||
@ -1159,7 +1189,8 @@
|
||||
"fan": {
|
||||
"speed": "Viteză",
|
||||
"oscillate": "Oscilare",
|
||||
"direction": "Direcţie"
|
||||
"direction": "Direcţie",
|
||||
"forward": "Înainte"
|
||||
},
|
||||
"light": {
|
||||
"brightness": "Luminozitate",
|
||||
@ -1204,6 +1235,11 @@
|
||||
"target_temperature": "Temperatura țintă",
|
||||
"operation": "Operație",
|
||||
"away_mode": "Plecat"
|
||||
},
|
||||
"timer": {
|
||||
"actions": {
|
||||
"finish": "Termina"
|
||||
}
|
||||
}
|
||||
},
|
||||
"components": {
|
||||
@ -1222,7 +1258,7 @@
|
||||
"duration": {
|
||||
"second": "{count} {count, plural,\none {secunda}\nother {secunde}\n}",
|
||||
"minute": "{count} {count, plural,\n one { minut }\n other { minute }\n}",
|
||||
"hour": "{count}{count, plural,\n one { zi }\n other { zile }\n}",
|
||||
"hour": "{count}{count, plural,\n one { ora }\n other { ore }\n}",
|
||||
"day": "{count}{count, plural,\n one { zi }\n other { zile }\n}",
|
||||
"week": "{count}{count, plural,\n one { săptămână }\n other { săptămâni }\n}"
|
||||
}
|
||||
@ -1257,6 +1293,31 @@
|
||||
"updater": {
|
||||
"title": "Actualizați instrucțiunile"
|
||||
}
|
||||
},
|
||||
"options_flow": {
|
||||
"form": {
|
||||
"header": "Opțiuni"
|
||||
},
|
||||
"success": {
|
||||
"description": "Opțiunile salvate cu succes."
|
||||
}
|
||||
},
|
||||
"config_entry_system_options": {
|
||||
"title": "Setări de sistem",
|
||||
"enable_new_entities_label": "Activează entitățile nou adăugate"
|
||||
},
|
||||
"zha_device_info": {
|
||||
"manuf": "de {producator}",
|
||||
"no_area": "Nici o zonă",
|
||||
"services": {
|
||||
"updateDeviceName": "Setați un nume personalizat pentru acest dispozitiv în registrul de dispozitive.",
|
||||
"remove": "Eliminați un dispozitiv din rețeaua ZigBee."
|
||||
},
|
||||
"zha_device_card": {
|
||||
"device_name_placeholder": "Nume dat de utilizator",
|
||||
"area_picker_label": "Zonă",
|
||||
"update_name_button": "Actualizați numele"
|
||||
}
|
||||
}
|
||||
},
|
||||
"auth_store": {
|
||||
@ -1352,5 +1413,10 @@
|
||||
"system-admin": "Administratori",
|
||||
"system-users": "Utilizatori",
|
||||
"system-read-only": "Utilizatori cu drepturi de citire"
|
||||
},
|
||||
"config_entry": {
|
||||
"disabled_by": {
|
||||
"user": "Utilizator"
|
||||
}
|
||||
}
|
||||
}
|
@ -681,7 +681,7 @@
|
||||
},
|
||||
"integrations": {
|
||||
"caption": "Интеграции",
|
||||
"description": "Управляйте подключенными устройствами и службами",
|
||||
"description": "Добавляйте и настраивайте интеграции",
|
||||
"discovered": "Обнаружено",
|
||||
"configured": "Настроено",
|
||||
"new": "Интеграции",
|
||||
@ -805,6 +805,10 @@
|
||||
"confirm_stop": "Вы уверены, что хотите остановить Home Assistant?"
|
||||
}
|
||||
}
|
||||
},
|
||||
"devices": {
|
||||
"caption": "Устройства",
|
||||
"description": "Управляйте подключенными устройствами"
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
|
@ -348,7 +348,7 @@
|
||||
"description": "Skontrolujte Váš konfiguračný súbor a ovládajte server",
|
||||
"section": {
|
||||
"core": {
|
||||
"header": "Konfigurácia a ovládanie servera",
|
||||
"header": "Všeobecná konfigurácia",
|
||||
"introduction": "Zmena konfigurácie môže byť ťažkým procesom. My vieme. Táto sekcia sa Vám pokúsi zjednodušiť život.",
|
||||
"core_config": {
|
||||
"edit_requires_storage": "Editor je zablokovaný, pretože konfigurácia je uložená v configuration.yaml",
|
||||
@ -540,6 +540,9 @@
|
||||
"label": "Zóna",
|
||||
"entity": "Entita s umiestnením",
|
||||
"zone": "Zóna"
|
||||
},
|
||||
"device": {
|
||||
"label": "Zariadenie"
|
||||
}
|
||||
},
|
||||
"learn_more": "Získajte viac informácií o podmienkach"
|
||||
@ -574,6 +577,9 @@
|
||||
"label": "Odpáliť udalosť",
|
||||
"event": "Udalosť:",
|
||||
"service_data": "Dáta služby"
|
||||
},
|
||||
"device_id": {
|
||||
"label": "Zariadenie"
|
||||
}
|
||||
},
|
||||
"learn_more": "Získajte viac informácií o akciách"
|
||||
@ -1006,6 +1012,10 @@
|
||||
"save": "Uložiť",
|
||||
"unsaved_changes": "Neuložené zmeny",
|
||||
"saved": "Uložené"
|
||||
},
|
||||
"edit_lovelace": {
|
||||
"header": "Názov vášho Lovelace UI",
|
||||
"explanation": "Tento názov sa zobrazuje nad všetkými vašimi zobrazeniami v Lovelace."
|
||||
}
|
||||
},
|
||||
"menu": {
|
||||
@ -1249,6 +1259,12 @@
|
||||
"updater": {
|
||||
"title": "Pokyny pre aktualizáciu"
|
||||
}
|
||||
},
|
||||
"zha_device_info": {
|
||||
"zha_device_card": {
|
||||
"area_picker_label": "Oblasť",
|
||||
"update_name_button": "Aktualizovať názov"
|
||||
}
|
||||
}
|
||||
},
|
||||
"auth_store": {
|
||||
|
@ -699,10 +699,10 @@
|
||||
dependencies:
|
||||
"@material/feature-targeting" "^3.1.0"
|
||||
|
||||
"@mdi/svg@4.3.95":
|
||||
version "4.3.95"
|
||||
resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.3.95.tgz#f2121132baab9e8953ee7ef71834cbe2f03065bb"
|
||||
integrity sha512-RRda3q+270vhiL0Nt7oyeGX03zndEzkGJQJSz8dny1Yjwx2iVRUz51Xop6PTBPaEH4csa3sRkFY3q2PeIa2fKg==
|
||||
"@mdi/svg@4.4.95":
|
||||
version "4.4.95"
|
||||
resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-4.4.95.tgz#0af47ecd777deb75bd2e1514afa52cfbd81ac262"
|
||||
integrity sha512-ttQWCXZE8tAvqzFh4vijuuBJNbF2VsGB61rny5MAytWorqf0LKd3XyCrFxODi3uo/BH3Skb+7iXYav3E/9+sIw==
|
||||
|
||||
"@polymer/app-layout@^3.0.2":
|
||||
version "3.0.2"
|
||||
|
Loading…
x
Reference in New Issue
Block a user