Compare commits

..

1 Commits

Author SHA1 Message Date
Zack Arnett
bd316a36a0 Password manager? 2020-08-10 15:15:21 -05:00
40 changed files with 918 additions and 2053 deletions

View File

@@ -106,9 +106,7 @@ export class HassioMain extends urlSyncMixin(ProvideHassLitMixin(LitElement)) {
};
}
} else {
themeName =
((this.hass.selectedTheme as unknown) as string) ||
this.hass.themes.default_theme;
themeName = (this.hass.selectedTheme as unknown) as string;
}
applyThemesOnElement(

View File

@@ -12,7 +12,6 @@ import {
import { fireEvent } from "../../../src/common/dom/fire_event";
import "../../../src/components/buttons/ha-call-api-button";
import "../../../src/components/ha-card";
import { HassioHostInfo as HassioHostInfoType } from "../../../src/data/hassio/host";
import {
HassioSupervisorInfo as HassioSupervisorInfoType,
setSupervisorOption,
@@ -34,8 +33,6 @@ class HassioSupervisorInfo extends LitElement {
@property() public supervisorInfo!: HassioSupervisorInfoType;
@property() public hostInfo!: HassioHostInfoType;
@internalProperty() private _errors?: string;
public render(): TemplateResult | void {
@@ -64,41 +61,27 @@ class HassioSupervisorInfo extends LitElement {
</tbody>
</table>
<div class="options">
${this.supervisorInfo?.supported
? html` <ha-settings-row>
<span slot="heading">
Share Diagnostics
</span>
<div slot="description" class="diagnostics-description">
Share crash reports and diagnostic information.
<button
class="link"
@click=${this._diagnosticsInformationDialog}
>
Learn more
</button>
</div>
<ha-switch
.checked=${this.supervisorInfo.diagnostics}
@change=${this._toggleDiagnostics}
></ha-switch>
</ha-settings-row>`
: html`<div class="error">
You are running an unsupported installation.
<a
href="https://github.com/home-assistant/architecture/blob/master/adr/${this.hostInfo.features.includes(
"hassos"
)
? "0015-home-assistant-os.md"
: "0014-home-assistant-supervised.md"}"
target="_blank"
rel="noreferrer"
>Learn More</a
>
</div>`}
<ha-settings-row>
<span slot="heading">
Share Diagnostics
</span>
<span slot="description">
Share crash reports and diagnostic information.
<button
class="link"
@click=${this._diagnosticsInformationDialog}
>
Learn more
</button>
</span>
<ha-switch
.checked=${this.supervisorInfo.diagnostics}
@change=${this._toggleDiagnostics}
></ha-switch>
</ha-settings-row>
</div>
${this._errors
? html` <div class="error">Error: ${this._errors}</div> `
? html` <div class="errors">Error: ${this._errors}</div> `
: ""}
</div>
<div class="card-actions">
@@ -160,17 +143,16 @@ class HassioSupervisorInfo extends LitElement {
.info td:nth-child(2) {
text-align: right;
}
.errors {
color: var(--error-color);
margin-top: 16px;
}
ha-settings-row {
padding: 0;
}
button.link {
color: var(--primary-color);
}
.diagnostics-description {
white-space: normal;
padding: 0;
color: var(--secondary-text-color);
}
`,
];
}
@@ -242,7 +224,7 @@ class HassioSupervisorInfo extends LitElement {
accessible to the Home Assistant Core team and will not be shared with
others.
<br /><br />
The data does not include any private/sensitive information and you can
The data does not include any private/sensetive information and you can
disable this in settings at any time you want.`,
});
}

View File

@@ -56,7 +56,6 @@ class HassioSystem extends LitElement {
<div class="card-group">
<hassio-supervisor-info
.hass=${this.hass}
.hostInfo=${this.hostInfo}
.supervisorInfo=${this.supervisorInfo}
></hassio-supervisor-info>
<hassio-host-info

View File

@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
setup(
name="home-assistant-frontend",
version="20200811.0",
version="20200807.1",
description="The Home Assistant frontend",
url="https://github.com/home-assistant/home-assistant-polymer",
author="The Home Assistant Authors",

View File

@@ -37,6 +37,24 @@ export class HaFormString extends LitElement implements HaFormElement {
}
}
protected firstUpdated(): void {
if (this.schema.name.includes("password")) {
const stepInput = document.createElement("input");
stepInput.setAttribute("type", "password");
stepInput.setAttribute("name", "password");
stepInput.setAttribute("autocomplete", "on");
stepInput.onkeyup = (ev) => this._externalValueChanged(ev, this);
document.documentElement.appendChild(stepInput);
} else if (this.schema.name.includes("username")) {
const stepInput = document.createElement("input");
stepInput.setAttribute("type", "text");
stepInput.setAttribute("name", "username");
stepInput.setAttribute("autocomplete", "on");
stepInput.onkeyup = (ev) => this._externalValueChanged(ev, this);
document.documentElement.appendChild(stepInput);
}
}
protected render(): TemplateResult {
return this.schema.name.includes("password")
? html`
@@ -81,11 +99,21 @@ export class HaFormString extends LitElement implements HaFormElement {
if (this.data === value) {
return;
}
fireEvent(this, "value-changed", {
value,
});
}
private _externalValueChanged(ev: Event, el): void {
const value = (ev.target as PaperInputElement).value;
if (this.data === value) {
return;
}
el.shadowRoot!.querySelector("paper-input").value = value;
}
private get _stringType(): string {
if (this.schema.format) {
if (["email", "url"].includes(this.schema.format)) {

View File

@@ -30,7 +30,6 @@ class HaLabeledSlider extends PolymerElement {
ha-paper-slider {
flex-grow: 1;
background-image: var(--ha-slider-background);
border-radius: var(--ha-slider-border-radius);
}
</style>

View File

@@ -1,155 +0,0 @@
import {
LitElement,
TemplateResult,
html,
CSSResult,
css,
customElement,
property,
} from "lit-element";
import { fireEvent } from "../common/dom/fire_event";
@customElement("ha-vertical-range-input")
class HaVerticalRangeInput extends LitElement {
@property({ type: Number }) public value!: number;
@property({ type: Number }) public max = 100;
@property({ type: Number }) public min = 1;
@property({ type: Number }) public step = 1;
protected render(): TemplateResult {
if (!this.value) {
return html``;
}
return html`
<input
type="range"
.max=${this.max.toString()}
.min=${this.min.toString()}
.step=${this.step.toString()}
.value=${this.value.toString()}
@change=${this._valueChanged}
/>
`;
}
private _valueChanged(ev: CustomEvent): void {
fireEvent(this, "value-changed", {
value: (ev.currentTarget as HTMLInputElement).value,
});
}
static get styles(): CSSResult {
return css`
:host {
height: calc(var(--vertical-range-height, 300px) + 5px);
width: var(--vertical-range-width, 100px);
position: relative;
display: block;
max-height: none;
}
:host input {
width: var(--vertical-range-height, 300px);
height: var(--vertical-range-width, 100px);
margin: 0;
outline: 0;
overflow: hidden;
border: 1px solid var(--divider-color);
/* background: var(--vertical-range-track-color, #fafafa); */
border-radius: 8px;
position: absolute;
top: calc(50% - var(--vertical-range-width, 100px) / 2);
right: calc(50% - var(--vertical-range-height, 300px) / 2);
-webkit-transform: rotate(270deg);
-moz-transform: rotate(270deg);
-o-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
-webkit-appearance: none;
}
:host input::-webkit-slider-runnable-track {
height: 100%;
background: var(--vertical-range-track-color, #fafafa);
}
:host input::-webkit-slider-thumb {
-webkit-appearance: none;
position: relative;
cursor: grab;
width: var(--vertical-range-thumb-height, 25px);
height: var(--vertical-range-thumb-width, 100%);
background: var(--vertical-range-thumb-color, #fafafa);
box-shadow: calc(var(--vertical-range-height, 300px) * -1) 0 0
var(--vertical-range-height, 300px)
var(--vertical-range-color, var(--state-icon-active-color));
border-right: 10px solid
var(
--vertical-range-thumb-padding-color,
var(--state-icon-active-color)
);
border-left: 10px solid
var(
--vertical-range-thumb-padding-color,
var(--state-icon-active-color)
);
border-top: 20px solid
var(
--vertical-range-thumb-padding-color,
var(--state-icon-active-color)
);
border-bottom: 20px solid
var(
--vertical-range-thumb-padding-color,
var(--state-icon-active-color)
);
transition: box-shadow 0.2s ease-in-out;
}
:host input::-webkit-slider-thumb:active {
cursor: grabbing;
}
/* Firefox */
:host input::-moz-thumb-track {
height: 100%;
background-color: var(--vertical-range-track-color, #fafafa);
}
:host input::-moz-range-thumb {
width: 5px;
height: calc(var(--vertical-range-width, 100px) * 0.4);
position: relative;
top: 0px;
cursor: grab;
background: var(--vertical-range-track-color, #fafafa);
box-shadow: -350px 0 0 350px
var(--vertical-range-color, var(--state-icon-active-color)),
inset 0 0 0 80px var(--vertical-range-track-color, #fafafa);
border-right: 9px solid
var(--vertical-range-color, var(--state-icon-active-color));
border-left: 9px solid
var(--vertical-range-color, var(--state-icon-active-color));
border-top: 22px solid
var(--vertical-range-color, var(--state-icon-active-color));
border-bottom: 22px solid
var(--vertical-range-color, var(--state-icon-active-color));
border-radius: 0;
transition: box-shadow 0.2s ease-in-out;
}
:host input::-moz-range-thumb:active {
cursor: grabbing;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"ha-vertical-range-input": HaVerticalRangeInput;
}
}

View File

@@ -71,7 +71,7 @@ export const createHassioSession = async (hass: HomeAssistant) => {
"POST",
"hassio/ingress/session"
);
document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/;SameSite=Strict`;
document.cookie = `ingress_session=${response.data.session};path=/api/hassio_ingress/`;
};
export const setSupervisorOption = async (

View File

@@ -21,11 +21,6 @@ export interface MediaPlayerThumbnail {
content: string;
}
export interface ControlButton {
icon: string;
action: string;
}
export const getCurrentProgress = (stateObj: HassEntity): number => {
let progress = stateObj.attributes.media_position;

View File

@@ -1,10 +1,4 @@
import { HomeAssistant } from "../types";
import { DeviceRegistryEntry } from "./device_registry";
export interface OZWNodeIdentifiers {
ozw_instance: number;
node_id: number;
}
export interface OZWDevice {
node_id: number;
@@ -13,102 +7,15 @@ export interface OZWDevice {
is_failed: boolean;
is_zwave_plus: boolean;
ozw_instance: number;
event: string;
}
export interface OZWDeviceMetaDataResponse {
node_id: number;
ozw_instance: number;
metadata: OZWDeviceMetaData;
}
export interface OZWDeviceMetaData {
OZWInfoURL: string;
ZWAProductURL: string;
ProductPic: string;
Description: string;
ProductManualURL: string;
ProductPageURL: string;
InclusionHelp: string;
ExclusionHelp: string;
ResetHelp: string;
WakeupHelp: string;
ProductSupportURL: string;
Frequency: string;
Name: string;
ProductPicBase64: string;
}
export const nodeQueryStages = [
"ProtocolInfo",
"Probe",
"WakeUp",
"ManufacturerSpecific1",
"NodeInfo",
"NodePlusInfo",
"ManufacturerSpecific2",
"Versions",
"Instances",
"Static",
"CacheLoad",
"Associations",
"Neighbors",
"Session",
"Dynamic",
"Configuration",
"Complete",
];
export const getIdentifiersFromDevice = function (
device: DeviceRegistryEntry
): OZWNodeIdentifiers | undefined {
if (!device) {
return undefined;
}
const ozwIdentifier = device.identifiers.find(
(identifier) => identifier[0] === "ozw"
);
if (!ozwIdentifier) {
return undefined;
}
const identifiers = ozwIdentifier[1].split(".");
return {
node_id: parseInt(identifiers[1]),
ozw_instance: parseInt(identifiers[0]),
};
};
export const fetchOZWNodeStatus = (
hass: HomeAssistant,
ozw_instance: number,
node_id: number
ozw_instance: string,
node_id: string
): Promise<OZWDevice> =>
hass.callWS({
type: "ozw/node_status",
ozw_instance: ozw_instance,
node_id: node_id,
});
export const fetchOZWNodeMetadata = (
hass: HomeAssistant,
ozw_instance: number,
node_id: number
): Promise<OZWDeviceMetaDataResponse> =>
hass.callWS({
type: "ozw/node_metadata",
ozw_instance: ozw_instance,
node_id: node_id,
});
export const refreshNodeInfo = (
hass: HomeAssistant,
ozw_instance: number,
node_id: number
): Promise<OZWDevice> =>
hass.callWS({
type: "ozw/refresh_node_info",
ozw_instance: ozw_instance,
node_id: node_id,
});

View File

@@ -0,0 +1,361 @@
import "@polymer/iron-flex-layout/iron-flex-layout-classes";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { featureClassNames } from "../../../common/entity/feature_class_names";
import "../../../components/ha-attributes";
import "../../../components/ha-color-picker";
import "../../../components/ha-labeled-slider";
import "../../../components/ha-paper-dropdown-menu";
import { EventsMixin } from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
import "../../../components/ha-icon-button";
const FEATURE_CLASS_NAMES = {
1: "has-brightness",
2: "has-color_temp",
4: "has-effect_list",
16: "has-color",
128: "has-white_value",
};
/*
* @appliesMixin EventsMixin
*/
class MoreInfoLight extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
<style include="iron-flex"></style>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
}
.effect_list,
.brightness,
.color_temp,
.white_value {
max-height: 0px;
overflow: hidden;
transition: max-height 0.5s ease-in;
}
.color_temp {
--ha-slider-background: -webkit-linear-gradient(
right,
rgb(255, 160, 0) 0%,
white 50%,
rgb(166, 209, 255) 100%
);
/* The color temp minimum value shouldn't be rendered differently. It's not "off". */
--paper-slider-knob-start-border-color: var(--primary-color);
}
.segmentationContainer {
position: relative;
}
ha-color-picker {
display: block;
width: 100%;
max-height: 0px;
overflow: hidden;
transition: max-height 0.5s ease-in;
}
.segmentationButton {
display: none;
position: absolute;
top: 5%;
transform: translate(0%, 0%);
color: var(--secondary-text-color);
}
.has-color.is-on .segmentationButton {
display: inline-block;
}
.has-effect_list.is-on .effect_list,
.has-brightness .brightness,
.has-color_temp.is-on .color_temp,
.has-white_value.is-on .white_value {
max-height: 84px;
}
.has-brightness .has-color_temp.is-on,
.has-white_value.is-on {
margin-top: -16px;
}
.has-brightness .brightness,
.has-color_temp.is-on .color_temp,
.has-white_value.is-on .white_value {
padding-top: 16px;
}
.has-color.is-on ha-color-picker {
max-height: 500px;
overflow: visible;
--ha-color-picker-wheel-borderwidth: 5;
--ha-color-picker-wheel-bordercolor: white;
--ha-color-picker-wheel-shadow: none;
--ha-color-picker-marker-borderwidth: 2;
--ha-color-picker-marker-bordercolor: white;
}
.control {
width: 100%;
}
.is-unavailable .control {
max-height: 0px;
}
ha-attributes {
width: 100%;
}
ha-paper-dropdown-menu {
width: 100%;
}
paper-item {
cursor: pointer;
}
</style>
<div class$="[[computeClassNames(stateObj)]]">
<div class="control brightness">
<ha-labeled-slider
caption="[[localize('ui.card.light.brightness')]]"
icon="hass:brightness-5"
min="1"
max="255"
value="{{brightnessSliderValue}}"
on-change="brightnessSliderChanged"
></ha-labeled-slider>
</div>
<div class="control color_temp">
<ha-labeled-slider
caption="[[localize('ui.card.light.color_temperature')]]"
icon="hass:thermometer"
min="[[stateObj.attributes.min_mireds]]"
max="[[stateObj.attributes.max_mireds]]"
value="{{ctSliderValue}}"
on-change="ctSliderChanged"
></ha-labeled-slider>
</div>
<div class="control white_value">
<ha-labeled-slider
caption="[[localize('ui.card.light.white_value')]]"
icon="hass:file-word-box"
max="255"
value="{{wvSliderValue}}"
on-change="wvSliderChanged"
></ha-labeled-slider>
</div>
<div class="segmentationContainer">
<ha-color-picker
class="control color"
on-colorselected="colorPicked"
desired-hs-color="{{colorPickerColor}}"
throttle="500"
hue-segments="{{hueSegments}}"
saturation-segments="{{saturationSegments}}"
>
</ha-color-picker>
<ha-icon-button
icon="mdi:palette"
on-click="segmentClick"
class="segmentationButton"
></ha-icon-button>
</div>
<div class="control effect_list">
<ha-paper-dropdown-menu
label-float=""
dynamic-align=""
label="[[localize('ui.card.light.effect')]]"
>
<paper-listbox
slot="dropdown-content"
selected="[[stateObj.attributes.effect]]"
on-selected-changed="effectChanged"
attr-for-selected="item-name"
>
<template
is="dom-repeat"
items="[[stateObj.attributes.effect_list]]"
>
<paper-item item-name$="[[item]]">[[item]]</paper-item>
</template>
</paper-listbox>
</ha-paper-dropdown-menu>
</div>
<ha-attributes
state-obj="[[stateObj]]"
extra-filters="brightness,color_temp,white_value,effect_list,effect,hs_color,rgb_color,xy_color,min_mireds,max_mireds,entity_id"
></ha-attributes>
</div>
`;
}
static get properties() {
return {
hass: {
type: Object,
},
stateObj: {
type: Object,
observer: "stateObjChanged",
},
brightnessSliderValue: {
type: Number,
value: 0,
},
ctSliderValue: {
type: Number,
value: 0,
},
wvSliderValue: {
type: Number,
value: 0,
},
hueSegments: {
type: Number,
value: 24,
},
saturationSegments: {
type: Number,
value: 8,
},
colorPickerColor: {
type: Object,
},
};
}
stateObjChanged(newVal, oldVal) {
const props = {
brightnessSliderValue: 0,
};
if (newVal && newVal.state === "on") {
props.brightnessSliderValue = newVal.attributes.brightness;
props.ctSliderValue = newVal.attributes.color_temp;
props.wvSliderValue = newVal.attributes.white_value;
if (newVal.attributes.hs_color) {
props.colorPickerColor = {
h: newVal.attributes.hs_color[0],
s: newVal.attributes.hs_color[1] / 100,
};
}
}
this.setProperties(props);
if (oldVal) {
setTimeout(() => {
this.fire("iron-resize");
}, 500);
}
}
computeClassNames(stateObj) {
const classes = [
"content",
featureClassNames(stateObj, FEATURE_CLASS_NAMES),
];
if (stateObj && stateObj.state === "on") {
classes.push("is-on");
}
if (stateObj && stateObj.state === "unavailable") {
classes.push("is-unavailable");
}
return classes.join(" ");
}
effectChanged(ev) {
const oldVal = this.stateObj.attributes.effect;
const newVal = ev.detail.value;
if (!newVal || oldVal === newVal) return;
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj.entity_id,
effect: newVal,
});
}
brightnessSliderChanged(ev) {
const bri = parseInt(ev.target.value, 10);
if (isNaN(bri)) return;
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj.entity_id,
brightness: bri,
});
}
ctSliderChanged(ev) {
const ct = parseInt(ev.target.value, 10);
if (isNaN(ct)) return;
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj.entity_id,
color_temp: ct,
});
}
wvSliderChanged(ev) {
const wv = parseInt(ev.target.value, 10);
if (isNaN(wv)) return;
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj.entity_id,
white_value: wv,
});
}
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) {
hass.callService("light", "turn_on", {
entity_id: entityId,
hs_color: [color.h, color.s * 100],
});
}
/**
* Called when a new color has been picked.
* should be throttled with the 'throttle=' attribute of the color picker
*/
colorPicked(ev) {
this.serviceChangeColor(this.hass, this.stateObj.entity_id, ev.detail.hs);
}
}
customElements.define("more-info-light", MoreInfoLight);

