Yamaha AVR Netzwerksteuerung / Samsung SOAP - Demo / Denon AVR Netzwerksteuerung

  • Hey,

    hier mal ein kleines Demo-Skript wie man AV-Receiver von Yamaha übers Netzwerk steuern kann.
    Ich hab nur den Post-Request eingebaut. Get macht bei einem cmdline Tool wenig Sinn.

    Benutzung: Man Übergibt den gewünschten Befehle wie z.B.:

    Zitat

    <YAMAHA_AV cmd="PUT"><System><Power_Control><Power>On</Power></Power_Control></System></YAMAHA_AV>


    per cmdline und der Befehl wird an den Yamaha AVR gesendet.
    In der INI muss eigentlich nur die entsprechende IP des Receivers eingetragen werden.

    Unterstützte Receiver: RX-A3010, RX-A2010, RX-A1010, RX-A810, RX-A710, RX-V3071, RX-V2071, RX-V1071, RX-V871, RX-V771. RX-V671 (möglicherweise auch andere).

    Spoiler anzeigen
    [autoit]


    #include <WinHTTP.au3>
    #include <Misc.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;;
    ;; Author: nuts (http://www.autoit.de)
    ;;

    [/autoit] [autoit][/autoit] [autoit]

    Global $title = "Yamaha_Network"
    _Singleton($title)
    Global $version = "0.1"
    Global $konfigdir = @AppDataCommonDir & "\my_scripts\"
    Global $ini = $konfigdir & $title & ".ini"
    Global $log = $konfigdir & $title & ".log"
    If Not FileExists($ini) Then _Createini()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Yamaha_IP = IniRead($ini, "Settings", "IP", "")
    Global $Yamaha_Port = IniRead($ini, "Settings", "Port", 80)
    Global $writelog = Int(IniRead($ini, "Settings", "Debug", 1))
    Global $POSTdata = ""

    [/autoit] [autoit][/autoit] [autoit]

    If $writelog Then _FileWriteLog($log, "Startup - Version: " & $version, 1)

    [/autoit] [autoit][/autoit] [autoit]

    ;Global $power_off='<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>Standby</Power></Power_Control></System></YAMAHA_AV>'
    ;Global $power_on'<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>On</Power></Power_Control></System></YAMAHA_AV>'
    ;Global $Mute_on='<YAMAHA_AV cmd="PUT"><Main_Zone><Volume><Mute>On</Mute></Volume></Main_Zone></YAMAHA_AV>'
    ;Global $Mute_off='<YAMAHA_AV cmd="PUT"><Main_Zone><Volume><Mute>Off</Mute></Volume></Main_Zone></YAMAHA_AV>'

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $CmdLine[0] > 0 Then
    If $writelog Then _FileWriteLog($log, "cmdlineRaw: " & $CmdLineRaw, 1)
    $POSTdata = StringReplace($CmdLineRaw, "-", "", 1)
    _SendXML($Yamaha_IP, $Yamaha_Port, $POSTdata)
    _Exit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $writelog Then _FileWriteLog($log, "cmdline[0]: " & $CmdLine[0], 1)
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _SendXML($IP, $Port, $data)
    Local $hOpen, $hConnect, $hRequest, $header, $response
    $hOpen = _WinHttpOpen()

    [/autoit] [autoit][/autoit] [autoit]

    $hConnect = _WinHttpConnect($hOpen, $IP, $Port)

    [/autoit] [autoit][/autoit] [autoit]

    $hRequest = _WinHttpOpenRequest($hConnect, "POST", "/YamahaRemoteControl/ctrl")
    _WinHttpSendRequest($hRequest, 'Content-type: text/xml' & @CRLF, $data)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpReceiveResponse($hRequest)
    $header = _WinHttpQueryHeaders($hRequest)
    If $writelog Then _FileWriteLog($log, $header, 1)
    ;ConsoleWrite($header&@crlf)

    [/autoit] [autoit][/autoit] [autoit]

    If _WinHttpQueryDataAvailable($hRequest) Then

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $response &= _WinHttpReadData($hRequest)
    Until @error
    If $writelog Then _FileWriteLog($log, $response, 1)
    ;ConsoleWrite($response&@crlf)

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_SendXML

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Local $size = FileGetSize($log)
    If $size / 1024 > 1000 Then
    Local $aread
    _FileReadToArray($log, $aread)
    If @error Then
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    Else
    FileDelete($log)
    Local $count = 20
    If $aread[0] < $count Then
    $count = $aread[0]
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    EndIf
    _FileWriteFromArray($log, $aread, 1, $count)
    EndIf
    EndIf
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Createini()
    If Not FileExists($konfigdir) Then DirCreate($konfigdir)
    IniWrite($ini, "Settings", "IP", "")
    IniWrite($ini, "Settings", "Port", 80)
    IniWrite($ini, "Settings", "Debug", 0)

    [/autoit] [autoit][/autoit] [autoit]

    IniWrite($ini, "Info", "power_off", '<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>Standby</Power></Power_Control></System></YAMAHA_AV>')
    Iniwrite($ini, "Info", "power_on", '<YAMAHA_AV cmd="PUT"><System><Power_Control><Power>On</Power></Power_Control></System></YAMAHA_AV>')
    Iniwrite($ini, "Info", "Mute_on", '<YAMAHA_AV cmd="PUT"><Main_Zone><Volume><Mute>On</Mute></Volume></Main_Zone></YAMAHA_AV>')
    IniWrite($ini, "Info", "Mute_off", '<YAMAHA_AV cmd="PUT"><Main_Zone><Volume><Mute>Off</Mute></Volume></Main_Zone></YAMAHA_AV>')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _FileWriteLog($log, "Ini wurde nicht gefunden und neu erstellt :" & $ini, 1)
    ShellExecute($ini)
    _Exit()
    EndFunc ;==>_Createini

    [/autoit]

    Weiterführende Links:
    Wie bastelt man den Befehlscode zusammen (Beispiele in der INI Sektion "Info"): http://www.ip-symcon.de/forum/f39/howt…-steuern-18509/
    Sonstiges (andere AVR's, EG Plugins, UPnP Quälerei): http://www.dvbviewer.tv/forum/topic/48…rker-uber-netz/


    Gruß nuts

  • Neu hinzugekommen eine Testtool für die UPnP/SOAP Steuerung.
    Getestet mit meinem Samsung TV.

    Spoiler anzeigen
    [autoit]


    <?xml version='1.0' encoding='utf-8'?>"
    <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>
    <s:Body>
    <ns0:SetVolume xmlns:ns0='urn:schemas-upnp-org:service:RenderingControl:1'>
    <DesiredVolume>0</DesiredVolume>
    <InstanceID>0</InstanceID>
    <Channel>Master</Channel>
    </ns0:SetVolume>
    </s:Body>
    </s:Envelope>

    [/autoit]


    SetVolume=0
    Ist in der im Anhang hinterlegten XML voreingestellt.
    Eingetragen werden muss für einen "SetVolume" Test nur die IP eures Samsung TV (ab C-Serie sollte es funktionieren).

    Wer das mit anderen Geräten testen will muss womöglich die XML und die Werte in der INI anpassen.
    Würde mich auch interessieren ob dieses System geräteübergreifend einsetzbar ist.
    Mit meinem Yamaha Receiver bekomm ichs z.B. nicht hin (Diskussion s. Link zum DVBViewer-Forum im Startpost).

  • Denon Steuerung über telnet:

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;;
    ;; Author: nuts (http://www.autoit.de)
    ;;

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $title = "Denon_Network"
    _Singleton($title)
    Global $version = "0.1"
    Global $konfigdir = @AppDataCommonDir & "\my_scripts\"
    Global $ini = $konfigdir & $title & ".ini"
    Global $log = $konfigdir & $title & ".log"
    If Not FileExists($ini) Then _Createini()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Denon_IP = IniRead($ini, "Settings", "IP", "")
    Global $Denon_Port = IniRead($ini, "Settings", "Port", 23)
    Global $writelog = Int(IniRead($ini, "Settings", "Debug", 1))
    Global $POSTdata = ""
    If $writelog Then _FileWriteLog($log, "Startup - Version: " & $version, 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Global $testcommand_on="PWON"
    ;Global $testcommand_stanbdy="PWSTANDBY"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If $CmdLine[0] > 0 Then
    If $writelog Then _FileWriteLog($log, "cmdlineRaw: " & $CmdLineRaw, 1)
    $POSTdata = StringReplace($CmdLine[1], "-", "", 1)
    _telnet_send($Denon_IP, $Denon_Port, $POSTdata)
    _Exit()
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $writelog Then _FileWriteLog($log, "cmdlineRaw: " & $CmdLineRaw, 1)
    Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _telnet_send($IP, $Port, $data)

    [/autoit] [autoit][/autoit] [autoit]

    Local $response, $socket

    [/autoit] [autoit][/autoit] [autoit]

    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $socket = TCPConnect($IP, 23)
    If $socket > 0 Then
    $bytes = TCPSend($socket, $data & @CR)
    If $bytes > 0 Then
    Sleep(100)
    $response = TCPRecv($socket, 512);
    If @error Then
    If $writelog Then _FileWriteLog($log, "np response", 1)
    Return SetError(1, 0, 0)
    Else
    ConsoleWrite($response)
    EndIf
    Else
    If $writelog Then _FileWriteLog($log, "Failed to send data", 1)
    Return SetError(1, 0, 0)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    TCPCloseSocket($socket)
    TCPShutdown()

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_telnet_send

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    Local $size = FileGetSize($log)
    If $size / 1024 > 1000 Then
    Local $aread
    _FileReadToArray($log, $aread)
    If @error Then
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    Else
    FileDelete($log)
    Local $count = 20
    If $aread[0] < $count Then
    $count = $aread[0]
    _FileWriteLog($log, $title & ".log konnte nicht automatisch verkleinert werden", 1)
    EndIf
    _FileWriteFromArray($log, $aread, 1, $count)
    EndIf
    EndIf
    Exit
    EndFunc ;==>_Exit

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Createini()
    If Not FileExists($konfigdir) Then DirCreate($konfigdir)
    IniWrite($ini, "Settings", "IP", "")
    IniWrite($ini, "Settings", "Port", 23)
    IniWrite($ini, "Settings", "Debug", 0)

    [/autoit] [autoit][/autoit] [autoit]

    IniWrite($ini, "Info", "power_standby", "PWSTANDBY")
    IniWrite($ini, "Info", "power_on", "PWON")

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _FileWriteLog($log, "Ini wurde nicht gefunden und neu erstellt :" & $ini, 1)
    ShellExecute($ini)
    _Exit()
    EndFunc ;==>_Createini

    [/autoit]
  • Hi,

    ich habe Schwierigkeiten mit dem Yamaha Network Skript,

    hab es runtergeladen, weiß aber nicht wie und wo ich die IP nun eintragen kann,

    beim öffnen der .exe passiert erst mal nichts.

    grüße Inco

  • Die IP des AV-Receivers musst du in die INI eintragen. Diese findest du hier: @AppDataCommonDir & "\my_scripts"
    Anschließend muss der entsprechende Befehl per cmdline (Kommandoparameter) an das Skript übermittelt werden. Ist der Schritt soweit klar?

    P.S. Das sind auch nur Demoskripte und keine ausgearbeiteten Anwendungen für Endbenutzer.

  • 1. Schritt: Yamaha_network_control.zip aus dem Startpost herunterladen

    2. Schritt: Yamaha_Network_Control.exe einmal ausführen

    3. Schritt: Die INI müsste sich öffnen
    In der INI jetzt die IP deines AV-Receivers eintragen (z.B. IP=192.168.1.100) und die Änderungen abspeichern

    4. Schritt: Eine Verknüpfung zur Yamaha_Network_Control.exe und dort den gewünschten Kommandoparameter eintragen (Rechtsklick => Ziel):
    z.B. um den Receiver einzuschalten:
    %\Yamaha_Network_Control.exe <YAMAHA_AV cmd="PUT"><System><Power_Control><Power>On</Power></Power_Control></System></YAMAHA_AV>

  • Hallo,

    Dann Stelle ich mine Frage doch im Thread - und schon mal Danke für die rasche Antwort!!

    Ich würde gerne nicht nur Befehle zu meinem Yamaha RX-V1073 senden, sondern auch zb. die aktuelle Lautstärke abfragen.
    Ich weiß leider nicht so ganz, was ich an deinem Script abändern müsste, sodass das möglich ist.

    Der XML-Code für die Lautstärkenabfrage:

    Spoiler anzeigen


    <YAMAHA_AV cmd="GET"><Main_Zone><Basic_Status><Volume><Lvl><Val>GetParam</Val></Lvl></Volume></Basic_Status></Main_Zone></YAMAHA_AV>

    Danke schon mal für das, was du schon bis jetzt veröffentlich hast! :thumbup:

  • Hi,

    mal vorab: Ich habe keinen Yamaha Receiver mehr und kann daher selbst nicht testen.
    Habe die Yamaha API nicht im Kopf, aber was steht in der Variablen $response wenn du deinen XML Code verwendest?

    [autoit]


    If $writelog Then _FileWriteLog($log, $header, 1)
    ;ConsoleWrite($header&@crlf)

    [/autoit][autoit][/autoit][autoit]

    If _WinHttpQueryDataAvailable($hRequest) Then

    [/autoit][autoit][/autoit][autoit]

    Do
    $response &= _WinHttpReadData($hRequest)
    Until @error
    If $writelog Then _FileWriteLog($log, $response, 1)
    ;ConsoleWrite($response&@crlf)

    [/autoit][autoit][/autoit][autoit]

    EndIf

    [/autoit]
  • Hallo,

    Also mit meinem oben geposteten XML-Code kommt nichts zurück!

    [autoit]

    Do
    $response &= _WinHttpReadData($hRequest)
    Until @error
    ConsoleWrite("-"&$response&"-")
    If $writelog Then _FileWriteLog($log, $response, 1)
    ;ConsoleWrite($response&@crlf)

    [/autoit]


    In der Console wird -- zurückgegeben...

  • Hallo,

    Funktioniert leider auch nicht. Lasse ich den Header in die Console schreiben, wird mir folgendes zurück gegeben:

    HTTP
    HTTP/1.1 400 Bad Request
    Connection: close
    Content-Length: 0
    Server: AV_Receiver/3.1 (RX-V1073)
  • Vielleicht mit diesem XML Code (wieder auf POST umstellen):

    Zitat

    '<YAMAHA_AV cmd="GET"><Main_Zone><Volume><Lvl>GetParam</Lvl></Volume></Main_Zone></YAMAHA_AV>'

  • Hm schwierig so ohne Yamaha Receiver kann ich auch nicht schnell testen, sondern müsste die Doku durcharbeiten und dafür fehlt mir etwas die Zeit im Moment.
    Vielleicht liest hier noch jemand mit Yamaha Receiver und etwas mehr Erfahrung mit und kann helfen?

  • Ok, schade - Aber trotzdem Danke für deine Mühe!

    Ist auch schon so toll meinen Verstärker ganz easy vom Tablet (Windows) aus zu steuern.. die GET-Sachen hätte ich nur für eine schöne GUI haben wollen!

    Gute Arbeit! :thumbup: