71_YAMAHA_NP: Improved auto update of dynamic and static readings.

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@10940 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ra666ack 2016-02-26 07:01:36 +00:00
parent 8ba6b703a9
commit bfc0f7fa77

View File

@ -96,20 +96,82 @@ sub YAMAHA_NP_GetStatus
return; return;
} }
# Timer readings available?
if(not defined($hash->{READINGS}{timerVolume}))
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><System><Misc><Timer><Mode>GetParam</Mode></Timer></Misc></System></YAMAHA_AV>", "statusRequest", "getTimer");
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><System><Misc><Timer><Param>GetParam</Param></Timer></Misc></System></YAMAHA_AV>", "statusRequest", "timerStatus");
}
# Standby mode readings available?
if(not defined($hash->{READINGS}{standbyMode}))
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><System><Power_Control><Saving>GetParam</Saving></Power_Control></System></YAMAHA_AV>", "statusRequest", "standbyMode");
}
# DAB preset readings available? Only for the DAB model.
if (defined $hash->{MODEL})
{
my $model = $hash->{MODEL};
if ($model eq "CRX-N560D")
{
if(not defined($hash->{READINGS}{tunerPresetDABItem_01}))
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Control><Preset><DAB><Preset_Sel_Item>GetParam</Preset_Sel_Item></DAB></Preset></Play_Control></Tuner></YAMAHA_AV>", "statusRequest", "tunerPresetDAB");
}
}
}
# FM preset readings available?
if(not defined($hash->{READINGS}{tunerPresetFMItem_01}))
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Control><Preset><FM><Preset_Sel_Item>GetParam</Preset_Sel_Item></FM></Preset></Play_Control></Tuner></YAMAHA_AV>", "statusRequest", "tunerPresetFM");
}
# Basic status request
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><System><Basic_Status>GetParam</Basic_Status></System></YAMAHA_AV>", "statusRequest", "basicStatus"); YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><System><Basic_Status>GetParam</Basic_Status></System></YAMAHA_AV>", "statusRequest", "basicStatus");
if(defined($hash->{READINGS}{input})) if(defined($hash->{READINGS}{input}))
{ {
# Get dynamic tuner readings
if((AttrVal($name, "auto_update_tuner_readings","1") eq "1") and ($hash->{READINGS}{input}{VAL} eq "tuner") and ($hash->{READINGS}{power}{VAL} eq "on")) if((AttrVal($name, "auto_update_tuner_readings","1") eq "1") and ($hash->{READINGS}{input}{VAL} eq "tuner") and ($hash->{READINGS}{power}{VAL} eq "on"))
{ {
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Info>GetParam<\/Play_Info><\/Tuner><\/YAMAHA_AV>", "statusRequest", "tunerStatus"); YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Info>GetParam<\/Play_Info><\/Tuner><\/YAMAHA_AV>", "statusRequest", "tunerStatus");
if($hash->{READINGS}{tunerBand}{VAL} eq "FM")
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Control><Preset><FM><Preset_Sel_Item>GetParam</Preset_Sel_Item></FM></Preset></Play_Control></Tuner></YAMAHA_AV>", "statusRequest", "tunerPresetFM");
blankTunerDABReadings($hash);
}
elsif($hash->{READINGS}{tunerBand}{VAL} eq "DAB")
{
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Tuner><Play_Control><Preset><DAB><Preset_Sel_Item>GetParam</Preset_Sel_Item></DAB></Preset></Play_Control></Tuner></YAMAHA_AV>", "statusRequest", "tunerPresetDAB");
blankTunerFMReadings($hash);
}
# Reset player readings
blankPlayerReadings($hash);
} }
elsif(AttrVal($name, "auto_update_player_readings", "1") eq "1" and ($hash->{READINGS}{input}{VAL} ne "tuner") and ($hash->{READINGS}{power}{VAL} eq "on")) elsif(AttrVal($name, "auto_update_player_readings", "1") eq "1" and ($hash->{READINGS}{input}{VAL} ne "tuner") and ($hash->{READINGS}{power}{VAL} eq "on"))
{
# Inputs don't use any player readings. Get player readings.
if($hash->{READINGS}{input}{VAL} eq "aux1" or
$hash->{READINGS}{input}{VAL} eq "aux2" or
$hash->{READINGS}{input}{VAL} eq "digital1" or
$hash->{READINGS}{input}{VAL} eq "digital2" or
$hash->{READINGS}{input}{VAL} eq "airplay")
{
blankPlayerReadings($hash);
}
else
{ {
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Player><Play_Info>GetParam<\/Play_Info><\/Player><\/YAMAHA_AV>", "statusRequest", "playerStatus"); YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Player><Play_Info>GetParam<\/Play_Info><\/Player><\/YAMAHA_AV>", "statusRequest", "playerStatus");
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Player><List_Info>GetParam</List_Info></Player></YAMAHA_AV>", "playerListGetList", "playerListGetList");
}
# Reset tuner readings
readingsSingleUpdate($hash, "tunerBand", "", 1);
blankTunerDABReadings($hash);
blankTunerFMReadings($hash);
} }
} }
YAMAHA_NP_ResetTimer($hash) unless($local == 1); YAMAHA_NP_ResetTimer($hash) unless($local == 1);
return; return;
} }
@ -361,6 +423,21 @@ sub YAMAHA_NP_Set
if(($what eq "volume") and ($a[2] >= 0) and ($a[2] <= 100)) if(($what eq "volume") and ($a[2] >= 0) and ($a[2] <= 100))
{ {
$target_volume = YAMAHA_NP_volume_rel2abs($hash, $a[2]); $target_volume = YAMAHA_NP_volume_rel2abs($hash, $a[2]);
$hash->{helper}{targetVolume} = $a[2];
if($hash->{READINGS}{volumeStraight}{VAL} < $target_volume)
{
$hash->{helper}{targetVolumeDir} = "down";
}
elsif($hash->{READINGS}{volumeStraight}{VAL} > $target_volume)
{
$hash->{helper}{targetVolumeDir} = "up";
}
else
{
$hash->{helper}{targetVolumeDir} = "equal";
}
} }
elsif($what eq "volumeDown") elsif($what eq "volumeDown")
{ {
@ -490,7 +567,7 @@ sub YAMAHA_NP_Set
} }
elsif($what eq "playerListGetList") elsif($what eq "playerListGetList")
{ {
YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Player><List_Info>GetParam</List_Info></Player></YAMAHA_AV>", $what, "playerGetList"); YAMAHA_NP_SendCommand($hash, "<YAMAHA_AV cmd=\"GET\"><Player><List_Info>GetParam</List_Info></Player></YAMAHA_AV>", $what, "playerListGetList");
} }
elsif($what eq "playerListCursorReturn") elsif($what eq "playerListCursorReturn")
{ {
@ -1060,46 +1137,101 @@ sub YAMAHA_NP_ParseResponse
{ {
readingsBulkUpdate($hash, "playerPlaybackInfo", lc($1)); readingsBulkUpdate($hash, "playerPlaybackInfo", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerPlaybackInfo", "");
}
if($data =~ /<Device_Type>(.+)<\/Device_Type>/) if($data =~ /<Device_Type>(.+)<\/Device_Type>/)
{ {
readingsBulkUpdate($hash, "playerDeviceType", lc($1)); readingsBulkUpdate($hash, "playerDeviceType", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerDeviceType", "");
}
if($data =~ /<iPod_Mode>(.+)<\/iPod_Mode>/) if($data =~ /<iPod_Mode>(.+)<\/iPod_Mode>/)
{ {
readingsBulkUpdate($hash, "playerIpodMode", lc($1)); readingsBulkUpdate($hash, "playerIpodMode", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerIpodMode", "");
}
if($data =~ /<Repeat>(.+)<\/Repeat>/) if($data =~ /<Repeat>(.+)<\/Repeat>/)
{ {
readingsBulkUpdate($hash, "playerRepeat", lc($1)); readingsBulkUpdate($hash, "playerRepeat", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerRepeat", "");
}
if($data =~ /<Shuffle>(.+)<\/Shuffle>/) if($data =~ /<Shuffle>(.+)<\/Shuffle>/)
{ {
readingsBulkUpdate($hash, "playerShuffle", lc($1)); readingsBulkUpdate($hash, "playerShuffle", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerShuffle", "");
}
if($data =~ /<Play_Time>(.+)<\/Play_Time>/) if($data =~ /<Play_Time>(.+)<\/Play_Time>/)
{ {
readingsBulkUpdate($hash, "playerPlayTime", strftime("\%H:\%M:\%S", gmtime($1))); readingsBulkUpdate($hash, "playerPlayTime", strftime("\%H:\%M:\%S", gmtime($1)));
} }
else
{
readingsBulkUpdate($hash, "playerPlayTime", "");
}
if($data =~ /<Track_Number>(.+)<\/Track_Number>/) if($data =~ /<Track_Number>(.+)<\/Track_Number>/)
{ {
readingsBulkUpdate($hash, "playerTrackNumber", lc($1)); readingsBulkUpdate($hash, "playerTrackNumber", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerTrackNumber", "");
}
if($data =~ /<Total_Tracks>(.+)<\/Total_Tracks>/) if($data =~ /<Total_Tracks>(.+)<\/Total_Tracks>/)
{ {
readingsBulkUpdate($hash, "playerTotalTracks", lc($1)); readingsBulkUpdate($hash, "playerTotalTracks", lc($1));
} }
else
{
readingsBulkUpdate($hash, "playerTotalTracks", "");
}
if($data =~ /<Artist>(.+)<\/Artist>/) if($data =~ /<Artist>(.+)<\/Artist>/)
{ {
readingsBulkUpdate($hash, "playerArtist", YAMAHA_NP_html2txt($1)); readingsBulkUpdate($hash, "playerArtist", YAMAHA_NP_html2txt($1));
} }
else
{
readingsBulkUpdate($hash, "playerArtist", "");
}
if($data =~ /<Album>(.+)<\/Album>/) if($data =~ /<Album>(.+)<\/Album>/)
{ {
readingsBulkUpdate($hash, "playerAlbum", YAMAHA_NP_html2txt($1)); readingsBulkUpdate($hash, "playerAlbum", YAMAHA_NP_html2txt($1));
} }
else
{
readingsBulkUpdate($hash, "playerAlbum", "");
}
if($data =~ /<Song>(.+)<\/Song>/) if($data =~ /<Song>(.+)<\/Song>/)
{ {
readingsBulkUpdate($hash, "playerSong", YAMAHA_NP_html2txt($1)); readingsBulkUpdate($hash, "playerSong", YAMAHA_NP_html2txt($1));
} }
else
{
readingsBulkUpdate($hash, "playerSong", "");
}
if($data =~ /<Album_ART><URL>(.+)<\/URL><ID>(.+)<\/ID><Format>(.+)<\/Format><\/Album_ART>/) if($data =~ /<Album_ART><URL>(.+)<\/URL><ID>(.+)<\/ID><Format>(.+)<\/Format><\/Album_ART>/)
{ {
my $address = $hash->{helper}{ADDRESS}; my $address = $hash->{helper}{ADDRESS};
@ -1108,6 +1240,12 @@ sub YAMAHA_NP_ParseResponse
readingsBulkUpdate($hash, "playerAlbumArtID", YAMAHA_NP_html2txt($2)); readingsBulkUpdate($hash, "playerAlbumArtID", YAMAHA_NP_html2txt($2));
readingsBulkUpdate($hash, "playerAlbumArtFormat", YAMAHA_NP_html2txt($3)); readingsBulkUpdate($hash, "playerAlbumArtFormat", YAMAHA_NP_html2txt($3));
} }
else
{
readingsBulkUpdate($hash, "playerAlbumArtURL", "");
readingsBulkUpdate($hash, "playerAlbumArtID", "");
readingsBulkUpdate($hash, "playerAlbumArtFormat", "");
}
} }
elsif($arg eq "tunerStatus") elsif($arg eq "tunerStatus")
{ {
@ -1115,6 +1253,9 @@ sub YAMAHA_NP_ParseResponse
{ {
readingsBulkUpdate($hash, "tunerBand", ($1)); readingsBulkUpdate($hash, "tunerBand", ($1));
} }
if($hash->{READINGS}{tunerBand}{VAL} eq "FM")
{
if($data =~ /<FM><Preset><Preset_Sel>(.+)<\/Preset_Sel><\/Preset>(.*)<\/FM/) if($data =~ /<FM><Preset><Preset_Sel>(.+)<\/Preset_Sel><\/Preset>(.*)<\/FM/)
{ {
readingsBulkUpdate($hash, "tunerPresetFM", ($1)); readingsBulkUpdate($hash, "tunerPresetFM", ($1));
@ -1137,6 +1278,9 @@ sub YAMAHA_NP_ParseResponse
{ {
readingsBulkUpdate($hash, "tunerRadioTextBFM", YAMAHA_NP_html2txt($1)); readingsBulkUpdate($hash, "tunerRadioTextBFM", YAMAHA_NP_html2txt($1));
} }
}
if($hash->{READINGS}{tunerBand}{VAL} eq "DAB")
{
if($data =~ /<DAB><Preset><Preset_Sel>(.+)<\/Preset_Sel><\/Preset>(.*)<\/DAB>/) if($data =~ /<DAB><Preset><Preset_Sel>(.+)<\/Preset_Sel><\/Preset>(.*)<\/DAB>/)
{ {
readingsBulkUpdate($hash, "tunerPresetDAB", ($1)); readingsBulkUpdate($hash, "tunerPresetDAB", ($1));
@ -1183,6 +1327,7 @@ sub YAMAHA_NP_ParseResponse
readingsBulkUpdate($hash, "tunerFrequencyDAB", $frequency." MHz"); readingsBulkUpdate($hash, "tunerFrequencyDAB", $frequency." MHz");
} }
} }
}
elsif($arg eq "timerStatus") elsif($arg eq "timerStatus")
{ {
if($data =~ /<Volume><Lvl>(.+)<\/Lvl><\/Volume>/) if($data =~ /<Volume><Lvl>(.+)<\/Lvl><\/Volume>/)
@ -1314,12 +1459,12 @@ sub YAMAHA_NP_ParseResponse
# Delete old List listLines # Delete old List listLines
my $i = 1; my $i = 1;
while(exists($hash->{READINGS}{"playerListLine_$i"})) #while(exists($hash->{READINGS}{"playerListLine_$i"}))
{ #{
delete($hash->{READINGS}{"playerListLine_$i"}); # delete($hash->{READINGS}{"playerListLine_$i"});
delete($hash->{READINGS}{"playerListLine_Attribute_$i"}); # delete($hash->{READINGS}{"playerListLine_Attribute_$i"});
$i++; # $i++;
} #}
if($data =~ /<Menu_Status>(.*)<\/Menu_Status>/) if($data =~ /<Menu_Status>(.*)<\/Menu_Status>/)
{ {
@ -1337,7 +1482,6 @@ sub YAMAHA_NP_ParseResponse
{ {
# <Line_X><Txt>****</Txt><Attribute>Container|Item|Unselectable</Attribute></Line_X> # <Line_X><Txt>****</Txt><Attribute>Container|Item|Unselectable</Attribute></Line_X>
$i = 1;
while($data =~ /<Line_$i><Txt>(.*?)<\/Txt><Attribute>(.*?)<\/Attribute><\/Line_$i>/gc) while($data =~ /<Line_$i><Txt>(.*?)<\/Txt><Attribute>(.*?)<\/Attribute><\/Line_$i>/gc)
{ {
readingsBulkUpdate($hash, "playerListLine_$i", $1); readingsBulkUpdate($hash, "playerListLine_$i", $1);
@ -1394,15 +1538,6 @@ sub YAMAHA_NP_ParseResponse
readingsBulkUpdate($hash, "standbyMode", lc($arg)); readingsBulkUpdate($hash, "standbyMode", lc($arg));
} }
} }
#elsif($cmd eq "netRadioSelectBookmark")
#{
# if($data =~ /RC="0"/)
# {
# Log3 $name, 5, "ParseListInfo\n";
# YAMAHA_NP_Parse_List_Info($hash, $data);
#
# }
#}
elsif($cmd eq "volume" or $cmd eq "volumeStraight" or $cmd eq "volumeUp" or $cmd eq "volumeDown") elsif($cmd eq "volume" or $cmd eq "volumeStraight" or $cmd eq "volumeUp" or $cmd eq "volumeDown")
{ {
if($data =~ /RC="0"/) if($data =~ /RC="0"/)
@ -1416,12 +1551,94 @@ sub YAMAHA_NP_ParseResponse
} }
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
#YAMAHA_NP_ResetTimer($hash, 0) if($cmd ne "statusRequest" and $cmd ne "on" and $cmd ne "volume");
YAMAHA_NP_ResetTimer($hash, 0) if($cmd ne "statusRequest" and $cmd ne "on" and $cmd ne "volume");
} }
return; return;
} }
#############################
# Blanks dynamic DAB tuner readings
sub blankTunerDABReadings
{
my ($hash) = @_;
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "tunerDLSDAB", "");
readingsBulkUpdate($hash, "tunerEnsembleLabelDAB", "");
readingsBulkUpdate($hash, "tunerFrequencyDAB", "");
readingsBulkUpdate($hash, "tunerModeDAB", "");
readingsBulkUpdate($hash, "tunerServiceLabelDAB", "");
readingsBulkUpdate($hash, "tunerAudioModeDAB", "");
readingsBulkUpdate($hash, "tunerBitRateDAB", "");
readingsBulkUpdate($hash, "tunerChannelLabelDAB", "");
readingsBulkUpdate($hash, "tunerPresetDAB", "");
readingsEndUpdate($hash, 1);
return;
}
#############################
# Blanks dynamic FM tuner readings
sub blankTunerFMReadings
{
my ($hash) = @_;
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "tunerFrequencyFM", "");
readingsBulkUpdate($hash, "tunerProgramServiceFM", "");
readingsBulkUpdate($hash, "tunerRadioTextAFM", "");
readingsBulkUpdate($hash, "tunerRadioTextBFM", "");
readingsBulkUpdate($hash, "tunerPresetFM", "");
readingsEndUpdate($hash, 1);
return;
}
#############################
# Blanks dynamic Tuner readings
sub blankPlayerReadings
{
my ($hash) = @_;
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "playerAlbum", "");
readingsBulkUpdate($hash, "playerAlbumArtFormat", "");
readingsBulkUpdate($hash, "playerAlbumArtID", "");
readingsBulkUpdate($hash, "playerAlbumArtURL", "");
readingsBulkUpdate($hash, "playerArtist", "");
readingsBulkUpdate($hash, "playerDeviceType", "");
readingsBulkUpdate($hash, "playerIpodMode", "");
readingsBulkUpdate($hash, "playerListCurrentLine", "");
readingsBulkUpdate($hash, "playerListLine_1", "");
readingsBulkUpdate($hash, "playerListLine_2", "");
readingsBulkUpdate($hash, "playerListLine_3", "");
readingsBulkUpdate($hash, "playerListLine_4", "");
readingsBulkUpdate($hash, "playerListLine_5", "");
readingsBulkUpdate($hash, "playerListLine_6", "");
readingsBulkUpdate($hash, "playerListLine_7", "");
readingsBulkUpdate($hash, "playerListLine_8", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_1", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_2", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_3", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_4", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_5", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_6", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_7", "");
readingsBulkUpdate($hash, "playerListLine_Attribute_8", "");
readingsBulkUpdate($hash, "playerListMaxLine", "");
readingsBulkUpdate($hash, "playerListMenuLayer", "");
readingsBulkUpdate($hash, "playerListMenuName", "");
readingsBulkUpdate($hash, "playerListMenuStatus", "");
readingsBulkUpdate($hash, "playerPlayTime", "");
readingsBulkUpdate($hash, "playerPlaybackInfo", "");
readingsBulkUpdate($hash, "playerRepeat", "");
readingsBulkUpdate($hash, "playerShuffle", "");
readingsBulkUpdate($hash, "playerSong", "");
readingsBulkUpdate($hash, "playerTotalTracks", "");
readingsBulkUpdate($hash, "playerTrackNumber", "");
readingsEndUpdate($hash, 1);
return;
}
############################# #############################
# Converts all Values to FHEM usable command lists # Converts all Values to FHEM usable command lists
sub YAMAHA_NP_Param2Fhem sub YAMAHA_NP_Param2Fhem