mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-28 11:46:42 +00:00
commit
5032b6e63b
@ -107,6 +107,7 @@
|
|||||||
"@gfx/zopfli": "^1.0.9",
|
"@gfx/zopfli": "^1.0.9",
|
||||||
"@types/chai": "^4.1.7",
|
"@types/chai": "^4.1.7",
|
||||||
"@types/codemirror": "^0.0.71",
|
"@types/codemirror": "^0.0.71",
|
||||||
|
"@types/leaflet": "^1.4.3",
|
||||||
"@types/memoize-one": "^4.1.0",
|
"@types/memoize-one": "^4.1.0",
|
||||||
"@types/mocha": "^5.2.5",
|
"@types/mocha": "^5.2.5",
|
||||||
"babel-eslint": "^10",
|
"babel-eslint": "^10",
|
||||||
|
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup, find_packages
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="home-assistant-frontend",
|
name="home-assistant-frontend",
|
||||||
version="20190220.0",
|
version="20190227.0",
|
||||||
description="The Home Assistant frontend",
|
description="The Home Assistant frontend",
|
||||||
url="https://github.com/home-assistant/home-assistant-polymer",
|
url="https://github.com/home-assistant/home-assistant-polymer",
|
||||||
author="The Home Assistant Authors",
|
author="The Home Assistant Authors",
|
||||||
|
@ -94,7 +94,7 @@ class HaAuthFlow extends localizeLiteMixin(PolymerElement) {
|
|||||||
|
|
||||||
this.addEventListener("keypress", (ev) => {
|
this.addEventListener("keypress", (ev) => {
|
||||||
if (ev.keyCode === 13) {
|
if (ev.keyCode === 13) {
|
||||||
this._handleSubmit();
|
this._handleSubmit(ev);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -205,7 +205,8 @@ class HaAuthFlow extends localizeLiteMixin(PolymerElement) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async _handleSubmit() {
|
async _handleSubmit(ev) {
|
||||||
|
ev.preventDefault();
|
||||||
if (this._step.type !== "form") {
|
if (this._step.type !== "form") {
|
||||||
this._providerChanged(this.authProvider, null);
|
this._providerChanged(this.authProvider, null);
|
||||||
return;
|
return;
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
|
import { Map } from "leaflet";
|
||||||
|
|
||||||
// Sets up a Leaflet map on the provided DOM element
|
// Sets up a Leaflet map on the provided DOM element
|
||||||
export const setupLeafletMap = async (mapElement) => {
|
export type LeafletModuleType = typeof import("leaflet");
|
||||||
|
|
||||||
|
export const setupLeafletMap = async (
|
||||||
|
mapElement
|
||||||
|
): Promise<[Map, LeafletModuleType]> => {
|
||||||
// tslint:disable-next-line
|
// tslint:disable-next-line
|
||||||
const Leaflet = (await import(/* webpackChunkName: "leaflet" */ "leaflet"))
|
const Leaflet = (await import(/* webpackChunkName: "leaflet" */ "leaflet")) as LeafletModuleType;
|
||||||
.default;
|
|
||||||
Leaflet.Icon.Default.imagePath = "/static/images/leaflet";
|
Leaflet.Icon.Default.imagePath = "/static/images/leaflet";
|
||||||
|
|
||||||
const map = Leaflet.map(mapElement);
|
const map = Leaflet.map(mapElement);
|
||||||
|
@ -143,6 +143,7 @@ export class HaStateLabelBadge extends LitElement {
|
|||||||
case "binary_sensor":
|
case "binary_sensor":
|
||||||
case "device_tracker":
|
case "device_tracker":
|
||||||
case "updater":
|
case "updater":
|
||||||
|
case "person":
|
||||||
return stateIcon(state);
|
return stateIcon(state);
|
||||||
case "sun":
|
case "sun":
|
||||||
return state.state === "above_horizon"
|
return state.state === "above_horizon"
|
||||||
@ -158,11 +159,11 @@ export class HaStateLabelBadge extends LitElement {
|
|||||||
private _computeLabel(domain, state, _timerTimeRemaining) {
|
private _computeLabel(domain, state, _timerTimeRemaining) {
|
||||||
if (
|
if (
|
||||||
state.state === "unavailable" ||
|
state.state === "unavailable" ||
|
||||||
["device_tracker", "alarm_control_panel"].includes(domain)
|
["device_tracker", "alarm_control_panel", "person"].includes(domain)
|
||||||
) {
|
) {
|
||||||
// Localize the state with a special state_badge namespace, which has variations of
|
// Localize the state with a special state_badge namespace, which has variations of
|
||||||
// the state translations that are truncated to fit within the badge label. Translations
|
// the state translations that are truncated to fit within the badge label. Translations
|
||||||
// are only added for device_tracker and alarm_control_panel.
|
// are only added for device_tracker, alarm_control_panel and person.
|
||||||
return (
|
return (
|
||||||
this.hass!.localize(`state_badge.${domain}.${state.state}`) ||
|
this.hass!.localize(`state_badge.${domain}.${state.state}`) ||
|
||||||
this.hass!.localize(`state_badge.default.${state.state}`) ||
|
this.hass!.localize(`state_badge.default.${state.state}`) ||
|
||||||
|
@ -18,8 +18,12 @@ class HaCard extends LitElement {
|
|||||||
var(--paper-card-background-color, white)
|
var(--paper-card-background-color, white)
|
||||||
);
|
);
|
||||||
border-radius: var(--ha-card-border-radius, 2px);
|
border-radius: var(--ha-card-border-radius, 2px);
|
||||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
|
box-shadow: var(
|
||||||
0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
|
--ha-card-box-shadow,
|
||||||
|
0 2px 2px 0 rgba(0, 0, 0, 0.14),
|
||||||
|
0 1px 5px 0 rgba(0, 0, 0, 0.12),
|
||||||
|
0 3px 1px -2px rgba(0, 0, 0, 0.2)
|
||||||
|
);
|
||||||
color: var(--primary-text-color);
|
color: var(--primary-text-color);
|
||||||
display: block;
|
display: block;
|
||||||
transition: all 0.3s ease-out;
|
transition: all 0.3s ease-out;
|
||||||
|
@ -36,12 +36,13 @@ const PRIORITY = {
|
|||||||
// badges have priority >= 0
|
// badges have priority >= 0
|
||||||
updater: 0,
|
updater: 0,
|
||||||
sun: 1,
|
sun: 1,
|
||||||
device_tracker: 2,
|
person: 2,
|
||||||
alarm_control_panel: 3,
|
device_tracker: 3,
|
||||||
timer: 4,
|
alarm_control_panel: 4,
|
||||||
sensor: 5,
|
timer: 5,
|
||||||
binary_sensor: 6,
|
sensor: 6,
|
||||||
mailbox: 7,
|
binary_sensor: 7,
|
||||||
|
mailbox: 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
const getPriority = (domain) => (domain in PRIORITY ? PRIORITY[domain] : 100);
|
const getPriority = (domain) => (domain in PRIORITY ? PRIORITY[domain] : 100);
|
||||||
|
@ -140,6 +140,7 @@ class HaColorPicker extends EventsMixin(PolymerElement) {
|
|||||||
hueSegments: {
|
hueSegments: {
|
||||||
type: Number,
|
type: Number,
|
||||||
value: 0,
|
value: 0,
|
||||||
|
observer: "segmentationChange",
|
||||||
},
|
},
|
||||||
|
|
||||||
// the amount segments for the hue
|
// the amount segments for the hue
|
||||||
@ -149,6 +150,7 @@ class HaColorPicker extends EventsMixin(PolymerElement) {
|
|||||||
saturationSegments: {
|
saturationSegments: {
|
||||||
type: Number,
|
type: Number,
|
||||||
value: 0,
|
value: 0,
|
||||||
|
observer: "segmentationChange",
|
||||||
},
|
},
|
||||||
|
|
||||||
// set to true to make the segments purely esthetical
|
// set to true to make the segments purely esthetical
|
||||||
@ -590,5 +592,11 @@ class HaColorPicker extends EventsMixin(PolymerElement) {
|
|||||||
this.tooltip = svgElement.tooltip;
|
this.tooltip = svgElement.tooltip;
|
||||||
svgElement.appendChild(svgElement.tooltip);
|
svgElement.appendChild(svgElement.tooltip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
segmentationChange() {
|
||||||
|
if (this.backgroundLayer) {
|
||||||
|
this.drawColorWheel();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
customElements.define("ha-color-picker", HaColorPicker);
|
customElements.define("ha-color-picker", HaColorPicker);
|
||||||
|
@ -1,50 +0,0 @@
|
|||||||
import "@polymer/paper-icon-button/paper-icon-button";
|
|
||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
|
|
||||||
import EventsMixin from "../mixins/events-mixin";
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @appliesMixin EventsMixin
|
|
||||||
*/
|
|
||||||
class HaMenuButton extends EventsMixin(PolymerElement) {
|
|
||||||
static get template() {
|
|
||||||
return html`
|
|
||||||
<paper-icon-button
|
|
||||||
icon="[[_getIcon(hassio)]]"
|
|
||||||
on-click="toggleMenu"
|
|
||||||
></paper-icon-button>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
narrow: {
|
|
||||||
type: Boolean,
|
|
||||||
value: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
showMenu: {
|
|
||||||
type: Boolean,
|
|
||||||
value: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
hassio: {
|
|
||||||
type: Boolean,
|
|
||||||
value: false,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleMenu(ev) {
|
|
||||||
ev.stopPropagation();
|
|
||||||
this.fire(this.showMenu ? "hass-close-menu" : "hass-open-menu");
|
|
||||||
}
|
|
||||||
|
|
||||||
_getIcon(hassio) {
|
|
||||||
// hass:menu
|
|
||||||
return `${hassio ? "hassio" : "hass"}:menu`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("ha-menu-button", HaMenuButton);
|
|
44
src/components/ha-menu-button.ts
Normal file
44
src/components/ha-menu-button.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import "@polymer/paper-icon-button/paper-icon-button";
|
||||||
|
import {
|
||||||
|
property,
|
||||||
|
TemplateResult,
|
||||||
|
LitElement,
|
||||||
|
html,
|
||||||
|
customElement,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
|
import { fireEvent } from "../common/dom/fire_event";
|
||||||
|
|
||||||
|
@customElement("ha-menu-button")
|
||||||
|
class HaMenuButton extends LitElement {
|
||||||
|
@property({ type: Boolean })
|
||||||
|
public showMenu = false;
|
||||||
|
|
||||||
|
@property({ type: Boolean })
|
||||||
|
public hassio = false;
|
||||||
|
|
||||||
|
protected render(): TemplateResult | void {
|
||||||
|
return html`
|
||||||
|
<paper-icon-button
|
||||||
|
.icon=${this.hassio ? "hassio:menu" : "hass:menu"}
|
||||||
|
@click=${this._toggleMenu}
|
||||||
|
></paper-icon-button>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are not going to use ShadowDOM as we're rendering a single element
|
||||||
|
// without any CSS used.
|
||||||
|
protected createRenderRoot(): Element | ShadowRoot {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _toggleMenu(): void {
|
||||||
|
fireEvent(this, this.showMenu ? "hass-close-menu" : "hass-open-menu");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"ha-menu-button": HaMenuButton;
|
||||||
|
}
|
||||||
|
}
|
63
src/data/config_entries.ts
Normal file
63
src/data/config_entries.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import { HomeAssistant } from "../types";
|
||||||
|
|
||||||
|
export interface FieldSchema {
|
||||||
|
name: string;
|
||||||
|
default?: any;
|
||||||
|
optional: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConfigFlowStepForm {
|
||||||
|
type: "form";
|
||||||
|
flow_id: string;
|
||||||
|
handler: string;
|
||||||
|
step_id: string;
|
||||||
|
data_schema: FieldSchema[];
|
||||||
|
errors: { [key: string]: string };
|
||||||
|
description_placeholders: { [key: string]: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConfigFlowStepCreateEntry {
|
||||||
|
type: "create_entry";
|
||||||
|
version: number;
|
||||||
|
flow_id: string;
|
||||||
|
handler: string;
|
||||||
|
title: string;
|
||||||
|
data: any;
|
||||||
|
description: string;
|
||||||
|
description_placeholders: { [key: string]: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConfigFlowStepAbort {
|
||||||
|
type: "abort";
|
||||||
|
flow_id: string;
|
||||||
|
handler: string;
|
||||||
|
reason: string;
|
||||||
|
description_placeholders: { [key: string]: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ConfigFlowStep =
|
||||||
|
| ConfigFlowStepForm
|
||||||
|
| ConfigFlowStepCreateEntry
|
||||||
|
| ConfigFlowStepAbort;
|
||||||
|
|
||||||
|
export const createConfigFlow = (hass: HomeAssistant, handler: string) =>
|
||||||
|
hass.callApi<ConfigFlowStep>("POST", "config/config_entries/flow", {
|
||||||
|
handler,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const fetchConfigFlow = (hass: HomeAssistant, flowId: string) =>
|
||||||
|
hass.callApi<ConfigFlowStep>("GET", `config/config_entries/flow/${flowId}`);
|
||||||
|
|
||||||
|
export const handleConfigFlowStep = (
|
||||||
|
hass: HomeAssistant,
|
||||||
|
flowId: string,
|
||||||
|
data: { [key: string]: any }
|
||||||
|
) =>
|
||||||
|
hass.callApi<ConfigFlowStep>(
|
||||||
|
"POST",
|
||||||
|
`config/config_entries/flow/${flowId}`,
|
||||||
|
data
|
||||||
|
);
|
||||||
|
|
||||||
|
export const deleteConfigFlow = (hass: HomeAssistant, flowId: string) =>
|
||||||
|
hass.callApi("DELETE", `config/config_entries/flow/${flowId}`);
|
@ -1,7 +1,7 @@
|
|||||||
import { HomeAssistant } from "../types";
|
import { HomeAssistant } from "../types";
|
||||||
|
|
||||||
export const setValue = (hass: HomeAssistant, entity: string, value: string) =>
|
export const setValue = (hass: HomeAssistant, entity: string, value: string) =>
|
||||||
hass.callService("input_text", "set_value", {
|
hass.callService(entity.split(".", 1)[0], "set_value", {
|
||||||
value,
|
value,
|
||||||
entity_id: entity,
|
entity_id: entity,
|
||||||
});
|
});
|
||||||
|
378
src/dialogs/config-flow/dialog-config-flow.ts
Normal file
378
src/dialogs/config-flow/dialog-config-flow.ts
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
import {
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
html,
|
||||||
|
CSSResultArray,
|
||||||
|
css,
|
||||||
|
customElement,
|
||||||
|
property,
|
||||||
|
PropertyValues,
|
||||||
|
} from "lit-element";
|
||||||
|
import "@material/mwc-button";
|
||||||
|
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
|
||||||
|
import "@polymer/paper-tooltip/paper-tooltip";
|
||||||
|
import "@polymer/paper-spinner/paper-spinner";
|
||||||
|
import "@polymer/paper-dialog/paper-dialog";
|
||||||
|
// Not duplicate, is for typing
|
||||||
|
// tslint:disable-next-line
|
||||||
|
import { PaperDialogElement } from "@polymer/paper-dialog/paper-dialog";
|
||||||
|
|
||||||
|
import "../../components/ha-form";
|
||||||
|
import "../../components/ha-markdown";
|
||||||
|
import "../../resources/ha-style";
|
||||||
|
import { haStyleDialog } from "../../resources/styles";
|
||||||
|
import {
|
||||||
|
fetchConfigFlow,
|
||||||
|
createConfigFlow,
|
||||||
|
ConfigFlowStep,
|
||||||
|
handleConfigFlowStep,
|
||||||
|
deleteConfigFlow,
|
||||||
|
FieldSchema,
|
||||||
|
ConfigFlowStepForm,
|
||||||
|
} from "../../data/config_entries";
|
||||||
|
import { PolymerChangedEvent, applyPolymerEvent } from "../../polymer-types";
|
||||||
|
import { HaConfigFlowParams } from "./show-dialog-config-flow";
|
||||||
|
|
||||||
|
let instance = 0;
|
||||||
|
|
||||||
|
@customElement("dialog-config-flow")
|
||||||
|
class ConfigFlowDialog extends LitElement {
|
||||||
|
@property()
|
||||||
|
private _params?: HaConfigFlowParams;
|
||||||
|
|
||||||
|
@property()
|
||||||
|
private _loading = true;
|
||||||
|
|
||||||
|
private _instance = instance;
|
||||||
|
|
||||||
|
@property()
|
||||||
|
private _step?: ConfigFlowStep;
|
||||||
|
|
||||||
|
@property()
|
||||||
|
private _stepData?: { [key: string]: any };
|
||||||
|
|
||||||
|
@property()
|
||||||
|
private _errorMsg?: string;
|
||||||
|
|
||||||
|
public async showDialog(params: HaConfigFlowParams): Promise<void> {
|
||||||
|
this._params = params;
|
||||||
|
this._loading = true;
|
||||||
|
this._instance = instance++;
|
||||||
|
this._step = undefined;
|
||||||
|
this._stepData = {};
|
||||||
|
this._errorMsg = undefined;
|
||||||
|
|
||||||
|
const fetchStep = params.continueFlowId
|
||||||
|
? fetchConfigFlow(params.hass, params.continueFlowId)
|
||||||
|
: params.newFlowForHandler
|
||||||
|
? createConfigFlow(params.hass, params.newFlowForHandler)
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
if (!fetchStep) {
|
||||||
|
throw new Error(`Pass in either continueFlowId or newFlorForHandler`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const curInstance = this._instance;
|
||||||
|
|
||||||
|
await this.updateComplete;
|
||||||
|
const step = await fetchStep;
|
||||||
|
|
||||||
|
// Happens if second showDialog called
|
||||||
|
if (curInstance !== this._instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._processStep(step);
|
||||||
|
this._loading = false;
|
||||||
|
// When the flow changes, center the dialog.
|
||||||
|
// Don't do it on each step or else the dialog keeps bouncing.
|
||||||
|
setTimeout(() => this._dialog.center(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected render(): TemplateResult | void {
|
||||||
|
if (!this._params) {
|
||||||
|
return html``;
|
||||||
|
}
|
||||||
|
const localize = this._params.hass.localize;
|
||||||
|
|
||||||
|
const step = this._step;
|
||||||
|
let headerContent: string | undefined;
|
||||||
|
let bodyContent: TemplateResult | undefined;
|
||||||
|
let buttonContent: TemplateResult | undefined;
|
||||||
|
let descriptionKey: string | undefined;
|
||||||
|
|
||||||
|
if (!step) {
|
||||||
|
bodyContent = html`
|
||||||
|
<div class="init-spinner">
|
||||||
|
<paper-spinner active></paper-spinner>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
} else if (step.type === "abort") {
|
||||||
|
descriptionKey = `component.${step.handler}.config.abort.${step.reason}`;
|
||||||
|
headerContent = "Aborted";
|
||||||
|
bodyContent = html``;
|
||||||
|
buttonContent = html`
|
||||||
|
<mwc-button @click="${this._flowDone}">Close</mwc-button>
|
||||||
|
`;
|
||||||
|
} else if (step.type === "create_entry") {
|
||||||
|
descriptionKey = `component.${
|
||||||
|
step.handler
|
||||||
|
}.config.create_entry.${step.description || "default"}`;
|
||||||
|
headerContent = "Success!";
|
||||||
|
bodyContent = html`
|
||||||
|
<p>Created config for ${step.title}</p>
|
||||||
|
`;
|
||||||
|
buttonContent = html`
|
||||||
|
<mwc-button @click="${this._flowDone}">Close</mwc-button>
|
||||||
|
`;
|
||||||
|
} else {
|
||||||
|
// form
|
||||||
|
descriptionKey = `component.${step.handler}.config.step.${
|
||||||
|
step.step_id
|
||||||
|
}.description`;
|
||||||
|
headerContent = localize(
|
||||||
|
`component.${step.handler}.config.step.${step.step_id}.title`
|
||||||
|
);
|
||||||
|
bodyContent = html`
|
||||||
|
<ha-form
|
||||||
|
.data=${this._stepData}
|
||||||
|
@data-changed=${this._stepDataChanged}
|
||||||
|
.schema=${step.data_schema}
|
||||||
|
.error=${step.errors}
|
||||||
|
.computeLabel=${this._labelCallback}
|
||||||
|
.computeError=${this._errorCallback}
|
||||||
|
></ha-form>
|
||||||
|
`;
|
||||||
|
|
||||||
|
const allRequiredInfoFilledIn =
|
||||||
|
this._stepData &&
|
||||||
|
step.data_schema.every(
|
||||||
|
(field) =>
|
||||||
|
field.optional ||
|
||||||
|
!["", undefined].includes(this._stepData![field.name])
|
||||||
|
);
|
||||||
|
|
||||||
|
buttonContent = this._loading
|
||||||
|
? html`
|
||||||
|
<div class="submit-spinner">
|
||||||
|
<paper-spinner active></paper-spinner>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: html`
|
||||||
|
<div>
|
||||||
|
<mwc-button
|
||||||
|
@click=${this._submitStep}
|
||||||
|
.disabled=${!allRequiredInfoFilledIn}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</mwc-button>
|
||||||
|
|
||||||
|
${!allRequiredInfoFilledIn
|
||||||
|
? html`
|
||||||
|
<paper-tooltip position="left">
|
||||||
|
Not all required fields are filled in.
|
||||||
|
</paper-tooltip>
|
||||||
|
`
|
||||||
|
: html``}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let description: string | undefined;
|
||||||
|
|
||||||
|
if (step && descriptionKey) {
|
||||||
|
const args: [string, ...string[]] = [descriptionKey];
|
||||||
|
const placeholders = step.description_placeholders || {};
|
||||||
|
Object.keys(placeholders).forEach((key) => {
|
||||||
|
args.push(key);
|
||||||
|
args.push(placeholders[key]);
|
||||||
|
});
|
||||||
|
description = localize(...args);
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<paper-dialog
|
||||||
|
with-backdrop
|
||||||
|
.opened=${true}
|
||||||
|
@opened-changed=${this._openedChanged}
|
||||||
|
>
|
||||||
|
<h2>
|
||||||
|
${headerContent}
|
||||||
|
</h2>
|
||||||
|
<paper-dialog-scrollable>
|
||||||
|
${this._errorMsg
|
||||||
|
? html`
|
||||||
|
<div class="error">${this._errorMsg}</div>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
${description
|
||||||
|
? html`
|
||||||
|
<ha-markdown .content=${description} allow-svg></ha-markdown>
|
||||||
|
`
|
||||||
|
: ""}
|
||||||
|
${bodyContent}
|
||||||
|
</paper-dialog-scrollable>
|
||||||
|
<div class="buttons">
|
||||||
|
${buttonContent}
|
||||||
|
</div>
|
||||||
|
</paper-dialog>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected firstUpdated(changedProps: PropertyValues) {
|
||||||
|
super.firstUpdated(changedProps);
|
||||||
|
this.addEventListener("keypress", (ev) => {
|
||||||
|
if (ev.keyCode === 13) {
|
||||||
|
this._submitStep();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private get _dialog(): PaperDialogElement {
|
||||||
|
return this.shadowRoot!.querySelector("paper-dialog")!;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _submitStep(): Promise<void> {
|
||||||
|
this._loading = true;
|
||||||
|
this._errorMsg = undefined;
|
||||||
|
|
||||||
|
const curInstance = this._instance;
|
||||||
|
const stepData = this._stepData || {};
|
||||||
|
|
||||||
|
const toSendData = {};
|
||||||
|
Object.keys(stepData).forEach((key) => {
|
||||||
|
const value = stepData[key];
|
||||||
|
const isEmpty = [undefined, ""].includes(value);
|
||||||
|
|
||||||
|
if (!isEmpty) {
|
||||||
|
toSendData[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
try {
|
||||||
|
const step = await handleConfigFlowStep(
|
||||||
|
this._params!.hass,
|
||||||
|
this._step!.flow_id,
|
||||||
|
toSendData
|
||||||
|
);
|
||||||
|
|
||||||
|
if (curInstance !== this._instance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._processStep(step);
|
||||||
|
} catch (err) {
|
||||||
|
this._errorMsg =
|
||||||
|
(err && err.body && err.body.message) || "Unknown error occurred";
|
||||||
|
} finally {
|
||||||
|
this._loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _processStep(step: ConfigFlowStep): void {
|
||||||
|
this._step = step;
|
||||||
|
|
||||||
|
// We got a new form if there are no errors.
|
||||||
|
if (step.type === "form") {
|
||||||
|
if (!step.errors) {
|
||||||
|
step.errors = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(step.errors).length === 0) {
|
||||||
|
const data = {};
|
||||||
|
step.data_schema.forEach((field) => {
|
||||||
|
if ("default" in field) {
|
||||||
|
data[field.name] = field.default;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this._stepData = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _flowDone(): void {
|
||||||
|
if (!this._params) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const flowFinished = Boolean(
|
||||||
|
this._step && ["success", "abort"].includes(this._step.type)
|
||||||
|
);
|
||||||
|
|
||||||
|
// If we created this flow, delete it now.
|
||||||
|
if (this._step && !flowFinished && this._params.newFlowForHandler) {
|
||||||
|
deleteConfigFlow(this._params.hass, this._step.flow_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._params.dialogClosedCallback({
|
||||||
|
flowFinished,
|
||||||
|
});
|
||||||
|
|
||||||
|
this._errorMsg = undefined;
|
||||||
|
this._step = undefined;
|
||||||
|
this._stepData = {};
|
||||||
|
this._params = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _openedChanged(ev: PolymerChangedEvent<boolean>): void {
|
||||||
|
// Closed dialog by clicking on the overlay
|
||||||
|
if (this._step && !ev.detail.value) {
|
||||||
|
this._flowDone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _stepDataChanged(ev: PolymerChangedEvent<any>): void {
|
||||||
|
this._stepData = applyPolymerEvent(ev, this._stepData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private _labelCallback = (schema: FieldSchema): string => {
|
||||||
|
const step = this._step as ConfigFlowStepForm;
|
||||||
|
|
||||||
|
return this._params!.hass.localize(
|
||||||
|
`component.${step.handler}.config.step.${step.step_id}.data.${
|
||||||
|
schema.name
|
||||||
|
}`
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
private _errorCallback = (error: string) =>
|
||||||
|
this._params!.hass.localize(
|
||||||
|
`component.${this._step!.handler}.config.error.${error}`
|
||||||
|
);
|
||||||
|
|
||||||
|
static get styles(): CSSResultArray {
|
||||||
|
return [
|
||||||
|
haStyleDialog,
|
||||||
|
css`
|
||||||
|
.error {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
paper-dialog {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
ha-markdown {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
ha-markdown a {
|
||||||
|
color: var(--primary-color);
|
||||||
|
}
|
||||||
|
ha-markdown img:first-child:last-child {
|
||||||
|
display: block;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.init-spinner {
|
||||||
|
padding: 10px 100px 34px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.submit-spinner {
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"dialog-config-flow": ConfigFlowDialog;
|
||||||
|
}
|
||||||
|
}
|
23
src/dialogs/config-flow/show-dialog-config-flow.ts
Normal file
23
src/dialogs/config-flow/show-dialog-config-flow.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { HomeAssistant } from "../../types";
|
||||||
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
|
|
||||||
|
export interface HaConfigFlowParams {
|
||||||
|
hass: HomeAssistant;
|
||||||
|
continueFlowId?: string;
|
||||||
|
newFlowForHandler?: string;
|
||||||
|
dialogClosedCallback: (params: { flowFinished: boolean }) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const loadConfigFlowDialog = () =>
|
||||||
|
import(/* webpackChunkName: "dialog-config-flow" */ "./dialog-config-flow");
|
||||||
|
|
||||||
|
export const showConfigFlowDialog = (
|
||||||
|
element: HTMLElement,
|
||||||
|
dialogParams: HaConfigFlowParams
|
||||||
|
): void => {
|
||||||
|
fireEvent(element, "show-dialog", {
|
||||||
|
dialogTag: "dialog-config-flow",
|
||||||
|
dialogImport: loadConfigFlowDialog,
|
||||||
|
dialogParams,
|
||||||
|
});
|
||||||
|
};
|
@ -48,6 +48,11 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
--paper-slider-knob-start-border-color: var(--primary-color);
|
--paper-slider-knob-start-border-color: var(--primary-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.segmentationContainer {
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
ha-color-picker {
|
ha-color-picker {
|
||||||
display: block;
|
display: block;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -57,6 +62,29 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
transition: max-height 0.5s ease-in;
|
transition: max-height 0.5s ease-in;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.segmentationButton {
|
||||||
|
position: absolute;
|
||||||
|
top: 11%;
|
||||||
|
transform: translate(0%, 0%);
|
||||||
|
padding: 0px;
|
||||||
|
max-height: 0px;
|
||||||
|
width: 23px;
|
||||||
|
height: 23px;
|
||||||
|
opacity: var(--dark-secondary-opacity);
|
||||||
|
overflow: hidden;
|
||||||
|
transition: max-height 0.5s ease-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
.has-color.is-on .segmentationContainer .segmentationButton {
|
||||||
|
position: absolute;
|
||||||
|
top: 11%;
|
||||||
|
transform: translate(0%, 0%);
|
||||||
|
width: 23px;
|
||||||
|
height: 23px;
|
||||||
|
padding: 0px;
|
||||||
|
opacity: var(--dark-secondary-opacity);
|
||||||
|
}
|
||||||
|
|
||||||
.has-effect_list.is-on .effect_list,
|
.has-effect_list.is-on .effect_list,
|
||||||
.has-brightness .brightness,
|
.has-brightness .brightness,
|
||||||
.has-color_temp.is-on .color_temp,
|
.has-color_temp.is-on .color_temp,
|
||||||
@ -75,6 +103,11 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
padding-top: 16px;
|
padding-top: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.has-color.is-on .segmentationButton {
|
||||||
|
max-height: 100px;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
.has-color.is-on ha-color-picker {
|
.has-color.is-on ha-color-picker {
|
||||||
max-height: 500px;
|
max-height: 500px;
|
||||||
overflow: visible;
|
overflow: visible;
|
||||||
@ -126,16 +159,22 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
on-change="wvSliderChanged"
|
on-change="wvSliderChanged"
|
||||||
></ha-labeled-slider>
|
></ha-labeled-slider>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="segmentationContainer">
|
||||||
<ha-color-picker
|
<ha-color-picker
|
||||||
class="control color"
|
class="control color"
|
||||||
on-colorselected="colorPicked"
|
on-colorselected="colorPicked"
|
||||||
desired-hs-color="{{colorPickerColor}}"
|
desired-hs-color="{{colorPickerColor}}"
|
||||||
throttle="500"
|
throttle="500"
|
||||||
hue-segments="24"
|
hue-segments="{{hueSegments}}"
|
||||||
saturation-segments="8"
|
saturation-segments="{{saturationSegments}}"
|
||||||
>
|
>
|
||||||
</ha-color-picker>
|
</ha-color-picker>
|
||||||
|
<paper-icon-button
|
||||||
|
icon="mdi:palette"
|
||||||
|
on-click="segmentClick"
|
||||||
|
class="control segmentationButton"
|
||||||
|
></paper-icon-button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="control effect_list">
|
<div class="control effect_list">
|
||||||
<paper-dropdown-menu
|
<paper-dropdown-menu
|
||||||
@ -194,6 +233,16 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
value: 0,
|
value: 0,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
hueSegments: {
|
||||||
|
type: Number,
|
||||||
|
value: 24,
|
||||||
|
},
|
||||||
|
|
||||||
|
saturationSegments: {
|
||||||
|
type: Number,
|
||||||
|
value: 8,
|
||||||
|
},
|
||||||
|
|
||||||
colorPickerColor: {
|
colorPickerColor: {
|
||||||
type: Object,
|
type: Object,
|
||||||
},
|
},
|
||||||
@ -291,6 +340,14 @@ class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
segmentClick() {
|
||||||
|
if (this.hueSegments === 24 && this.saturationSegments === 8) {
|
||||||
|
this.setProperties({ hueSegments: 0, saturationSegments: 0 });
|
||||||
|
} else {
|
||||||
|
this.setProperties({ hueSegments: 24, saturationSegments: 8 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
serviceChangeColor(hass, entityId, color) {
|
serviceChangeColor(hass, entityId, color) {
|
||||||
hass.callService("light", "turn_on", {
|
hass.callService("light", "turn_on", {
|
||||||
entity_id: entityId,
|
entity_id: entityId,
|
||||||
|
@ -15,7 +15,6 @@ import { getState } from "../../util/ha-pref-storage";
|
|||||||
import { getActiveTranslation } from "../../util/hass-translation";
|
import { getActiveTranslation } from "../../util/hass-translation";
|
||||||
import { fetchWithAuth } from "../../util/fetch-with-auth";
|
import { fetchWithAuth } from "../../util/fetch-with-auth";
|
||||||
import hassCallApi from "../../util/hass-call-api";
|
import hassCallApi from "../../util/hass-call-api";
|
||||||
import computeStateName from "../../common/entity/compute_state_name";
|
|
||||||
import { subscribePanels } from "../../data/ws-panels";
|
import { subscribePanels } from "../../data/ws-panels";
|
||||||
|
|
||||||
export default (superClass) =>
|
export default (superClass) =>
|
||||||
@ -65,44 +64,6 @@ export default (superClass) =>
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
await callService(conn, domain, service, serviceData);
|
await callService(conn, domain, service, serviceData);
|
||||||
|
|
||||||
const entityIds = Array.isArray(serviceData.entity_id)
|
|
||||||
? serviceData.entity_id
|
|
||||||
: [serviceData.entity_id];
|
|
||||||
|
|
||||||
const names = [];
|
|
||||||
for (const entityId of entityIds) {
|
|
||||||
const stateObj = this.hass.states[entityId];
|
|
||||||
if (stateObj) {
|
|
||||||
names.push(computeStateName(stateObj));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (names.length === 0) {
|
|
||||||
names.push(entityIds[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
let message;
|
|
||||||
const name = names.join(", ");
|
|
||||||
if (service === "turn_on" && serviceData.entity_id) {
|
|
||||||
message = this.hass.localize(
|
|
||||||
"ui.notification_toast.entity_turned_on",
|
|
||||||
"entity",
|
|
||||||
name
|
|
||||||
);
|
|
||||||
} else if (service === "turn_off" && serviceData.entity_id) {
|
|
||||||
message = this.hass.localize(
|
|
||||||
"ui.notification_toast.entity_turned_off",
|
|
||||||
"entity",
|
|
||||||
name
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
message = this.hass.localize(
|
|
||||||
"ui.notification_toast.service_called",
|
|
||||||
"service",
|
|
||||||
`${domain}/${service}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
this.fire("hass-notification", { message });
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
|
@ -17,6 +17,8 @@ import { dialogManagerMixin } from "./dialog-manager-mixin";
|
|||||||
import ConnectionMixin from "./connection-mixin";
|
import ConnectionMixin from "./connection-mixin";
|
||||||
import NotificationMixin from "./notification-mixin";
|
import NotificationMixin from "./notification-mixin";
|
||||||
import DisconnectToastMixin from "./disconnect-toast-mixin";
|
import DisconnectToastMixin from "./disconnect-toast-mixin";
|
||||||
|
import { urlSyncMixin } from "./url-sync-mixin";
|
||||||
|
|
||||||
import { Route, HomeAssistant } from "../../types";
|
import { Route, HomeAssistant } from "../../types";
|
||||||
import { navigate } from "../../common/navigate";
|
import { navigate } from "../../common/navigate";
|
||||||
|
|
||||||
@ -36,6 +38,7 @@ export class HomeAssistantAppEl extends ext(HassBaseMixin(LitElement), [
|
|||||||
ConnectionMixin,
|
ConnectionMixin,
|
||||||
NotificationMixin,
|
NotificationMixin,
|
||||||
dialogManagerMixin,
|
dialogManagerMixin,
|
||||||
|
urlSyncMixin,
|
||||||
]) {
|
]) {
|
||||||
@property() private _route?: Route;
|
@property() private _route?: Route;
|
||||||
@property() private _error?: boolean;
|
@property() private _error?: boolean;
|
||||||
|
@ -6,7 +6,7 @@ declare global {
|
|||||||
// for fire event
|
// for fire event
|
||||||
interface HASSDomEvents {
|
interface HASSDomEvents {
|
||||||
"hass-more-info": {
|
"hass-more-info": {
|
||||||
entityId: string;
|
entityId: string | null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
90
src/layouts/app/url-sync-mixin.ts
Normal file
90
src/layouts/app/url-sync-mixin.ts
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import { Constructor, LitElement } from "lit-element";
|
||||||
|
import { HassBaseEl } from "./hass-base-mixin";
|
||||||
|
import { fireEvent } from "../../common/dom/fire_event";
|
||||||
|
|
||||||
|
/* tslint:disable:no-console */
|
||||||
|
const DEBUG = false;
|
||||||
|
|
||||||
|
export const urlSyncMixin = (
|
||||||
|
superClass: Constructor<LitElement & HassBaseEl>
|
||||||
|
) =>
|
||||||
|
// Disable this functionality in the demo.
|
||||||
|
__DEMO__
|
||||||
|
? superClass
|
||||||
|
: class extends superClass {
|
||||||
|
private _ignoreNextHassChange = false;
|
||||||
|
private _ignoreNextPopstate = false;
|
||||||
|
private _moreInfoOpenedFromPath?: string;
|
||||||
|
|
||||||
|
public connectedCallback(): void {
|
||||||
|
super.connectedCallback();
|
||||||
|
window.addEventListener("popstate", this._popstateChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public disconnectedCallback(): void {
|
||||||
|
super.disconnectedCallback();
|
||||||
|
window.removeEventListener("popstate", this._popstateChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected hassChanged(newHass, oldHass): void {
|
||||||
|
super.hassChanged(newHass, oldHass);
|
||||||
|
|
||||||
|
if (this._ignoreNextHassChange) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("ignore hasschange");
|
||||||
|
}
|
||||||
|
this._ignoreNextHassChange = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
!oldHass ||
|
||||||
|
oldHass.moreInfoEntityId === newHass.moreInfoEntityId
|
||||||
|
) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("ignoring hass change");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newHass.moreInfoEntityId) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("pushing state");
|
||||||
|
}
|
||||||
|
// We keep track of where we opened moreInfo from so that we don't
|
||||||
|
// pop the state when we close the modal if the modal has navigated
|
||||||
|
// us away.
|
||||||
|
this._moreInfoOpenedFromPath = window.location.pathname;
|
||||||
|
history.pushState(null, "", window.location.pathname);
|
||||||
|
} else if (
|
||||||
|
window.location.pathname === this._moreInfoOpenedFromPath
|
||||||
|
) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("history back");
|
||||||
|
}
|
||||||
|
this._ignoreNextPopstate = true;
|
||||||
|
history.back();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _popstateChangeListener = (ev) => {
|
||||||
|
if (this._ignoreNextPopstate) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("ignore popstate");
|
||||||
|
}
|
||||||
|
this._ignoreNextPopstate = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("popstate", ev);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hass && this.hass.moreInfoEntityId) {
|
||||||
|
if (DEBUG) {
|
||||||
|
console.log("deselect entity");
|
||||||
|
}
|
||||||
|
this._ignoreNextHassChange = true;
|
||||||
|
fireEvent(this, "hass-more-info", { entityId: null });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
@ -1,41 +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-icon-button/paper-icon-button";
|
|
||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
|
|
||||||
import "../components/ha-paper-icon-button-arrow-prev";
|
|
||||||
|
|
||||||
class HassSubpage extends PolymerElement {
|
|
||||||
static get template() {
|
|
||||||
return html`
|
|
||||||
<style include="ha-style"></style>
|
|
||||||
<app-header-layout has-scrolling-region="">
|
|
||||||
<app-header slot="header" fixed="">
|
|
||||||
<app-toolbar>
|
|
||||||
<ha-paper-icon-button-arrow-prev
|
|
||||||
on-click="_backTapped"
|
|
||||||
></ha-paper-icon-button-arrow-prev>
|
|
||||||
<div main-title="">[[header]]</div>
|
|
||||||
<slot name="toolbar-icon"></slot>
|
|
||||||
</app-toolbar>
|
|
||||||
</app-header>
|
|
||||||
|
|
||||||
<slot></slot>
|
|
||||||
</app-header-layout>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
header: String,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
_backTapped() {
|
|
||||||
history.back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("hass-subpage", HassSubpage);
|
|
@ -22,10 +22,9 @@ class HassSubpage extends LitElement {
|
|||||||
<app-header-layout has-scrolling-region>
|
<app-header-layout has-scrolling-region>
|
||||||
<app-header slot="header" fixed>
|
<app-header slot="header" fixed>
|
||||||
<app-toolbar>
|
<app-toolbar>
|
||||||
<paper-icon-button
|
<ha-paper-icon-button-arrow-prev
|
||||||
icon="hass:arrow-left"
|
|
||||||
@click=${this._backTapped}
|
@click=${this._backTapped}
|
||||||
></paper-icon-button>
|
></ha-paper-icon-button-arrow-prev>
|
||||||
<div main-title>${this.header}</div>
|
<div main-title>${this.header}</div>
|
||||||
<slot name="toolbar-icon"></slot>
|
<slot name="toolbar-icon"></slot>
|
||||||
</app-toolbar>
|
</app-toolbar>
|
||||||
|
@ -15,8 +15,6 @@ import { AppDrawerElement } from "@polymer/app-layout/app-drawer/app-drawer";
|
|||||||
import "@polymer/app-route/app-route";
|
import "@polymer/app-route/app-route";
|
||||||
import "@polymer/iron-media-query/iron-media-query";
|
import "@polymer/iron-media-query/iron-media-query";
|
||||||
|
|
||||||
import "../util/ha-url-sync";
|
|
||||||
|
|
||||||
import "./partial-panel-resolver";
|
import "./partial-panel-resolver";
|
||||||
import { HomeAssistant, Route } from "../types";
|
import { HomeAssistant, Route } from "../types";
|
||||||
import { fireEvent } from "../common/dom/fire_event";
|
import { fireEvent } from "../common/dom/fire_event";
|
||||||
@ -47,7 +45,6 @@ class HomeAssistantMain extends LitElement {
|
|||||||
const disableSwipe = NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1;
|
const disableSwipe = NON_SWIPABLE_PANELS.indexOf(hass.panelUrl) !== -1;
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<ha-url-sync .hass=${hass}></ha-url-sync>
|
|
||||||
<iron-media-query
|
<iron-media-query
|
||||||
query="(max-width: 870px)"
|
query="(max-width: 870px)"
|
||||||
@query-matches-changed=${this._narrowChanged}
|
@query-matches-changed=${this._narrowChanged}
|
||||||
|
@ -66,9 +66,11 @@ class HaConfigAreaRegistry extends LitElement {
|
|||||||
"ui.panel.config.area_registry.picker.introduction2"
|
"ui.panel.config.area_registry.picker.introduction2"
|
||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<a href="/config/integrations"
|
<a href="/config/integrations">
|
||||||
><ha-icon icon="mdi:link"></ha-icon
|
${this.hass.localize(
|
||||||
></a>
|
"ui.panel.config.area_registry.picker.integrations_page"
|
||||||
|
)}
|
||||||
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<paper-card>
|
<paper-card>
|
||||||
${this._items.map((entry) => {
|
${this._items.map((entry) => {
|
||||||
|
@ -81,9 +81,11 @@ class HaAutomationPicker extends LocalizeMixin(NavigateMixin(PolymerElement)) {
|
|||||||
</div>
|
</div>
|
||||||
<div slot="introduction">
|
<div slot="introduction">
|
||||||
[[localize('ui.panel.config.automation.picker.introduction')]]
|
[[localize('ui.panel.config.automation.picker.introduction')]]
|
||||||
<a href="https://home-assistant.io/docs/automation/editor/"
|
<p>
|
||||||
><ha-icon icon="mdi:link"></ha-icon
|
<a href="https://home-assistant.io/docs/automation/editor/">
|
||||||
></a>
|
[[localize('ui.panel.config.automation.picker.learn_more')]]
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<paper-card
|
<paper-card
|
||||||
|
@ -17,8 +17,10 @@ import "../ha-config-section";
|
|||||||
import EventsMixin from "../../../mixins/events-mixin";
|
import EventsMixin from "../../../mixins/events-mixin";
|
||||||
import LocalizeMixin from "../../../mixins/localize-mixin";
|
import LocalizeMixin from "../../../mixins/localize-mixin";
|
||||||
import computeStateName from "../../../common/entity/compute_state_name";
|
import computeStateName from "../../../common/entity/compute_state_name";
|
||||||
|
import {
|
||||||
let registeredDialog = false;
|
loadConfigFlowDialog,
|
||||||
|
showConfigFlowDialog,
|
||||||
|
} from "../../../dialogs/config-flow/show-dialog-config-flow";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @appliesMixin LocalizeMixin
|
* @appliesMixin LocalizeMixin
|
||||||
@ -165,20 +167,11 @@ class HaConfigManagerDashboard extends LocalizeMixin(
|
|||||||
|
|
||||||
connectedCallback() {
|
connectedCallback() {
|
||||||
super.connectedCallback();
|
super.connectedCallback();
|
||||||
|
loadConfigFlowDialog();
|
||||||
if (!registeredDialog) {
|
|
||||||
registeredDialog = true;
|
|
||||||
this.fire("register-dialog", {
|
|
||||||
dialogShowEvent: "show-config-flow",
|
|
||||||
dialogTag: "ha-config-flow",
|
|
||||||
dialogImport: () =>
|
|
||||||
import(/* webpackChunkName: "ha-config-flow" */ "./ha-config-flow"),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_createFlow(ev) {
|
_createFlow(ev) {
|
||||||
this.fire("show-config-flow", {
|
showConfigFlowDialog(this, {
|
||||||
hass: this.hass,
|
hass: this.hass,
|
||||||
newFlowForHandler: ev.model.item,
|
newFlowForHandler: ev.model.item,
|
||||||
dialogClosedCallback: () => this.fire("hass-reload-entries"),
|
dialogClosedCallback: () => this.fire("hass-reload-entries"),
|
||||||
@ -186,7 +179,7 @@ class HaConfigManagerDashboard extends LocalizeMixin(
|
|||||||
}
|
}
|
||||||
|
|
||||||
_continueFlow(ev) {
|
_continueFlow(ev) {
|
||||||
this.fire("show-config-flow", {
|
showConfigFlowDialog(this, {
|
||||||
hass: this.hass,
|
hass: this.hass,
|
||||||
continueFlowId: ev.model.item.flow_id,
|
continueFlowId: ev.model.item.flow_id,
|
||||||
dialogClosedCallback: () => this.fire("hass-reload-entries"),
|
dialogClosedCallback: () => this.fire("hass-reload-entries"),
|
||||||
|
@ -1,365 +0,0 @@
|
|||||||
import "@material/mwc-button";
|
|
||||||
import "@polymer/paper-dialog-scrollable/paper-dialog-scrollable";
|
|
||||||
import "@polymer/paper-dialog/paper-dialog";
|
|
||||||
import "@polymer/paper-tooltip/paper-tooltip";
|
|
||||||
import "@polymer/paper-spinner/paper-spinner";
|
|
||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
|
|
||||||
import "../../../components/ha-form";
|
|
||||||
import "../../../components/ha-markdown";
|
|
||||||
import "../../../resources/ha-style";
|
|
||||||
|
|
||||||
import EventsMixin from "../../../mixins/events-mixin";
|
|
||||||
import LocalizeMixin from "../../../mixins/localize-mixin";
|
|
||||||
|
|
||||||
let instance = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @appliesMixin LocalizeMixin
|
|
||||||
* @appliesMixin EventsMixin
|
|
||||||
*/
|
|
||||||
class HaConfigFlow extends LocalizeMixin(EventsMixin(PolymerElement)) {
|
|
||||||
static get template() {
|
|
||||||
return html`
|
|
||||||
<style include="ha-style-dialog">
|
|
||||||
.error {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
paper-dialog {
|
|
||||||
max-width: 500px;
|
|
||||||
}
|
|
||||||
ha-markdown {
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
ha-markdown a {
|
|
||||||
color: var(--primary-color);
|
|
||||||
}
|
|
||||||
ha-markdown img:first-child:last-child {
|
|
||||||
display: block;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.init-spinner {
|
|
||||||
padding: 10px 100px 34px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.submit-spinner {
|
|
||||||
margin-right: 16px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<paper-dialog
|
|
||||||
id="dialog"
|
|
||||||
with-backdrop=""
|
|
||||||
opened="{{_opened}}"
|
|
||||||
on-opened-changed="_openedChanged"
|
|
||||||
>
|
|
||||||
<h2>
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'abort')]]">
|
|
||||||
Aborted
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'create_entry')]]">
|
|
||||||
Success!
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'form')]]">
|
|
||||||
[[_computeStepTitle(localize, _step)]]
|
|
||||||
</template>
|
|
||||||
</h2>
|
|
||||||
<paper-dialog-scrollable>
|
|
||||||
<template is="dom-if" if="[[_errorMsg]]">
|
|
||||||
<div class="error">[[_errorMsg]]</div>
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[!_step]]">
|
|
||||||
<div class="init-spinner">
|
|
||||||
<paper-spinner active></paper-spinner>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[_step]]">
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'create_entry')]]">
|
|
||||||
<p>Created config for [[_step.title]]</p>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template
|
|
||||||
is="dom-if"
|
|
||||||
if="[[_computeStepDescription(localize, _step)]]"
|
|
||||||
>
|
|
||||||
<ha-markdown
|
|
||||||
content="[[_computeStepDescription(localize, _step)]]"
|
|
||||||
allow-svg
|
|
||||||
></ha-markdown>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'form')]]">
|
|
||||||
<ha-form
|
|
||||||
data="{{_stepData}}"
|
|
||||||
on-data-changed="_increaseCounter"
|
|
||||||
schema="[[_step.data_schema]]"
|
|
||||||
error="[[_step.errors]]"
|
|
||||||
compute-label="[[_computeLabelCallback(localize, _step)]]"
|
|
||||||
compute-error="[[_computeErrorCallback(localize, _step)]]"
|
|
||||||
></ha-form>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
</paper-dialog-scrollable>
|
|
||||||
<div class="buttons">
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'abort')]]">
|
|
||||||
<mwc-button on-click="_flowDone">Close</mwc-button>
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'create_entry')]]">
|
|
||||||
<mwc-button on-click="_flowDone">Close</mwc-button>
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[_equals(_step.type, 'form')]]">
|
|
||||||
<template is="dom-if" if="[[_loading]]">
|
|
||||||
<div class="submit-spinner">
|
|
||||||
<paper-spinner active></paper-spinner>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template is="dom-if" if="[[!_loading]]">
|
|
||||||
<div>
|
|
||||||
<mwc-button on-click="_submitStep" disabled="[[!_canSubmit]]"
|
|
||||||
>Submit</mwc-button
|
|
||||||
>
|
|
||||||
<template is="dom-if" if="[[!_canSubmit]]">
|
|
||||||
<paper-tooltip position="left">
|
|
||||||
Not all required fields are filled in.
|
|
||||||
</paper-tooltip>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</paper-dialog>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
_hass: Object,
|
|
||||||
_dialogClosedCallback: Function,
|
|
||||||
_instance: Number,
|
|
||||||
|
|
||||||
_loading: {
|
|
||||||
type: Boolean,
|
|
||||||
value: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Error message when can't talk to server etc
|
|
||||||
_errorMsg: String,
|
|
||||||
|
|
||||||
_canSubmit: {
|
|
||||||
type: Boolean,
|
|
||||||
computed: "_computeCanSubmit(_step, _stepData, _counter)",
|
|
||||||
},
|
|
||||||
|
|
||||||
// Bogus counter because observing of `_stepData` doesn't seem to work
|
|
||||||
_counter: {
|
|
||||||
type: Number,
|
|
||||||
value: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
_opened: {
|
|
||||||
type: Boolean,
|
|
||||||
value: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
_step: {
|
|
||||||
type: Object,
|
|
||||||
value: null,
|
|
||||||
},
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Store user entered data.
|
|
||||||
*/
|
|
||||||
_stepData: {
|
|
||||||
type: Object,
|
|
||||||
value: null,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
ready() {
|
|
||||||
super.ready();
|
|
||||||
this.addEventListener("keypress", (ev) => {
|
|
||||||
if (ev.keyCode === 13) {
|
|
||||||
this._submitStep();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
showDialog({
|
|
||||||
hass,
|
|
||||||
continueFlowId,
|
|
||||||
newFlowForHandler,
|
|
||||||
dialogClosedCallback,
|
|
||||||
}) {
|
|
||||||
this.hass = hass;
|
|
||||||
this._instance = instance++;
|
|
||||||
this._dialogClosedCallback = dialogClosedCallback;
|
|
||||||
this._createdFromHandler = !!newFlowForHandler;
|
|
||||||
this._loading = true;
|
|
||||||
this._opened = true;
|
|
||||||
|
|
||||||
const fetchStep = continueFlowId
|
|
||||||
? this.hass.callApi("get", `config/config_entries/flow/${continueFlowId}`)
|
|
||||||
: this.hass.callApi("post", "config/config_entries/flow", {
|
|
||||||
handler: newFlowForHandler,
|
|
||||||
});
|
|
||||||
|
|
||||||
const curInstance = this._instance;
|
|
||||||
|
|
||||||
fetchStep.then((step) => {
|
|
||||||
if (curInstance !== this._instance) return;
|
|
||||||
|
|
||||||
this._processStep(step);
|
|
||||||
this._loading = false;
|
|
||||||
// When the flow changes, center the dialog.
|
|
||||||
// Don't do it on each step or else the dialog keeps bouncing.
|
|
||||||
setTimeout(() => this.$.dialog.center(), 0);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_submitStep() {
|
|
||||||
this._loading = true;
|
|
||||||
this._errorMsg = null;
|
|
||||||
|
|
||||||
const curInstance = this._instance;
|
|
||||||
|
|
||||||
const data = {};
|
|
||||||
Object.keys(this._stepData).forEach((key) => {
|
|
||||||
const value = this._stepData[key];
|
|
||||||
const isEmpty = [undefined, ""].includes(value);
|
|
||||||
|
|
||||||
if (!isEmpty) {
|
|
||||||
data[key] = value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.hass
|
|
||||||
.callApi("post", `config/config_entries/flow/${this._step.flow_id}`, data)
|
|
||||||
.then(
|
|
||||||
(step) => {
|
|
||||||
if (curInstance !== this._instance) return;
|
|
||||||
|
|
||||||
this._processStep(step);
|
|
||||||
this._loading = false;
|
|
||||||
},
|
|
||||||
(err) => {
|
|
||||||
this._errorMsg =
|
|
||||||
(err && err.body && err.body.message) || "Unknown error occurred";
|
|
||||||
this._loading = false;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_processStep(step) {
|
|
||||||
if (!step.errors) step.errors = {};
|
|
||||||
this._step = step;
|
|
||||||
// We got a new form if there are no errors.
|
|
||||||
if (step.type === "form" && Object.keys(step.errors).length === 0) {
|
|
||||||
const data = {};
|
|
||||||
step.data_schema.forEach((field) => {
|
|
||||||
if ("default" in field) {
|
|
||||||
data[field.name] = field.default;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this._stepData = data;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_flowDone() {
|
|
||||||
this._opened = false;
|
|
||||||
const flowFinished =
|
|
||||||
this._step && ["success", "abort"].includes(this._step.type);
|
|
||||||
|
|
||||||
if (this._step && !flowFinished && this._createdFromHandler) {
|
|
||||||
this.hass.callApi(
|
|
||||||
"delete",
|
|
||||||
`config/config_entries/flow/${this._step.flow_id}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._dialogClosedCallback({
|
|
||||||
flowFinished,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._errorMsg = null;
|
|
||||||
this._step = null;
|
|
||||||
this._stepData = {};
|
|
||||||
this._dialogClosedCallback = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
_equals(a, b) {
|
|
||||||
return a === b;
|
|
||||||
}
|
|
||||||
|
|
||||||
_openedChanged(ev) {
|
|
||||||
// Closed dialog by clicking on the overlay
|
|
||||||
if (this._step && !ev.detail.value) {
|
|
||||||
this._flowDone();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeStepTitle(localize, step) {
|
|
||||||
return localize(
|
|
||||||
`component.${step.handler}.config.step.${step.step_id}.title`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeStepDescription(localize, step) {
|
|
||||||
const args = [];
|
|
||||||
if (step.type === "form") {
|
|
||||||
args.push(
|
|
||||||
`component.${step.handler}.config.step.${step.step_id}.description`
|
|
||||||
);
|
|
||||||
} else if (step.type === "abort") {
|
|
||||||
args.push(`component.${step.handler}.config.abort.${step.reason}`);
|
|
||||||
} else if (step.type === "create_entry") {
|
|
||||||
args.push(
|
|
||||||
`component.${step.handler}.config.create_entry.${step.description ||
|
|
||||||
"default"}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const placeholders = step.description_placeholders || {};
|
|
||||||
Object.keys(placeholders).forEach((key) => {
|
|
||||||
args.push(key);
|
|
||||||
args.push(placeholders[key]);
|
|
||||||
});
|
|
||||||
|
|
||||||
return localize(...args);
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeLabelCallback(localize, step) {
|
|
||||||
// Returns a callback for ha-form to calculate labels per schema object
|
|
||||||
return (schema) =>
|
|
||||||
localize(
|
|
||||||
`component.${step.handler}.config.step.${step.step_id}.data.${
|
|
||||||
schema.name
|
|
||||||
}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeErrorCallback(localize, step) {
|
|
||||||
// Returns a callback for ha-form to calculate error messages
|
|
||||||
return (error) =>
|
|
||||||
localize(`component.${step.handler}.config.error.${error}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeCanSubmit(step, stepData) {
|
|
||||||
// We can submit if all required fields are filled in
|
|
||||||
return (
|
|
||||||
step !== null &&
|
|
||||||
step.type === "form" &&
|
|
||||||
stepData !== null &&
|
|
||||||
step.data_schema.every(
|
|
||||||
(field) =>
|
|
||||||
field.optional || !["", undefined].includes(stepData[field.name])
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_increaseCounter() {
|
|
||||||
this._counter += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("ha-config-flow", HaConfigFlow);
|
|
@ -70,10 +70,12 @@ class HaConfigEntityRegistry extends LitElement {
|
|||||||
${this.hass.localize(
|
${this.hass.localize(
|
||||||
"ui.panel.config.entity_registry.picker.introduction2"
|
"ui.panel.config.entity_registry.picker.introduction2"
|
||||||
)}
|
)}
|
||||||
<a href="/config/integrations"
|
|
||||||
><ha-icon icon="mdi:link"></ha-icon
|
|
||||||
></a>
|
|
||||||
</p>
|
</p>
|
||||||
|
<a href="/config/integrations">
|
||||||
|
${this.hass.localize(
|
||||||
|
"ui.panel.config.entity_registry.picker.integrations_page"
|
||||||
|
)}
|
||||||
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<paper-card>
|
<paper-card>
|
||||||
${this._items.map((entry) => {
|
${this._items.map((entry) => {
|
||||||
|
@ -73,7 +73,9 @@ export default class Automation extends Component {
|
|||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<a href="https://home-assistant.io/docs/automation/trigger/">
|
<a href="https://home-assistant.io/docs/automation/trigger/">
|
||||||
<ha-icon icon="mdi:link" />
|
{localize(
|
||||||
|
"ui.panel.config.automation.editor.triggers.learn_more"
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<Trigger
|
<Trigger
|
||||||
@ -95,7 +97,9 @@ export default class Automation extends Component {
|
|||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<a href="https://home-assistant.io/docs/scripts/conditions/">
|
<a href="https://home-assistant.io/docs/scripts/conditions/">
|
||||||
<ha-icon icon="mdi:link" />
|
{localize(
|
||||||
|
"ui.panel.config.automation.editor.conditions.learn_more"
|
||||||
|
)}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<Condition
|
<Condition
|
||||||
@ -117,7 +121,7 @@ export default class Automation extends Component {
|
|||||||
)}
|
)}
|
||||||
</p>
|
</p>
|
||||||
<a href="https://home-assistant.io/docs/automation/action/">
|
<a href="https://home-assistant.io/docs/automation/action/">
|
||||||
<ha-icon icon="mdi:link" />
|
{localize("ui.panel.config.automation.editor.actions.learn_more")}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<Script
|
<Script
|
||||||
|
@ -64,7 +64,14 @@ class DialogSystemLogDetail extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static get styles(): CSSResult[] {
|
static get styles(): CSSResult[] {
|
||||||
return [haStyleDialog, css``];
|
return [
|
||||||
|
haStyleDialog,
|
||||||
|
css`
|
||||||
|
paper-dialog {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +98,9 @@ class SystemHealthCard extends LitElement {
|
|||||||
|
|
||||||
private async _fetchInfo() {
|
private async _fetchInfo() {
|
||||||
try {
|
try {
|
||||||
|
if (!("system_health" in this.hass!.config.components)) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
this._info = await fetchSystemHealthInfo(this.hass!);
|
this._info = await fetchSystemHealthInfo(this.hass!);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this._info = {
|
this._info = {
|
||||||
|
@ -274,6 +274,7 @@ export class HuiLightCard extends LitElement implements LovelaceCard {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
color: var(--brightness-font-color);
|
color: var(--brightness-font-color);
|
||||||
text-shadow: var(--brightness-font-text-shadow);
|
text-shadow: var(--brightness-font-text-shadow);
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
.show_brightness {
|
.show_brightness {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
@ -1,369 +0,0 @@
|
|||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
import "@polymer/paper-icon-button/paper-icon-button";
|
|
||||||
|
|
||||||
import "../../map/ha-entity-marker";
|
|
||||||
|
|
||||||
import { setupLeafletMap } from "../../../common/dom/setup-leaflet-map";
|
|
||||||
import { processConfigEntities } from "../common/process-config-entities";
|
|
||||||
import computeStateDomain from "../../../common/entity/compute_state_domain";
|
|
||||||
import computeStateName from "../../../common/entity/compute_state_name";
|
|
||||||
import debounce from "../../../common/util/debounce";
|
|
||||||
import parseAspectRatio from "../../../common/util/parse-aspect-ratio";
|
|
||||||
|
|
||||||
// should be interface when converted to TS
|
|
||||||
export const Config = {
|
|
||||||
title: "",
|
|
||||||
aspect_ratio: "",
|
|
||||||
default_zoom: 14,
|
|
||||||
entities: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
class HuiMapCard extends PolymerElement {
|
|
||||||
static async getConfigElement() {
|
|
||||||
await import(/* webpackChunkName: "hui-map-card-editor" */ "../editor/config-elements/hui-map-card-editor");
|
|
||||||
return document.createElement("hui-map-card-editor");
|
|
||||||
}
|
|
||||||
|
|
||||||
static getStubConfig() {
|
|
||||||
return { entities: [] };
|
|
||||||
}
|
|
||||||
|
|
||||||
static get template() {
|
|
||||||
return html`
|
|
||||||
<style>
|
|
||||||
:host([is-panel]) ha-card {
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
/**
|
|
||||||
* In panel mode we want a full height map. Since parent #view
|
|
||||||
* only sets min-height, we need absolute positioning here
|
|
||||||
*/
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
|
|
||||||
ha-card {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
#map {
|
|
||||||
z-index: 0;
|
|
||||||
border: none;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
paper-icon-button {
|
|
||||||
position: absolute;
|
|
||||||
top: 75px;
|
|
||||||
left: 7px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#root {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
:host([is-panel]) #root {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<ha-card id="card" header="[[_config.title]]">
|
|
||||||
<div id="root">
|
|
||||||
<div id="map"></div>
|
|
||||||
<paper-icon-button
|
|
||||||
on-click="_fitMap"
|
|
||||||
icon="hass:image-filter-center-focus"
|
|
||||||
title="Reset focus"
|
|
||||||
></paper-icon-button>
|
|
||||||
</div>
|
|
||||||
</ha-card>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
hass: {
|
|
||||||
type: Object,
|
|
||||||
observer: "_drawEntities",
|
|
||||||
},
|
|
||||||
_config: Object,
|
|
||||||
isPanel: {
|
|
||||||
type: Boolean,
|
|
||||||
reflectToAttribute: true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
this._debouncedResizeListener = debounce(this._resetMap.bind(this), 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
ready() {
|
|
||||||
super.ready();
|
|
||||||
|
|
||||||
if (!this._config || this.isPanel) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ratio = parseAspectRatio(this._config.aspect_ratio);
|
|
||||||
|
|
||||||
if (ratio && ratio.w > 0 && ratio.h > 0) {
|
|
||||||
this.$.root.style.paddingBottom = `${((100 * ratio.h) / ratio.w).toFixed(
|
|
||||||
2
|
|
||||||
)}%`;
|
|
||||||
} else {
|
|
||||||
this.$.root.style.paddingBottom = "100%";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setConfig(config) {
|
|
||||||
if (!config) {
|
|
||||||
throw new Error("Error in card configuration.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!config.entities && !config.geo_location_sources) {
|
|
||||||
throw new Error(
|
|
||||||
"Either entities or geo_location_sources must be defined"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (config.entities && !Array.isArray(config.entities)) {
|
|
||||||
throw new Error("Entities need to be an array");
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
config.geo_location_sources &&
|
|
||||||
!Array.isArray(config.geo_location_sources)
|
|
||||||
) {
|
|
||||||
throw new Error("Geo_location_sources needs to be an array");
|
|
||||||
}
|
|
||||||
|
|
||||||
this._config = config;
|
|
||||||
this._configGeoLocationSources = config.geo_location_sources;
|
|
||||||
this._configEntities = config.entities;
|
|
||||||
}
|
|
||||||
|
|
||||||
getCardSize() {
|
|
||||||
const ratio = parseAspectRatio(this._config.aspect_ratio);
|
|
||||||
let ar;
|
|
||||||
if (ratio && ratio.w > 0 && ratio.h > 0) {
|
|
||||||
ar = `${((100 * ratio.h) / ratio.w).toFixed(2)}`;
|
|
||||||
} else {
|
|
||||||
ar = "100";
|
|
||||||
}
|
|
||||||
return 1 + Math.floor(ar / 25) || 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
connectedCallback() {
|
|
||||||
super.connectedCallback();
|
|
||||||
|
|
||||||
// Observe changes to map size and invalidate to prevent broken rendering
|
|
||||||
// Uses ResizeObserver in Chrome, otherwise window resize event
|
|
||||||
if (typeof ResizeObserver === "function") {
|
|
||||||
this._resizeObserver = new ResizeObserver(() =>
|
|
||||||
this._debouncedResizeListener()
|
|
||||||
);
|
|
||||||
this._resizeObserver.observe(this.$.map);
|
|
||||||
} else {
|
|
||||||
window.addEventListener("resize", this._debouncedResizeListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.loadMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
async loadMap() {
|
|
||||||
[this._map, this.Leaflet] = await setupLeafletMap(this.$.map);
|
|
||||||
this._drawEntities(this.hass);
|
|
||||||
this._map.invalidateSize();
|
|
||||||
this._fitMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
disconnectedCallback() {
|
|
||||||
super.disconnectedCallback();
|
|
||||||
|
|
||||||
if (this._map) {
|
|
||||||
this._map.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._resizeObserver) {
|
|
||||||
this._resizeObserver.unobserve(this.$.map);
|
|
||||||
} else {
|
|
||||||
window.removeEventListener("resize", this._debouncedResizeListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_resetMap() {
|
|
||||||
if (!this._map) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._map.invalidateSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
_fitMap() {
|
|
||||||
const zoom = this._config.default_zoom;
|
|
||||||
if (this._mapItems.length === 0) {
|
|
||||||
this._map.setView(
|
|
||||||
new this.Leaflet.LatLng(
|
|
||||||
this.hass.config.latitude,
|
|
||||||
this.hass.config.longitude
|
|
||||||
),
|
|
||||||
zoom || 14
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bounds = new this.Leaflet.latLngBounds(
|
|
||||||
this._mapItems.map((item) => item.getLatLng())
|
|
||||||
);
|
|
||||||
this._map.fitBounds(bounds.pad(0.5));
|
|
||||||
|
|
||||||
if (zoom && this._map.getZoom() > zoom) {
|
|
||||||
this._map.setZoom(zoom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_drawEntities(hass) {
|
|
||||||
const map = this._map;
|
|
||||||
if (!map) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._mapItems) {
|
|
||||||
this._mapItems.forEach((marker) => marker.remove());
|
|
||||||
}
|
|
||||||
const mapItems = (this._mapItems = []);
|
|
||||||
|
|
||||||
let allEntities = [];
|
|
||||||
if (this._configEntities) {
|
|
||||||
allEntities = allEntities.concat(this._configEntities);
|
|
||||||
}
|
|
||||||
if (this._configGeoLocationSources) {
|
|
||||||
Object.keys(this.hass.states).forEach((entityId) => {
|
|
||||||
const stateObj = this.hass.states[entityId];
|
|
||||||
if (
|
|
||||||
computeStateDomain(stateObj) === "geo_location" &&
|
|
||||||
(this._configGeoLocationSources.includes(
|
|
||||||
stateObj.attributes.source
|
|
||||||
) ||
|
|
||||||
this._configGeoLocationSources.includes("all"))
|
|
||||||
) {
|
|
||||||
allEntities.push(entityId);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
allEntities = processConfigEntities(allEntities);
|
|
||||||
|
|
||||||
allEntities.forEach((entity) => {
|
|
||||||
const entityId = entity.entity;
|
|
||||||
if (!(entityId in hass.states)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const stateObj = hass.states[entityId];
|
|
||||||
const title = computeStateName(stateObj);
|
|
||||||
const {
|
|
||||||
latitude,
|
|
||||||
longitude,
|
|
||||||
passive,
|
|
||||||
icon,
|
|
||||||
radius,
|
|
||||||
entity_picture: entityPicture,
|
|
||||||
gps_accuracy: gpsAccuracy,
|
|
||||||
} = stateObj.attributes;
|
|
||||||
|
|
||||||
if (!(latitude && longitude)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let markerIcon;
|
|
||||||
let iconHTML;
|
|
||||||
let el;
|
|
||||||
|
|
||||||
if (computeStateDomain(stateObj) === "zone") {
|
|
||||||
// DRAW ZONE
|
|
||||||
if (passive) return;
|
|
||||||
|
|
||||||
// create icon
|
|
||||||
if (icon) {
|
|
||||||
el = document.createElement("ha-icon");
|
|
||||||
el.setAttribute("icon", icon);
|
|
||||||
iconHTML = el.outerHTML;
|
|
||||||
} else {
|
|
||||||
iconHTML = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
markerIcon = this.Leaflet.divIcon({
|
|
||||||
html: iconHTML,
|
|
||||||
iconSize: [24, 24],
|
|
||||||
className: "",
|
|
||||||
});
|
|
||||||
|
|
||||||
// create market with the icon
|
|
||||||
mapItems.push(
|
|
||||||
this.Leaflet.marker([latitude, longitude], {
|
|
||||||
icon: markerIcon,
|
|
||||||
interactive: false,
|
|
||||||
title: title,
|
|
||||||
}).addTo(map)
|
|
||||||
);
|
|
||||||
|
|
||||||
// create circle around it
|
|
||||||
mapItems.push(
|
|
||||||
this.Leaflet.circle([latitude, longitude], {
|
|
||||||
interactive: false,
|
|
||||||
color: "#FF9800",
|
|
||||||
radius: radius,
|
|
||||||
}).addTo(map)
|
|
||||||
);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// DRAW ENTITY
|
|
||||||
// create icon
|
|
||||||
const entityName = title
|
|
||||||
.split(" ")
|
|
||||||
.map((part) => part[0])
|
|
||||||
.join("")
|
|
||||||
.substr(0, 3);
|
|
||||||
|
|
||||||
el = document.createElement("ha-entity-marker");
|
|
||||||
el.setAttribute("entity-id", entityId);
|
|
||||||
el.setAttribute("entity-name", entityName);
|
|
||||||
el.setAttribute("entity-picture", entityPicture || "");
|
|
||||||
|
|
||||||
/* this.Leaflet clones this element before adding it to the map. This messes up
|
|
||||||
our Polymer object and we can't pass data through. Thus we hack like this. */
|
|
||||||
markerIcon = this.Leaflet.divIcon({
|
|
||||||
html: el.outerHTML,
|
|
||||||
iconSize: [48, 48],
|
|
||||||
className: "",
|
|
||||||
});
|
|
||||||
|
|
||||||
// create market with the icon
|
|
||||||
mapItems.push(
|
|
||||||
this.Leaflet.marker([latitude, longitude], {
|
|
||||||
icon: markerIcon,
|
|
||||||
title: computeStateName(stateObj),
|
|
||||||
}).addTo(map)
|
|
||||||
);
|
|
||||||
|
|
||||||
// create circle around if entity has accuracy
|
|
||||||
if (gpsAccuracy) {
|
|
||||||
mapItems.push(
|
|
||||||
this.Leaflet.circle([latitude, longitude], {
|
|
||||||
interactive: false,
|
|
||||||
color: "#0288D1",
|
|
||||||
radius: gpsAccuracy,
|
|
||||||
}).addTo(map)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
customElements.define("hui-map-card", HuiMapCard);
|
|
407
src/panels/lovelace/cards/hui-map-card.ts
Normal file
407
src/panels/lovelace/cards/hui-map-card.ts
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
import "@polymer/paper-icon-button/paper-icon-button";
|
||||||
|
import { Layer, Marker, Circle, Map } from "leaflet";
|
||||||
|
import {
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
css,
|
||||||
|
html,
|
||||||
|
property,
|
||||||
|
PropertyValues,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
|
import "../../map/ha-entity-marker";
|
||||||
|
|
||||||
|
import {
|
||||||
|
setupLeafletMap,
|
||||||
|
LeafletModuleType,
|
||||||
|
} from "../../../common/dom/setup-leaflet-map";
|
||||||
|
import computeStateDomain from "../../../common/entity/compute_state_domain";
|
||||||
|
import computeStateName from "../../../common/entity/compute_state_name";
|
||||||
|
import debounce from "../../../common/util/debounce";
|
||||||
|
import parseAspectRatio from "../../../common/util/parse-aspect-ratio";
|
||||||
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import computeDomain from "../../../common/entity/compute_domain";
|
||||||
|
import { LovelaceCard } from "../types";
|
||||||
|
import { LovelaceCardConfig } from "../../../data/lovelace";
|
||||||
|
import { EntityConfig } from "../entity-rows/types";
|
||||||
|
import { processConfigEntities } from "../common/process-config-entities";
|
||||||
|
|
||||||
|
export interface MapCardConfig extends LovelaceCardConfig {
|
||||||
|
title: string;
|
||||||
|
aspect_ratio: string;
|
||||||
|
default_zoom?: number;
|
||||||
|
entities?: Array<EntityConfig | string>;
|
||||||
|
geo_location_sources?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
@customElement("hui-map-card")
|
||||||
|
class HuiMapCard extends LitElement implements LovelaceCard {
|
||||||
|
public static async getConfigElement() {
|
||||||
|
await import(/* webpackChunkName: "hui-map-card-editor" */ "../editor/config-elements/hui-map-card-editor");
|
||||||
|
return document.createElement("hui-map-card-editor");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static getStubConfig() {
|
||||||
|
return { entities: [] };
|
||||||
|
}
|
||||||
|
|
||||||
|
@property() public hass?: HomeAssistant;
|
||||||
|
|
||||||
|
@property({ type: Boolean, reflect: true })
|
||||||
|
public isPanel = false;
|
||||||
|
|
||||||
|
@property()
|
||||||
|
private _config?: MapCardConfig;
|
||||||
|
private _configEntities?: EntityConfig[];
|
||||||
|
// tslint:disable-next-line
|
||||||
|
private Leaflet?: LeafletModuleType;
|
||||||
|
private _leafletMap?: Map;
|
||||||
|
// @ts-ignore
|
||||||
|
private _resizeObserver?: ResizeObserver;
|
||||||
|
private _debouncedResizeListener = debounce(
|
||||||
|
() => {
|
||||||
|
if (!this._leafletMap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._leafletMap.invalidateSize();
|
||||||
|
},
|
||||||
|
100,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
private _mapItems: Array<Marker | Circle> = [];
|
||||||
|
private _connected = false;
|
||||||
|
|
||||||
|
public setConfig(config: MapCardConfig): void {
|
||||||
|
if (!config) {
|
||||||
|
throw new Error("Error in card configuration.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.entities && !config.geo_location_sources) {
|
||||||
|
throw new Error(
|
||||||
|
"Either entities or geo_location_sources must be defined"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (config.entities && !Array.isArray(config.entities)) {
|
||||||
|
throw new Error("Entities need to be an array");
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
config.geo_location_sources &&
|
||||||
|
!Array.isArray(config.geo_location_sources)
|
||||||
|
) {
|
||||||
|
throw new Error("Geo_location_sources needs to be an array");
|
||||||
|
}
|
||||||
|
|
||||||
|
this._config = config;
|
||||||
|
this._configEntities = config.entities
|
||||||
|
? processConfigEntities(config.entities)
|
||||||
|
: [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public getCardSize(): number {
|
||||||
|
if (!this._config) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
const ratio = parseAspectRatio(this._config.aspect_ratio);
|
||||||
|
const ar =
|
||||||
|
ratio && ratio.w > 0 && ratio.h > 0
|
||||||
|
? `${((100 * ratio.h) / ratio.w).toFixed(2)}`
|
||||||
|
: "100";
|
||||||
|
return 1 + Math.floor(Number(ar) / 25) || 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public connectedCallback(): void {
|
||||||
|
super.connectedCallback();
|
||||||
|
this._connected = true;
|
||||||
|
if (this.hasUpdated) {
|
||||||
|
this._attachObserver();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public disconnectedCallback(): void {
|
||||||
|
super.disconnectedCallback();
|
||||||
|
|
||||||
|
if (this._leafletMap) {
|
||||||
|
this._leafletMap.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._resizeObserver) {
|
||||||
|
this._resizeObserver.unobserve(this._mapEl);
|
||||||
|
} else {
|
||||||
|
window.removeEventListener("resize", this._debouncedResizeListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected render(): TemplateResult | void {
|
||||||
|
if (!this._config) {
|
||||||
|
return html``;
|
||||||
|
}
|
||||||
|
return html`
|
||||||
|
<ha-card id="card" .header=${this._config.title}>
|
||||||
|
<div id="root">
|
||||||
|
<div id="map"></div>
|
||||||
|
<paper-icon-button
|
||||||
|
@click=${this._fitMap}
|
||||||
|
icon="hass:image-filter-center-focus"
|
||||||
|
title="Reset focus"
|
||||||
|
></paper-icon-button>
|
||||||
|
</div>
|
||||||
|
</ha-card>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected firstUpdated(changedProps: PropertyValues): void {
|
||||||
|
super.firstUpdated(changedProps);
|
||||||
|
this.loadMap();
|
||||||
|
const root = this.shadowRoot!.getElementById("root");
|
||||||
|
|
||||||
|
if (!this._config || this.isPanel || !root) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._connected) {
|
||||||
|
this._attachObserver();
|
||||||
|
}
|
||||||
|
|
||||||
|
const ratio = parseAspectRatio(this._config.aspect_ratio);
|
||||||
|
|
||||||
|
root.style.paddingBottom =
|
||||||
|
ratio && ratio.w > 0 && ratio.h > 0
|
||||||
|
? `${((100 * ratio.h) / ratio.w).toFixed(2)}%`
|
||||||
|
: (root.style.paddingBottom = "100%");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected updated(changedProps: PropertyValues): void {
|
||||||
|
if (changedProps.has("hass")) {
|
||||||
|
this._drawEntities();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private get _mapEl(): HTMLDivElement {
|
||||||
|
return this.shadowRoot!.getElementById("map") as HTMLDivElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async loadMap(): Promise<void> {
|
||||||
|
[this._leafletMap, this.Leaflet] = await setupLeafletMap(this._mapEl);
|
||||||
|
this._drawEntities();
|
||||||
|
this._leafletMap.invalidateSize();
|
||||||
|
this._fitMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
private _fitMap(): void {
|
||||||
|
if (!this._leafletMap || !this.Leaflet || !this._config || !this.hass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const zoom = this._config.default_zoom;
|
||||||
|
if (this._mapItems.length === 0) {
|
||||||
|
this._leafletMap.setView(
|
||||||
|
new this.Leaflet.LatLng(
|
||||||
|
this.hass.config.latitude,
|
||||||
|
this.hass.config.longitude
|
||||||
|
),
|
||||||
|
zoom || 14
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const bounds = this.Leaflet.latLngBounds(
|
||||||
|
this._mapItems ? this._mapItems.map((item) => item.getLatLng()) : []
|
||||||
|
);
|
||||||
|
this._leafletMap.fitBounds(bounds.pad(0.5));
|
||||||
|
|
||||||
|
if (zoom && this._leafletMap.getZoom() > zoom) {
|
||||||
|
this._leafletMap.setZoom(zoom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _drawEntities(): void {
|
||||||
|
const hass = this.hass;
|
||||||
|
const map = this._leafletMap;
|
||||||
|
const config = this._config;
|
||||||
|
const Leaflet = this.Leaflet;
|
||||||
|
if (!hass || !map || !config || !Leaflet) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._mapItems) {
|
||||||
|
this._mapItems.forEach((marker) => marker.remove());
|
||||||
|
}
|
||||||
|
const mapItems: Layer[] = (this._mapItems = []);
|
||||||
|
|
||||||
|
const allEntities = this._configEntities!.concat();
|
||||||
|
|
||||||
|
// Calculate visible geo location sources
|
||||||
|
if (config.geo_location_sources) {
|
||||||
|
const includesAll = config.geo_location_sources.includes("all");
|
||||||
|
for (const entityId of Object.keys(hass.states)) {
|
||||||
|
const stateObj = hass.states[entityId];
|
||||||
|
if (
|
||||||
|
computeDomain(entityId) === "geo_location" &&
|
||||||
|
(includesAll ||
|
||||||
|
config.geo_location_sources.includes(stateObj.attributes.source))
|
||||||
|
) {
|
||||||
|
allEntities.push({ entity: entityId });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const entity of allEntities) {
|
||||||
|
const entityId = entity.entity;
|
||||||
|
const stateObj = hass.states[entityId];
|
||||||
|
if (!stateObj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const title = computeStateName(stateObj);
|
||||||
|
const {
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
passive,
|
||||||
|
icon,
|
||||||
|
radius,
|
||||||
|
entity_picture: entityPicture,
|
||||||
|
gps_accuracy: gpsAccuracy,
|
||||||
|
} = stateObj.attributes;
|
||||||
|
|
||||||
|
if (!(latitude && longitude)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (computeStateDomain(stateObj) === "zone") {
|
||||||
|
// DRAW ZONE
|
||||||
|
if (passive) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create marker with the icon
|
||||||
|
mapItems.push(
|
||||||
|
Leaflet.marker([latitude, longitude], {
|
||||||
|
icon: Leaflet.divIcon({
|
||||||
|
html: icon ? `<ha-icon icon="${icon}"></ha-icon>` : title,
|
||||||
|
iconSize: [24, 24],
|
||||||
|
className: "",
|
||||||
|
}),
|
||||||
|
interactive: false,
|
||||||
|
title,
|
||||||
|
}).addTo(map)
|
||||||
|
);
|
||||||
|
|
||||||
|
// create circle around it
|
||||||
|
mapItems.push(
|
||||||
|
Leaflet.circle([latitude, longitude], {
|
||||||
|
interactive: false,
|
||||||
|
color: "#FF9800",
|
||||||
|
radius,
|
||||||
|
}).addTo(map)
|
||||||
|
);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DRAW ENTITY
|
||||||
|
// create icon
|
||||||
|
const entityName = title
|
||||||
|
.split(" ")
|
||||||
|
.map((part) => part[0])
|
||||||
|
.join("")
|
||||||
|
.substr(0, 3);
|
||||||
|
|
||||||
|
// create market with the icon
|
||||||
|
mapItems.push(
|
||||||
|
Leaflet.marker([latitude, longitude], {
|
||||||
|
icon: Leaflet.divIcon({
|
||||||
|
// Leaflet clones this element before adding it to the map. This messes up
|
||||||
|
// our Polymer object and we can't pass data through. Thus we hack like this.
|
||||||
|
html: `
|
||||||
|
<ha-entity-marker
|
||||||
|
entity-id="${entityId}"
|
||||||
|
entity-name="${entityName}"
|
||||||
|
entity-picture="${entityPicture || ""}
|
||||||
|
></ha-entity-marker>
|
||||||
|
`,
|
||||||
|
iconSize: [48, 48],
|
||||||
|
className: "",
|
||||||
|
}),
|
||||||
|
title: computeStateName(stateObj),
|
||||||
|
}).addTo(map)
|
||||||
|
);
|
||||||
|
|
||||||
|
// create circle around if entity has accuracy
|
||||||
|
if (gpsAccuracy) {
|
||||||
|
mapItems.push(
|
||||||
|
Leaflet.circle([latitude, longitude], {
|
||||||
|
interactive: false,
|
||||||
|
color: "#0288D1",
|
||||||
|
radius: gpsAccuracy,
|
||||||
|
}).addTo(map)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private _attachObserver(): void {
|
||||||
|
// Observe changes to map size and invalidate to prevent broken rendering
|
||||||
|
// Uses ResizeObserver in Chrome, otherwise window resize event
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
if (typeof ResizeObserver === "function") {
|
||||||
|
// @ts-ignore
|
||||||
|
this._resizeObserver = new ResizeObserver(() =>
|
||||||
|
this._debouncedResizeListener()
|
||||||
|
);
|
||||||
|
this._resizeObserver.observe(this._mapEl);
|
||||||
|
} else {
|
||||||
|
window.addEventListener("resize", this._debouncedResizeListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static get styles(): CSSResult {
|
||||||
|
return css`
|
||||||
|
:host([ispanel]) ha-card {
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
/**
|
||||||
|
* In panel mode we want a full height map. Since parent #view
|
||||||
|
* only sets min-height, we need absolute positioning here
|
||||||
|
*/
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
ha-card {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#map {
|
||||||
|
z-index: 0;
|
||||||
|
border: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
paper-icon-button {
|
||||||
|
position: absolute;
|
||||||
|
top: 75px;
|
||||||
|
left: 7px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
:host([ispanel]) #root {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"hui-map-card": HuiMapCard;
|
||||||
|
}
|
||||||
|
}
|
@ -3,10 +3,14 @@ import { HomeAssistant } from "../../../types";
|
|||||||
import { LovelaceElementConfig } from "../elements/types";
|
import { LovelaceElementConfig } from "../elements/types";
|
||||||
import { ActionConfig } from "../../../data/lovelace";
|
import { ActionConfig } from "../../../data/lovelace";
|
||||||
|
|
||||||
export const computeTooltip = (
|
interface Config extends LovelaceElementConfig {
|
||||||
hass: HomeAssistant,
|
entity?: string;
|
||||||
config: LovelaceElementConfig
|
title?: string;
|
||||||
): string => {
|
tap_action?: ActionConfig;
|
||||||
|
hold_action?: ActionConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const computeTooltip = (hass: HomeAssistant, config: Config): string => {
|
||||||
if (config.title) {
|
if (config.title) {
|
||||||
return config.title;
|
return config.title;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import { LocalizeFunc } from "../../../common/translations/localize";
|
|||||||
const DEFAULT_VIEW_ENTITY_ID = "group.default_view";
|
const DEFAULT_VIEW_ENTITY_ID = "group.default_view";
|
||||||
const DOMAINS_BADGES = [
|
const DOMAINS_BADGES = [
|
||||||
"binary_sensor",
|
"binary_sensor",
|
||||||
|
"person",
|
||||||
"device_tracker",
|
"device_tracker",
|
||||||
"mailbox",
|
"mailbox",
|
||||||
"sensor",
|
"sensor",
|
||||||
|
@ -11,7 +11,7 @@ import { EntitiesEditorEvent, EditorTarget } from "../types";
|
|||||||
import { HomeAssistant } from "../../../../types";
|
import { HomeAssistant } from "../../../../types";
|
||||||
import { LovelaceCardEditor } from "../../types";
|
import { LovelaceCardEditor } from "../../types";
|
||||||
import { fireEvent } from "../../../../common/dom/fire_event";
|
import { fireEvent } from "../../../../common/dom/fire_event";
|
||||||
import { Config } from "../../cards/hui-alarm-panel-card";
|
import { MapCardConfig } from "../../cards/hui-map-card";
|
||||||
import { configElementStyle } from "./config-elements-style";
|
import { configElementStyle } from "./config-elements-style";
|
||||||
import { processEditorEntities } from "../process-editor-entities";
|
import { processEditorEntities } from "../process-editor-entities";
|
||||||
import { EntityConfig } from "../../entity-rows/types";
|
import { EntityConfig } from "../../entity-rows/types";
|
||||||
@ -37,10 +37,10 @@ const cardConfigStruct = struct({
|
|||||||
|
|
||||||
export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
|
export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
|
||||||
public hass?: HomeAssistant;
|
public hass?: HomeAssistant;
|
||||||
private _config?: Config;
|
private _config?: MapCardConfig;
|
||||||
private _configEntities?: EntityConfig[];
|
private _configEntities?: EntityConfig[];
|
||||||
|
|
||||||
public setConfig(config: Config): void {
|
public setConfig(config: MapCardConfig): void {
|
||||||
config = cardConfigStruct(config);
|
config = cardConfigStruct(config);
|
||||||
this._config = config;
|
this._config = config;
|
||||||
this._configEntities = processEditorEntities(config.entities);
|
this._configEntities = processEditorEntities(config.entities);
|
||||||
@ -62,10 +62,6 @@ export class HuiMapCardEditor extends LitElement implements LovelaceCardEditor {
|
|||||||
return this._config!.default_zoom || NaN;
|
return this._config!.default_zoom || NaN;
|
||||||
}
|
}
|
||||||
|
|
||||||
get _entities(): string[] {
|
|
||||||
return this._config!.entities || [];
|
|
||||||
}
|
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (!this.hass) {
|
if (!this.hass) {
|
||||||
return html``;
|
return html``;
|
||||||
|
@ -1,4 +1,12 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
property,
|
||||||
|
css,
|
||||||
|
CSSResult,
|
||||||
|
customElement,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../../../components/ha-icon";
|
import "../../../components/ha-icon";
|
||||||
|
|
||||||
@ -7,18 +15,20 @@ import { handleClick } from "../common/handle-click";
|
|||||||
import { longPress } from "../common/directives/long-press-directive";
|
import { longPress } from "../common/directives/long-press-directive";
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { ActionConfig } from "../../../data/lovelace";
|
||||||
|
|
||||||
interface Config extends LovelaceElementConfig {
|
export interface Config extends LovelaceElementConfig {
|
||||||
|
entity?: string;
|
||||||
|
name?: string;
|
||||||
|
tap_action?: ActionConfig;
|
||||||
|
hold_action?: ActionConfig;
|
||||||
icon: string;
|
icon: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@customElement("hui-icon-element")
|
||||||
export class HuiIconElement extends LitElement implements LovelaceElement {
|
export class HuiIconElement extends LitElement implements LovelaceElement {
|
||||||
public hass?: HomeAssistant;
|
@property() public hass?: HomeAssistant;
|
||||||
private _config?: Config;
|
@property() private _config?: Config;
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return { hass: {}, _config: {} };
|
|
||||||
}
|
|
||||||
|
|
||||||
public setConfig(config: Config): void {
|
public setConfig(config: Config): void {
|
||||||
if (!config.icon) {
|
if (!config.icon) {
|
||||||
@ -29,15 +39,14 @@ export class HuiIconElement extends LitElement implements LovelaceElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (!this._config) {
|
if (!this._config || !this.hass) {
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.renderStyle()}
|
|
||||||
<ha-icon
|
<ha-icon
|
||||||
.icon="${this._config.icon}"
|
.icon="${this._config.icon}"
|
||||||
.title="${computeTooltip(this.hass!, this._config)}"
|
.title="${computeTooltip(this.hass, this._config)}"
|
||||||
@ha-click="${this._handleTap}"
|
@ha-click="${this._handleTap}"
|
||||||
@ha-hold="${this._handleHold}"
|
@ha-hold="${this._handleHold}"
|
||||||
.longPress="${longPress()}"
|
.longPress="${longPress()}"
|
||||||
@ -45,21 +54,19 @@ export class HuiIconElement extends LitElement implements LovelaceElement {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleTap() {
|
private _handleTap(): void {
|
||||||
handleClick(this, this.hass!, this._config!, false);
|
handleClick(this, this.hass!, this._config!, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleHold() {
|
private _handleHold(): void {
|
||||||
handleClick(this, this.hass!, this._config!, true);
|
handleClick(this, this.hass!, this._config!, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderStyle(): TemplateResult {
|
static get styles(): CSSResult {
|
||||||
return html`
|
return css`
|
||||||
<style>
|
|
||||||
:host {
|
:host {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -69,5 +76,3 @@ declare global {
|
|||||||
"hui-icon-element": HuiIconElement;
|
"hui-icon-element": HuiIconElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-icon-element", HuiIconElement);
|
|
||||||
|
@ -1,4 +1,12 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
property,
|
||||||
|
customElement,
|
||||||
|
css,
|
||||||
|
CSSResult,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../components/hui-image";
|
import "../components/hui-image";
|
||||||
|
|
||||||
@ -7,8 +15,12 @@ import { handleClick } from "../common/handle-click";
|
|||||||
import { longPress } from "../common/directives/long-press-directive";
|
import { longPress } from "../common/directives/long-press-directive";
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { ActionConfig } from "../../../data/lovelace";
|
||||||
|
|
||||||
interface Config extends LovelaceElementConfig {
|
export interface Config extends LovelaceElementConfig {
|
||||||
|
entity?: string;
|
||||||
|
tap_action?: ActionConfig;
|
||||||
|
hold_action?: ActionConfig;
|
||||||
image?: string;
|
image?: string;
|
||||||
state_image?: string;
|
state_image?: string;
|
||||||
camera_image?: string;
|
camera_image?: string;
|
||||||
@ -17,13 +29,10 @@ interface Config extends LovelaceElementConfig {
|
|||||||
aspect_ratio?: string;
|
aspect_ratio?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@customElement("hui-image-element")
|
||||||
export class HuiImageElement extends LitElement implements LovelaceElement {
|
export class HuiImageElement extends LitElement implements LovelaceElement {
|
||||||
public hass?: HomeAssistant;
|
@property() public hass?: HomeAssistant;
|
||||||
private _config?: Config;
|
@property() private _config?: Config;
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return { hass: {}, _config: {} };
|
|
||||||
}
|
|
||||||
|
|
||||||
public setConfig(config: Config): void {
|
public setConfig(config: Config): void {
|
||||||
if (!config) {
|
if (!config) {
|
||||||
@ -38,12 +47,11 @@ export class HuiImageElement extends LitElement implements LovelaceElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (!this._config) {
|
if (!this._config || !this.hass) {
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.renderStyle()}
|
|
||||||
<hui-image
|
<hui-image
|
||||||
.hass="${this.hass}"
|
.hass="${this.hass}"
|
||||||
.entity="${this._config.entity}"
|
.entity="${this._config.entity}"
|
||||||
@ -52,7 +60,7 @@ export class HuiImageElement extends LitElement implements LovelaceElement {
|
|||||||
.cameraImage="${this._config.camera_image}"
|
.cameraImage="${this._config.camera_image}"
|
||||||
.filter="${this._config.filter}"
|
.filter="${this._config.filter}"
|
||||||
.stateFilter="${this._config.state_filter}"
|
.stateFilter="${this._config.state_filter}"
|
||||||
.title="${computeTooltip(this.hass!, this._config)}"
|
.title="${computeTooltip(this.hass, this._config)}"
|
||||||
.aspectRatio="${this._config.aspect_ratio}"
|
.aspectRatio="${this._config.aspect_ratio}"
|
||||||
@ha-click="${this._handleTap}"
|
@ha-click="${this._handleTap}"
|
||||||
@ha-hold="${this._handleHold}"
|
@ha-hold="${this._handleHold}"
|
||||||
@ -61,9 +69,8 @@ export class HuiImageElement extends LitElement implements LovelaceElement {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderStyle(): TemplateResult {
|
static get styles(): CSSResult {
|
||||||
return html`
|
return css`
|
||||||
<style>
|
|
||||||
:host(.clickable) {
|
:host(.clickable) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
@ -72,15 +79,14 @@ export class HuiImageElement extends LitElement implements LovelaceElement {
|
|||||||
hui-image {
|
hui-image {
|
||||||
-webkit-user-select: none !important;
|
-webkit-user-select: none !important;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleTap() {
|
private _handleTap(): void {
|
||||||
handleClick(this, this.hass!, this._config!, false);
|
handleClick(this, this.hass!, this._config!, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleHold() {
|
private _handleHold(): void {
|
||||||
handleClick(this, this.hass!, this._config!, true);
|
handleClick(this, this.hass!, this._config!, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,5 +96,3 @@ declare global {
|
|||||||
"hui-image-element": HuiImageElement;
|
"hui-image-element": HuiImageElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-image-element", HuiImageElement);
|
|
||||||
|
@ -1,14 +1,29 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
property,
|
||||||
|
customElement,
|
||||||
|
CSSResult,
|
||||||
|
css,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../../../components/buttons/ha-call-service-button";
|
import "../../../components/buttons/ha-call-service-button";
|
||||||
|
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
|
||||||
|
export interface Config extends LovelaceElementConfig {
|
||||||
|
title?: string;
|
||||||
|
service?: string;
|
||||||
|
service_data?: object;
|
||||||
|
}
|
||||||
|
|
||||||
|
@customElement("hui-service-button-element")
|
||||||
export class HuiServiceButtonElement extends LitElement
|
export class HuiServiceButtonElement extends LitElement
|
||||||
implements LovelaceElement {
|
implements LovelaceElement {
|
||||||
public hass?: HomeAssistant;
|
public hass?: HomeAssistant;
|
||||||
private _config?: LovelaceElementConfig;
|
@property() private _config?: Config;
|
||||||
private _domain?: string;
|
private _domain?: string;
|
||||||
private _service?: string;
|
private _service?: string;
|
||||||
|
|
||||||
@ -16,7 +31,7 @@ export class HuiServiceButtonElement extends LitElement
|
|||||||
return { _config: {} };
|
return { _config: {} };
|
||||||
}
|
}
|
||||||
|
|
||||||
public setConfig(config: LovelaceElementConfig): void {
|
public setConfig(config: Config): void {
|
||||||
if (!config || !config.service) {
|
if (!config || !config.service) {
|
||||||
throw Error("Invalid Configuration: 'service' required");
|
throw Error("Invalid Configuration: 'service' required");
|
||||||
}
|
}
|
||||||
@ -37,12 +52,11 @@ export class HuiServiceButtonElement extends LitElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (!this._config) {
|
if (!this._config || !this.hass) {
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.renderStyle()}
|
|
||||||
<ha-call-service-button
|
<ha-call-service-button
|
||||||
.hass="${this.hass}"
|
.hass="${this.hass}"
|
||||||
.domain="${this._domain}"
|
.domain="${this._domain}"
|
||||||
@ -53,14 +67,12 @@ export class HuiServiceButtonElement extends LitElement
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderStyle(): TemplateResult {
|
static get styles(): CSSResult {
|
||||||
return html`
|
return css`
|
||||||
<style>
|
|
||||||
ha-call-service-button {
|
ha-call-service-button {
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,5 +82,3 @@ declare global {
|
|||||||
"hui-service-button-element": HuiServiceButtonElement;
|
"hui-service-button-element": HuiServiceButtonElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-service-button-element", HuiServiceButtonElement);
|
|
||||||
|
@ -1,21 +1,29 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
customElement,
|
||||||
|
property,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../../../components/entity/ha-state-label-badge";
|
import "../../../components/entity/ha-state-label-badge";
|
||||||
|
import "../components/hui-warning";
|
||||||
|
|
||||||
import computeStateName from "../../../common/entity/compute_state_name";
|
import computeStateName from "../../../common/entity/compute_state_name";
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
|
||||||
export class HuiStateBadgeElement extends LitElement
|
export interface Config extends LovelaceElementConfig {
|
||||||
implements LovelaceElement {
|
entity: string;
|
||||||
public hass?: HomeAssistant;
|
|
||||||
private _config?: LovelaceElementConfig;
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return { hass: {}, _config: {} };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public setConfig(config: LovelaceElementConfig): void {
|
@customElement("hui-state-badge-element")
|
||||||
|
export class HuiStateBadgeElement extends LitElement
|
||||||
|
implements LovelaceElement {
|
||||||
|
@property() public hass?: HomeAssistant;
|
||||||
|
@property() private _config?: Config;
|
||||||
|
|
||||||
|
public setConfig(config: Config): void {
|
||||||
if (!config.entity) {
|
if (!config.entity) {
|
||||||
throw Error("Invalid Configuration: 'entity' required");
|
throw Error("Invalid Configuration: 'entity' required");
|
||||||
}
|
}
|
||||||
@ -24,20 +32,29 @@ export class HuiStateBadgeElement extends LitElement
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (
|
if (!this._config || !this.hass) {
|
||||||
!this._config ||
|
|
||||||
!this.hass ||
|
|
||||||
!this.hass.states[this._config.entity!]
|
|
||||||
) {
|
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
const state = this.hass.states[this._config.entity!];
|
const stateObj = this.hass.states[this._config.entity!];
|
||||||
|
|
||||||
|
if (!stateObj) {
|
||||||
|
return html`
|
||||||
|
<hui-warning
|
||||||
|
>${this.hass.localize(
|
||||||
|
"ui.panel.lovelace.warning.entity_not_found",
|
||||||
|
"entity",
|
||||||
|
this._config.entity
|
||||||
|
)}</hui-warning
|
||||||
|
>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<ha-state-label-badge
|
<ha-state-label-badge
|
||||||
.hass="${this.hass}"
|
.hass="${this.hass}"
|
||||||
.state="${state}"
|
.state="${stateObj}"
|
||||||
.title="${computeStateName(state)}"
|
.title="${computeStateName(stateObj)}"
|
||||||
></ha-state-label-badge>
|
></ha-state-label-badge>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@ -48,5 +65,3 @@ declare global {
|
|||||||
"hui-state-badge-element": HuiStateBadgeElement;
|
"hui-state-badge-element": HuiStateBadgeElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-state-badge-element", HuiStateBadgeElement);
|
|
||||||
|
@ -1,22 +1,35 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
customElement,
|
||||||
|
property,
|
||||||
|
css,
|
||||||
|
CSSResult,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../../../components/entity/state-badge";
|
import "../../../components/entity/state-badge";
|
||||||
|
import "../components/hui-warning";
|
||||||
|
|
||||||
import { computeTooltip } from "../common/compute-tooltip";
|
import { computeTooltip } from "../common/compute-tooltip";
|
||||||
import { handleClick } from "../common/handle-click";
|
import { handleClick } from "../common/handle-click";
|
||||||
import { longPress } from "../common/directives/long-press-directive";
|
import { longPress } from "../common/directives/long-press-directive";
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { ActionConfig } from "../../../data/lovelace";
|
||||||
|
|
||||||
export class HuiStateIconElement extends LitElement implements LovelaceElement {
|
export interface Config extends LovelaceElementConfig {
|
||||||
public hass?: HomeAssistant;
|
entity: string;
|
||||||
private _config?: LovelaceElementConfig;
|
tap_action?: ActionConfig;
|
||||||
|
hold_action?: ActionConfig;
|
||||||
static get properties() {
|
|
||||||
return { hass: {}, _config: {} };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public setConfig(config: LovelaceElementConfig): void {
|
@customElement("hui-state-icon-element")
|
||||||
|
export class HuiStateIconElement extends LitElement implements LovelaceElement {
|
||||||
|
@property() public hass?: HomeAssistant;
|
||||||
|
@property() private _config?: Config;
|
||||||
|
|
||||||
|
public setConfig(config: Config): void {
|
||||||
if (!config.entity) {
|
if (!config.entity) {
|
||||||
throw Error("Invalid Configuration: 'entity' required");
|
throw Error("Invalid Configuration: 'entity' required");
|
||||||
}
|
}
|
||||||
@ -25,20 +38,28 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (
|
if (!this._config || !this.hass) {
|
||||||
!this._config ||
|
|
||||||
!this.hass ||
|
|
||||||
!this.hass.states[this._config.entity!]
|
|
||||||
) {
|
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
const state = this.hass!.states[this._config.entity!];
|
const stateObj = this.hass.states[this._config.entity!];
|
||||||
|
|
||||||
|
if (!stateObj) {
|
||||||
|
return html`
|
||||||
|
<hui-warning
|
||||||
|
>${this.hass.localize(
|
||||||
|
"ui.panel.lovelace.warning.entity_not_found",
|
||||||
|
"entity",
|
||||||
|
this._config.entity
|
||||||
|
)}</hui-warning
|
||||||
|
>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.renderStyle()}
|
|
||||||
<state-badge
|
<state-badge
|
||||||
.stateObj="${state}"
|
.stateObj="${stateObj}"
|
||||||
.title="${computeTooltip(this.hass!, this._config)}"
|
.title="${computeTooltip(this.hass, this._config)}"
|
||||||
@ha-click="${this._handleClick}"
|
@ha-click="${this._handleClick}"
|
||||||
@ha-hold="${this._handleHold}"
|
@ha-hold="${this._handleHold}"
|
||||||
.longPress="${longPress()}"
|
.longPress="${longPress()}"
|
||||||
@ -46,21 +67,19 @@ export class HuiStateIconElement extends LitElement implements LovelaceElement {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderStyle(): TemplateResult {
|
static get styles(): CSSResult {
|
||||||
return html`
|
return css`
|
||||||
<style>
|
|
||||||
:host {
|
:host {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleClick() {
|
private _handleClick(): void {
|
||||||
handleClick(this, this.hass!, this._config!, false);
|
handleClick(this, this.hass!, this._config!, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleHold() {
|
private _handleHold(): void {
|
||||||
handleClick(this, this.hass!, this._config!, true);
|
handleClick(this, this.hass!, this._config!, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,5 +89,3 @@ declare global {
|
|||||||
"hui-state-icon-element": HuiStateIconElement;
|
"hui-state-icon-element": HuiStateIconElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-state-icon-element", HuiStateIconElement);
|
|
||||||
|
@ -1,6 +1,15 @@
|
|||||||
import { html, LitElement, TemplateResult } from "lit-element";
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
customElement,
|
||||||
|
property,
|
||||||
|
css,
|
||||||
|
CSSResult,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
import "../../../components/entity/ha-state-label-badge";
|
import "../../../components/entity/ha-state-label-badge";
|
||||||
|
import "../components/hui-warning";
|
||||||
|
|
||||||
import computeStateDisplay from "../../../common/entity/compute_state_display";
|
import computeStateDisplay from "../../../common/entity/compute_state_display";
|
||||||
import { computeTooltip } from "../common/compute-tooltip";
|
import { computeTooltip } from "../common/compute-tooltip";
|
||||||
@ -8,19 +17,20 @@ import { handleClick } from "../common/handle-click";
|
|||||||
import { longPress } from "../common/directives/long-press-directive";
|
import { longPress } from "../common/directives/long-press-directive";
|
||||||
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
import { LovelaceElement, LovelaceElementConfig } from "./types";
|
||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { ActionConfig } from "../../../data/lovelace";
|
||||||
|
|
||||||
interface Config extends LovelaceElementConfig {
|
interface Config extends LovelaceElementConfig {
|
||||||
|
entity: string;
|
||||||
prefix?: string;
|
prefix?: string;
|
||||||
suffix?: string;
|
suffix?: string;
|
||||||
|
tap_action?: ActionConfig;
|
||||||
|
hold_action?: ActionConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@customElement("hui-state-label-element")
|
||||||
class HuiStateLabelElement extends LitElement implements LovelaceElement {
|
class HuiStateLabelElement extends LitElement implements LovelaceElement {
|
||||||
public hass?: HomeAssistant;
|
@property() public hass?: HomeAssistant;
|
||||||
private _config?: Config;
|
@property() private _config?: Config;
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return { hass: {}, _config: {} };
|
|
||||||
}
|
|
||||||
|
|
||||||
public setConfig(config: Config): void {
|
public setConfig(config: Config): void {
|
||||||
if (!config.entity) {
|
if (!config.entity) {
|
||||||
@ -31,37 +41,52 @@ class HuiStateLabelElement extends LitElement implements LovelaceElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected render(): TemplateResult | void {
|
protected render(): TemplateResult | void {
|
||||||
if (!this._config) {
|
if (!this._config || !this.hass) {
|
||||||
return html``;
|
return html``;
|
||||||
}
|
}
|
||||||
|
|
||||||
const state = this.hass!.states[this._config.entity!];
|
const stateObj = this.hass.states[this._config.entity!];
|
||||||
|
|
||||||
|
if (!stateObj) {
|
||||||
|
return html`
|
||||||
|
<hui-warning
|
||||||
|
>${this.hass.localize(
|
||||||
|
"ui.panel.lovelace.warning.entity_not_found",
|
||||||
|
"entity",
|
||||||
|
this._config.entity
|
||||||
|
)}</hui-warning
|
||||||
|
>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.renderStyle()}
|
|
||||||
<div
|
<div
|
||||||
.title="${computeTooltip(this.hass!, this._config)}"
|
.title="${computeTooltip(this.hass, this._config)}"
|
||||||
@ha-click="${this._handleTap}"
|
@ha-click="${this._handleTap}"
|
||||||
@ha-hold="${this._handleHold}"
|
@ha-hold="${this._handleHold}"
|
||||||
.longPress="${longPress()}"
|
.longPress="${longPress()}"
|
||||||
>
|
>
|
||||||
${this._config.prefix}${state
|
${this._config.prefix}${stateObj
|
||||||
? computeStateDisplay(this.hass!.localize, state, this.hass!.language)
|
? computeStateDisplay(
|
||||||
|
this.hass.localize,
|
||||||
|
stateObj,
|
||||||
|
this.hass.language
|
||||||
|
)
|
||||||
: "-"}${this._config.suffix}
|
: "-"}${this._config.suffix}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleTap() {
|
private _handleTap(): void {
|
||||||
handleClick(this, this.hass!, this._config!, false);
|
handleClick(this, this.hass!, this._config!, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _handleHold() {
|
private _handleHold(): void {
|
||||||
handleClick(this, this.hass!, this._config!, true);
|
handleClick(this, this.hass!, this._config!, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderStyle(): TemplateResult {
|
static get styles(): CSSResult {
|
||||||
return html`
|
return css`
|
||||||
<style>
|
|
||||||
:host {
|
:host {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
@ -69,7 +94,6 @@ class HuiStateLabelElement extends LitElement implements LovelaceElement {
|
|||||||
padding: 8px;
|
padding: 8px;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
</style>
|
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,5 +103,3 @@ declare global {
|
|||||||
"hui-state-label-element": HuiStateLabelElement;
|
"hui-state-label-element": HuiStateLabelElement;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
customElements.define("hui-state-label-element", HuiStateLabelElement);
|
|
||||||
|
@ -1,15 +1,8 @@
|
|||||||
import { HomeAssistant } from "../../../types";
|
import { HomeAssistant } from "../../../types";
|
||||||
import { ActionConfig } from "../../../data/lovelace";
|
|
||||||
|
|
||||||
export interface LovelaceElementConfig {
|
export interface LovelaceElementConfig {
|
||||||
type: string;
|
type: string;
|
||||||
style: object;
|
style: object;
|
||||||
entity?: string;
|
|
||||||
hold_action?: ActionConfig;
|
|
||||||
service?: string;
|
|
||||||
service_data?: object;
|
|
||||||
tap_action?: ActionConfig;
|
|
||||||
title?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LovelaceElement extends HTMLElement {
|
export interface LovelaceElement extends HTMLElement {
|
||||||
|
@ -1,188 +0,0 @@
|
|||||||
import { html } from "@polymer/polymer/lib/utils/html-tag";
|
|
||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
import "@polymer/paper-input/paper-input";
|
|
||||||
import { IronResizableBehavior } from "@polymer/iron-resizable-behavior/iron-resizable-behavior";
|
|
||||||
import { mixinBehaviors } from "@polymer/polymer/lib/legacy/class";
|
|
||||||
|
|
||||||
import "../components/hui-generic-entity-row";
|
|
||||||
import "../../../components/ha-slider";
|
|
||||||
import { computeRTL } from "../../../common/util/compute_rtl";
|
|
||||||
|
|
||||||
class HuiInputNumberEntityRow extends mixinBehaviors(
|
|
||||||
[IronResizableBehavior],
|
|
||||||
PolymerElement
|
|
||||||
) {
|
|
||||||
static get template() {
|
|
||||||
return html`
|
|
||||||
${this.styleTemplate}
|
|
||||||
<hui-generic-entity-row
|
|
||||||
hass="[[hass]]"
|
|
||||||
config="[[_config]]"
|
|
||||||
id="input_number_card"
|
|
||||||
>
|
|
||||||
${this.inputNumberControlTemplate}
|
|
||||||
</hui-generic-entity-row>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get styleTemplate() {
|
|
||||||
return html`
|
|
||||||
<style>
|
|
||||||
.flex {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.state {
|
|
||||||
min-width: 45px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
paper-input {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get inputNumberControlTemplate() {
|
|
||||||
return html`
|
|
||||||
<div>
|
|
||||||
<template
|
|
||||||
is="dom-if"
|
|
||||||
if="[[_equals(_stateObj.attributes.mode, 'slider')]]"
|
|
||||||
>
|
|
||||||
<div class="flex">
|
|
||||||
<ha-slider
|
|
||||||
dir="[[_rtl]]"
|
|
||||||
min="[[_min]]"
|
|
||||||
max="[[_max]]"
|
|
||||||
value="{{_value}}"
|
|
||||||
step="[[_step]]"
|
|
||||||
pin
|
|
||||||
on-change="_selectedValueChanged"
|
|
||||||
ignore-bar-touch
|
|
||||||
></ha-slider>
|
|
||||||
<span class="state"
|
|
||||||
>[[_value]] [[_stateObj.attributes.unit_of_measurement]]</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<template
|
|
||||||
is="dom-if"
|
|
||||||
if="[[_equals(_stateObj.attributes.mode, 'box')]]"
|
|
||||||
>
|
|
||||||
<paper-input
|
|
||||||
no-label-float
|
|
||||||
auto-validate
|
|
||||||
pattern="[0-9]+([\\.][0-9]+)?"
|
|
||||||
step="[[_step]]"
|
|
||||||
min="[[_min]]"
|
|
||||||
max="[[_max]]"
|
|
||||||
value="{{_value}}"
|
|
||||||
type="number"
|
|
||||||
on-change="_selectedValueChanged"
|
|
||||||
></paper-input>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
`;
|
|
||||||
}
|
|
||||||
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
hass: Object,
|
|
||||||
_config: Object,
|
|
||||||
_stateObj: {
|
|
||||||
type: Object,
|
|
||||||
computed: "_computeStateObj(hass.states, _config.entity)",
|
|
||||||
observer: "_stateObjChanged",
|
|
||||||
},
|
|
||||||
_min: {
|
|
||||||
type: Number,
|
|
||||||
value: 0,
|
|
||||||
},
|
|
||||||
_max: {
|
|
||||||
type: Number,
|
|
||||||
value: 100,
|
|
||||||
},
|
|
||||||
_step: Number,
|
|
||||||
_value: Number,
|
|
||||||
_rtl: {
|
|
||||||
type: String,
|
|
||||||
computed: "_computeRTLDirection(hass)",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
ready() {
|
|
||||||
super.ready();
|
|
||||||
if (typeof ResizeObserver === "function") {
|
|
||||||
const ro = new ResizeObserver((entries) => {
|
|
||||||
entries.forEach(() => {
|
|
||||||
this._hiddenState();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
ro.observe(this.$.input_number_card);
|
|
||||||
} else {
|
|
||||||
this.addEventListener("iron-resize", this._hiddenState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_equals(a, b) {
|
|
||||||
return a === b;
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeStateObj(states, entityId) {
|
|
||||||
return states && entityId in states ? states[entityId] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
setConfig(config) {
|
|
||||||
if (!config || !config.entity) {
|
|
||||||
throw new Error("Entity not configured.");
|
|
||||||
}
|
|
||||||
this._config = config;
|
|
||||||
}
|
|
||||||
|
|
||||||
_hiddenState() {
|
|
||||||
if (
|
|
||||||
!this.$ ||
|
|
||||||
!this._stateObj ||
|
|
||||||
this._stateObj.attributes.mode !== "slider"
|
|
||||||
)
|
|
||||||
return;
|
|
||||||
const width = this.$.input_number_card.offsetWidth;
|
|
||||||
const stateEl = this.shadowRoot.querySelector(".state");
|
|
||||||
if (!stateEl) return;
|
|
||||||
stateEl.hidden = width <= 350;
|
|
||||||
}
|
|
||||||
|
|
||||||
_stateObjChanged(stateObj, oldStateObj) {
|
|
||||||
if (!stateObj) return;
|
|
||||||
|
|
||||||
this.setProperties({
|
|
||||||
_min: Number(stateObj.attributes.min),
|
|
||||||
_max: Number(stateObj.attributes.max),
|
|
||||||
_step: Number(stateObj.attributes.step),
|
|
||||||
_value: Number(stateObj.state),
|
|
||||||
});
|
|
||||||
if (
|
|
||||||
oldStateObj &&
|
|
||||||
stateObj.attributes.mode === "slider" &&
|
|
||||||
oldStateObj.attributes.mode !== "slider"
|
|
||||||
) {
|
|
||||||
this._hiddenState();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_selectedValueChanged() {
|
|
||||||
if (this._value === Number(this._stateObj.state)) return;
|
|
||||||
|
|
||||||
this.hass.callService("input_number", "set_value", {
|
|
||||||
value: this._value,
|
|
||||||
entity_id: this._stateObj.entity_id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
_computeRTLDirection(hass) {
|
|
||||||
return computeRTL(hass) ? "rtl" : "ltr";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
customElements.define("hui-input-number-entity-row", HuiInputNumberEntityRow);
|
|
158
src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts
Normal file
158
src/panels/lovelace/entity-rows/hui-input-number-entity-row.ts
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
import {
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
TemplateResult,
|
||||||
|
property,
|
||||||
|
customElement,
|
||||||
|
css,
|
||||||
|
CSSResult,
|
||||||
|
} from "lit-element";
|
||||||
|
|
||||||
|
import "../components/hui-generic-entity-row";
|
||||||
|
import "../../../components/ha-slider";
|
||||||
|
import "../components/hui-warning";
|
||||||
|
|
||||||
|
import { computeRTLDirection } from "../../../common/util/compute_rtl";
|
||||||
|
import { EntityRow, EntityConfig } from "./types";
|
||||||
|
import { HomeAssistant } from "../../../types";
|
||||||
|
import { setValue } from "../../../data/input_text";
|
||||||
|
|
||||||
|
@customElement("hui-input-number-entity-row")
|
||||||
|
class HuiInputNumberEntityRow extends LitElement implements EntityRow {
|
||||||
|
@property() public hass?: HomeAssistant;
|
||||||
|
@property() private _config?: EntityConfig;
|
||||||
|
private _loaded?: boolean;
|
||||||
|
private _updated?: boolean;
|
||||||
|
|
||||||
|
public setConfig(config: EntityConfig): void {
|
||||||
|
if (!config) {
|
||||||
|
throw new Error("Configuration error");
|
||||||
|
}
|
||||||
|
this._config = config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public connectedCallback(): void {
|
||||||
|
super.connectedCallback();
|
||||||
|
if (this._updated && !this._loaded) {
|
||||||
|
this._initialLoad();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected firstUpdated(): void {
|
||||||
|
this._updated = true;
|
||||||
|
if (this.isConnected && !this._loaded) {
|
||||||
|
this._initialLoad();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected render(): TemplateResult | void {
|
||||||
|
if (!this._config || !this.hass) {
|
||||||
|
return html``;
|
||||||
|
}
|
||||||
|
|
||||||
|
const stateObj = this.hass.states[this._config.entity];
|
||||||
|
|
||||||
|
if (!stateObj) {
|
||||||
|
return html`
|
||||||
|
<hui-warning
|
||||||
|
>${this.hass.localize(
|
||||||
|
"ui.panel.lovelace.warning.entity_not_found",
|
||||||
|
"entity",
|
||||||
|
this._config.entity
|
||||||
|
)}</hui-warning
|
||||||
|
>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<hui-generic-entity-row .hass="${this.hass}" .config="${this._config}">
|
||||||
|
<div>
|
||||||
|
${stateObj.attributes.mode === "slider"
|
||||||
|
? html`
|
||||||
|
<div class="flex">
|
||||||
|
<ha-slider
|
||||||
|
.dir="${computeRTLDirection(this.hass!)}"
|
||||||
|
.step="${Number(stateObj.attributes.step)}"
|
||||||
|
.min="${Number(stateObj.attributes.min)}"
|
||||||
|
.max="${Number(stateObj.attributes.max)}"
|
||||||
|
.value="${Number(stateObj.state)}"
|
||||||
|
pin
|
||||||
|
@change="${this._selectedValueChanged}"
|
||||||
|
ignore-bar-touch
|
||||||
|
id="input"
|
||||||
|
></ha-slider>
|
||||||
|
<span class="state">
|
||||||
|
${Number(stateObj.state)}
|
||||||
|
${stateObj.attributes.unit_of_measurement}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
: html`
|
||||||
|
<paper-input
|
||||||
|
no-label-float
|
||||||
|
auto-validate
|
||||||
|
.pattern="[0-9]+([\\.][0-9]+)?"
|
||||||
|
.step="${Number(stateObj.attributes.step)}"
|
||||||
|
.min="${Number(stateObj.attributes.min)}"
|
||||||
|
.max="${Number(stateObj.attributes.max)}"
|
||||||
|
.value="${Number(stateObj.state)}"
|
||||||
|
type="number"
|
||||||
|
@change="${this._selectedValueChanged}"
|
||||||
|
id="input"
|
||||||
|
></paper-input>
|
||||||
|
`}
|
||||||
|
</div>
|
||||||
|
</hui-generic-entity-row>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
static get styles(): CSSResult {
|
||||||
|
return css`
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.state {
|
||||||
|
min-width: 45px;
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
paper-input {
|
||||||
|
text-align: end;
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async _initialLoad(): Promise<void> {
|
||||||
|
this._loaded = true;
|
||||||
|
await this.updateComplete;
|
||||||
|
const element = this.shadowRoot!.querySelector(".state") as HTMLElement;
|
||||||
|
|
||||||
|
if (!element || !this.parentElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
element.hidden = this.parentElement.clientWidth <= 350;
|
||||||
|
}
|
||||||
|
|
||||||
|
private get _inputElement(): { value: string } {
|
||||||
|
// linter recommended the following syntax
|
||||||
|
return (this.shadowRoot!.getElementById("input") as unknown) as {
|
||||||
|
value: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private _selectedValueChanged(): void {
|
||||||
|
const element = this._inputElement;
|
||||||
|
const stateObj = this.hass!.states[this._config!.entity];
|
||||||
|
|
||||||
|
if (element.value !== stateObj.state) {
|
||||||
|
setValue(this.hass!, stateObj.entity_id, element.value!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface HTMLElementTagNameMap {
|
||||||
|
"hui-input-number-entity-row": HuiInputNumberEntityRow;
|
||||||
|
}
|
||||||
|
}
|
@ -120,6 +120,18 @@ class LovelacePanel extends LitElement {
|
|||||||
this._updateColumns();
|
this._updateColumns();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public connectedCallback(): void {
|
||||||
|
super.connectedCallback();
|
||||||
|
if (
|
||||||
|
this.lovelace &&
|
||||||
|
this.hass &&
|
||||||
|
this.lovelace.language !== this.hass.language
|
||||||
|
) {
|
||||||
|
// language has been changed, rebuild UI
|
||||||
|
this._fetchConfig(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private _closeEditor() {
|
private _closeEditor() {
|
||||||
this._state = "loaded";
|
this._state = "loaded";
|
||||||
}
|
}
|
||||||
@ -163,6 +175,7 @@ class LovelacePanel extends LitElement {
|
|||||||
config: conf,
|
config: conf,
|
||||||
editMode: this.lovelace ? this.lovelace.editMode : false,
|
editMode: this.lovelace ? this.lovelace.editMode : false,
|
||||||
mode: confMode,
|
mode: confMode,
|
||||||
|
language: this.hass!.language,
|
||||||
enableFullEditMode: () => {
|
enableFullEditMode: () => {
|
||||||
if (!editorLoaded) {
|
if (!editorLoaded) {
|
||||||
editorLoaded = true;
|
editorLoaded = true;
|
||||||
|
@ -53,17 +53,30 @@ class LovelaceFullConfigEditor extends LitElement {
|
|||||||
icon="hass:close"
|
icon="hass:close"
|
||||||
@click="${this._closeEditor}"
|
@click="${this._closeEditor}"
|
||||||
></paper-icon-button>
|
></paper-icon-button>
|
||||||
<div main-title>Edit Config</div>
|
<div main-title>
|
||||||
<mwc-button raised @click="${this._handleSave}"
|
${this.hass!.localize(
|
||||||
>Save
|
"ui.panel.lovelace.editor.raw_editor.header"
|
||||||
<ha-icon
|
)}
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
class="save-button
|
class="save-button
|
||||||
${classMap({
|
${classMap({
|
||||||
saved: this._saving! === false || this._changed === true,
|
saved: this._saving! === false || this._changed === true,
|
||||||
})}"
|
})}"
|
||||||
icon="${this._changed ? "hass:circle-medium" : "hass:check"}"
|
>
|
||||||
></ha-icon
|
${this._changed
|
||||||
></mwc-button>
|
? this.hass!.localize(
|
||||||
|
"ui.panel.lovelace.editor.raw_editor.unsaved_changes"
|
||||||
|
)
|
||||||
|
: this.hass!.localize(
|
||||||
|
"ui.panel.lovelace.editor.raw_editor.saved"
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
<mwc-button raised @click="${this._handleSave}"
|
||||||
|
>${this.hass!.localize(
|
||||||
|
"ui.panel.lovelace.editor.raw_editor.save"
|
||||||
|
)}</mwc-button
|
||||||
|
>
|
||||||
</app-toolbar>
|
</app-toolbar>
|
||||||
</app-header>
|
</app-header>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
@ -115,13 +128,11 @@ class LovelaceFullConfigEditor extends LitElement {
|
|||||||
|
|
||||||
.save-button {
|
.save-button {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
margin-left: -21px;
|
font-size: 14px;
|
||||||
transition: all 1.5s;
|
padding: 0px 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.saved {
|
.saved {
|
||||||
margin-left: initial;
|
|
||||||
margin-right: -8px;
|
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
|
@ -12,6 +12,7 @@ export interface Lovelace {
|
|||||||
config: LovelaceConfig;
|
config: LovelaceConfig;
|
||||||
editMode: boolean;
|
editMode: boolean;
|
||||||
mode: "generated" | "yaml" | "storage";
|
mode: "generated" | "yaml" | "storage";
|
||||||
|
language: string;
|
||||||
enableFullEditMode: () => void;
|
enableFullEditMode: () => void;
|
||||||
setEditMode: (editMode: boolean) => void;
|
setEditMode: (editMode: boolean) => void;
|
||||||
saveConfig: (newConfig: LovelaceConfig) => Promise<void>;
|
saveConfig: (newConfig: LovelaceConfig) => Promise<void>;
|
||||||
|
@ -1,9 +1,20 @@
|
|||||||
// Force file to be a module to augment global scope.
|
export const applyPolymerEvent = <T>(
|
||||||
export {};
|
ev: PolymerChangedEvent<T>,
|
||||||
|
curValue: T
|
||||||
|
): T => {
|
||||||
|
const { path, value } = ev.detail;
|
||||||
|
if (!path) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
const propName = path.split(".")[1];
|
||||||
|
return { ...curValue, [propName]: value };
|
||||||
|
};
|
||||||
|
|
||||||
export interface PolymerChangedEvent<T> extends Event {
|
export interface PolymerChangedEvent<T> extends Event {
|
||||||
detail: {
|
detail: {
|
||||||
value: T;
|
value: T;
|
||||||
|
path?: string;
|
||||||
|
queueProperty: boolean;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14,9 +25,6 @@ declare global {
|
|||||||
"iron-resize": undefined;
|
"iron-resize": undefined;
|
||||||
"config-refresh": undefined;
|
"config-refresh": undefined;
|
||||||
"ha-refresh-cloud-status": undefined;
|
"ha-refresh-cloud-status": undefined;
|
||||||
"hass-more-info": {
|
|
||||||
entityId: string;
|
|
||||||
};
|
|
||||||
"location-changed": undefined;
|
"location-changed": undefined;
|
||||||
"hass-notification": {
|
"hass-notification": {
|
||||||
message: string;
|
message: string;
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
"mailbox": "Mailbox",
|
"mailbox": "Mailbox",
|
||||||
"media_player": "Media player",
|
"media_player": "Media player",
|
||||||
"notify": "Notify",
|
"notify": "Notify",
|
||||||
|
"person": "Person",
|
||||||
"plant": "Plant",
|
"plant": "Plant",
|
||||||
"proximity": "Proximity",
|
"proximity": "Proximity",
|
||||||
"remote": "Remote",
|
"remote": "Remote",
|
||||||
@ -244,6 +245,10 @@
|
|||||||
"idle": "Idle",
|
"idle": "Idle",
|
||||||
"standby": "Standby"
|
"standby": "Standby"
|
||||||
},
|
},
|
||||||
|
"person": {
|
||||||
|
"home": "Home",
|
||||||
|
"not_home": "Away"
|
||||||
|
},
|
||||||
"plant": {
|
"plant": {
|
||||||
"ok": "[%key:state::binary_sensor::problem::off%]",
|
"ok": "[%key:state::binary_sensor::problem::off%]",
|
||||||
"problem": "[%key:state::binary_sensor::problem::on%]"
|
"problem": "[%key:state::binary_sensor::problem::on%]"
|
||||||
@ -344,6 +349,10 @@
|
|||||||
"device_tracker": {
|
"device_tracker": {
|
||||||
"home": "[%key:state::device_tracker::home%]",
|
"home": "[%key:state::device_tracker::home%]",
|
||||||
"not_home": "[%key:state::device_tracker::not_home%]"
|
"not_home": "[%key:state::device_tracker::not_home%]"
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"home": "[%key:state::person::home%]",
|
||||||
|
"not_home": "[%key:state::person::not_home%]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
@ -528,9 +537,6 @@
|
|||||||
"title": "Notifications"
|
"title": "Notifications"
|
||||||
},
|
},
|
||||||
"notification_toast": {
|
"notification_toast": {
|
||||||
"entity_turned_on": "Turned on {entity}.",
|
|
||||||
"entity_turned_off": "Turned off {entity}.",
|
|
||||||
"service_called": "Service {service} called.",
|
|
||||||
"service_call_failed": "Failed to call service {service}.",
|
"service_call_failed": "Failed to call service {service}.",
|
||||||
"connection_lost": "Connection lost. Reconnecting…"
|
"connection_lost": "Connection lost. Reconnecting…"
|
||||||
},
|
},
|
||||||
@ -548,7 +554,8 @@
|
|||||||
"picker": {
|
"picker": {
|
||||||
"header": "Area Registry",
|
"header": "Area Registry",
|
||||||
"introduction": "Areas are used to organize where devices are. This information will be used throughout Home Assistant to help you in organizing your interface, permissions and integrations with other systems.",
|
"introduction": "Areas are used to organize where devices are. This information will be used throughout Home Assistant to help you in organizing your interface, permissions and integrations with other systems.",
|
||||||
"introduction2": "To place devices in an area, use the link below to navigate to the integrations page and then click on a configured integration to get to the device cards."
|
"introduction2": "To place devices in an area, use the link below to navigate to the integrations page and then click on a configured integration to get to the device cards.",
|
||||||
|
"integrations_page": "Integrations page"
|
||||||
},
|
},
|
||||||
"no_areas": "Looks like you have no areas yet!",
|
"no_areas": "Looks like you have no areas yet!",
|
||||||
"create_area": "CREATE AREA",
|
"create_area": "CREATE AREA",
|
||||||
@ -604,6 +611,7 @@
|
|||||||
"picker": {
|
"picker": {
|
||||||
"header": "Automation Editor",
|
"header": "Automation Editor",
|
||||||
"introduction": "The automation editor allows you to create and edit automations. Please follow the link below to read the instructions to make sure that you have configured Home Assistant correctly.",
|
"introduction": "The automation editor allows you to create and edit automations. Please follow the link below to read the instructions to make sure that you have configured Home Assistant correctly.",
|
||||||
|
"learn_more": "Learn more about automations",
|
||||||
"pick_automation": "Pick automation to edit",
|
"pick_automation": "Pick automation to edit",
|
||||||
"no_automations": "We couldn’t find any editable automations",
|
"no_automations": "We couldn’t find any editable automations",
|
||||||
"add_automation": "Add automation"
|
"add_automation": "Add automation"
|
||||||
@ -616,7 +624,8 @@
|
|||||||
"alias": "Name",
|
"alias": "Name",
|
||||||
"triggers": {
|
"triggers": {
|
||||||
"header": "Triggers",
|
"header": "Triggers",
|
||||||
"introduction": "Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action. Click the link below to learn more about triggers.",
|
"introduction": "Triggers are what starts the processing of an automation rule. It is possible to specify multiple triggers for the same rule. Once a trigger starts, Home Assistant will validate the conditions, if any, and call the action.",
|
||||||
|
"learn_more": "Learn more about triggers",
|
||||||
"add": "Add trigger",
|
"add": "Add trigger",
|
||||||
"duplicate": "Duplicate",
|
"duplicate": "Duplicate",
|
||||||
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
||||||
@ -697,7 +706,8 @@
|
|||||||
},
|
},
|
||||||
"conditions": {
|
"conditions": {
|
||||||
"header": "Conditions",
|
"header": "Conditions",
|
||||||
"introduction": "Conditions are an optional part of an automation rule and can be used to prevent an action from happening when triggered. Conditions look very similar to triggers but are very different. A trigger will look at events happening in the system while a condition only looks at how the system looks right now. A trigger can observe that a switch is being turned on. A condition can only see if a switch is currently on or off. Click the link below to learn more about conditions.",
|
"introduction": "Conditions are an optional part of an automation rule and can be used to prevent an action from happening when triggered. Conditions look very similar to triggers but are very different. A trigger will look at events happening in the system while a condition only looks at how the system looks right now. A trigger can observe that a switch is being turned on. A condition can only see if a switch is currently on or off.",
|
||||||
|
"learn_more": "Learn more about conditions",
|
||||||
"add": "Add condition",
|
"add": "Add condition",
|
||||||
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]",
|
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]",
|
||||||
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
||||||
@ -742,7 +752,8 @@
|
|||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"header": "Actions",
|
"header": "Actions",
|
||||||
"introduction": "The actions are what Home Assistant will do when the automation is triggered. Click the link below to learn more about actions.",
|
"introduction": "The actions are what Home Assistant will do when the automation is triggered.",
|
||||||
|
"learn_more": "Learn more about actions",
|
||||||
"add": "Add action",
|
"add": "Add action",
|
||||||
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]",
|
"duplicate": "[%key:ui::panel::config::automation::editor::triggers::duplicate%]",
|
||||||
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
"delete": "[%key:ui::panel::mailbox::delete_button%]",
|
||||||
@ -791,6 +802,7 @@
|
|||||||
"header": "Entity Registry",
|
"header": "Entity Registry",
|
||||||
"introduction": "Home Assistant keeps a registry of every entity it has ever seen that can be uniquely identified. Each of these entities will have an entity ID assigned which will be reserved for just this entity.",
|
"introduction": "Home Assistant keeps a registry of every entity it has ever seen that can be uniquely identified. Each of these entities will have an entity ID assigned which will be reserved for just this entity.",
|
||||||
"introduction2": "Use the entity registry to override the name, change the entity ID or remove the entry from Home Assistant. Note, removing the entity registry entry won't remove the entity. To do that, follow the link below and remove it from the integrations page.",
|
"introduction2": "Use the entity registry to override the name, change the entity ID or remove the entry from Home Assistant. Note, removing the entity registry entry won't remove the entity. To do that, follow the link below and remove it from the integrations page.",
|
||||||
|
"integrations_page": "Integrations page",
|
||||||
"unavailable": "(unavailable)"
|
"unavailable": "(unavailable)"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
@ -897,6 +909,12 @@
|
|||||||
"menu": {
|
"menu": {
|
||||||
"raw_editor": "Raw config editor"
|
"raw_editor": "Raw config editor"
|
||||||
},
|
},
|
||||||
|
"raw_editor": {
|
||||||
|
"header": "Edit Config",
|
||||||
|
"save": "Save",
|
||||||
|
"unsaved_changes": "Unsaved changes",
|
||||||
|
"saved": "Saved"
|
||||||
|
},
|
||||||
"edit_view": {
|
"edit_view": {
|
||||||
"header": "View Configuration",
|
"header": "View Configuration",
|
||||||
"add": "Add view",
|
"add": "Add view",
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
import { PolymerElement } from "@polymer/polymer/polymer-element";
|
|
||||||
|
|
||||||
import EventsMixin from "../mixins/events-mixin";
|
|
||||||
|
|
||||||
/* eslint-disable no-console */
|
|
||||||
const DEBUG = false;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @appliesMixin EventsMixin
|
|
||||||
*/
|
|
||||||
class HaUrlSync extends EventsMixin(PolymerElement) {
|
|
||||||
static get properties() {
|
|
||||||
return {
|
|
||||||
hass: {
|
|
||||||
type: Object,
|
|
||||||
observer: "hassChanged",
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
hassChanged(newHass, oldHass) {
|
|
||||||
if (this.ignoreNextHassChange) {
|
|
||||||
if (DEBUG) console.log("ignore hasschange");
|
|
||||||
this.ignoreNextHassChange = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!oldHass || oldHass.moreInfoEntityId === newHass.moreInfoEntityId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (newHass.moreInfoEntityId) {
|
|
||||||
if (DEBUG) console.log("pushing state");
|
|
||||||
// We keep track of where we opened moreInfo from so that we don't
|
|
||||||
// pop the state when we close the modal if the modal has navigated
|
|
||||||
// us away.
|
|
||||||
this.moreInfoOpenedFromPath = window.location.pathname;
|
|
||||||
history.pushState(null, null, window.location.pathname);
|
|
||||||
} else if (window.location.pathname === this.moreInfoOpenedFromPath) {
|
|
||||||
if (DEBUG) console.log("history back");
|
|
||||||
this.ignoreNextPopstate = true;
|
|
||||||
history.back();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
popstateChangeListener(ev) {
|
|
||||||
if (this.ignoreNextPopstate) {
|
|
||||||
if (DEBUG) console.log("ignore popstate");
|
|
||||||
this.ignoreNextPopstate = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DEBUG) console.log("popstate", ev);
|
|
||||||
|
|
||||||
if (this.hass.moreInfoEntityId) {
|
|
||||||
if (DEBUG) console.log("deselect entity");
|
|
||||||
this.ignoreNextHassChange = true;
|
|
||||||
this.fire("hass-more-info", { entityId: null });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
connectedCallback() {
|
|
||||||
super.connectedCallback();
|
|
||||||
this.ignoreNextPopstate = false;
|
|
||||||
this.ignoreNextHassChange = false;
|
|
||||||
this.popstateChangeListener = this.popstateChangeListener.bind(this);
|
|
||||||
window.addEventListener("popstate", this.popstateChangeListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
disconnectedCallback() {
|
|
||||||
super.disconnectedCallback();
|
|
||||||
window.removeEventListener("popstate", this.popstateChangeListener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!__DEMO__) {
|
|
||||||
customElements.define("ha-url-sync", HaUrlSync);
|
|
||||||
}
|
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Включен",
|
"on": "Включен",
|
||||||
"paused": "Пауза",
|
"paused": "Пауза",
|
||||||
"returning": "Връщане в базовата станция"
|
"returning": "Връщане в базовата станция"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "активен",
|
||||||
|
"idle": "неработещ",
|
||||||
|
"paused": "в пауза"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -301,7 +306,8 @@
|
|||||||
"period": "Период"
|
"period": "Период"
|
||||||
},
|
},
|
||||||
"logbook": {
|
"logbook": {
|
||||||
"showing_entries": "Показване на записите за"
|
"showing_entries": "Показване на записите за",
|
||||||
|
"period": "Период"
|
||||||
},
|
},
|
||||||
"mailbox": {
|
"mailbox": {
|
||||||
"empty": "Нямате съобщения",
|
"empty": "Нямате съобщения",
|
||||||
@ -345,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Персонализиране",
|
"caption": "Персонализиране",
|
||||||
"description": "Персонализирайте Вашите обекти"
|
"description": "Персонализирайте Вашите обекти",
|
||||||
|
"picker": {
|
||||||
|
"header": "Персонализиране",
|
||||||
|
"introduction": "Настройте атрибутите за всеки обект. Добавени\/редактирани персонализации ще имат ефект, когато обектът бъде опреснен."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Автоматизация",
|
"caption": "Автоматизация",
|
||||||
@ -433,6 +443,14 @@
|
|||||||
"hours": "Часове",
|
"hours": "Часове",
|
||||||
"minutes": "Минути",
|
"minutes": "Минути",
|
||||||
"seconds": "Секунди"
|
"seconds": "Секунди"
|
||||||
|
},
|
||||||
|
"geo_location": {
|
||||||
|
"label": "Местоположение",
|
||||||
|
"source": "Източник",
|
||||||
|
"zone": "Зона",
|
||||||
|
"event": "Събитие:",
|
||||||
|
"enter": "Влизане",
|
||||||
|
"leave": "Излизане"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -535,7 +553,15 @@
|
|||||||
"change_password": "Смяна на парола",
|
"change_password": "Смяна на парола",
|
||||||
"activate_user": "Активиране на потребител",
|
"activate_user": "Активиране на потребител",
|
||||||
"deactivate_user": "Деактивиране на потребителя",
|
"deactivate_user": "Деактивиране на потребителя",
|
||||||
"delete_user": "Изтриване на потребител"
|
"delete_user": "Изтриване на потребител",
|
||||||
|
"caption": "Преглед на потребителя"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Добавяне на потребител",
|
||||||
|
"name": "Име",
|
||||||
|
"username": "Потребителско име",
|
||||||
|
"password": "Парола",
|
||||||
|
"create": "Създай"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -560,12 +586,59 @@
|
|||||||
"hub": "Свързан чрез",
|
"hub": "Свързан чрез",
|
||||||
"firmware": "Фърмуер: {version}",
|
"firmware": "Фърмуер: {version}",
|
||||||
"device_unavailable": "Устройството е недостъпно",
|
"device_unavailable": "Устройството е недостъпно",
|
||||||
"entity_unavailable": "Недостъпен"
|
"entity_unavailable": "Недостъпен",
|
||||||
|
"no_area": "Без област"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
"caption": "ZHA",
|
"caption": "ZHA",
|
||||||
"description": "Управление на Zigbee мрежата за домашна автоматизация"
|
"description": "Управление на Zigbee мрежата за домашна автоматизация",
|
||||||
|
"services": {
|
||||||
|
"reconfigure": "Преконфигурирайте ZHA устройство (оздравяване на устройство). Използвайте това, ако имате проблеми с устройството. Ако въпросното устройство е захранвано с батерии, моля, уверете се, че е будно и приема команди, когато използвате тази услуга."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"area_registry": {
|
||||||
|
"caption": "Регистър на областите",
|
||||||
|
"description": "Преглед на всички области във Вашия дом.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Регистър на областите",
|
||||||
|
"introduction": "Областите се използват за организиране на местоположението на устройствата. Тази информация ще се използва в Home Assistant, за да ви помогне при организирането на Вашия интерфейс, права за достъп и интеграции с други системи.",
|
||||||
|
"introduction2": "За да поставите устройства в дадена област, използвайте връзката по-долу, за да отидете на страницата за интеграции, след което кликнете върху конфигурирана интеграция, за да видите картите на устройството."
|
||||||
|
},
|
||||||
|
"no_areas": "Изглежда, че все още нямате области!",
|
||||||
|
"create_area": "СЪЗДАВАНЕ НА ОБЛАСТ",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Нова област",
|
||||||
|
"delete": "ИЗТРИВАНЕ",
|
||||||
|
"update": "АКТУАЛИЗАЦИЯ",
|
||||||
|
"create": "СЪЗДАВАНЕ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"entity_registry": {
|
||||||
|
"caption": "Регистър на обектите",
|
||||||
|
"description": "Преглед на всички известни обекти.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Регистър на обектите",
|
||||||
|
"unavailable": "(недостъпен)",
|
||||||
|
"introduction": "Home Assistant поддържа регистър на всички обекти, които някога е виждал, които могат да бъдат идентифицирани уникално. Всеки от тези обекти ще има идентификатор на обект, който ще бъде резервиран само за този обект.",
|
||||||
|
"introduction2": "Използвайте регистъра на обектите, за да промените името, идентификатора на обекта или да премахнете записа от Home Assistant. Моля имайте на предвид, че премахването на записа от регистъра на обектите няма да премахне обекта. За да направите това, следвайте препратката по-долу и я премахнете от страницата за интеграции."
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Този обект не е достъпeн към момента.",
|
||||||
|
"default_name": "Нова област",
|
||||||
|
"delete": "ИЗТРИВАНЕ",
|
||||||
|
"update": "АКТУАЛИЗАЦИЯ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Хора",
|
||||||
|
"description": "Управлявайте хората, които следите от Home Assistant.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Име",
|
||||||
|
"device_tracker_intro": "Изберете устройствата, които принадлежат на това лице.",
|
||||||
|
"device_tracker_picked": "Устройство за проследяване",
|
||||||
|
"device_tracker_pick": "Изберете устройство за проследяване"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@ -710,6 +783,24 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"command_line": {
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "Потребителско име",
|
||||||
|
"password": "Парола"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "Дву-факторен код за аутентикация"
|
||||||
|
},
|
||||||
|
"description": "Отворете **{mfa_module_name}** на Вашето устройство за да видите Вашия дву-факторен код за аутентикация и да удостоверите Вашата идентичност:"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "Невалидно потребителско име или парола",
|
||||||
|
"invalid_code": "Невалиден код за аутентикация"
|
||||||
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"login_expired": "Сесията изтече, моля влезте отново."
|
"login_expired": "Сесията изтече, моля влезте отново."
|
||||||
}
|
}
|
||||||
@ -739,6 +830,11 @@
|
|||||||
"checked_items": "Отметнати артикули",
|
"checked_items": "Отметнати артикули",
|
||||||
"clear_items": "Изтрий отметнатите артикули",
|
"clear_items": "Изтрий отметнатите артикули",
|
||||||
"add_item": "Добави артикул"
|
"add_item": "Добави артикул"
|
||||||
|
},
|
||||||
|
"empty_state": {
|
||||||
|
"title": "Добре дошли у дома",
|
||||||
|
"no_devices": "Тази страница ви позволява да контролирате устройствата си, но изглежда, че все още нямате настроени устройства. Отидете на страницата за интеграции, за да започнете.",
|
||||||
|
"go_to_integrations_page": "Отидете на страницата за интеграции."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
@ -749,7 +845,8 @@
|
|||||||
"pick_card": "Изберете картата, която искате да добавите.",
|
"pick_card": "Изберете картата, която искате да добавите.",
|
||||||
"add": "Добавяне на карта",
|
"add": "Добавяне на карта",
|
||||||
"edit": "Редактиране",
|
"edit": "Редактиране",
|
||||||
"delete": "Изтриване"
|
"delete": "Изтриване",
|
||||||
|
"move": "Премести"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Несъвместима конфигурация",
|
"header": "Несъвместима конфигурация",
|
||||||
@ -770,10 +867,20 @@
|
|||||||
"para_sure": "Наистина ли искате да поемете управлението на потребителския интерфейс?",
|
"para_sure": "Наистина ли искате да поемете управлението на потребителския интерфейс?",
|
||||||
"cancel": "Няма значение",
|
"cancel": "Няма значение",
|
||||||
"save": "Поемете контрола"
|
"save": "Поемете контрола"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"raw_editor": "Текстов редактор на конфурацията"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"configure_ui": "Конфигуриране на потребителския интерфейс"
|
"configure_ui": "Конфигуриране на потребителския интерфейс",
|
||||||
|
"unused_entities": "Неизползвани обекти",
|
||||||
|
"help": "Помощ",
|
||||||
|
"refresh": "Обновяване"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Обектът е недостъпен: {entity}",
|
||||||
|
"entity_non_numeric": "Обектът не е числов: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -846,7 +953,8 @@
|
|||||||
"arm_home": "Под охрана - вкъщи",
|
"arm_home": "Под охрана - вкъщи",
|
||||||
"arm_away": "Под охрана",
|
"arm_away": "Под охрана",
|
||||||
"arm_night": "Под охрана - нощ",
|
"arm_night": "Под охрана - нощ",
|
||||||
"armed_custom_bypass": "Потребителски байпас"
|
"armed_custom_bypass": "Потребителски байпас",
|
||||||
|
"arm_custom_bypass": "Потребителски байпас"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Последно задействане",
|
"last_triggered": "Последно задействане",
|
||||||
@ -1006,7 +1114,11 @@
|
|||||||
"weblink": "Уеб връзка",
|
"weblink": "Уеб връзка",
|
||||||
"zwave": "Z-Wave",
|
"zwave": "Z-Wave",
|
||||||
"vacuum": "Прахосмукачка",
|
"vacuum": "Прахосмукачка",
|
||||||
"zha": "ZHA"
|
"zha": "ZHA",
|
||||||
|
"hassio": "Hass.io",
|
||||||
|
"homeassistant": "Home Assistant",
|
||||||
|
"lovelace": "Lovelace",
|
||||||
|
"system_health": "Здраве на системата"
|
||||||
},
|
},
|
||||||
"attribute": {
|
"attribute": {
|
||||||
"weather": {
|
"weather": {
|
||||||
@ -1014,5 +1126,14 @@
|
|||||||
"visibility": "Видимост",
|
"visibility": "Видимост",
|
||||||
"wind_speed": "Скорост на вятъра"
|
"wind_speed": "Скорост на вятъра"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Изключен",
|
||||||
|
"on": "Включен",
|
||||||
|
"auto": "Автоматичен"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -133,8 +133,8 @@
|
|||||||
"climate": {
|
"climate": {
|
||||||
"off": "Apagat",
|
"off": "Apagat",
|
||||||
"on": "Encès",
|
"on": "Encès",
|
||||||
"heat": "Escalfar",
|
"heat": "Calent",
|
||||||
"cool": "Refredar",
|
"cool": "Fred",
|
||||||
"idle": "Inactiu",
|
"idle": "Inactiu",
|
||||||
"auto": "Automàtic",
|
"auto": "Automàtic",
|
||||||
"dry": "Assecar",
|
"dry": "Assecar",
|
||||||
@ -601,7 +601,9 @@
|
|||||||
"caption": "Registre d'àrees",
|
"caption": "Registre d'àrees",
|
||||||
"description": "Visió general de totes les àrees de la casa.",
|
"description": "Visió general de totes les àrees de la casa.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Registre d'àrees"
|
"header": "Registre d'àrees",
|
||||||
|
"introduction": "Les àrees s'utilitzen per organitzar la situació dels dispositius. Aquesta informació serà utilitzada per Home Assistant per ajudar-te a organitzar millor la teva interfície, els permisos i les integracions amb d'altres sistemes.",
|
||||||
|
"introduction2": "Per col·locar dispositius en una àrea, utilitza l'enllaç de sota per anar a la pàgina d'integracions i, a continuació, fes clic a una integració configurada per accedir a les targetes del dispositiu."
|
||||||
},
|
},
|
||||||
"no_areas": "Sembla que encara no tens cap àrea, encara.",
|
"no_areas": "Sembla que encara no tens cap àrea, encara.",
|
||||||
"create_area": "CREA ÀREA",
|
"create_area": "CREA ÀREA",
|
||||||
@ -617,7 +619,9 @@
|
|||||||
"description": "Visió general de totes les entitats conegudes.",
|
"description": "Visió general de totes les entitats conegudes.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Registre d'entitats",
|
"header": "Registre d'entitats",
|
||||||
"unavailable": "(no disponible)"
|
"unavailable": "(no disponible)",
|
||||||
|
"introduction": "Home Assistant manté un registre de totes les entitats que ha detectat alguna vegada les quals tenen una identificació única. Cadascuna d'aquestes entitats té un identificador (ID) assignat que està reservat només per a ella.",
|
||||||
|
"introduction2": "Utilitza el registre d'entitats per canviar el nom, canviar l'ID o eliminar l'entrada de Home Assistant de les entitats. Tingues en compte que eliminar-les del registre d'entitats no eliminarà l'entitat. Per fer-ho, segueix l'enllaç següent i elimineu-la dins la pàgina d'integracions."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Aquesta entitat no està disponible actualment.",
|
"unavailable": "Aquesta entitat no està disponible actualment.",
|
||||||
|
@ -265,6 +265,11 @@
|
|||||||
"on": "An",
|
"on": "An",
|
||||||
"paused": "Pausiert",
|
"paused": "Pausiert",
|
||||||
"returning": "Rückkehr zur Dockingstation"
|
"returning": "Rückkehr zur Dockingstation"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktiv",
|
||||||
|
"idle": "Leerlauf",
|
||||||
|
"paused": "pausiert"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -348,7 +353,8 @@
|
|||||||
"caption": "Anpassung",
|
"caption": "Anpassung",
|
||||||
"description": "Elemente anpassen",
|
"description": "Elemente anpassen",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Anpassung"
|
"header": "Anpassung",
|
||||||
|
"introduction": "Optimieren Sie die Entitätenattribute. Hinzugefügte \/ bearbeitete Anpassungen werden sofort wirksam. Entfernte Anpassungen werden wirksam, wenn die Entität aktualisiert wird."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
@ -547,7 +553,15 @@
|
|||||||
"change_password": "Passwort ändern",
|
"change_password": "Passwort ändern",
|
||||||
"activate_user": "Benutzer aktivieren",
|
"activate_user": "Benutzer aktivieren",
|
||||||
"deactivate_user": "Benutzer deaktivieren",
|
"deactivate_user": "Benutzer deaktivieren",
|
||||||
"delete_user": "Benutzer löschen"
|
"delete_user": "Benutzer löschen",
|
||||||
|
"caption": "Benutzer anzeigen"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Benutzer hinzufügen",
|
||||||
|
"name": "Name",
|
||||||
|
"username": "Benutzername",
|
||||||
|
"password": "Passwort",
|
||||||
|
"create": "Benutzerkonto anlegen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -584,8 +598,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
"caption": "Gebietsregister",
|
"caption": "Bereichsregister",
|
||||||
"description": "Überblick über alle Bereiche in Deinem Haus.",
|
"description": "Überblick über alle Bereiche in Deinem Haus.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Bereichsregister",
|
||||||
|
"introduction": "In Bereichen wird festgelegt, wo sich Geräte befinden. Diese Informationen werden in Home Assistant verwendet, um dich bei der Organisation deiner Benutzeroberfläche, Berechtigungen und Integrationen mit anderen Systemen zu unterstützen.",
|
||||||
|
"introduction2": "Um Geräte in einem Bereich zu platzieren, navigieren Sie mit dem Link unten zur Integrationsseite und klicken Sie dann auf eine konfigurierte Integration, um zu den Gerätekarten zu gelangen."
|
||||||
|
},
|
||||||
"no_areas": "Sieht aus, als hättest du noch keine Bereiche!",
|
"no_areas": "Sieht aus, als hättest du noch keine Bereiche!",
|
||||||
"create_area": "BEREICH ERSTELLEN",
|
"create_area": "BEREICH ERSTELLEN",
|
||||||
"editor": {
|
"editor": {
|
||||||
@ -599,7 +618,10 @@
|
|||||||
"caption": "Entitätsregister",
|
"caption": "Entitätsregister",
|
||||||
"description": "Überblick aller bekannten Elemente.",
|
"description": "Überblick aller bekannten Elemente.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"unavailable": "(nicht verfügbar)"
|
"header": "Entitätsregister",
|
||||||
|
"unavailable": "(nicht verfügbar)",
|
||||||
|
"introduction": "Der Home Assistant führt eine Registrierung aller Entitäten, die er je gesehen hat und die eindeutig identifiziert werden können. Jeder dieser Entitäten wird eine Entitäts-ID zugewiesen, die nur für diese Entität reserviert ist.",
|
||||||
|
"introduction2": "Verwende die Entitätsregistrierung, um den Namen zu überschreiben, die Entitäts-ID zu ändern oder den Eintrag aus dem Home Assistant zu entfernen. Beachte, dass das Entfernen des Entitätsregistrierungseintrags die Entität nicht löscht. Folge dazu dem Link unten und entferne ihn in der Integrationsseite."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Diese Entität ist derzeit nicht verfügbar.",
|
"unavailable": "Diese Entität ist derzeit nicht verfügbar.",
|
||||||
@ -855,6 +877,10 @@
|
|||||||
"unused_entities": "Ungenutzte Elemente",
|
"unused_entities": "Ungenutzte Elemente",
|
||||||
"help": "Hilfe",
|
"help": "Hilfe",
|
||||||
"refresh": "Aktualisieren"
|
"refresh": "Aktualisieren"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entität nicht verfügbar: {entity}",
|
||||||
|
"entity_non_numeric": "Die Entität ist nicht-numerisch: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -927,7 +953,8 @@
|
|||||||
"arm_home": "Aktivieren, Zuhause",
|
"arm_home": "Aktivieren, Zuhause",
|
||||||
"arm_away": "Aktivieren, unterwegs",
|
"arm_away": "Aktivieren, unterwegs",
|
||||||
"arm_night": "Nacht aktiviert",
|
"arm_night": "Nacht aktiviert",
|
||||||
"armed_custom_bypass": "Benutzerdefinierter Bypass"
|
"armed_custom_bypass": "Benutzerdefinierter Bypass",
|
||||||
|
"arm_custom_bypass": "Benutzerdefinierter Bypass"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Zuletzt ausgelöst",
|
"last_triggered": "Zuletzt ausgelöst",
|
||||||
@ -1099,5 +1126,14 @@
|
|||||||
"visibility": "Sichtweite",
|
"visibility": "Sichtweite",
|
||||||
"wind_speed": "Windgeschwindigkeit"
|
"wind_speed": "Windgeschwindigkeit"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Aus",
|
||||||
|
"on": "An",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -138,7 +138,7 @@
|
|||||||
"idle": "Inactivo",
|
"idle": "Inactivo",
|
||||||
"auto": "Automatico",
|
"auto": "Automatico",
|
||||||
"dry": "Seco",
|
"dry": "Seco",
|
||||||
"fan_only": "Solo Ventilador",
|
"fan_only": "Sólo ventilador",
|
||||||
"eco": "Eco",
|
"eco": "Eco",
|
||||||
"electric": "Electrico",
|
"electric": "Electrico",
|
||||||
"performance": "Rendimiento",
|
"performance": "Rendimiento",
|
||||||
@ -442,7 +442,7 @@
|
|||||||
"label": "Patrón de tiempo",
|
"label": "Patrón de tiempo",
|
||||||
"hours": "Horas",
|
"hours": "Horas",
|
||||||
"minutes": "Minutos",
|
"minutes": "Minutos",
|
||||||
"seconds": "Hass.io"
|
"seconds": "Segundos"
|
||||||
},
|
},
|
||||||
"geo_location": {
|
"geo_location": {
|
||||||
"label": "Geolocalización",
|
"label": "Geolocalización",
|
||||||
@ -478,8 +478,8 @@
|
|||||||
"label": "Sol",
|
"label": "Sol",
|
||||||
"before": "Antes de:",
|
"before": "Antes de:",
|
||||||
"after": "Después de:",
|
"after": "Después de:",
|
||||||
"before_offset": "Antes de compensan (opcional)",
|
"before_offset": "Antes del intervalo (opcional)",
|
||||||
"after_offset": "Después de compensación (opcional)",
|
"after_offset": "Después del intervalo (opcional)",
|
||||||
"sunrise": "Salida del sol",
|
"sunrise": "Salida del sol",
|
||||||
"sunset": "Puesta de sol"
|
"sunset": "Puesta de sol"
|
||||||
},
|
},
|
||||||
@ -1018,7 +1018,7 @@
|
|||||||
},
|
},
|
||||||
"relative_time": {
|
"relative_time": {
|
||||||
"past": "Hace {time}",
|
"past": "Hace {time}",
|
||||||
"future": "En {time}",
|
"future": "en {time}",
|
||||||
"never": "Nunca",
|
"never": "Nunca",
|
||||||
"duration": {
|
"duration": {
|
||||||
"second": "{count} {count, plural,\n one {segundo}\n other {segundos}\n}",
|
"second": "{count} {count, plural,\n one {segundo}\n other {segundos}\n}",
|
||||||
@ -1052,8 +1052,8 @@
|
|||||||
},
|
},
|
||||||
"sun": {
|
"sun": {
|
||||||
"elevation": "Elevación",
|
"elevation": "Elevación",
|
||||||
"rising": "Salida",
|
"rising": "Salida del sol",
|
||||||
"setting": "Puesta"
|
"setting": "Puesta del sol"
|
||||||
},
|
},
|
||||||
"updater": {
|
"updater": {
|
||||||
"title": "Instrucciones de actualización"
|
"title": "Instrucciones de actualización"
|
||||||
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Encendido",
|
"on": "Encendido",
|
||||||
"paused": "En pausa",
|
"paused": "En pausa",
|
||||||
"returning": "Volviendo a la base"
|
"returning": "Volviendo a la base"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "activo",
|
||||||
|
"idle": "inactivo",
|
||||||
|
"paused": "pausado"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -346,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Personalización",
|
"caption": "Personalización",
|
||||||
"description": "Personaliza tus entidades"
|
"description": "Personaliza tus entidades",
|
||||||
|
"picker": {
|
||||||
|
"header": "Personalización",
|
||||||
|
"introduction": "Ajustar los atributos de cada entidad. Las personalizaciones añadidas\/editadas tendrán efecto inmediatamente. Las personalizaciones eliminadas tendrán efecto cuando la entidad se actualice."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Automatización",
|
"caption": "Automatización",
|
||||||
@ -544,7 +553,15 @@
|
|||||||
"change_password": "Cambia la contraseña",
|
"change_password": "Cambia la contraseña",
|
||||||
"activate_user": "Activar usuario",
|
"activate_user": "Activar usuario",
|
||||||
"deactivate_user": "Desactivar usuario",
|
"deactivate_user": "Desactivar usuario",
|
||||||
"delete_user": "Borrar usuario"
|
"delete_user": "Borrar usuario",
|
||||||
|
"caption": "Ver usuario"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Añadir usuario",
|
||||||
|
"name": "Nombre",
|
||||||
|
"username": "Nombre de usuario",
|
||||||
|
"password": "Contraseña",
|
||||||
|
"create": "Crear"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -569,7 +586,8 @@
|
|||||||
"hub": "Conectado a través de",
|
"hub": "Conectado a través de",
|
||||||
"firmware": "Firmware: {version}",
|
"firmware": "Firmware: {version}",
|
||||||
"device_unavailable": "dispositivo no disponible",
|
"device_unavailable": "dispositivo no disponible",
|
||||||
"entity_unavailable": "entidad no disponible"
|
"entity_unavailable": "entidad no disponible",
|
||||||
|
"no_area": "Ninguna área"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
@ -581,11 +599,46 @@
|
|||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
"caption": "Registro de área",
|
"caption": "Registro de área",
|
||||||
"description": "Visión general de todas las áreas de tu casa."
|
"description": "Visión general de todas las áreas de tu casa.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Registro de Área",
|
||||||
|
"introduction": "Las áreas se utilizan para organizar dónde están los dispositivos. Esta información se utilizará en Home Assistant para ayudarle a organizar su interfaz, permisos e integraciones con otros sistemas.",
|
||||||
|
"introduction2": "Para colocar dispositivos en un área, utilice el siguiente enlace para navegar a la página de integraciones y luego haga clic en una integración configurada para llegar a las tarjetas de dispositivos."
|
||||||
|
},
|
||||||
|
"no_areas": "¡Parece que no tienes áreas!",
|
||||||
|
"create_area": "CREAR ÁREA",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Área Nueva",
|
||||||
|
"delete": "BORRAR",
|
||||||
|
"update": "ACTUALIZAR",
|
||||||
|
"create": "CREAR"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Registro de Entidades",
|
"caption": "Registro de Entidades",
|
||||||
"description": "Resumen de todas las entidades conocidas."
|
"description": "Resumen de todas las entidades conocidas.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Registro de Entidades",
|
||||||
|
"unavailable": "(no disponible)",
|
||||||
|
"introduction": "Home Assistant mantiene un registro de cada entidad que ha visto. Cada una de estas entidades tendrá una identificación asignada que se reservará sólo para esta entidad.",
|
||||||
|
"introduction2": "Utilice el registro de entidades para anular el nombre, cambiar el ID de la entidad o eliminar la entrada de Home Assistant. Nota: la eliminación de la entrada del registro de entidades no eliminará la entidad. Para ello, siga el siguiente enlace y elimínelo de la página de integraciones."
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Esta entidad no está disponible actualmente.",
|
||||||
|
"default_name": "Área Nueva",
|
||||||
|
"delete": "BORRAR",
|
||||||
|
"update": "ACTUALIZAR"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Personas",
|
||||||
|
"description": "Gestiona las personas que rastrea Home Assistant.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Nombre",
|
||||||
|
"device_tracker_intro": "Seleccione los dispositivos que pertenecen a esta persona.",
|
||||||
|
"device_tracker_picked": "Rastrear dispositivo",
|
||||||
|
"device_tracker_pick": "Seleccionar dispositivo para rastrear"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@ -792,7 +845,8 @@
|
|||||||
"pick_card": "Escoge la tarjeta que desea agregar.",
|
"pick_card": "Escoge la tarjeta que desea agregar.",
|
||||||
"add": "Añadir tarjeta",
|
"add": "Añadir tarjeta",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"delete": "Eliminar"
|
"delete": "Eliminar",
|
||||||
|
"move": "Mover"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Configuración incompatible",
|
"header": "Configuración incompatible",
|
||||||
@ -823,6 +877,10 @@
|
|||||||
"unused_entities": "Entidades no utilizadas",
|
"unused_entities": "Entidades no utilizadas",
|
||||||
"help": "Ayuda",
|
"help": "Ayuda",
|
||||||
"refresh": "Refrescar"
|
"refresh": "Refrescar"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "La entidad no esta disponible: {entity}",
|
||||||
|
"entity_non_numeric": "La entidad no es numérica: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -895,7 +953,8 @@
|
|||||||
"arm_home": "Armar en casa",
|
"arm_home": "Armar en casa",
|
||||||
"arm_away": "Armar fuera de casa",
|
"arm_away": "Armar fuera de casa",
|
||||||
"arm_night": "Armado nocturno",
|
"arm_night": "Armado nocturno",
|
||||||
"armed_custom_bypass": "Armada zona específica"
|
"armed_custom_bypass": "Armada zona específica",
|
||||||
|
"arm_custom_bypass": "Bypass personalizada"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Última activación",
|
"last_triggered": "Última activación",
|
||||||
@ -1067,5 +1126,14 @@
|
|||||||
"visibility": "Visibilidad",
|
"visibility": "Visibilidad",
|
||||||
"wind_speed": "Velocidad del viento"
|
"wind_speed": "Velocidad del viento"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Apagado",
|
||||||
|
"on": "Prendido",
|
||||||
|
"auto": "Automatico"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "On",
|
"on": "On",
|
||||||
"paused": "En pause",
|
"paused": "En pause",
|
||||||
"returning": "Retourne à la base"
|
"returning": "Retourne à la base"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "actif",
|
||||||
|
"idle": "En veille",
|
||||||
|
"paused": "en pause"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -346,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Personnalisation",
|
"caption": "Personnalisation",
|
||||||
"description": "Personnalisez vos entités"
|
"description": "Personnalisez vos entités",
|
||||||
|
"picker": {
|
||||||
|
"header": "Personnalisation",
|
||||||
|
"introduction": "Ajuster les attributs par entité. Les personnalisations ajoutées \/ modifiées prendront effet immédiatement. Les personnalisations supprimées prendront effet lors de la mise à jour de l'entité."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Automatisation",
|
"caption": "Automatisation",
|
||||||
@ -544,7 +553,15 @@
|
|||||||
"change_password": "Changer le mot de passe",
|
"change_password": "Changer le mot de passe",
|
||||||
"activate_user": "Activer l'utilisateur",
|
"activate_user": "Activer l'utilisateur",
|
||||||
"deactivate_user": "Désactiver l'utilisateur",
|
"deactivate_user": "Désactiver l'utilisateur",
|
||||||
"delete_user": "Supprimer l'utilisateur"
|
"delete_user": "Supprimer l'utilisateur",
|
||||||
|
"caption": "Voir l'utilisateur"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Ajouter un utilisateur",
|
||||||
|
"name": "Nom",
|
||||||
|
"username": "Nom d'utilisateur",
|
||||||
|
"password": "Mot de passe",
|
||||||
|
"create": "Créer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -584,7 +601,9 @@
|
|||||||
"caption": "Registre des pièces",
|
"caption": "Registre des pièces",
|
||||||
"description": "Vue d'ensemble de toutes les pièces de votre maison.",
|
"description": "Vue d'ensemble de toutes les pièces de votre maison.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Registre des pièces"
|
"header": "Registre des pièces",
|
||||||
|
"introduction": "Les zones sont utilisées pour organiser l'emplacement des périphériques. Ces informations seront utilisées partout dans Home Assistant pour vous aider à organiser votre interface, vos autorisations et vos intégrations avec d'autres systèmes.",
|
||||||
|
"introduction2": "Pour placer des périphériques dans une zone, utilisez le lien ci-dessous pour accéder à la page des intégrations, puis cliquez sur une intégration configurée pour accéder aux cartes de périphérique."
|
||||||
},
|
},
|
||||||
"no_areas": "Vous n'avez pas encore configuré de pièce !",
|
"no_areas": "Vous n'avez pas encore configuré de pièce !",
|
||||||
"create_area": "CRÉER UNE PIÈCE",
|
"create_area": "CRÉER UNE PIÈCE",
|
||||||
@ -598,11 +617,28 @@
|
|||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Registre des entités",
|
"caption": "Registre des entités",
|
||||||
"description": "Vue d'ensemble de toutes les entités connues.",
|
"description": "Vue d'ensemble de toutes les entités connues.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Registre des entités",
|
||||||
|
"unavailable": "(indisponible)",
|
||||||
|
"introduction": "Home Assistant tient un registre de chaque entité qu'il n’a jamais vue et qui peut être identifié de manière unique. Chacune de ces entités se verra attribuer un identifiant qui sera réservé à cette seule entité.",
|
||||||
|
"introduction2": "Utilisez le registre d'entités pour remplacer le nom, modifier l'ID d'entité ou supprimer l'entrée d'Home Assistant. Remarque: la suppression de l'entrée de registre d'entité ne supprime pas l'entité. Pour ce faire, suivez le lien ci-dessous et supprimez-le de la page des intégrations."
|
||||||
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
|
"unavailable": "Cette entité n'est pas disponible actuellement.",
|
||||||
"default_name": "Nouvelle pièce",
|
"default_name": "Nouvelle pièce",
|
||||||
"delete": "SUPPRIMER",
|
"delete": "SUPPRIMER",
|
||||||
"update": "METTRE À JOUR"
|
"update": "METTRE À JOUR"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Personnes",
|
||||||
|
"description": "Gérez les personnes suivies par Home Assistant.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Nom",
|
||||||
|
"device_tracker_intro": "Sélectionnez les appareils appartenant à cette personne.",
|
||||||
|
"device_tracker_picked": "Appareil suivi",
|
||||||
|
"device_tracker_pick": "Choisissez le périphérique à suivre"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@ -841,6 +877,10 @@
|
|||||||
"unused_entities": "Entités inutilisées",
|
"unused_entities": "Entités inutilisées",
|
||||||
"help": "Aide",
|
"help": "Aide",
|
||||||
"refresh": "Actualiser"
|
"refresh": "Actualiser"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entité non disponible: {entity}",
|
||||||
|
"entity_non_numeric": "L'entité est non numérique: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -913,7 +953,8 @@
|
|||||||
"arm_home": "Armer (domicile)",
|
"arm_home": "Armer (domicile)",
|
||||||
"arm_away": "Armer (absent)",
|
"arm_away": "Armer (absent)",
|
||||||
"arm_night": "Armer nuit",
|
"arm_night": "Armer nuit",
|
||||||
"armed_custom_bypass": "Bypass personnalisé"
|
"armed_custom_bypass": "Bypass personnalisé",
|
||||||
|
"arm_custom_bypass": "Bypass personnalisé"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Dernier déclenchement",
|
"last_triggered": "Dernier déclenchement",
|
||||||
@ -1085,5 +1126,14 @@
|
|||||||
"visibility": "Visibilité",
|
"visibility": "Visibilité",
|
||||||
"wind_speed": "Vitesse du vent"
|
"wind_speed": "Vitesse du vent"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Off",
|
||||||
|
"on": "On",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -916,7 +916,7 @@
|
|||||||
"activate": "הפעל"
|
"activate": "הפעל"
|
||||||
},
|
},
|
||||||
"script": {
|
"script": {
|
||||||
"execute": "ביצוע"
|
"execute": "הפעל"
|
||||||
},
|
},
|
||||||
"weather": {
|
"weather": {
|
||||||
"attributes": {
|
"attributes": {
|
||||||
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Be",
|
"on": "Be",
|
||||||
"paused": "Felfüggesztve",
|
"paused": "Felfüggesztve",
|
||||||
"returning": "Dokkolás folyamatban"
|
"returning": "Dokkolás folyamatban"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktív",
|
||||||
|
"idle": "tétlen",
|
||||||
|
"paused": "szüneteltetve"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -348,7 +353,8 @@
|
|||||||
"caption": "Testreszabás",
|
"caption": "Testreszabás",
|
||||||
"description": "Entitások testreszabása",
|
"description": "Entitások testreszabása",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Testreszabás"
|
"header": "Testreszabás",
|
||||||
|
"introduction": "Szabd testre az entitások tulajdonságait. A hozzáadott\/szerkesztett testreszabások azonnal érvényesülnek. A testreszabások eltávolítása akkor lép életbe, amikor az entitás frissül."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
@ -356,7 +362,7 @@
|
|||||||
"description": "Automatizálások létrehozása és szerkesztése",
|
"description": "Automatizálások létrehozása és szerkesztése",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Automatizálás szerkesztő",
|
"header": "Automatizálás szerkesztő",
|
||||||
"introduction": "Az automatizálás szerkesztővel automatizálási szabályokat tudsz létrehozni és szerkeszteni. Kérlek olvasd el az [útmutatót](https:\/\/home-assistant.io\/docs\/automation\/editor\/), hogy megbizonyosodj róla, hogy a Home Assistant helyesen van konfigurálva.",
|
"introduction": "Az automatizálás szerkesztővel automatizálási szabályokat tudsz létrehozni és szerkeszteni. Kérlek olvasd el az útmutatót az alábbi linken, hogy megbizonyosodj róla, hogy a Home Assistant helyesen van konfigurálva.",
|
||||||
"pick_automation": "Válassz ki egy automatizálást szerkesztésre",
|
"pick_automation": "Válassz ki egy automatizálást szerkesztésre",
|
||||||
"no_automations": "Nem találtunk szerkeszthető automatizálást",
|
"no_automations": "Nem találtunk szerkeszthető automatizálást",
|
||||||
"add_automation": "Automatizálás hozzáadása"
|
"add_automation": "Automatizálás hozzáadása"
|
||||||
@ -369,7 +375,7 @@
|
|||||||
"alias": "Név",
|
"alias": "Név",
|
||||||
"triggers": {
|
"triggers": {
|
||||||
"header": "Triggerek",
|
"header": "Triggerek",
|
||||||
"introduction": "Az eseményindítók (triggerek) indítják el az automatizálási szabályok feldolgozását. Több triggert is meg lehet adni egy szabályhoz. Ha egy trigger elindul, akkor a Home Assistant ellenőrzi a feltételeket - ha vannak -, majd meghívja a műveletet.\n\n[Tudj meg többet a triggerekről.](https:\/\/home-assistant.io\/docs\/automation\/trigger\/)",
|
"introduction": "Az eseményindítók (triggerek) indítják el az automatizálási szabályok feldolgozását. Több triggert is meg lehet adni egy szabályhoz. Ha egy trigger elindul, akkor a Home Assistant ellenőrzi a feltételeket - ha vannak -, majd meghívja a műveletet. Kattints az alábbi linkre, ha többet szeretnél megtudni a triggerekről.",
|
||||||
"add": "Trigger hozzáadása",
|
"add": "Trigger hozzáadása",
|
||||||
"duplicate": "Megkettőzés",
|
"duplicate": "Megkettőzés",
|
||||||
"delete": "Törlés",
|
"delete": "Törlés",
|
||||||
@ -450,7 +456,7 @@
|
|||||||
},
|
},
|
||||||
"conditions": {
|
"conditions": {
|
||||||
"header": "Feltételek",
|
"header": "Feltételek",
|
||||||
"introduction": "A feltételek opcionális részei az automatizálási szabályoknak és arra lehet őket használni, hogy meggátoljuk egy művelet végrehajtását, ha triggerelődik. A feltételek hasonlítanak a triggerekre, mégis teljesen máshogy működnek. A triggerek a rendszerben történő események bekövetkezését figyelik, míg a feltételek csak azt látják, hogy milyen a rendszer pillanatnyi állapota. Egy trigger például észre tudja venni, ha egy kapcsoló fel lett kapcsolva. Egy feltétel csak azt látja, hogy a kapcsoló éppen fel vagy le van kapcsolva.\n\n[Tudj meg többet a feltételekről.](https:\/\/home-assistant.io\/docs\/scripts\/conditions\/)",
|
"introduction": "A feltételek opcionális részei az automatizálási szabályoknak és arra lehet őket használni, hogy meggátoljuk egy művelet végrehajtását, ha triggerelődik. A feltételek hasonlítanak a triggerekre, mégis teljesen máshogy működnek. A triggerek a rendszerben történő események bekövetkezését figyelik, míg a feltételek csak azt látják, hogy milyen a rendszer pillanatnyi állapota. Egy trigger például észre tudja venni, ha egy kapcsoló fel lett kapcsolva. Egy feltétel csak azt látja, hogy a kapcsoló éppen fel vagy le van kapcsolva. Kattints az alábbi linkre, ha többet szeretnél megtudni a feltételekről.",
|
||||||
"add": "Feltétel hozzáadása",
|
"add": "Feltétel hozzáadása",
|
||||||
"duplicate": "Megkettőzés",
|
"duplicate": "Megkettőzés",
|
||||||
"delete": "Törlés",
|
"delete": "Törlés",
|
||||||
@ -495,7 +501,7 @@
|
|||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"header": "Műveletek",
|
"header": "Műveletek",
|
||||||
"introduction": "A műveleteket hajtja végre a Home Assistant, ha egy automatizálás triggerelődik.\n\n[Tudj meg többet a műveletekről.](https:\/\/home-assistant.io\/docs\/automation\/action\/)",
|
"introduction": "A műveleteket hajtja végre a Home Assistant, ha egy automatizálás triggerelődik. Kattints az alábbi linkre, ha többet szeretnél megtudni a műveletekről.",
|
||||||
"add": "Művelet hozzáadása",
|
"add": "Művelet hozzáadása",
|
||||||
"duplicate": "Megkettőzés",
|
"duplicate": "Megkettőzés",
|
||||||
"delete": "Törlés",
|
"delete": "Törlés",
|
||||||
@ -547,7 +553,15 @@
|
|||||||
"change_password": "Jelszó módosítása",
|
"change_password": "Jelszó módosítása",
|
||||||
"activate_user": "Felhasználó aktiválása",
|
"activate_user": "Felhasználó aktiválása",
|
||||||
"deactivate_user": "Felhasználó inaktiválása",
|
"deactivate_user": "Felhasználó inaktiválása",
|
||||||
"delete_user": "Felhasználó törlése"
|
"delete_user": "Felhasználó törlése",
|
||||||
|
"caption": "Felhasználó megtekintése"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Felhasználó hozzáadása",
|
||||||
|
"name": "Név",
|
||||||
|
"username": "Felhasználónév",
|
||||||
|
"password": "Jelszó",
|
||||||
|
"create": "Létrehozás"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -587,7 +601,9 @@
|
|||||||
"caption": "Terület Nyilvántartás",
|
"caption": "Terület Nyilvántartás",
|
||||||
"description": "Az összes otthoni terület áttekintése",
|
"description": "Az összes otthoni terület áttekintése",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Terület Nyilvántartás"
|
"header": "Terület Nyilvántartás",
|
||||||
|
"introduction": "A területekkel az eszközök elhelyezkedés szerint rendszerezhetők. Ezen információk felhasználásával a Home Assistant segíteni tud előkészíteni a felületet, a jogosultságokat és az integrációt más rendszerekkel.",
|
||||||
|
"introduction2": "Az eszközök területekbe történő elhelyezéséhez használd az alábbi linket az integrációs oldalra való navigáláshoz, majd kattints egy konfigurált integrációra az eszközkártyák eléréséhez."
|
||||||
},
|
},
|
||||||
"no_areas": "Úgy tűnik nem hoztál létre még egy területet sem!",
|
"no_areas": "Úgy tűnik nem hoztál létre még egy területet sem!",
|
||||||
"create_area": "TERÜLET LÉTREHOZÁSA",
|
"create_area": "TERÜLET LÉTREHOZÁSA",
|
||||||
@ -603,10 +619,12 @@
|
|||||||
"description": "Az összes ismert entitás áttekintése",
|
"description": "Az összes ismert entitás áttekintése",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Entitás Nyilvántartás",
|
"header": "Entitás Nyilvántartás",
|
||||||
"unavailable": "(nem elérhető)"
|
"unavailable": "(nem elérhető)",
|
||||||
|
"introduction": "A Home Assistant nyilvántartást vezet minden olyan entitásról, melyet valaha látott, és egyedileg azonosítható. Ezen entitások mindegyikéhez létrejön egy entitás ID, amely csak az adott entitáshoz van rendelve.",
|
||||||
|
"introduction2": "Az entitás nyilvántartás használatával felülbírálhatod a nevet, módosíthatod az entitás ID-t vagy eltávolíthatod a bejegyzést a Home Assistant-ból. Megjegyzendő, hogy az entitás nyilvántartásból történő bejegyzés eltávolítás nem fogja eltávolítani magát az entitást. Ehhez kövesd az alábbi linket, és távolítsd el azt az integrációs oldalról."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Ez a entitás jelenleg nem elérhető.",
|
"unavailable": "Ez az entitás jelenleg nem elérhető.",
|
||||||
"default_name": "Új Terület",
|
"default_name": "Új Terület",
|
||||||
"delete": "TÖRLÉS",
|
"delete": "TÖRLÉS",
|
||||||
"update": "FRISSÍTÉS"
|
"update": "FRISSÍTÉS"
|
||||||
@ -617,7 +635,7 @@
|
|||||||
"description": "Kezeld azon személyeket, melyeket a Home Assistant követ.",
|
"description": "Kezeld azon személyeket, melyeket a Home Assistant követ.",
|
||||||
"detail": {
|
"detail": {
|
||||||
"name": "Név",
|
"name": "Név",
|
||||||
"device_tracker_intro": "Válaszd ki az eszközöket, melyek ehhez a felhasználóhoz tartoznak",
|
"device_tracker_intro": "Válaszd ki azokat az eszközöket, amelyek ehhez a felhasználóhoz tartoznak.",
|
||||||
"device_tracker_picked": "Eszköz követése",
|
"device_tracker_picked": "Eszköz követése",
|
||||||
"device_tracker_pick": "Válassz egy követni kívánt eszközt"
|
"device_tracker_pick": "Válassz egy követni kívánt eszközt"
|
||||||
}
|
}
|
||||||
@ -774,13 +792,14 @@
|
|||||||
},
|
},
|
||||||
"mfa": {
|
"mfa": {
|
||||||
"data": {
|
"data": {
|
||||||
"code": "Két faktoros hitelesítő kód"
|
"code": "Kétfaktoros Hitelesítési Kód"
|
||||||
}
|
},
|
||||||
|
"description": "Nyisd meg a(z) **{mfa_module_name}** applikációt az eszközödön, hogy megtekintsd a kétfaktoros hitelesítési kódodat a személyazonosságod ellenőrzéséhez."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"invalid_auth": "Érvénytelen felhasználónév vagy jelszó",
|
"invalid_auth": "Érvénytelen felhasználónév vagy jelszó",
|
||||||
"invalid_code": "Érvénytelen hitelesítő kód"
|
"invalid_code": "Érvénytelen hitelesítési kód"
|
||||||
},
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"login_expired": "A munkamenet lejárt, kérlek, jelentkezz be újra."
|
"login_expired": "A munkamenet lejárt, kérlek, jelentkezz be újra."
|
||||||
@ -858,6 +877,10 @@
|
|||||||
"unused_entities": "Nem használt entitások",
|
"unused_entities": "Nem használt entitások",
|
||||||
"help": "Súgó",
|
"help": "Súgó",
|
||||||
"refresh": "Frissítés"
|
"refresh": "Frissítés"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entitás nem elérhető: {entity}",
|
||||||
|
"entity_non_numeric": "Entitás nem numerikus: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -930,7 +953,8 @@
|
|||||||
"arm_home": "Élesít (otthon)",
|
"arm_home": "Élesít (otthon)",
|
||||||
"arm_away": "Élesít (távozó)",
|
"arm_away": "Élesít (távozó)",
|
||||||
"arm_night": "Élesít (éjszakai)",
|
"arm_night": "Élesít (éjszakai)",
|
||||||
"armed_custom_bypass": "Egyéni áthidalás"
|
"armed_custom_bypass": "Egyéni áthidalás",
|
||||||
|
"arm_custom_bypass": "Egyéni áthidalás"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Utoljára aktiválva",
|
"last_triggered": "Utoljára aktiválva",
|
||||||
@ -1102,5 +1126,14 @@
|
|||||||
"visibility": "Láthatóság",
|
"visibility": "Láthatóság",
|
||||||
"wind_speed": "Szélsebesség"
|
"wind_speed": "Szélsebesség"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Ki",
|
||||||
|
"on": "Be",
|
||||||
|
"auto": "Automatikus"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Acceso",
|
"on": "Acceso",
|
||||||
"paused": "In pausa",
|
"paused": "In pausa",
|
||||||
"returning": "Ritornando alla base"
|
"returning": "Ritornando alla base"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "Attivo",
|
||||||
|
"idle": "Inattivo",
|
||||||
|
"paused": "In pausa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -548,7 +553,15 @@
|
|||||||
"change_password": "Cambia password",
|
"change_password": "Cambia password",
|
||||||
"activate_user": "Attiva utente",
|
"activate_user": "Attiva utente",
|
||||||
"deactivate_user": "Disattiva utente",
|
"deactivate_user": "Disattiva utente",
|
||||||
"delete_user": "Elimina utente"
|
"delete_user": "Elimina utente",
|
||||||
|
"caption": "Visualizza utente"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Aggiungi utente",
|
||||||
|
"name": "Nome",
|
||||||
|
"username": "Nome utente",
|
||||||
|
"password": "Password",
|
||||||
|
"create": "Crea"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -588,7 +601,9 @@
|
|||||||
"caption": "Registro di area",
|
"caption": "Registro di area",
|
||||||
"description": "Panoramica di tutte le aree della tua casa.",
|
"description": "Panoramica di tutte le aree della tua casa.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Registro di area"
|
"header": "Registro di area",
|
||||||
|
"introduction": "Le aree sono utilizzate per organizzare dove sono i dispositivi. Queste informazioni saranno utilizzate in Home Assistant per aiutarti ad organizzare la tua interfaccia, permessi e integrazioni con altri sistemi.",
|
||||||
|
"introduction2": "Per posizionare i dispositivi in un'area, utilizzare il collegamento seguente per accedere alla pagina delle integrazioni e quindi fare clic su un'integrazione configurata per accedere alle schede del dispositivo."
|
||||||
},
|
},
|
||||||
"no_areas": "Sembra che tu non abbia ancora delle aree!",
|
"no_areas": "Sembra che tu non abbia ancora delle aree!",
|
||||||
"create_area": "CREA AREA",
|
"create_area": "CREA AREA",
|
||||||
@ -604,7 +619,9 @@
|
|||||||
"description": "Panoramica di tutte le entità conosciute.",
|
"description": "Panoramica di tutte le entità conosciute.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Registro delle entità",
|
"header": "Registro delle entità",
|
||||||
"unavailable": "(non disponibile)"
|
"unavailable": "(non disponibile)",
|
||||||
|
"introduction": "Home Assistant mantiene un registro di tutte le entità che ha mai localizzato che possono essere identificate in modo univoco. A ciascuna di queste entità sarà assegnato un ID che sarà riservato solo a questa entità.",
|
||||||
|
"introduction2": "Utilizzare il registro delle entità per sovrascrivere il nome, modificare l'entity ID o rimuovere la voce da Home Assistant. Nota, la rimozione della voce del registro entità non rimuoverà l'entità. Per farlo, segui il link sottostante e rimuovilo dalla pagina delle integrazioni."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Questa entità non è attualmente disponibile.",
|
"unavailable": "Questa entità non è attualmente disponibile.",
|
||||||
@ -860,6 +877,10 @@
|
|||||||
"unused_entities": "Entità non utilizzate",
|
"unused_entities": "Entità non utilizzate",
|
||||||
"help": "Aiuto",
|
"help": "Aiuto",
|
||||||
"refresh": "Aggiorna"
|
"refresh": "Aggiorna"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entità non disponibile: {entity}",
|
||||||
|
"entity_non_numeric": "L'entità non è numerica: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1105,5 +1126,14 @@
|
|||||||
"visibility": "Visibilità",
|
"visibility": "Visibilità",
|
||||||
"wind_speed": "Velocità del vento"
|
"wind_speed": "Velocità del vento"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Off",
|
||||||
|
"on": "On",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -553,7 +553,15 @@
|
|||||||
"change_password": "Passwuert änneren",
|
"change_password": "Passwuert änneren",
|
||||||
"activate_user": "Benotzer aktivéieren",
|
"activate_user": "Benotzer aktivéieren",
|
||||||
"deactivate_user": "Benotzer déaktivéieren",
|
"deactivate_user": "Benotzer déaktivéieren",
|
||||||
"delete_user": "Benotzer läschen"
|
"delete_user": "Benotzer läschen",
|
||||||
|
"caption": "Benotzer kucken"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Benotzer erstellen",
|
||||||
|
"name": "Numm",
|
||||||
|
"username": "Benotzernumm",
|
||||||
|
"password": "Passwuert",
|
||||||
|
"create": "Erstellen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -593,7 +601,9 @@
|
|||||||
"caption": "Lëscht vun de Beräicher",
|
"caption": "Lëscht vun de Beräicher",
|
||||||
"description": "Iwwersiicht vun de Beräicher am Haus",
|
"description": "Iwwersiicht vun de Beräicher am Haus",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Lëscht vun de Beräicher"
|
"header": "Lëscht vun de Beräicher",
|
||||||
|
"introduction": "Beräicher gi benotzt fir d'Organisatioun vum Standuert vun den Apparater. Dës Informatioun gëtt vum Home Assistant benotzt fir iech ze hëllefe fir den Interface, Berechtegungen an Integratioune mat aner Systemer ze geréieren.",
|
||||||
|
"introduction2": "Fir Apparater an e Beräich ze setzen, benotzt de Link ënne fir op d'Integratiouns Säit ze kommen a klickt do op eng konfiguréiert Integratioun fir d'Kaart vum Apparat unzeweisen."
|
||||||
},
|
},
|
||||||
"no_areas": "Et sinn nach keng Beräicher do!",
|
"no_areas": "Et sinn nach keng Beräicher do!",
|
||||||
"create_area": "Beräich erstellen",
|
"create_area": "Beräich erstellen",
|
||||||
@ -609,10 +619,12 @@
|
|||||||
"description": "Iwwersiicht vun all bekannten Entitéiten.",
|
"description": "Iwwersiicht vun all bekannten Entitéiten.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Lëscht vun den Entitéiten",
|
"header": "Lëscht vun den Entitéiten",
|
||||||
"unavailable": "(net verfügbar)"
|
"unavailable": "(net verfügbar)",
|
||||||
|
"introduction": "Home Assistant hält eng Lëscht vun all Entitéit's ID déi eenzel erkennbar ass a bis elo vum System erkannt gouf. All eenzel vun dësen Entitéite kritt eng ID zougewise welch nëmme fir dës Entitéit reservéiert ass.",
|
||||||
|
"introduction2": "Benotzt d'Lëscht vun den Entitéite fir d'Nimm z'änneren, d'Entitéits ID z'änneren oder d'Entrée aus dem Home Assistant ze läschen. Remarque: Läsche vun der Entitéit aus der Lëscht läscht d'Entitéit selwer net. Fir dës ze läsche follegt dem Link ënnen a läscht et op der Integratiouns Säit."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Dës Entitéit ass net erreechba fir de Moment.",
|
"unavailable": "Dës Entitéit ass net erreechbar fir de Moment.",
|
||||||
"default_name": "Neie Beräich",
|
"default_name": "Neie Beräich",
|
||||||
"delete": "Läschen",
|
"delete": "Läschen",
|
||||||
"update": "Aktualiséieren"
|
"update": "Aktualiséieren"
|
||||||
@ -1114,5 +1126,14 @@
|
|||||||
"visibility": "Visibilitéit",
|
"visibility": "Visibilitéit",
|
||||||
"wind_speed": "Wand Vitesse"
|
"wind_speed": "Wand Vitesse"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Aus",
|
||||||
|
"on": "Un",
|
||||||
|
"auto": "Autmatesch"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -9,10 +9,74 @@
|
|||||||
"shopping_list": "Pirkinių sąrašas",
|
"shopping_list": "Pirkinių sąrašas",
|
||||||
"dev-mqtt": "MQTT"
|
"dev-mqtt": "MQTT"
|
||||||
},
|
},
|
||||||
|
"state": {
|
||||||
|
"automation": {
|
||||||
|
"off": "Išjungta"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"off": "Išjungta",
|
||||||
|
"on": "Įjungta",
|
||||||
|
"ok": "Ok"
|
||||||
|
},
|
||||||
|
"remote": {
|
||||||
|
"off": "Išjungta",
|
||||||
|
"on": "Įjungta"
|
||||||
|
},
|
||||||
|
"script": {
|
||||||
|
"off": "Išjungta",
|
||||||
|
"on": "Įjungta"
|
||||||
|
},
|
||||||
|
"sensor": {
|
||||||
|
"off": "Išjungta",
|
||||||
|
"on": "Įjungta"
|
||||||
|
},
|
||||||
|
"switch": {
|
||||||
|
"off": "Išjungta",
|
||||||
|
"on": "Įjungta"
|
||||||
|
},
|
||||||
|
"zwave": {
|
||||||
|
"query_stage": {
|
||||||
|
"dead": "Miręs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"binary_sensor": {
|
||||||
|
"door": {
|
||||||
|
"off": "Uždaryta",
|
||||||
|
"on": "Atidaryta"
|
||||||
|
},
|
||||||
|
"garage_door": {
|
||||||
|
"off": "Uždaryta",
|
||||||
|
"on": "Atidaryta"
|
||||||
|
},
|
||||||
|
"window": {
|
||||||
|
"off": "Uždaryta",
|
||||||
|
"on": "Atidaryta"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"climate": {
|
||||||
|
"manual": "Rankinis"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"state_badge": {
|
||||||
|
"alarm_control_panel": {
|
||||||
|
"armed_home": "Užrakinta",
|
||||||
|
"armed_away": "Užrakinta",
|
||||||
|
"armed_night": "Užrakinta"
|
||||||
|
},
|
||||||
|
"device_tracker": {
|
||||||
|
"home": "Namie",
|
||||||
|
"not_home": "Išvykęs"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"log_out": "Atsijungti"
|
"log_out": "Atsijungti"
|
||||||
},
|
},
|
||||||
|
"duration": {
|
||||||
|
"day": "{count} {count, plural,\n one {diena}\n other {dienos}\n}",
|
||||||
|
"week": "count} {count, plural,\n one {savaitė}\n other {savaitės}\n}",
|
||||||
|
"second": "{count} {count, plural,\n one {sekundė}\n other {sekundės}\n}"
|
||||||
|
},
|
||||||
"panel": {
|
"panel": {
|
||||||
"config": {
|
"config": {
|
||||||
"zwave": {
|
"zwave": {
|
||||||
@ -20,8 +84,25 @@
|
|||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"editor": {
|
"editor": {
|
||||||
"conditions": {
|
"triggers": {
|
||||||
|
"delete": "Ištrinti",
|
||||||
"type": {
|
"type": {
|
||||||
|
"sun": {
|
||||||
|
"event": "Ivykis"
|
||||||
|
},
|
||||||
|
"zone": {
|
||||||
|
"zone": "Vieta",
|
||||||
|
"event": "Įvykis"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"conditions": {
|
||||||
|
"duplicate": "Dubliuoti",
|
||||||
|
"delete": "Ištrinti",
|
||||||
|
"type": {
|
||||||
|
"numeric_state": {
|
||||||
|
"below": "žemiau"
|
||||||
|
},
|
||||||
"sun": {
|
"sun": {
|
||||||
"label": "Saulė",
|
"label": "Saulė",
|
||||||
"before": "Prieš:",
|
"before": "Prieš:",
|
||||||
@ -29,6 +110,9 @@
|
|||||||
"sunrise": "Saulėtekis",
|
"sunrise": "Saulėtekis",
|
||||||
"sunset": "Saulėlydis"
|
"sunset": "Saulėlydis"
|
||||||
},
|
},
|
||||||
|
"template": {
|
||||||
|
"label": "Šablonas"
|
||||||
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"label": "Laikas",
|
"label": "Laikas",
|
||||||
"after": "Po",
|
"after": "Po",
|
||||||
@ -60,6 +144,22 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"editor": {
|
||||||
|
"caption": "Peržiūrėti vartotoją"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Pridėti vartotoją",
|
||||||
|
"name": "Vardas",
|
||||||
|
"username": "Vartotojo vardas",
|
||||||
|
"password": "Slaptažodis"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profile": {
|
||||||
|
"push_notifications": {
|
||||||
|
"description": "Siųsti pranešimus į šį įrenginį."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"lovelace": {
|
"lovelace": {
|
||||||
@ -76,16 +176,32 @@
|
|||||||
},
|
},
|
||||||
"logbook": {
|
"logbook": {
|
||||||
"period": "Laikotarpis"
|
"period": "Laikotarpis"
|
||||||
|
},
|
||||||
|
"page-authorize": {
|
||||||
|
"form": {
|
||||||
|
"providers": {
|
||||||
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "Vartotojo vardas",
|
||||||
|
"password": "Slaptažodis"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "Dvieju lygiu autentifikacija"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"domain": {
|
"domain": {
|
||||||
"zwave": "Z-Wave",
|
"zwave": "Z-Wave",
|
||||||
"system_health": "Sistemos sveikata"
|
"system_health": "Sistemos sveikata"
|
||||||
},
|
|
||||||
"state": {
|
|
||||||
"climate": {
|
|
||||||
"manual": "Rankinis"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "På",
|
"on": "På",
|
||||||
"paused": "Pauset",
|
"paused": "Pauset",
|
||||||
"returning": "Returner til dokken"
|
"returning": "Returner til dokken"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktiv",
|
||||||
|
"idle": "inaktiv",
|
||||||
|
"paused": "pauset"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -348,7 +353,8 @@
|
|||||||
"caption": "Tilpasning",
|
"caption": "Tilpasning",
|
||||||
"description": "Tilpass dine oppføringer",
|
"description": "Tilpass dine oppføringer",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Tilpasning"
|
"header": "Tilpasning",
|
||||||
|
"introduction": "Juster per-enhet attributter. Lagt til\/redigert tilpasninger trer i kraft umiddelbart. Fjernede tilpasninger trer i kraft når enheten er oppdatert."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
@ -547,7 +553,15 @@
|
|||||||
"change_password": "Endre passord",
|
"change_password": "Endre passord",
|
||||||
"activate_user": "Aktiver bruker",
|
"activate_user": "Aktiver bruker",
|
||||||
"deactivate_user": "Deaktiver bruker",
|
"deactivate_user": "Deaktiver bruker",
|
||||||
"delete_user": "Slett bruker"
|
"delete_user": "Slett bruker",
|
||||||
|
"caption": "Vis bruker"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Legg til bruker",
|
||||||
|
"name": "Navn",
|
||||||
|
"username": "Brukernavn",
|
||||||
|
"password": "Passord",
|
||||||
|
"create": "Opprett"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -572,7 +586,8 @@
|
|||||||
"hub": "Tilkoblet via",
|
"hub": "Tilkoblet via",
|
||||||
"firmware": "Fastvare: {version}",
|
"firmware": "Fastvare: {version}",
|
||||||
"device_unavailable": "enheten er utilgjengelig",
|
"device_unavailable": "enheten er utilgjengelig",
|
||||||
"entity_unavailable": "oppføringen er utilgjengelig"
|
"entity_unavailable": "oppføringen er utilgjengelig",
|
||||||
|
"no_area": "Ingen område"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
@ -584,9 +599,11 @@
|
|||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
"caption": "Områderegister",
|
"caption": "Områderegister",
|
||||||
"description": "Oversikt over alle områder i ditt hjem.",
|
"description": "Oversikt over alle områder i ditt hjem",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Områderegister"
|
"header": "Områderegister",
|
||||||
|
"introduction": "Områder brukes til å organisere hvor enheter er. Denne informasjonen vil bli brukt gjennomgående i Home Assistant for å hjelpe deg med å organisere grensesnittet, tillatelser og integrasjoner med andre systemer.",
|
||||||
|
"introduction2": "For å plassere enheter i et område, bruk linken under for å navigere til integrasjonssiden og klikk deretter på en konfigurert integrasjon for å komme til enhetskortene."
|
||||||
},
|
},
|
||||||
"no_areas": "Det ser ikke ut som om du har noen områder ennå!",
|
"no_areas": "Det ser ikke ut som om du har noen områder ennå!",
|
||||||
"create_area": "OPPRETT OMRÅDE",
|
"create_area": "OPPRETT OMRÅDE",
|
||||||
@ -599,10 +616,12 @@
|
|||||||
},
|
},
|
||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Enhetsregister",
|
"caption": "Enhetsregister",
|
||||||
"description": "Oversikt over alle kjente enheter.",
|
"description": "Oversikt over alle kjente enheter",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Enhetsregister",
|
"header": "Enhetsregister",
|
||||||
"unavailable": "(utilgjengelig)"
|
"unavailable": "(utilgjengelig)",
|
||||||
|
"introduction": "Home Assistant beholder et register over hver enhet som den noensinne har sett som kan identifiseres unikt. Hver av disse enhetene vil ha en enhets ID tilknyttet som vil bli reservert for bare denne enheten.",
|
||||||
|
"introduction2": "Bruk entitetsregisteret til å overskrive navnet, endre enhets ID eller fjern oppføringen fra Home Assistant. Merk at fjerning av enhetsregisteroppføringer ikke fjerner enheten. For å gjøre det, følg linken under og fjern den fra integrasjonssiden."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Denne enheten er ikke tilgjengelig for øyeblikket.",
|
"unavailable": "Denne enheten er ikke tilgjengelig for øyeblikket.",
|
||||||
@ -613,7 +632,7 @@
|
|||||||
},
|
},
|
||||||
"person": {
|
"person": {
|
||||||
"caption": "Personer",
|
"caption": "Personer",
|
||||||
"description": "Administrer personer som Home Assistant sporer.",
|
"description": "Administrer personer som Home Assistant sporer",
|
||||||
"detail": {
|
"detail": {
|
||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
"device_tracker_intro": "Velg enhetene som tilhører denne personen.",
|
"device_tracker_intro": "Velg enhetene som tilhører denne personen.",
|
||||||
@ -770,6 +789,12 @@
|
|||||||
"username": "Brukernavn",
|
"username": "Brukernavn",
|
||||||
"password": "Passord"
|
"password": "Passord"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "To-faktor autentiseringskode"
|
||||||
|
},
|
||||||
|
"description": "Åpne **{mfa_module_name}** på enheten din for å se din to-faktor autentiseringskode og bekrefte identiteten din:"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
@ -784,7 +809,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"page-onboarding": {
|
"page-onboarding": {
|
||||||
"intro": "Er du klar til å vekke hjemmet ditt, gjenvinne ditt privatliv og bli med i et verdensomspennende samfunn av tinkerers?",
|
"intro": "Er du klar til å ta kontroll over hjemmet ditt, gjenvinne ditt privatliv og bli med i et verdensomspennende samfunn av tinkerers?",
|
||||||
"user": {
|
"user": {
|
||||||
"intro": "La oss begynne med å opprette en brukerkonto.",
|
"intro": "La oss begynne med å opprette en brukerkonto.",
|
||||||
"required_field": "Kreves",
|
"required_field": "Kreves",
|
||||||
@ -852,6 +877,10 @@
|
|||||||
"unused_entities": "Ubrukte enheter",
|
"unused_entities": "Ubrukte enheter",
|
||||||
"help": "Hjelp",
|
"help": "Hjelp",
|
||||||
"refresh": "Oppdater"
|
"refresh": "Oppdater"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Enhet ikke tilgjengelig: {entity}",
|
||||||
|
"entity_non_numeric": "Enheten er ikke-numerisk: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -924,7 +953,8 @@
|
|||||||
"arm_home": "Armer hjemme",
|
"arm_home": "Armer hjemme",
|
||||||
"arm_away": "Armer borte",
|
"arm_away": "Armer borte",
|
||||||
"arm_night": "Armer natt",
|
"arm_night": "Armer natt",
|
||||||
"armed_custom_bypass": "Tilpasset bypass"
|
"armed_custom_bypass": "Tilpasset bypass",
|
||||||
|
"arm_custom_bypass": "Tilpasset bypass"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Sist utløst",
|
"last_triggered": "Sist utløst",
|
||||||
@ -1096,5 +1126,14 @@
|
|||||||
"visibility": "Sikt",
|
"visibility": "Sikt",
|
||||||
"wind_speed": "Vindhastighet"
|
"wind_speed": "Vindhastighet"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Av",
|
||||||
|
"on": "På",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Aan",
|
"on": "Aan",
|
||||||
"paused": "Gepauseerd",
|
"paused": "Gepauseerd",
|
||||||
"returning": "Terugkeren naar dock"
|
"returning": "Terugkeren naar dock"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "actief",
|
||||||
|
"idle": "inactief",
|
||||||
|
"paused": "gepauzeerd"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -346,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Aanpassingen",
|
"caption": "Aanpassingen",
|
||||||
"description": "Pas je entiteiten aan"
|
"description": "Pas je entiteiten aan",
|
||||||
|
"picker": {
|
||||||
|
"header": "Aanpassingen",
|
||||||
|
"introduction": "Pas attributen per entiteit aan. Toegevoegde\/gewijzigde aanpassingen worden onmiddellijk van kracht. Verwijderde aanpassingen worden van kracht wanneer de entiteit wordt bijgewerkt."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Automatisering",
|
"caption": "Automatisering",
|
||||||
@ -544,7 +553,15 @@
|
|||||||
"change_password": "Wachtwoord wijzigen",
|
"change_password": "Wachtwoord wijzigen",
|
||||||
"activate_user": "Activeer gebruiker",
|
"activate_user": "Activeer gebruiker",
|
||||||
"deactivate_user": "Deactiveer gebruiker",
|
"deactivate_user": "Deactiveer gebruiker",
|
||||||
"delete_user": "Verwijder gebruiker"
|
"delete_user": "Verwijder gebruiker",
|
||||||
|
"caption": "Bekijk gebruiker"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Gebruiker toevoegen",
|
||||||
|
"name": "Naam",
|
||||||
|
"username": "Gebruikersnaam",
|
||||||
|
"password": "Wachtwoord",
|
||||||
|
"create": "Maken"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -569,7 +586,8 @@
|
|||||||
"hub": "Verbonden via",
|
"hub": "Verbonden via",
|
||||||
"firmware": "Firmware: {version}",
|
"firmware": "Firmware: {version}",
|
||||||
"device_unavailable": "apparaat niet beschikbaar",
|
"device_unavailable": "apparaat niet beschikbaar",
|
||||||
"entity_unavailable": "entiteit niet beschikbaar"
|
"entity_unavailable": "entiteit niet beschikbaar",
|
||||||
|
"no_area": "Geen gebied"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
@ -583,24 +601,43 @@
|
|||||||
"caption": "Gebiedenregister",
|
"caption": "Gebiedenregister",
|
||||||
"description": "Overzicht van alle gebieden in je huis.",
|
"description": "Overzicht van alle gebieden in je huis.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Gebiedenregister"
|
"header": "Gebiedenregister",
|
||||||
|
"introduction": "Gebieden worden gebruikt om te bepalen waar apparaten zijn. Deze informatie wordt overal in de Home Assistant gebruikt om u te helpen bij het organiseren van uw interface, machtigingen en integraties met andere systemen.",
|
||||||
|
"introduction2": "Als u apparaten in een gebied wilt plaatsen, gebruikt u de onderstaande koppeling om naar de integratiespagina te gaan en vervolgens op een geconfigureerde integratie te klikken om naar de apparaatkaarten te gaan."
|
||||||
|
},
|
||||||
|
"no_areas": "Het lijkt erop dat je nog geen gebieden hebt!",
|
||||||
|
"create_area": "MAAK GEBIED",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Nieuw gebied",
|
||||||
|
"delete": "VERWIJDEREN",
|
||||||
|
"update": "BIJWERKEN",
|
||||||
|
"create": "MAKEN"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Entiteiten register",
|
"caption": "Entiteiten register",
|
||||||
"description": "Overzicht van alle gekende entiteiten",
|
"description": "Overzicht van alle gekende entiteiten",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Entiteiten register"
|
"header": "Entiteiten register",
|
||||||
|
"unavailable": "(niet beschikbaar)",
|
||||||
|
"introduction": "Home Assistant houdt een register bij van elke entiteit die het ooit heeft gezien en die uniek kan worden geïdentificeerd. Elk van deze entiteiten krijgt een entiteit-ID toegewezen die alleen voor deze entiteit wordt gereserveerd.",
|
||||||
|
"introduction2": "Gebruik het entiteitenregister om de naam te overschrijven, de entiteits-ID te wijzigen of het item te verwijderen uit de Home Assistant. Opmerking: als u de entiteitsregistervermelding verwijdert, wordt de entiteit niet verwijderd. Hiertoe volgt u de onderstaande koppeling en verwijdert u deze van de integratiespagina."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"delete": "VERWIJDEREN"
|
"unavailable": "Deze entiteit is momenteel niet beschikbaar.",
|
||||||
|
"default_name": "Nieuw gebied",
|
||||||
|
"delete": "VERWIJDEREN",
|
||||||
|
"update": "BIJWERKEN"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"person": {
|
"person": {
|
||||||
"caption": "Personen",
|
"caption": "Personen",
|
||||||
"description": "Beheer de personen die Home Assistant volgt.",
|
"description": "Beheer de personen die Home Assistant volgt.",
|
||||||
"detail": {
|
"detail": {
|
||||||
"name": "Naam"
|
"name": "Naam",
|
||||||
|
"device_tracker_intro": "Selecteer de apparaten die bij deze persoon horen.",
|
||||||
|
"device_tracker_picked": "Volg apparaat",
|
||||||
|
"device_tracker_pick": "Kies apparaat om te volgen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -746,6 +783,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"command_line": {
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "Gebruikersnaam",
|
||||||
|
"password": "Wachtwoord"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "Twee-factor authenticatie code"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "Ongeldige gebruikersnaam of wachtwoord",
|
||||||
|
"invalid_code": "Onjuiste authenticatie code"
|
||||||
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"login_expired": "Sessie verlopen, meldt u opnieuw aan."
|
"login_expired": "Sessie verlopen, meldt u opnieuw aan."
|
||||||
}
|
}
|
||||||
@ -778,8 +832,8 @@
|
|||||||
},
|
},
|
||||||
"empty_state": {
|
"empty_state": {
|
||||||
"title": "Welkom thuis",
|
"title": "Welkom thuis",
|
||||||
"no_devices": "Op deze pagina kun je je apparaten bedienen, maar het lijkt er op dat je nog geen apparaten hebt ingesteld. Ga naar de integraties-pagina om te beginnen.",
|
"no_devices": "Op deze pagina kun je je apparaten bedienen, maar het lijkt er op dat je nog geen apparaten hebt ingesteld. Ga naar de integraties pagina om te beginnen.",
|
||||||
"go_to_integrations_page": "Ga naar de integraties-pagina."
|
"go_to_integrations_page": "Ga naar de integraties pagina."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
@ -790,7 +844,8 @@
|
|||||||
"pick_card": "Kies de kaart die je wilt toevoegen.",
|
"pick_card": "Kies de kaart die je wilt toevoegen.",
|
||||||
"add": "Kaart toevoegen",
|
"add": "Kaart toevoegen",
|
||||||
"edit": "Bewerken",
|
"edit": "Bewerken",
|
||||||
"delete": "Verwijder"
|
"delete": "Verwijder",
|
||||||
|
"move": "Verplaatsen"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Configuratie incompatibel",
|
"header": "Configuratie incompatibel",
|
||||||
@ -821,6 +876,10 @@
|
|||||||
"unused_entities": "Ongebruikte entiteiten",
|
"unused_entities": "Ongebruikte entiteiten",
|
||||||
"help": "Help",
|
"help": "Help",
|
||||||
"refresh": "Vernieuwen"
|
"refresh": "Vernieuwen"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entiteit niet beschikbaar: {entity}",
|
||||||
|
"entity_non_numeric": "Entiteit is niet-numeriek: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -893,7 +952,8 @@
|
|||||||
"arm_home": "Inschakelen thuis",
|
"arm_home": "Inschakelen thuis",
|
||||||
"arm_away": "Inschakelen afwezig",
|
"arm_away": "Inschakelen afwezig",
|
||||||
"arm_night": "Inschakelen nacht",
|
"arm_night": "Inschakelen nacht",
|
||||||
"armed_custom_bypass": "Aangepaste overbrugging(en)"
|
"armed_custom_bypass": "Aangepaste overbrugging(en)",
|
||||||
|
"arm_custom_bypass": "Gedeeltelijk actief"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Laatst uitgevoerd",
|
"last_triggered": "Laatst uitgevoerd",
|
||||||
@ -1065,5 +1125,14 @@
|
|||||||
"visibility": "Zichtbaarheid",
|
"visibility": "Zichtbaarheid",
|
||||||
"wind_speed": "Windsnelheid"
|
"wind_speed": "Windsnelheid"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Uit",
|
||||||
|
"on": "Aan",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -14,7 +14,7 @@
|
|||||||
"dev-mqtt": "MQTT",
|
"dev-mqtt": "MQTT",
|
||||||
"dev-info": "Info",
|
"dev-info": "Info",
|
||||||
"calendar": "Kalendrar",
|
"calendar": "Kalendrar",
|
||||||
"profile": "Perfil"
|
"profile": "Profil"
|
||||||
},
|
},
|
||||||
"state": {
|
"state": {
|
||||||
"default": {
|
"default": {
|
||||||
@ -265,6 +265,11 @@
|
|||||||
"on": "På",
|
"on": "På",
|
||||||
"paused": "Pausa",
|
"paused": "Pausa",
|
||||||
"returning": "Gå tilbake til ladestasjonen"
|
"returning": "Gå tilbake til ladestasjonen"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktiv",
|
||||||
|
"idle": "tomgang",
|
||||||
|
"paused": "pausa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -301,7 +306,8 @@
|
|||||||
"period": "Periode"
|
"period": "Periode"
|
||||||
},
|
},
|
||||||
"logbook": {
|
"logbook": {
|
||||||
"showing_entries": "Viser oppføringer for"
|
"showing_entries": "Viser oppføringer for",
|
||||||
|
"period": "Periode"
|
||||||
},
|
},
|
||||||
"mailbox": {
|
"mailbox": {
|
||||||
"empty": "Du har ingen meldingar",
|
"empty": "Du har ingen meldingar",
|
||||||
@ -345,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Tilpassing",
|
"caption": "Tilpassing",
|
||||||
"description": "Tilpass dine einingar"
|
"description": "Tilpass dine einingar",
|
||||||
|
"picker": {
|
||||||
|
"header": "Tilpasning",
|
||||||
|
"introduction": "Modifiser oppføringsattributtane. Dei nyleg lagt til\/endra endringane kjem til å bli sett til verks med ein gang. Fjerna endringar kjem i gang når oppføringa er oppdatert."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Automasjon",
|
"caption": "Automasjon",
|
||||||
@ -382,7 +392,7 @@
|
|||||||
"label": "Tilstand",
|
"label": "Tilstand",
|
||||||
"from": "Frå",
|
"from": "Frå",
|
||||||
"to": "Til",
|
"to": "Til",
|
||||||
"for": "Para"
|
"for": "For"
|
||||||
},
|
},
|
||||||
"homeassistant": {
|
"homeassistant": {
|
||||||
"label": "Home Assistant",
|
"label": "Home Assistant",
|
||||||
@ -427,6 +437,20 @@
|
|||||||
"webhook": {
|
"webhook": {
|
||||||
"label": "Webhook",
|
"label": "Webhook",
|
||||||
"webhook_id": "Webhook ID"
|
"webhook_id": "Webhook ID"
|
||||||
|
},
|
||||||
|
"time_pattern": {
|
||||||
|
"label": "Tidsmønster",
|
||||||
|
"hours": "Timar",
|
||||||
|
"minutes": "Minutt",
|
||||||
|
"seconds": "Sekundar"
|
||||||
|
},
|
||||||
|
"geo_location": {
|
||||||
|
"label": "Geolokasjon",
|
||||||
|
"source": "Kjelde",
|
||||||
|
"zone": "Sone",
|
||||||
|
"event": "Hending:",
|
||||||
|
"enter": "Gå inn",
|
||||||
|
"leave": "Forlat"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -529,32 +553,91 @@
|
|||||||
"change_password": "Bytt passord",
|
"change_password": "Bytt passord",
|
||||||
"activate_user": "Aktiver brukaren",
|
"activate_user": "Aktiver brukaren",
|
||||||
"deactivate_user": "Deaktiver brukaren",
|
"deactivate_user": "Deaktiver brukaren",
|
||||||
"delete_user": "Slett brukar"
|
"delete_user": "Slett brukar",
|
||||||
|
"caption": "Sjå brukaren"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Legg til brukar",
|
||||||
|
"name": "Namn",
|
||||||
|
"username": "Brukarnamn",
|
||||||
|
"password": "Passord",
|
||||||
|
"create": "Lag"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
"caption": "Home Assistant Cloud",
|
"caption": "Home Assistant Cloud",
|
||||||
"description_login": "Conectado como {email}",
|
"description_login": "Logga inn som {email}",
|
||||||
"description_not_login": "Ikkje logga inn"
|
"description_not_login": "Ikkje logga inn"
|
||||||
},
|
},
|
||||||
"integrations": {
|
"integrations": {
|
||||||
"caption": "Integrações",
|
"caption": "Integrasjoner",
|
||||||
"description": "Gerenciar dispositivos e serviços conectados",
|
"description": "Administrer tilkopla einingar og tenester",
|
||||||
"discovered": "Descoberto",
|
"discovered": "Oppdaga",
|
||||||
"configured": "Configurado",
|
"configured": "Konfigurer ",
|
||||||
"new": "Configurar uma nova integração",
|
"new": "Sett opp ein ny integrasjon",
|
||||||
"configure": "Configurar",
|
"configure": "Konfigurer",
|
||||||
"none": "Ainda não configurado",
|
"none": "Ikkje noko konfiguert endå",
|
||||||
"config_entry": {
|
"config_entry": {
|
||||||
"no_devices": "Essa integração não possui dispositivos.",
|
"no_devices": "Denne integrasjonen har ingen oppføringar",
|
||||||
"no_device": "Entidades sem dispositivos.",
|
"no_device": "Oppføringar utan einingar",
|
||||||
"delete_confirm": "Voc^tem certeza que deseja apagar essa integração?",
|
"delete_confirm": "Er du sikker på at du vil slette denne integrasjonen?",
|
||||||
"restart_confirm": "Restart Home Assistant for å fjerne denne integrasjonen",
|
"restart_confirm": "Restart Home Assistant for å fjerne denne integrasjonen",
|
||||||
"manuf": "av {manufacturer}",
|
"manuf": "av {manufacturer}",
|
||||||
"hub": "Tilkopla via",
|
"hub": "Tilkopla via",
|
||||||
"firmware": "Firmware: {version}",
|
"firmware": "Firmware: {version}",
|
||||||
"device_unavailable": "Eininga utilgjengelig",
|
"device_unavailable": "Eininga utilgjengelig",
|
||||||
"entity_unavailable": "Oppføringa utilgjengelig"
|
"entity_unavailable": "Oppføringa utilgjengelig",
|
||||||
|
"no_area": "Inga område"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"zha": {
|
||||||
|
"caption": "ZHA",
|
||||||
|
"description": "Zigbee heimeautomasjon nettverksadministrering",
|
||||||
|
"services": {
|
||||||
|
"reconfigure": "Konfigurer ZHA-eininga (heal device) på nytt. Bruk dette om du har problem med eininga. Dersom eining går på batteri, ver sikker på at den er vaken og tek i mot kommandar når du brukar denne tenesta."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"area_registry": {
|
||||||
|
"caption": "Oppføringsregister",
|
||||||
|
"description": "Oversikt over områda i heimen din.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Områderegister",
|
||||||
|
"introduction": "Områda vert brukt til å organisere kvar einingar er. Denne informasjonen vil bli brukt av Home Assistant for å hjelpe deg å organisere brukargrensesnittet, løyver og integrasjoner med andre system.",
|
||||||
|
"introduction2": "For å plassere ei eining i eit område, bruk linken under for å navigere til integrasjonssida og trykk deretter på konfigurer integrasjon for å opne einingskortet."
|
||||||
|
},
|
||||||
|
"no_areas": "Ser ut til at du ikkje har noko område endå!",
|
||||||
|
"create_area": "LAG OMRÅDE",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Nytt område",
|
||||||
|
"delete": "SLETT",
|
||||||
|
"update": "OPPDATER",
|
||||||
|
"create": "LAG"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"entity_registry": {
|
||||||
|
"caption": "Oppføringsregister",
|
||||||
|
"description": "Oversikt over alle kjende oppføringar.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Oppføringsregisteret",
|
||||||
|
"unavailable": "(utilgjengeleg)",
|
||||||
|
"introduction": "Home Assistant har eit register over alle oppføringane den nokon gang har sett som kan unikt identifiserast. KVar av desse oppføringane har ein eigen oppføringsidentifikasjon som er reservert for akkuratt denne oppføringa.",
|
||||||
|
"introduction2": "Bruk oppføringsregisteret til å skrive over namn, endre oppføringsidentifikasjonane eller fjerne oppføringar frå Home Assistant. Merk deg at å fjerne oppføringa i oppføringregisteret ikkje fjernar sjølve oppføringa. For å gjere dette, gå vidare inn på linken under og fjern oppføringa i integrasjonssida."
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Denne eininga er for augeblinken ikkje tilgjengeleg.",
|
||||||
|
"default_name": "Nytt område",
|
||||||
|
"delete": "SLETT",
|
||||||
|
"update": "OPPDATER"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Personar",
|
||||||
|
"description": "Administrer personane Home Assistant sporer.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Namn",
|
||||||
|
"device_tracker_intro": "Vel eininga som høyrer til denne personen.",
|
||||||
|
"device_tracker_picked": "Spor eining",
|
||||||
|
"device_tracker_pick": "Vel eining for å spore"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -609,24 +692,24 @@
|
|||||||
"logout": "Logg ut",
|
"logout": "Logg ut",
|
||||||
"change_password": {
|
"change_password": {
|
||||||
"header": "Bytt passord",
|
"header": "Bytt passord",
|
||||||
"current_password": "Senha Atual",
|
"current_password": "Noverande passord",
|
||||||
"new_password": "Nova Senha",
|
"new_password": "Nytt passord",
|
||||||
"confirm_new_password": "Confirme Nova Senha",
|
"confirm_new_password": "Stadfest nytt passord",
|
||||||
"error_required": "Obrigatório",
|
"error_required": "Krav",
|
||||||
"submit": "Submeter"
|
"submit": "Send inn"
|
||||||
},
|
},
|
||||||
"mfa": {
|
"mfa": {
|
||||||
"header": "Módulos de autenticação Multi-fator",
|
"header": "Flerfaktorautentiseringsmoduler",
|
||||||
"disable": "Desabilitar",
|
"disable": "Deaktiver",
|
||||||
"enable": "Habilitar",
|
"enable": "Aktiver",
|
||||||
"confirm_disable": "Você está seguro que deseja desabilitar {nome}?"
|
"confirm_disable": "Er du sikker på at du vil deaktivere {nome}?"
|
||||||
},
|
},
|
||||||
"mfa_setup": {
|
"mfa_setup": {
|
||||||
"title_aborted": "Abortado",
|
"title_aborted": "Avslutta",
|
||||||
"title_success": "Sucesso!",
|
"title_success": "Suksess!",
|
||||||
"step_done": "Configuraçãofeita por {step}",
|
"step_done": "Oppsett ferdig for {step}",
|
||||||
"close": "Fechar",
|
"close": "Lukk",
|
||||||
"submit": "Submeter"
|
"submit": "Send inn"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"page-authorize": {
|
"page-authorize": {
|
||||||
@ -698,6 +781,29 @@
|
|||||||
"abort": {
|
"abort": {
|
||||||
"not_whitelisted": "Datamaskina di er ikkje kvitelista."
|
"not_whitelisted": "Datamaskina di er ikkje kvitelista."
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "Brukarnamn",
|
||||||
|
"password": "Passord"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "To-faktorautentiseringskode"
|
||||||
|
},
|
||||||
|
"description": "Opne **{mfa_module_name}** på eininga di for å sjå to-faktorautentiseringskoda og verifiser identiteten din:"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "Ugyldig brukarnamn eller passord",
|
||||||
|
"invalid_code": "Ugyldig autentiseringskode"
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"login_expired": "Økta er utgått. Ver vennleg å logg inn igjen."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -721,9 +827,14 @@
|
|||||||
"lovelace": {
|
"lovelace": {
|
||||||
"cards": {
|
"cards": {
|
||||||
"shopping-list": {
|
"shopping-list": {
|
||||||
"checked_items": "Markerte element",
|
"checked_items": "Markerte elementa",
|
||||||
"clear_items": "Fjern dei markerrte elementa",
|
"clear_items": "Fjern dei markerrte elementa",
|
||||||
"add_item": "Legg til element"
|
"add_item": "Legg til element"
|
||||||
|
},
|
||||||
|
"empty_state": {
|
||||||
|
"title": "Velkommen heim",
|
||||||
|
"no_devices": "Denne sida let deg ta kontroll på einingane dine, men det ser ut til at du ikkje har sett opp noko endå. Gå til integrasjonssida for å setje i gang.",
|
||||||
|
"go_to_integrations_page": "Gå til integrasjonssida"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
@ -734,7 +845,8 @@
|
|||||||
"pick_card": "Vel kortet du vil legge til.",
|
"pick_card": "Vel kortet du vil legge til.",
|
||||||
"add": "Legg til kort",
|
"add": "Legg til kort",
|
||||||
"edit": "Redigere",
|
"edit": "Redigere",
|
||||||
"delete": "Slett"
|
"delete": "Slett",
|
||||||
|
"move": "Rørsle"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Konfigurasjonen er ikkje kompatibel",
|
"header": "Konfigurasjonen er ikkje kompatibel",
|
||||||
@ -755,10 +867,20 @@
|
|||||||
"para_sure": "Er du sikker på at du vil ta kontroll over brukergrensesnittet ditt?",
|
"para_sure": "Er du sikker på at du vil ta kontroll over brukergrensesnittet ditt?",
|
||||||
"cancel": "Gløym det",
|
"cancel": "Gløym det",
|
||||||
"save": "Ta kontroll"
|
"save": "Ta kontroll"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"raw_editor": "Rå konfigurasjonsredigerar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"configure_ui": "Konfigurer brukargrensesnitt"
|
"configure_ui": "Konfigurer brukargrensesnitt",
|
||||||
|
"unused_entities": "Ubrukte oppføringar",
|
||||||
|
"help": "Hjelp",
|
||||||
|
"refresh": "Oppdater"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Oppføringa er utilgjengelig: {entity}",
|
||||||
|
"entity_non_numeric": "Oppføringa er ikkje numerisk: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -831,7 +953,8 @@
|
|||||||
"arm_home": "Heimemodus",
|
"arm_home": "Heimemodus",
|
||||||
"arm_away": "Bortemodus",
|
"arm_away": "Bortemodus",
|
||||||
"arm_night": "Aktiver natt",
|
"arm_night": "Aktiver natt",
|
||||||
"armed_custom_bypass": "Tilpassa bypass"
|
"armed_custom_bypass": "Tilpassa bypass",
|
||||||
|
"arm_custom_bypass": "Tilpassa bypass"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Sist utløyst",
|
"last_triggered": "Sist utløyst",
|
||||||
@ -928,6 +1051,19 @@
|
|||||||
"save": "Lagre",
|
"save": "Lagre",
|
||||||
"name": "Namn",
|
"name": "Namn",
|
||||||
"entity_id": "Einings-ID"
|
"entity_id": "Einings-ID"
|
||||||
|
},
|
||||||
|
"more_info_control": {
|
||||||
|
"script": {
|
||||||
|
"last_action": "Siste handling "
|
||||||
|
},
|
||||||
|
"sun": {
|
||||||
|
"elevation": "Høgde",
|
||||||
|
"rising": "Hevande",
|
||||||
|
"setting": "Innstilling"
|
||||||
|
},
|
||||||
|
"updater": {
|
||||||
|
"title": "Oppdater instruksane"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"auth_store": {
|
"auth_store": {
|
||||||
@ -977,7 +1113,12 @@
|
|||||||
"updater": "Oppdateringar",
|
"updater": "Oppdateringar",
|
||||||
"weblink": "Nettlenke",
|
"weblink": "Nettlenke",
|
||||||
"zwave": "Z-Wave",
|
"zwave": "Z-Wave",
|
||||||
"vacuum": "Støvsugar"
|
"vacuum": "Støvsugar",
|
||||||
|
"zha": "ZHA",
|
||||||
|
"hassio": "Hass.io",
|
||||||
|
"homeassistant": "Home Assistant",
|
||||||
|
"lovelace": "Lovelace",
|
||||||
|
"system_health": "Systemhelse"
|
||||||
},
|
},
|
||||||
"attribute": {
|
"attribute": {
|
||||||
"weather": {
|
"weather": {
|
||||||
@ -985,5 +1126,14 @@
|
|||||||
"visibility": "Sikt",
|
"visibility": "Sikt",
|
||||||
"wind_speed": "Vindhastigheit"
|
"wind_speed": "Vindhastigheit"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Av",
|
||||||
|
"on": "På",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "włączony",
|
"on": "włączony",
|
||||||
"paused": "wstrzymany",
|
"paused": "wstrzymany",
|
||||||
"returning": "powrót do stacji dokującej"
|
"returning": "powrót do stacji dokującej"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktywny",
|
||||||
|
"idle": "bezczynny",
|
||||||
|
"paused": "wstrzymany"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -548,7 +553,15 @@
|
|||||||
"change_password": "Zmień hasło",
|
"change_password": "Zmień hasło",
|
||||||
"activate_user": "Aktywuj użytkownika",
|
"activate_user": "Aktywuj użytkownika",
|
||||||
"deactivate_user": "Dezaktywuj użytkownika",
|
"deactivate_user": "Dezaktywuj użytkownika",
|
||||||
"delete_user": "Usuń użytkownika"
|
"delete_user": "Usuń użytkownika",
|
||||||
|
"caption": "Wyświetl użytkownika"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Dodaj użytkownika",
|
||||||
|
"name": "Nazwa",
|
||||||
|
"username": "Nazwa użytkownika",
|
||||||
|
"password": "Hasło",
|
||||||
|
"create": "Utwórz"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -588,7 +601,9 @@
|
|||||||
"caption": "Rejestr lokalizacji",
|
"caption": "Rejestr lokalizacji",
|
||||||
"description": "Przegląd wszystkich lokalizacji w twoim domu.",
|
"description": "Przegląd wszystkich lokalizacji w twoim domu.",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Rejestr lokalizacji"
|
"header": "Rejestr lokalizacji",
|
||||||
|
"introduction": "Obszary służą do organizacji urządzeń. Informacje te będą używane w Home Assistant, aby pomóc w organizacji interfejsu, uprawnień i integracji z innymi systemami.",
|
||||||
|
"introduction2": "Aby umieścić urządzenia w danym obszarze, użyj poniższego linku, aby przejść do strony integracji, a następnie kliknij na skonfigurowaną integrację, aby dostać się do kart urządzeń."
|
||||||
},
|
},
|
||||||
"no_areas": "Wygląda na to, że jeszcze nie masz zdefiniowanych lokalizacji!",
|
"no_areas": "Wygląda na to, że jeszcze nie masz zdefiniowanych lokalizacji!",
|
||||||
"create_area": "STWÓRZ LOKALIZACJĘ",
|
"create_area": "STWÓRZ LOKALIZACJĘ",
|
||||||
@ -604,7 +619,9 @@
|
|||||||
"description": "Przegląd wszystkich znanych encji",
|
"description": "Przegląd wszystkich znanych encji",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Rejestr encji",
|
"header": "Rejestr encji",
|
||||||
"unavailable": "(niedostępna)"
|
"unavailable": "(niedostępna)",
|
||||||
|
"introduction": "Home Assistant prowadzi rejestr każdego podmiotu, jaki kiedykolwiek widział, i który można jednoznacznie zidentyfikować. Każda z tych jednostek będzie miała przypisany identyfikator podmiotu, który będzie zarezerwowany tylko dla tego podmiotu.",
|
||||||
|
"introduction2": "Użyj rejestru jednostek, aby nadpisać nazwę, zmienić identyfikator jednostki lub usunąć wpis z Home Assistant. Uwaga: usunięcie wpisu rejestru jednostki nie spowoduje usunięcia encji. Aby to zrobić, kliknij poniższy link i usuń go ze strony integracji."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Ta encja nie jest obecnie dostępna.",
|
"unavailable": "Ta encja nie jest obecnie dostępna.",
|
||||||
@ -829,7 +846,7 @@
|
|||||||
"add": "Dodaj kartę",
|
"add": "Dodaj kartę",
|
||||||
"edit": "Edytuj",
|
"edit": "Edytuj",
|
||||||
"delete": "Usuń",
|
"delete": "Usuń",
|
||||||
"move": "Ruch"
|
"move": "Przenieś"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Konfiguracja niekompatybilna",
|
"header": "Konfiguracja niekompatybilna",
|
||||||
@ -860,6 +877,10 @@
|
|||||||
"unused_entities": "Nieużywane encje",
|
"unused_entities": "Nieużywane encje",
|
||||||
"help": "Pomoc",
|
"help": "Pomoc",
|
||||||
"refresh": "Odśwież"
|
"refresh": "Odśwież"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Ta encja nie jest dostępna: {entity}",
|
||||||
|
"entity_non_numeric": "Ta encja nie jest numeryczna: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1105,5 +1126,14 @@
|
|||||||
"visibility": "Widoczność",
|
"visibility": "Widoczność",
|
||||||
"wind_speed": "Prędkość wiatru"
|
"wind_speed": "Prędkość wiatru"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Wył.",
|
||||||
|
"on": "Wł.",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -324,7 +324,7 @@
|
|||||||
"section": {
|
"section": {
|
||||||
"core": {
|
"core": {
|
||||||
"header": "Конфигурация и управление сервером",
|
"header": "Конфигурация и управление сервером",
|
||||||
"introduction": "Изменение конфигурации может быть утомительным процессом. Мы знаем. Этот раздел попытается сделать вашу жизнь немного легче.",
|
"introduction": "Изменение конфигурации может быть утомительным процессом. Мы знаем. Этот раздел может немного упростить эту задачу.",
|
||||||
"validation": {
|
"validation": {
|
||||||
"heading": "Проверка конфигурации",
|
"heading": "Проверка конфигурации",
|
||||||
"introduction": "Проверьте свою конфигурацию, если вы внесли в нее некоторые изменения и хотите убедиться в ее работоспособности",
|
"introduction": "Проверьте свою конфигурацию, если вы внесли в нее некоторые изменения и хотите убедиться в ее работоспособности",
|
||||||
@ -350,11 +350,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Настройка",
|
"caption": "Кастомизация",
|
||||||
"description": "Настраивайте Ваши объекты",
|
"description": "Настраивайте Ваши объекты",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Настройка",
|
"header": "Кастомизация",
|
||||||
"introduction": "Настроика атрибутов для каждой объекта. Добавленные\/отредактированные настройки сразу же вступают в силу. Удаленные настройки вступят в силу после обновления объекта."
|
"introduction": "Настройка атрибутов объектов. Добавленные или изменённые настройки сразу же вступают в силу. Удаленные настройки вступят в силу после обновления объекта."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
@ -566,7 +566,7 @@
|
|||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
"caption": "Home Assistant Cloud",
|
"caption": "Home Assistant Cloud",
|
||||||
"description_login": "Вы вошли как {email}",
|
"description_login": "Выполнен вход с учетной записью {email}",
|
||||||
"description_not_login": "Вход не выполнен"
|
"description_not_login": "Вход не выполнен"
|
||||||
},
|
},
|
||||||
"integrations": {
|
"integrations": {
|
||||||
@ -582,7 +582,7 @@
|
|||||||
"no_device": "Объекты без устройств",
|
"no_device": "Объекты без устройств",
|
||||||
"delete_confirm": "Вы уверены, что хотите удалить эту интеграцию?",
|
"delete_confirm": "Вы уверены, что хотите удалить эту интеграцию?",
|
||||||
"restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции",
|
"restart_confirm": "Перезапустите Home Assistant, чтобы завершить удаление этой интеграции",
|
||||||
"manuf": "Производитель: {manufacturer}",
|
"manuf": "{manufacturer}",
|
||||||
"hub": "Подключено через",
|
"hub": "Подключено через",
|
||||||
"firmware": "Прошивка: {version}",
|
"firmware": "Прошивка: {version}",
|
||||||
"device_unavailable": "устройство недоступно",
|
"device_unavailable": "устройство недоступно",
|
||||||
@ -602,7 +602,7 @@
|
|||||||
"description": "Управляйте помещениями в Вашем доме",
|
"description": "Управляйте помещениями в Вашем доме",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "Управление помещениями",
|
"header": "Управление помещениями",
|
||||||
"introduction": "Этот раздел используется для определения местоположения устройств. Данная информация будет использоваться в Home Assistant, чтобы помочь вам в организации вашего интерфейса, определения прав доступа и интеграции с другими системами.",
|
"introduction": "Этот раздел используется для определения местоположения устройств. Данная информация будет использоваться в Home Assistant, чтобы помочь вам в организации вашего интерфейса, определении прав доступа и интеграции с другими системами.",
|
||||||
"introduction2": "Чтобы назначить устройству местоположение, используйте указанную ниже ссылку для перехода на страницу интеграций, а затем откройте уже настроенную интеграцию."
|
"introduction2": "Чтобы назначить устройству местоположение, используйте указанную ниже ссылку для перехода на страницу интеграций, а затем откройте уже настроенную интеграцию."
|
||||||
},
|
},
|
||||||
"no_areas": "Похоже, что у Вас пока ещё нет добавленных помещений!",
|
"no_areas": "Похоже, что у Вас пока ещё нет добавленных помещений!",
|
||||||
@ -620,8 +620,8 @@
|
|||||||
"picker": {
|
"picker": {
|
||||||
"header": "Управление объектами",
|
"header": "Управление объектами",
|
||||||
"unavailable": "(недоступен)",
|
"unavailable": "(недоступен)",
|
||||||
"introduction": "Home Assistant ведет реестр каждого объекта, который когда-либо был настроен в системе. Каждому из этих объектов будет присвоен ID, который будет зарезервирован только для этого объекта.",
|
"introduction": "Home Assistant ведет реестр каждого объекта, который когда-либо был настроен в системе. Каждому из этих объектов присвоен ID, который зарезервирован только для этого объекта.",
|
||||||
"introduction2": "Используйте данный реестр, чтобы переопределить имя, изменить ID объекта или удалить запись из Home Assistant. Обратите внимание, что удаление записи из реестра объектов не удалит сам объект. Для этого перейдите по указанной ниже ссылке и удалите его со страницы интеграций."
|
"introduction2": "Используйте данный реестр, чтобы изменить ID или название объекта либо удалить запись из Home Assistant. Обратите внимание, что удаление записи из реестра объектов не удалит сам объект. Для этого перейдите по указанной ниже ссылке и удалите его со страницы интеграций."
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "Этот объект в настоящее время недоступен.",
|
"unavailable": "Этот объект в настоящее время недоступен.",
|
||||||
@ -635,7 +635,7 @@
|
|||||||
"description": "Определяйте людей, которых может отслеживать Home Assistant",
|
"description": "Определяйте людей, которых может отслеживать Home Assistant",
|
||||||
"detail": {
|
"detail": {
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
"device_tracker_intro": "Выберите устройства, которые принадлежат этому человеку.",
|
"device_tracker_intro": "Выберите устройства, отслеживающие этого человека.",
|
||||||
"device_tracker_picked": "Устройство для отслеживания",
|
"device_tracker_picked": "Устройство для отслеживания",
|
||||||
"device_tracker_pick": "Выберите устройство для отслеживания"
|
"device_tracker_pick": "Выберите устройство для отслеживания"
|
||||||
}
|
}
|
||||||
@ -687,7 +687,7 @@
|
|||||||
"last_used": "Последнее использование {date} из {location}",
|
"last_used": "Последнее использование {date} из {location}",
|
||||||
"not_used": "Никогда не использовался"
|
"not_used": "Никогда не использовался"
|
||||||
},
|
},
|
||||||
"current_user": "Вы вошли в систему как {fullName}.",
|
"current_user": "Добро пожаловать, {fullName}! Вы вошли в систему.",
|
||||||
"is_owner": "Вы являетесь владельцем.",
|
"is_owner": "Вы являетесь владельцем.",
|
||||||
"logout": "Выйти",
|
"logout": "Выйти",
|
||||||
"change_password": {
|
"change_password": {
|
||||||
@ -1049,7 +1049,7 @@
|
|||||||
"dialogs": {
|
"dialogs": {
|
||||||
"more_info_settings": {
|
"more_info_settings": {
|
||||||
"save": "Сохранить",
|
"save": "Сохранить",
|
||||||
"name": "Переопределение имени",
|
"name": "Название",
|
||||||
"entity_id": "ID объекта"
|
"entity_id": "ID объекта"
|
||||||
},
|
},
|
||||||
"more_info_control": {
|
"more_info_control": {
|
||||||
|
@ -53,20 +53,20 @@
|
|||||||
"on": "Detekterad"
|
"on": "Detekterad"
|
||||||
},
|
},
|
||||||
"motion": {
|
"motion": {
|
||||||
"off": "Av",
|
|
||||||
"on": "Detekterad"
|
|
||||||
},
|
|
||||||
"occupancy": {
|
|
||||||
"off": "Klart",
|
"off": "Klart",
|
||||||
"on": "Detekterad"
|
"on": "Detekterad"
|
||||||
},
|
},
|
||||||
|
"occupancy": {
|
||||||
|
"off": "Tomt",
|
||||||
|
"on": "Detekterad"
|
||||||
|
},
|
||||||
"smoke": {
|
"smoke": {
|
||||||
"off": "Av",
|
"off": "Klart",
|
||||||
"on": "Detekterad"
|
"on": "Detekterad"
|
||||||
},
|
},
|
||||||
"sound": {
|
"sound": {
|
||||||
"off": "Av",
|
"off": "Klart",
|
||||||
"on": "På"
|
"on": "Detekterad"
|
||||||
},
|
},
|
||||||
"vibration": {
|
"vibration": {
|
||||||
"off": "Klart",
|
"off": "Klart",
|
||||||
@ -265,6 +265,11 @@
|
|||||||
"on": "På",
|
"on": "På",
|
||||||
"paused": "Pausad",
|
"paused": "Pausad",
|
||||||
"returning": "Återgår till docka"
|
"returning": "Återgår till docka"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "aktiv",
|
||||||
|
"idle": "inaktiv",
|
||||||
|
"paused": "pausad"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -292,7 +297,7 @@
|
|||||||
"ui": {
|
"ui": {
|
||||||
"panel": {
|
"panel": {
|
||||||
"shopping-list": {
|
"shopping-list": {
|
||||||
"clear_completed": "Rensa klara",
|
"clear_completed": "Rensning slutförd",
|
||||||
"add_item": "Lägg till objekt",
|
"add_item": "Lägg till objekt",
|
||||||
"microphone_tip": "Tryck på mikrofonen längst upp till höger och säg \"Add candy to my shopping list\""
|
"microphone_tip": "Tryck på mikrofonen längst upp till höger och säg \"Add candy to my shopping list\""
|
||||||
},
|
},
|
||||||
@ -301,7 +306,8 @@
|
|||||||
"period": "Period"
|
"period": "Period"
|
||||||
},
|
},
|
||||||
"logbook": {
|
"logbook": {
|
||||||
"showing_entries": "Visar poster för"
|
"showing_entries": "Visar poster för",
|
||||||
|
"period": "Period"
|
||||||
},
|
},
|
||||||
"mailbox": {
|
"mailbox": {
|
||||||
"empty": "Du har inga meddelanden",
|
"empty": "Du har inga meddelanden",
|
||||||
@ -329,14 +335,14 @@
|
|||||||
"reloading": {
|
"reloading": {
|
||||||
"heading": "Uppdatering av konfigurationen",
|
"heading": "Uppdatering av konfigurationen",
|
||||||
"introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"Uppdatera\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.",
|
"introduction": "Vissa delar av Home Assistant kan laddas om utan att en omstart krävs. Att trycka på \"Uppdatera\" innebär att den nuvarande konfiguration inaktiveras och den nya laddas.",
|
||||||
"core": "Uppdatera core",
|
"core": "Uppdatera kärnan",
|
||||||
"group": "Uppdatera grupper",
|
"group": "Uppdatera grupper",
|
||||||
"automation": "Uppdatera automationer",
|
"automation": "Uppdatera automationer",
|
||||||
"script": "Uppdatera skript"
|
"script": "Uppdatera skript"
|
||||||
},
|
},
|
||||||
"server_management": {
|
"server_management": {
|
||||||
"heading": "Serverhantering",
|
"heading": "Serverhantering",
|
||||||
"introduction": "Hantera din Home Assistant-server... från Home Assistant.",
|
"introduction": "Hantera din Home Assistant server... från Home Assistant.",
|
||||||
"restart": "Starta om",
|
"restart": "Starta om",
|
||||||
"stop": "Stoppa"
|
"stop": "Stoppa"
|
||||||
}
|
}
|
||||||
@ -345,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Anpassning",
|
"caption": "Anpassning",
|
||||||
"description": "Anpassa dina entiteter"
|
"description": "Anpassa dina entiteter",
|
||||||
|
"picker": {
|
||||||
|
"header": "Anpassning",
|
||||||
|
"introduction": "Justera attribut per enhet. Tillagda och redigerade anpassningar kommer att tillträda omedelbart. Borttagna anpassningar kommer att träda i kraft när enheten är uppdaterad."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Automationer",
|
"caption": "Automationer",
|
||||||
@ -370,7 +380,7 @@
|
|||||||
"duplicate": "Duplicera",
|
"duplicate": "Duplicera",
|
||||||
"delete": "Radera",
|
"delete": "Radera",
|
||||||
"delete_confirm": "Säker på att du vill radera?",
|
"delete_confirm": "Säker på att du vill radera?",
|
||||||
"unsupported_platform": "Plattform stöds inte: {platform}",
|
"unsupported_platform": "Plattform stöds ej: {platform}",
|
||||||
"type_select": "Aktiveringstyp",
|
"type_select": "Aktiveringstyp",
|
||||||
"type": {
|
"type": {
|
||||||
"event": {
|
"event": {
|
||||||
@ -451,7 +461,7 @@
|
|||||||
"duplicate": "Duplicera",
|
"duplicate": "Duplicera",
|
||||||
"delete": "Radera",
|
"delete": "Radera",
|
||||||
"delete_confirm": "Säker på att du vill radera?",
|
"delete_confirm": "Säker på att du vill radera?",
|
||||||
"unsupported_condition": "Villkor stöds inte: {{condition}}",
|
"unsupported_condition": "Villkor stöds inte: {condition}",
|
||||||
"type_select": "Villkorstyp",
|
"type_select": "Villkorstyp",
|
||||||
"type": {
|
"type": {
|
||||||
"state": {
|
"state": {
|
||||||
@ -509,14 +519,14 @@
|
|||||||
},
|
},
|
||||||
"wait_template": {
|
"wait_template": {
|
||||||
"label": "paus",
|
"label": "paus",
|
||||||
"wait_template": "pause mall",
|
"wait_template": "paus mall",
|
||||||
"timeout": "Timeout (valfritt)"
|
"timeout": "Timeout (valfritt)"
|
||||||
},
|
},
|
||||||
"condition": {
|
"condition": {
|
||||||
"label": "Villkor"
|
"label": "Villkor"
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
"label": "Fire event",
|
"label": "Brand händelse",
|
||||||
"event": "Händelse",
|
"event": "Händelse",
|
||||||
"service_data": "Tjänstedata"
|
"service_data": "Tjänstedata"
|
||||||
}
|
}
|
||||||
@ -530,7 +540,7 @@
|
|||||||
},
|
},
|
||||||
"zwave": {
|
"zwave": {
|
||||||
"caption": "Z-Wave",
|
"caption": "Z-Wave",
|
||||||
"description": "Hantera ditt Z-Wave-nätverk"
|
"description": "Hantera ditt Z-Wave nätverk"
|
||||||
},
|
},
|
||||||
"users": {
|
"users": {
|
||||||
"caption": "Användare",
|
"caption": "Användare",
|
||||||
@ -543,11 +553,19 @@
|
|||||||
"change_password": "Ändra lösenord",
|
"change_password": "Ändra lösenord",
|
||||||
"activate_user": "Aktivera användare",
|
"activate_user": "Aktivera användare",
|
||||||
"deactivate_user": "Avaktivera användare",
|
"deactivate_user": "Avaktivera användare",
|
||||||
"delete_user": "Ta bort användare"
|
"delete_user": "Ta bort användare",
|
||||||
|
"caption": "Visa användare"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Lägg till användare",
|
||||||
|
"name": "Namn",
|
||||||
|
"username": "Användarnamn",
|
||||||
|
"password": "Lösenord",
|
||||||
|
"create": "Skapa"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
"caption": "Home Assistant moln",
|
"caption": "Home Assistant Cloud",
|
||||||
"description_login": "Inloggad som {email}",
|
"description_login": "Inloggad som {email}",
|
||||||
"description_not_login": "Inte inloggad"
|
"description_not_login": "Inte inloggad"
|
||||||
},
|
},
|
||||||
@ -568,32 +586,68 @@
|
|||||||
"hub": "Ansluten via",
|
"hub": "Ansluten via",
|
||||||
"firmware": "Firmware: {version}",
|
"firmware": "Firmware: {version}",
|
||||||
"device_unavailable": "enhet otillgänglig",
|
"device_unavailable": "enhet otillgänglig",
|
||||||
"entity_unavailable": "entitet otillgänglig"
|
"entity_unavailable": "entitet otillgänglig",
|
||||||
|
"no_area": "Inget område (\"area\")"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
"caption": "ZHA",
|
"caption": "ZHA",
|
||||||
"description": "Zigbee Home Automation nätverkhantering",
|
"description": "Zigbee Home Automation (ZHA) nätverkshantering",
|
||||||
"services": {
|
"services": {
|
||||||
"reconfigure": "Återkonfigurera ZHA-enheten (läka enheten). Använd det här om du har problem med enheten. Om den aktuella enheten är en batteridriven enhet, se till att den är vaken och accepterar kommandon när du använder den här tjänsten."
|
"reconfigure": "Omkonfigurera ZHA-enheten (läk enheten). Använd det här om du har problem med enheten. Om den aktuella enheten är en batteridriven enhet, se till att den är påslagen och accepterar kommandon när du använder den här tjänstens funktion."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
"caption": "Områdesregister",
|
"caption": "Områdesregister",
|
||||||
"description": "Oversikt över alla områden i ditt hem"
|
"description": "Oversikt över alla områden i ditt hem",
|
||||||
|
"picker": {
|
||||||
|
"header": "Områdesregister",
|
||||||
|
"introduction": "Områden används för att organisera var enheter befinner sig. Denna information kommer att användas i hela Home Assistant för att hjälpa dig att organisera ditt gränssnitt, behörigheter och integreringar med andra system.",
|
||||||
|
"introduction2": "Om du vill placera enheter i ett område använder du länken nedan för att navigera till integrationssidan och klickar sedan på en konfigurerad integration för att komma till enhetskort."
|
||||||
|
},
|
||||||
|
"no_areas": "Det verkar som om du inte har några områden än!",
|
||||||
|
"create_area": "SKAPA OMRÅDE",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Nytt område",
|
||||||
|
"delete": "RADERA",
|
||||||
|
"update": "UPPDATERA",
|
||||||
|
"create": "SKAPA"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Entitetsregister",
|
"caption": "Entitetsregister",
|
||||||
"description": "Översikt över alla kända entiteter"
|
"description": "Översikt över alla kända entiteter",
|
||||||
|
"picker": {
|
||||||
|
"header": "Enhetsregister",
|
||||||
|
"unavailable": "(ej tillgänglig)",
|
||||||
|
"introduction": "Home Assistanthar ett enhetsregister som innehåller varje enhet som någonsin har setts vars identifieras kan vara unikt. Var och en av dessa enheter kommer att ha ett ID-nummer som är reserverat för bara den enheten.",
|
||||||
|
"introduction2": "Använd enhetsregistret för att skriva över namnet, ändra ID eller ta bort posten ifrån Home Assistant. Obs! Att ta bort posten ifrån entity registry (enhetsregister) kommer inte att ta bort enheten. För att göra det, följ länken nedan och ta bort det från integreringssidan."
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Denna enhet är inte tillgänglig för tillfället.",
|
||||||
|
"default_name": "Nytt område",
|
||||||
|
"delete": "RADERA",
|
||||||
|
"update": "UPPDATERA"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Personer",
|
||||||
|
"description": "Hantera de personer som Home Assistant spårar.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Namn",
|
||||||
|
"device_tracker_intro": "Välj de enheter som tillhör till den här personen.",
|
||||||
|
"device_tracker_picked": "Spåra enheten",
|
||||||
|
"device_tracker_pick": "Välj enhet att spåra"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"push_notifications": {
|
"push_notifications": {
|
||||||
"header": "Pushmeddelanden",
|
"header": "Push-meddelanden",
|
||||||
"description": "Skicka meddelanden till den här enheten",
|
"description": "Skicka meddelanden till den här enheten",
|
||||||
"error_load_platform": "Konfigurera notify.html5.",
|
"error_load_platform": "Konfigurera notify.html5.",
|
||||||
"error_use_https": "Kräver att SSL aktiverat för frontend.",
|
"error_use_https": "Kräver att SSL är aktiverat för frontend.",
|
||||||
"push_notifications": "Pushmeddelanden",
|
"push_notifications": "Push-meddelanden",
|
||||||
"link_promo": "Läs mer"
|
"link_promo": "Läs mer"
|
||||||
},
|
},
|
||||||
"language": {
|
"language": {
|
||||||
@ -620,7 +674,7 @@
|
|||||||
},
|
},
|
||||||
"long_lived_access_tokens": {
|
"long_lived_access_tokens": {
|
||||||
"header": "Långlivade åtkomsttoken",
|
"header": "Långlivade åtkomsttoken",
|
||||||
"description": "Skapa långlivade åtkomsttokens för att låta dina skript interagera med din hemassistentenhet. Varje token kommer att vara giltig i 10 år från skapandet. Följande långlivade åtkomsttoken är för närvarande aktiva.",
|
"description": "Skapa långlivade åtkomsttokens för att låta dina skript interagera med din Home Assistant. Varje token kommer att vara giltig i 10 år från skapandet. Följande långlivade åtkomsttoken är för närvarande aktiva.",
|
||||||
"learn_auth_requests": "Lär dig hur du gör autentiserade förfrågningar.",
|
"learn_auth_requests": "Lär dig hur du gör autentiserade förfrågningar.",
|
||||||
"created_at": "Skapades den {date}",
|
"created_at": "Skapades den {date}",
|
||||||
"confirm_delete": "Är du säker du vill radera åtkomsttoken för {name}?",
|
"confirm_delete": "Är du säker du vill radera åtkomsttoken för {name}?",
|
||||||
@ -711,8 +765,8 @@
|
|||||||
"invalid_code": "Ogiltig autentiseringskod"
|
"invalid_code": "Ogiltig autentiseringskod"
|
||||||
},
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"no_api_password_set": "Du har inget API lösenord konfigurerat",
|
"no_api_password_set": "Du har inget API-lösenord konfigurerat",
|
||||||
"login_expired": "Sessionen avslutades. Logga in igen."
|
"login_expired": "Sessionen har gått ut, vänligen logga in igen."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"trusted_networks": {
|
"trusted_networks": {
|
||||||
@ -729,8 +783,26 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"command_line": {
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "Användarnamn",
|
||||||
|
"password": "Lösenord"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "Tvåfaktors autentiseringskod"
|
||||||
|
},
|
||||||
|
"description": "Öppna **{mfa_module_name}** på din enhet för att se din tvåfaktors autentiseringskod och verifiera din identitet:"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "Ogiltigt användarnamn eller lösenord",
|
||||||
|
"invalid_code": "Ogiltig autentiseringskod"
|
||||||
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"login_expired": "Sessionen avslutades. Logga in igen."
|
"login_expired": "Sessionen har gått ut, vänligen logga in igen."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -773,12 +845,13 @@
|
|||||||
"pick_card": "Välj det kort du vill lägga till.",
|
"pick_card": "Välj det kort du vill lägga till.",
|
||||||
"add": "Lägg till kort",
|
"add": "Lägg till kort",
|
||||||
"edit": "Redigera",
|
"edit": "Redigera",
|
||||||
"delete": "Ta bort"
|
"delete": "Ta bort",
|
||||||
|
"move": "Flytta"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Konfigurationen är inte giltig",
|
"header": "Konfigurationen är inte giltig",
|
||||||
"para_no_id": "Det här elementet har inget ID. Lägg till ett ID till det här elementet i \"ui-lovelace.yaml\".",
|
"para_no_id": "Det här elementet har inget ID. Lägg till ett ID till det här elementet i \"ui-lovelace.yaml\".",
|
||||||
"para_migrate": "Home Assistant kan automatiskt lägga till IDn till alla dina kort och vyer genom att du klickar på \"Migrera konfiguration\".",
|
"para_migrate": "Home Assistant kan automatiskt lägga till ID till alla dina kort och vyer genom att du klickar på \"Migrera konfiguration\".",
|
||||||
"migrate": "Migrera konfigurationen"
|
"migrate": "Migrera konfigurationen"
|
||||||
},
|
},
|
||||||
"header": "Ändra användargränssnittet",
|
"header": "Ändra användargränssnittet",
|
||||||
@ -789,15 +862,25 @@
|
|||||||
"delete": "Radera vy"
|
"delete": "Radera vy"
|
||||||
},
|
},
|
||||||
"save_config": {
|
"save_config": {
|
||||||
"header": "Ta kontroll över din Lovelace UI",
|
"header": "Ta kontroll över ditt Lovelace användargränssnitt",
|
||||||
"para": "Home Assistant kommer som standard att behålla ditt användargränssnitt, uppdatera det när nya enheter eller Lovelace-komponenter blir tillgängliga. Om du tar kontroll kommer vi inte längre göra ändringar automatiskt för dig.",
|
"para": "Home Assistant kommer som standard att behålla ditt användargränssnitt, uppdatera det när nya enheter eller Lovelace-komponenter blir tillgängliga. Om du tar kontroll kommer vi inte längre göra ändringar automatiskt för dig.",
|
||||||
"para_sure": "Är du säker på att du vill ta kontroll över ditt användargränssnitt?",
|
"para_sure": "Är du säker på att du vill ta kontroll över ditt användargränssnitt?",
|
||||||
"cancel": "Glöm det",
|
"cancel": "Glöm det",
|
||||||
"save": "Ta kontroll"
|
"save": "Ta kontroll"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"raw_editor": "Rå konfigurationseditor"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"menu": {
|
"menu": {
|
||||||
"configure_ui": "Konfigurera användargränssnittet"
|
"configure_ui": "Konfigurera användargränssnittet",
|
||||||
|
"unused_entities": "Oanvända enheter",
|
||||||
|
"help": "Hjälp",
|
||||||
|
"refresh": "Uppdatera"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Enheten är ej tillgänglig: {entity}",
|
||||||
|
"entity_non_numeric": "Enheten är icke-numerisk: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -870,7 +953,8 @@
|
|||||||
"arm_home": "Larma hemmaläge",
|
"arm_home": "Larma hemmaläge",
|
||||||
"arm_away": "Larma bortaläge",
|
"arm_away": "Larma bortaläge",
|
||||||
"arm_night": "Larma nattläge",
|
"arm_night": "Larma nattläge",
|
||||||
"armed_custom_bypass": "Larm förbikopplat"
|
"armed_custom_bypass": "Larm förbikopplat",
|
||||||
|
"arm_custom_bypass": "Larm förbikopplat"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "Utlöstes senast",
|
"last_triggered": "Utlöstes senast",
|
||||||
@ -957,7 +1041,7 @@
|
|||||||
},
|
},
|
||||||
"notification_toast": {
|
"notification_toast": {
|
||||||
"entity_turned_on": "Slog på {entity}.",
|
"entity_turned_on": "Slog på {entity}.",
|
||||||
"entity_turned_off": "Stängde av {entity}.",
|
"entity_turned_off": "Slog av {entity}.",
|
||||||
"service_called": "Tjänsten {service} anropad.",
|
"service_called": "Tjänsten {service} anropad.",
|
||||||
"service_call_failed": "Misslyckades med att anropa tjänsten {service}.",
|
"service_call_failed": "Misslyckades med att anropa tjänsten {service}.",
|
||||||
"connection_lost": "Anslutning tappad. Ansluter igen..."
|
"connection_lost": "Anslutning tappad. Ansluter igen..."
|
||||||
@ -965,7 +1049,7 @@
|
|||||||
"dialogs": {
|
"dialogs": {
|
||||||
"more_info_settings": {
|
"more_info_settings": {
|
||||||
"save": "Spara",
|
"save": "Spara",
|
||||||
"name": "Namn",
|
"name": "Skriv över namn",
|
||||||
"entity_id": "Entitets-ID"
|
"entity_id": "Entitets-ID"
|
||||||
},
|
},
|
||||||
"more_info_control": {
|
"more_info_control": {
|
||||||
@ -974,7 +1058,7 @@
|
|||||||
},
|
},
|
||||||
"sun": {
|
"sun": {
|
||||||
"elevation": "Elevation",
|
"elevation": "Elevation",
|
||||||
"rising": "Solupgång",
|
"rising": "Soluppgång",
|
||||||
"setting": "Solnedgång"
|
"setting": "Solnedgång"
|
||||||
},
|
},
|
||||||
"updater": {
|
"updater": {
|
||||||
@ -1042,5 +1126,14 @@
|
|||||||
"visibility": "Sikt",
|
"visibility": "Sikt",
|
||||||
"wind_speed": "Vindhastighet"
|
"wind_speed": "Vindhastighet"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Av",
|
||||||
|
"on": "På",
|
||||||
|
"auto": "Auto"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -12,7 +12,9 @@
|
|||||||
"dev-events": "เหตุการณ์",
|
"dev-events": "เหตุการณ์",
|
||||||
"dev-templates": "แม่แบบ",
|
"dev-templates": "แม่แบบ",
|
||||||
"dev-mqtt": "MQTT",
|
"dev-mqtt": "MQTT",
|
||||||
"dev-info": "ข้อมูล"
|
"dev-info": "ข้อมูล",
|
||||||
|
"calendar": "ปฏิทิน",
|
||||||
|
"profile": "ข้อมูลส่วนตัว"
|
||||||
},
|
},
|
||||||
"state": {
|
"state": {
|
||||||
"default": {
|
"default": {
|
||||||
@ -256,9 +258,18 @@
|
|||||||
},
|
},
|
||||||
"vacuum": {
|
"vacuum": {
|
||||||
"cleaning": "กำลังทำความสะอาด",
|
"cleaning": "กำลังทำความสะอาด",
|
||||||
|
"docked": "เชื่อมต่อ",
|
||||||
|
"error": "ผิดพลาด",
|
||||||
"idle": "ว่าง",
|
"idle": "ว่าง",
|
||||||
"off": "ปิด",
|
"off": "ปิด",
|
||||||
"on": "เปิด"
|
"on": "เปิด",
|
||||||
|
"paused": "หยุดชั่วคราว",
|
||||||
|
"returning": "กลับไปจุดเชื่อมต่อ"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "ใช้งานอยู่",
|
||||||
|
"idle": "ไม่ได้ใช้งาน",
|
||||||
|
"paused": "หยุดชั่วคราว"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -295,7 +306,8 @@
|
|||||||
"period": "ระยะเวลา"
|
"period": "ระยะเวลา"
|
||||||
},
|
},
|
||||||
"logbook": {
|
"logbook": {
|
||||||
"showing_entries": "แสดงรายการ"
|
"showing_entries": "แสดงรายการ",
|
||||||
|
"period": "ระยะเวลา"
|
||||||
},
|
},
|
||||||
"mailbox": {
|
"mailbox": {
|
||||||
"empty": "ไม่มีข้อความ",
|
"empty": "ไม่มีข้อความ",
|
||||||
@ -339,7 +351,10 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "การปรับแต่ง",
|
"caption": "การปรับแต่ง",
|
||||||
"description": "ปรับแต่งรายการของคุณ"
|
"description": "ปรับแต่งรายการของคุณ",
|
||||||
|
"picker": {
|
||||||
|
"header": "การปรับแต่ง"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "การทำงานอัตโนมัติ",
|
"caption": "การทำงานอัตโนมัติ",
|
||||||
@ -417,6 +432,24 @@
|
|||||||
"event": "เหตุการณ์",
|
"event": "เหตุการณ์",
|
||||||
"enter": "เข้าสู่",
|
"enter": "เข้าสู่",
|
||||||
"leave": "ออกจาก"
|
"leave": "ออกจาก"
|
||||||
|
},
|
||||||
|
"webhook": {
|
||||||
|
"label": "Webhook",
|
||||||
|
"webhook_id": "Webhook ID"
|
||||||
|
},
|
||||||
|
"time_pattern": {
|
||||||
|
"label": "รูปแบบเวลา",
|
||||||
|
"hours": "ชั่วโมง",
|
||||||
|
"minutes": "นาที",
|
||||||
|
"seconds": "วินาที"
|
||||||
|
},
|
||||||
|
"geo_location": {
|
||||||
|
"label": "พิกัดตำแหน่ง",
|
||||||
|
"source": "แหล่งที่มา",
|
||||||
|
"zone": "โซน",
|
||||||
|
"event": "เหตุการณ์:",
|
||||||
|
"enter": "เข้าสู่",
|
||||||
|
"leave": "ออก"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -508,46 +541,326 @@
|
|||||||
"caption": "Z-Wave",
|
"caption": "Z-Wave",
|
||||||
"description": "จัดการเครือข่าย Z-Wave"
|
"description": "จัดการเครือข่าย Z-Wave"
|
||||||
},
|
},
|
||||||
|
"users": {
|
||||||
|
"caption": "ผู้ใช้",
|
||||||
|
"description": "จัดการผู้ใช้",
|
||||||
|
"picker": {
|
||||||
|
"title": "ผู้ใช้"
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"rename_user": "เปลี่ยนชื่อผู้ใช้",
|
||||||
|
"change_password": "เปลี่ยนรหัสผ่าน",
|
||||||
|
"activate_user": "เปิดใช้งานผู้ใช้",
|
||||||
|
"deactivate_user": "ปิดใช้งานผู้ใช้",
|
||||||
|
"delete_user": "ลบผู้ใช้",
|
||||||
|
"caption": "เพิ่มผู้ใช้"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "เพิ่มผู้ใช้",
|
||||||
|
"name": "ชื่อ",
|
||||||
|
"username": "ชื่อผู้ใช้",
|
||||||
|
"password": "รหัสผ่าน",
|
||||||
|
"create": "สร้าง"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
"description_login": "ลงชื่อเข้าใช้เป็น {email}"
|
"caption": "Home Assistant Cloud",
|
||||||
|
"description_login": "ลงชื่อเข้าใช้เป็น {email}",
|
||||||
|
"description_not_login": "ยังไม่ได้เข้าสู่ระบบ"
|
||||||
},
|
},
|
||||||
"integrations": {
|
"integrations": {
|
||||||
|
"discovered": "ค้นพบแล้ว",
|
||||||
|
"configured": "การกำหนดค่าแล้ว",
|
||||||
|
"configure": "ปรับแต่ง",
|
||||||
|
"none": "ยังไม่มีการกำหนดค่าใดๆ เลย",
|
||||||
"config_entry": {
|
"config_entry": {
|
||||||
|
"no_device": "เป็น Entities โดยไม่มีอุปกรณ์",
|
||||||
"delete_confirm": "แน่ใจหรือว่าต้องการจะลบการบูรณาการนี้",
|
"delete_confirm": "แน่ใจหรือว่าต้องการจะลบการบูรณาการนี้",
|
||||||
"restart_confirm": "เริ่ม Home Assistant ใหม่หลังจากลบการบูรณาการนี้",
|
"restart_confirm": "เริ่ม Home Assistant ใหม่หลังจากลบการบูรณาการนี้",
|
||||||
"manuf": "โดย {manufacturer}",
|
"manuf": "โดย {manufacturer}",
|
||||||
"hub": "เชื่อมต่อแล้ว",
|
"hub": "เชื่อมต่อแล้ว",
|
||||||
"firmware": "เฟิร์มแวร์: {version}"
|
"firmware": "Firmware: {version}",
|
||||||
}
|
"device_unavailable": "อุปกรณ์นี้ไม่พร้อมใช้งาน",
|
||||||
|
"entity_unavailable": "Entity นี้ไม่พร้อมใช้งาน",
|
||||||
|
"no_area": "ไม่มีพื้นที่"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"page-authorize": {
|
"zha": {
|
||||||
"form": {
|
"caption": "ZHA",
|
||||||
"providers": {
|
"description": "การจัดการระบบอัติโนมัติของ Zigbee"
|
||||||
"legacy_api_password": {
|
},
|
||||||
"abort": {
|
"area_registry": {
|
||||||
"login_expired": "เซสชั่นหมดอายุ โปรดเข้าสู่ระบบใหม่"
|
"caption": "การลงทะเบียนพื้นที่",
|
||||||
|
"description": "ภาพรวมของพื้นที่ทั้งหมดในบ้านของคุณ",
|
||||||
|
"picker": {
|
||||||
|
"header": "การลงทะเบียนพื้นที่"
|
||||||
|
},
|
||||||
|
"no_areas": "ดูเหมือนว่าคุณยังไม่มีพื้นที่เลย!",
|
||||||
|
"create_area": "สร้างพื้นที่",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "พื้นที่ใหม่",
|
||||||
|
"delete": "ลบ",
|
||||||
|
"update": "แก้ไข",
|
||||||
|
"create": "สร้าง"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"entity_registry": {
|
||||||
|
"caption": "Entity Registry",
|
||||||
|
"description": "ภาพรวมของ Entity ที่รู้จักทั้งหมด",
|
||||||
|
"picker": {
|
||||||
|
"header": "Entity Registry",
|
||||||
|
"unavailable": "(ไม่พร้อมใช้งาน)"
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Entity นี้ยังไม่พร้อมใช้งานในขณะนี้",
|
||||||
|
"default_name": "พื้นที่ใหม่",
|
||||||
|
"delete": "ลบ",
|
||||||
|
"update": "แก้ไข"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "บุคคล",
|
||||||
|
"description": "จัดการบุคคลที่ระบบจะทำการติดตาม",
|
||||||
|
"detail": {
|
||||||
|
"name": "ชื่อ",
|
||||||
|
"device_tracker_intro": "เลือกอุปกรณ์ที่จะให้บุคคลนี้เป็นเจ้าของ",
|
||||||
|
"device_tracker_picked": "ติดตามอุปกรณ์",
|
||||||
|
"device_tracker_pick": "เลือกอุปกรณ์ที่จะติดตาม"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
|
"push_notifications": {
|
||||||
|
"header": "การแจ้งเตือน",
|
||||||
|
"description": "ส่งการแจ้งเตือนไปยังอุปกรณ์นี้",
|
||||||
|
"error_load_platform": "กำหนดค่า notify.html5.",
|
||||||
|
"error_use_https": "ต้องเปิดใช้งาน SSL สำหรับส่วนหน้า",
|
||||||
|
"push_notifications": "การแจ้งเตือน",
|
||||||
|
"link_promo": "เรียนรู้เพิ่มเติม"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"header": "ภาษา",
|
||||||
|
"link_promo": "ช่วยเราแปลภาษาเป็นประเทศของคุณ",
|
||||||
|
"dropdown_label": "ภาษา"
|
||||||
|
},
|
||||||
|
"themes": {
|
||||||
|
"header": "ชุดตกแต่ง",
|
||||||
|
"error_no_theme": "ไม่มีธีม",
|
||||||
|
"link_promo": "เรียนรู้เกี่ยวกับธีม",
|
||||||
|
"dropdown_label": "ธีม"
|
||||||
|
},
|
||||||
|
"refresh_tokens": {
|
||||||
|
"header": "Refresh Tokens",
|
||||||
|
"description": "ในการโหลดใหม่แต่ละครั้ง Refresh Token จะถูกมองเห็นเป็น Login Session และ Refresh Token จะถูกลบโดยอัติโนมัติ เมื่อคุณออกจากระบบ ตามข้างต้น Refresh Token จะยังใช้อยู่ในบัญชีของคุณเสมอ",
|
||||||
|
"token_title": "Refresh Tokens สำหรับ {clientId}",
|
||||||
|
"created_at": "สร้างเมื่อ {date}",
|
||||||
|
"confirm_delete": "คุณแน่ใจหรือไม่ว่าต้องการลบ Refresh Tokens ของ {name} ?",
|
||||||
|
"delete_failed": "การลบ Refresh Token ล้มเหลว",
|
||||||
|
"last_used": "ใช้ครั้งล่าสุดเมื่อ {date} ในตำแหน่ง {location}",
|
||||||
|
"not_used": "ยังไม่เคยถูกใช้งาน",
|
||||||
|
"current_token_tooltip": "ไม่สามารถลบ Refresh Token ปัจจุบันได้"
|
||||||
|
},
|
||||||
"long_lived_access_tokens": {
|
"long_lived_access_tokens": {
|
||||||
"confirm_delete": "คุณแน่ใจหรือไม่ว่าต้องการลบโทเค็นการเข้าถึงของ {name} ?"
|
"header": "Access Tokens สำหรับการเข้าถึงระยะยาว",
|
||||||
|
"learn_auth_requests": "เรียนรู้วิธีสร้างคำขอที่มีการรับรองความถูกต้อง",
|
||||||
|
"created_at": "สร้างเมื่อ {date}",
|
||||||
|
"confirm_delete": "คุณแน่ใจหรือไม่ว่าต้องการลบโทเค็นการเข้าถึงของ {name} ?",
|
||||||
|
"delete_failed": "เกิดข้อผิดพลาดในการลบ Access Token ",
|
||||||
|
"create": "สร้าง Token ใหม่",
|
||||||
|
"create_failed": "เกิดข้อผิดพลาดในการลบ Access Token ",
|
||||||
|
"prompt_name": "ชื่อ?",
|
||||||
|
"prompt_copy_token": "จด Access Token ของคุณไว้ที่อื่นด้วย มันจะไม่แสดงให้เห็นอีกแล้วหลังจากนี้",
|
||||||
|
"empty_state": "คุณยังไม่มี Access Token ระยะยาวเลย",
|
||||||
|
"last_used": "ใช้ครั้งล่าสุดเมื่อ {date} ในตำแหน่ง {location}",
|
||||||
|
"not_used": "ยังไม่เคยถูกใช้งาน"
|
||||||
},
|
},
|
||||||
"current_user": "ขณะนี้คุณเข้าสู่ระบบในชื่อ {fullName}",
|
"current_user": "ขณะนี้คุณเข้าสู่ระบบในชื่อ {fullName}",
|
||||||
|
"is_owner": "คุณเป็นเจ้าของ",
|
||||||
|
"logout": "ชื่อผู้ใช้",
|
||||||
"change_password": {
|
"change_password": {
|
||||||
"header": "เปลี่ยนรหัสผ่าน",
|
"header": "เปลี่ยนรหัสผ่าน",
|
||||||
"current_password": "รหัสผ่านปัจจุบัน"
|
"current_password": "รหัสผ่านปัจจุบัน",
|
||||||
|
"new_password": "รหัสผ่านใหม่",
|
||||||
|
"confirm_new_password": "ยืนยันรหัสผ่านใหม่",
|
||||||
|
"error_required": "ต้องระบุ",
|
||||||
|
"submit": "ส่งข้อมูล"
|
||||||
},
|
},
|
||||||
"mfa": {
|
"mfa": {
|
||||||
|
"header": "โมดูลการรับรองความถูกต้องด้วยหลายปัจจัย",
|
||||||
"disable": "ปิดการใช้งาน",
|
"disable": "ปิดการใช้งาน",
|
||||||
"enable": "เปิดใช้งาน",
|
"enable": "เปิดใช้งาน",
|
||||||
"confirm_disable": "คุณแน่ใจหรือไม่ว่าต้องการปิดใช้งาน {name} ?"
|
"confirm_disable": "คุณแน่ใจหรือไม่ว่าต้องการปิดใช้งาน {name} ?"
|
||||||
},
|
},
|
||||||
"mfa_setup": {
|
"mfa_setup": {
|
||||||
"title_success": "งานสำเร็จ!"
|
"title_aborted": "ยกเลิก",
|
||||||
|
"title_success": "สำเร็จ!",
|
||||||
|
"step_done": "ติดตั้งเสร็จแล้วในขั้นตอนที่ {step}",
|
||||||
|
"close": "ปิด",
|
||||||
|
"submit": "ส่งข้อมูล"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"page-authorize": {
|
||||||
|
"initializing": "กำลังเริ่มการทำงาน",
|
||||||
|
"authorizing_client": "คุณกำลังจะให้ {clientId} เข้าถึงเซิร์ฟเวอร์ Home Assistant ของคุณ",
|
||||||
|
"logging_in_with": "เข้าสู่ระบบด้วย ** {authProviderName} **",
|
||||||
|
"pick_auth_provider": "หรือเข้าสู่ระบบด้วย",
|
||||||
|
"abort_intro": "เข้าสู่ระบบถูกยกเลิก",
|
||||||
|
"form": {
|
||||||
|
"working": "กรุณารอสักครู่",
|
||||||
|
"unknown_error": "มีบางอย่างผิดพลาด",
|
||||||
|
"providers": {
|
||||||
|
"homeassistant": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "ชื่อผู้ใช้",
|
||||||
|
"password": "รหัสผ่าน"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "รหัสรับรองความถูกต้องสองปัจจัย"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "ชื่อผู้ใช้หรือรหัสผ่านไม่ถูกต้อง",
|
||||||
|
"invalid_code": "รหัสรับรองความถูกต้องสองปัจจัย ไม่ถูกต้อง"
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"login_expired": "เซสชันหมดอายุ กรุณาเข้าสู่ระบบอีกครั้ง"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"legacy_api_password": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"password": "รหัสผ่าน API"
|
||||||
|
},
|
||||||
|
"description": "โปรดป้อน API Password ในการกำหนดค่า http ของคุณ:"
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "รหัสรับรองความถูกต้องสองปัจจัย"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "API Password ไม่ถูกต้อง",
|
||||||
|
"invalid_code": "รหัสรับรองความถูกต้องสองปัจจัย ไม่ถูกต้อง"
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"no_api_password_set": "คุณยังไม่ได้ตั้งค่า API Password เลย",
|
||||||
|
"login_expired": "เซสชั่นหมดอายุ โปรดเข้าสู่ระบบใหม่"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"trusted_networks": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"user": "ผู้ใช้"
|
||||||
|
},
|
||||||
|
"description": "โปรดเลือกผู้ใช้ที่ คุณต้องการเข้าสู่ระบบในชื่อของ "
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"not_whitelisted": "คอมพิวเตอร์ของคุณไม่ได้รับสิทธิ์ในการเข้าถึง"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"command_line": {
|
||||||
|
"step": {
|
||||||
|
"init": {
|
||||||
|
"data": {
|
||||||
|
"username": "ชื่อผู้ใช้",
|
||||||
|
"password": "รหัสผ่าน"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mfa": {
|
||||||
|
"data": {
|
||||||
|
"code": "รหัสผ่านยืนยัน 2 ขั้นตอน"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"invalid_auth": "ชื่อผู้ใช้ หรือ รหัสผ่าน ไม่ถูกต้อง",
|
||||||
|
"invalid_code": "โค๊ตการเข้าสู่ระบบไม่ถูกต้อง"
|
||||||
|
},
|
||||||
|
"abort": {
|
||||||
|
"login_expired": "เซสชันหมดอายุ กรุณาเข้าสู่ระบบอีกครั้ง"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"page-onboarding": {
|
||||||
|
"user": {
|
||||||
|
"intro": "มาเริ่มกันเลยด้วยการสร้างบัญชีผู้ใช้",
|
||||||
|
"required_field": "ต้องระบุ",
|
||||||
|
"data": {
|
||||||
|
"name": "ชื่อ",
|
||||||
|
"username": "ชื่อผู้ใช้",
|
||||||
|
"password": "รหัสผ่าน"
|
||||||
|
},
|
||||||
|
"create_account": "สร้างบัญชี",
|
||||||
|
"error": {
|
||||||
|
"required_fields": "กรอกข้อมูลในฟิลด์ที่จำเป็นทั้งหมด"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lovelace": {
|
||||||
|
"cards": {
|
||||||
|
"shopping-list": {
|
||||||
|
"checked_items": "รายการที่เลือก",
|
||||||
|
"clear_items": "ล้างรายการที่เลือก",
|
||||||
|
"add_item": "เพิ่มรายการ"
|
||||||
|
},
|
||||||
|
"empty_state": {
|
||||||
|
"title": "ยินดีต้อนรับกลับบ้าน",
|
||||||
|
"go_to_integrations_page": "ไปที่หน้าการรวมระบบ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"edit_card": {
|
||||||
|
"header": "การกำหนดค่าการ์ด",
|
||||||
|
"save": "บันทึก",
|
||||||
|
"toggle_editor": "เปิด\/ปิดเครื่องมือแก้ไข",
|
||||||
|
"pick_card": "เลือกการ์ดที่คุณอยากจะเพิ่ม",
|
||||||
|
"add": "เพิ่มการ์ดใหม่",
|
||||||
|
"edit": "แก้ไข",
|
||||||
|
"delete": "ลบ",
|
||||||
|
"move": "ย้าย"
|
||||||
|
},
|
||||||
|
"migrate": {
|
||||||
|
"header": "การกำหนดค่าไม่ถูกต้อง",
|
||||||
|
"migrate": "โอนย้ายการกำหนดค่า"
|
||||||
|
},
|
||||||
|
"header": "แก้ไข UI",
|
||||||
|
"edit_view": {
|
||||||
|
"header": "ดูการกำหนดค่า",
|
||||||
|
"add": "เพิ่มมุมมอง",
|
||||||
|
"edit": "แก้ไขมุมมอง",
|
||||||
|
"delete": "ลบมุมมอง"
|
||||||
|
},
|
||||||
|
"save_config": {
|
||||||
|
"header": "ควบคุม Lovelace UI ในแบบของคุณ",
|
||||||
|
"para": "โดยเริ่มต้น Home Assistant จะควบคุมส่วนต่อประสานผู้ใช้งานเอง เมื่อมี Entity หรือส่วนควบคุมใหม่ๆ จะถูกแสดงขึ้นให้เอง แต่ถ้าคุณอยากจะควบคุมเอง เราจะไม่มีการอัพเดทตามข้างต้นให้กับคุณ",
|
||||||
|
"para_sure": "คุณแน่ใจหรือไม่ว่าต้องการควบคุมส่วนต่อประสานผู้ใช้งาน?",
|
||||||
|
"cancel": "ไม่เป็นไร",
|
||||||
|
"save": "ใช้การควบคุม"
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"raw_editor": "ตัวแก้ไข config แบบดิบๆ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"menu": {
|
||||||
|
"configure_ui": "ตั้งค่า UI",
|
||||||
|
"unused_entities": "Entity ที่ไม่ได้ถูกใช้",
|
||||||
|
"help": "วิธีใช้",
|
||||||
|
"refresh": "รีเฟรช"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Entity ไม่พร้อมใช้งาน: {entity}",
|
||||||
|
"entity_non_numeric": "Entity ที่ไม่ใช่ตัวเลข: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -557,7 +870,8 @@
|
|||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"loading": "กำลังโหลด",
|
"loading": "กำลังโหลด",
|
||||||
"cancel": "ยกเลิก"
|
"cancel": "ยกเลิก",
|
||||||
|
"save": "บันทึก"
|
||||||
},
|
},
|
||||||
"duration": {
|
"duration": {
|
||||||
"day": "วัน",
|
"day": "วัน",
|
||||||
@ -611,7 +925,14 @@
|
|||||||
"forecast": "พยากรณ์"
|
"forecast": "พยากรณ์"
|
||||||
},
|
},
|
||||||
"alarm_control_panel": {
|
"alarm_control_panel": {
|
||||||
"disarm": "ปิดระบบสัญญาณกันขโมย"
|
"code": "รหัส",
|
||||||
|
"clear_code": "ล้าง",
|
||||||
|
"disarm": "ปิดระบบสัญญาณกันขโมย",
|
||||||
|
"arm_home": "ล็อคแบบอยู่บ้าน",
|
||||||
|
"arm_away": "ล็อคแบบออกข้างนอก",
|
||||||
|
"arm_night": "เฝ้ายามกลางคืน",
|
||||||
|
"armed_custom_bypass": "ปล่อยผ่านตามที่กำหนด",
|
||||||
|
"arm_custom_bypass": "ปล่อยผ่านตามที่กำหนด"
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"last_triggered": "การทำงานครั้งล่าสุด",
|
"last_triggered": "การทำงานครั้งล่าสุด",
|
||||||
@ -633,16 +954,30 @@
|
|||||||
"effect": "ลูกเล่น"
|
"effect": "ลูกเล่น"
|
||||||
},
|
},
|
||||||
"media_player": {
|
"media_player": {
|
||||||
"text_to_speak": "ข้อความที่จะให้ออกเสียง"
|
"text_to_speak": "ข้อความที่จะให้ออกเสียง",
|
||||||
|
"source": "แหล่งที่มา",
|
||||||
|
"sound_mode": "โหมดเสียง"
|
||||||
},
|
},
|
||||||
"climate": {
|
"climate": {
|
||||||
"currently": "ในขณะนี้",
|
"currently": "ในขณะนี้",
|
||||||
"on_off": "เปิด \/ ปิด",
|
"on_off": "เปิด \/ ปิด",
|
||||||
"target_temperature": "อุณหภูมิที่ต้องการ",
|
"target_temperature": "อุณหภูมิที่ต้องการ",
|
||||||
"target_humidity": "ค่าความชื้นที่ต้องการ"
|
"target_humidity": "ค่าความชื้นที่ต้องการ",
|
||||||
|
"operation": "การทำงาน",
|
||||||
|
"fan_mode": "โหมดของพัดลม",
|
||||||
|
"swing_mode": "โหมดแกว่ง",
|
||||||
|
"away_mode": "โหมดไม่อยู่บ้าน"
|
||||||
|
},
|
||||||
|
"lock": {
|
||||||
|
"code": "Code",
|
||||||
|
"lock": "ล็อค",
|
||||||
|
"unlock": "ปลดล็อค"
|
||||||
},
|
},
|
||||||
"vacuum": {
|
"vacuum": {
|
||||||
"actions": {
|
"actions": {
|
||||||
|
"resume_cleaning": "ทำความสะอาดต่อไป",
|
||||||
|
"return_to_base": "กลับไปจุดเชื่อมต่อ",
|
||||||
|
"start_cleaning": "เริ่มทำความสะอาด",
|
||||||
"turn_on": "เปิดใข้งาน",
|
"turn_on": "เปิดใข้งาน",
|
||||||
"turn_off": "ปิดใข้งาน"
|
"turn_off": "ปิดใข้งาน"
|
||||||
}
|
}
|
||||||
@ -650,7 +985,9 @@
|
|||||||
"water_heater": {
|
"water_heater": {
|
||||||
"currently": "ในขณะนี้",
|
"currently": "ในขณะนี้",
|
||||||
"on_off": "เปิด \/ ปิด",
|
"on_off": "เปิด \/ ปิด",
|
||||||
"target_temperature": "อุณหภูมิ"
|
"target_temperature": "อุณหภูมิ",
|
||||||
|
"operation": "การดำเนินการ",
|
||||||
|
"away_mode": "โหมดไม่อยู่บ้าน"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"components": {
|
"components": {
|
||||||
@ -673,14 +1010,43 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification_toast": {
|
"notification_toast": {
|
||||||
|
"entity_turned_on": "เปิดใช้งาน {entity} แล้ว",
|
||||||
|
"entity_turned_off": "ปิดใช้งาน {หน่วย} แล้ว",
|
||||||
|
"service_called": "เรียกบริการ {service} แล้ว",
|
||||||
|
"service_call_failed": "การเรียกบริการ {service} ล้มเหลว",
|
||||||
"connection_lost": "สูญเสียการเชื่อมต่อ ดำเนินการเชื่อมต่อใหม่..."
|
"connection_lost": "สูญเสียการเชื่อมต่อ ดำเนินการเชื่อมต่อใหม่..."
|
||||||
},
|
},
|
||||||
"dialogs": {
|
"dialogs": {
|
||||||
"more_info_settings": {
|
"more_info_settings": {
|
||||||
|
"save": "บันทึก",
|
||||||
|
"name": "การแทนที่ชื่อ",
|
||||||
"entity_id": "รหัสเอนทิตี"
|
"entity_id": "รหัสเอนทิตี"
|
||||||
|
},
|
||||||
|
"more_info_control": {
|
||||||
|
"script": {
|
||||||
|
"last_action": "การทำงานครั้งล่าสุด"
|
||||||
|
},
|
||||||
|
"sun": {
|
||||||
|
"elevation": "การยกระดับ",
|
||||||
|
"rising": "เพิ่มขึ้น",
|
||||||
|
"setting": "การตั้งค่า"
|
||||||
|
},
|
||||||
|
"updater": {
|
||||||
|
"title": "คำแนะนำในการอัพเดท"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"auth_store": {
|
||||||
|
"ask": "คุณต้องการจำการเข้าระบบนี้หรือไม่?",
|
||||||
|
"decline": "ไม่เป็นไรขอบคุณ",
|
||||||
|
"confirm": "จำการเข้าสู่ระบบ"
|
||||||
|
},
|
||||||
|
"notification_drawer": {
|
||||||
|
"click_to_configure": "คลิกปุ่มเพื่อกำหนดค่า {entity}",
|
||||||
|
"empty": "ไม่มีการแจ้งเตือน",
|
||||||
|
"title": "การแจ้งเตือน"
|
||||||
|
}
|
||||||
|
},
|
||||||
"domain": {
|
"domain": {
|
||||||
"alarm_control_panel": "แผงควบคุมสัญญาณเตือนภัย",
|
"alarm_control_panel": "แผงควบคุมสัญญาณเตือนภัย",
|
||||||
"automation": "การทำงานอัตโนมัติ",
|
"automation": "การทำงานอัตโนมัติ",
|
||||||
@ -717,7 +1083,12 @@
|
|||||||
"updater": "อัพเดต",
|
"updater": "อัพเดต",
|
||||||
"weblink": "เว็บลิงค์",
|
"weblink": "เว็บลิงค์",
|
||||||
"zwave": "Z-Wave",
|
"zwave": "Z-Wave",
|
||||||
"vacuum": "เครื่องดูดฝุ่น"
|
"vacuum": "เครื่องดูดฝุ่น",
|
||||||
|
"zha": "ZHA",
|
||||||
|
"hassio": "Hass.io",
|
||||||
|
"homeassistant": "Home Assistant",
|
||||||
|
"lovelace": "Lovelace",
|
||||||
|
"system_health": "ข้อมูลสถานะของระบบ"
|
||||||
},
|
},
|
||||||
"attribute": {
|
"attribute": {
|
||||||
"weather": {
|
"weather": {
|
||||||
@ -725,5 +1096,14 @@
|
|||||||
"visibility": "ความชัดเจน",
|
"visibility": "ความชัดเจน",
|
||||||
"wind_speed": "ความเร็วลม"
|
"wind_speed": "ความเร็วลม"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "ปิด",
|
||||||
|
"on": "เปิด",
|
||||||
|
"auto": "อัตโนมัติ"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "Увімкнено",
|
"on": "Увімкнено",
|
||||||
"paused": "Призупинено",
|
"paused": "Призупинено",
|
||||||
"returning": "Повернення до дока"
|
"returning": "Повернення до дока"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "активний",
|
||||||
|
"idle": "очікування",
|
||||||
|
"paused": "на паузі"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -346,7 +351,11 @@
|
|||||||
},
|
},
|
||||||
"customize": {
|
"customize": {
|
||||||
"caption": "Налаштування",
|
"caption": "Налаштування",
|
||||||
"description": "Налаштуйте свої об'єкти"
|
"description": "Налаштуйте свої об'єкти",
|
||||||
|
"picker": {
|
||||||
|
"header": "Налаштування",
|
||||||
|
"introduction": "Налаштування атрибутів на об'єкт. Додані \/ відредаговані налаштування набудуть чинності негайно. Видалені налаштування набудуть чинності після оновлення об'єкта."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"automation": {
|
||||||
"caption": "Автоматизація",
|
"caption": "Автоматизація",
|
||||||
@ -372,7 +381,7 @@
|
|||||||
"delete": "Видалити",
|
"delete": "Видалити",
|
||||||
"delete_confirm": "Ви впевнені, що хочете видалити?",
|
"delete_confirm": "Ви впевнені, що хочете видалити?",
|
||||||
"unsupported_platform": "Непідтримувана платформа: {platform}",
|
"unsupported_platform": "Непідтримувана платформа: {platform}",
|
||||||
"type_select": "Тип подразнювача",
|
"type_select": "Тип тригера",
|
||||||
"type": {
|
"type": {
|
||||||
"event": {
|
"event": {
|
||||||
"label": "Подія:",
|
"label": "Подія:",
|
||||||
@ -536,7 +545,15 @@
|
|||||||
"change_password": "Змінити пароль",
|
"change_password": "Змінити пароль",
|
||||||
"activate_user": "Активувати користувача",
|
"activate_user": "Активувати користувача",
|
||||||
"deactivate_user": "Деактивувати користувача",
|
"deactivate_user": "Деактивувати користувача",
|
||||||
"delete_user": "Видалити користувача"
|
"delete_user": "Видалити користувача",
|
||||||
|
"caption": "Переглянути користувача"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "Додати користувача",
|
||||||
|
"name": "Ім'я",
|
||||||
|
"username": "Ім'я користувача",
|
||||||
|
"password": "Пароль",
|
||||||
|
"create": "Створити"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -561,7 +578,8 @@
|
|||||||
"hub": "Підключено через",
|
"hub": "Підключено через",
|
||||||
"firmware": "Прошивка: {version}",
|
"firmware": "Прошивка: {version}",
|
||||||
"device_unavailable": "пристрій недоступний",
|
"device_unavailable": "пристрій недоступний",
|
||||||
"entity_unavailable": "Недоступний"
|
"entity_unavailable": "Недоступний",
|
||||||
|
"no_area": "Немає області"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
@ -573,11 +591,46 @@
|
|||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
"caption": "Реєстр зони",
|
"caption": "Реєстр зони",
|
||||||
"description": "Огляд всіх областей у вашому домі."
|
"description": "Огляд всіх областей у вашому домі.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Реєстр областей",
|
||||||
|
"introduction": "Області використовуються для організації пристроїв. Ця інформація буде використовуватисяHome Assistant, щоб допомогти вам організувати ваш інтерфейс, дозволи та інтеграції з іншими системами.",
|
||||||
|
"introduction2": "Щоб розмістити пристрої в області, скористайтеся посиланням нижче, щоб перейти до сторінки інтеграції, а потім натисніть налаштовану інтеграцію, щоб дістатися до карток пристрою."
|
||||||
|
},
|
||||||
|
"no_areas": "Схоже, у вас ще немає областей!",
|
||||||
|
"create_area": "СТВОРИТИ ОБЛАСТЬ",
|
||||||
|
"editor": {
|
||||||
|
"default_name": "Нова область",
|
||||||
|
"delete": "ВИДАЛИТИ",
|
||||||
|
"update": "ОНОВИТИ",
|
||||||
|
"create": "СТВОРИТИ"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"entity_registry": {
|
"entity_registry": {
|
||||||
"caption": "Реєстр об'єктів",
|
"caption": "Реєстр об'єктів",
|
||||||
"description": "Огляд всіх відомих об'єктів."
|
"description": "Огляд всіх відомих об'єктів.",
|
||||||
|
"picker": {
|
||||||
|
"header": "Реєстр об'єктів",
|
||||||
|
"unavailable": "(недоступно)",
|
||||||
|
"introduction": "Home Assistant зберігає реєстр кожного об'єкта, який він коли-небудь бачив, який може бути унікально ідентифікований. Кожному з цих об'єктів буде призначений ідентифікатор, який буде зарезервований тільки для цього об'єкта.",
|
||||||
|
"introduction2": "Використовуйте реєстр об'єктів, щоб перевизначити ім'я, змінити ідентифікатор об'єкта або видалити запис з Home Assistant. Примітка: видалення запису реєстру не видалить об'єкт. Щоб зробити це, перейдіть за наведеним нижче посиланням і видаліть його з сторінки інтеграції."
|
||||||
|
},
|
||||||
|
"editor": {
|
||||||
|
"unavailable": "Цей об'єкт наразі недоступний.",
|
||||||
|
"default_name": "Нова область",
|
||||||
|
"delete": "ВИДАЛИТИ",
|
||||||
|
"update": "ОНОВИТИ"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"person": {
|
||||||
|
"caption": "Особи",
|
||||||
|
"description": "Керуйте особами, які відстежуються Home Assistant.",
|
||||||
|
"detail": {
|
||||||
|
"name": "Ім'я",
|
||||||
|
"device_tracker_intro": "Виберіть пристрої, які належать цій людині.",
|
||||||
|
"device_tracker_picked": "Пристрій для відстеження",
|
||||||
|
"device_tracker_pick": "Виберіть пристрій для відстеження"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@ -765,7 +818,8 @@
|
|||||||
"pick_card": "Виберіть картку, яку хочете додати.",
|
"pick_card": "Виберіть картку, яку хочете додати.",
|
||||||
"add": "Додати картку",
|
"add": "Додати картку",
|
||||||
"edit": "Редагувати",
|
"edit": "Редагувати",
|
||||||
"delete": "Видалити"
|
"delete": "Видалити",
|
||||||
|
"move": "Переміщення"
|
||||||
},
|
},
|
||||||
"migrate": {
|
"migrate": {
|
||||||
"header": "Конфігурація несумісна",
|
"header": "Конфігурація несумісна",
|
||||||
@ -796,6 +850,10 @@
|
|||||||
"unused_entities": "Незадіяні об'єкти",
|
"unused_entities": "Незадіяні об'єкти",
|
||||||
"help": "Допомога",
|
"help": "Допомога",
|
||||||
"refresh": "Оновити"
|
"refresh": "Оновити"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "Об'єкт не доступний: {entity}",
|
||||||
|
"entity_non_numeric": "Об'єкт не є числовим: {entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -939,7 +997,7 @@
|
|||||||
},
|
},
|
||||||
"relative_time": {
|
"relative_time": {
|
||||||
"past": "{time} тому",
|
"past": "{time} тому",
|
||||||
"future": "В {time}",
|
"future": "{time} тому",
|
||||||
"never": "Ніколи",
|
"never": "Ніколи",
|
||||||
"duration": {
|
"duration": {
|
||||||
"second": "{count} {count, plural,\n one {сек.}\n other {сек.}\n}",
|
"second": "{count} {count, plural,\n one {сек.}\n other {сек.}\n}",
|
||||||
@ -974,7 +1032,7 @@
|
|||||||
"sun": {
|
"sun": {
|
||||||
"elevation": "Висота",
|
"elevation": "Висота",
|
||||||
"rising": "Схід сонця",
|
"rising": "Схід сонця",
|
||||||
"setting": "Налаштування"
|
"setting": "Захід сонця"
|
||||||
},
|
},
|
||||||
"updater": {
|
"updater": {
|
||||||
"title": "Інструкції по оновленню"
|
"title": "Інструкції по оновленню"
|
||||||
@ -1041,5 +1099,14 @@
|
|||||||
"visibility": "Видимість",
|
"visibility": "Видимість",
|
||||||
"wind_speed": "Швидкість вітру"
|
"wind_speed": "Швидкість вітру"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "Вимкнений",
|
||||||
|
"on": "Увімкнений",
|
||||||
|
"auto": "Авто"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -268,7 +268,8 @@
|
|||||||
},
|
},
|
||||||
"timer": {
|
"timer": {
|
||||||
"active": "激活",
|
"active": "激活",
|
||||||
"idle": "空闲"
|
"idle": "空闲",
|
||||||
|
"paused": "暂停"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -551,7 +552,15 @@
|
|||||||
"change_password": "更改密码",
|
"change_password": "更改密码",
|
||||||
"activate_user": "激活用户",
|
"activate_user": "激活用户",
|
||||||
"deactivate_user": "停用用户",
|
"deactivate_user": "停用用户",
|
||||||
"delete_user": "删除用户"
|
"delete_user": "删除用户",
|
||||||
|
"caption": "用户信息"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "添加用户",
|
||||||
|
"name": "名字",
|
||||||
|
"username": "用户名",
|
||||||
|
"password": "密码",
|
||||||
|
"create": "创建"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -581,17 +590,21 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"zha": {
|
"zha": {
|
||||||
|
"caption": "ZHA",
|
||||||
"description": "Zigbee 智能家居(ZHA) 网络管理"
|
"description": "Zigbee 智能家居(ZHA) 网络管理"
|
||||||
},
|
},
|
||||||
"area_registry": {
|
"area_registry": {
|
||||||
|
"caption": "区域注册",
|
||||||
"description": "您家中所有区域的概览。",
|
"description": "您家中所有区域的概览。",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "注册区域"
|
"header": "区域注册表",
|
||||||
|
"introduction": "区域用于组织设备所在的位置。此信息将用于 Home Assistant 的各个地方,以帮助您组织界面、权限和与其他系统的集成。",
|
||||||
|
"introduction2": "要将设备置入某个区域,请使用下面的链接导航到集成页面,然后点击一个已配置的集成以进入设备卡片。"
|
||||||
},
|
},
|
||||||
"no_areas": "看来你还没有建立区域!",
|
"no_areas": "看来你还没有建立区域!",
|
||||||
"create_area": "创建区域",
|
"create_area": "创建区域",
|
||||||
"editor": {
|
"editor": {
|
||||||
"default_name": "新区域",
|
"default_name": "新建区域",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
"create": "创建"
|
"create": "创建"
|
||||||
@ -601,18 +614,20 @@
|
|||||||
"caption": "实体注册",
|
"caption": "实体注册",
|
||||||
"description": "所有已知实体的概览。",
|
"description": "所有已知实体的概览。",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "实体注册",
|
"header": "实体注册表",
|
||||||
"unavailable": "(不可用)"
|
"unavailable": "(不可用)",
|
||||||
|
"introduction": "Home Assistant 将会以唯一标识的形式记录发现的每个实体。这些实体被各自分配一个实体 ID,仅保留给对应实体。",
|
||||||
|
"introduction2": "使用本实体注册工具重写名称,修改实体 ID 或者从 Home Assistant 删除实体。注意,删除实体注册信息并不会删除实体本身。如果要删除实体,请点击下面的链接进入集成页面进行操作。"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "该实体暂不可用。",
|
"unavailable": "该实体暂不可用。",
|
||||||
"default_name": "新区域",
|
"default_name": "新建区域",
|
||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"update": "更新"
|
"update": "更新"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"person": {
|
"person": {
|
||||||
"caption": "人",
|
"caption": "人员",
|
||||||
"description": "管理 Home Assistant 跟踪的人员。",
|
"description": "管理 Home Assistant 跟踪的人员。",
|
||||||
"detail": {
|
"detail": {
|
||||||
"name": "名字",
|
"name": "名字",
|
||||||
@ -768,19 +783,19 @@
|
|||||||
"init": {
|
"init": {
|
||||||
"data": {
|
"data": {
|
||||||
"username": "用户名",
|
"username": "用户名",
|
||||||
"password": "密码"
|
"password": "ui::panel::page-authorize::form::providers::homeassistant::step::init::data::password"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mfa": {
|
"mfa": {
|
||||||
"data": {
|
"data": {
|
||||||
"code": "二次认证口令"
|
"code": "双重认证口令"
|
||||||
},
|
},
|
||||||
"description": "在设备上打开 **{mfa_module_name}** 查看二次认证口令并验证您的身份:"
|
"description": "在设备上打开 **{mfa_module_name}** 查看双重认证口令并验证您的身份:"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"invalid_auth": "无效的用户名或密码",
|
"invalid_auth": "无效的用户名或密码",
|
||||||
"invalid_code": "无效的验证码"
|
"invalid_code": "无效口令"
|
||||||
},
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
"login_expired": "会话已过期,请重新登录。"
|
"login_expired": "会话已过期,请重新登录。"
|
||||||
@ -860,7 +875,8 @@
|
|||||||
"refresh": "刷新"
|
"refresh": "刷新"
|
||||||
},
|
},
|
||||||
"warning": {
|
"warning": {
|
||||||
"entity_not_found": "实体不可用"
|
"entity_not_found": "实体 {entity} 不可用",
|
||||||
|
"entity_non_numeric": "实体 {entity} 非数值"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1094,6 +1110,7 @@
|
|||||||
"weblink": "网址",
|
"weblink": "网址",
|
||||||
"zwave": "Z-Wave",
|
"zwave": "Z-Wave",
|
||||||
"vacuum": "扫地机",
|
"vacuum": "扫地机",
|
||||||
|
"zha": "ZHA",
|
||||||
"hassio": "Hass.io",
|
"hassio": "Hass.io",
|
||||||
"homeassistant": "Home Assistant",
|
"homeassistant": "Home Assistant",
|
||||||
"lovelace": "Lovelace",
|
"lovelace": "Lovelace",
|
||||||
@ -1105,5 +1122,14 @@
|
|||||||
"visibility": "能见度",
|
"visibility": "能见度",
|
||||||
"wind_speed": "风速"
|
"wind_speed": "风速"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "关",
|
||||||
|
"on": "开",
|
||||||
|
"auto": "自动"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -265,6 +265,11 @@
|
|||||||
"on": "開啟",
|
"on": "開啟",
|
||||||
"paused": "暫停",
|
"paused": "暫停",
|
||||||
"returning": "返回充電"
|
"returning": "返回充電"
|
||||||
|
},
|
||||||
|
"timer": {
|
||||||
|
"active": "啟用",
|
||||||
|
"idle": "閒置",
|
||||||
|
"paused": "暫停"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state_badge": {
|
"state_badge": {
|
||||||
@ -357,7 +362,7 @@
|
|||||||
"description": "新增和編輯自動化內容",
|
"description": "新增和編輯自動化內容",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "自動化編輯器",
|
"header": "自動化編輯器",
|
||||||
"introduction": "自動化編輯器可以讓你編輯想要的自動化內容\n請閱讀設定文件以確保自動化設定格式正確\n常見的錯誤為前後多餘的空格與上下欄位的對齊\n否則無法正常啟用。\n\n想知道更多關於自動化編輯器的資料,請參考\nhttps:\/\/home-assistant.io\/docs\/automation\/editor\/",
|
"introduction": "自動化編輯器允許新增或編輯自動化。請參考下方教學連結,以確保正確的設定 Home Assistant。",
|
||||||
"pick_automation": "選擇欲編輯的自動化",
|
"pick_automation": "選擇欲編輯的自動化",
|
||||||
"no_automations": "沒有任何可編輯的自動化",
|
"no_automations": "沒有任何可編輯的自動化",
|
||||||
"add_automation": "新增一個自動化"
|
"add_automation": "新增一個自動化"
|
||||||
@ -370,7 +375,7 @@
|
|||||||
"alias": "名稱",
|
"alias": "名稱",
|
||||||
"triggers": {
|
"triggers": {
|
||||||
"header": "觸發",
|
"header": "觸發",
|
||||||
"introduction": "觸發條件可使你設定好的自動化開始運作\n你可以指定針對一個自動化設定一個或多個觸發條件\n當觸發通過後,Home Assistant會開始檢查下一步的觸發判斷式,如果判斷通過,就會開始執行觸發後動作\n\n想知道更多關於事件觸發,可參考文件\nhttps:\/\/home-assistant.io\/docs\/automation\/trigger\/",
|
"introduction": "「觸發條件」為可使設定好的自動化開始運作。可以針對一個自動化設定多個觸發條件。一旦觸發後,Home Assistant 會檢查觸發判斷式,並開始執行動作。請參考下方連結以了解更多關於「事件觸發」的資料。",
|
||||||
"add": "新增一個觸發",
|
"add": "新增一個觸發",
|
||||||
"duplicate": "複製",
|
"duplicate": "複製",
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
@ -451,7 +456,7 @@
|
|||||||
},
|
},
|
||||||
"conditions": {
|
"conditions": {
|
||||||
"header": "觸發判斷",
|
"header": "觸發判斷",
|
||||||
"introduction": "「觸發判斷」為自動化規則中,選項使用的部分。可以用以避免誤觸發某些動作。「觸發判斷」看起來跟觸發很類似,但實際上不盡相同。觸發主要監看系統中、事件的變化產生,而觸發判斷僅監看系統目前的狀況。例如:觸發可以觀察到開關被開啟,而觸發判斷僅關注目前開關是開啟或關閉的狀態。\n\n想了解更多關於「觸發判斷」的資料,請參考。\nhttps:\/\/home-assistant.io\/docs\/scripts\/conditions\/",
|
"introduction": "「觸發判斷」為自動化規則中,選項使用的部分。可以用以避免誤觸發某些動作。「觸發判斷」看起來跟觸發很類似,但實際上不盡相同。觸發主要監看系統中、事件的變化產生,而觸發判斷僅監看系統目前的狀況。例如:觸發可以觀察到開關被開啟,而觸發判斷僅關注目前開關是開啟或關閉的狀態。請參考下方連結以了解更多關於「觸發判斷」的資料。",
|
||||||
"add": "新增一個判斷式",
|
"add": "新增一個判斷式",
|
||||||
"duplicate": "複製",
|
"duplicate": "複製",
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
@ -496,7 +501,7 @@
|
|||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"header": "觸發後動作",
|
"header": "觸發後動作",
|
||||||
"introduction": "「動作」為自動化觸發後,Home Assistant 所會執行的。\n\n想了解更多關於「動作」的資料,請參考文件。\nhttps:\/\/home-assistant.io\/docs\/automation\/action\/",
|
"introduction": "「動作」為自動化觸發後,Home Assistant 所執行的自動化。點選下方連結以了解更多關於「動作」的資料。",
|
||||||
"add": "新增一個動作",
|
"add": "新增一個動作",
|
||||||
"duplicate": "複製",
|
"duplicate": "複製",
|
||||||
"delete": "刪除",
|
"delete": "刪除",
|
||||||
@ -548,7 +553,15 @@
|
|||||||
"change_password": "更改密碼",
|
"change_password": "更改密碼",
|
||||||
"activate_user": "激活用戶",
|
"activate_user": "激活用戶",
|
||||||
"deactivate_user": "停用用戶",
|
"deactivate_user": "停用用戶",
|
||||||
"delete_user": "刪除用戶"
|
"delete_user": "刪除用戶",
|
||||||
|
"caption": "檢視用戶"
|
||||||
|
},
|
||||||
|
"add_user": {
|
||||||
|
"caption": "新增用戶",
|
||||||
|
"name": "名稱",
|
||||||
|
"username": "使用者名稱",
|
||||||
|
"password": "密碼",
|
||||||
|
"create": "新增"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cloud": {
|
"cloud": {
|
||||||
@ -588,7 +601,9 @@
|
|||||||
"caption": "分區 ID",
|
"caption": "分區 ID",
|
||||||
"description": "家中所有分區概觀。",
|
"description": "家中所有分區概觀。",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "分區 ID"
|
"header": "分區 ID",
|
||||||
|
"introduction": "分區主要用以管理裝置所在位置。此資訊將會於 Home Assistant 中使用以協助您管理介面、權限,並與其他系統進行整合。",
|
||||||
|
"introduction2": "欲於分區中放置裝置,請使用下方連結至整合頁面,並點選設定整合以設定裝置卡片。"
|
||||||
},
|
},
|
||||||
"no_areas": "看起來你還沒有建立分區!",
|
"no_areas": "看起來你還沒有建立分區!",
|
||||||
"create_area": "建立分區",
|
"create_area": "建立分區",
|
||||||
@ -604,7 +619,9 @@
|
|||||||
"description": "所有已知物件概觀。",
|
"description": "所有已知物件概觀。",
|
||||||
"picker": {
|
"picker": {
|
||||||
"header": "物件 ID",
|
"header": "物件 ID",
|
||||||
"unavailable": "(不可用)"
|
"unavailable": "(不可用)",
|
||||||
|
"introduction": "Home Assistant 保持每個物件 ID 的獨特辨識性,此些物件將會指定一組專用的 物件 ID。",
|
||||||
|
"introduction2": "使用物件 ID 以覆寫名稱、變更物件 ID 或由 Home Assistant 移除物件。請注意:移除物件 ID 項目並不會移除物件。欲移除,請跟隨下方連結,並於整合頁面中進行移除。"
|
||||||
},
|
},
|
||||||
"editor": {
|
"editor": {
|
||||||
"unavailable": "該物件目前不可用。",
|
"unavailable": "該物件目前不可用。",
|
||||||
@ -860,6 +877,10 @@
|
|||||||
"unused_entities": "未使用物件",
|
"unused_entities": "未使用物件",
|
||||||
"help": "說明",
|
"help": "說明",
|
||||||
"refresh": "更新"
|
"refresh": "更新"
|
||||||
|
},
|
||||||
|
"warning": {
|
||||||
|
"entity_not_found": "物件不可用:{entity}",
|
||||||
|
"entity_non_numeric": "物件為非數字:{entity}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1105,5 +1126,14 @@
|
|||||||
"visibility": "能見度",
|
"visibility": "能見度",
|
||||||
"wind_speed": "風速"
|
"wind_speed": "風速"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"state_attributes": {
|
||||||
|
"climate": {
|
||||||
|
"fan_mode": {
|
||||||
|
"off": "關閉",
|
||||||
|
"on": "開啟",
|
||||||
|
"auto": "自動模式"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
12
yarn.lock
12
yarn.lock
@ -1653,6 +1653,11 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/freeport/-/freeport-1.0.21.tgz#73f6543ed67d3ca3fff97b985591598b7092066f"
|
resolved "https://registry.yarnpkg.com/@types/freeport/-/freeport-1.0.21.tgz#73f6543ed67d3ca3fff97b985591598b7092066f"
|
||||||
integrity sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=
|
integrity sha1-c/ZUPtZ9PKP/+XuYVZFZi3CSBm8=
|
||||||
|
|
||||||
|
"@types/geojson@*":
|
||||||
|
version "7946.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.6.tgz#416f388a06b227784a2d91a88a53f14de05cd54b"
|
||||||
|
integrity sha512-f6qai3iR62QuMPPdgyH+LyiXTL2n9Rf62UniJjV7KHrbiwzLTZUKsdq0mFSTxAHbO7JvwxwC4tH0m1UnweuLrA==
|
||||||
|
|
||||||
"@types/glob-stream@*":
|
"@types/glob-stream@*":
|
||||||
version "6.1.0"
|
version "6.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc"
|
resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc"
|
||||||
@ -1725,6 +1730,13 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.0.tgz#37296109b7f277f6e6c5fd7e0c0706bc918fbb51"
|
resolved "https://registry.yarnpkg.com/@types/launchpad/-/launchpad-0.6.0.tgz#37296109b7f277f6e6c5fd7e0c0706bc918fbb51"
|
||||||
integrity sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=
|
integrity sha1-NylhCbfyd/bmxf1+DAcGvJGPu1E=
|
||||||
|
|
||||||
|
"@types/leaflet@^1.4.3":
|
||||||
|
version "1.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/leaflet/-/leaflet-1.4.3.tgz#62638cb73770eeaed40222042afbcc7b495f0cc4"
|
||||||
|
integrity sha512-jFRBSsPHi1EwQSwrN0cOJLdPhwOZsRl4IMxvm/2ShLh0YM5GfCtQXCzsrv8RE7DWL+AykXdYSAd9bFLWbZT4CQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/geojson" "*"
|
||||||
|
|
||||||
"@types/memoize-one@^4.1.0":
|
"@types/memoize-one@^4.1.0":
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/memoize-one/-/memoize-one-4.1.0.tgz#62119f26055b3193ae43ca1882c5b29b88b71ece"
|
resolved "https://registry.yarnpkg.com/@types/memoize-one/-/memoize-one-4.1.0.tgz#62119f26055b3193ae43ca1882c5b29b88b71ece"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user