UNPKG

homebridge-miot

Version:

Homebridge plugin for devices supporting the miot protocol

269 lines (197 loc) 7.11 kB
const BaseDevice = require('../../base/BaseDevice.js'); const Constants = require('../../constants/Constants.js'); const DevTypes = require('../../constants/DevTypes.js'); const PropFormat = require('../../constants/PropFormat.js'); const PropUnit = require('../../constants/PropUnit.js'); const PropAccess = require('../../constants/PropAccess.js'); class AirPurifierDevice extends BaseDevice { constructor(device, name, logger) { super(device, name, logger); } /*----------========== LIFECYCLE ==========----------*/ initialPropertyFetchDone() { super.initialPropertyFetchDone(); // log the the filter life level when supported if (this.supportsFilterLifeLevelReporting()) { this.logger.info(`Filter life level: ${this.getFilterLifeLevel()}%.`); } // log the the filter used time when supported if (this.supportsFilterUsedTimeReporting()) { this.logger.info(`Filter used time: ${this.getFilterUsedTime()} hours.`); } // log the the filter left time when supported if (this.supportsFilterLeftTimeReporting()) { this.logger.info(`Filter left time: ${this.getFilterLeftTime()} hours.`); } } /*----------========== DEVICE INFO ==========----------*/ getType() { return DevTypes.AIR_PURIFIER; } getDeviceName() { return 'Unknown air purifier device'; } /*----------========== CONFIG ==========----------*/ propertiesToMonitor() { return ['air-purifier:on', 'air-purifier:mode', 'air-purifier:fault', 'air-purifier:fan-level', 'air-purifier:anion', 'screen:brightness', 'custom-service:favorite-speed', 'environment:air-quality', 'environment:pm2.5-density', 'environment:relative-humidity', 'environment:temperature', 'environment:tvoc-density', 'filter:filter-life-level', 'filter:filter-used-time', 'filter:filter-left-time', 'alarm:alarm', 'indicator-light:on', 'indicator-light:brightness', 'physical-controls-locked:physical-controls-locked', 'motor-speed:favorite-level', 'motor-speed:motor-speed', 'environment:indoor-temperature', 'custom:childlock', 'custom-service:moto-speed-rpm', 'custom-service:favorite-level', 'air-purifier-favorite:fan-level' ]; } /*----------========== VALUES ==========----------*/ autoModeValue() { return this.getValueForMode('Auto'); } sleepModeValue() { return this.getValueForMode('Sleep'); } favoriteModeValue() { return this.getValueForMode('Favorite'); } manualModeValue() { return this.getValueForMode('Manual'); } /*----------========== PROPERTIES ==========----------*/ //overrides onProp() { return this.getProperty('air-purifier:on'); } modeProp() { return this.getProperty('air-purifier:mode'); } faultProp() { return this.getProperty('air-purifier:fault'); } fanLevelProp() { return this.getProperty('air-purifier:fan-level'); } speedNowProp() { return this.getProperty('motor-speed:motor-speed'); } anionProp() { return this.getProperty('air-purifier:anion'); } //device specific screenBrightnessProp() { return this.getProperty('screen:brightness'); } favoriteSpeedProp() { return this.getProperty('custom-service:favorite-speed'); } favoriteLevelProp() { return this.getProperty('motor-speed:favorite-level'); } /*----------========== ACTIONS ==========----------*/ /*----------========== FEATURES ==========----------*/ // favorite speed supportsFavoriteSpeed() { return !!this.favoriteSpeedProp() && this.favoriteSpeedProp().isWritable(); } favoriteSpeedRange() { return this.getPropertyValueRange(this.favoriteSpeedProp()); } supportsFavoriteSpeedRange() { return this.supportsFavoriteSpeed() && this.favoriteSpeedRange().length > 2; } // favorite levels supportsFavoriteLevel() { return !!this.favoriteLevelProp() && this.favoriteLevelProp().isWritable(); } favoriteLevelsRange() { return this.getPropertyValueRange(this.favoriteLevelProp()); } supportsFavoriteLevelsRange() { return this.supportsFavoriteLevel() && this.favoriteLevelsRange().length > 0; } //favorite speed control supportsFavoriteSpeedControl() { return this.supportsFavoriteSpeed() || this.supportsFavoriteLevel(); } // modes supportsAutoMode() { return this.supportsModes() && this.autoModeValue() !== -1; } supportsSleepMode() { return this.supportsModes() && this.sleepModeValue() !== -1; } supportsFavoriteMode() { return this.supportsModes() && this.favoriteModeValue() !== -1; } /*----------========== GETTERS ==========----------*/ getFavoriteLevel() { return this.getPropertyValue(this.favoriteLevelProp()); } getFavoriteSpeed() { return this.getPropertyValue(this.favoriteSpeedProp()); } /*----------========== SETTERS ==========----------*/ async setFavoriteLevel(value) { return this.setPropertyValue(this.favoriteLevelProp(), value); } async setFavoriteSpeed(value) { return this.setPropertyValue(this.favoriteSpeedProp(), value); } /*----------========== CONVENIENCE ==========----------*/ getFavoriteSpeedPercentage() { if (this.supportsFavoriteLevelsRange()) { return this.convertPropValueToPercentage(this.favoriteLevelProp()); } else if (this.supportsFavoriteSpeedRange()) { return this.convertPropValueToPercentage(this.favoriteSpeedProp()); } return this.getFavoriteSpeed(); } async setFavoriteSpeedPercentage(percentage) { if (this.supportsFavoriteLevelsRange()) { return this.setFavoriteLevel(this.convertPercentageToPropValue(percentage, this.favoriteLevelProp())); } else if (this.supportsFavoriteSpeedRange()) { return this.setFavoriteSpeed(this.convertPercentageToPropValue(percentage, this.favoriteSpeedProp())); } else { return this.setFavoriteSpeed(percentage); } } async turnOnFavoriteModeIfNecessary() { if (this.isFavoriteModeEnabled() === false) { return this.enableFavoriteMode(); } } async enableAutoMode() { if (this.supportsAutoMode()) { return this.setMode(this.autoModeValue()); } } async enableSleepMode() { if (this.supportsSleepMode()) { return this.setMode(this.sleepModeValue()); } } async enableFavoriteMode() { if (this.supportsFavoriteMode()) { return this.setMode(this.favoriteModeValue()); } } isIdle() { if (this.isStatusIdle() || (this.supportsSpeedNowReporting() && this.getSpeedNow() === 0)) { return true; } return false; } /*----------========== VALUE CONVENIENCE ==========----------*/ isAutoModeEnabled() { return this.getMode() === this.autoModeValue(); } isSleepModeEnabled() { return this.getMode() === this.sleepModeValue(); } isFavoriteModeEnabled() { return this.getMode() === this.favoriteModeValue(); } isManualModeEnabled() { return this.getMode() === this.manualModeValue(); } /*----------========== HELPERS ==========----------*/ } module.exports = AirPurifierDevice;