FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: schlingi am 25 Januar 2020, 15:58:29

Titel: Sonos Sprachausgabe unterbricht Titel aber ruft ihn danach nicht auf
Beitrag von: schlingi am 25 Januar 2020, 15:58:29
Hallo,
ich habe FHEM auf einen neuen Raspberry "umgezogen". Alles funktioniert wie gewohnt. Das einzige Problem ist, dass nunmehr bei einer Sprachausgabe über "speak" auf Sonos der Titel zwar unterbrochen wird. Er wird dann aber nicht mehr - wie bisher - nach Beendigung der Sprachausgabe wieder fortgesetzt. Was muss ich dafür tun. Vorher funktionierte es. Vielen Dank für eine kurze Antwort / Hilfe.
Titel: Antw:Sonos Sprachausgabe unterbricht Titel aber ruft ihn danach nicht auf
Beitrag von: IBirner am 29 März 2020, 12:58:39
Hallo Zusammen,
ich habe leider das gleiche Problem... Habe mir dazu eine Timeout-Erkennung als Workaround gebastelt. Details siehe unten.
Geht mit Sicherheit schöner/eleganter - aber egal, es funktioniert   ;)

Ich hoffe, es hat sich durch das Kopieren kein Fehler eingeschlichen 8)

Viele Grüße,
IB


##############################################
# $Id: 99_SonosSpeak.pm
package main;

use strict;
use warnings;
use POSIX;

my %State  = (Sonos_Bad => 'nth', Sonos_Kueche => 'nth' );
my %Handle = (Sonos_Bad => 'nth', Sonos_Kueche => 'nth' );
my %Volume = (Sonos_Bad => 'nth', Sonos_Kueche => 'nth' );
my %Track  = (Sonos_Bad => 'nth', Sonos_Kueche => 'nth' );
my %TraPos = (Sonos_Bad => 'nth', Sonos_Kueche => 'nth' );

################################################################
###
### Inittask
###
### Aufruf:   
###
################################################################
sub SonosSpeak_Initialize($$)
{
}

################################################################
###
### Sonos Textausgabe
###
### Aufruf: diverse
###
################################################################
sub SonosSpeak($$)
{
   my ($dev,$text) = @_;

   # Dauer fuer Text berechnen, ca. 0.12 sec pro Zeichen
   $time = 0.12 * length($text);
   $time = sprintf("%0.0f", $time);
   
   # plus Offset
   $time += 5;

   # Status speichern
   SonosSaveState($dev);

   # Text2Speech
   fhem("set $dev Speak 30 de $text");
 
   # Timeout
   fhem("define chk at $time { SonosCheckSpeakTimeout($dev) }");
}

################################################################
###
### SonosSaveState()
###
### Aufruf:  SonosSpeak()
###
################################################################
sub SonosSaveState($)
{
   my $dev = shift;
   
   # aktuellen State speichern
   $State{$dev}  = ReadingsVal($dev, 'transportState', 'STOPPED');
   $Handle{$dev} = ReadingsVal($dev, 'currentEnqueuedTransportHandle', 'ERROR');
   $Volume{$dev} = ReadingsVal($dev, 'Volume', '30');
   $Track{$dev}  = ReadingsVal($dev, 'currentTrack', '1');
   $TraPos{$dev} = ReadingsVal($dev, 'currentTrackPositionSimulated', '0:00:00');
}

################################################################
###
### SonosCheckSprachdurchsage
###
### Aufruf:  SonosSpeak()
###
################################################################
sub SonosCheckSpeakTimeout($)
{
   my $dev = shift;
 
   my $artist = ReadingsVal($dev, 'currentArtist', 'FHEM');
   my $source = ReadingsVal($dev, 'currentSource', '');

   # Fehler, wenn immer noch FHEM oder keine Quelle
   if ( ($artist =~ /FHEM/) || ($source !~ /\w/) )
   {
# Init
#SonosDevInit($dev);

# Volume setzen
fhem("set $dev Volume $Volume{$dev}");

# Handle zeigt nicht auf "audioBroadcast" => Track setzen
if ( $Handle{$dev} !~ /audioBroadcast/ )
{
fhem("set $dev Track $Track{$dev}");
}

# ggf. Restart
if ( $State{$dev} eq 'PLAYING' )
{
#fhem("set $dev Play");
fhem("set $dev StartHandle $Handle{$dev}");
Log 1, "Sonos Durchsage beendet/play => $dev: $artist /$source/ ($Timeout)";
}
else
{
fhem("set $dev LoadHandle $Handle{$dev}");
Log 1, "Sonos Durchsage beendet => $dev: $artist /$source/ ($Timeout)";
}

# Handle zeigt nicht auf "audioBroadcast" => letzen Track setzen
if ( $Handle{$dev} !~ /audioBroadcast/ )
{
fhem("set $dev Track $Track{$dev}");
fhem("set $dev CurrentTrackPosition $TraPos{$dev}");
}
   }
}

1;