Denon
TRiXWooD Scripts
viewtopic.php?f=23&t=12145&p=87422#p87422
I have these scripts running with a lot of virtual devices for denon av1912. It will also run for any other denon, marantz if you change some value's. It's fun in progress. Almost had the bass/treble working. But a selector switch with more then 10 buttons does not work in Version: 3.4978 of domoticz.
still... have phun...
Update Changed it so it only updated values when changed... v0.2a
Update Fixed AirPlay & Mute bug v0.2b
Update v3 of script with volume Control can be found here
http://domoticz.com/forum/viewtopic.php ... 421#p85421
Update example xml files from av1912 for comparison
http://domoticz.com/forum/viewtopic.php ... =60#p91937, and domotixs had selector switches support!!! (thanks!)
Todo:
- not write to filesystem first... (i'm still learning bash, day 3

tuner support?
back menu button...
denon.telnet.sh
Code: Select all
#!/usr/bin/expect
set timeout 3
set dencmd [lindex $argv]
log_user 0
spawn telnet 10.0.0.91
expect "Trying"
expect {
timeout {
send_user "\rTimeout waiting for Denon response.\r"
send_user "$expect_out(buffer)\r"
exit
}
"Connection refused" {
send_user "UNABLE\n"
exit
}
"BridgeCo AG Telnet server\r\n"
}
send "$dencmd\r"
expect "$dencmd\r\n"
expect "*\r"
send_user "$expect_out(buffer)\n"
exit
you can telnet to the device example:
gets the bas value (between 44 and 56)
volume to 80... etc..
remember you can only use one telnet connection...!!!!
https://www.google.nl/search?q=protocol ... ocol+denon for descriptions or other controls...
Ok, now the basics... we want to get some value's like volume, source input, power status, airplay and we want some control, like source select, mute, standby, individual speaker volume control, the works. Preferably without telnet, due to the one connection restriction. So our first try ended up like this (bass/treble work in progress):

- 2.jpg (77.78 KiB) Viewed 7319 times

- 1.png (88.42 KiB) Viewed 7319 times
then my main script is
denon.sh
v0.2b fixed Airplay and Double Mute
New version here:
http://domoticz.com/forum/viewtopic.php ... 421#p85421
Code: Select all
#!/bin/bash
#
# Domoticz Denon Script
# ---------------------
#
# Created 2016 Trixwood
#
# 0.1 first try
# 0.2 TC only update when needed
#
#
# 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="114" # Mute (Switch) IDX
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
#
# 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 [ "$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 [ "$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
#
# 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
#
# 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" == "off" ] && [ "$AVmuteold" == "On" ] ; 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 Off"
fi
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=On" &> /dev/null
#echo "Mute: Switching On"
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
Old code: v0.1
Code: Select all
#!/bin/bash
# Settings
DENONIP="10.0.0.91" # Denon IP Address
# ip not host, else password protection will fail…
DOMO_IP="10.0.0.1" # Domoticz IP Address
DOMO_PORT="8090" # Domoticz Port
DENON_IDX="155" # On/Off (Switch) IDX *1
DENON_MUTE_IDX="114" # Mute (Switch) IDX
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="115" # Net input (Text) IDX
DENON_STATUS_IDX="62" # Status (Text) IDX
DENON_AIRPLAY_IDX="150" # Airplay? (Switch)
# Selector Switches with 13 entries from -6db -5 .. -1db 0db 1db 2db ... 6db
DENON_BASS_IDX="287" # BASS (Selector Switch) IDX
DENON_TREBLE_IDX="288" # TREBLE (Selector Switch) IDX
# *1 You need two!!! of these virtual sensors to work!!!
# check if receiver in online
PINGTIME=`ping -c 1 -q $DENONIP | awk -F"/" '{print $5}' | xargs`
# 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)
if [ $? -eq 0 ] ; then
curl -s http://$DENONIP/goform/formNetAudio_StatusXml.xml > denon.net.settings
AVairplay=$(grep "AirPlay" < denon.net.settings)
if [ $? -eq 0 ] ; then
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
else
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
# Volume
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)
if [ "$AVisvolumerelative" == "Relative" ] ; then
AVvolumeAbs=$(echo "80 + $AVvolume" | bc)
AVvolumeRel=$AVvolume
else
AVvolumeRel=$(echo "80 - $AVvolume" | bc)
AVvolumeAbs=$AVvolume
fi
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
# 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 3
# Treble
# AV=$(./denon.telnet.sh PSTRE ?)
#echo $AV
sleep 3
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
# Net Source
AVnet=$(sed -n -e 's/.*\<NetFuncSelect><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
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
# Input
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
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
# Surround
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
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
# Status
AVstatus=$(sed -n -e 's/.*\<Power><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
if [ "$AVstatus" == "ON" ] ; then
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
else
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=switchlight&idx=$DENON_MUTE_IDX&switchcmd=On" &> /dev/null
fi
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
# Mute
AVmute=$(sed -n -e 's/.*\<Mute><value>\(.*\)<\/value>.*/\1/p' denon.mainzone.settings)
echo $AVStatus
if [ "$AVmute" == "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
else
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
fi
#rm denon.mainzone.settings
#rm denon.net.settings
else
# no denon xml from http server do something!
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_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
fi
else
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
You have to configure the virtual devices, change the ip addresses and port to the correct ones and set the correct id's before running, also the AVsurround variable can contain different text if you do not have an 1912 model. Just get the correct value's by entering this address in your browser (replace the ip 10.0.0.91 with the ip of your denon stereo)
http://10.0.0.91/goform/formMainZone_MainZoneXml.xml
Note that the script does not care if your denon is setup with relative or absolute volume (-80db .. 18db, or 0 ..100)
For the input selector and the power on/off switch you need two virtual devices. A status one which receives the status from the script and another selector set up like this:

- 3.jpg (221.39 KiB) Viewed 7319 times
Use ON or OFF with capitals, I know one is not showing, you make more screenshot

Why? because with one virtual switch the denon keeps switching on/off/on/off.... Sub/Slave Devices solves it! The virtual devices are just clones of each other, with the status one receiving the status from the script and due to the slave position it update the Denon Power switch, but NOT trigger its On/Off Actions. The scripts runs every 10 seconds using cron or launchcontrol. On OSX install the following launchagent in /Library/LaunchAgents or ~/Library/LaunchAgents. Change the domoticz installed folder to your own folder instead of /Users/Trixwood/Smarthome/. For OSX use
http://www.soma-zone.com/LaunchControl
Code: Select all
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.domoticz.denon</string>
<key>ProgramArguments</key>
<array>
<string>/Users/Trixwood/Smarthome/domoticz/scripts/denon.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>15</integer>
<key>WorkingDirectory</key>
<string>/Users/Trixwood/Smarthome/domoticz/scripts</string>
</dict>
</plist>
Improvements
Not using the disk as cache but memory to store the xml. This wil probably wear some kb down with constant read and write. If there is anybody good in bash script please let me know how to pipe, cat, grep or whatever to do the same without writing it to disk...
more command and url to use
https://knx-user-forum.de/forum/support ... ng-steuern
http://www.openremote.org/display/docs/ ... TP+Control