From 4a838f25ac97ed2a1d201f598bbf44bb50b5bc26 Mon Sep 17 00:00:00 2001 From: ra666ack <> Date: Fri, 26 Feb 2016 07:01:36 +0000 Subject: [PATCH] 71_YAMAHA_NP: Improved auto update of dynamic and static readings. git-svn-id: https://svn.fhem.de/fhem/trunk@10940 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/71_YAMAHA_NP.pm | 397 +++++++++++++++++++++++++++++--------- 1 file changed, 307 insertions(+), 90 deletions(-) diff --git a/fhem/FHEM/71_YAMAHA_NP.pm b/fhem/FHEM/71_YAMAHA_NP.pm index 5ddc737cf..67dbf3fe1 100644 --- a/fhem/FHEM/71_YAMAHA_NP.pm +++ b/fhem/FHEM/71_YAMAHA_NP.pm @@ -95,22 +95,84 @@ sub YAMAHA_NP_GetStatus YAMAHA_NP_ResetTimer($hash) unless($local == 1); return; } - - YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "basicStatus"); + + # Timer readings available? + if(not defined($hash->{READINGS}{timerVolume})) + { + YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "getTimer"); + YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "timerStatus"); + } + + # Standby mode readings available? + if(not defined($hash->{READINGS}{standbyMode})) + { + YAMAHA_NP_SendCommand($hash, "GetParam", "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, "GetParam", "statusRequest", "tunerPresetDAB"); + } + } + } + + # FM preset readings available? + if(not defined($hash->{READINGS}{tunerPresetFMItem_01})) + { + YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "tunerPresetFM"); + } + + # Basic status request + YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "basicStatus"); 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")) { YAMAHA_NP_SendCommand($hash, "GetParam<\/Play_Info><\/Tuner><\/YAMAHA_AV>", "statusRequest", "tunerStatus"); + if($hash->{READINGS}{tunerBand}{VAL} eq "FM") + { + YAMAHA_NP_SendCommand($hash, "GetParam", "statusRequest", "tunerPresetFM"); + blankTunerDABReadings($hash); + } + elsif($hash->{READINGS}{tunerBand}{VAL} eq "DAB") + { + YAMAHA_NP_SendCommand($hash, "GetParam", "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")) { - YAMAHA_NP_SendCommand($hash, "GetParam<\/Play_Info><\/Player><\/YAMAHA_AV>", "statusRequest", "playerStatus"); + # 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, "GetParam<\/Play_Info><\/Player><\/YAMAHA_AV>", "statusRequest", "playerStatus"); + YAMAHA_NP_SendCommand($hash, "GetParam", "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; } @@ -361,6 +423,21 @@ sub YAMAHA_NP_Set if(($what eq "volume") and ($a[2] >= 0) and ($a[2] <= 100)) { $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") { @@ -490,7 +567,7 @@ sub YAMAHA_NP_Set } elsif($what eq "playerListGetList") { - YAMAHA_NP_SendCommand($hash, "GetParam", $what, "playerGetList"); + YAMAHA_NP_SendCommand($hash, "GetParam", $what, "playerListGetList"); } elsif($what eq "playerListCursorReturn") { @@ -696,7 +773,7 @@ sub YAMAHA_NP_Set { if($a[2] >= 1 and $a[2] <= 30 and $hash->{MODEL} eq "CRX-N560D") { - YAMAHA_NP_SendCommand($hash, "".$a[2]."<\/Preset_Sel><\/DAB><\/Preset><\/Play_Control><\/Tuner>", "tunerPresetDAB", $a[2]); + YAMAHA_NP_SendCommand($hash, "".$a[2]."<\/Preset_Sel><\/DAB><\/Preset><\/Play_Control><\/Tuner>", "tunerPresetDAB", $a[2]); } else { @@ -730,7 +807,7 @@ sub YAMAHA_NP_Set my $frequency = $a[2]; $frequency =~ s/\.//; # Remove decimal point YAMAHA_NP_SendCommand($hash, "".$frequency."<\/Freq><\/FM><\/Tuning><\/Play_Control><\/Tuner>", "tunerFMFrequency", $a[2]); - } + } else { return "Last digit must be '0' or '5'"; @@ -1059,47 +1136,102 @@ sub YAMAHA_NP_ParseResponse if($data =~ /(.+)<\/Playback_Info>/) { readingsBulkUpdate($hash, "playerPlaybackInfo", lc($1)); + } + else + { + readingsBulkUpdate($hash, "playerPlaybackInfo", ""); } + if($data =~ /(.+)<\/Device_Type>/) { readingsBulkUpdate($hash, "playerDeviceType", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerDeviceType", ""); + } + if($data =~ /(.+)<\/iPod_Mode>/) { readingsBulkUpdate($hash, "playerIpodMode", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerIpodMode", ""); + } + if($data =~ /(.+)<\/Repeat>/) { readingsBulkUpdate($hash, "playerRepeat", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerRepeat", ""); + } + if($data =~ /(.+)<\/Shuffle>/) { readingsBulkUpdate($hash, "playerShuffle", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerShuffle", ""); + } + if($data =~ /(.+)<\/Play_Time>/) { readingsBulkUpdate($hash, "playerPlayTime", strftime("\%H:\%M:\%S", gmtime($1))); } + else + { + readingsBulkUpdate($hash, "playerPlayTime", ""); + } + if($data =~ /(.+)<\/Track_Number>/) { readingsBulkUpdate($hash, "playerTrackNumber", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerTrackNumber", ""); + } + if($data =~ /(.+)<\/Total_Tracks>/) { readingsBulkUpdate($hash, "playerTotalTracks", lc($1)); } + else + { + readingsBulkUpdate($hash, "playerTotalTracks", ""); + } + if($data =~ /(.+)<\/Artist>/) { readingsBulkUpdate($hash, "playerArtist", YAMAHA_NP_html2txt($1)); } + else + { + readingsBulkUpdate($hash, "playerArtist", ""); + } + if($data =~ /(.+)<\/Album>/) { readingsBulkUpdate($hash, "playerAlbum", YAMAHA_NP_html2txt($1)); } + else + { + readingsBulkUpdate($hash, "playerAlbum", ""); + } + if($data =~ /(.+)<\/Song>/) { readingsBulkUpdate($hash, "playerSong", YAMAHA_NP_html2txt($1)); } + else + { + readingsBulkUpdate($hash, "playerSong", ""); + } + if($data =~ /(.+)<\/URL>(.+)<\/ID>(.+)<\/Format><\/Album_ART>/) { my $address = $hash->{helper}{ADDRESS}; @@ -1107,7 +1239,13 @@ sub YAMAHA_NP_ParseResponse readingsBulkUpdate($hash, "playerAlbumArtURL", "http://".$address."".YAMAHA_NP_html2txt($1)); readingsBulkUpdate($hash, "playerAlbumArtID", YAMAHA_NP_html2txt($2)); readingsBulkUpdate($hash, "playerAlbumArtFormat", YAMAHA_NP_html2txt($3)); - } + } + else + { + readingsBulkUpdate($hash, "playerAlbumArtURL", ""); + readingsBulkUpdate($hash, "playerAlbumArtID", ""); + readingsBulkUpdate($hash, "playerAlbumArtFormat", ""); + } } elsif($arg eq "tunerStatus") { @@ -1115,73 +1253,80 @@ sub YAMAHA_NP_ParseResponse { readingsBulkUpdate($hash, "tunerBand", ($1)); } - if($data =~ /(.+)<\/Preset_Sel><\/Preset>(.*)<\/FM/) + + if($hash->{READINGS}{tunerBand}{VAL} eq "FM") { - readingsBulkUpdate($hash, "tunerPresetFM", ($1)); - } - if($data =~ /(.+)<\/Freq><\/Tuning>/) - { - my $frequency = $1; - $frequency =~ s/(\d{2})$/.$1/; # Insert '.' to frequency - readingsBulkUpdate($hash, "tunerFrequencyFM", $frequency." MHz"); - } - if($data =~ /(.+)<\/Program_Service>/) - { - readingsBulkUpdate($hash, "tunerProgramServiceFM", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Radio_Text_A>/) - { - readingsBulkUpdate($hash, "tunerRadioTextAFM", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Radio_Text_B>/) - { - readingsBulkUpdate($hash, "tunerRadioTextBFM", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Preset_Sel><\/Preset>(.*)<\/DAB>/) - { - readingsBulkUpdate($hash, "tunerPresetDAB", ($1)); - } - if($data =~ /(.+)<\/Service_Label>/) - { - readingsBulkUpdate($hash, "tunerServiceLabelDAB", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Ch_Label>/) - { - readingsBulkUpdate($hash, "tunerChannelLabelDAB", ($1)); - } - if($data =~ /(.+)<\/DLS>/) - { - readingsBulkUpdate($hash, "tunerDLSDAB", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Ensemble_Label>/) - { - readingsBulkUpdate($hash, "tunerEnsembleLabelDAB", YAMAHA_NP_html2txt($1)); - } - if($data =~ /(.+)<\/Bit_Rate>/) - { - readingsBulkUpdate($hash, "tunerBitRateDAB", $1." kbit\/s"); - } - if($data =~ /(.+)<\/Audio_Mode>/) - { - readingsBulkUpdate($hash, "tunerAudioModeDAB", $1); - } - if($data =~ /(.+)<\/DAB_PLUS>/) - { - if($1 eq "Negate") + if($data =~ /(.+)<\/Preset_Sel><\/Preset>(.*)<\/FM/) { - readingsBulkUpdate($hash, "tunerModeDAB", "DAB"); + readingsBulkUpdate($hash, "tunerPresetFM", ($1)); } - elsif($1 eq "Assert") + if($data =~ /(.+)<\/Freq><\/Tuning>/) { - readingsBulkUpdate($hash, "tunerModeDAB", "DAB+"); + my $frequency = $1; + $frequency =~ s/(\d{2})$/.$1/; # Insert '.' to frequency + readingsBulkUpdate($hash, "tunerFrequencyFM", $frequency." MHz"); } + if($data =~ /(.+)<\/Program_Service>/) + { + readingsBulkUpdate($hash, "tunerProgramServiceFM", YAMAHA_NP_html2txt($1)); + } + if($data =~ /(.+)<\/Radio_Text_A>/) + { + readingsBulkUpdate($hash, "tunerRadioTextAFM", YAMAHA_NP_html2txt($1)); + } + if($data =~ /(.+)<\/Radio_Text_B>/) + { + readingsBulkUpdate($hash, "tunerRadioTextBFM", YAMAHA_NP_html2txt($1)); + } } - if($data =~ /(.+)<\/Freq>/) + if($hash->{READINGS}{tunerBand}{VAL} eq "DAB") { - my $frequency = $1; - $frequency =~ s/(\d{3})$/.$1/; # Insert '.' to frequency - readingsBulkUpdate($hash, "tunerFrequencyDAB", $frequency." MHz"); - } + if($data =~ /(.+)<\/Preset_Sel><\/Preset>(.*)<\/DAB>/) + { + readingsBulkUpdate($hash, "tunerPresetDAB", ($1)); + } + if($data =~ /(.+)<\/Service_Label>/) + { + readingsBulkUpdate($hash, "tunerServiceLabelDAB", YAMAHA_NP_html2txt($1)); + } + if($data =~ /(.+)<\/Ch_Label>/) + { + readingsBulkUpdate($hash, "tunerChannelLabelDAB", ($1)); + } + if($data =~ /(.+)<\/DLS>/) + { + readingsBulkUpdate($hash, "tunerDLSDAB", YAMAHA_NP_html2txt($1)); + } + if($data =~ /(.+)<\/Ensemble_Label>/) + { + readingsBulkUpdate($hash, "tunerEnsembleLabelDAB", YAMAHA_NP_html2txt($1)); + } + if($data =~ /(.+)<\/Bit_Rate>/) + { + readingsBulkUpdate($hash, "tunerBitRateDAB", $1." kbit\/s"); + } + if($data =~ /(.+)<\/Audio_Mode>/) + { + readingsBulkUpdate($hash, "tunerAudioModeDAB", $1); + } + if($data =~ /(.+)<\/DAB_PLUS>/) + { + if($1 eq "Negate") + { + readingsBulkUpdate($hash, "tunerModeDAB", "DAB"); + } + elsif($1 eq "Assert") + { + readingsBulkUpdate($hash, "tunerModeDAB", "DAB+"); + } + } + if($data =~ /(.+)<\/Freq>/) + { + my $frequency = $1; + $frequency =~ s/(\d{3})$/.$1/; # Insert '.' to frequency + readingsBulkUpdate($hash, "tunerFrequencyDAB", $frequency." MHz"); + } + } } elsif($arg eq "timerStatus") { @@ -1314,12 +1459,12 @@ sub YAMAHA_NP_ParseResponse # Delete old List listLines my $i = 1; - while(exists($hash->{READINGS}{"playerListLine_$i"})) - { - delete($hash->{READINGS}{"playerListLine_$i"}); - delete($hash->{READINGS}{"playerListLine_Attribute_$i"}); - $i++; - } + #while(exists($hash->{READINGS}{"playerListLine_$i"})) + #{ + # delete($hash->{READINGS}{"playerListLine_$i"}); + # delete($hash->{READINGS}{"playerListLine_Attribute_$i"}); + # $i++; + #} if($data =~ /(.*)<\/Menu_Status>/) { @@ -1337,7 +1482,6 @@ sub YAMAHA_NP_ParseResponse { # ****Container|Item|Unselectable - $i = 1; while($data =~ /(.*?)<\/Txt>(.*?)<\/Attribute><\/Line_$i>/gc) { readingsBulkUpdate($hash, "playerListLine_$i", $1); @@ -1374,7 +1518,7 @@ sub YAMAHA_NP_ParseResponse readingsBulkUpdate($hash, "state","off"); readingsEndUpdate($hash, 1); - + YAMAHA_NP_ResetTimer($hash, 3); return; @@ -1394,15 +1538,6 @@ sub YAMAHA_NP_ParseResponse 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") { if($data =~ /RC="0"/) @@ -1415,13 +1550,95 @@ sub YAMAHA_NP_ParseResponse } } - readingsEndUpdate($hash, 1); - - YAMAHA_NP_ResetTimer($hash, 0) if($cmd ne "statusRequest" and $cmd ne "on" and $cmd ne "volume"); + readingsEndUpdate($hash, 1); + #YAMAHA_NP_ResetTimer($hash, 0) if($cmd ne "statusRequest" and $cmd ne "on" and $cmd ne "volume"); } 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 sub YAMAHA_NP_Param2Fhem