Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for color temperature #8

Open
ankitseal opened this issue Sep 10, 2017 · 0 comments
Open

Support for color temperature #8

ankitseal opened this issue Sep 10, 2017 · 0 comments

Comments

@ankitseal
Copy link

What am I doing wrong to get Color temperature support for my LB120 blubs?? here is the index.js file
I am unable to change the colors
`'use strict'
const Bulb = require('tplink-lightbulb')
const promiseTimeout = require('promise-timeout')
const promiseRetry = require('promise-retry')

var PlatformAccessory, Service, Characteristic, UUIDGen

module.exports = function (homebridge) {
PlatformAccessory = homebridge.platformAccessory
Service = homebridge.hap.Service
Characteristic = homebridge.hap.Characteristic
UUIDGen = homebridge.hap.uuid

homebridge.registerPlatform('homebridge-tplink-lightbulb', 'TplinkLightbulb', TplinkLightbulbPlatform, true)
}

class TplinkLightbulbPlatform {
constructor (log, config, api) {
this.log = log
this.config = config || {}
this.accessories = new Map()

if (api) {
  this.api = api

  // Scan for bulbs after cached bulbs have been restored
  this.api.on('didFinishLaunching', this.scan.bind(this))
}

}

scan () {
Bulb.scan('IOT.SMARTBULB').on('light', (light) => {
// Does the bulb support color?
light.is_color = light._sysinfo.is_color
//Does the light support color temp
light.is_ct = light._sysinfo.light_state.is_variable_color_temp

  var accessory = this.accessories.get(light.deviceId)
  // Initialize a new bulb as an accessory
  if (accessory === undefined) {
    this.addAccessory(light)
  }
  // Reconfigure an existing cached accessory
  else {
    this.log('Lightbulb online: %s [%s]', accessory.displayName, light.deviceId)
    accessory = new TplinkLightbulbAccessory(this.log, accessory)
    this.accessories.set(light.deviceId, accessory)
    accessory.configure(light)
  }
})

}

configureAccessory (light) {
this.accessories.set(light.context.deviceId, light)
}

addAccessory (light) {
var platform = this
const name = light.name
platform.log('Lightbulb added: %s [%s]', name, light.deviceId)

// 5 == Accessory.Categories.LIGHTBULB
const platformAccessory = new PlatformAccessory(name, UUIDGen.generate(light.deviceId + light.name), 5)

const lightService = platformAccessory.addService(Service.Lightbulb, name)
lightService.addCharacteristic(Characteristic.Brightness)

// Add color characteristics for bulbs that support color (e.g. LB130)
if (light.is_color === 1) {
  lightService.addCharacteristic(Characteristic.Hue)
  lightService.addCharacteristic(Characteristic.Saturation)
}
else if (light.is_ct === 1){
 lightService.addCharacteristic(Characteristic.ColorTemperature)
}
const infoService = platformAccessory.getService(Service.AccessoryInformation)
infoService.addCharacteristic(Characteristic.FirmwareRevision)
infoService.addCharacteristic(Characteristic.HardwareRevision)

platformAccessory.context.deviceId = light.deviceId
platformAccessory.context.host = light.host
platformAccessory.context.port = light.port || 9999

const accessory = new TplinkLightbulbAccessory(this.log, platformAccessory)

accessory.configure(light)
platform.accessories.set(light.deviceId, accessory)
platform.api.registerPlatformAccessories('homebridge-tplink-lightbulb', 'TplinkLightbulb', [platformAccessory])

}
}

class TplinkLightbulbAccessory {
constructor (log, platformAccessory) {
this.log = log
this.platformAccessory = platformAccessory
this.deviceId = platformAccessory.context.deviceId
}

// Request info from bulb, retrying if the request times out
getInfo (light) {
let self = this

return promiseRetry(function (retry, number) {
  if (number > 1) {
    self.log.debug('Unable to contact bulb, trying again (attempt #%s)', number)
  }

  return promiseTimeout.timeout(light.info(), 2000)
    .catch(function (err) {
      if (err instanceof promiseTimeout.TimeoutError) {
        retry(err)
      }

      throw err
    })
})

}

configure (light) {
this.light = light
this.log('Configuring:', this.platformAccessory.displayName)

const lightService = this.platformAccessory.getService(Service.Lightbulb)

// Power characteristic
const powerCharacteristic = lightService.getCharacteristic(Characteristic.On)
powerCharacteristic
  .on('get', (callback) => {
    this.getInfo(this.light).then((info) => {
      this.refresh(info)
      this.powerState = info.light_state.on_off
      callback(null, info.light_state.on_off === 1)
    }).catch((reason) => {
      this.log(reason)
    })
  })
  .on('set', (value, callback) => {
    if (value === this.powerState) {
      callback()
      return
    }

    light.set(value).then((status) => {
      this.powerState = value
      this.log('Set %s light to %s', light.name, value ? 'on' : 'off')
      callback()
    }).catch((reason) => {
      this.log(reason)
    })
  })

// Brightness characterstic
const brightnessCharacteristic = lightService.getCharacteristic(Characteristic.Brightness)
brightnessCharacteristic
  .on('get', (callback) => {
    this.getInfo(this.light).then((info) => {
      this.refresh(info)

      const brightness = info.light_state.brightness || 100

      callback(null, brightness)
    }).catch((reason) => {
      this.log(reason)
    })
  })
  .on('set', (value, callback) => {
    if (value === brightnessCharacteristic.value) {
      callback()
      return
    }

    light.set(true, 0, { brightness: value }).then((status) => {
      this.log('Changed %s brightness from %s% to %s%', light.name, brightnessCharacteristic.value, value)
      callback()
    }).catch((reason) => {
      this.log(reason)
    })
  })
  
if (light.is_color === 1) {
  // Hue characterstic
  const hueCharacteristic = lightService.getCharacteristic(Characteristic.Hue)
  hueCharacteristic
    .on('get', (callback) => {
      this.getInfo(this.light).then((info) => {
        this.refresh(info)

        const hue = info.light_state.hue || 360

        callback(null, hue)
      }).catch((reason) => {
        this.log(reason)
      })
    })
    .on('set', (value, callback) => {
      if (value === hueCharacteristic.value) {
        callback()
        return
      }

      light.set(true, 0, { hue: value }).then((status) => {
        this.log('Changed %s hue from %s to %s', light.name, hueCharacteristic.value, value);
        callback()
      }).catch((reason) => {
        this.log(reason)
      })
    })

  // Saturation characterstic
  const saturationCharacteristic = lightService.getCharacteristic(Characteristic.Saturation)
  saturationCharacteristic
    .on('get', (callback) => {
      this.getInfo(this.light).then((info) => {
        this.refresh(info)

        const hue = info.light_state.saturation || 100

        callback(null, hue)
      }).catch((reason) => {
        this.log(reason)
      })
    })
    .on('set', (value, callback) => {
      if (value === saturationCharacteristic.value) {
        callback()
        return
      }

      light.set(true, 0, { hue: value }).then((status) => {
        this.log('Changed %s saturation from %s to %s', light.name, saturationCharacteristic.value, value);
        callback()
      }).catch((reason) => {
        this.log(reason)
      })
    })
}
else if (light.is_ct === 1) {
  const color_tempCharacteristic = lightService.getCharacteristic(Characteristic.ColorTemperature)
color_tempCharacteristic
  .on('get', (callback) => {
    this.getInfo(this.light).then((info) => {
      this.refresh(info)

      const color_temp = info.light_state.color_temp
	this.log(info.light_state)
      callback(null, color_temp)
    }).catch((reason) => {
      this.log(reason)
    })
  })
  .on('set', (value, callback) => {
    if (value === color_tempCharacteristic.value) {
      callback()
      return
    }

    light.set(true, 0, { color_temp: value }).then((status) => {
      this.log('Changed %s color_temp from %s% to %s%', light.name, color_tempCharacteristic.value, value)
      callback()
    }).catch((reason) => {
      this.log(reason)
    })
  })
}

}

refresh (info) {
info = info ? Promise.resolve(info) : this.light.info()

return info.then((info) => {
  this.platformAccessory.updateReachability(true)

  const name = info.alias || this.platformAccessory.context.host
  this.platformAccessory.displayName = name

  this.platformAccessory.getService(Service.Lightbulb)
    .setCharacteristic(Characteristic.Name, name)

  this.platformAccessory.getService(Service.AccessoryInformation)
    .setCharacteristic(Characteristic.Name, name)
    .setCharacteristic(Characteristic.Manufacturer, 'TP-Link')
    .setCharacteristic(Characteristic.Model, info.model)
    .setCharacteristic(Characteristic.SerialNumber, info.deviceId)
    .setCharacteristic(Characteristic.FirmwareRevision, info.sw_ver)
    .setCharacteristic(Characteristic.HardwareRevision, info.hw_ver)

  this.platformAccessory.context.lastRefreshed = new Date()

  return this
}).catch((reason) => {
  this.log(reason)
})

}
}
`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant