Volume Control
Above 70% is loud!!!
Instructions
* Create a virtual device dimmer switch called "Denon Volume" (if you followed guide to the v0.2 script you already have one)
* if you followed guide to the v0.2 script delete the mute virtual sensor it is now incorporated in the volume device
* use the new script
* Change the denon.sh script that both the mute & the volume devices point to "Denon Volume"
*
http://ip.or.host.here.local/MainZone/i ... Mute%2Foff in the on action
*
http://ip.or.host.here.local/MainZone/i ... eMute%2Fon in the off action
* Add lua code to your device events
Code: Select all
commandArray = {}
-- very laze here assume relative volume setting on the denon amp...
IP = '10.0.0.91'
if devicechanged['Denon Volume'] then
NewLevel = otherdevices_svalues['Denon Volume']
if NewLevel ~= "Off" and NewLevel ~= "0" then
SendLevel = NewLevel - 79.5
os.execute ("curl http://" .. (IP) .. "/MainZone/index.put.asp?cmd0=PutSystem_OnStandby%2FON")
os.execute ("curl http://" .. (IP) .. "/MainZone/index.put.asp?cmd0=PutVolumeMute%2Foff")
os.execute ("curl http://" .. (IP) .. "/MainZone/index.put.asp?cmd0=PutMasterVolumeSet/" .. (SendLevel))
end
end
return commandArray
The new script to handle mute/volume change correctly
Code: Select all
#!/bin/bash
#
# Domoticz Denon Script
# ---------------------
#
# Created 2016 Trixwood
#
# 0.1 first try
# 0.2 TC only update when needed
# 0.3 Mute & Volume feature
#
#
# to do: check if domoticz online else do not send anything
#
# Enable debug remove the # from the echo's (only volume uses echo... will change that todo ;-)
# Settings
DOMO_IP="10.0.0.1" # Domoticz IP Address
DOMO_PORT="8090" # Domoticz Port
DENONIP="10.0.0.91" # Denon IP Address
DENON_IDX="155" # On/Off (Switch) IDX *1
DENON_STATUS_IDX="290" # Status (Text) IDX
DENON_MUTE_IDX="117" # Absolute Volume (Slider) IDX (same as Absolute Volume)
DENON_VOL_REL_IDX="59" # Relative Volume (Sound Volume) IDX
DENON_VOL_ABS_IDX="117" # Absolute Volume (Slider) IDX
DENON_SURROUND_IDX="149" # Surround (Selector Switch) IDX
DENON_INPUT_IDX="133" # Input (Selector Switch) IDX *1
DENON_NET_INPUT_IDX="289" # Net input (Text) IDX
DENON_AIRPLAY_IDX="150" # Airplay? (Switch)
# *1 You need additional virtual device which this one is a slave
# use ip for domoticz not the hostname, else password protection will fail…
# Selector Switches with 13 entries from -6db -5db .. -1db 0db .. 6db
#DENON_BASS_IDX="287" # BASS (Selector Switch) IDX
#DENON_TREBLE_IDX="288" # TREBLE (Selector Switch) IDX
# check if receiver in online
PINGTIME=`ping -c 1 -q $DENONIP | awk -F"/" '{print $5}' | xargs`
#
# Default Values
# todo only update when value changed... sleepy time now ;-)
#
function defaulting {
#echo Defaulting...
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_STATUS_IDX&nvalue=0&svalue=No%20Denon%20Detected" &> /dev/null
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_AIRPLAY_IDX&switchcmd=Off" &> /dev/null
# curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_MUTE_IDX&switchcmd=On" &> /dev/null
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_IDX&switchcmd=Off" &> /dev/null
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_VOL_REL_IDX&nvalue=0&svalue=-80.5" &> /dev/null
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_VOL_ABS_IDX&switchcmd=Set%20Level&level=0" &> /dev/null
}
# we can ping the machine
if expr "$PINGTIME" '>' 0
then
# is there a denon?
AVexists=$(curl -s http://$DENONIP/goform/formMainZone_MainZoneXml.xml | tee denon.mainzone.settings | grep "<Power><value>" &> /dev/null)
# yes!
if [ $? -eq 0 ] ; then
#
# Airplay
# -------
#
#
# decode new value
curl -s http://$DENONIP/goform/formNetAudio_StatusXml.xml > denon.net.settings
AVairplay=$(grep -Eo "AirPlay" < denon.net.settings)
# decode old value
AVairplayold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_AIRPLAY_IDX" | grep Status)
AVairplayold=${AVairplayold##*Status\" : \"}
AVairplayold=${AVairplayold//\",/}
#echo "Airplay: $AVairplay ($AVairplayold)"
if [ "$AVairplay" == "AirPlay" ]; then
if [ "$AVairplayold" == "Off" ] ; then
#echo "Airplay: Switching On"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_AIRPLAY_IDX&switchcmd=On" &> /dev/null
fi
else
if [ "$AVairplayold" == "On" ] ; then
#echo "Airplay: Switching Off"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_AIRPLAY_IDX&switchcmd=Off" &> /dev/null
fi
fi
#
# Mute
# ----
#
# decode new value
AVmute=$(sed -n -e 's/.*\<Mute><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
# decode old value
AVmuteold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_MUTE_IDX" | grep "Status")
AVmuteold="${AVmuteold##*Status\" : \"}"
AVmuteold=${AVmuteold//\",/}
#echo "Mute: $AVmute ($AVmuteold)"
# only switch when value is changed
if [ "$AVmute" == "on" ] && [ "$AVmuteold" != "Off" ] ; then
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_MUTE_IDX&switchcmd=Off" &> /dev/null
#echo "Mute: Switching On"
fi
if [ "$AVmute" == "off" ] && [ "$AVmuteold" == "Off" ] ; then
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_MUTE_IDX&switchcmd=On" &> /dev/null
#echo "Mute: Switching Off"
fi
#
# Volume
# ----------
#
# Note that Denon Can So 0.5 steps of Decibel is set to Relative that means with relative you have twice the amount of resolution
# So resolution will be lost if your denon is set to relative volume since the slider only half the resolution and sound volume
# does not have half steps
#
# Range Relative -80.5 dB to +18
# Absolute 0..99
#
# that will not convert well :-/
# decode new value
AVisvolumerelative=$(sed -n -e 's/.*\<VolumeDisplay><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
AVvolume=$(sed -n -e 's/.*\<MasterVolume><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
# compensate for Denon Volume setting
if [ "$AVvolume" == "--" ] ; then
AVvolume="0"
AVisvolumerelative="Infinity"
fi
if [ "$AVisvolumerelative" == "Relative" ] ; then
#echo "Volume: Relative"
AVvolumeAbs=$(echo "80.5 + $AVvolume" | bc)
AVvolumeRel=$AVvolume
else
#echo "Volume: Absolute"
AVvolumeRel=$(echo "80.5 - $AVvolume" | bc)
AVvolumeAbs=$AVvolume
fi
# exterminate, exterminate, convert... convert...
AVvolumeAbs=$((${AVvolumeAbs//\./}/10))
# decode old value
AVvolumeoldAbs=$(($(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_VOL_ABS_IDX" | grep Data | grep -Eo '[0-9]{1,4}')+1))
#echo "Volume: $AVvolumeRel db $AVvolumeAbs ($AVvolumeoldAbs)"
# only switch when value is changed
if [ "$AVmute" == "off" ] && [ "$AVvolumeAbs" != "$AVvolumeoldAbs" ]; then
#echo "Volume: Switching $AVvolumeRel db $AVvolumeAbs"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_VOL_REL_IDX&nvalue=0&svalue=$AVvolumeRel" &> /dev/null
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_VOL_ABS_IDX&switchcmd=Set%20Level&level=$AVvolumeAbs" &> /dev/null
fi
# CHECK FOR OLD VALUE FIRST!!!! FIX FIX
if [ "$AVmute" == "on" ] ; then
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_VOL_REL_IDX&nvalue=0&svalue=$AVvolumeRel" &> /dev/null
fi
#
# Net Source
# ----------
#
#
# decode new value
AVnet=$(sed -n -e 's/.*\<NetFuncSelect><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
# decode old value
AVnetold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_NET_INPUT_IDX" | grep Data)
AVnetold="${AVnetold##*Data\" : \"}"
AVnetold=${AVnetold//\",/}
#echo "Net Input: $AVnet ($AVnetold)"
# only switch when value is changed
if [ "$AVnet" != "$AVnetold" ]; then
#echo "Net Input: Switching $AVnet"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_NET_INPUT_IDX&nvalue=0&svalue=$AVnet" &> /dev/null
fi
#
# Source Input
# ------------
#
# decode new value
AVinput=$(sed -n -e 's/.*\<InputFuncSelect><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
# AVswitchlevel=0
if [ "$AVinput" == "GAME" ] ; then
AVswitchlevel=10
fi
if [ "$AVinput" == "GAME2" ] ; then
AVswitchlevel=20
fi
if [ "$AVinput" == "TUNER" ] ; then
AVswitchlevel=30
fi
if [ "$AVinput" == "DVD" ] ; then
AVswitchlevel=40
fi
if [ "$AVinput" == "SAT" ] ; then
AVswitchlevel=50
fi
if [ "$AVinput" == "BD" ] ; then
AVswitchlevel=60
fi
if [ "$AVinput" == "TV" ] ; then
AVswitchlevel=70
fi
if [ "$AVinput" == "CD" ] ; then
AVswitchlevel=80
fi
if [ "$AVinput" == "V.AUX" ] ; then
AVswitchlevel=100
fi
if [ "$AVinput" == "DOCK" ] ; then
AVswitchlevel=110
fi
if [ "$AVinput" == "SOURCE" ] ; then
AVswitchlevel=120
fi
if [ "$AVinput" == "NET/USB" ] ; then
AVswitchlevel=90
fi
# decode old value
AVinputold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_INPUT_IDX" | grep Status | grep -Eo '[0-9]{1,4}' )
#echo "Input: $AVswitchlevel ($AVinputold)"
# only switch when value is changed
if [ "$AVswitchlevel" != "$AVinputold" ]; then
#echo "Input: Switching $AVinput"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_INPUT_IDX&switchcmd=Set%20Level&level=$AVswitchlevel" &> /dev/null
fi
#
# Surround
# --------
#
# decode new value
AVsurround=$(sed -n -e 's/.*\<selectSurround><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings | sed -e 's/[[:space:]]*$//')
if [ "$AVsurround" == "STEREO" ] ; then
AVswitchlevel=10
fi
if [ "$AVsurround" == "DIRECT" ] ; then
AVswitchlevel=20
fi
if [ "$AVsurround" == "DOLBY DIGITAL" ] ; then
AVswitchlevel=40
fi
if [ "$AVsurround" == "PURE DIRECT" ] ; then
AVswitchlevel=30
fi
if [ "$AVsurround" == "DTS SURROUND" ] ; then
AVswitchlevel=50
fi
if [ "$AVsurround" == "MCH STEREO" ] ; then
AVswitchlevel=60
fi
if [ "$AVsurround" == "MONO MOVIE" ] ; then
AVswitchlevel=70
fi
if [ "$AVsurround" == "VIDEO GAME" ] ; then
AVswitchlevel=80
fi
if [ "$AVsurround" == "JAZZ CLUB" ] ; then
AVswitchlevel=90
fi
if [ "$AVsurround" == "ROCK ARENA" ] ; then
AVswitchlevel=100
fi
if [ "$AVsurround" == "VIRTUAL" ] ; then
AVswitchlevel=110
fi
if [ "$AVsurround" == "MATRIX" ] ; then
AVswitchlevel=120
fi
# decode old value
AVsurroundold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_SURROUND_IDX" | grep Status | grep -Eo '[0-9]{1,4}' )
#echo "Surround: $AVswitchlevel ($AVsurroundold)"
# only switch when value is changed
if [ "$AVswitchlevel" != "$AVsurroundold" ]; then
#echo "Surround: Switching $AVsurround"
curl -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_SURROUND_IDX&switchcmd=Set%20Level&level=$AVswitchlevel" &> /dev/null
fi
#
# Status
# ------
#
# decode new value
AVstatus=$(sed -n -e 's/.*\<Power><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
# decode old value
AVstatusold=$(curl -s "http://$DOMO_IP:$DOMO_PORT/json.htm?type=devices&rid=$DENON_IDX" | grep Status)
AVstatusold="${AVstatusold##*Status\" : \"}"
AVstatusold=${AVstatusold//\",/}
#echo "Power: $AVstatus ($AVstatusold)"
# only switch when value is changed
if [ "$AVstatus" == "ON" ] && [ "$AVstatusold" == "Off" ] ; then
#echo "Power: Switching On"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_IDX&switchcmd=On" &> /dev/null
fi
if [ "$AVstatus" == "STANDBY" ] && [ "$AVstatusold" == "On" ] ; then
#echo "Power: Switching Off"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_IDX&switchcmd=Off" &> /dev/null
fi
if ([ "$AVstatus" == "ON" ] && [ "$AVstatusold" == "Off" ]) || ([ "$AVstatus" == "STANDBY" ] && [ "$AVstatusold" == "On" ]) ; then
#echo "Power: Status Updated"
curl -s -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=udevice&idx=$DENON_STATUS_IDX&nvalue=0&svalue=$AVstatus" &> /dev/null
fi
#
# Cleaning Up
#
#rm denon.mainzone.settings
#rm denon.net.settings
# Bass
# AVbass=$(./denon.telnet.sh PSBAS ? | sed 's/PSBAS //' | grep -Eo '[0-9]{1,4}')
# AVbass=$(((AVbass-43)*10))
# if [ "$AVbass" == "-430" ] ; then
# #echo ""
# else
# curl -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_BASS_IDX&switchcmd=Set%20Level&level=$AVbass" &> /dev/null
# fi
# only one telnet allowed :-/
# sleep 2
# Treble
# AV=$(./denon.telnet.sh PSTRE ?)
##echo $AV
# sleep 2
# AVtreble=$(./denon.telnet.sh PSTRE ? | sed 's/PSTRE //' | grep -Eo '[0-9]{1,4}')
# AVtreble=$(((AVtreble-43)*10))
# if [ "$AVtreble" == "-430" ] ; then
# #echo ""
# else
# curl -i -H "Accept: application/json" "http://$DOMO_IP:$DOMO_PORT/json.htm?type=command¶m=switchlight&idx=$DENON_TREBLE_IDX&switchcmd=Set%20Level&level=$AVtreble" &> /dev/null
# fi
else
# no denon xml from http server do something!
defaulting
fi
else
# we could not even ping it defaulting
defaulting
fi
Now you have a device that mute and set the volume...

Signed TRiXWooD