mirror of
https://github.com/home-assistant/frontend.git
synced 2025-07-28 11:46:42 +00:00
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:
parent
22eb6c6a8d
commit
882c503fa9
@ -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);
|
||||
|
@ -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(" ");
|
||||
|
9
src/common/entity/supports-feature.ts
Normal file
9
src/common/entity/supports-feature.ts
Normal 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;
|
||||
};
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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";
|
||||
}
|
||||
|
@ -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 =
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user