This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm that you accept these cookies being set.

Rudimentary telnet control over Pioneer AVR Receiver
#1
Music 
I thought I'd share this work in progress. I am an amateur both in Lua and in KNX... so take with a huge grain of salt. 

All it does is open a socket to a defined IP and Port and send a telnet command... then add an "Enter"... then wait for an answer. It closes right after that, as the Pioneer does not like more than one telnet connection at a time and I don't want to hog the port.

Copy this code into a user library. I called mine user.telnet

Code:
--Sends a single telnet command to a host and port
--it returns one line answer
function telnetsend(host, port, command)

 nextline = '\r\n'

 local socket = require("socket")
 local tcp = assert(socket.tcp())
 res, err = tcp:connect(host, port)
 res, err = tcp:send(command .. nextline)
 local answer = tcp:receive('*l')
 tcp:close()
 return answer
end

--Sets the volume to a numeric value
--takes into account, that Pioneer increments the volume in
--2 step intervals. Takes a host ip and port as input.
function setvolume(host, port, volumelevel)

 local currentvolume = getvolume(host, port)

 if volumelevel > currentvolume then
   for i = currentvolume, volumelevel -1, 2 do
     telnetsend(host,port,VOLUME_UP)
   end
 else
   for i = volumelevel, currentvolume-1, 2 do
     telnetsend(host,port,VOLUME_DOWN)
   end
 end
 
 currentvolume = getvolume(host, port)
 return currentvolume

end

--Returns the current volume
function getvolume(host, port)
 
 local currentvolume = tonumber(string.sub(telnetsend(host,port,VOLUME_QUERY), 5))
 return currentvolume
 
end

--Turns reciever on off
function soundonoff(host, port, onoff)
 if onoff == true then
   telnetsend(host,port,POWER_ON)
   local status = telnetsend(host,port,POWER_QUERY)
   if status == POWER_ONSTATE then
     return true
   else
     alert("Could not turn on sound")
   end    
 else
   telnetsend(host,port,POWER_OFF)
   local status = telnetsend(host,port,POWER_QUERY)
   if status == POWER_OFFSTATE then
     return false
   else
     alert("Could not turn off sound")
   end
 end
end


and put this code into a separate user.script. I called mine user.pioneer

All it does is define a huge amount of variables with the correct telnet commands for the Pioneer avr 529 I have. Change, reduce as needed. There are most probably errors in the codes, as these where copied and pasted from around the web.

