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$volume_cmd>$zone>", $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$volume_cmd>$zone>", $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
-
+
Define
@@ -2138,7 +2121,7 @@ YAMAHA_AVR_isModel_DSP($)
-
+
Set
set <name> <command> [<parameter>]
@@ -2163,7 +2146,7 @@ YAMAHA_AVR_isModel_DSP($)
- 3dCinemaDsp auto|off - controls the CINEMA DSP 3D mode
- adaptiveDrc auto|off - controls the Adaptive DRC
- partyMode on|off - controls the party mode. In Main Zone the whole party mode is enabled/disabled system wide. In each zone executed, it enables/disables the current zone from party mode.
-- navigateListMenu [item1]/[item2]/[itemN]/... - select a specific item within a menu structure. for menu-based inputs (e.g. Net Radio, USB, Server, ...) only. See chapter "Automatic Menu Navigation" for further details and examples.
+- navigateListMenu [item1]/[item2]/[itemN]/... - select a specific item within a menu structure. for menu-based inputs (e.g. Net Radio, USB, Server, ...) only. See chapter Automatic Menu Navigation for further details and examples.
- tunerFrequency [frequency] [AM|FM] - sets the tuner frequency. The first argument is the frequency, second parameter is optional to set the tuner band (AM or FM, default: FM). Depending which tuner band you select, the frequency is given in kHz (AM band) or MHz (FM band). If the second parameter is not set, the FM band will be used. This command can be used even the current input is not "tuner", the new frequency is set and will be played, when the tuner gets active.
- tunerPreset 1...40 - selects a saved tuner frequency preset. This command can be used even the current input is not "tuner", the new frequency is set and will be played, when the tuner gets active.
- straight on|off - bypasses the internal codec converter and plays the original sound codec
@@ -2208,7 +2191,7 @@ YAMAHA_AVR_isModel_DSP($)
The button names are the same as on your remote control.
-
+
Automatic Menu Navigation (only for menu based inputs like Net Radio, Server, USB, ...)
For menu based inputs you have to select a specific item out of a complex menu structure to start playing music.
@@ -2262,7 +2245,7 @@ So here are some examples:
-
+
Get
get <name> <reading>
@@ -2270,29 +2253,29 @@ So here are some examples:
Currently, the get command only returns the reading values. For a specific list of possible values, see section "Generated Readings/Events".
-
+
Attributes
@@ -2346,7 +2329,7 @@ So here are some examples:
YAMAHA_AVR
-
+
Definition
define <name> YAMAHA_AVR <IP-Addresse> [<Zone>] [<Status_Interval>]
@@ -2408,7 +2391,7 @@ So here are some examples:
-
+
Set-Kommandos
set <Name> <Kommando> [<Parameter>]
@@ -2425,7 +2408,7 @@ So here are some examples:
- 3dCinemaDsp auto,off - Aktiviert den CINEMA DSP 3D Modus
- adaptiveDrc auto,off - Aktiviert Adaptive DRC
- partyMode on|off - Aktiviert den Party Modus. In der Main Zone wird hierbei der Party Modus geräteweit aktiviert oder deaktiviert. In den anderen Zonen kann man damit die entsprechende Zone dem Party Modus zuschalten oder entziehen.
-- navigateListMenu [Element 1]/[Element 2]/[Element N]/... - Wählt ein spezifisches Element aus einer Menüstruktur aus. Nur verwendbar bei Menü-basierenden Eingängen (z.B. Net Radio, USB, Server, etc.). Siehe nachfolgendes Kapitel "Automatische Menü Navigation" für weitere Details und Beispiele.
+- navigateListMenu [Element 1]/[Element 2]/[Element N]/... - Wählt ein spezifisches Element aus einer Menüstruktur aus. Nur verwendbar bei Menü-basierenden Eingängen (z.B. Net Radio, USB, Server, etc.). Siehe nachfolgendes Kapitel "Automatische Menü Navigation" für weitere Details und Beispiele.
- tunerFrequency [Frequenz] [AM|FM] - setzt die Radio-Frequenz. Das erste Argument ist die Frequenz, der zweite dient optional zu Angabe des Bandes (AM oder FM, standardmäßig FM). Abhängig davon, welches Band man benutzt, wird die Frequenz in kHz (AM-Band) oder MHz (FM-Band) angegeben. Wenn im zweiten Argument kein Band angegeben ist, wird standardmäßig das FM-Band benutzt. Dieser Befehl kann auch benutzt werden, wenn der aktuelle Eingang nicht "tuner" ist. Die neue Frequenz wird dennoch gesetzt und bei der nächsten Benutzung abgespielt.
- tunerPreset 1...40 - wählt einen gespeicherten Radiosender-Preset aus. Dieser Befehl kann auch benutzt werden, wenn der aktuelle Eingang nicht "tuner" ist. Die neue Frequenz wird dennoch gesetzt und bei der nächsten Benutzung abgespielt.
- direct on,off - Umgeht alle internen soundverbessernden Maßnahmen (Equalizer, Enhancer, Adaptive DRC,...) und gibt das Signal unverfälscht wieder
@@ -2479,7 +2462,7 @@ So here are some examples:
remoteControl tunerPresetDown
-
+
Automatische Menü Navigation (nur für Menü-basierte Eingänge wie z.B. Net Radio, Server, USB, ...)
Für Menü-basierte Eingänge muss man einen bestimmten Eintrag aus einer komplexen Struktur auswählen um die Wiedergabe zu starten.
@@ -2535,7 +2518,7 @@ Ein paar Beispiele:
Das erste Element aus einer Listenebene (von oben nach unten), was auf eine Pfadangabe passt, wird ausgewählt.
-
+
Get-Kommandos
get <Name> <Readingname>
@@ -2543,29 +2526,29 @@ Ein paar Beispiele:
Aktuell stehen via GET lediglich die Werte der Readings zur Verfügung. Eine genaue Auflistung aller möglichen Readings folgen unter "Generierte Readings/Events".
-
+
Attribute
- do_not_notify
- disabledForIntervals
- readingFnAttributes
- - request-timeout
+ - request-timeout
Optionales Attribut. Maximale Dauer einer Anfrage in Sekunden zum Receiver.
Mögliche Werte: 1-5 Sekunden. Standardwert ist 4 Sekunden
- - disable
+ - disable
Optionales Attribut zur Deaktivierung des zyklischen Status-Updates. Ein manuelles Update via statusRequest-Befehl ist dennoch möglich.
Mögliche Werte: 0 => zyklische Status-Updates, 1 => keine zyklischen Status-Updates.
- - volume-smooth-change
+ - volume-smooth-change
Optionales Attribut, welches einen weichen Lautstärkeübergang aktiviert..
Mögliche Werte: 0 => deaktiviert , 1 => aktiviert
- - volume-smooth-steps
+ - volume-smooth-steps
Optionales Attribut, welches angibt, wieviele Schritte zur weichen Lautstärkeanpassung
durchgeführt werden sollen. Standardwert ist 5 Anpassungschritte
- - volumeSteps
+ - volumeSteps
Optionales Attribut, welches den Standardwert zur Lautstärkenerhöhung (volumeUp) und Lautstärkenveringerung (volumeDown) konfiguriert. Standardwert ist 5%