View File

@@ -1,337 +0,0 @@
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import "@material/mwc-tab-bar";
import "@material/mwc-tab";
import {
css,
CSSResult,
customElement,
html,
LitElement,
property,
TemplateResult,
internalProperty,
PropertyValues,
} from "lit-element";
import {
SUPPORT_BRIGHTNESS,
SUPPORT_COLOR_TEMP,
SUPPORT_WHITE_VALUE,
SUPPORT_COLOR,
SUPPORT_EFFECT,
} from "../../../data/light";
import { supportsFeature } from "../../../common/entity/supports-feature";
import type { HomeAssistant, LightEntity } from "../../../types";
import "../../../components/ha-attributes";
import "../../../components/ha-color-picker";
import "../../../components/ha-labeled-slider";
import "../../../components/ha-svg-icon";
import "../../../components/ha-icon-button";
import "../../../components/ha-paper-dropdown-menu";
import "../../../components/ha-vertical-range-input";
interface HueSatColor {
h: number;
s: number;
}
@customElement("more-info-light")
class MoreInfoLight extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public stateObj?: LightEntity;
@internalProperty() private _brightnessSliderValue = 0;
@internalProperty() private _ctSliderValue = 0;
@internalProperty() private _wvSliderValue = 0;
@internalProperty() private _hueSegments = 24;
@internalProperty() private _saturationSegments = 8;
@internalProperty() private _colorPickerColor?: HueSatColor;
@internalProperty() private _tabIndex = 0;
protected render(): TemplateResult {
if (!this.hass || !this.stateObj) {
return html``;
}
const supportsBrightness = supportsFeature(
this.stateObj!,
SUPPORT_BRIGHTNESS
);
const supportsColorTemp = supportsFeature(
this.stateObj,
SUPPORT_COLOR_TEMP
);
const supportsWhiteValue = supportsFeature(
this.stateObj,
SUPPORT_WHITE_VALUE
);
const supportsColor = supportsFeature(this.stateObj, SUPPORT_COLOR);
const supportsEffect =
supportsFeature(this.stateObj, SUPPORT_EFFECT) &&
this.stateObj!.attributes.effect_list?.length;
if (!supportsBrightness && !this._tabIndex) {
this._tabIndex = 1;
}
return html`
<mwc-tab-bar
.activeIndex=${this._tabIndex}
@MDCTabBar:activated=${(ev: CustomEvent) => {
this._tabIndex = ev.detail.index;
}}
>
${supportsBrightness
? html`<mwc-tab label="Brightness"></mwc-tab>`
: ""}
${supportsColor ||
supportsColorTemp ||
supportsEffect ||
supportsWhiteValue
? html`<mwc-tab label="Color"></mwc-tab>`
: ""}
</mwc-tab-bar>
${this._tabIndex === 0
? html`
${supportsBrightness
? html`
<div class="brightness">
<div>
${Math.round((this._brightnessSliderValue / 255) * 100)}%
</div>
<ha-vertical-range-input
max="255"
.caption=${this.hass.localize("ui.card.light.brightness")}
.value=${this._brightnessSliderValue}
@value-changed=${this._brightnessChanged}
>
</ha-vertical-range-input>
</div>
`
: ""}
`
: html`
${supportsColorTemp
? html`
<ha-labeled-slider
class="color_temp"
icon="hass:thermometer"
.caption=${this.hass.localize(
"ui.card.light.color_temperature"
)}
.min=${this.stateObj.attributes.min_mireds}
.max=${this.stateObj.attributes.max_mireds}
.value=${this._ctSliderValue}
@change=${this._colorTempChanged}
></ha-labeled-slider>
`
: ""}
${supportsWhiteValue
? html`
<ha-labeled-slider
icon="hass:file-word-box"
max="255"
.caption=${this.hass.localize("ui.card.light.white_value")}
.value=${this._wvSliderValue}
@change=${this._whiteValueChanged}
></ha-labeled-slider>
`
: ""}
${supportsColor
? html`
<div class="color-picker">
<ha-icon-button
icon="hass:palette"
@click=${this._segmentClick}
></ha-icon-button>
<ha-color-picker
throttle="500"
.desiredHsColor=${this._colorPickerColor}
.hueSegments=${this._hueSegments}
.saturationSegments=${this._saturationSegments}
@colorselected=${this._colorPicked}
>
</ha-color-picker>
</div>
`
: ""}
${supportsEffect
? html`
<ha-paper-dropdown-menu
.label=${this.hass.localize("ui.card.light.effect")}
>
<paper-listbox
slot="dropdown-content"
attr-for-selected="item-name"
.selected=${this.stateObj.attributes.effect!}
@iron-select=${this._effectChanged}
>${this.stateObj.attributes.effect_list!.map(
(effect: string) => html`
<paper-item .itemName=${effect}>${effect}</paper-item>
`
)}
</paper-listbox>
</ha-paper-dropdown-menu>
`
: ""}
`}
<div class="padding"></div>
${this.hass.user?.is_admin
? html`
<ha-attributes
.stateObj=${this.stateObj}
extraFilters="brightness,color_temp,white_value,effect_list,effect,hs_color,rgb_color,xy_color,min_mireds,max_mireds,entity_id"
></ha-attributes>
`
: ""}
`;
}
protected updated(changedProps: PropertyValues): void {
const stateObj = this.stateObj! as LightEntity;
if (changedProps.has("stateObj") && stateObj.state === "on") {
this._brightnessSliderValue = stateObj.attributes.brightness;
this._ctSliderValue = stateObj.attributes.color_temp || 326;
this._wvSliderValue = stateObj.attributes.white_value;
if (stateObj.attributes.hs_color) {
this._colorPickerColor = {
h: stateObj.attributes.hs_color[0],
s: stateObj.attributes.hs_color[1] / 100,
};
}
}
}
private _effectChanged(ev: CustomEvent) {
const newVal = ev.detail.value;
if (!newVal || this.stateObj!.attributes.effect === newVal) {
return;
}
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj!.entity_id,
effect: newVal,
});
}
private _brightnessChanged(ev: CustomEvent) {
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj!.entity_id,
brightness: parseInt(ev.detail.value, 10),
});
}
private _colorTempChanged(ev: CustomEvent) {
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj!.entity_id,
color_temp: parseInt((ev.currentTarget as any).value, 10),
});
}
private _whiteValueChanged(ev: CustomEvent) {
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj!.entity_id,
white_value: parseInt((ev.target as any).value, 10),
});
}
private _segmentClick() {
if (this._hueSegments === 24 && this._saturationSegments === 8) {
this._hueSegments = 0;
this._saturationSegments = 0;
} else {
this._hueSegments = 24;
this._saturationSegments = 8;
}
}
/**
* Called when a new color has been picked.
* should be throttled with the 'throttle=' attribute of the color picker
*/
private _colorPicked(ev: CustomEvent) {
this.hass.callService("light", "turn_on", {
entity_id: this.stateObj!.entity_id,
hs_color: [ev.detail.hs.h, ev.detail.hs.s * 100],
});
}
static get styles(): CSSResult {
return css`
ha-labeled-slider,
ha-paper-dropdown-menu,
.padding {
width: 100%;
overflow: hidden;
padding-top: 16px;
}
.brightness {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 16px;
}
.brightness div {
font-size: 20px;
line-height: 1.2;
padding: 4px 0;
font-weight: 500;
color: var(--secondary-text-color);
}
.color_temp {
--ha-slider-background: -webkit-linear-gradient(
right,
rgb(255, 160, 0) 0%,
white 50%,
rgb(166, 209, 255) 100%
);
/* The color temp minimum value shouldn't be rendered differently. It's not "off". */
--paper-slider-knob-start-border-color: var(--primary-color);
--ha-slider-border-radius: 8px;
}
.color-picker {
position: relative;
max-height: 500px;
}
.color-picker ha-icon-button {
position: absolute;
top: 5%;
color: var(--secondary-text-color);
}
ha-color-picker {
--ha-color-picker-wheel-borderwidth: 5;
--ha-color-picker-wheel-bordercolor: white;
--ha-color-picker-wheel-shadow: none;
--ha-color-picker-marker-borderwidth: 2;
--ha-color-picker-marker-bordercolor: white;
}
paper-item {
cursor: pointer;
}
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"more-info-light": MoreInfoLight;
}
}

View File

@@ -0,0 +1,421 @@
import "@polymer/iron-flex-layout/iron-flex-layout-classes";
import "../../../components/ha-icon-button";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import { html } from "@polymer/polymer/lib/utils/html-tag";
/* eslint-plugin-disable lit */
import { PolymerElement } from "@polymer/polymer/polymer-element";
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
import { attributeClassNames } from "../../../common/entity/attribute_class_names";
import { computeRTLDirection } from "../../../common/util/compute_rtl";
import "../../../components/ha-paper-dropdown-menu";
import "../../../components/ha-paper-slider";
import "../../../components/ha-icon";
import { EventsMixin } from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
import HassMediaPlayerEntity from "../../../util/hass-media-player-model";
/*
* @appliesMixin LocalizeMixin
* @appliesMixin EventsMixin
*/
class MoreInfoMediaPlayer extends LocalizeMixin(EventsMixin(PolymerElement)) {
static get template() {
return html`
<style include="iron-flex iron-flex-alignment"></style>
<style>
.media-state {
text-transform: capitalize;
}
ha-icon-button[highlight] {
color: var(--accent-color);
}
.volume {
margin-bottom: 8px;
max-height: 0px;
overflow: hidden;
transition: max-height 0.5s ease-in;
}
.has-volume_level .volume {
max-height: 40px;
}
ha-icon.source-input {
padding: 7px;
margin-top: 15px;
}
ha-paper-dropdown-menu.source-input {
margin-left: 10px;
}
[hidden] {
display: none !important;
}
paper-item {
cursor: pointer;
}
</style>
<div class$="[[computeClassNames(stateObj)]]">
<div class="layout horizontal">
<div class="flex">
<ha-icon-button
icon="hass:power"
highlight$="[[playerObj.isOff]]"
on-click="handleTogglePower"
hidden$="[[computeHidePowerButton(playerObj)]]"
></ha-icon-button>
</div>
<div>
<template
is="dom-if"
if="[[computeShowPlaybackControls(playerObj)]]"
>
<ha-icon-button
icon="hass:skip-previous"
on-click="handlePrevious"
hidden$="[[!playerObj.supportsPreviousTrack]]"
></ha-icon-button>
<ha-icon-button
icon="[[computePlaybackControlIcon(playerObj)]]"
on-click="handlePlaybackControl"
hidden$="[[!computePlaybackControlIcon(playerObj)]]"
highlight=""
></ha-icon-button>
<ha-icon-button
icon="hass:skip-next"
on-click="handleNext"
hidden$="[[!playerObj.supportsNextTrack]]"
></ha-icon-button>
</template>
</div>
</div>
<!-- VOLUME -->
<div
class="volume_buttons center horizontal layout"
hidden$="[[computeHideVolumeButtons(playerObj)]]"
>
<ha-icon-button
on-click="handleVolumeTap"
icon="hass:volume-off"
></ha-icon-button>
<ha-icon-button
id="volumeDown"
disabled$="[[playerObj.isMuted]]"
on-mousedown="handleVolumeDown"
on-touchstart="handleVolumeDown"
on-touchend="handleVolumeTouchEnd"
icon="hass:volume-medium"
></ha-icon-button>
<ha-icon-button
id="volumeUp"
disabled$="[[playerObj.isMuted]]"
on-mousedown="handleVolumeUp"
on-touchstart="handleVolumeUp"
on-touchend="handleVolumeTouchEnd"
icon="hass:volume-high"
></ha-icon-button>
</div>
<div
class="volume center horizontal layout"
hidden$="[[!playerObj.supportsVolumeSet]]"
>
<ha-icon-button
on-click="handleVolumeTap"
hidden$="[[playerObj.supportsVolumeButtons]]"
icon="[[computeMuteVolumeIcon(playerObj)]]"
></ha-icon-button>
<ha-paper-slider
disabled$="[[playerObj.isMuted]]"
min="0"
max="100"
value="[[playerObj.volumeSliderValue]]"
on-change="volumeSliderChanged"
class="flex"
ignore-bar-touch=""
dir="{{rtl}}"
>
</ha-paper-slider>
</div>
<!-- SOURCE PICKER -->
<div
class="controls layout horizontal justified"
hidden$="[[computeHideSelectSource(playerObj)]]"
>
<ha-icon class="source-input" icon="hass:login-variant"></ha-icon>
<ha-paper-dropdown-menu
class="flex source-input"
dynamic-align=""
label-float=""
label="[[localize('ui.card.media_player.source')]]"
>
<paper-listbox
slot="dropdown-content"
attr-for-selected="item-name"
selected="[[playerObj.source]]"
on-selected-changed="handleSourceChanged"
>
<template is="dom-repeat" items="[[playerObj.sourceList]]">
<paper-item item-name$="[[item]]">[[item]]</paper-item>
</template>
</paper-listbox>
</ha-paper-dropdown-menu>
</div>
<!-- SOUND MODE PICKER -->
<template is="dom-if" if="[[!computeHideSelectSoundMode(playerObj)]]">
<div class="controls layout horizontal justified">
<ha-icon class="source-input" icon="hass:music-note"></ha-icon>
<ha-paper-dropdown-menu
class="flex source-input"
dynamic-align
label-float
label="[[localize('ui.card.media_player.sound_mode')]]"
>
<paper-listbox
slot="dropdown-content"
attr-for-selected="item-name"
selected="[[playerObj.soundMode]]"
on-selected-changed="handleSoundModeChanged"
>
<template is="dom-repeat" items="[[playerObj.soundModeList]]">
<paper-item item-name$="[[item]]">[[item]]</paper-item>
</template>
</paper-listbox>
</ha-paper-dropdown-menu>
</div>
</template>
<!-- TTS -->
<div
hidden$="[[computeHideTTS(ttsLoaded, playerObj)]]"
class="layout horizontal end"
>
<paper-input
id="ttsInput"
label="[[localize('ui.card.media_player.text_to_speak')]]"
class="flex"
value="{{ttsMessage}}"
on-keydown="ttsCheckForEnter"
></paper-input>
<ha-icon-button icon="hass:send" on-click="sendTTS"></ha-icon-button>
</div>
</div>
`;
}
static get properties() {
return {
hass: Object,
stateObj: Object,
playerObj: {
type: Object,
computed: "computePlayerObj(hass, stateObj)",
observer: "playerObjChanged",
},
ttsLoaded: {
type: Boolean,
computed: "computeTTSLoaded(hass)",
},
ttsMessage: {
type: String,
value: "",
},
rtl: {
type: String,
computed: "_computeRTLDirection(hass)",
},
};
}
computePlayerObj(hass, stateObj) {
return new HassMediaPlayerEntity(hass, stateObj);
}
playerObjChanged(newVal, oldVal) {
if (oldVal) {
setTimeout(() => {
this.fire("iron-resize");
}, 500);
}
}
computeClassNames(stateObj) {
return attributeClassNames(stateObj, ["volume_level"]);
}
computeMuteVolumeIcon(playerObj) {
return playerObj.isMuted ? "hass:volume-off" : "hass:volume-high";
}
computeHideVolumeButtons(playerObj) {
return !playerObj.supportsVolumeButtons || playerObj.isOff;
}
computeShowPlaybackControls(playerObj) {
return !playerObj.isOff && playerObj.hasMediaControl;
}
computePlaybackControlIcon(playerObj) {
if (playerObj.isPlaying) {
return playerObj.supportsPause ? "hass:pause" : "hass:stop";
}
if (playerObj.hasMediaControl || playerObj.isOff || playerObj.isIdle) {
if (
playerObj.hasMediaControl &&
playerObj.supportsPause &&
!playerObj.isPaused
) {
return "hass:play-pause";
}
return playerObj.supportsPlay ? "hass:play" : null;
}
return "";
}
computeHidePowerButton(playerObj) {
return playerObj.isOff
? !playerObj.supportsTurnOn
: !playerObj.supportsTurnOff;
}
computeHideSelectSource(playerObj) {
return (
playerObj.isOff ||
!playerObj.supportsSelectSource ||
!playerObj.sourceList
);
}
computeHideSelectSoundMode(playerObj) {
return (
playerObj.isOff ||
!playerObj.supportsSelectSoundMode ||
!playerObj.soundModeList
);
}
computeHideTTS(ttsLoaded, playerObj) {
return !ttsLoaded || !playerObj.supportsPlayMedia;
}
computeTTSLoaded(hass) {
return isComponentLoaded(hass, "tts");
}
handleTogglePower() {
this.playerObj.togglePower();
}
handlePrevious() {
this.playerObj.previousTrack();
}
handlePlaybackControl() {
this.playerObj.mediaPlayPause();
}
handleNext() {
this.playerObj.nextTrack();
}
handleSourceChanged(ev) {
if (!this.playerObj) return;
const oldVal = this.playerObj.source;
const newVal = ev.detail.value;
if (!newVal || oldVal === newVal) return;
this.playerObj.selectSource(newVal);
}
handleSoundModeChanged(ev) {
if (!this.playerObj) return;
const oldVal = this.playerObj.soundMode;
const newVal = ev.detail.value;
if (!newVal || oldVal === newVal) return;
this.playerObj.selectSoundMode(newVal);
}
handleVolumeTap() {
if (!this.playerObj.supportsVolumeMute) {
return;
}
this.playerObj.volumeMute(!this.playerObj.isMuted);
}
handleVolumeTouchEnd(ev) {
/* when touch ends, we must prevent this from
* becoming a mousedown, up, click by emulation */
ev.preventDefault();
}
handleVolumeUp() {
const obj = this.$.volumeUp;
this.handleVolumeWorker("volume_up", obj, true);
}
handleVolumeDown() {
const obj = this.$.volumeDown;
this.handleVolumeWorker("volume_down", obj, true);
}
handleVolumeWorker(service, obj, force) {
if (force || (obj !== undefined && obj.pointerDown)) {
this.playerObj.callService(service);
setTimeout(() => this.handleVolumeWorker(service, obj, false), 500);
}
}
volumeSliderChanged(ev) {
const volPercentage = parseFloat(ev.target.value);
const volume = volPercentage > 0 ? volPercentage / 100 : 0;
this.playerObj.setVolume(volume);
}
ttsCheckForEnter(ev) {
if (ev.keyCode === 13) this.sendTTS();
}
sendTTS() {
const services = this.hass.services.tts;
const serviceKeys = Object.keys(services).sort();
let service;
let i;
for (i = 0; i < serviceKeys.length; i++) {
if (serviceKeys[i].indexOf("_say") !== -1) {
service = serviceKeys[i];
break;
}
}
if (!service) {
return;
}
this.hass.callService("tts", service, {
entity_id: this.stateObj.entity_id,
message: this.ttsMessage,
});
this.ttsMessage = "";
this.$.ttsInput.focus();
}
_computeRTLDirection(hass) {
return computeRTLDirection(hass);
}
}
customElements.define("more-info-media_player", MoreInfoMediaPlayer);

View File

@@ -1,381 +0,0 @@
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
import "@polymer/paper-input/paper-input";
import {
css,
CSSResult,
html,
LitElement,
property,
TemplateResult,
customElement,
query,
} from "lit-element";
import { computeRTLDirection } from "../../../common/util/compute_rtl";
import { HomeAssistant, MediaEntity } from "../../../types";
import { supportsFeature } from "../../../common/entity/supports-feature";
import { UNAVAILABLE_STATES, UNAVAILABLE, UNKNOWN } from "../../../data/entity";
import {
SUPPORT_TURN_ON,
SUPPORT_TURN_OFF,
SUPPORTS_PLAY,
SUPPORT_PREVIOUS_TRACK,
SUPPORT_PAUSE,
SUPPORT_STOP,
SUPPORT_NEXT_TRACK,
SUPPORT_VOLUME_MUTE,
SUPPORT_VOLUME_SET,
SUPPORT_VOLUME_BUTTONS,
SUPPORT_SELECT_SOURCE,
SUPPORT_SELECT_SOUND_MODE,
SUPPORT_PLAY_MEDIA,
ControlButton,
} from "../../../data/media-player";
import { isComponentLoaded } from "../../../common/config/is_component_loaded";
import "../../../components/ha-paper-dropdown-menu";
import "../../../components/ha-icon-button";
import "../../../components/ha-slider";
import "../../../components/ha-icon";
@customElement("more-info-media_player")
class MoreInfoMediaPlayer extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@property({ attribute: false }) public stateObj?: MediaEntity;
@query("#ttsInput") private _ttsInput?: HTMLInputElement;
protected render(): TemplateResult {
if (!this.stateObj) {
return html``;
}
const controls = this._getControls();
const stateObj = this.stateObj;
return html`
${!controls
? ""
: html`
<div class="controls">
${controls!.map(
(control) => html`
<ha-icon-button
action=${control.action}
.icon=${control.icon}
@click=${this._handleClick}
></ha-icon-button>
`
)}
</div>
`}
${(supportsFeature(stateObj, SUPPORT_VOLUME_SET) ||
supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS)) &&
![UNAVAILABLE, UNKNOWN, "off"].includes(stateObj.state)
? html`
<div class="volume">
${supportsFeature(stateObj, SUPPORT_VOLUME_MUTE)
? html`
<ha-icon-button
.icon=${stateObj.attributes.is_volume_muted
? "hass:volume-off"
: "hass:volume-high"}
@click=${this._toggleMute}
></ha-icon-button>
`
: ""}
${supportsFeature(stateObj, SUPPORT_VOLUME_SET)
? html`
<ha-slider
id="input"
pin
ignore-bar-touch
.dir=${computeRTLDirection(this.hass!)}
.value=${Number(stateObj.attributes.volume_level) * 100}
@change=${this._selectedValueChanged}
></ha-slider>
`
: supportsFeature(stateObj, SUPPORT_VOLUME_BUTTONS)
? html`
<ha-icon-button
action="volume_down"
icon="hass:volume-minus"
@click=${this._handleClick}
></ha-icon-button>
<ha-icon-button
action="volume_up"
icon="hass:volume-plus"
@click=${this._handleClick}
></ha-icon-button>
`
: ""}
</div>
`
: ""}
${stateObj.state !== "off" &&
supportsFeature(stateObj, SUPPORT_SELECT_SOURCE) &&
stateObj.attributes.source_list?.length
? html`
<div class="source-input">
<ha-icon class="source-input" icon="hass:login-variant"></ha-icon>
<ha-paper-dropdown-menu
.label=${this.hass.localize("ui.card.media_player.source")}
>
<paper-listbox
slot="dropdown-content"
attr-for-selected="item-name"
.selected=${stateObj.attributes.source!}
@iron-select=${this._handleSourceChanged}
>
${stateObj.attributes.source_list!.map(
(source) =>
html`
<paper-item .itemName=${source}>${source}</paper-item>
`
)}
</paper-listbox>
</ha-paper-dropdown-menu>
</div>
`
: ""}
${supportsFeature(stateObj, SUPPORT_SELECT_SOUND_MODE) &&
stateObj.attributes.sound_mode_list?.length
? html`
<div class="sound-input">
<ha-icon icon="hass:music-note"></ha-icon>
<ha-paper-dropdown-menu
dynamic-align
label-float
.label=${this.hass.localize("ui.card.media_player.sound_mode")}
>
<paper-listbox
slot="dropdown-content"
attr-for-selected="item-name"
.selected=${stateObj.attributes.sound_mode!}
@iron-select=${this._handleSoundModeChanged}
>
${stateObj.attributes.sound_mode_list.map(
(mode) => html`
<paper-item itemName=${mode}>${mode}</paper-item>
`
)}
</paper-listbox>
</ha-paper-dropdown-menu>
</div>
`
: ""}
${isComponentLoaded(this.hass, "tts") &&
supportsFeature(stateObj, SUPPORT_PLAY_MEDIA)
? html`
<div class="tts">
<paper-input
id="ttsInput"
.label=${this.hass.localize(
"ui.card.media_player.text_to_speak"
)}
@keydown=${this._ttsCheckForEnter}
></paper-input>
<ha-icon-button icon="hass:send" @click=${
this._sendTTS
}></ha-icon-button>
</div>
</div>
`
: ""}
`;
}
static get styles(): CSSResult {
return css`
ha-icon-button[action="turn_off"],
ha-icon-button[action="turn_on"],
ha-slider,
#ttsInput {
flex-grow: 1;
}
.volume,
.controls,
.source-input,
.sound-input,
.tts {
display: flex;
align-items: center;
justify-content: space-between;
}
.source-input ha-icon,
.sound-input ha-icon {
padding: 7px;
margin-top: 24px;
}
.source-input ha-paper-dropdown-menu,
.sound-input ha-paper-dropdown-menu {
margin-left: 10px;
flex-grow: 1;
}
paper-item {
cursor: pointer;
}
`;
}
private _getControls(): ControlButton[] | undefined {
const stateObj = this.stateObj;
if (!stateObj) {
return undefined;
}
const state = stateObj.state;
if (UNAVAILABLE_STATES.includes(state)) {
return undefined;
}
if (state === "off") {
return supportsFeature(stateObj, SUPPORT_TURN_ON)
? [
{
icon: "hass:power",
action: "turn_on",
},
]
: undefined;
}
if (state === "idle") {
return supportsFeature(stateObj, SUPPORTS_PLAY)
? [
{
icon: "hass:play",
action: "media_play",
},
]
: undefined;
}
const buttons: ControlButton[] = [];
if (supportsFeature(stateObj, SUPPORT_TURN_OFF)) {
buttons.push({
icon: "hass:power",
action: "turn_off",
});
}
if (supportsFeature(stateObj, SUPPORT_PREVIOUS_TRACK)) {
buttons.push({
icon: "hass:skip-previous",
action: "media_previous_track",
});
}
if (
(state === "playing" &&
(supportsFeature(stateObj, SUPPORT_PAUSE) ||
supportsFeature(stateObj, SUPPORT_STOP))) ||
(state === "paused" && supportsFeature(stateObj, SUPPORTS_PLAY))
) {
buttons.push({
icon:
state !== "playing"
? "hass:play"
: supportsFeature(stateObj, SUPPORT_PAUSE)
? "hass:pause"
: "hass:stop",
action: "media_play_pause",
});
}
if (supportsFeature(stateObj, SUPPORT_NEXT_TRACK)) {
buttons.push({
icon: "hass:skip-next",
action: "media_next_track",
});
}
return buttons.length > 0 ? buttons : undefined;
}
private _handleClick(e: MouseEvent): void {
this.hass!.callService(
"media_player",
(e.currentTarget! as HTMLElement).getAttribute("action")!,
{
entity_id: this.stateObj!.entity_id,
}
);
}
private _toggleMute() {
this.hass!.callService("media_player", "volume_mute", {
entity_id: this.stateObj!.entity_id,
is_volume_muted: !this.stateObj!.attributes.is_volume_muted,
});
}
private _selectedValueChanged(e: Event): void {
this.hass!.callService("media_player", "volume_set", {
entity_id: this.stateObj!.entity_id,
volume_level:
Number((e.currentTarget! as HTMLElement).getAttribute("value")!) / 100,
});
}
private _handleSourceChanged(e: CustomEvent) {
const newVal = e.detail.value;
if (!newVal || this.stateObj!.attributes.source === newVal) return;
this.hass.callService("media_player", "select_source", {
source: newVal,
});
}
private _handleSoundModeChanged(e: CustomEvent) {
const newVal = e.detail.value;
if (!newVal || this.stateObj?.attributes.sound_mode === newVal) return;
this.hass.callService("media_player", "select_sound_mode", {
sound_mode: newVal,
});
}
private _ttsCheckForEnter(e: KeyboardEvent) {
if (e.keyCode === 13) this._sendTTS();
}
private _sendTTS() {
const ttsInput = this._ttsInput;
if (!ttsInput) {
return;
}
const services = this.hass.services.tts;
const serviceKeys = Object.keys(services).sort();
const service = serviceKeys.find((key) => key.indexOf("_say") !== -1);
if (!service) {
return;
}
this.hass.callService("tts", service, {
entity_id: this.stateObj!.entity_id,
message: ttsInput.value,
});
ttsInput.value = "";
}
}
declare global {
interface HTMLElementTagNameMap {
"more-info-media_player": MoreInfoMediaPlayer;
}
}

View File

@@ -48,7 +48,7 @@
}
@media (prefers-color-scheme: dark) {
html {
background-color: var(--primary-background-color, #111111);
background-color: #111111;
}
#ha-init-skeleton::before {
background-color: #1c1c1c;

View File

@@ -12,13 +12,7 @@ import {
import { DeviceRegistryEntry } from "../../../../../../data/device_registry";
import { haStyle } from "../../../../../../resources/styles";
import { HomeAssistant } from "../../../../../../types";
import {
OZWDevice,
fetchOZWNodeStatus,
getIdentifiersFromDevice,
OZWNodeIdentifiers,
} from "../../../../../../data/ozw";
import { showOZWRefreshNodeDialog } from "../../../../integrations/integration-panels/ozw/show-dialog-ozw-refresh-node";
import { OZWDevice, fetchOZWNodeStatus } from "../../../../../../data/ozw";
@customElement("ha-device-info-ozw")
export class HaDeviceInfoOzw extends LitElement {
@@ -26,34 +20,26 @@ export class HaDeviceInfoOzw extends LitElement {
@property() public device!: DeviceRegistryEntry;
@property()
private node_id = 0;
@property()
private ozw_instance = 1;
@internalProperty() private _ozwDevice?: OZWDevice;
protected updated(changedProperties: PropertyValues) {
if (changedProperties.has("device")) {
const identifiers:
| OZWNodeIdentifiers
| undefined = getIdentifiersFromDevice(this.device);
if (!identifiers) {
return;
}
this.ozw_instance = identifiers.ozw_instance;
this.node_id = identifiers.node_id;
this._fetchNodeDetails();
this._fetchNodeDetails(this.device);
}
}
protected async _fetchNodeDetails() {
protected async _fetchNodeDetails(device) {
const ozwIdentifier = device.identifiers.find(
(identifier) => identifier[0] === "ozw"
);
if (!ozwIdentifier) {
return;
}
const identifiers = ozwIdentifier[1].split(".");
this._ozwDevice = await fetchOZWNodeStatus(
this.hass,
this.ozw_instance,
this.node_id
identifiers[0],
identifiers[1]
);
}
@@ -83,19 +69,9 @@ export class HaDeviceInfoOzw extends LitElement {
? this.hass.localize("ui.common.yes")
: this.hass.localize("ui.common.no")}
</div>
<mwc-button @click=${this._refreshNodeClicked}>
Refresh Node
</mwc-button>
`;
}
private async _refreshNodeClicked() {
showOZWRefreshNodeDialog(this, {
node_id: this.node_id,
ozw_instance: this.ozw_instance,
});
}
static get styles(): CSSResult[] {
return [
haStyle,

View File

@@ -119,11 +119,9 @@ export class HaDeviceActionsZha extends LitElement {
return;
}
await this.hass.callService("zha", "remove", {
this.hass.callService("zha", "remove", {
ieee_address: this._zhaDevice!.ieee,
});
history.back();
}
static get styles(): CSSResult[] {

View File

@@ -1,272 +0,0 @@
import {
CSSResult,
customElement,
html,
LitElement,
property,
internalProperty,
TemplateResult,
PropertyValues,
css,
} from "lit-element";
import "../../../../../components/ha-code-editor";
import "../../../../../components/ha-circular-progress";
import { createCloseHeading } from "../../../../../components/ha-dialog";
import { haStyleDialog } from "../../../../../resources/styles";
import { HomeAssistant } from "../../../../../types";
import { OZWRefreshNodeDialogParams } from "./show-dialog-ozw-refresh-node";
import {
fetchOZWNodeMetadata,
OZWDeviceMetaData,
OZWDevice,
nodeQueryStages,
} from "../../../../../data/ozw";
@customElement("dialog-ozw-refresh-node")
class DialogOZWRefreshNode extends LitElement {
@property({ attribute: false }) public hass!: HomeAssistant;
@internalProperty() private _node_id?: number;
@internalProperty() private _ozw_instance = 1;
@internalProperty() private _nodeMetaData?: OZWDeviceMetaData;
@internalProperty() private _node?: OZWDevice;
@internalProperty() private _active = false;
@internalProperty() private _complete = false;
private _refreshDevicesTimeoutHandle?: number;
private _subscribed?: Promise<() => Promise<void>>;
public disconnectedCallback(): void {
super.disconnectedCallback();
this._unsubscribe();
}
protected updated(changedProperties: PropertyValues): void {
super.update(changedProperties);
if (changedProperties.has("node_id")) {
this._fetchData();
}
}
private async _fetchData() {
if (!this._node_id) {
return;
}
const metaDataResponse = await fetchOZWNodeMetadata(
this.hass,
this._ozw_instance,
this._node_id
);
this._nodeMetaData = metaDataResponse.metadata;
}
public async showDialog(params: OZWRefreshNodeDialogParams): Promise<void> {
this._node_id = params.node_id;
this._ozw_instance = params.ozw_instance;
this._fetchData();
}
protected render(): TemplateResult {
if (!this._node_id) {
return html``;
}
return html`
<ha-dialog
open
@closing="${this._close}"
.heading=${createCloseHeading(
this.hass,
this.hass.localize("ui.panel.config.ozw.refresh_node.title")
)}
>
${this._complete
? html`
<p>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.complete"
)}
</p>
<mwc-button slot="primaryAction" @click=${this._close}>
${this.hass.localize("ui.common.close")}
</mwc-button>
`
: html`
${this._active
? html`
<div class="flex-container">
<ha-circular-progress active></ha-circular-progress>
<div>
<p>
<b>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.refreshing_description"
)}
</b>
</p>
${this._node
? html`
<p>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.node_status"
)}:
${this._node.node_query_stage}
(${this.hass.localize(
"ui.panel.config.ozw.refresh_node.step"
)}
${nodeQueryStages.indexOf(
this._node.node_query_stage
) + 1}/17)
</p>
<p>
<em>
${this.hass.localize(
"ui.panel.config.ozw.node_query_stages." +
this._node.node_query_stage.toLowerCase()
)}</em
>
</p>
`
: ``}
</div>
</div>
`
: html`
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.description"
)}
<p>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.battery_note"
)}
</p>
`}
${this._nodeMetaData?.WakeupHelp !== ""
? html`
<b>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.wakeup_header"
)}
${this._nodeMetaData!.Name}
</b>
<blockquote>
${this._nodeMetaData!.WakeupHelp}
<br />
<em>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.wakeup_instructions_source"
)}
</em>
</blockquote>
`
: ""}
${!this._active
? html`
<mwc-button
slot="primaryAction"
@click=${this._startRefresh}
>
${this.hass.localize(
"ui.panel.config.ozw.refresh_node.start_refresh_button"
)}
</mwc-button>
`
: html``}
`}
</ha-dialog>
`;
}
private _startRefresh(): void {
this._subscribe();
}
private _handleMessage(message: any): void {
if (message.type === "node_updated") {
this._node = message;
if (message.node_query_stage === "Complete") {
this._unsubscribe();
this._complete = true;
}
}
}
private _unsubscribe(): void {
this._active = false;
if (this._refreshDevicesTimeoutHandle) {
clearTimeout(this._refreshDevicesTimeoutHandle);
}
if (this._subscribed) {
this._subscribed.then((unsub) => unsub());
this._subscribed = undefined;
}
}
private _subscribe(): void {
if (!this.hass) {
return;
}
this._active = true;
this._subscribed = this.hass.connection.subscribeMessage(
(message) => this._handleMessage(message),
{
type: "ozw/refresh_node_info",
node_id: this._node_id,
ozw_instance: this._ozw_instance,
}
);
this._refreshDevicesTimeoutHandle = window.setTimeout(
() => this._unsubscribe(),
120000
);
}
private _close(): void {
this._complete = false;
this._node_id = undefined;
this._node = undefined;
}
static get styles(): CSSResult[] {
return [
haStyleDialog,
css`
blockquote {
display: block;
background-color: #ddd;
padding: 8px;
margin: 8px 0;
font-size: 0.9em;
}
blockquote em {
font-size: 0.9em;
margin-top: 6px;
}
.flex-container {
display: flex;
align-items: center;
}
.flex-container ha-circular-progress {
margin-right: 20px;
}
`,
];
}
}
declare global {
interface HTMLElementTagNameMap {
"dialog-ozw-refresh-node": DialogOZWRefreshNode;
}
}

