Hallo --
Ich habe einen Onkyo TX-NR609 A/V-Receiver im Wohnzimmer. Das Gerät hat Zone-2-Anschlüsse, mit denen ich kleine Lautsprecher im Essbereich speise - so kann ich dort Musik hören, ohne eine zusätzliche Installation zu brauchen.
Weil das mit der Fernbedienung allerdings unpraktisch ist, suchte ich einen Weg, über einen KNX-Taster die Zone-2-Lautsprecher einzuschalten und die Lautstärke zu verändern.
Der Receiver hat - wie wohl einige andere aktuelle Onkyo-Modelle - einen Netzwerkanschluss, der Befehle im ISCP-Format entgegen nimmt. Man kann den Receiver so konfigurieren, dass er auch im ausgeschaltetem Zustand auf Befehle reagiert und Statusmeldungen ausgibt.
Um das jetzt auf meinem raspberry pi mit linknx zu nutzen, habe ich mir ein kleines perl-Programm zusammengestückelt, das eine Verbindung zum Receiver aufrechterhält, das Statusmeldungen liest und Befehle entgegennimmt.
Die Logik ist recht banal: das Programm nimmt auf localhost port 60128 Befehle entgegen und schickt sie weiter an den Receiver. Die Befehle schicke ich aus linknx als shell-cmd.
So bewirkt z.B. ein "echo 'ZPW01' | nc localhost 60128", dass der Zone-2-Verstärker eingeschaltet wird, oder ein "echo 'ZVLUP' | nc localhost 60128" regelt die Lautstärke einen Tick höher.
Ich kann also eine Linknx-Rule auf eine Taster-GA legen, und darüber den Verstärker ansprechen.
Parallel hört das Programm auf Statusmeldungen des Receivers, und setzt je nach Aktion GA's. Der Receiver bestätigt nicht nur, was er über's Netz bekommt, sondern auch Einstellungen per FB bzw am Gerät selbst. Die Meldungen und Befehle sind meist in einen Identifier und einen Wert aufgeteilt, so kriegt man auf obiges "ZVLUP" eine Statusmeldung der Art "ZVL35" zurück - ZVL steht für Zone 2 Volume, 35 ist der aktuelle Wert. Man kann auch ein "ZVLQSTN" (Question) schicken und kriegt die gleiche Meldung als Statusmeldung. Diese Meldungen lösen wiederum Shellbefehle aus, die bei mir Werte auf GA's schreiben.
Wozu das Ganze?
Der KNX-Taster ist bestellt, aber ich schalte den Verstärker schon per Visu ein/aus. Ich wechsle auch die Source, stelle die Lautstärke ein und mute. Sobald der Taster da ist, kann ich meine Zone-2-Lautsprecher bequem vom Essbereich aus schalten.
Ausserdem werde ich je nach Source-Wahl am Receiver Steckdosen schalten: der Subwoofer wird mit dem Receiver geschaltet, die XBox meiner Frau mit dem hohen Standby-Verbrauch kriegt nur dann Strom, wenn der Receiver die jeweilige Source aufruft, und auch der xbmc-client wird nur bei Bedarf geschaltet.
Der Receiver selbst kommt übrigens stromlos, wenn niemand zuhause oder alle im Bett sind: der Standby-Verbrauch bei eingeschaltetem Ethernetport ist nämlich recht hoch. Er nimmt das nicht übel, sondern fährt beim Strom-Einschalten da weiter, wo er aufgehört hatte. Das Script restarte ich beim Strom-Einschalten, damit es die Verbindung neu aufbaut.
Ich hab' das Script mal angehängt, man muss eigentlich nur IP-Adresse und Port setzen, und dann shell-Befehle, die von den Statusmeldungen ausgelöst werden sollen definieren.
Mein iscp.pl script:
ISCP-Befehle:
AVForums.com - View Single Post - Onkyo (TX-NR 1007) Webinterface Programming
Ich habe einen Onkyo TX-NR609 A/V-Receiver im Wohnzimmer. Das Gerät hat Zone-2-Anschlüsse, mit denen ich kleine Lautsprecher im Essbereich speise - so kann ich dort Musik hören, ohne eine zusätzliche Installation zu brauchen.
Weil das mit der Fernbedienung allerdings unpraktisch ist, suchte ich einen Weg, über einen KNX-Taster die Zone-2-Lautsprecher einzuschalten und die Lautstärke zu verändern.
Der Receiver hat - wie wohl einige andere aktuelle Onkyo-Modelle - einen Netzwerkanschluss, der Befehle im ISCP-Format entgegen nimmt. Man kann den Receiver so konfigurieren, dass er auch im ausgeschaltetem Zustand auf Befehle reagiert und Statusmeldungen ausgibt.
Um das jetzt auf meinem raspberry pi mit linknx zu nutzen, habe ich mir ein kleines perl-Programm zusammengestückelt, das eine Verbindung zum Receiver aufrechterhält, das Statusmeldungen liest und Befehle entgegennimmt.
Die Logik ist recht banal: das Programm nimmt auf localhost port 60128 Befehle entgegen und schickt sie weiter an den Receiver. Die Befehle schicke ich aus linknx als shell-cmd.
So bewirkt z.B. ein "echo 'ZPW01' | nc localhost 60128", dass der Zone-2-Verstärker eingeschaltet wird, oder ein "echo 'ZVLUP' | nc localhost 60128" regelt die Lautstärke einen Tick höher.
Ich kann also eine Linknx-Rule auf eine Taster-GA legen, und darüber den Verstärker ansprechen.
Parallel hört das Programm auf Statusmeldungen des Receivers, und setzt je nach Aktion GA's. Der Receiver bestätigt nicht nur, was er über's Netz bekommt, sondern auch Einstellungen per FB bzw am Gerät selbst. Die Meldungen und Befehle sind meist in einen Identifier und einen Wert aufgeteilt, so kriegt man auf obiges "ZVLUP" eine Statusmeldung der Art "ZVL35" zurück - ZVL steht für Zone 2 Volume, 35 ist der aktuelle Wert. Man kann auch ein "ZVLQSTN" (Question) schicken und kriegt die gleiche Meldung als Statusmeldung. Diese Meldungen lösen wiederum Shellbefehle aus, die bei mir Werte auf GA's schreiben.
Wozu das Ganze?
Der KNX-Taster ist bestellt, aber ich schalte den Verstärker schon per Visu ein/aus. Ich wechsle auch die Source, stelle die Lautstärke ein und mute. Sobald der Taster da ist, kann ich meine Zone-2-Lautsprecher bequem vom Essbereich aus schalten.
Ausserdem werde ich je nach Source-Wahl am Receiver Steckdosen schalten: der Subwoofer wird mit dem Receiver geschaltet, die XBox meiner Frau mit dem hohen Standby-Verbrauch kriegt nur dann Strom, wenn der Receiver die jeweilige Source aufruft, und auch der xbmc-client wird nur bei Bedarf geschaltet.
Der Receiver selbst kommt übrigens stromlos, wenn niemand zuhause oder alle im Bett sind: der Standby-Verbrauch bei eingeschaltetem Ethernetport ist nämlich recht hoch. Er nimmt das nicht übel, sondern fährt beim Strom-Einschalten da weiter, wo er aufgehört hatte. Das Script restarte ich beim Strom-Einschalten, damit es die Verbindung neu aufbaut.
Ich hab' das Script mal angehängt, man muss eigentlich nur IP-Adresse und Port setzen, und dann shell-Befehle, die von den Statusmeldungen ausgelöst werden sollen definieren.
Mein iscp.pl script:
Code:
#!/usr/bin/perl -w use strict; use IO::Socket; my $host = '192.168.4.52'; my $port = '60128'; my $logfile = '/var/log/iscp.log'; my %actions = ( "PWR00", '/usr/local/bin/groupwrite "ip:127.0.0.1" "3/3/0" "0"', "PWR01", '/usr/local/bin/groupwrite "ip:127.0.0.1" "3/3/0" "1"', "ZPW00", '/usr/local/bin/groupwrite "ip:127.0.0.1" "3/3/2" "0"', "ZPW01", '/usr/local/bin/groupwrite "ip:127.0.0.1" "3/3/2" "1"', "MVL", '/usr/local/bin/groupswrite "ip:127.0.0.1" "3/3/1" "VALUE"', "ZVL", '/usr/local/bin/groupswrite "ip:127.0.0.1" "3/3/3" "VALUE"', "SLI", '/usr/local/bin/groupswrite "ip:127.0.0.1" "3/3/5" "VALUE"', "SLZ", '/usr/local/bin/groupswrite "ip:127.0.0.1" "3/3/6" "VALUE"' ); # -------------------------- # nothing to edit after this # -------------------------- # daemonize my $pid= fork(); exit if $pid; die "Couldn't fork: $!" unless defined($pid); for my $handle (*STDIN,*STDOUT,*STDERR){ open($handle, "+<", "/dev/null") || die "can't reopen $handle to /dev/null: $!"; } use POSIX; POSIX::setsid() or die "Can't start a new session: $!"; my $time_to_die=0; sub signal_handler { $time_to_die=1; } $SIG{INT}=$SIG{TERM}=$SIG{HUP}=\&signal_handler; until ($time_to_die) { my $sock = new IO::Socket::INET( PeerAddr => $host, PeerPort => $port, Proto => 'tcp'); $sock or die "no socket :$!"; $sock->autoflush(1); my $socklocal = new IO::Socket::INET( LocalPort => $port, Type => SOCK_STREAM, Listen => 5, Reuse => 1 ); $socklocal or die "no socket :$!"; my($kid,$line,$cmd,$length,$code,$in); die "fork fail: $!" unless defined($kid = fork); if ($kid) { while (my $client=$socklocal->accept) { $in=<$client>; $cmd="!1".$in; $length=length($cmd)+1; $code =chr($length); # setup the string we are sending ... $line = "ISCP\x00\x00\x00\x10\x00\x00\x00$code\x01\x00\x00\x00".$cmd."\x0D"; # send it ! print $sock $line; } # kill the child process kill(TERM => $kid); } else { # child reads from socket while (defined($sock->recv(my $data,1024))) { my $chunk=substr($data,18,5); while ((my $key, my $value)=each(%actions)) { if (!index($chunk, $key)) { if (index($value, "VALUE")>0) { $_=$chunk; my $result=s/$key//; $chunk=$_; substr($value, index($value, 'VALUE'),5 )=$chunk } open FILE, ">>", "$logfile" or die $!; my $t = time(); my $now = localtime($t); print FILE "$now \t Chunk $chunk \t Key $key \t Value $value\n"; close(FILE); system($value); } } } close $sock; } }
AVForums.com - View Single Post - Onkyo (TX-NR 1007) Webinterface Programming
Kommentar