From b78eeb2c8df66358529707dccd0b0551d6ba7ffe Mon Sep 17 00:00:00 2001 From: hofrichter Date: Wed, 25 Jun 2014 22:53:21 +0000 Subject: [PATCH] added set and readings for tone, bass and treble git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@6167 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/70_PIONEERAVR.pm | 126 ++++++++++++++++++++++++++++--------- 1 file changed, 97 insertions(+), 29 deletions(-) diff --git a/fhem/FHEM/70_PIONEERAVR.pm b/fhem/FHEM/70_PIONEERAVR.pm index 5764d2aa3..132a9ba18 100644 --- a/fhem/FHEM/70_PIONEERAVR.pm +++ b/fhem/FHEM/70_PIONEERAVR.pm @@ -19,9 +19,8 @@ # along with Fhem. If not, see . # ############################################################################## -# by hofrichter # -# This module handles the communication with a Pioneer AVR and controls the main zone. +# This module handles the communication with a Pioneer AV receiver and controls the main zone. # this is the module for the communication interface and to control the main zone - # it opens the device (via rs232 or TCP), and its ReadFn is called after the global select reports, that data is available. @@ -57,6 +56,7 @@ use strict; use warnings; use SetExtensions; use Time::HiRes qw(gettimeofday); +use DevIo; if( $^O =~ /Win/ ) { require Win32::SerialPort; } else { @@ -210,6 +210,10 @@ PIONEERAVR_Define($$) { 'muteOn' => 'MO', 'muteOff' => 'MF', 'muteToggle' => 'MZ', + 'bassUp' => 'BI', + 'bassDown' => 'BD', + 'trebleUp' => 'TI', + 'trebleDown' => 'TD', 'input' => 'FN', 'inputUp' => 'FU', 'inputDown' => 'FD', @@ -269,37 +273,42 @@ PIONEERAVR_Define($$) { # ----------------Human Readable command mapping table----------------------- $hash->{helper}{GETS} = { 'main' => { - 'power' => '?P', - 'volume' => '?V', - 'mute' => '?M', - 'input' => '?F', + 'bass' => '?BA', + 'channel' => '?PR', 'display' => '?FL', + 'input' => '?F', 'listeningMode' => '?S', 'listeningModePlaying' => '?L', + 'model' => '?RGD', + 'mute' => '?M', + 'networkStandby' => '?STJ', + 'power' => '?P', + 'softwareVersion' => '?SSI', 'speakers' => '?SPK', 'speakerSystem' => '?SSF', - 'channel' => '?PR', + 'tone' => '?TO', 'tunerFrequency' => '?FR', 'tunerChannelNames' => '?TQ', - 'model' => '?RGD', - 'networkStandby' => '?STJ', - 'softwareVersion' => '?SSI' + 'treble' => '?TR', + 'volume' => '?V' }, 'zone2' => { - 'power' => '?AP', - 'volume' => '?ZV', + 'bass' => '?ZGB', + 'input' => '?ZS', 'mute' => '?Z2M', - 'input' => '?ZS' + 'power' => '?AP', + 'treble' => '?ZGC', + 'volume' => '?ZV' }, 'zone3' => { - 'power' => '?BP', - 'volume' => '?YV', + 'input' => '?ZT', 'mute' => '?Z3M', - 'input' => '?ZT' + 'power' => '?BP', + 'volume' => '?YV' }, 'hdZone' => { - 'power' => '?ZEP', - 'input' => '?ZEA' + 'input' => '?ZEA', + 'power' => '?ZEP' } }; # ----------------Human Readable command mapping table----------------------- @@ -737,9 +746,10 @@ PIONEERAVR_Set($@) . " channel:1,2,3,4,5,6,7,8,9" . " listeningMode:" . join(',', sort values (%{$hash->{helper}{LISTENINGMODES}})) - . " volumeUp:noArg volumeDown:noArg mute:on,off,toggle statusRequest:noArg volume:slider,0,1,100" + . " volumeUp:noArg volumeDown:noArg mute:on,off,toggle tone:on,bypass bass:slider,-6,1,6" + . " treble:slider,-6,1,6 statusRequest:noArg volume:slider,0,1,100" . " volumeStraight:slider,-80,1,12" - . " speakers:off,A,B,A+B"; + . " speakers:off,A,B,A+B tunerPresetName"; my $currentInput= ReadingsVal($name,"input",""); @@ -758,7 +768,7 @@ PIONEERAVR_Set($@) # set blink is part of the setextensions # but blink does not make sense for an PioneerAVR so we disable it here } elsif ( $cmd eq "blink" ) { - return "blink does not make too much sense with an PIONEER AVR isn't it?"; + return "blink does not make too much sense with an PIONEER AV receiver isn't it?"; } return "No Argument given" if ( !defined( $a[1] ) ); @@ -771,7 +781,7 @@ PIONEERAVR_Set($@) ### Power on ### Command: PO ### according to "Elite & Pioneer FY14AVR IP & RS-232 7-31-13.xlsx" (notice) we need to send and - ### wait 100ms before the first command is accepted by the Pioneer AVR + ### wait 100ms before the first command is accepted by the Pioneer AV receiver } elsif ( $cmd eq "on" ) { Log3 $name, 5, "PIONEERAVR $name: Set $cmd -> 2x newline + 2x PO with 100ms break in between"; my $setCmd= ""; @@ -804,7 +814,7 @@ PIONEERAVR_Set($@) #### play, pause, stop, random, repeat #### Only available if the input is one of: #### ipod, internetRadio, mediaServer, favorites, adapterPort, mhl - #### we need to send different Pioneer Avr commands + #### we need to send different commands to the Pioneer AV receiver #### depending on that input } elsif ($cmd ~~ @setsPlayer) { Log3 $name, 5, "PIONEERAVR $name: set $cmd for inputNr: $inputNr (player command)"; @@ -843,7 +853,8 @@ PIONEERAVR_Set($@) #### commands with argument(s) } elsif(@a > 2) { my $arg = $a[2]; - ####Input (all available Inputs of the Pioneer Avr -> see 'get $name loadInputNames') + my $arg2 = $a[3]; + ####Input (all available Inputs of the Pioneer AV receiver -> see 'get $name loadInputNames') #### according to http://www.fhemwiki.de/wiki/DevelopmentGuidelinesAV #### first try the aliasName (only if this fails try the default input name) if ( $cmd eq "input" ) { @@ -885,6 +896,33 @@ PIONEERAVR_Set($@) my $zahl = sprintf "%d", $arg * 1.85; PIONEERAVR_Write($hash, sprintf "%03dVL", $zahl); return undef; + ####tone (on|bypass) + } elsif ( $cmd eq "tone" ) { + if ($arg eq "on") { + PIONEERAVR_Write($hash, "1TO"); +# readingsSingleUpdate($hash, "tone", "on", 1 ); + } + elsif ($arg eq "bypass") { + PIONEERAVR_Write($hash, "0TO"); +# readingsSingleUpdate($hash, "tone", "bypass", 1 ); + } else { + my $err= "PIONEERAVR $name: Error: unknown set ... tone argument: $arg !"; + Log3 $name, 5, $err; + return $err; + } + return undef; + ####bass (-6 - 6) in dB + } elsif ( $cmd eq "bass" ) { + Log3 $name, 5, "PIONEERAVR $name: set $cmd ".dq($arg); + my $zahl = sprintf "%d", ($arg * (-1)) + 6; + PIONEERAVR_Write($hash, sprintf "%02dBA", $zahl); + return undef; + ####treble (-6 - 6) in dB + } elsif ( $cmd eq "treble" ) { + Log3 $name, 5, "PIONEERAVR $name: set $cmd ".dq($arg); + my $zahl = sprintf "%d", ($arg * (-1)) + 6; + PIONEERAVR_Write($hash, sprintf "%02dTR", $zahl); + return undef; ####Mute (on|off|toggle) ####according to http://www.fhemwiki.de/wiki/DevelopmentGuidelinesAV } elsif ( $cmd eq "mute" ) { @@ -1064,6 +1102,30 @@ sub PIONEERAVR_Read($) readingsBulkUpdate($hash, "volumeStraight", $volume/2 - 80 ); readingsBulkUpdate($hash, "volume", sprintf "%d", $volume/1.85 ); Log3 $name, 5, "PIONEERAVR $name: ". dq($line) ." interpreted as: Main Zone - New volume = ".$volume . " (raw volume data)."; + + # Main zone tone (0 = bypass, 1 = on) + } elsif ( $line =~ m/^TO([0|1])$/) { + if ($1 == "1") { + readingsBulkUpdate($hash, "tone", "on" ); + Log3 $name, 5, "PIONEERAVR $name: ".dq($line) ." interpreted as: Main Zone - tone on "; + } + else { + readingsBulkUpdate($hash, "tone", "bypass" ); + Log3 $name, 5, "PIONEERAVR $name: ".dq($line) ." interpreted as: Main Zone - tone bypass "; + } + # Main zone bass (-6 to +6 dB) + # works only if tone=on + } elsif ( $line =~ m/^BA(\d\d)$/) { + readingsBulkUpdate($hash, "bass", ($1 *(-1)) + 6 ); + Log3 $name, 5, "PIONEERAVR $name: ". dq($line) ." interpreted as: Main Zone - New bass = ".$1 . " (raw bass data)."; + + # Main zone treble (-6 to +6 dB) + # works only if tone=on + } elsif ( $line =~ m/^TR(\d\d)$/) { + readingsBulkUpdate($hash, "treble", ($1 *(-1)) + 6 ); + Log3 $name, 5, "PIONEERAVR $name: ". dq($line) ." interpreted as: Main Zone - New treble = ".$1 . " (raw treble data)."; + + # Main zone Mute } elsif ( substr($line,0,3) eq "MUT" ) { my $mute = substr($line,3,1); @@ -1269,8 +1331,8 @@ sub PIONEERAVR_Read($) } elsif ( $line =~ m/^B00$/ ) { Log3 $hash, 5,"PIONEERAVR $name: Error nr $line received (BUSY Now AV Receiver is Busy. Please wait few seconds.)"; # network standby - # STJ1 -> on -> Pioneer AVR can be switched on from standby - # STJ0 -> off -> Pioneer AVR cannot be switched on from standby + # STJ1 -> on -> Pioneer AV receiver can be switched on from standby + # STJ0 -> off -> Pioneer AV receiver cannot be switched on from standby } elsif ( $line =~ m/^STJ([0|1])/) { if ($1 == "1") { readingsBulkUpdate($hash, "networkStandby", "on" ); @@ -1350,7 +1412,7 @@ sub PIONEERAVR_RCmakenotify($$) { } ##################################### -# Default-remote control layout for Pioneer AVR +# Default-remote control layout for PIONEERAVR sub RC_layout_PioneerAVR() { my $ret; @@ -1386,7 +1448,7 @@ RC_layout_PioneerAVR() {

