@hoobs/hue
Version:
HOOBS plugin for Philips Hue and deCONZ
147 lines (131 loc) • 4.47 kB
JavaScript
// homebridge-hue/lib/HueSchedule.js
// Copyright © 2016-2020 Erik Baauw. All rights reserved.
//
// Homebridge plugin for Philips Hue and/or deCONZ.
//
// HueSchedule provides support for Philips Hue schedules and rules.
'use strict'
module.exports = {
setHomebridge: setHomebridge,
HueSchedule: HueSchedule
}
// ===== Homebridge ============================================================
let Service
let Characteristic
let my
function setHomebridge (homebridge, _my) {
Service = homebridge.hap.Service
Characteristic = homebridge.hap.Characteristic
my = _my
}
// ===== HueSchedule ===========================================================
function HueSchedule (bridge, id, obj, type) {
this.log = bridge.log
this.bridge = bridge
this.name = obj.name
this.type = type || 'schedule'
this.resource = '/' + this.type + 's/' + id
this.serialNumber = bridge.serialNumber + '/' + this.resource
// jshint -W106
this.uuid_base = this.serialNumber
// jshint +W106
this.obj = obj
this.refresh()
this.infoService = new Service.AccessoryInformation()
this.infoService
.updateCharacteristic(Characteristic.Manufacturer, this.bridge.philips)
.updateCharacteristic(
Characteristic.Model, type === 'schedule' ? 'Schedule' : 'Rule'
)
.updateCharacteristic(Characteristic.SerialNumber, this.serialNumber)
.updateCharacteristic(
Characteristic.FirmwareRevision, this.bridge.version
)
this.service = new my.Services.Resource(this.name, this.resource)
this.service.getCharacteristic(my.Characteristics.Enabled)
.updateValue(this.hk.enabled)
.on('set', this.setEnabled.bind(this))
if (this.type === 'rule') {
this.service
.updateCharacteristic(my.Characteristics.LastTriggered, this.hk.lasttriggered)
.updateCharacteristic(
my.Characteristics.TimesTriggered, this.hk.timestriggered
)
}
this.service
.updateCharacteristic(Characteristic.StatusActive, this.hk.enabled)
if (this.bridge.platform.config.resource) {
this.service
.updateCharacteristic(my.Characteristics.Resource, this.resource)
this.service.getCharacteristic(my.Characteristics.Resource)
.updateValue(this.resource)
}
}
HueSchedule.prototype.getServices = function () {
return [this.service, this.infoService]
}
HueSchedule.prototype.refresh = function () {
this.hk = {}
this.hk.enabled = this.obj.status === 'enabled' ? 1 : 0
if (this.type === 'rule') {
this.hk.lasttriggered =
(this.obj.lasttriggered && this.obj.lasttriggered !== 'none')
? String(new Date(this.obj.lasttriggered + 'Z')).substring(0, 24) : 'n/a'
this.hk.timestriggered = this.obj.timestriggered
}
}
// ===== Bridge Events =========================================================
HueSchedule.prototype.heartbeat = function (beat, obj) {
const old = {
obj: this.obj,
hk: this.hk
}
this.obj = obj
this.refresh()
if (this.obj.status !== old.obj.status) {
this.log.info(
'%s: change homekit enabled from %s to %s', this.name,
old.hk.enabled, this.hk.enabled
)
this.service
.updateCharacteristic(my.Characteristics.Enabled, this.hk.enabled)
.updateCharacteristic(Characteristic.StatusActive, this.hk.enabled)
}
if (this.obj.lasttriggered !== old.obj.lasttriggered) {
this.log.debug(
'%s: rule triggered on %s', this.name, this.hk.lasttriggered
)
this.service
.updateCharacteristic(
my.Characteristics.LastTriggered, this.hk.lasttriggered
)
.updateCharacteristic(
my.Characteristics.TimesTriggered, this.hk.timestriggered
)
}
}
// ===== Homekit Events ========================================================
HueSchedule.prototype.identify = function (callback) {
this.log.info('%s: identify', this.name)
return callback()
}
HueSchedule.prototype.setEnabled = function (enabled, callback) {
enabled = enabled ? 1 : 0
if (enabled === this.hk.enabled) {
return callback()
}
this.log.info(
'%s: homekit enabled changed from %s to %s', this.name,
this.hk.enabled, enabled
)
const status = enabled ? 'enabled' : 'disabled'
this.bridge.request('put', this.resource, { status: status }).then((obj) => {
this.obj.status = status
this.refresh()
this.service
.updateCharacteristic(Characteristic.StatusActive, this.hk.enabled)
return callback()
}).catch((error) => {
return callback(error)
})
}