-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdenon-avr.coffee
101 lines (91 loc) · 3.4 KB
/
denon-avr.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# Denon AVR plugin
module.exports = (env) ->
Promise = env.require 'bluebird'
commons = require('pimatic-plugin-commons')(env)
TelnetAppProtocol = require('./telnet-app-protocol')(env)
HttpAppProtocol = require('./http-app-protocol')(env)
deviceConfigTemplates = [
{
"name": "Denon AVR Status",
"class": "DenonAvrPresenceSensor",
"volumeDecibel": true,
}
{
"name": "Denon AVR Power",
"class": "DenonAvrPowerSwitch"
}
{
"name": "Denon AVR Zone Switch",
"class": "DenonAvrZoneSwitch"
}
{
"name": "Denon AVR Mute",
"class": "DenonAvrMuteSwitch"
}
{
"name": "Denon AVR Master Volume",
"class": "DenonAvrMasterVolume",
"maxAbsoluteVolume": 89.5
}
{
"name": "Denon AVR Zone Volume",
"class": "DenonAvrZoneVolume",
"maxAbsoluteVolume": 89.5
}
{
"name": "Denon AVR Input Selector",
"class": "DenonAvrInputSelector",
}
]
actionProviders = [
'denon-avr-input-select-action'
]
# ###DenonAvrPlugin class
class DenonAvrPlugin extends env.plugins.Plugin
init: (app, @framework, @config) =>
@debug = @config.debug || false
@base = commons.base @, 'Plugin'
if @config.protocol is 'HTTP'
@protocolHandler = new HttpAppProtocol @config
else
@protocolHandler = new TelnetAppProtocol @config
# register devices
deviceConfigDef = require("./device-config-schema")
for device in deviceConfigTemplates
className = device.class
# convert camel-case classname to kebap-case filename
filename = className.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
classType = require('./devices/' + filename)(env)
@base.debug "Registering device class #{className}"
@framework.deviceManager.registerDeviceClass(className, {
configDef: deviceConfigDef[className],
createCallback: @_callbackHandler(className, classType)
})
for provider in actionProviders
className = provider.replace(/(^[a-z])|(\-[a-z])/g, ($1) ->
$1.toUpperCase().replace('-','')) + 'Provider'
classType = require('./actions/' + provider)(env)
@base.debug "Registering action provider #{className}"
@framework.ruleManager.addActionProvider(new classType @framework)
# auto-discovery
@framework.deviceManager.on('discover', (eventData) =>
@framework.deviceManager.discoverMessage 'pimatic-denon-avr', 'Searching for AVR controls'
for device in deviceConfigTemplates
matched = @framework.deviceManager.devicesConfig.some (element, iterator) =>
#console.log element.class is device.class, element.class, device.class
element.class is device.class
if not matched
process.nextTick @_discoveryCallbackHandler('pimatic-denon-avr', device.name, device)
)
_discoveryCallbackHandler: (pluginName, deviceName, deviceConfig) ->
return () =>
@framework.deviceManager.discoveredDevice pluginName, deviceName, deviceConfig
_callbackHandler: (className, classType) ->
# this closure is required to keep the className and classType
# context as part of the iteration
return (config, lastState) =>
return new classType(config, @, lastState)
# ###Finally
# Create a instance of my plugin
# and return it to the framework.
return new DenonAvrPlugin