DOIF Wetterbericht über Squeezebox

Begonnen von exciter, 25 April 2016, 13:13:52

Vorheriges Thema - Nächstes Thema

exciter

Moin, ich stehe gerade auf dem Schlauch.
Ich möchte mir den Wetterbericht über meine Squeezebox vorlesen lassen. Dazu habe ich in 99_myUtils eine Routine stehen und rufe diese auf, sobald der Bewegungsmelder motion meldet.
Das funktioniert auch soweit. Jedoch soll die Box morgens mit "Guten morgen" begrüßen, was aber einfach ignoriert wird und gleich der Wetterbericht vorgelesen wird.
Hier mal mein DOIF:

([HM_2E3A66] eq "on" and [03:00-14:00]) (set SB_PLAYER_0004202979c0 volume 50, set SB_PLAYER_0004202979c0 talk Guten morgen, {speakWetterVorhersage(1)}) DOELSEIF([24:00])

Wie muss ich nun die Subroutine einbinden, damit die anderen beiden Befehle auch ausgeführt werden? Runde Klammern ging nicht und alle anderen Möglichkeiten führten dazu, dass garnix mehr gesagt wurde oder "speakWetterVorhersage" vorgelesen wurde ;)

Mit freundlichen Grüßen Steffen

Ellert

Zitat(set SB_PLAYER_0004202979c0 volume 50, (set SB_PLAYER_0004202979c0 talk Guten morgen, {(speakWetterVorhersage(1))}))

exciter

Hi, super. Es wird nun alles gesprochen allerdings kommt das "guten Morgen" erst am Ende. Muss ich die Klammern noch irgendwie abändern?

Ellert

Deiner Beschreibung nach vermute ich in der Sub einen Ansagebefehl. Die Sub sollte nur den Text zurückgeben.

exciter

Hallo, anbei der Sub-Code. Den habe ich aus der Wiki:

use constant {
  DEVICE_NAME_TTS    => "SB_PLAYER_0004202979c0",
  DEVICE_NAME_WEATHER => "MeinWetter",
};


###############################################################################
# Sagt Wetterdaten an
#  Param: Art: Variante der Aussage:
#         0: Kurzansage, 1: Normal
###############################################################################


###############################################################################
# Sagt Wettervorhersage an.
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2
###############################################################################
sub speakWetterVorhersage(;$) {
my ($day) = @_;
if(!defined($day)) {$day=1;}

# TODO: Sauber / Abstraktionslayer erstellen
my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_condition",undef);
my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_low_c",undef);
my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_high_c",undef);

my $text = "";
if($day==1) {
#$text = "Wetter heute ";
$text = "Heute ";
}
if($day==2) {
$text = "Morgen ";
}
if($day==3) {
$text = "Uebermorgen ";
}
if($day>3) {
$text = "Wetter in ".($day-1)." Tagen ";
}
if(defined($t1) && defined($t2) && defined($t3)) {
  $text.=$t1.". ";
  $text.="Temperatur von ".$t2." bis ".$t3." Grad.";
  if($day==1) {
  # gefuehlte Temperatur
  my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,"wind_chill",undef);
  #$text.="Gefuehlte Temperatur aktuell ".$tg." Grad.";
  $text.="Gefuehlte ".$tg." Grad.";
  my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,"wind_speed",undef);
  #$text.="Windgeschwindigkeit ".$tw." Kilometer pro Stunde.";
  $text.="Wind ".$tw." Kilometer pro Stunde.";
  }
} else {
$text="Leider keine Vorhersage verfuegbar.";
}

#speak($text,0);
fhem("set ".+DEVICE_NAME_TTS." talk ".prepareTextToSpeak($text));
}

###############################################################################
# Bereitet Zahlen zur Ansage auf.
# Ersetzt Kommas und Punkte durch das Wort 'Komma'.
###############################################################################
sub prepareNumToSpeak($) {
my($text) = @_;
$text =~ s/\./Komma/g;
  $text =~ s/,/Komma/g;
return $text;
}

# Rundet eine Zahl ohne Nachkommastellen
sub rundeZahl0($) {
my($val)=@_;
# Prüfen, ob numerisch
if(int($val)>0) {
$val = int($val+0.5);
}
return $val;
}

# Rundet eine Zahl mit 1-er Nachkommastelle
sub rundeZahl1($) {
my($val)=@_;
# Prüfen, ob numerisch
if(int($val)>0) {
$val = int(10*$val+0.5)/10;
}
return $val;
}

###############################################################################
# Bereitet Texte zur Ansage auf.
# Ersetzt Umlaute (ä=ae etc.)
###############################################################################
sub prepareTextToSpeak($) {
my($text) = @_;
# TODO: Ist halt noch nicht fertig geworden ;)
return $text;
}

Ellert

#5
Entweder Du passt die Sub an, oder Du machst die Ansage "Guten Morgen" und rufst danach den Wetterbericht auf.

Insofern war das (set SB_PLAYER_0004202979c0 volume 50, set SB_PLAYER_0004202979c0 talk Guten morgen, {speakWetterVorhersage(1)}) schon richtig.

oder ersetzt fhem("set ".+DEVICE_NAME_TTS." talk ".prepareTextToSpeak($text));
durch return prepareTextToSpeak($text));
oder durch fhem("set ".+DEVICE_NAME_TTS." talk Guten Morgen ".prepareTextToSpeak($text));
und lässt das set SB_PLAYER_0004202979c0 talk Guten morgen, weg.

exciter

Oha, vielen Dank für deine Hilfe :)
Da muss ich mich noch weiter einlesen und probieren.
Gehe da morgen mal weiter bei und melde mich dann nochmal.
Einen schönen Tag noch.