Skip to content
This repository has been archived by the owner on Nov 24, 2023. It is now read-only.

Commit

Permalink
Added DefaultAccessory for devices that support just one service. Rep…
Browse files Browse the repository at this point in the history
…laced TemperatureAccessory with GenericAccessory, which adds Services based on attributes (#42 and #51)
  • Loading branch information
michbeck100 committed Nov 8, 2016
1 parent b70eadb commit da2c11e
Show file tree
Hide file tree
Showing 12 changed files with 57 additions and 41 deletions.
19 changes: 3 additions & 16 deletions accessories/base.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,10 @@ module.exports = (env) ->
# base class for all homekit accessories in pimatic
class BaseAccessory extends Accessory

supportedServiceOverrides: {}
hapConfig: null

service: null

constructor: (device, service) ->
service = @getServiceOverride(device.config?.hap) unless service
constructor: (device) ->
@hapConfig = device.config.hap
serialNumber = uuid.generate('pimatic-hap:accessories:' + device.id)
super(device.name, serialNumber)

Expand All @@ -32,8 +30,6 @@ module.exports = (env) ->
@on 'identify', (paired, callback) =>
@identify(device, paired, callback)

@service = @addService(service, device.name)

## default identify method just calls callback
identify: (device, paired, callback) =>
callback()
Expand Down Expand Up @@ -67,12 +63,3 @@ module.exports = (env) ->
if @hapConfig != null && @hapConfig != undefined
return @hapConfig.exclude != null && @hapConfig.exclude
return false

getServiceOverride: (hapConfig) =>
if hapConfig?.service of @supportedServiceOverrides
return @supportedServiceOverrides[hapConfig.service]
else
return @getDefaultService()

getDefaultService: =>
throw new Error "getDefaultService must be overridden"
4 changes: 2 additions & 2 deletions accessories/button.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

class ButtonAccessory extends BaseAccessory
class ButtonAccessory extends DefaultAccessory

constructor: (device) ->
super(device, Service.Switch)
Expand Down
4 changes: 2 additions & 2 deletions accessories/contact.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

##
# ContactSensor
##
class ContactAccessory extends BaseAccessory
class ContactAccessory extends DefaultAccessory

constructor: (device) ->
super(device, Service.ContactSensor)
Expand Down
24 changes: 24 additions & 0 deletions accessories/default.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module.exports = (env) ->

BaseAccessory = require('./base')(env)

# base class for homekit accessories that use a single Service
class DefaultAccessory extends BaseAccessory

supportedServiceOverrides: {}

service: null

constructor: (device, service) ->
super(device)
service = @getServiceOverride(device.config?.hap) unless service
@service = @addService(service, device.name)

getServiceOverride: (hapConfig) =>
if hapConfig?.service of @supportedServiceOverrides
return @supportedServiceOverrides[hapConfig.service]
else
return @getDefaultService()

getDefaultService: =>
throw new Error "getDefaultService must be overridden"
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,28 @@ module.exports = (env) ->
##
# TemperatureSensor
##
class TemperatureAccessory extends BaseAccessory
class GenericAccessory extends BaseAccessory

constructor: (device) ->
super(device, Service.TemperatureSensor)
super(device)

if device.hasAttribute('temperature')
@service.getCharacteristic(Characteristic.CurrentTemperature)
@addService(Service.TemperatureSensor, device.name)
.getCharacteristic(Characteristic.CurrentTemperature)
.on 'get', (callback) =>
@handleReturnPromise(device.getTemperature(), callback, null)
.props.minValue = -50

device.on 'temperature', (temperature) =>
@service.setCharacteristic(Characteristic.CurrentTemperature, temperature)
@getService(Service.TemperatureSensor)
.setCharacteristic(Characteristic.CurrentTemperature, temperature)

@addBatteryStatus(device, Service.TemperatureSensor)
@addBatteryStatus(device, @getService(Service.TemperatureSensor))

# some devices also measure humidity
if device.hasAttribute('humidity')
@addService(Service.HumiditySensor, device.name)
@getService(Service.HumiditySensor)
.getCharacteristic(Characteristic.CurrentRelativeHumidity)
.on 'get', (callback) =>
@handleReturnPromise(device.getHumidity(), callback, null)
Expand All @@ -36,17 +39,17 @@ module.exports = (env) ->
@getService(Service.HumiditySensor)
.setCharacteristic(Characteristic.CurrentRelativeHumidity, humidity)

@addBatteryStatus(device, Service.HumiditySensor)
@addBatteryStatus(device, @getService(Service.HumiditySensor))

addBatteryStatus: (device, service) =>
if device.hasAttribute('lowBattery')
@getService(service)
service
.getCharacteristic(Characteristic.StatusLowBattery)
.on 'get', (callback) =>
@handleReturnPromise(device.getLowBattery(), callback, @getBatteryStatus)

device.on 'lowBattery', (state) =>
@getService(service)
service
.setCharacteristic(Characteristic.StatusLowBattery, @getBatteryStatus(state))

getBatteryStatus: (state) =>
Expand Down
4 changes: 2 additions & 2 deletions accessories/ledlight.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

class LedLightAccessory extends BaseAccessory
class LedLightAccessory extends DefaultAccessory

# hsv value of current color
_color: null
Expand Down
4 changes: 2 additions & 2 deletions accessories/motion.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

##
# PresenceSensor
##
class MotionAccessory extends BaseAccessory
class MotionAccessory extends DefaultAccessory

constructor: (device) ->
super(device, Service.MotionSensor)
Expand Down
4 changes: 2 additions & 2 deletions accessories/shutter.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

##
# ShutterController
#
# currently shutter is using Service.GarageDoorOpener because Service.Window uses percentages
# for moving the shutter which is not supported by ShutterController devices
class ShutterAccessory extends BaseAccessory
class ShutterAccessory extends DefaultAccessory
_targetState: null

constructor: (device) ->
Expand Down
4 changes: 2 additions & 2 deletions accessories/switch.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

# base class for switch actuators
class SwitchAccessory extends BaseAccessory
class SwitchAccessory extends DefaultAccessory

_state = null

Expand Down
4 changes: 2 additions & 2 deletions accessories/thermostat.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ module.exports = (env) ->
Service = hap.Service
Characteristic = hap.Characteristic

BaseAccessory = require('./base')(env)
DefaultAccessory = require('./default')(env)

##
# HeatingThermostat
##
class ThermostatAccessory extends BaseAccessory
class ThermostatAccessory extends DefaultAccessory

_temperature: null

Expand Down
6 changes: 4 additions & 2 deletions hap.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ module.exports = (env) =>
ButtonAccessory = require('./accessories/button')(env)
ContactAccessory = require('./accessories/contact')(env)
DimmerAccessory = require('./accessories/dimmer')(env)
GenericAccessory = require('./accessories/genericsensor')(env)
LightbulbAccessory = require('./accessories/lightbulb')(env)
LedLightAccessory = require('./accessories/ledlight')(env)
MotionAccessory = require('./accessories/motion')(env)
PowerSwitchAccessory = require('./accessories/powerswitch')(env)
ShutterAccessory = require('./accessories/shutter')(env)
TemperatureAccessory = require('./accessories/temperature')(env)
ThermostatAccessory = require('./accessories/thermostat')(env)

# Require the [cassert library](https://github.com/rhoot/cassert).
Expand Down Expand Up @@ -44,7 +44,7 @@ module.exports = (env) =>
'huezllextendedcolor': DimmerAccessory
'switch': PowerSwitchAccessory
'shutter': ShutterAccessory
'temperature': TemperatureAccessory
'temperature': GenericAccessory
'contact': ContactAccessory
'thermostat': ThermostatAccessory
'led-light': LedLightAccessory
Expand Down Expand Up @@ -117,6 +117,8 @@ module.exports = (env) =>
# ButtonsDevice must not have more than one button
if device.template is "buttons" and device.config.buttons.length != 1 then return null
return new @knownTemplates[device.template](device)
else if device.hasAttribute('temperature') or device.hasAttribute('humidity')
return new GenericAccessory(device)
else
env.logger.debug("unsupported device type: " + device.constructor.name)
return null
Expand Down
2 changes: 1 addition & 1 deletion test/temperature-test.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ env =
logger:
debug: (stmt) ->
grunt.log.writeln stmt
TemperatureAccessory = require("../accessories/temperature")(env)
TemperatureAccessory = require("../accessories/genericsensor")(env)
hap = require 'hap-nodejs'
Service = hap.Service
Characteristic = hap.Characteristic
Expand Down

0 comments on commit da2c11e

Please sign in to comment.