View File

@@ -1,22 +0,0 @@
import { fireEvent } from "../../../../../common/dom/fire_event";
export interface OZWRefreshNodeDialogParams {
ozw_instance: number;
node_id: number;
}
export const loadRefreshNodeDialog = () =>
import(
/* webpackChunkName: "dialog-ozw-refresh-node" */ "./dialog-ozw-refresh-node"
);
export const showOZWRefreshNodeDialog = (
element: HTMLElement,
refreshNodeDialogParams: OZWRefreshNodeDialogParams
): void => {
fireEvent(element, "show-dialog", {
dialogTag: "dialog-ozw-refresh-node",
dialogImport: loadRefreshNodeDialog,
dialogParams: refreshNodeDialogParams,
});
};

View File

@@ -38,7 +38,6 @@ import {
SUPPORT_STOP,
SUPPORT_TURN_OFF,
SUPPORT_TURN_ON,
ControlButton,
} from "../../../data/media-player";
import type { HomeAssistant, MediaEntity } from "../../../types";
import { contrast } from "../common/color/contrast";
@@ -158,6 +157,11 @@ const customGenerator = (colors: Swatch[]) => {
return [foregroundColor, backgroundColor.hex];
};
interface ControlButton {
icon: string;
action: string;
}
@customElement("hui-media-control-card")
export class HuiMediaControlCard extends LitElement implements LovelaceCard {
public static async getConfigElement(): Promise<LovelaceCardEditor> {

View File

@@ -436,7 +436,6 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard {
.forecast-image-icon > * {
width: 40px;
height: 40px;
--mdc-icon-size: 40px;
}
.forecast-icon {
@@ -470,7 +469,7 @@ class HuiWeatherForecastCard extends LitElement implements LovelaceCard {
width: 52px;
}
:host([narrow]) .icon-image .weather-icon {
:host([narrow]) .weather-icon {
--mdc-icon-size: 52px;
}

View File

@@ -60,7 +60,6 @@ export const derivedStyles = {
"material-body-text-color": "var(--primary-text-color)",
"material-background-color": "var(--card-background-color)",
"material-secondary-background-color": "var(--secondary-background-color)",
"material-secondary-text-color": "var(--secondary-text-color)",
"mdc-checkbox-unchecked-color": "rgba(var(--rgb-primary-text-color), 0.54)",
"mdc-checkbox-disabled-color": "var(--disabled-text-color)",
"mdc-radio-unchecked-color": "rgba(var(--rgb-primary-text-color), 0.54)",

View File

@@ -1066,9 +1066,7 @@
"label": "Repeat",
"type_select": "Repeat type",
"type": {
"count": {
"label": "Count"
},
"count": { "label": "Count" },
"while": {
"label": "While",
"conditions": "While conditions"
@@ -1630,37 +1628,6 @@
"zwave_info": "Z-Wave Info",
"stage": "Stage",
"node_failed": "Node Failed"
},
"node_query_stages": {
"protocolinfo": "Obtaining basic Z-Wave capabilities of this node from the controller",
"probe": "Checking if the node is awake/alive",
"wakeup": "Setting up support for wakeup queues and messages",
"manufacturerspecific1": "Obtaining manufacturer and product ID codes from the node",
"nodeinfo": "Obtaining supported command classes from the node",
"nodeplusinfo": "Obtaining Z-Wave+ information from the node",
"manufacturerspecific2": "Obtaining additional manufacturer and product ID codes from the node",
"versions": "Obtaining information about firmware and command class versions",
"instances": "Obtaining details about what instances or channels a device supports",
"static": "Obtaining static values from the device",
"cacheload": "Loading information from the OpenZWave cache file. Battery nodes will stay at this stage until the node wakes up.",
"associations": "Refreshing association groups and memberships",
"neighbors": "Obtaining a list of the node's neighbors",
"session": "Obtaining infrequently changing values from the node",
"dynamic": "Obtaining frequently changing values from the node",
"configuration": "Obtaining configuration values from the node",
"complete": "Interview process is complete"
},
"refresh_node": {
"title": "Refresh Node Information",
"complete": "Node Refresh Complete",
"description": "This will tell OpenZWave to re-interview a node and update the node's command classes, capabilities, and values.",
"battery_note": "If the node is battery powered, be sure to wake it before proceeding",
"wakeup_header": "Wakeup Instructions for",
"wakeup_instructions_source": "Wakeup instructions are sourced from the OpenZWave community device database.",
"start_refresh_button": "Start Refresh",
"refreshing_description": "Refreshing node information...",
"node_status": "Node Status",
"step": "Step"
}
},
"zha": {

View File

@@ -254,10 +254,6 @@ export type LightEntity = HassEntityBase & {
friendly_name: string;
brightness: number;
hs_color: number[];
color_temp: number;
white_value: number;
effect?: string;
effect_list: string[] | null;
};
};
@@ -287,12 +283,6 @@ export type MediaEntity = HassEntityBase & {
media_title: string;
icon?: string;
entity_picture_local?: string;
is_volume_muted?: boolean;
volume_level?: number;
source?: string;
source_list?: string[];
sound_mode?: string;
sound_mode_list?: string[];
};
state:
| "playing"

View File

@@ -465,7 +465,6 @@
},
"relative_time": {
"duration": {
"hour": "{count} {count, plural,\none {ساعة}\nother {ساعات}\n}",
"minute": "{count} {count, plural,\n one {دقيقة}\n other {دقائق}\n}"
},
"future": "قبل {time}",
@@ -547,7 +546,6 @@
"zha_device_info": {
"buttons": {
"add": "أضف أجهزة عبر هذا الجهاز",
"clusters": "إدارة العناقيد",
"zigbee_information": "معلومات Zigbee"
},
"device_signature": "توقيع جهاز Zigbee",
@@ -1155,9 +1153,6 @@
"discovered_text": "ستظهر الأجهزة هنا عند إكتشافها."
},
"button": "كوِن",
"clusters": {
"header": "عناقيد"
},
"groups": {
"zha_zigbee_groups": "مجموعات ZHA Zigbee"
},

View File

@@ -2475,7 +2475,7 @@
},
"menu": {
"close": "Luk",
"configure_ui": "Rediger betjeningspanel",
"configure_ui": "Konfigurer brugerflade",
"exit_edit_mode": "Afslut brugerflade-redigeringstilstand",
"help": "Hjælp",
"refresh": "Opdater",

View File

@@ -1619,11 +1619,6 @@
"title": "MQTT",
"topic": "Topic"
},
"ozw": {
"device_info": {
"zwave_info": "Z-Wave Infos"
}
},
"person": {
"add_person": "Person hinzufügen",
"caption": "Personen",
@@ -2736,16 +2731,10 @@
"header": "Verbindung automatisch schließen"
},
"themes": {
"accent_color": "Akzentfarbe",
"dark_mode": {
"dark": "Dunkel",
"light": "Hell"
},
"dropdown_label": "Thema",
"error_no_theme": "Keine Themen verfügbar.",
"header": "Thema",
"link_promo": "Erfahre mehr über Themen",
"primary_color": "Primärfarbe"
"link_promo": "Erfahre mehr über Themen"
},
"vibrate": {
"description": "Aktiviere oder deaktiviere die Vibration an diesem Gerät, wenn du Geräte steuerst.",

View File

@@ -2088,7 +2088,7 @@
"description": "Disparar un evento en el bus de eventos.",
"documentation": "Documentación de eventos.",
"event_fired": "Evento {name} disparado",
"fire_event": "Lanzar evento",
"fire_event": "Disparar evento",
"listen_to_events": "Escuchar eventos",
"listening_to": "Escuchando",
"notification_event_fired": "¡Evento {tipe} disparado con éxito!",

View File

@@ -386,9 +386,6 @@
"reverse": "Tagurpidi",
"speed": "Kiirus"
},
"humidifier": {
"target_humidity_entity": "Soovitud niiskusemäär"
},
"light": {
"brightness": "Heledus",
"color_temperature": "Värvustemperatuur",
@@ -474,12 +471,8 @@
"cancel": "Loobu",
"close": "Sulge",
"loading": "Laadimine",
"menu": "Menüü",
"no": "Ei",
"previous": "Eelmine",
"refresh": "Värskenda",
"save": "Salvesta",
"successfully_deleted": "Edukalt kustutatud",
"successfully_saved": "Edukalt salvestatud",
"yes": "Jah"
},
@@ -551,7 +544,7 @@
"dismiss": "Loobu",
"editor": {
"confirm_delete": "Oled kindel, et soovid selle kirje kustutada?",
"delete": "Kustuta",
"delete": "KUSTUTA",
"enabled_cause": "Keelatud, sest {cause}.",
"enabled_description": "Keelatud olemeid ei lisata Home Assistant'i.",
"enabled_label": "Luba olem",
@@ -559,9 +552,8 @@
"name": "Nime muutmine",
"note": "Märkus: see ei pruugi veel töötada kõigi sidumistega.",
"unavailable": "See olem pole praegu saadaval.",
"update": "Uuenda"
"update": "UUENDA"
},
"no_unique_id": "Sellel olemil pole unikaalset ID-d, seetõttu ei saa selle seadeid kasutajaliidesest hallata.",
"related": "Seotud",
"settings": "Seaded"
},
@@ -570,28 +562,6 @@
"default_confirmation_title": "Oled sa kindel?",
"ok": "OK"
},
"helper_settings": {
"generic": {
"name": "Nimi"
},
"input_datetime": {
"date": "Kuupäev",
"datetime": "Kuupäev ja kellaaeg",
"time": "Aeg"
},
"input_number": {
"step": "Sammu suurus",
"unit_of_measurement": "Mõõtühik"
},
"input_select": {
"add": "Lisa"
},
"input_text": {
"max": "Maksimaalne pikkus",
"min": "Minimaalne pikkus",
"password": "Salasõna"
}
},
"more_info_control": {
"dismiss": "Loobu dialoogist",
"edit": "Muuda olemit",
@@ -688,35 +658,23 @@
},
"notification_toast": {
"connection_lost": "Ühendus kadunud. Taasühendamine...",
"service_call_failed": "Teenuse {service} väljakutsumine ebaõnnestus.",
"started": "Koduabiline on käivitunud!"
"service_call_failed": "Teenuse {service} väljakutsumine ebaõnnestus."
},
"panel": {
"calendar": {
"my_calendars": "Minu kalendrid",
"today": "Täna"
},
"config": {
"areas": {
"caption": "Alade register",
"delete": {
"confirmation_title": "Oled kindel, et soovid selle ala kustutada?"
},
"description": "Ülevaade kõikidest oma kodu aladest.",
"editor": {
"area_id": "Piirkonna ID",
"create": "LOO",
"default_name": "Uus ala",
"delete": "KUSTUTA",
"update": "UUENDA"
},
"picker": {
"create_area": "LOO ALA",
"header": "Alade register",
"integrations_page": "Sidumiste leht",
"introduction": "Alasid kasutatakse seadmete paiknemise korraldamiseks. Seda teavet kasutatakse läbivalt kasutajaliidese, lubade ja teiste süsteemidega sidumise korraldamisel.",
"introduction2": "Seadmete paigutamiseks alale mine alloleva lingi kaudu sidumiste lehele ja seejärel klõpsa seadme kaartideni jõudmiseks seadistatud sidumisel.",
"no_areas": "Paistab, et sul pole veel alasid!"
"introduction2": "Seadmete paigutamiseks alale mine alloleva lingi kaudu sidumiste lehele ja seejärel klõpsa seadme kaartideni jõudmiseks seadistatud sidumisel."
}
},
"automation": {
@@ -752,9 +710,6 @@
"label": "Vallanda sündmus",
"service_data": "Teenuse andmed"
},
"repeat": {
"label": "Korda"
},
"scene": {
"label": "Aktiveeri stseen"
},
@@ -843,9 +798,6 @@
"introduction": "Kasuta oma kodule elu sisse puhumiseks automatiseeringuid.",
"load_error_not_editable": "Ainult automations.yaml failis asuvad automatiseeringud on muudetavad.",
"load_error_unknown": "Viga automatiseeringu laadimisel ({err_no}).",
"modes": {
"parallel": "Paralleelselt"
},
"save": "Salvesta",
"triggers": {
"add": "Lisa päästik",
@@ -1021,11 +973,8 @@
"webhook_for": "Veebihaak {name} jaoks"
},
"forgot_password": {
"check_your_email": "Parooli lähtestamise kohta saate juhiseid oma e-posti aadressilt.",
"email": "E-post",
"email_error_msg": "Vigane meiliaadress",
"instructions": "Sisestage oma e-posti aadress ja me saadame teile lingi parooli lähtestamiseks.",
"send_reset_email": "Saatke lähtestamismeil",
"subtitle": "Unustasid oma salasõna",
"title": "Unustasid salasõna"
},
@@ -1038,7 +987,6 @@
"title": "Google Assistant"
},
"login": {
"alert_email_confirm_necessary": "Enne sisselogimist peate oma e-posti aadressi kinnitama.",
"alert_password_change_required": "Enne sisselogimist pead parooli muutma.",
"dismiss": "Loobu",
"email": "E-post",
@@ -1053,7 +1001,6 @@
"trial_info": "Makseteavet pole vaja"
},
"register": {
"account_created": "Konto loodud! Konto aktiveerimise kohta saate juhiseid oma e-posti aadressilt.",
"create_account": "Loo konto",
"email_address": "E-posti aadress",
"email_error_msg": "Vigane meiliaadress",
@@ -1066,8 +1013,7 @@
"password": "Salasõna",
"password_error_msg": "Salasõnad on vähemalt 8 tähemärki",
"resend_confirm_email": "Saada kinnitusmeil uuesti",
"start_trial": "Alusta proovimist",
"title": "Loo konto"
"start_trial": "Alusta proovimist"
}
},
"common": {
@@ -1128,7 +1074,6 @@
}
},
"caption": "Seadmed",
"confirm_delete": "Oled kindel, et soovid selle seadme kustutada?",
"confirm_rename_entity_ids": "Kas soovid ka oma olemite ID-d ümber nimetada?",
"data_table": {
"area": "Ala",
@@ -1138,9 +1083,7 @@
"manufacturer": "Tootja",
"model": "Mudel"
},
"delete": "Kustuta",
"description": "Halda ühendatud seadmeid",
"device_info": "Seadme info",
"device_not_found": "Seadet ei leitud.",
"entities": {
"add_entities_lovelace": "Lisa Lovelace'i",
@@ -1225,11 +1168,9 @@
"caption": "Sidumised",
"config_entry": {
"area": "alas {area}",
"delete": "Kustuta",
"delete_button": "Kustuta {integration}",
"delete_confirm": "Oled kindel, et soovid selle sidumise kustutada?",
"device_unavailable": "seade pole saadaval",
"documentation": "Vaata dokumentatsiooni",
"entity_unavailable": "olem pole saadaval",
"firmware": "Püsivara: {version}",
"hub": "Ühendatud",
@@ -1274,7 +1215,6 @@
},
"introduction": "Siin saab seadistada oma komponente ja Home Assistant'i. Mitte kõike ei saa veel kasutajaliidese kaudu seadistada, kuid me töötame selle nimel.",
"logs": {
"caption": "Logid",
"clear": "Puhasta",
"description": "Home Assistanti logid",
"details": "Logi üksikasjad ({level})",
@@ -1285,26 +1225,7 @@
"refresh": "Värskenda",
"title": "Logid"
},
"lovelace": {
"dashboards": {
"detail": {
"dismiss": "Sulge",
"title": "Pealkiri"
},
"picker": {
"open": "Ava"
}
},
"resources": {
"detail": {
"delete": "Kustuta",
"update": "Uuenda"
},
"refresh_header": "Kas soovite värskendada?"
}
},
"mqtt": {
"button": "Seadista",
"description_listen": "Kuula teemat",
"listening_to": "Kuulamas",
"publish": "Avalda",
@@ -1353,7 +1274,6 @@
"header": "Olemid",
"without_device": "Olemid ilma seadmeta"
},
"icon": "Ikoon",
"load_error_not_editable": "Ainult scenes.yaml failis asuvad stseenid on muudetavad.",
"load_error_unknown": "Viga stseeni laadimisel ({err_no}).",
"name": "Nimi",
@@ -1382,12 +1302,7 @@
"delete_confirm": "Oled kindel, et soovid selle skripti kustutada?",
"delete_script": "Kustuta skript",
"header": "Skript: {name}",
"icon": "Ikoon",
"id_already_exists": "See ID on juba olemas",
"load_error_not_editable": "Ainult scripts.yaml failis asuvad skriptid on muudetavad.",
"max": {
"queued": "Järjekorra pikkus"
},
"sequence": "Jada"
},
"picker": {
@@ -1454,14 +1369,7 @@
"id": "ID",
"owner": "Omanik",
"system_generated": "Süsteemi genereeritud",
"unnamed_user": "Nimetu kasutaja",
"update_user": "Uuenda"
},
"picker": {
"headers": {
"group": "Grupp",
"system": "Süsteem"
}
"unnamed_user": "Nimetu kasutaja"
}
},
"zha": {
@@ -1532,9 +1440,6 @@
"header": "Võrgu haldamine",
"introduction": "Kogu võrku mõjutavad käsud"
},
"network": {
"caption": "Võrk"
},
"node_management": {
"header": "Seadme haldus"
},
@@ -1602,10 +1507,6 @@
"set_wakeup": "Määra ärkamise intervall",
"true": "Tõene"
},
"node_management": {
"group": "Grupp",
"protection": "Kaitse"
},
"ozw_log": {
"header": "OZW logi"
},
@@ -1684,23 +1585,11 @@
},
"history": {
"period": "Periood",
"ranges": {
"last_week": "Eelmine nädal",
"this_week": "See nädal",
"today": "Täna",
"yesterday": "Eile"
},
"showing_entries": "Näitan kuupäeva"
},
"logbook": {
"entries_not_found": "Logiraamatu kandeid ei leitud.",
"period": "Periood",
"ranges": {
"last_week": "Eelmine nädal",
"this_week": "See nädal",
"today": "Täna",
"yesterday": "Eile"
},
"showing_entries": "Näitan kuupäeva"
},
"lovelace": {
@@ -1765,7 +1654,6 @@
"generic": {
"aspect_ratio": "Proportsioonid",
"camera_image": "Kaamera olem",
"camera_view": "Kaamera vaade",
"entities": "Olemid",
"entity": "Olem",
"icon": "Ikoon",
@@ -1792,9 +1680,6 @@
"horizontal-stack": {
"name": "Horisontaalne pinu"
},
"humidifier": {
"name": "Niisutaja"
},
"iframe": {
"name": "iFrame"
},
@@ -1826,7 +1711,6 @@
"name": "Taime olek"
},
"sensor": {
"graph_type": "Graafiku tüüp",
"name": "Andur"
},
"shopping-list": {
@@ -1852,8 +1736,7 @@
"pick_card": "Vali kaart, mida soovid lisada.",
"show_code_editor": "Kuva koodiredaktor",
"show_visual_editor": "Kuva visuaalne redaktor",
"toggle_editor": "Lülita redaktor sisse/välja",
"typed_header": "Kaardi seadistamine"
"toggle_editor": "Lülita redaktor sisse/välja"
},
"edit_lovelace": {
"edit_title": "Muuda pealkirja",
@@ -1869,8 +1752,7 @@
"move_left": "Liiguta vaadet vasakule",
"move_right": "Liiguta vaadet paremale",
"tab_badges": "Märgid",
"tab_settings": "Seaded",
"tab_visibility": "Nähtavus"
"tab_settings": "Seaded"
},
"header": "Muuda kasutajaliidest",
"menu": {
@@ -1894,7 +1776,6 @@
},
"save_config": {
"cancel": "Ära pane tähele",
"close": "Sulge",
"header": "Võta Lovelace kasutajaliides oma kontrolli alla",
"para": "Vaikimisi hoolitseb kasutajaliidese eest Home Assistant, värskendades seda, kui saadaval on uued olemid või Lovelace komponendid. Kui võtad kontrolli üle, ei tee me sinu jaoks enam automaatselt muudatusi.",
"para_sure": "Oled kindel, et soovid kasutajaliidese oma kontrolli alla võtta?",
@@ -1904,11 +1785,6 @@
"add": "Lisa Lovelace'i kasutajaliidesesse",
"create_own": "Vali teine kaart",
"header": "Lõime sulle ettepaneku"
},
"view": {
"panel_mode": {
"warning_multiple_cards": "See vaade koosneb rohkem kui ühest kaardist, aga paneeli vaade saab näidata ainult ühte kaarti"
}
}
},
"menu": {
@@ -1927,8 +1803,7 @@
"title": "Kasutamata olemid"
},
"views": {
"confirm_delete": "Oled kindel, et soovid selle vaate kustutada?",
"confirm_delete_existing_cards": "Selle vaate kustutamisel eemaldatakse ka kaardid"
"confirm_delete": "Oled kindel, et soovid selle vaate kustutada?"
},
"warning": {
"entity_non_numeric": "Olem on mittenumbriline: {entity}",
@@ -2018,7 +1893,6 @@
},
"trusted_networks": {
"abort": {
"not_allowed": "Sinu arvuti ei ole lubatute nimekirjas.",
"not_whitelisted": "Sinu arvuti ei ole lubatute nimekirjas."
},
"step": {
@@ -2031,7 +1905,6 @@
}
}
},
"start_over": "Alusta uuesti",
"unknown_error": "Midagi läks valesti",
"working": "Palun oota"
},

