mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
99_sonos2mqttUtils:add speak for sonos2mqtt tts,notifyAll ,code cleanup
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@23872 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
e51e04e514
commit
14f7eea6d3
@ -1,5 +1,5 @@
|
|||||||
##############################################
|
##############################################
|
||||||
# $Id$
|
# $Id$
|
||||||
# from myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig
|
# from myUtilsTemplate.pm 21509 2020-03-25 11:20:51Z rudolfkoenig
|
||||||
# utils for sonos2mqtt Implementation
|
# utils for sonos2mqtt Implementation
|
||||||
# They are then available in every Perl expression.
|
# They are then available in every Perl expression.
|
||||||
@ -19,47 +19,73 @@ sonos2mqttUtils_Initialize($$)
|
|||||||
|
|
||||||
sub sonos2mqtt
|
sub sonos2mqtt
|
||||||
{
|
{
|
||||||
|
|
||||||
my ($NAME,$EVENT)=@_;
|
my ($NAME,$EVENT)=@_;
|
||||||
my @arr = split(' ',$EVENT);
|
my @arr = split(' ',$EVENT);
|
||||||
my ($cmd,$vol,$text,$value);
|
my ($cmd,$vol,$text,$value);
|
||||||
$cmd = $arr[0];
|
$cmd = $arr[0];
|
||||||
|
# quick response for devStateIcon
|
||||||
if($cmd eq 'devStateIcon') {return sonos2mqtt_devStateIcon($NAME)}
|
if($cmd eq 'devStateIcon') {return sonos2mqtt_devStateIcon($NAME)}
|
||||||
|
|
||||||
my $bridge = (devspec2array('a:model=sonos2mqtt_bridge'))[0];
|
my $bridge = (devspec2array('a:model=sonos2mqtt_bridge'))[0];
|
||||||
|
my $devicetopic = ReadingsVal($bridge,'devicetopic','sonos');
|
||||||
my $tts = ReadingsVal($bridge,'tts','SonosTTS');
|
my $tts = ReadingsVal($bridge,'tts','SonosTTS');
|
||||||
|
|
||||||
|
if ($NAME eq $bridge){
|
||||||
|
if($cmd eq 'notifyall') {return qq($devicetopic/cmd/notify {"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700})}
|
||||||
|
if($cmd eq 'announcementall') {
|
||||||
|
($cmd,$text) = split(' ', $EVENT,2);
|
||||||
|
fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notifyall [$tts:vol] [$tts:httpName];deletereading $tts text");
|
||||||
|
}
|
||||||
|
if($cmd eq 'Favorites') {return "$devicetopic/".ReadingsVal((devspec2array('a:model=sonos2mqtt_speaker'))[0],'uuid','').q(/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}})}
|
||||||
|
if($cmd eq 'setplayFav') {sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal($NAME,'favlist','').' {sonos2mqtt($NAME,$EVENT)}')}
|
||||||
|
if($cmd eq 'setjoinGroup') {sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','joinGroup:'.ReadingsVal($NAME,'grouplist','').' {sonos2mqtt($NAME,$EVENT)}')}
|
||||||
|
return undef
|
||||||
|
}
|
||||||
|
|
||||||
if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
|
if($cmd eq 'sayText') { ($cmd,$text) = split(' ', $EVENT,2)}
|
||||||
if($cmd eq 'speak') { ($cmd,$vol,$text) = split(' ', $EVENT,3)}
|
|
||||||
my $uuid = ReadingsVal($NAME,'uuid','error');
|
my $uuid = ReadingsVal($NAME,'uuid','error');
|
||||||
my $topic = "sonos/$uuid/control";
|
my $topic = "$devicetopic/$uuid/control";
|
||||||
my $payload = $EVENT;
|
my $payload = $EVENT;
|
||||||
if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //}
|
if (@arr == 1){$payload = "leer"} else {$payload =~ s/$cmd //}
|
||||||
|
|
||||||
my @easycmd = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
|
my @easycmd = ('stop','play','pause','toggle','volumeUp','volumeDown','next','previous');
|
||||||
if (grep { $_ eq $cmd } @easycmd) {return lc( qq($topic { "command": "$cmd" }) )}
|
if (grep { $_ eq $cmd } @easycmd) {return lc( qq($topic { "command": "$cmd" }) )}
|
||||||
|
|
||||||
if($cmd eq 'volume') {return qq(sonos/$uuid/control { "command": "volume", "input": $payload })}
|
if($cmd eq 'volume') {return qq($topic { "command": "volume", "input": $payload })}
|
||||||
if($cmd eq 'joinGroup') {return qq(sonos/$uuid/control { "command": "joingroup", "input": "$payload"})}
|
if($cmd eq 'joinGroup') {return qq($topic { "command": "joingroup", "input": "$payload"})}
|
||||||
if($cmd eq 'setAVTUri') {return qq(sonos/$uuid/control { "command": "setavtransporturi", "input": "$payload"})}
|
if($cmd eq 'setAVTUri') {return qq($topic { "command": "setavtransporturi", "input": "$payload"})}
|
||||||
# alternativ code for the last two lines
|
# alternativ code for the last two lines
|
||||||
#my %t=('joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
|
#my %t=('joinGroup'=>'joingroup','setAVTUri'=>'setavtransporturi');
|
||||||
#if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}
|
#if (grep { $_ eq $cmd } %t) {return qq(sonos/$uuid/control { "command": "$t{$cmd}", "input": "$payload" })}
|
||||||
|
|
||||||
if($cmd eq 'notify') {return qq(sonos/$uuid/control { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
|
if($cmd eq 'notify') {return qq($topic { "command":"notify","input":{"trackUri":"$arr[2]","onlyWhenPlaying":false,"timeout":100,"volume":$arr[1],"delayMs":700}})}
|
||||||
if($cmd eq 'x_raw_payload') {return qq(sonos/$uuid/control $payload)}
|
if($cmd eq 'x_raw_payload') {return qq($topic $payload)}
|
||||||
|
|
||||||
#%t=('true'=>'mute','false'=>'unmute');
|
#%t=('true'=>'mute','false'=>'unmute');
|
||||||
#if($cmd eq 'mute') {return qq(sonos/$uuid/control { "command": "$t{$payload}" } )}
|
#if($cmd eq 'mute') {return qq(sonos/$uuid/control { "command": "$t{$payload}" } )}
|
||||||
if($cmd eq 'mute') {$value = $payload eq "true" ? "mute" : "unmute"; return qq(sonos/$uuid/control { "command": "$value" } )}
|
if($cmd eq 'mute') {$value = $payload eq "true" ? "mute" : "unmute"; return qq($topic { "command": "$value" } )}
|
||||||
#%t=('TV'=>'tv','Line_In'=>'line','Queue'=>'queue');
|
#%t=('TV'=>'tv','Line_In'=>'line','Queue'=>'queue');
|
||||||
#if($cmd eq 'input') {return qq(sonos/$uuid/control { "command": "switchto$t{$payload}" } ) }
|
#if($cmd eq 'input') {return qq(sonos/$uuid/control { "command": "switchto$t{$payload}" } ) }
|
||||||
if($cmd eq 'input') {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq(sonos/$uuid/control { "command": "switchto$value" } ) }
|
if($cmd eq 'input') {$value = $payload eq "TV" ? "tv" : $payload eq "Line_In" ? "line" : "queue"; return qq($topic { "command": "switchto$value" } ) }
|
||||||
|
|
||||||
if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq(sonos/$uuid/control { "command": "leavegroup", "input": "$value" } ) }
|
if($cmd eq 'leaveGroup') {$value = ReadingsVal($uuid,"groupName","all"); return qq($topic { "command": "leavegroup", "input": "$value" } ) }
|
||||||
|
|
||||||
if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}
|
if($cmd eq 'playUri') {fhem("set $NAME setAVTUri $payload; sleep 1; set $NAME play")}
|
||||||
if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
|
if($cmd eq 'sayText') {fhem("setreading $tts text ".ReadingsVal($tts,'text',' ').' '.$text.";sleep 0.4 tts;set $tts tts [$tts:text];sleep $tts:playing:.0 ;set $NAME notify [$tts:vol] [$tts:httpName];deletereading $tts text")}
|
||||||
if($cmd eq 'speak') {fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]")}
|
|
||||||
|
# for tts-polly command set EG.KU.Sonos speak de-DE Vicki 25 Test
|
||||||
|
# test first of String like de-DE
|
||||||
|
if($cmd eq 'speak') {
|
||||||
|
if ($arr[1] =~ /^[a-z]{2}-[A-Z]{2}$/) {
|
||||||
|
my (undef, $lang, $voice, $volume, @text) = split(/ /, $EVENT);
|
||||||
|
return sprintf('%s {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s","delayMs":700}}', $topic, $lang, $voice, $volume, join(" ", @text));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
($cmd,$vol,$text) = split(' ', $EVENT,3);
|
||||||
|
fhem("set $tts tts $text;sleep $tts:playing:.0 ;set $NAME notify $vol [$tts:httpName]");
|
||||||
|
}
|
||||||
|
}
|
||||||
if($cmd eq 'playFav') {
|
if($cmd eq 'playFav') {
|
||||||
use JSON;use HTML::Entities;use Encode qw(encode decode);
|
use JSON;use HTML::Entities;use Encode qw(encode decode);
|
||||||
my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
|
my $enc = 'UTF8';my $uri='';my $search=(split(' ', $EVENT,2))[1];
|
||||||
@ -72,7 +98,7 @@ if($cmd eq 'playFav') {
|
|||||||
};
|
};
|
||||||
fhem("set $NAME playUri $uri") if ($uri ne '');
|
fhem("set $NAME playUri $uri") if ($uri ne '');
|
||||||
}
|
}
|
||||||
|
if($cmd eq 'sleep') {return qq($topic {"command":"sleep","input":$payload}) }
|
||||||
if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}
|
if($cmd eq 'test') {Log 1, "Das Device $NAME hat ausgeloest, die uuid ist >$uuid< der Befehl war >$cmd< der Teil danach sah so aus: $payload"}
|
||||||
|
|
||||||
return undef;
|
return undef;
|
||||||
@ -143,7 +169,8 @@ fhem("attr $devspec".q( devStateIcon {sonos2mqtt($name,'devStateIcon')}));
|
|||||||
#sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','readingList','sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply');
|
#sonos2mqtt_mod_list('a:model=sonos2mqtt_bridge','readingList','sonos/RINCON_([0-9A-Z]+)/Reply:.* Reply');
|
||||||
for ('stop:noArg','play:noArg','pause:noArg','toggle:noArg','volume:slider,0,1,100','volumeUp:noArg','volumeDown:noArg',
|
for ('stop:noArg','play:noArg','pause:noArg','toggle:noArg','volume:slider,0,1,100','volumeUp:noArg','volumeDown:noArg',
|
||||||
'mute:true,false','next:noArg','previous:noArg','leaveGroup:noArg','setAVTUri:textField','playUri:textField',
|
'mute:true,false','next:noArg','previous:noArg','leaveGroup:noArg','setAVTUri:textField','playUri:textField',
|
||||||
'notify:textField','x_raw_payload:textField','sayText:textField','speak:textField','input:Queue') {
|
'notify:textField','x_raw_payload:textField','sayText:textField','speak:textField','input:Queue',
|
||||||
|
'sleep:selectnumbers,0,15,120,0,lin') {
|
||||||
sonos2mqtt_mod_list($devspec,'setList',$_.q( {sonos2mqtt($NAME,$EVENT)}));
|
sonos2mqtt_mod_list($devspec,'setList',$_.q( {sonos2mqtt($NAME,$EVENT)}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,14 +215,7 @@ if ($NAME eq 'global'){
|
|||||||
# joinGroup does'nt working with spaces in "Player Rooms"
|
# joinGroup does'nt working with spaces in "Player Rooms"
|
||||||
sub sonos2mqtt_bridge
|
sub sonos2mqtt_bridge
|
||||||
{
|
{
|
||||||
my ($NAME,$EVENT)=@_;
|
sonos2mqtt(@_);
|
||||||
my @arr = split(' ',$EVENT);
|
|
||||||
my $cmd = $arr[0];
|
|
||||||
|
|
||||||
if($cmd eq 'Favorites') {return q(sonos/).ReadingsVal((devspec2array('a:model=sonos2mqtt_speaker'))[0],'uuid','').q(/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Favorites"}})}
|
|
||||||
if($cmd eq 'setplayFav') {sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','playFav:'.ReadingsVal($NAME,'favlist','').' {sonos2mqtt($NAME,$EVENT)}')}
|
|
||||||
if($cmd eq 'setjoinGroup') {sonos2mqtt_mod_list('a:model=sonos2mqtt_speaker','setList','joinGroup:'.ReadingsVal($NAME,'grouplist','').' {sonos2mqtt($NAME,$EVENT)}')}
|
|
||||||
return undef
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user