This module is based on the Pioneer documentation - and tested with a Pioneer AVR VSX-923 from Pioneer. + and tested with a Pioneer AV receiver VSX-923 from Pioneer.

Note: this module requires the Device::SerialPort or Win32::SerialPort module if the module is connected via serial Port or USB. @@ -1436,6 +1498,9 @@ RC_layout_PioneerAVR() {
  • volumeDown
    decreases the main volume by 0.5dB
  • volumeStraight<-80.5 ... 12>
    same values for volume as shown on the display of the Pioneer AV rreceiver
  • mute
  • +
  • tone
  • +
  • bass <-6 ... 6>
    tone control of bass from -6dB to + 6dB (works only if tone is on)
  • +
  • treble <-6 ... 6>
    tone control of treble from -6dB to + 6dB (works only if tone is on)
  • input
    the list of possible (i.e. not deactivated) inputs is read in during Fhem start and with get statusRequest
  • inputUp
    change input to next input
  • @@ -1503,7 +1568,7 @@ RC_layout_PioneerAVR() {

    Dieses Modul basiert auf der Pioneer documentation - und ist mit einem Pioneer AVR VSX-923 von Pioneer getestet. + und ist mit einem Pioneer AV Receiver VSX-923 von Pioneer getestet.

    Achtung: Dieses Modul benötigt die Perl-Module Device::SerialPort oder Win32::SerialPort wenn die Datenverbindung via USB bzw. rs232 Port erfolgt. @@ -1558,6 +1623,9 @@ RC_layout_PioneerAVR() {
  • volumeDown
    Lautstärke der Main Zone um 0.5dB verringern
  • volumeStraight<-80.5 ... 12>
    Einstellen der Lautstärke der Main Zone mit einem Wert, wie er am Display des Pioneer AV Receiver angezeigt wird
  • mute der Main Zone
  • +
  • tone
  • +
  • bass <-6 ... 6>
    Bass von -6dB bis + 6dB (funktioniert nur wenn tone = on)
  • +
  • treble <-6 ... 6>
    Höhen (treble) von -6dB bis + 6dB (funktioniert nur wenn tone = on)
  • input
    Die Liste der verfügbaren (also der nicht deaktivierten) Eingangsquellen wird beim Start von Fhem und auch mit get statusRequest eingelesen
  • inputUp
    nächste Eingangsquelle der Main Zone auswählen