Extract Supported features into own funciton (#2151)

* External function to check if entity supports a feature

* Typo

* Update hass-media-player-model.js
This commit is contained in:
Ian Richardson 2018-11-30 09:37:44 -06:00 committed by Paulus Schoutsen
parent 22eb6c6a8d
commit 882c503fa9
9 changed files with 81 additions and 84 deletions

View File

@ -2,6 +2,7 @@ import { HassEntity } from "home-assistant-js-websocket";
import canToggleDomain from "./can_toggle_domain"; import canToggleDomain from "./can_toggle_domain";
import computeStateDomain from "./compute_state_domain"; import computeStateDomain from "./compute_state_domain";
import { HomeAssistant } from "../../types"; import { HomeAssistant } from "../../types";
import { supportsFeature } from "./supports-feature";
export default function canToggleState( export default function canToggleState(
hass: HomeAssistant, hass: HomeAssistant,
@ -12,8 +13,7 @@ export default function canToggleState(
return stateObj.state === "on" || stateObj.state === "off"; return stateObj.state === "on" || stateObj.state === "off";
} }
if (domain === "climate") { if (domain === "climate") {
// tslint:disable-next-line return supportsFeature(stateObj, 4096);
return (stateObj.attributes.supported_features! & 4096) !== 0;
} }
return canToggleDomain(hass, domain); return canToggleDomain(hass, domain);

View File

@ -1,4 +1,5 @@
import { HassEntity } from "home-assistant-js-websocket"; import { HassEntity } from "home-assistant-js-websocket";
import { supportsFeature } from "./supports-feature";
// Expects classNames to be an object mapping feature-bit -> className // Expects classNames to be an object mapping feature-bit -> className
export default function featureClassNames( export default function featureClassNames(
@ -9,12 +10,9 @@ export default function featureClassNames(
return ""; return "";
} }
const features = stateObj.attributes.supported_features;
return Object.keys(classNames) return Object.keys(classNames)
.map((feature) => .map((feature) =>
// tslint:disable-next-line supportsFeature(stateObj, Number(feature)) ? classNames[feature] : ""
(features & Number(feature)) !== 0 ? classNames[feature] : ""
) )
.filter((attr) => attr !== "") .filter((attr) => attr !== "")
.join(" "); .join(" ");

View File

@ -0,0 +1,9 @@
import { HassEntity } from "home-assistant-js-websocket";
export const supportsFeature = (
stateObj: HassEntity,
feature: number
): boolean => {
// tslint:disable-next-line:no-bitwise
return (stateObj.attributes.supported_features! & feature) !== 0;
};

View File

@ -13,6 +13,7 @@ import "../../../components/ha-paper-slider";
import attributeClassNames from "../../../common/entity/attribute_class_names"; import attributeClassNames from "../../../common/entity/attribute_class_names";
import featureClassNames from "../../../common/entity/feature_class_names"; import featureClassNames from "../../../common/entity/feature_class_names";
import { supportsFeature } from "../../../common/entity/supports-feature";
import EventsMixin from "../../../mixins/events-mixin"; import EventsMixin from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin";
@ -385,45 +386,45 @@ class MoreInfoClimate extends LocalizeMixin(EventsMixin(PolymerElement)) {
supportsTemperature(stateObj) { supportsTemperature(stateObj) {
return ( return (
(stateObj.attributes.supported_features & 1) !== 0 && supportsFeature(stateObj, 1) &&
typeof stateObj.attributes.temperature === "number" typeof stateObj.attributes.temperature === "number"
); );
} }
supportsTemperatureRange(stateObj) { supportsTemperatureRange(stateObj) {
return ( return (
(stateObj.attributes.supported_features & 6) !== 0 && supportsFeature(stateObj, 6) &&
(typeof stateObj.attributes.target_temp_low === "number" || (typeof stateObj.attributes.target_temp_low === "number" ||
typeof stateObj.attributes.target_temp_high === "number") typeof stateObj.attributes.target_temp_high === "number")
); );
} }
supportsHumidity(stateObj) { supportsHumidity(stateObj) {
return (stateObj.attributes.supported_features & 8) !== 0; return supportsFeature(stateObj, 8);
} }
supportsFanMode(stateObj) { supportsFanMode(stateObj) {
return (stateObj.attributes.supported_features & 64) !== 0; return supportsFeature(stateObj, 64);
} }
supportsOperationMode(stateObj) { supportsOperationMode(stateObj) {
return (stateObj.attributes.supported_features & 128) !== 0; return supportsFeature(stateObj, 128);
} }
supportsSwingMode(stateObj) { supportsSwingMode(stateObj) {
return (stateObj.attributes.supported_features & 512) !== 0; return supportsFeature(stateObj, 512);
} }
supportsAwayMode(stateObj) { supportsAwayMode(stateObj) {
return (stateObj.attributes.supported_features & 1024) !== 0; return supportsFeature(stateObj, 1024);
} }
supportsAuxHeat(stateObj) { supportsAuxHeat(stateObj) {
return (stateObj.attributes.supported_features & 2048) !== 0; return supportsFeature(stateObj, 2048);
} }
supportsOn(stateObj) { supportsOn(stateObj) {
return (stateObj.attributes.supported_features & 4096) !== 0; return supportsFeature(stateObj, 4096);
} }
computeClassNames(stateObj) { computeClassNames(stateObj) {

View File

@ -8,6 +8,7 @@ import { html } from "@polymer/polymer/lib/utils/html-tag";
import { PolymerElement } from "@polymer/polymer/polymer-element"; import { PolymerElement } from "@polymer/polymer/polymer-element";
import "../../../components/ha-attributes"; import "../../../components/ha-attributes";
import { supportsFeature } from "../../../common/entity/supports-feature";
class MoreInfoVacuum extends PolymerElement { class MoreInfoVacuum extends PolymerElement {
static get template() { static get template() {
@ -158,57 +159,53 @@ class MoreInfoVacuum extends PolymerElement {
}; };
} }
/* eslint-disable no-bitwise */
supportsPause(stateObj) { supportsPause(stateObj) {
return (stateObj.attributes.supported_features & 4) !== 0; return supportsFeature(stateObj, 4);
} }
supportsStop(stateObj) { supportsStop(stateObj) {
return (stateObj.attributes.supported_features & 8) !== 0; return supportsFeature(stateObj, 8);
} }
supportsReturnHome(stateObj) { supportsReturnHome(stateObj) {
return (stateObj.attributes.supported_features & 16) !== 0; return supportsFeature(stateObj, 16);
} }
supportsFanSpeed(stateObj) { supportsFanSpeed(stateObj) {
return (stateObj.attributes.supported_features & 32) !== 0; return supportsFeature(stateObj, 32);
} }
supportsBattery(stateObj) { supportsBattery(stateObj) {
return (stateObj.attributes.supported_features & 64) !== 0; return supportsFeature(stateObj, 64);
} }
supportsStatus(stateObj) { supportsStatus(stateObj) {
return (stateObj.attributes.supported_features & 128) !== 0; return supportsFeature(stateObj, 128);
} }
supportsLocate(stateObj) { supportsLocate(stateObj) {
return (stateObj.attributes.supported_features & 512) !== 0; return supportsFeature(stateObj, 512);
} }
supportsCleanSpot(stateObj) { supportsCleanSpot(stateObj) {
return (stateObj.attributes.supported_features & 1024) !== 0; return supportsFeature(stateObj, 1024);
} }
supportsStart(stateObj) { supportsStart(stateObj) {
return (stateObj.attributes.supported_features & 8192) !== 0; return supportsFeature(stateObj, 8192);
} }
supportsCommandBar(stateObj) { supportsCommandBar(stateObj) {
return ( return (
((stateObj.attributes.supported_features & 4) !== 0) | supportsFeature(stateObj, 4) |
((stateObj.attributes.supported_features & 8) !== 0) | supportsFeature(stateObj, 8) |
((stateObj.attributes.supported_features & 16) !== 0) | supportsFeature(stateObj, 16) |
((stateObj.attributes.supported_features & 512) !== 0) | supportsFeature(stateObj, 512) |
((stateObj.attributes.supported_features & 1024) !== 0) | supportsFeature(stateObj, 1024) |
((stateObj.attributes.supported_features & 8192) !== 0) supportsFeature(stateObj, 8192)
); );
} }
/* eslint-enable no-bitwise */
fanSpeedChanged(fanSpeedIndex) { fanSpeedChanged(fanSpeedIndex) {
var fanSpeedInput; var fanSpeedInput;
// Selected Option will transition to '' before transitioning to new value // Selected Option will transition to '' before transitioning to new value

View File

@ -12,6 +12,7 @@ import "../../../components/ha-water_heater-control";
import "../../../components/ha-paper-slider"; import "../../../components/ha-paper-slider";
import featureClassNames from "../../../common/entity/feature_class_names"; import featureClassNames from "../../../common/entity/feature_class_names";
import { supportsFeature } from "../../../common/entity/supports-feature";
import EventsMixin from "../../../mixins/events-mixin"; import EventsMixin from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin"; import LocalizeMixin from "../../../mixins/localize-mixin";
@ -198,17 +199,17 @@ class MoreInfoWaterHeater extends LocalizeMixin(EventsMixin(PolymerElement)) {
supportsTemperature(stateObj) { supportsTemperature(stateObj) {
return ( return (
(stateObj.attributes.supported_features & 1) !== 0 && supportsFeature(stateObj, 1) &&
typeof stateObj.attributes.temperature === "number" typeof stateObj.attributes.temperature === "number"
); );
} }
supportsOperationMode(stateObj) { supportsOperationMode(stateObj) {
return (stateObj.attributes.supported_features & 2) !== 0; return supportsFeature(stateObj, 2);
} }
supportsAwayMode(stateObj) { supportsAwayMode(stateObj) {
return (stateObj.attributes.supported_features & 4) !== 0; return supportsFeature(stateObj, 4);
} }
computeClassNames(stateObj) { computeClassNames(stateObj) {

View File

@ -8,6 +8,7 @@ import { hassLocalizeLitMixin } from "../../../mixins/lit-localize-mixin";
import { EntityRow, EntityConfig } from "./types"; import { EntityRow, EntityConfig } from "./types";
import { HomeAssistant } from "../../../types"; import { HomeAssistant } from "../../../types";
import { HassEntity } from "home-assistant-js-websocket"; import { HassEntity } from "home-assistant-js-websocket";
import { supportsFeature } from "../../../common/entity/supports-feature";
import { import {
SUPPORTS_PLAY, SUPPORTS_PLAY,
SUPPORT_NEXT_TRACK, SUPPORT_NEXT_TRACK,
@ -50,13 +51,6 @@ class HuiMediaPlayerEntityRow extends hassLocalizeLitMixin(LitElement)
`; `;
} }
const supportsPlay =
// tslint:disable-next-line:no-bitwise
stateObj.attributes.supported_features! & SUPPORTS_PLAY;
const supportsNext =
// tslint:disable-next-line:no-bitwise
stateObj.attributes.supported_features! & SUPPORT_NEXT_TRACK;
return html` return html`
${this.renderStyle()} ${this.renderStyle()}
<hui-generic-entity-row <hui-generic-entity-row
@ -78,7 +72,8 @@ class HuiMediaPlayerEntityRow extends hassLocalizeLitMixin(LitElement)
: html` : html`
<div class="controls"> <div class="controls">
${ ${
stateObj.state !== "playing" && !supportsPlay stateObj.state !== "playing" &&
!supportsFeature(stateObj, SUPPORTS_PLAY)
? "" ? ""
: html` : html`
<paper-icon-button <paper-icon-button
@ -88,7 +83,7 @@ class HuiMediaPlayerEntityRow extends hassLocalizeLitMixin(LitElement)
` `
} }
${ ${
supportsNext supportsFeature(stateObj, SUPPORT_NEXT_TRACK)
? html` ? html`
<paper-icon-button <paper-icon-button
icon="hass:skip-next" icon="hass:skip-next"
@ -121,7 +116,7 @@ class HuiMediaPlayerEntityRow extends hassLocalizeLitMixin(LitElement)
} }
// tslint:disable-next-line:no-bitwise // tslint:disable-next-line:no-bitwise
return stateObj.attributes.supported_features! & SUPPORT_PAUSE return supportsFeature(stateObj, SUPPORT_PAUSE)
? "hass:pause" ? "hass:pause"
: "hass:stop"; : "hass:stop";
} }

View File

@ -1,3 +1,5 @@
import { supportsFeature } from "../common/entity/supports-feature";
/* eslint-enable no-bitwise */ /* eslint-enable no-bitwise */
export default class CoverEntity { export default class CoverEntity {
constructor(hass, stateObj) { constructor(hass, stateObj) {
@ -37,38 +39,36 @@ export default class CoverEntity {
return this.stateObj.state === "closing"; return this.stateObj.state === "closing";
} }
/* eslint-disable no-bitwise */
get supportsOpen() { get supportsOpen() {
return (this._feat & 1) !== 0; return supportsFeature(this.stateObj, 1);
} }
get supportsClose() { get supportsClose() {
return (this._feat & 2) !== 0; return supportsFeature(this.stateObj, 2);
} }
get supportsSetPosition() { get supportsSetPosition() {
return (this._feat & 4) !== 0; return supportsFeature(this.stateObj, 4);
} }
get supportsStop() { get supportsStop() {
return (this._feat & 8) !== 0; return supportsFeature(this.stateObj, 8);
} }
get supportsOpenTilt() { get supportsOpenTilt() {
return (this._feat & 16) !== 0; return supportsFeature(this.stateObj, 16);
} }
get supportsCloseTilt() { get supportsCloseTilt() {
return (this._feat & 32) !== 0; return supportsFeature(this.stateObj, 32);
} }
get supportsStopTilt() { get supportsStopTilt() {
return (this._feat & 64) !== 0; return supportsFeature(this.stateObj, 64);
} }
get supportsSetTiltPosition() { get supportsSetTiltPosition() {
return (this._feat & 128) !== 0; return supportsFeature(this.stateObj, 128);
} }
get isTiltOnly() { get isTiltOnly() {
@ -121,24 +121,22 @@ export default class CoverEntity {
} }
} }
const support = (stateObj, feature) => export const supportsOpen = (stateObj) => supportsFeature(stateObj, 1);
(stateObj.attributes.supported_features & feature) !== 0;
export const supportsOpen = (stateObj) => support(stateObj, 1); export const supportsClose = (stateObj) => supportsFeature(stateObj, 2);
export const supportsClose = (stateObj) => support(stateObj, 2); export const supportsSetPosition = (stateObj) => supportsFeature(stateObj, 4);
export const supportsSetPosition = (stateObj) => support(stateObj, 4); export const supportsStop = (stateObj) => supportsFeature(stateObj, 8);
export const supportsStop = (stateObj) => support(stateObj, 8); export const supportsOpenTilt = (stateObj) => supportsFeature(stateObj, 16);
export const supportsOpenTilt = (stateObj) => support(stateObj, 16); export const supportsCloseTilt = (stateObj) => supportsFeature(stateObj, 32);
export const supportsCloseTilt = (stateObj) => support(stateObj, 32); export const supportsStopTilt = (stateObj) => supportsFeature(stateObj, 64);
export const supportsStopTilt = (stateObj) => support(stateObj, 64); export const supportsSetTiltPosition = (stateObj) =>
supportsFeature(stateObj, 128);
export const supportsSetTiltPosition = (stateObj) => support(stateObj, 128);
export function isTiltOnly(stateObj) { export function isTiltOnly(stateObj) {
const supportsCover = const supportsCover =

View File

@ -1,3 +1,5 @@
import { supportsFeature } from "../common/entity/supports-feature";
export default class MediaPlayerEntity { export default class MediaPlayerEntity {
constructor(hass, stateObj) { constructor(hass, stateObj) {
this.hass = hass; this.hass = hass;
@ -62,58 +64,54 @@ export default class MediaPlayerEntity {
return progress; return progress;
} }
/* eslint-disable no-bitwise */
get supportsPause() { get supportsPause() {
return (this._feat & 1) !== 0; return supportsFeature(this.stateObj, 1);
} }
get supportsVolumeSet() { get supportsVolumeSet() {
return (this._feat & 4) !== 0; return supportsFeature(this.stateObj, 4);
} }
get supportsVolumeMute() { get supportsVolumeMute() {
return (this._feat & 8) !== 0; return supportsFeature(this.stateObj, 8);
} }
get supportsPreviousTrack() { get supportsPreviousTrack() {
return (this._feat & 16) !== 0; return supportsFeature(this.stateObj, 16);
} }
get supportsNextTrack() { get supportsNextTrack() {
return (this._feat & 32) !== 0; return supportsFeature(this.stateObj, 32);
} }
get supportsTurnOn() { get supportsTurnOn() {
return (this._feat & 128) !== 0; return supportsFeature(this.stateObj, 128);
} }
get supportsTurnOff() { get supportsTurnOff() {
return (this._feat & 256) !== 0; return supportsFeature(this.stateObj, 256);
} }
get supportsPlayMedia() { get supportsPlayMedia() {
return (this._feat & 512) !== 0; return supportsFeature(this.stateObj, 512);
} }
get supportsVolumeButtons() { get supportsVolumeButtons() {
return (this._feat & 1024) !== 0; return supportsFeature(this.stateObj, 1024);
} }
get supportsSelectSource() { get supportsSelectSource() {
return (this._feat & 2048) !== 0; return supportsFeature(this.stateObj, 2048);
} }
get supportsSelectSoundMode() { get supportsSelectSoundMode() {
return (this._feat & 65536) !== 0; return supportsFeature(this.stateObj, 65536);
} }
get supportsPlay() { get supportsPlay() {
return (this._feat & 16384) !== 0; return supportsFeature(this.stateObj, 16384);
} }
/* eslint-enable no-bitwise */
get primaryTitle() { get primaryTitle() {
return this._attr.media_title; return this._attr.media_title;
} }