Code:
   -- Main zone
      POWER_ON="PO"
      POWER_OFF="PF"
   POWER_QUERY="?P"
   POWER_ONSTATE="PWR2"
   POWER_OFFSTATE="PWR0"
   
   -- Volume
   VOLUME_UP="VU"
   VOLUME_DOWN="VD"
   VOLUME_QUERY="?V"
   VOLUME_SET="VL"
   
   -- Mute
   MUTE=    "MO"
   UNMUTE=    "MF"
   MUTE_QUERY="?M"

   -- Source / Input channel
   SOURCE_QUERY="?F"
   SOURCE_UP=    "FU"
   SOURCE_DOWN="FD"
   SOURCE_SET=    "%02dFN"
   SOURCE_DVD=    "04FN"
   SOURCE_BD=    "25FN"
   SOURCE_TVSAT="05FN"
   SOURCE_DVR_BDR="15FN"
   SOURCE_VIDEO1="10FN"
   SOURCE_VIDEO2="14FN"
   SOURCE_HDMI1="19FN"
   SOURCE_HDMI2="20FN"
   SOURCE_HDMI3="21FN"
   SOURCE_HDMI4="22FN"
   SOURCE_HDMI5="23FN"
   SOURCE_HMG=    "26FN"
   SOURCE_IPOD_USB="17FN"
   SOURCE_XMRADIO="18FN"
   SOURCE_CD="01FN"
   SOURCE_CDR_TAPE="03FN"
   SOURCE_TUNER="02FN"
   SOURCE_PHONO="00FN"
   SOURCE_MULTICH_IN="12FN"
   SOURCE_ADAPTER_PORT="33FN"
   SOURCE_HDMI_CYCL="31FN"
   
   -- Listening mode
   LISTENING_MODE="%04dSR"
    LISTENING_MODE_QUERY="?L"
    
    -- tone control
    TONE_ON="TO1"
    TONE_BYPASS="TO0"
    TONE_QUERY="?TO"
   
    -- bass control
    BASS_INCREMENT="BI"
    BASS_DECREMENT="BD"
    BASS_QUERY="?BA"
    
    -- treble control
    TREBLE_INCREMENT="TI"
    TREBLE_DECREMENT="TD"
    TREBLE_QUERY="?TR"
    
    -- Speaker configuration
    SPEAKERS="%01dSPK"
    SPEAKERS_OFF="0SPK"
    SPEAKERS_A="1SPK"
    SPEAKERS_B="2SPK"
    SPEAKERS_A_B="3SPK"
    
    -- HDMI outputs configuration
    HDMI_OUTPUT="%01dHO"
    HDMI_OUT_ALL="0HO"
    HDMI_OUT_1="1HO"
    HDMI_OUT_2="2HO"
    
    -- HDMI audio configuration
    HDMI_AUDIO_AMP="0HA"
    HDMI_AUDIO_THROUGH="1HA"
    
    -- PQLS setting
    PQLS_OFF="0PQ"
    PQLS_AUTO="1PQ"
    
    -- Zone 2 control
    ZONE2_POWER_ON=        "APO"
    ZONE2_POWER_OFF="APF"
    ZONE2_POWER_QUERY="?AP"
    ZONE2_INPUT="%02dZS"
    ZONE2_INPUT_DVD="04ZS"
    ZONE2_INPUT_TV_SAT="05ZS"
    ZONE2_INPUT_DVR_BDR="15ZS"
    ZONE2_INPUT_VIDEO1="10ZS"
    ZONE2_INPUT_VIDEO2="14ZS"
    ZONE2_INPUT_HMG="26ZS"
    ZONE2_INPUT_IPOD="17ZS"
    ZONE2_INPUT_XMRADIO="18ZS"
    ZONE2_INPUT_CD=    "01ZS"
    ZONE2_INPUT_CDR_TAPE="03ZS"
    ZONE2_INPUT_TUNER="02ZS"
    ZONE2_INPUT_ADAPTER="33ZS"
    ZONE2_INPUT_SIRIUS="27ZS"
    ZONE2_INPUT_QUERY="?ZS"
    ZONE2_VOLUME_UP="ZU"
    ZONE2_VOLUME_DOWN="ZD"
    ZONE2_VOLUME=    "%02ZV",    "ZV"
    ZONE2_VOLUME_QUERY="?ZV"
    ZONE2_MUTE=        "Z2MO"
    ZONE2_UNMUTE=    "Z2MF"
    ZONE2_MUTE_QUERY="?Z2M"
    
    -- zone 3 control
    ZONE3_POWER_ON=        "BPO"
    ZONE3_POWER_OFF="BPF"
    ZONE3_POWER_QUERY="?BP"
    ZONE3_INPUT="%02dZT"
    ZONE3_INPUT_DVD="04ZT"
    ZONE3_INPUT_TV_SAT="05ZT"
    ZONE3_INPUT_DVR_BDR="15ZT"
    ZONE3_INPUT_VIDEO1="10ZT"
    ZONE3_INPUT_VIDEO2="14ZT"
    ZONE3_INPUT_HMG="26ZT"
    ZONE3_INPUT_IPOD="17ZT"
    ZONE3_INPUT_XMRADIO="18ZT"
    ZONE3_INPUT_CD=    "01ZT"
    ZONE3_INPUT_CDR_TAPE="03ZT"
    ZONE3_INPUT_TUNER="02ZT"
    ZONE3_INPUT_ADAPTER="33ZT"
    ZONE3_INPUT_SIRIUS="27ZT"
    ZONE3_INPUT_QUERY="?ZT"
    ZONE3_VOLUME_UP="YU"
    ZONE3_VOLUME_DOWN="YD"
    ZONE3_VOLUME=    "%02YV"
    ZONE3_VOLUME_QUERY="?YV"
    ZONE3_MUTE=        "Z3MO"
    ZONE3_UNMUTE=    "Z3MF"
    ZONE3_MUTE_QUERY="?Z3M"
    
    -- radio tuner
    TUNER_FREQ_INCREMENT="TFI"
    TUNER_FREQ_DECREMENT="TFD"
    TUNER_FREQ_QUERY_AM="?FR"
    TUNER_FREQ_QUERY_FM="?FR"
    TUNER_BAND=        "TB"
    TUNER_PRESET=    "%01dTP"
    TUNER_CLASS=    "TC"
    TUNER_PRESET_INCREMENT="TPI"
    TUNER_PRESET_DECREMENT="TPD"
    TUNER_PRESET_QUERY="?TP"
    
    -- iPod control
    IPOD_PLAY=            "00IP"
    IPOD_PAUSE=        "01IP"
    IPOD_STOP=            "02IP"
    IPOD_PREVIOS=        "03IP"
    IPOD_NEXT=            "04IP"
    IPOD_REV=            "05IP"
    IPOD_FWD=            "06IP"
    IPOD_REPEAT=        "07IP"
    IPOD_SHUFFLE=        "08IP"
    IPOD_DISPLAY=        "09IP"
    IPOD_CONTROL=        "10IP"
    IPOD_CURSOR_UP=    "13IP"
    IPOD_CURSOR_DOWN="14IP"
    IPOD_CURSOR_LEFT="15IP"
    IPOD_CURSOR_RIGHT="16IP"
    IPOD_ENTER=        "17IP"
    IPOD_RETURN=        "18IP"
    IPOD_TOP_MENU=        "19IP"
    IPOD_KEY_OFF=        "KOF"
    
    ADAPTER_PLAY_PAUSE="20BT"
    ADAPTER_PLAY="10BT"
    ADAPTER_PAUSE="11BT"
    ADAPTER_STOP="12BT"
    ADAPTER_PREVIOUS="13BT"
    ADAPTER_NEXT="14BT"
    ADAPTER_REV="15BT"
    ADAPTER_FWD="16BT"
   
   -- Home Media Gateway (HMG) control
   HMG_NUMKEY="%02dNW"
   HMG_NUMKEY_0="00NW"
   HMG_NUMKEY_1="01NW"
   HMG_NUMKEY_2="02NW"
   HMG_NUMKEY_3="03NW"
   HMG_NUMKEY_4="04NW"
   HMG_NUMKEY_5="05NW"
   HMG_NUMKEY_6="06NW"
   HMG_NUMKEY_7="07NW"
   HMG_NUMKEY_8="08NW"
   HMG_NUMKEY_9="09NW"
   HMG_PLAY="10NW"
   HMG_PAUSE="11NW"
   HMG_PREV="12NW"
   HMG_NEXT="13NW"
   HMG_DISPLAY="18NW"
   HMG_STOP="20NW"
   HMG_UP=    "26NW"
   HMG_DOWN="27NW"
   HMG_RIGHT="28NW"
   HMG_LEFT="29NW"
   HMG_ENTER="30NW"
   HMG_RETURN="31NW"
   HMG_PROGRAM="32NW"
   HMG_CLEAR="33NW"
   HMG_REPEAT="34NW"
   HMG_RANDOM="35NW"
   HMG_MENU="36NW"
   HMG_EDIT="37NW"
   HMG_CLASS="38NW"
   
   -- display info text
   DISPLAY_INFO_QUERY="?FL"

Lastly call the above user libraries from a KNX object like the following:

Code:
require('user.telnet')
require('user.pioneer')

--we write the returned set volume to the status object
grp.write('11/2/2', soundonoff('192.168.0.24',8102,event.getvalue()))

The 11/2/2 Object is the status object, that gets written with the return value of soundonoff.
Reply


Forum Jump: