diff --git a/fhem/FHEM/71_YAMAHA_AVR.pm b/fhem/FHEM/71_YAMAHA_AVR.pm index 70a2f6465..690124e32 100755 --- a/fhem/FHEM/71_YAMAHA_AVR.pm +++ b/fhem/FHEM/71_YAMAHA_AVR.pm @@ -131,11 +131,6 @@ YAMAHA_AVR_Define($$) YAMAHA_AVR_getInputs($hash); } - # set the volume-smooth-change attribute only if it is not defined, so no user values will be overwritten - # - # own attribute values will be overwritten anyway when all attr-commands are executed from fhem.cfg - $attr{$name}{"volume-smooth-change"} = "1" unless(exists($attr{$name}{"volume-smooth-change"})); - unless(exists($hash->{helper}{AVAILABLE}) and ($hash->{helper}{AVAILABLE} == 0)) { $hash->{helper}{AVAILABLE} = 1; @@ -246,28 +241,16 @@ YAMAHA_AVR_Get($@) $what = $a[1]; - if(exists($hash->{READINGS}{$what})) + return ReadingsVal($hash->{NAME}, $what, "") if(defined(ReadingsVal($hash->{NAME}, $what, undef))); + + $return = "unknown argument $what, choose one of"; + + foreach my $reading (keys %{$hash->{READINGS}}) { - if(defined($hash->{READINGS}{$what})) - { - return $hash->{READINGS}{$what}{VAL}; - } - else - { - return "no such reading: $what"; - } - } - else - { - $return = "unknown argument $what, choose one of"; - - foreach my $reading (keys %{$hash->{READINGS}}) - { - $return .= " $reading:noArg"; - } - - return $return; + $return .= " $reading:noArg"; } + + return $return; } @@ -310,8 +293,7 @@ YAMAHA_AVR_Set($@) "off:noArg ". "volumeStraight:slider,-80,1,16 ". "volume:slider,0,1,100 ". - "volumeUp ". - "volumeDown ". + (defined(ReadingsVal($name, "volume", undef)) ? "volumeUp volumeDown " : ""). (exists($hash->{helper}{INPUTS}) ? "input:".$inputs_comma." " : ""). "mute:on,off,toggle ". "remoteControl:setup,up,down,left,right,return,option,display,tunerPresetUp,tunerPresetDown,enter ". @@ -417,11 +399,11 @@ YAMAHA_AVR_Set($@) # Depending on the status response, use the short or long Volume command my $volume_cmd = (YAMAHA_AVR_isModel_DSP($hash) ? "Vol" : "Volume"); - if( $a[2] eq "on" or ($a[2] eq "toggle" and ReadingsVal($hash->{NAME}, "mute", "off") eq "off")) + if( $a[2] eq "on" or ($a[2] eq "toggle" and ReadingsVal($name, "mute", "off") eq "off")) { YAMAHA_AVR_SendCommand($hash, "<$zone><$volume_cmd>On", $what, "on"); } - elsif($a[2] eq "off" or ($a[2] eq "toggle" and ReadingsVal($hash->{NAME}, "mute", "off") eq "on")) + elsif($a[2] eq "off" or ($a[2] eq "toggle" and ReadingsVal($name, "mute", "off") eq "on")) { YAMAHA_AVR_SendCommand($hash, "<$zone><$volume_cmd>Off", $what, "off"); } @@ -439,13 +421,13 @@ YAMAHA_AVR_Set($@) { $target_volume = YAMAHA_AVR_volume_rel2abs($a[2]); } - elsif($what eq "volumeDown") + elsif($what eq "volumeDown" and defined(ReadingsVal($name, "volume", undef))) { - $target_volume = YAMAHA_AVR_volume_rel2abs($hash->{READINGS}{volume}{VAL} - ((defined($a[2]) and $a[2] =~ /^\d+$/) ? $a[2] : AttrVal($hash->{NAME}, "volumeSteps",5))); + $target_volume = YAMAHA_AVR_volume_rel2abs(ReadingsVal($name, "volume", -45) - ((defined($a[2]) and $a[2] =~ /^\d+$/) ? $a[2] : AttrVal($hash->{NAME}, "volumeSteps",5))); } - elsif($what eq "volumeUp") + elsif($what eq "volumeUp" and defined(ReadingsVal($name, "volume", undef))) { - $target_volume = YAMAHA_AVR_volume_rel2abs($hash->{READINGS}{volume}{VAL} + ((defined($a[2]) and $a[2] =~ /^\d+$/) ? $a[2] : AttrVal($hash->{NAME}, "volumeSteps",5))); + $target_volume = YAMAHA_AVR_volume_rel2abs(ReadingsVal($name, "volume", -45) + ((defined($a[2]) and $a[2] =~ /^\d+$/) ? $a[2] : AttrVal($hash->{NAME}, "volumeSteps",5))); } elsif(defined($a[2]) and $a[2] =~ /^-?\d+(?:\.\d)?$/) { @@ -467,7 +449,7 @@ YAMAHA_AVR_Set($@) # DSP based models use "Vol" instead of "Volume" my $volume_cmd = (YAMAHA_AVR_isModel_DSP($hash) ? "Vol" : "Volume"); - if(AttrVal($name, "volume-smooth-change", "0") eq "1") + if(AttrVal($name, "volume-smooth-change", "1") eq "1") { my $steps = AttrVal($name, "volume-smooth-steps", 5); my $diff = int(($target_volume - ReadingsVal($name, "volumeStraight", $target_volume)) / $steps / 0.5) * 0.5; @@ -1042,7 +1024,7 @@ YAMAHA_AVR_HandleCmdQueue($) # still request in queue, but not mentioned to be executed now Log3 $name, 5, "YAMAHA_AVR ($name) - still requests in queue, but no command shall be executed at the moment. Retry in 1 second."; RemoveInternalTimer($hash, "YAMAHA_AVR_HandleCmdQueue"); - InternalTimer(gettimeofday()+1,"YAMAHA_AVR_HandleCmdQueue", $hash); + InternalTimer(gettimeofday()+1,"YAMAHA_AVR_HandleCmdQueue", $hash, 0); return undef; } @@ -1434,7 +1416,7 @@ YAMAHA_AVR_ParseResponse ($$$) else { # delete the reading if this information is not available - delete($hash->{READINGS}{output}) if(defined($hash->{READINGS}{output})); + delete($hash->{READINGS}{output}) if(exists($hash->{READINGS}{output})); } # current input same as the corresponding set command name @@ -1989,22 +1971,23 @@ sub YAMAHA_AVR_getInputs($) sub YAMAHA_AVR_ResetTimer($;$) { my ($hash, $interval) = @_; + my $name = $hash->{NAME}; RemoveInternalTimer($hash, "YAMAHA_AVR_GetStatus"); - unless(IsDisabled($hash->{NAME})) + unless(IsDisabled($name)) { if(defined($interval)) { - InternalTimer(gettimeofday()+$interval, "YAMAHA_AVR_GetStatus", $hash); + InternalTimer(gettimeofday()+$interval, "YAMAHA_AVR_GetStatus", $hash, 0); } - elsif((exists($hash->{READINGS}{presence}{VAL}) and $hash->{READINGS}{presence}{VAL} eq "present") and (exists($hash->{READINGS}{power}{VAL}) and $hash->{READINGS}{power}{VAL} eq "on")) + elsif(ReadingsVal($name, "presence", "absent") eq "present" and ReadingsVal($name, "power", "off") eq "on") { - InternalTimer(gettimeofday()+$hash->{helper}{ON_INTERVAL}, "YAMAHA_AVR_GetStatus", $hash); + InternalTimer(gettimeofday()+$hash->{helper}{ON_INTERVAL}, "YAMAHA_AVR_GetStatus", $hash, 0); } else { - InternalTimer(gettimeofday()+$hash->{helper}{OFF_INTERVAL}, "YAMAHA_AVR_GetStatus", $hash); + InternalTimer(gettimeofday()+$hash->{helper}{OFF_INTERVAL}, "YAMAHA_AVR_GetStatus", $hash, 0); } } @@ -2071,7 +2054,7 @@ YAMAHA_AVR_isModel_DSP($)

YAMAHA_AVR