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

View File

@ -1,4 +1,5 @@
import { HassEntity } from "home-assistant-js-websocket";
import { supportsFeature } from "./supports-feature";
// Expects classNames to be an object mapping feature-bit -> className
export default function featureClassNames(
@ -9,12 +10,9 @@ export default function featureClassNames(
return "";
}
const features = stateObj.attributes.supported_features;
return Object.keys(classNames)
.map((feature) =>
// tslint:disable-next-line
(features & Number(feature)) !== 0 ? classNames[feature] : ""
supportsFeature(stateObj, Number(feature)) ? classNames[feature] : ""
)
.filter((attr) => attr !== "")
.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 featureClassNames from "../../../common/entity/feature_class_names";
import { supportsFeature } from "../../../common/entity/supports-feature";
import EventsMixin from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
@ -385,45 +386,45 @@ class MoreInfoClimate extends LocalizeMixin(EventsMixin(PolymerElement)) {
supportsTemperature(stateObj) {
return (
(stateObj.attributes.supported_features & 1) !== 0 &&
supportsFeature(stateObj, 1) &&
typeof stateObj.attributes.temperature === "number"
);
}
supportsTemperatureRange(stateObj) {
return (
(stateObj.attributes.supported_features & 6) !== 0 &&
supportsFeature(stateObj, 6) &&
(typeof stateObj.attributes.target_temp_low === "number" ||
typeof stateObj.attributes.target_temp_high === "number")
);
}
supportsHumidity(stateObj) {
return (stateObj.attributes.supported_features & 8) !== 0;
return supportsFeature(stateObj, 8);
}
supportsFanMode(stateObj) {
return (stateObj.attributes.supported_features & 64) !== 0;
return supportsFeature(stateObj, 64);
}
supportsOperationMode(stateObj) {
return (stateObj.attributes.supported_features & 128) !== 0;
return supportsFeature(stateObj, 128);
}
supportsSwingMode(stateObj) {
return (stateObj.attributes.supported_features & 512) !== 0;
return supportsFeature(stateObj, 512);
}
supportsAwayMode(stateObj) {
return (stateObj.attributes.supported_features & 1024) !== 0;
return supportsFeature(stateObj, 1024);
}
supportsAuxHeat(stateObj) {
return (stateObj.attributes.supported_features & 2048) !== 0;
return supportsFeature(stateObj, 2048);
}
supportsOn(stateObj) {
return (stateObj.attributes.supported_features & 4096) !== 0;
return supportsFeature(stateObj, 4096);
}
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 "../../../components/ha-attributes";
import { supportsFeature } from "../../../common/entity/supports-feature";
class MoreInfoVacuum extends PolymerElement {
static get template() {
@ -158,57 +159,53 @@ class MoreInfoVacuum extends PolymerElement {
};
}
/* eslint-disable no-bitwise */
supportsPause(stateObj) {
return (stateObj.attributes.supported_features & 4) !== 0;
return supportsFeature(stateObj, 4);
}
supportsStop(stateObj) {
return (stateObj.attributes.supported_features & 8) !== 0;
return supportsFeature(stateObj, 8);
}
supportsReturnHome(stateObj) {
return (stateObj.attributes.supported_features & 16) !== 0;
return supportsFeature(stateObj, 16);
}
supportsFanSpeed(stateObj) {
return (stateObj.attributes.supported_features & 32) !== 0;
return supportsFeature(stateObj, 32);
}
supportsBattery(stateObj) {
return (stateObj.attributes.supported_features & 64) !== 0;
return supportsFeature(stateObj, 64);
}
supportsStatus(stateObj) {
return (stateObj.attributes.supported_features & 128) !== 0;
return supportsFeature(stateObj, 128);
}
supportsLocate(stateObj) {
return (stateObj.attributes.supported_features & 512) !== 0;
return supportsFeature(stateObj, 512);
}
supportsCleanSpot(stateObj) {
return (stateObj.attributes.supported_features & 1024) !== 0;
return supportsFeature(stateObj, 1024);
}
supportsStart(stateObj) {
return (stateObj.attributes.supported_features & 8192) !== 0;
return supportsFeature(stateObj, 8192);
}
supportsCommandBar(stateObj) {
return (
((stateObj.attributes.supported_features & 4) !== 0) |
((stateObj.attributes.supported_features & 8) !== 0) |
((stateObj.attributes.supported_features & 16) !== 0) |
((stateObj.attributes.supported_features & 512) !== 0) |
((stateObj.attributes.supported_features & 1024) !== 0) |
((stateObj.attributes.supported_features & 8192) !== 0)
supportsFeature(stateObj, 4) |
supportsFeature(stateObj, 8) |
supportsFeature(stateObj, 16) |
supportsFeature(stateObj, 512) |
supportsFeature(stateObj, 1024) |
supportsFeature(stateObj, 8192)
);
}
/* eslint-enable no-bitwise */
fanSpeedChanged(fanSpeedIndex) {
var fanSpeedInput;
// 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 featureClassNames from "../../../common/entity/feature_class_names";
import { supportsFeature } from "../../../common/entity/supports-feature";
import EventsMixin from "../../../mixins/events-mixin";
import LocalizeMixin from "../../../mixins/localize-mixin";
@ -198,17 +199,17 @@ class MoreInfoWaterHeater extends LocalizeMixin(EventsMixin(PolymerElement)) {
supportsTemperature(stateObj) {
return (
(stateObj.attributes.supported_features & 1) !== 0 &&
supportsFeature(stateObj, 1) &&
typeof stateObj.attributes.temperature === "number"
);
}
supportsOperationMode(stateObj) {
return (stateObj.attributes.supported_features & 2) !== 0;
return supportsFeature(stateObj, 2);
}
supportsAwayMode(stateObj) {
return (stateObj.attributes.supported_features & 4) !== 0;
return supportsFeature(stateObj, 4);
}
computeClassNames(stateObj) {

View File

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

View File

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

View File

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