pimatic-denon-avr
Version:
Pimatic Plugin to monitor and control a Denon or Marantz AV Receiver
99 lines (85 loc) • 3.58 kB
text/coffeescript
module.exports = (env) ->
Promise = env.require 'bluebird'
_ = env.require 'lodash'
commons = require('pimatic-plugin-commons')(env)
# Device class representing an the power state of the Denon AVR
class DenonAvrMasterVolume extends env.devices.DimmerActuator
# Create a new DenonAvrMasterVolume device
# [Object] config device configuration
# [DenonAvrPlugin] plugin plugin instance
# [Object] lastState state information stored in database
constructor: (, , lastState) ->
= commons.base @, .class
= .id
= .name
= .normalize .interval, 2
= .volumeDecibel
= .normalize .volumeLimit, 0, 99
= .normalize .maxAbsoluteVolume, 0, 99
= .debug || false
=
.protocolHandler.on 'response',
= _.cloneDeep()
.volume = {
description: "Volume"
type: "number"
acronym: 'VOL'
}
.volume.unit = 'dB' if
= 0
= false
= 0
super()
process.nextTick () =>
true
destroy: () ->
.cancelUpdate()
.protocolHandler.removeListener 'response',
super()
_requestUpdate: (immediate=false) ->
.cancelUpdate()
.debug "Requesting update"
.protocolHandler.sendRequest 'MV', '?', immediate
.catch (error) =>
.error "Error:", error
.finally () =>
.scheduleUpdate , * 1000, true
_createResponseHandler: () ->
return (response) =>
.debug "Response", response.matchedResults
if response.command is 'MV'
response.param
response.param
else if response.command is 'MVMAX'
= Math.min , 0 + response.param
_volumeToDecibel: (volume, zeroDB=80) ->
return - zeroDB
_volumeToNumber: (volume) ->
if _.isString volume
decimal = if volume.length is 3 then 0.5 else 0
return decimal + parseInt volume.substring(0, 2)
else
return volume
_setVolume: (volume) ->
if
.setAttribute 'volume', volume
else
.setAttribute 'volume', volume
_levelToVolumeParam: (level) ->
num = Math.round * level / 100
return if num < 10 then "0" + num else num + ""
_volumeParamToLevel: (param) ->
num = param
return Math.min 100, Math.round(num * 100 / )
changeDimlevelTo: (newLevel) ->
return new Promise (resolve, reject) =>
if > 0 and newLevel >
newLevel =
.protocolHandler.sendRequest('MV', ).then =>
newLevel
resolve()
.catch (err) =>
.rejectWithErrorString reject, err
getVolume: () ->
return new Promise.resolve