From 47f000ecff978c7301441114fdaafad3ad143340 Mon Sep 17 00:00:00 2001 From: Sam Edwards Date: Mon, 31 Aug 2015 15:40:02 -0700 Subject: [PATCH] [MiLight] Sent on command before brightness and hue to ensure we're targeting the right lamp, and implement night mode at brightness <= 2, and implement maximum brightness command for white lamps --- accessories/MiLight.js | 59 ++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/accessories/MiLight.js b/accessories/MiLight.js index 9ab18f6..85b09d6 100644 --- a/accessories/MiLight.js +++ b/accessories/MiLight.js @@ -29,12 +29,11 @@ var light = new Milight({ MiLight.prototype = { - setPowerState: function(powerOn, callback) { + setPowerState: function(powerOn, callback) { if (powerOn) { light.sendCommands(commands[this.type].on(this.zone)); this.log("Setting power state to on"); - } - else { + } else { light.sendCommands(commands[this.type].off(this.zone)); this.log("Setting power state to off"); } @@ -42,18 +41,35 @@ MiLight.prototype = { }, setBrightness: function(level, callback) { - this.log("Setting brightness to %s", level); + if (level <= 2 && (this.type == "rgbw" || this.type == "white")) { + // If setting brightness to 2 or lower, instead set night mode for lamps that support it + this.log("Setting night mode", level); - // If this is an rgbw lamp, set the absolute brightness specified - if (this.type == "rgbw") { - light.sendCommands(commands.rgbw.brightness(level)); + light.sendCommands(commands[this.type].off(this.zone)); + // Not sure if this timing is going to work or not? It's supposed to be 100ms after the off command + light.sendCommands(commands[this.type].nightMode(this.zone)); } else { - // If this is an rgb or a white lamp, they only support brightness up and down. - // Set brightness up when value is >50 and down otherwise. Not sure how well this works real-world. - if (level >= 50) { - light.sendCommands(commands[this.type].brightUp()); + this.log("Setting brightness to %s", level); + + // Send on command to ensure we're addressing the right bulb + light.sendCommands(commands[this.type].on(this.zone)); + + // If this is an rgbw lamp, set the absolute brightness specified + if (this.type == "rgbw") { + light.sendCommands(commands.rgbw.brightness(level)); } else { - light.sendCommands(commands[this.type].brightDown()); + // If this is an rgb or a white lamp, they only support brightness up and down. + // Set brightness up when value is >50 and down otherwise. Not sure how well this works real-world. + if (level >= 50) { + if (this.type == "white" && level == 100) { + // But the white lamps do have a "maximum brightness" command + light.sendCommands(commands.white.maxBright(this.zone)); + } else { + light.sendCommands(commands[this.type].brightUp()); + } + } else { + light.sendCommands(commands[this.type].brightDown()); + } } } callback(); @@ -62,6 +78,9 @@ MiLight.prototype = { setHue: function(value, callback) { this.log("Setting hue to %s", value); + // Send on command to ensure we're addressing the right bulb + light.sendCommands(commands[this.type].on(this.zone)); + if (this.type == "rgbw") { if (value == 0) { light.sendCommands(commands.rgbw.whiteMode(this.zone)); @@ -69,7 +88,7 @@ MiLight.prototype = { light.sendCommands(commands.rgbw.hue(commands.rgbw.hsvToMilightColor(Array(value, 0, 0)))); } } else if (this.type == "rgb") { - light.sendCommands(commands.rgb.hue(commands.rgbw.hsvToMilightColor(Array(value, 0, 0)))); + light.sendCommands(commands.rgb.hue(commands.rgbw.hsvToMilightColor(Array(value, 0, 0)))); } else if (this.type == "white") { // Again, white lamps don't support setting an absolue colour temp, so trying to do warmer/cooler step at a time based on colour if (value >= 180) { @@ -80,26 +99,26 @@ MiLight.prototype = { } }, - + identify: function(callback) { this.log("Identify requested!"); callback(); // success }, - + getServices: function() { var informationService = new Service.AccessoryInformation(); - + informationService .setCharacteristic(Characteristic.Manufacturer, "MiLight") .setCharacteristic(Characteristic.Model, this.type) .setCharacteristic(Characteristic.SerialNumber, "MILIGHT12345"); - + var lightbulbService = new Service.Lightbulb(); - + lightbulbService .getCharacteristic(Characteristic.On) .on('set', this.setPowerState.bind(this)); - + lightbulbService .addCharacteristic(new Characteristic.Brightness()) .on('set', this.setBrightness.bind(this)); @@ -107,7 +126,7 @@ MiLight.prototype = { lightbulbService .addCharacteristic(new Characteristic.Hue()) .on('set', this.setHue.bind(this)); - + return [informationService, lightbulbService]; } };