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;
+}