UNPKG

node-miio

Version:

Control Mi Home devices, such as Mi Robot Vacuums, Mi Air Purifiers, Mi Smart Home Gateway (Aqara) and more

180 lines (147 loc) 3.47 kB
'use strict'; const MiioApi = require('../device'); const { Children } = require('abstract-things'); const { Light, Dimmable, SwitchablePower } = require('abstract-things/lights'); const { percentage } = require('abstract-things/values'); const MiioDimmable = require('./capabilities/dimmable'); const MiioPower = require('./capabilities/power'); module.exports = class EyecareLamp2 extends Light .with(MiioPower, MiioDimmable, Children, MiioApi) { constructor(options) { super(options); this.defineProperty('power', { name: 'power', mapper: v => v === 'on' }); this.defineProperty('bright', { name: 'brightness', mapper: parseInt }); // Get if the this.defineProperty('notifystatus', { name: 'notifyStatus', mapper: v => v === 'on' }); // Power of the secondary light this.defineProperty('ambstatus', { name: 'ambientPower', mapper: v => v === 'on' }); // Brightness of the secondary light this.defineProperty('ambvalue', { name: 'ambientBrightness', mapper: parseInt }); // If the main light is on this.defineProperty('eyecare', { name: 'eyeCare', mapper: v => v === 'on' }); // The current user-defined scene this.defineProperty('scene_num', { name: 'userScene', mapper: v => { switch (v) { case 1: return 'study'; case 2: return 'reading'; case 3: return 'phone'; } } }); this.setModes([ 'study', 'reading', 'phone' ]); this.defineProperty('bls', { name: 'bls', mapper: v => v === 'on' }); this.defineProperty('dvalue', { name: 'dvalue', mapper: parseInt }); this.ambient = new AmbientLight(this); this.addChild(this.ambient); } changePower(power) { return this.call('set_power', [power ? 'on' : 'off'], { refresh: true }); } changeBrightness(brightness) { return this.call('set_bright', [ brightness ], { refresh: true }).then(MiioApi.checkOk); } /** * Is eyeCare active? */ eyeCare() { return Promise.resolve(this.property('eyeCare')); } /** * Enable the eyeCare */ setEyeCare(enable) { return this.call('set_eyecare', [enable ? 'on' : 'off'], { refresh: true }) .then(() => null); } /** * Set the current eyeCare mode * changeMode(mode) { switch (mode) { case 'study': mode = 1; break; case 'reading': mode = 2; break; case 'phone': mode = 3; break; default: return Promise.reject(new Error('Invalid EyeCare Mode: ' + mode)); } return this.call('set_user_scene', [mode], { refresh: true }); } */ setAmbientPower(power) { return this.call.send('enable_amb', [ power ? 'on' : 'off' ]) .then(MiioApi.checkOk); } setAmbientBrightness(brightness) { brightness = percentage(brightness, { min: 0, max: 100 }); return this.call.send('set_amb_bright', [ brightness ]) .then(MiioApi.checkOk); } propertyUpdated(key, value) { super.propertyUpdated(key, value); switch(key) { case 'ambientPower': this.ambient.updatePower(value); break; case 'ambientBrightness': this.ambient.updateBrightness(value); break; } } }; class AmbientLight extends Light.with(Dimmable, SwitchablePower) { constructor(parent) { super(); this.parent = parent; this.id = parent.id + ':ambient'; } changePower(power) { return this.parent.setAmbientPower(power); } changeBrightness(brightness) { return this.parent.setAmbientBrightness(brightness); } }