diff --git a/src/panels/lovelace/common/create-row-element.js b/src/panels/lovelace/common/create-row-element.js index 2d775def52..00d9d36d17 100644 --- a/src/panels/lovelace/common/create-row-element.js +++ b/src/panels/lovelace/common/create-row-element.js @@ -13,7 +13,6 @@ import "../entity-rows/hui-script-entity-row"; import "../entity-rows/hui-text-entity-row"; import "../entity-rows/hui-timer-entity-row"; import "../entity-rows/hui-toggle-entity-row"; - import "../special-rows/hui-call-service-row"; import "../special-rows/hui-divider-row"; import "../special-rows/hui-section-row"; diff --git a/src/panels/lovelace/entity-rows/hui-cover-entity-row.js b/src/panels/lovelace/entity-rows/hui-cover-entity-row.js deleted file mode 100644 index 4cdc254166..0000000000 --- a/src/panels/lovelace/entity-rows/hui-cover-entity-row.js +++ /dev/null @@ -1,74 +0,0 @@ -import { html } from "@polymer/polymer/lib/utils/html-tag"; -import { PolymerElement } from "@polymer/polymer/polymer-element"; - -import "../components/hui-generic-entity-row"; -import "../../../components/ha-cover-controls"; -import "../../../components/ha-cover-tilt-controls"; -import CoverEntity from "../../../util/cover-model"; - -class HuiCoverEntityRow extends PolymerElement { - static get template() { - return html` - ${this.styleTemplate} - - ${this.coverControlTemplate} - - `; - } - - static get styleTemplate() { - return html` - - `; - } - - static get coverControlTemplate() { - return html` - - - `; - } - - static get properties() { - return { - hass: Object, - _config: Object, - _stateObj: { - type: Object, - computed: "_computeStateObj(hass.states, _config.entity)", - }, - _entityObj: { - type: Object, - computed: "_computeEntityObj(hass, _stateObj)", - }, - }; - } - - _computeStateObj(states, entityId) { - return states && entityId in states ? states[entityId] : null; - } - - _computeEntityObj(hass, stateObj) { - return stateObj ? new CoverEntity(hass, stateObj) : null; - } - - setConfig(config) { - if (!config || !config.entity) { - throw new Error("Entity not configured."); - } - this._config = config; - } -} -customElements.define("hui-cover-entity-row", HuiCoverEntityRow); diff --git a/src/panels/lovelace/entity-rows/hui-cover-entity-row.ts b/src/panels/lovelace/entity-rows/hui-cover-entity-row.ts new file mode 100644 index 0000000000..0def319cc1 --- /dev/null +++ b/src/panels/lovelace/entity-rows/hui-cover-entity-row.ts @@ -0,0 +1,85 @@ +import { html, LitElement, PropertyDeclarations } from "@polymer/lit-element"; +import { TemplateResult } from "lit-html"; + +import "../components/hui-generic-entity-row.js"; +import "../../../components/ha-cover-controls.js"; +import "../../../components/ha-cover-tilt-controls.js"; + +import { isTiltOnly } from "../../../util/cover-model.js"; +import { HomeAssistant } from "../../../types.js"; +import { EntityRow, EntityConfig } from "./types.js"; + +class HuiCoverEntityRow extends LitElement implements EntityRow { + public hass?: HomeAssistant; + private _config?: EntityConfig; + + static get properties(): PropertyDeclarations { + return { + hass: {}, + _config: {}, + }; + } + + public setConfig(config: EntityConfig): void { + if (!config) { + throw new Error("Configuration error"); + } + this._config = config; + } + + protected render(): TemplateResult { + if (!this._config || !this.hass) { + return html``; + } + + const stateObj = this.hass.states[this._config.entity]; + + if (!stateObj) { + return html` + `; + } + + return html` + ${this.renderStyle()} + + ${ + isTiltOnly(stateObj) + ? html` + ` + : html` + ` + } + + `; + } + + private renderStyle(): TemplateResult { + return html` + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "hui-cover-entity-row": HuiCoverEntityRow; + } +} + +customElements.define("hui-cover-entity-row", HuiCoverEntityRow); diff --git a/src/util/cover-model.js b/src/util/cover-model.js index 09666718a7..45de4ad911 100644 --- a/src/util/cover-model.js +++ b/src/util/cover-model.js @@ -72,9 +72,9 @@ export default class CoverEntity { } get isTiltOnly() { - var supportsCover = + const supportsCover = this.supportsOpen || this.supportsClose || this.supportsStop; - var supportsTilt = + const supportsTilt = this.supportsOpenTilt || this.supportsCloseTilt || this.supportsStopTilt; return supportsTilt && !supportsCover; } @@ -120,3 +120,32 @@ export default class CoverEntity { this.hass.callService("cover", service, data); } } + +const support = (stateObj, feature) => + (stateObj.attributes.supported_features & feature) !== 0; + +export const supportsOpen = (stateObj) => support(stateObj, 1); + +export const supportsClose = (stateObj) => support(stateObj, 2); + +export const supportsSetPosition = (stateObj) => support(stateObj, 4); + +export const supportsStop = (stateObj) => support(stateObj, 8); + +export const supportsOpenTilt = (stateObj) => support(stateObj, 16); + +export const supportsCloseTilt = (stateObj) => support(stateObj, 32); + +export const supportsStopTilt = (stateObj) => support(stateObj, 64); + +export const supportsSetTiltPosition = (stateObj) => support(stateObj, 128); + +export function isTiltOnly(stateObj) { + const supportsCover = + supportsOpen(stateObj) || supportsClose(stateObj) || supportsStop(stateObj); + const supportsTilt = + supportsOpenTilt(stateObj) || + supportsCloseTilt(stateObj) || + supportsStopTilt(stateObj); + return supportsTilt && !supportsCover; +}