View File

@@ -359,7 +359,7 @@
},
"automation": {
"last_triggered": "הפעלה אחרונה",
"trigger": "הרץ"
"trigger": "מפעיל"
},
"camera": {
"not_available": "התמונה אינה זמינה"
@@ -833,15 +833,6 @@
"name": "פעולה",
"type_select": "סוג פעולה",
"type": {
"choose": {
"add_option": "הוסף אפשרות",
"conditions": "תנאים",
"default": "פעולות ברירת מחדל",
"label": "בחר",
"option": "אפשרות {number}",
"remove_option": "הסר אפשרות",
"sequence": "פעולות"
},
"condition": {
"label": "תנאי"
},
@@ -861,24 +852,6 @@
"label": "ירה אירוע",
"service_data": "נתוני שירות"
},
"repeat": {
"label": "חזור",
"sequence": "פעולות",
"type_select": "סוג חזרה",
"type": {
"count": {
"label": "ספירה"
},
"until": {
"conditions": ")תנאי עד ש (Until",
"label": "עד ש"
},
"while": {
"conditions": ")תנאי כל עוד (While",
"label": "כל עוד"
}
}
},
"scene": {
"label": "הפעל סצנה"
},
@@ -1646,18 +1619,6 @@
"title": "MQTT",
"topic": "נושא"
},
"ozw": {
"common": {
"node_id": "מזהה רכיב",
"ozw_instance": "מופע OpenZWave",
"zwave": "Z-Wave"
},
"device_info": {
"node_failed": "הרכיב נכשל",
"stage": "שלב",
"zwave_info": "מידע Z-Wave"
}
},
"person": {
"add_person": "הוסף אדם",
"caption": "אנשים",
@@ -2426,9 +2387,6 @@
"para_migrate": "Home Assistant יכול להוסיף מזהה יחודי לכל הכרטיסיות והתצוגות שלך בצורה אוטומטית בכך שתלחץ על לחצן ״הגר הגדרה״.",
"para_no_id": "האלמנט הנוכחי לא מכיל מזהה יחודיי. בבקשה הוסף מזהה יחודי לאלמט זה בקובץ 'ui-lovelace.yaml'."
},
"move_card": {
"header": "בחר תצוגה שאליה להעביר את הכרטיס"
},
"raw_editor": {
"confirm_remove_config_text": "אנו ניצור אוטומטית את תצוגות ממשק המשתמש של Lovelace עם האזורים והמכשירים שלך אם תסיר את קונפיגורציית ממשק המשתמש שלך ב- Lovelace.",
"confirm_remove_config_title": "האם אתה בטוח שברצונך להסיר את תצורת ממשק המשתמש של Lovelace? אנו נייצר אוטומטית את תצוגות ממשק המשתמש שלך ב- Lovelace עם האזורים והמכשירים שלך.",
@@ -2456,10 +2414,6 @@
"yaml_control": "כדי לקבל שליטה במצב YAML, צור קובץ YAML עם השם שציינת ב-config עבור לוח מחוונים זה, או ברירת המחדל 'ui-lovelace.yaml'.",
"yaml_mode": "אתה משתמש במצב YAML עבור לוח מחוונים זה ולכן אין באפשרותך לשנות את קונפיגורצית Lovelace מממשק המשתמש. אם ברצונך לנהל לוח מחוונים זה מממשק המשתמש, הסר 'mode: yaml' מתצורת Loverlace ב 'configuration.yaml.'."
},
"select_view": {
"dashboard_label": "לוח בקרה",
"header": "בחר תצוגה"
},
"suggest_card": {
"add": "הוסף לממשק המשתמש של Lovelace",
"create_own": "בחר כרטיס אחר",
@@ -2777,18 +2731,10 @@
"header": "סגור חיבור באופן אוטומטי"
},
"themes": {
"accent_color": "צבע הדגשה",
"dark_mode": {
"auto": "אוטומטי",
"dark": "כהה",
"light": "בהיר"
},
"dropdown_label": "ערכת נושא",
"error_no_theme": "אין ערכות נושא זמינות.",
"header": "ערכת נושא",
"link_promo": "למד אודות ערכות נושא",
"primary_color": "בצע ראשי",
"reset": "איפוס"
"link_promo": "למד אודות ערכות נושא"
},
"vibrate": {
"description": "הפעל או בטל את הרטט במכשיר זה בעת שליטה בהתקנים.",

View File

@@ -834,12 +834,9 @@
"type_select": "Tipo di azione",
"type": {
"choose": {
"add_option": "Aggiungi opzione",
"conditions": "Condizioni",
"default": "Azione predefinita",
"label": "Scegli",
"option": "Opzione {number}",
"remove_option": "Rimuovi opzione",
"sequence": "Azioni"
},
"condition": {
@@ -861,24 +858,6 @@
"label": "Attiva Evento",
"service_data": "Dati del servizio"
},
"repeat": {
"label": "Ripetere",
"sequence": "Azioni",
"type_select": "Tipo \"ripetizione\"",
"type": {
"count": {
"label": "Conteggio"
},
"until": {
"conditions": "Condizioni \"fino a\"",
"label": "Fino a"
},
"while": {
"conditions": "Condizioni \"mentre\"",
"label": "Mentre"
}
}
},
"scene": {
"label": "Attivare la scena"
},
@@ -1646,18 +1625,6 @@
"title": "MQTT",
"topic": "argomento"
},
"ozw": {
"common": {
"node_id": "ID del nodo",
"ozw_instance": "Istanza OpenZWave",
"zwave": "Z-Wave"
},
"device_info": {
"node_failed": "Nodo non riuscito",
"stage": "Fase",
"zwave_info": "Informazioni Z-Wave"
}
},
"person": {
"add_person": "Aggiungi persona",
"caption": "Persone",
@@ -2426,9 +2393,6 @@
"para_migrate": "Home Assistant può aggiungere automaticamente gli ID a tutte le tue schede e viste in maniera automatica premendo il pulsante \"Esporta Configurazione\".",
"para_no_id": "Questo elemento non ha un ID. Aggiungi un ID a questo elemento in 'ui-lovelace.yaml'."
},
"move_card": {
"header": "Scegli una visualizzazione in cui spostare la scheda"
},
"raw_editor": {
"confirm_remove_config_text": "Genereremo automaticamente le tue viste dell'Interfaccia utente di Lovelace con le tue aree e dispositivi se rimuovi la tua configurazione dell'interfaccia utente di Lovelace.",
"confirm_remove_config_title": "Sei sicuro di voler rimuovere la tua configurazione dell'interfaccia utente di Lovelace? Genereremo automaticamente le tue viste Lovelace con le tue aree e dispositivi.",
@@ -2456,10 +2420,6 @@
"yaml_control": "Per assumere il controllo in modalità YAML, creare un file YAML con il nome specificato nella tua configurazione per questa plancia, o il predefinito 'ui-lovelace.yaml'.",
"yaml_mode": "Questa plancia sta utilizzando la modalità YAML, il che significa che non è possibile modificare la configurazione di Lovelace dall'Interfaccia Utente. Se volete gestire questa plancia dall'Interfaccia Utente, rimuovere 'mode: yaml' dalla configurazione di Lovelace in 'configuration.yaml'."
},
"select_view": {
"dashboard_label": "Plancia",
"header": "Scegliere una visualizzazione"
},
"suggest_card": {
"add": "Aggiungi all'interfaccia utente di Lovelace",
"create_own": "Scegliere una scheda diversa",
@@ -2475,7 +2435,7 @@
},
"menu": {
"close": "Chiudi",
"configure_ui": "Modifica la Plancia",
"configure_ui": "Configurare l'Interfaccia Utente",
"exit_edit_mode": "Esci dalla modalità di modifica dell'Interfaccia Utente",
"help": "Aiuto",
"refresh": "Aggiorna",

View File

@@ -512,8 +512,7 @@
},
"login-form": {
"log_in": "ログイン",
"password": "パスワード",
"remember": "覚えて"
"password": "パスワード"
},
"notification_drawer": {
"close": "閉じる",
@@ -655,7 +654,6 @@
},
"state": {
"from": "変化前",
"label": "状態",
"to": "変化後"
},
"sun": {
@@ -995,17 +993,6 @@
"title": "MQTT",
"topic": "トピック"
},
"ozw": {
"common": {
"node_id": "ードID",
"ozw_instance": "OpenZWaveインスタンス"
},
"device_info": {
"node_failed": "ノードが失敗しました",
"stage": "段階",
"zwave_info": "Z-Wave情報"
}
},
"person": {
"caption": "人",
"description": "Home Assistant を追跡している人の管理。",
@@ -1344,9 +1331,6 @@
"menu": {
"open": "Lovelace メニューを開く"
},
"move_card": {
"header": "カードを移動するビューを選択してください"
},
"raw_editor": {
"confirm_unsaved_changes": "未保存の変更があります、終了してもよろしいですか?",
"confirm_unsaved_comments": "コンフィグレーションはコメントが含まれています、これらは保存されません。本当に続けますか?",
@@ -1356,10 +1340,6 @@
},
"save_config": {
"close": "閉じる"
},
"select_view": {
"dashboard_label": "ダッシュボード",
"header": "ビューに移動"
}
},
"menu": {
@@ -1383,8 +1363,7 @@
"mailbox": {
"delete_button": "削除",
"delete_prompt": "このメッセージを削除しますか?",
"empty": "メッセージはありません",
"playback_title": "メッセージの再生"
"empty": "メッセージはありません"
},
"page-authorize": {
"abort_intro": "ログインが中止されました",

View File

@@ -2475,7 +2475,7 @@
},
"menu": {
"close": "Lukk",
"configure_ui": "Rediger brukergrensesnitt",
"configure_ui": "Konfigurer brukergrensesnitt",
"exit_edit_mode": "Avslutt redigeringsmodus for brukergrensesnitt",
"help": "Hjelp",
"refresh": "Oppdater",

View File

@@ -836,9 +836,7 @@
"choose": {
"add_option": "Optie toevoegen",
"conditions": "Voorwaarden",
"default": "Standaardacties",
"label": "Kies",
"option": "Optie {number}",
"remove_option": "Verwijder optie",
"sequence": "Acties"
},
@@ -861,24 +859,6 @@
"label": "Gebeurtenis uitvoeren",
"service_data": "Service data"
},
"repeat": {
"label": "Herhaling",
"sequence": "Acties",
"type_select": "Herhaal-type",
"type": {
"count": {
"label": "Telling"
},
"until": {
"conditions": "Totdat voldaan is aan",
"label": "Totdat"
},
"while": {
"conditions": "Zolang voldaan is aan voorwaarden",
"label": "Zolang"
}
}
},
"scene": {
"label": "Activeer scène"
},
@@ -1646,18 +1626,6 @@
"title": "MQTT",
"topic": "onderwerp"
},
"ozw": {
"common": {
"node_id": "Knooppunt-ID",
"ozw_instance": "Instantie van OpenZWave",
"zwave": "Z-Wave"
},
"device_info": {
"node_failed": "Knoop gefaald",
"stage": "Stadium",
"zwave_info": "Z-Wave informatie"
}
},
"person": {
"add_person": "Persoon toevoegen",
"caption": "Personen",
@@ -2026,8 +1994,6 @@
"group": "Groep",
"header": "Z-Wave Knooppunt-beheer",
"introduction": "Voer Z-Wave commando's uit die een enkel knooppunt beïnvloeden. Kies een knooppunt om een lijst met beschikbare commando's te zien.",
"max_associations": "Maximale associaties:",
"node_group_associations": "Knooppuntgroepassociaties",
"node_protection": "Node beveiliging",
"node_to_control": "Node om te besturen",
"nodes": "Knooppunten",
@@ -2426,9 +2392,6 @@
"para_migrate": "Home Assistant kan ID's voor al je kaarten en weergaven automatisch voor je toevoegen door op de knop 'Migrate config' te klikken.",
"para_no_id": "Dit element heeft geen ID. Voeg een ID toe aan dit element in 'ui-lovelace.yaml'."
},
"move_card": {
"header": "Kies een weergave om de kaart naartoe te verplaatsen"
},
"raw_editor": {
"confirm_remove_config_text": "We zullen je Lovelace gebruikersinterface automatisch genereren met je gebieden en apparaten als je de huidige Lovelace gebruikersinterface verwijdert.",
"confirm_remove_config_title": "Weet je zeker dat je de huidige Lovelace gebruikersinterface wilt verwijderen? We zullen automatisch een nieuwe Lovelace gebruikersinterface genereren op basis van je gebieden en apparaten.",
@@ -2457,8 +2420,7 @@
"yaml_mode": "Je gebruikt de YAML-modus, wat betekent dat je jouw Lovelace-configuratie niet vanuit de gebruikersinterface kunt wijzigen. Als je Lovelace vanuit de gebruikersinterface wilt wijzigen, verwijder dan 'mode: yaml' uit de Lovelace-configuratie in 'configuration.yaml'."
},
"select_view": {
"dashboard_label": "Dashboard",
"header": "Kies een weergave"
"dashboard_label": "Dashboard"
},
"suggest_card": {
"add": "Voeg toe aan de Lovelace gebruikersinterface",
@@ -2777,9 +2739,7 @@
"header": "Verbinding automatisch verbreken"
},
"themes": {
"accent_color": "Accentkleur",
"dark_mode": {
"auto": "Automatisch",
"dark": "Donker",
"light": "Licht"
},
@@ -2787,8 +2747,7 @@
"error_no_theme": "Geen thema's beschikbaar.",
"header": "Thema",
"link_promo": "Meer informatie over thema's",
"primary_color": "Primaire kleur",
"reset": "Herstel"
"primary_color": "Primaire kleur"
},
"vibrate": {
"description": "Schakel trillingen op dit apparaat in of uit wanneer u apparaten bestuurt.",

View File

@@ -354,7 +354,7 @@
"climate": {
"aux_heat": "Aux-varme",
"away_mode": "Bortemodus",
"currently": "Akkurat no",
"currently": "Akkuratt no",
"fan_mode": "Viftemodus",
"on_off": "På / av",
"operation": "Operasjon",
@@ -397,8 +397,6 @@
"activate": "Aktiver"
},
"script": {
"cancel": "Avbryt",
"cancel_multiple": "Avbryt {number}",
"execute": "Utfør"
},
"service": {
@@ -465,9 +463,7 @@
"back": "Tilbake",
"cancel": "Avbryt",
"delete": "Slett",
"error_required": "Påkrevd",
"loading": "Lastar",
"menu": "Meny",
"next": "Neste",
"previous": "Førre",
"refresh": "Oppdater ",
@@ -489,9 +485,6 @@
"clear": "Klar ",
"show_areas": "Vis områda"
},
"data-table": {
"no-data": "Ingen data"
},
"device-picker": {
"device": "Enhet",
"no_area": "Inga område",
@@ -607,12 +600,11 @@
"services": {
"reconfigure": "Konfigurer ZHA-eininga (heal device) på nytt. Bruk dette om du har problem med eininga. Dersom eininga går på batteri, ver sikker på at den er vaken og tek i mot kommandar når du brukar denne tenesta.",
"remove": "Fjern eining frå Zigbee-nettverket",
"updateDeviceName": "Gje eininga eit tilpassa namn i einingsregisteret. "
"updateDeviceName": "Gje oppføringa eit eige namn i oppføringsregisteret. "
},
"unknown": "Ukjent",
"zha_device_card": {
"area_picker_label": "Område",
"device_name_placeholder": "Endre navn på eining",
"device_name_placeholder": "Gitt brukarnamn",
"update_name_button": "Oppdater namn"
}
}
@@ -700,9 +692,6 @@
"label": "Køyr hending",
"service_data": "Tenestedata"
},
"repeat": {
"label": "Gjenta"
},
"service": {
"label": "Hent teneste",
"service_data": "Tenestedata"
@@ -729,10 +718,6 @@
"type": {
"device": {
"condition": "Føresetnad ",
"extra_fields": {
"above": "Over",
"below": "Under"
},
"label": "Eining"
},
"not": {
@@ -779,11 +764,6 @@
"introduction": "Bruk automasjonar til å gi liv til heimen din",
"load_error_not_editable": "Berre automasjonar i automations.yaml kan redigerast.",
"load_error_unknown": "Feil ved lasting av automasjon ({err_no}).",
"modes": {
"restart": "Omstart"
},
"move_down": "Flytt ned",
"move_up": "Flytt opp",
"save": "Lagre",
"triggers": {
"add": "Legg til utløysar",
@@ -797,10 +777,6 @@
"type_select": "Utløysartype",
"type": {
"device": {
"extra_fields": {
"above": "Over",
"below": "Under"
},
"label": "Oppføring",
"trigger": "Utløysar "
},
@@ -897,19 +873,7 @@
"caption": "Home Assistant Cloud",
"description_features": "Kontroller når du ikkje er heime og integrer med Alexa og Google Assistant",
"description_login": "Logga inn som {email}",
"description_not_login": "Ikkje logga inn",
"forgot_password": {
"email": "E-post",
"subtitle": "Gløymt passordet ditt",
"title": "Gløymt passord"
},
"login": {
"email": "E-post",
"forgot_password": "gløymt passordet?",
"password": "Passord",
"password_error_msg": "Passord er minst 8 teikn",
"sign_in": "Logg inn"
}
"description_not_login": "Ikkje logga inn"
},
"core": {
"caption": "Generelt",
@@ -989,7 +953,7 @@
"description": "Oversikt over alle kjende oppføringar.",
"picker": {
"header": "Oppføringsregisteret",
"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 akkurat denne oppføringa.",
"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."
}
},
@@ -999,7 +963,6 @@
},
"header": "Konfigurer Home Assistant",
"info": {
"caption": "Info",
"documentation": "Dokumentasjon ",
"integrations": "Integrasjonar",
"issues": "Problem ",
@@ -1022,7 +985,7 @@
"no_device": "Oppføringar utan einingar",
"no_devices": "Denne integrasjonen har ingen oppføringar",
"options": "Val",
"rename": "Endre namn",
"rename": "Gi nytt namn",
"restart_confirm": "Restart Home Assistant for å fjerne denne integrasjonen",
"system_options": "Systemval",
"unnamed_entry": "Oppføring utan namn"
@@ -1052,7 +1015,6 @@
},
"introduction": "Her er det mogleg å konfigurere dine komponenter og Home Assistant. Ikkje alt er mogleg å konfigurere frå brukarsnittet endå, men vi jobbar med saka.",
"logs": {
"caption": "Loggar",
"title": "Loggar"
},
"mqtt": {
@@ -1069,9 +1031,6 @@
}
},
"scene": {
"editor": {
"icon": "Ikon"
},
"picker": {
"headers": {
"name": "Namn"
@@ -1081,14 +1040,6 @@
"script": {
"caption": "Skript",
"description": "Lag og rediger skript",
"editor": {
"icon": "Ikon",
"id_already_exists": "Denne ID-en finnast allereie",
"modes": {
"label": "Modus",
"restart": "Omstart"
}
},
"picker": {
"headers": {
"name": "Namn"
@@ -1356,10 +1307,6 @@
"state_equal": "Tilstanden er lik",
"state_not_equal": "Tilstanden er ikkje lik"
},
"config": {
"optional": "Valfri",
"required": "Påkrevd"
},
"entities": {
"description": "Oppføringskortet er den vanlegaste korttypen. Den kan gruppere ting inn i lister."
},
@@ -1370,20 +1317,13 @@
"name": "Oppføring "
},
"gauge": {
"description": "Målarkortet er eit enkelt kort som let deg visuelt sjå sensordata.",
"severity": {
"green": "Grøn",
"red": "Rød"
}
"description": "Målarkortet er eit enkelt kort som let deg visuelt sjå sensordata."
},
"generic": {
"attribute": "Attributt",
"double_tap_action": "Dobbeltrykk-handling",
"icon": "Ikon",
"manual": "Manuelt",
"manual_description": "Vil du legge til eit tilpassa kort eller vil du berre skrive yaml manuelt?",
"maximum": "Maksimum",
"minimum": "Minimum",
"name": "Namn",
"secondary_info_attribute": "Sekundærinfo-attributt",
"state": "Tilstand"
@@ -1421,14 +1361,12 @@
},
"edit_card": {
"add": "Legg til kort",
"confirm_cancel": "Er du sikker på at du vil avbryte?",
"delete": "Slett",
"edit": "Redigere",
"header": "Kortkonfigurasjon",
"move": "Rørsle",
"pick_card": "Vel kortet du vil legge til.",
"toggle_editor": "Bytt redigeringsverktøy",
"unsaved_changes": "Du har endringar som ikkje er lagra"
"toggle_editor": "Bytt redigeringsverktøy"
},
"edit_lovelace": {
"explanation": "Denne tittelen vert vist over alle visningane dine i Lovelace",
@@ -1749,9 +1687,6 @@
"error_no_theme": "Ingen tema tilgjengeleg",
"header": "Tema",
"link_promo": "Lær om temaer"
},
"vibrate": {
"header": "Vibrer"
}
},
"shopping-list": {

View File

@@ -725,7 +725,6 @@
"zha_device_info": {
"buttons": {
"add": "Adicionar dispositivos através deste dispositivo",
"clusters": "Gerenciar Grupos",
"reconfigure": "Reconfigurar O Dispositivo",
"remove": "Remover dispositivo",
"zigbee_information": "Assinatura de dispositivo Zigbee"
@@ -833,15 +832,6 @@
"name": "Açao",
"type_select": "Tipo de acão",
"type": {
"choose": {
"add_option": "Adicionar opção",
"conditions": "Condições",
"default": "Ações padrão",
"label": "Selecione",
"option": "Opção {number}",
"remove_option": "Remover opção",
"sequence": "Ações"
},
"condition": {
"label": "Condição"
},
@@ -861,24 +851,6 @@
"label": "Iniciar evento",
"service_data": "Dados do Serviço"
},
"repeat": {
"label": "Repetir",
"sequence": "Ações",
"type_select": "Tipo de repetição",
"type": {
"count": {
"label": "Contagem"
},
"until": {
"conditions": "Condições (até que...)",
"label": "Até que"
},
"while": {
"conditions": "Condições (enquanto...)",
"label": "Enquanto"
}
}
},
"scene": {
"label": "Ativar cena"
},
@@ -1646,18 +1618,6 @@
"title": "",
"topic": "tópico"
},
"ozw": {
"common": {
"node_id": "ID do Nó",
"ozw_instance": "Instância OpenZWave",
"zwave": "Z-Wave"
},
"device_info": {
"node_failed": "Falha no nó",
"stage": "Estágio",
"zwave_info": "Informações de Z-Wave"
}
},
"person": {
"add_person": "Adicionar pessoa",
"caption": "Pessoas",
@@ -1847,8 +1807,7 @@
"name": "Nome",
"system": "Sistema"
}
},
"users_privileges_note": "Grupos de Usuários ainda é um recurso experimental. O usuário será incapaz de administrar através da interface grática. Nós ainda estamos auditando todos os endponts da API de gerenciamento para se certificar que eles limitam o acesso para administradores da maneira correta."
}
},
"zha": {
"add_device_page": {
@@ -2021,21 +1980,13 @@
"node_management": {
"add_to_group": "Adicionar ao Grupo",
"entities": "Entidades deste nó",
"entity_info": "Informações da Entidade",
"exclude_entity": "Excluir esta entidade do Home Assistant",
"group": "Grupo",
"header": "Gerenciamento de nó Z-Wave",
"introduction": "Executar comandos Z-Wave que afetam um único nó. Seleciona um nó para ver a lista de comandos disponíveis",
"max_associations": "Máximo de Associações",
"node_group_associations": "Associações de grupos de nós",
"node_protection": "Proteção dos nós",
"node_to_control": "Nó para controlar",
"nodes": "Nós",
"nodes_hint": "Selecione um nó para ver opções específicas",
"nodes_in_group": "Outros nós neste grupo",
"pooling_intensity": "Frequência da consulta",
"protection": "Proteção",
"remove_broadcast": "Remover Broadcast",
"remove_from_group": "Remover do Grupo",
"set_protection": "Definir proteção"
},
@@ -2391,7 +2342,7 @@
"show_code_editor": "Mostrar Editor de Código",
"show_visual_editor": "Mostrar Editor Visual",
"toggle_editor": "Alternar Editor",
"typed_header": "Configuração do cartão {type}",
"typed_header": "Configuração de cartão {type}",
"unsaved_changes": "Você tem alterações não salvas"
},
"edit_lovelace": {
@@ -2426,9 +2377,6 @@
"para_migrate": "O Home Assistant pode adicionar IDs a todos os seus cards e visualizações automaticamente clicando no botão 'Migrar configuração'.",
"para_no_id": "Este elemento não possui um ID. Por favor adicione um ID a este elemento em 'ui-lovelace.yaml'."
},
"move_card": {
"header": "Selecione uma tela para onde mover este cartão"
},
"raw_editor": {
"confirm_remove_config_text": "Geraremos automaticamente suas visualizações da interface do usuário do Lovelace com suas áreas e dispositivos se você remover a configuração da interface do usuário do Lovelace.",
"confirm_remove_config_title": "Tem certeza de que deseja remover a configuração da interface Lovelace? Geraremos automaticamente visualizações da interface Lovelace com suas áreas e dispositivos.",
@@ -2456,10 +2404,6 @@
"yaml_control": "Para assumir o controle no modo YAML, crie um arquivo YAML com o nome que você especificou na sua configuração para este painel ou arquivo padrão 'ui-lovelace.yaml'.",
"yaml_mode": "Você está usando o modo YAML para este painel, o que significa que não é possível alterar a configuração do Lovelace na interface. Se você deseja gerenciar esse painel na interface do usuário, remova 'mode: yaml' da configuração do Lovelace em 'configuration.yaml.'"
},
"select_view": {
"dashboard_label": "Painel de controle",
"header": "Selecione uma tela"
},
"suggest_card": {
"add": "Adicionar a UI do Lovelace",
"create_own": "Escolha cartão diferente",
@@ -2777,18 +2721,10 @@
"header": "Fechar a conexão automaticamente"
},
"themes": {
"accent_color": "Cor de detalhe",
"dark_mode": {
"auto": "Automático",
"dark": "Escuro",
"light": "Claro"
},
"dropdown_label": "Tema",
"error_no_theme": "Não há temas disponíveis.",
"header": "Tema",
"link_promo": "Aprenda sobre temas",
"primary_color": "Cor Principal",
"reset": "Redefinir"
"link_promo": "Aprenda sobre temas"
},
"vibrate": {
"description": "Ative ou desative a vibração neste dispositivo ao controlar dispositivos.",

View File

@@ -48,11 +48,6 @@
"none": "Žiadny",
"sleep": "Pohotovostný režim"
}
},
"humidifier": {
"mode": {
"auto": "Auto"
}
}
},
"state_badge": {
@@ -211,8 +206,6 @@
"stopped": "Zastavené"
},
"default": {
"off": "Vypnutý",
"on": "Zapnutý",
"unavailable": "Nedostupný",
"unknown": "Neznámy"
},
@@ -278,7 +271,7 @@
},
"sensor": {
"off": "Neaktívny",
"on": "Zapnutý"
"on": "Aktívny"
},
"sun": {
"above_horizon": "Nad horizontom",
@@ -392,10 +385,6 @@
"reverse": "Reverzný",
"speed": "Rýchlosť"
},
"humidifier": {
"humidity": "Cieľová vlhkosť",
"mode": "Režim"
},
"light": {
"brightness": "Jas",
"color_temperature": "Teplota farby",
@@ -419,7 +408,6 @@
"activate": "Aktivovať"
},
"script": {
"cancel": "Zrušiť",
"execute": "Vykonať"
},
"service": {
@@ -480,15 +468,11 @@
}
},
"common": {
"and": "a",
"back": "Späť",
"cancel": "Zrušiť",
"close": "Zavrieť",
"delete": "Odstrániť",
"loading": "Načítava sa",
"next": "Ďalej",
"no": "Nie",
"refresh": "Obnoviť",
"save": "Uložiť",
"successfully_deleted": "Úspešne odstránené",
"successfully_saved": "Úspešne uložené",
@@ -509,13 +493,6 @@
"clear": "Vyčistiť",
"show_areas": "Zobraziť oblasti"
},
"data-table": {
"no-data": "Žiadne údaje"
},
"date-range-picker": {
"end_date": "Dátum konca",
"start_date": "Dátum začiatku"
},
"device-picker": {
"clear": "Vyčistiť",
"device": "Zariadenie",
@@ -628,13 +605,10 @@
"pattern": "Vzor regexu na overenie na strane klienta",
"text": "Text"
},
"platform_not_loaded": "Integrácia {platform} sa nenačítala. Pridajte ju do svojej konfigurácie buď pridaním 'default_config:' alebo ''{platform}:''.",
"required_error_msg": "Toto pole je povinné",
"yaml_not_editable": "Nastavenia tejto entity nie je možné upravovať z UI. Iba entity nastavené z UI sú konfigurovateľné z UI."
"required_error_msg": "Toto pole je povinné"
},
"more_info_control": {
"dismiss": "Zrušiť dialógové okno",
"edit": "Upraviť entitu",
"person": {
"create_zone": "Vytvoriť zónu z aktuálnej polohy"
},
@@ -674,7 +648,6 @@
"deserialize": "Pokus interpretovať správy MQTT ako JSON",
"entities": "Entity",
"no_entities": "Žiadne entity",
"no_triggers": "Žiadne spúšťače",
"recent_messages": "{n} naposledy prijaté správy",
"show_as_yaml": "Zobraziť ako YAML",
"title": "Informácie o ladení {device}",
@@ -716,7 +689,7 @@
"unknown": "Neznámy",
"zha_device_card": {
"area_picker_label": "Oblasť",
"device_name_placeholder": "Zmeniť názov zariadenia",
"device_name_placeholder": "Používateľom zadaný názov",
"update_name_button": "Aktualizovať názov"
}
}
@@ -745,14 +718,7 @@
"triggered": "Spustené {name}"
},
"panel": {
"calendar": {
"my_calendars": "Moje kalendáre",
"today": "Dnes"
},
"config": {
"advanced_mode": {
"link_profile_page": "vaša profilová stránka"
},
"areas": {
"caption": "Register oblastí",
"data_table": {
@@ -763,13 +729,11 @@
"confirmation_text": "Všetky zariadenia v tejto oblasti ostanú nepriradené.",
"confirmation_title": "Naozaj chcete odstrániť túto oblasť?"
},
"description": "Spravujte všetky oblasti vo vašej domácnosti.",
"description": "Prehľad všetkých oblastí vo vašej domácnosti.",
"editor": {
"create": "VYTVORIŤ",
"default_name": "Nová oblasť",
"delete": "VYMAZAŤ",
"name": "Názov",
"name_required": "Názov je povinný",
"update": "AKTUALIZOVAŤ"
},
"picker": {
@@ -796,12 +760,6 @@
"name": "Akcia",
"type_select": "Typ akcie",
"type": {
"choose": {
"add_option": "Pridať možnosť",
"conditions": "Podmienky",
"remove_option": "Odstrániť možnosť",
"sequence": "Akcie"
},
"condition": {
"label": "Podmienka"
},
@@ -810,7 +768,6 @@
"label": "Oneskorenie"
},
"device_id": {
"action": "Akcia",
"extra_fields": {
"code": "Kód"
},
@@ -821,9 +778,6 @@
"label": "Odpáliť udalosť",
"service_data": "Dáta služby"
},
"repeat": {
"sequence": "Akcie"
},
"scene": {
"label": "Aktivovať scénu"
},
@@ -912,16 +866,6 @@
"introduction": "Použite automatizácie, aby váš domov ožil",
"load_error_not_editable": "Len automatizácie v automations.yaml je možné upravovať.",
"load_error_unknown": "Chyba pri načítaní automatizácie ({err_no}).",
"max": {
"queued": "Dĺžka fronty"
},
"modes": {
"documentation": "dokumentácia automatizácie",
"label": "Režim",
"parallel": "Paralelne",
"queued": "Fronta",
"restart": "Reštart"
},
"save": "Uložiť",
"triggers": {
"add": "Pridať spúšťač",
@@ -1191,9 +1135,7 @@
"edit_requires_storage": "Editor je zablokovaný, pretože konfigurácia je uložená v configuration.yaml",
"elevation": "Nadmorská výška",
"elevation_meters": "metrov",
"external_url": "Externá adresa URL",
"imperial_example": "Fahrenheita, libry",
"internal_url": "Interná adresa URL",
"latitude": "Zemepisná šírka",
"location_name": "Názov vašej Home Assistant inštalácie",
"longitude": "Zemepisná dĺžka",
@@ -1252,14 +1194,12 @@
},
"delete": "Odstrániť",
"description": "Spravovať pripojené zariadenia",
"device_info": "Informácie o zariadení",
"entities": {
"add_entities_lovelace": "Pridať do Lovelace",
"entities": "Entity",
"none": "Toto zariadenie nemá žiadne entity"
},
"name": "Názov",
"no_devices": "Žiadne zariadenia",
"scene": {
"create": "Vytvorte scénu pomocou zariadenia",
"no_scenes": "Žiadne scény",
@@ -1276,7 +1216,7 @@
},
"entities": {
"caption": "Register entít",
"description": "Spravujte všetky známe entity.",
"description": "Prehľad všetkých známych entít.",
"picker": {
"disable_selected": {
"button": "Zrušiť vybraté",
@@ -1304,7 +1244,6 @@
"introduction": "Home Assistant vedie register všetkých subjektov, ktoré kedy videl a ktoré môžu byť jednoznačne identifikované. Každá z týchto entít bude mať pridelené ID, ktoré bude vyhradené len pre tento subjekt.",
"introduction2": "Použite register entít na prepísanie mena, zmenu ID entity alebo odstránenie položky z Home Assistant. Poznámka: Odstránenie položky databázy entít neodstráni entitu. Postupujte podľa nižšie uvedeného odkazu a odstráňte ho z integračnej stránky.",
"remove_selected": {
"button": "Odstrániť vybraté",
"confirm_partly_title": "Iba {number} vybrané entity môžu byť odstránené.",
"confirm_text": "Entity je možné odstrániť, iba ak ich integrácia už neposkytuje.",
"confirm_title": "Chcete odstrániť {number} entity?"
@@ -1312,13 +1251,11 @@
"selected": "{number} vybrané",
"status": {
"ok": "Ok",
"readonly": "Len na čítanie",
"unavailable": "Nedostupné"
"readonly": "Len na čítanie"
}
}
},
"filtering": {
"clear": "Vyčistiť",
"filtering_by": "Filtrovanie podľa"
},
"header": "Konfigurovať Home Assistant",
@@ -1350,7 +1287,6 @@
"info": {
"built_using": "Postavené pomocou",
"custom_uis": "Vlastné používateľské rozhrania:",
"description": "Zobraziť informácie o inštalácii Home Assistant",
"developed_by": "Vyvinuté partiou úžasných ľudí.",
"frontend": "frontend-ui",
"frontend_version": "Verzia frontendu: {version} - {type}",
@@ -1363,9 +1299,6 @@
"system_health_error": "Súčasť System Health nie je načítaná. Pridajte 'system_health:' do súboru configuration.yaml",
"title": "Info"
},
"integration_panel_move": {
"link_integration_page": "stránka integrácie"
},
"integrations": {
"add_integration": "Pridať integráciu",
"caption": "Integrácie",
@@ -1375,7 +1308,6 @@
"delete_button": "Odstrániť {integration}",
"delete_confirm": "Naozaj chcete odstrániť túto integráciu?",
"device_unavailable": "zariadenie nie je k dispozícii",
"documentation": "Dokumentácia",
"entity_unavailable": "entita nie je k dispozícii",
"firmware": "Firmvér: {version}",
"hub": "Pripojené cez",
@@ -1391,8 +1323,6 @@
"system_options_button": "Systémové možnosti pre {integration}"
},
"config_flow": {
"aborted": "Prerušené",
"close": "Zavrieť",
"created_config": "Vytvorená konfigurácia pre {name}.",
"dismiss": "Zrušiť dialógové okno",
"error_saving_area": "Chyba pri ukladaní oblasti: {error}",
@@ -1401,9 +1331,7 @@
"open_site": "Otvoriť webovú stránku"
},
"finish": "Dokončiť",
"loading_first_time": "Počkajte, kým sa nainštaluje integrácia",
"not_all_required_fields": "Nie sú vyplnené všetky povinné polia.",
"submit": "Odoslať"
"loading_first_time": "Počkajte, kým sa nainštaluje integrácia"
},
"configure": "Konfigurovať",
"configured": "Nakonfigurovaný",
@@ -1485,7 +1413,7 @@
"open": "Otvoriť"
}
},
"description": "Spravujte svoje Lovelace Dashboardy",
"description": "Nakonfigurujte si svoje Lovelace dashboardy",
"resources": {
"cant_edit_yaml": "Používate Lovelace v režime YAML, preto nemôžete spravovať svoje prostriedky cez používateľské rozhranie. Spravujte ich v configuration.yaml.",
"caption": "Prostriedky",
@@ -1521,7 +1449,6 @@
}
},
"mqtt": {
"button": "Konfigurovať",
"description_listen": "Počúvať tému",
"description_publish": "Publikovať paket",
"listening_to": "Počúvam",
@@ -1563,7 +1490,7 @@
"scene": {
"activated": "Aktivovaná scéna {name}.",
"caption": "Scény",
"description": "Správa scén",
"description": "Vytvárajte a upravujte scény",
"editor": {
"default_name": "Nová scéna",
"devices": {
@@ -1580,7 +1507,6 @@
"introduction": "Entity, ktoré nepatria zariadeniu, môžete nastaviť tu.",
"without_device": "Entity bez zariadenia"
},
"icon": "Ikona",
"introduction": "Využite scény na oživenie vášho domova.",
"load_error_not_editable": "Upraviť je možné iba scény zo scenes.yaml.",
"load_error_unknown": "Chyba pri načítaní scény ({err_no}).",
@@ -1594,9 +1520,6 @@
"delete_scene": "Odstrániť scénu",
"edit_scene": "Upraviť scénu",
"header": "Editor scén",
"headers": {
"name": "Názov"
},
"introduction": "Editor scén vám umožňuje vytvárať a upravovať scény. Postupujte podľa odkazu nižšie a prečítajte si pokyny, aby ste sa uistili, že ste Home Assistant nakonfigurovali správne.",
"learn_more": "Získajte viac informácií o scénach",
"no_scenes": "Nemohli sme nájsť žiadne editovateľné scény",
@@ -1614,31 +1537,15 @@
"delete_confirm": "Naozaj chcete odstrániť tento skript?",
"delete_script": "Odstrániť skript",
"header": "Skript: {name}",
"icon": "Ikona",
"id": "Entity ID",
"id_already_exists": "Toto ID už existuje",
"introduction": "Na vykonanie sledu akcií použite skripty.",
"link_available_actions": "Získajte viac informácií o dostupných akciách.",
"load_error_not_editable": "Iba skripty zo súboru scripts.yaml sú editovateľné.",
"max": {
"queued": "Dĺžka fronty"
},
"modes": {
"documentation": "dokumentácia skriptu",
"label": "Režim",
"parallel": "Paralelne",
"queued": "Fronta",
"restart": "Reštart"
},
"sequence": "Sekvencia",
"sequence_sentence": "Sled akcií tohto skriptu"
},
"picker": {
"add_script": "Pridať skript",
"header": "Editor skriptov",
"headers": {
"name": "Názov"
},
"introduction": "Editor skriptov vám umožňuje vytvárať a upravovať skripty. Postupujte podľa odkazu nižšie a prečítajte si pokyny, aby ste sa uistili, že ste Home Assistant nakonfigurovali správne.",
"learn_more": "Viac informácií o skriptoch",
"no_scripts": "Nenašli sa žiadne editovateľné skripty",
@@ -1669,7 +1576,7 @@
"stop": "Zastaviť"
},
"validation": {
"check_config": "Skontrolovať konfiguráciu",
"check_config": "Skontrolujte konfiguráciu",
"heading": "Kontrola konfigurácie",
"introduction": "Overte svoju konfiguráciu, ak ste nedávno vykonali nejaké zmeny v konfigurácii a chcete sa uistiť, že je to všetko v poriadku",
"invalid": "Konfigurácia je neplatná",
@@ -1698,27 +1605,17 @@
"delete_user": "Vymazať používateľa",
"group": "Skupina",
"id": "ID",
"name": "Názov",
"owner": "Vlastník",
"system_generated": "Systémom vytvorený",
"system_generated_users_not_editable": "Nie je možné aktualizovať používateľov generovaných systémom.",
"system_generated_users_not_removable": "Nie je možné odstrániť používateľov generovaných systémom.",
"unnamed_user": "Nepomenovaný používateľ",
"update_user": "Aktualizovať"
},
"picker": {
"headers": {
"group": "Skupina",
"name": "Názov",
"system": "Systém"
}
"unnamed_user": "Nepomenovaný používateľ"
}
},
"zha": {
"add_device_page": {
"discovery_text": "Tu sa zobrazia objavené zariadenia. Postupujte podľa pokynov pre zariadenie (zariadenia) a umiestnite zariadenie (zariadenia) do režimu párovania.",
"header": "Zigbee Home Automation - Pridať zariadenia",
"no_devices_found": "Neboli nájdené žiadne zariadenia, uistite sa, že sú v režime párovania a udržujte ich pri prebudené počas zisťovania.",
"search_again": "Hľadať znova",
"spinner": "Vyhľadávanie ZHA Zigbee zariadení ..."
},
@@ -1726,7 +1623,6 @@
"caption": "Pridať zariadenia",
"description": "Pridať zariadenia do siete ZigBee"
},
"button": "Konfigurovať",
"caption": "ZHA",
"cluster_attributes": {
"attributes_of_cluster": "Atribúty vybraného klastra",
@@ -1773,7 +1669,7 @@
"create_group": "Zigbee Home Automation - Vytvoriť skupinu",
"create_group_details": "Zadajte požadované údaje na vytvorenie novej skupiny ZigBee",
"creating_group": "Vytvorenie skupiny",
"description": "Správa skupín Zigbee",
"description": "Vytvorenie a úprava skupín ZigBee",
"group_details": "Tu sú všetky podrobnosti o vybranej skupine Zigbee.",
"group_id": "ID skupiny",
"group_info": "Informácie o skupine",
@@ -1797,9 +1693,6 @@
"header": "Správa siete",
"introduction": "Príkazy, ktoré ovplyvňujú celú sieť"
},
"network": {
"caption": "Sieť"
},
"node_management": {
"header": "Správa Zariadenia",
"help_node_dropdown": "Vyberte zariadenie na zobrazenie možností zariadenia.",
@@ -1839,7 +1732,6 @@
"no_zones_created_yet": "Zdá sa, že ste ešte nevytvorili žiadne zóny."
},
"zwave": {
"button": "Konfigurovať",
"caption": "Z-Wave",
"common": {
"index": "Index",
@@ -1880,7 +1772,6 @@
"add_node_secure": "Bezpečne pridať zariadenie",
"cancel_command": "Zrušiť príkaz",
"heal_network": "Vyliečiť sieť",
"refresh_entity": "Obnoviť entitu",
"remove_node": "Odstrániť zariadenie",
"save_config": "Uložiť konfiguráciu",
"soft_reset": "Softvérový reset",
@@ -1952,23 +1843,11 @@
},
"history": {
"period": "Obdobie",
"ranges": {
"last_week": "Minulý týždeň",
"this_week": "Tento týždeň",
"today": "Dnes",
"yesterday": "Včera"
},
"showing_entries": "Zobrazujú sa záznamy pre"
},
"logbook": {
"entries_not_found": "Nenašli sa žiadne záznamy v denníku.",
"period": "Obdobie",
"ranges": {
"last_week": "Minulý týždeň",
"this_week": "Tento týždeň",
"today": "Dnes",
"yesterday": "Včera"
},
"showing_entries": "Zobrazujú sa záznamy za obdobie"
},
"lovelace": {
@@ -2004,10 +1883,6 @@
"add_item": "Pridať položku",
"checked_items": "Označené položky",
"clear_items": "Vymazať označené položky"
},
"starting": {
"description": "Home Assistant sa spúšťa, čakajte prosím...",
"header": "Home Assistant sa spúšťa..."
}
},
"changed_toast": {
@@ -2064,12 +1939,9 @@
"image": "Cesta k obrázku",
"manual": "Ručne",
"manual_description": "Potrebujete pridať vlastnú kartu, alebo chcete len ručne napísať yaml?",
"maximum": "Maximum",
"minimum": "Minimum",
"name": "Názov",
"no_theme": "Žiadna téma",
"refresh_interval": "Interval obnovenia",
"search": "Hľadať",
"show_icon": "Zobraziť ikonu?",
"show_name": "Zobraziť názov?",
"show_state": "Zobraziť stav?",
@@ -2090,9 +1962,6 @@
"horizontal-stack": {
"name": "Horizontálne zarovnanie"
},
"humidifier": {
"name": "Zvlhčovač"
},
"iframe": {
"name": "iFrame"
},
@@ -2158,8 +2027,7 @@
},
"weather-forecast": {
"description": "Karta Predpoveď počasia zobrazuje počasie. Je veľmi užitočné ju zahrnúť do rozhrania, ktoré ľudia zobrazujú na stene.",
"name": "Predpoveď počasia",
"show_forecast": "Zobraziť predpoveď"
"name": "Predpoveď počasia"
}
},
"cardpicker": {
@@ -2183,8 +2051,7 @@
"edit_lovelace": {
"edit_title": "Upraviť názov",
"explanation": "Tento názov sa zobrazuje nad všetkými vašimi zobrazeniami v Lovelace.",
"header": "Názov vášho Lovelace UI",
"title": "Názov"
"header": "Názov vášho Lovelace UI"
},
"edit_view": {
"add": "Pridať zobrazenie",
@@ -2192,8 +2059,6 @@
"edit": "Upraviť zobrazenie",
"header": "Konfigurácia zobrazenia",
"header_name": "{name} Zobraziť konfiguráciu",
"move_left": "Presunúť zobrazenie doľava",
"move_right": "Presunúť zobrazenie doprava",
"tab_badges": "Odznaky",
"tab_settings": "Nastavenia",
"tab_visibility": "Viditeľnosť",
@@ -2212,9 +2077,6 @@
"para_migrate": "Home Assistant môže automaticky pridať identifikátory pre všetky vaše karty a zobrazenia, keď kliknete na tlačidlo 'Migrovať konfiguráciu'.",
"para_no_id": "Tento prvok nemá žiadne ID. Doplňte, prosím, ID pre tento prvok v súbore 'ui-lovelace.yaml'."
},
"move_card": {
"header": "Vyberte zobrazenie, do ktorého chcete kartu presunúť"
},
"raw_editor": {
"confirm_remove_config_text": "Ak odstránite svoju konfiguráciu používateľského rozhrania Lovelace, automaticky vygenerujeme vaše zobrazenia používateľského rozhrania Lovelace s vašimi oblasťami a zariadeniami.",
"confirm_remove_config_title": "Naozaj chcete odstrániť konfiguráciu používateľského rozhrania Lovelace? Vaše zobrazenia používateľské rozhranie Lovelace automaticky vygenerujeme s vašimi oblasťami a zariadeniami.",
@@ -2238,11 +2100,7 @@
"save": "Prevziať kontrolu",
"yaml_config": "Na začiatok vám pomôžeme so súčasnou konfiguráciou tohto dashboardu:",
"yaml_control": "Ak chcete prevziať kontrolu v režime YAML, vytvorte súbor YAML s názvom, ktorý ste uviedli vo svojej konfigurácii pre tento dashboard alebo predvolený súbor 'ui-lovelace.yaml'.",
"yaml_mode": "Používate režim YAML, čo znamená, že nemôžete zmeniť konfiguráciu Lovelace z UI. Ak chcete zmeniť Lovelace z UI, odstráňte 'mode: yaml' z vašej konfigurácie Lovelace v 'configuration.yaml.'"
},
"select_view": {
"dashboard_label": "Dashboard",
"header": "Vyberte zobrazenie"
"yaml_mode": "Používate režim YAML, čo znamená, že nemôžete zmeniť konfiguráciu Lovelace z používateľského rozhrania. Ak chcete zmeniť Lovelace z UI, odstráňte 'mode: yaml' z vašej konfigurácie Lovelace v 'configuration.yaml.'"
},
"suggest_card": {
"add": "Pridať do používateľského rozhrania Lovelace",
@@ -2258,8 +2116,7 @@
}
},
"menu": {
"close": "Zavrieť",
"configure_ui": "Upraviť Dashboard",
"configure_ui": "Konfigurovať používateľské rozhranie",
"exit_edit_mode": "Skončiť režim úprav používateľského rozhrania",
"help": "Pomoc",
"refresh": "Obnoviť",
@@ -2289,8 +2146,7 @@
"attribute_not_found": "Atribút {attribute} nie je k dispozícii v: {entity}",
"entity_non_numeric": "Entita je nečíselná: {entity}",
"entity_not_found": "Entita nie je k dispozícií {entity}",
"entity_unavailable": "Entita momentálne nie je k dispozícií {entity}",
"starting": "Home Assistant sa spúšťa, zatiaľ nemusí byť všetko k dispozícii"
"entity_unavailable": "Entita momentálne nie je k dispozícií {entity}"
}
},
"mailbox": {
@@ -2303,7 +2159,6 @@
"abort_intro": "Prihlásenie bolo zrušené",
"authorizing_client": "Chystáte sa poskytnúť {clientId} prístup k vašej inštancii Home Assistantu.",
"form": {
"next": "Ďalej",
"providers": {
"command_line": {
"abort": {
@@ -2486,11 +2341,6 @@
"submit": "Odoslať"
},
"current_user": "Momentálne ste prihlásení ako {fullName}.",
"dashboard": {
"description": "Vyberte predvolený dashboard pre toto zariadenie.",
"dropdown_label": "Dashboard",
"header": "Dashboard"
},
"force_narrow": {
"description": "Predvolene sa skryje bočný panel, podobne ako v prípade mobilných zariadení.",
"header": "Vždy skryť bočný panel"
@@ -2552,18 +2402,10 @@
"token_title": "Obnovovací token pre {clientId}"
},
"themes": {
"accent_color": "Farba zvýraznenia",
"dark_mode": {
"auto": "Automaticky",
"dark": "Tmavá",
"light": "Svetlá"
},
"dropdown_label": "Téma",
"error_no_theme": "Nie sú k dispozícii žiadne témy.",
"header": "Téma",
"link_promo": "Získajte viac informácií o témach",
"primary_color": "Primárna farba",
"reset": "Reset"
"link_promo": "Získajte viac informácií o témach"
},
"vibrate": {
"description": "Pri ovládaní zariadení povoľte alebo zakážte vibrácie tohto zariadenia.",

View File

@@ -785,7 +785,7 @@
"link_profile_page": "profil sayfanız"
},
"areas": {
"caption": "Alanlar",
"caption": "Alanları",
"data_table": {
"area": "Alan",
"devices": "Cihazlar"
@@ -1192,9 +1192,7 @@
"email": "E-posta",
"email_error_msg": "Geçersiz e-posta",
"forgot_password": "Parolanızı mı unuttunuz?",
"introduction": "Home Assistant Cloud, evden uzaktayken örneğinize güvenli bir uzaktan bağlantı sağlar. Ayrıca diğer bulut hizmetlerine bağlanmanıza olanak tanır: Amazon Alexa ve Google Assistant.",
"introduction2": "Bu hizmet ortağımız ",
"introduction2a": "tarafından verilmektedir, Home Assistant ve Hass.io kurucuları tarafından kurulan bir şirket.",
"introduction2": "Bu hizmet ortağımız tarafından yürütülüyor",
"introduction3": "Home Assistant Cloud, bir aylık ücretsiz deneme sürümüne sahip bir abonelik hizmetidir. Ödeme bilgisi gerekmez.",
"learn_more_link": "Home Assistant Cloud hakkında daha fazla bilgi edin",
"password": "Parola",
@@ -1216,8 +1214,8 @@
"headline": "Ücretsiz denemenizi başlatın",
"information": "Home Assistant Cloud ile bir aylık ücretsiz denemenizi başlatmak için bir hesap oluşturun. Ödeme bilgisi gerekmez.",
"information2": "Deneme, aşağıdakiler de dahil olmak üzere Home Assistant Cloud'un tüm avantajlarına erişmenizi sağlayacaktır:",
"information3": "Bu hizmet ortağımız ",
"information3a": "tarafından verilmektedir, Home Assistant ve Hass.io kurucuları tarafından kurulan bir şirket.",
"information3": "Bu hizmet ortağımız tarafından yürütülüyor",
"information3a": ", Home Assistant ve Hass.io'nun kurucuları tarafından kurulmuş bir şirkettir.",
"information4": "Bir hesap kaydederek aşağıdaki şartlar ve koşulları kabul etmiş olursunuz.",
"link_privacy_policy": "Gizlilik Politikası",
"link_terms_conditions": "Şartlar ve koşullar",
@@ -1626,10 +1624,9 @@
"name": "Ad",
"name_error_msg": "Isim gereklidir",
"new_person": "Yeni kişi",
"no_device_tracker_available_intro": "Bir kişinin varlığını gösteren aygıtlarınız olduğunda, bunları buradaki bir kişiye atayabilirsiniz. Entegrasyonlar sayfasından bir varlık algılama entegrasyonu ekleyerek ilk cihazınızı ekleyebilirsiniz.",
"update": "Güncelle"
"update": "Güncelleme"
},
"introduction": "Burada Home Assistant ile ilgili her kişiyi tanımlayabilirsiniz.",
"introduction": "Burada Home Assistant ilgi her kişi tanımlayabilirsiniz.",
"no_persons_created_yet": "Henüz herhangi bir kişi oluşturmadığın gibi görünüyor.",
"note_about_persons_configured_in_yaml": "Not: configuration.yaml aracılığıyla yapılandırılan kişiler UI aracılığıyla düzenlenemez."
},
@@ -1999,7 +1996,7 @@
"available_events": "Mevcut Etkinlikler",
"count_listeners": " ({count} dinleyiciler)",
"data": "Olay Verileri (YAML, isteğe bağlı)",
"description": "Olay veri yolunda bir olay tetikleyin.",
"description": "Etkinlik otobüsünde bir etkinlik başlat.",
"documentation": "Olaylar Dökümantasyonu.",
"fire_event": "Olayı Çalıştır",
"listen_to_events": "Olayları dinleyin",
@@ -2017,7 +2014,6 @@
"column_example": "Örnek",
"column_parameter": "Parametre",
"data": "Servis Verileri (YAML, isteğe bağlı)",
"description": "Servisler geliştirici araçı, Home Assistant'taki mevcut tüm hizmetleri aramanızı sağlar.",
"fill_example_data": "Örnek Verileri Doldur",
"no_description": "Açıklama mevcut değil",
"no_parameters": "Bu servis parametre almaz.",
@@ -2141,7 +2137,6 @@
"entities": {
"description": "Varlıklar kartı en yaygın kart türüdür. Öğeleri listeler halinde gruplandırır.",
"name": "Varlıklar",
"show_header_toggle": "Başlık Değiştirme Gösterilsin mi?",
"toggle": "Varlıklarageçiş."
},
"entity-filter": {

View File

@@ -2475,7 +2475,7 @@
},
"menu": {
"close": "关闭",
"configure_ui": "编辑仪表盘",
"configure_ui": "配置 UI",
"exit_edit_mode": "退出 UI 编辑模式",
"help": "帮助",
"refresh": "刷新",

View File

@@ -2475,7 +2475,7 @@
},
"menu": {
"close": "關閉",
"configure_ui": "編輯主面板",
"configure_ui": "介面設定",
"exit_edit_mode": "退出 UI 編輯模式",
"help": "說明",
"refresh": "更新",