FHEM Tutorial-Reihe - Part 63: TTS Queue

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

FHEM Tutorial-Reihe - Part 63: TTS Queue
FHEM Tutorial-Reihe - Part 63: TTS Queue
  • Matthias Kleine
  • 11.05.2019
  • Hardware
  • Integration

Seit längerer Zeit nutze ich nun schon TTS (Text to Speech) über einen SONOS Lautsprecher im Wohnzimmer. Das Ganze an die Anwesenheit zu knüpfen ist dabei schnell gemacht. Dann kann ich stattdessen z.B. eine Push-Notification versenden. Aber was ist, wenn ich zwar Zuhause bin, aber gar nicht im richtigen Raum? Auch dann verpasse ich ja die Ansage. Ärgerlich. Also brauche ich eine Liste, in welcher die Text gesammelt werden. Sobald nun Bewegung im Raum erkannt wird, wird die Liste zusammengebaut und an den Text to Speech Dienst übergeben (in meinem Fall Amazon Polly). Danach erfolgt die Ausgabe auf dem Lautsprecher. So ist sichergestellt, dass ich die Nachrichten immer höre. Ziemlich praktisch und auch einfach umzusetzen.

Achtung: Dieser Inhalt wurde vor mehreren Jahren aufgenommen und ist nicht mehr aktuell! Es ist nicht empfohlen nach dieser Anleitung vorzugehen.

Was wird benötigt?

  • Eine FHEM-Installation
  • Ein Ausgabegerät für TTS

Video

Hausbau-Kurs

Befehle

Dummy für die Queue

define TTS dummy
attr TTS icon audio_audio
attr TTS readingList text
attr TTS setList text

99_myTtsUtils.pm (oder auch 99_myUtils.pm)

Hier muss noch der Name für den SONOS (oder des TTS-Gerätes generell) angepasst werden. In meinem Fall heißt das Gerät “Sonos_Wohnzimmer”.

package main;

use strict;
use warnings;
use POSIX;

sub myTtsUtils_Initialize($$) {
  my ($hash) = @_;
}

# Enter you functions below _this_ line.

sub TTSAddQueue($) {
    my ($text) = @_;

    my $cnt = 1;
    while (ReadingsVal('TTS', 'queue-' . $cnt, 'FREI') ne 'FREI') {
        $cnt++;
    }

    fhem("setreading TTS queue-$cnt $text");
    fhem("setreading TTS cnt $cnt");

    return undef;
}

sub TTSSayQueue() {
    my $text = '';
    my $cnt = ReadingsNum('TTS', 'cnt', 0);

    if ($cnt > 0) {

        for (my $i = 1; $i <= $cnt; $i++) {
            $text .= ReadingsVal('TTS', 'queue-' . $i, '') . '. ';
        }

        fhem("set Sonos_Wohnzimmer Speak 70 de $text");

        fhem("deletereading TTS queue-.*");
        fhem("setreading TTS cnt 0");
    }

    return undef;
}

1;

Nun kann man noch einen Alias festlegen, um die Texte einfacher in die Queue zu bekommen:

define cmdTextToSpeech cmdalias speechqueue .* AS { TTSAddQueue($EVENT);; }

Fertig! Danach kann alles zusammengesetzt werden. Natürlich fehlt noch ein DOIF, welches bei Bewegung die Funktion TTSSayQueue aufruft:

define doif_TTSQueue DOIF ([WZ_Bewegungsmelder:basicSet] == 255 and [?TTS:cnt] > 0) ({TTSSayQueue()})
attr doif_TTSQueue alias TTS Queue abarbeiten
attr doif_TTSQueue do always
Du willst mehr?

Smart-Home-Trainings von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte! Über 13.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos