AllgemeinFibaro TutorialsTutorials

Alexa Text-to-Speech (TTS) über Fibaro Zentrale nutzen

Hier erfährst Du, wie Du Text-to-Speech via Alexa über Dein Fibaro Home Center ansprechen kannst. Damit lassen sich Sprachausgaben über Alexa für das eigene Smart Home realisieren.

In unserem letzten Tutorial haben wir Dir gezeigt, wie Du Amazon Echo-Geräte über Text-to-Speech (TTS) nutzen kannst. Heute soll es darum gehen, wie Du das dazugehörige Skript über Dein Fibaro Home Center ansprechen kannst. Das PHP-Skript, welches auf Deinem PHP-Webserver liegt, sieht wie folgt aus:

Überblick Echo-Geräte

Über das Aufrufen der HTTP-Request URL im Browser mit dem vorgegebenen Text, wird ebendieser von Alexa wiedergegeben.

Hilfsszene

Wie Du die Sprachausgaben auch in Deinem Fibaro Home Center nutzen kannst, zeigen wir Dir in diesem Beitrag. Dafür habe ich bereits eine LUA-Hilfsszene mit dem Namen “TTS Alexa” angelegt.

--[[
%% properties
%% events
%% globals
--]]
 
 
 
            -- Bitte Trage bei webserver die URL zu deine alexa.php an und lege zwei Globale Variablen an
            -- tts_alexa_device & tts_alexa_text
            local webserver = 'http://192.168.178.39/alexa_tts/alexa.php';
 
 
 
            local encodeText = function(url)
                return url:gsub(" ", "+")
            end
 
 
            if (fibaro:getGlobal('tts_alexa_device') ~= nil) then
                fibaro:debug('Benötigte Variablen sind angelegt ');
                error_var = 0;
            else
                fibaro:debug('Benötigte Variable NICHT erkannt. Bitte lege diese Globalen Variablen an: tts_alexa_device & tts_alexa_text');
                error_var = 1;
            end
 
 
 
 
        if(error_var == 0)
        then
            fibaro:debug('Script wird gestartet!')
            local text = fibaro:getGlobal('tts_alexa_text');
            local device = fibaro:getGlobal('tts_alexa_device');
 
            local httpClient = net.HTTPClient();
            httpClient:request(''..webserver..'?device_name='..device..'&text_tts='..encodeText(text)..'',
 
            {
            success = function(response)
              local result = response.data;
              if response.status == 200 then
                fibaro:debug('Alles okay Api wurde aufgerufen. Es wurde folgender Text ausgegeben: '..text..'');
               
              else
                fibaro:debug('Es ist ein Fehler aufgetreten: HTTP Fehler: '..response.status..'')
              end
            end,
   
            error = function(err)
                fibaro:debug('[ERROR] ' .. err)
            end
 
            });
 
        end

Für diese Szene müssen zudem zwei globale Variablen angelegt werden. Dafür einfach auf “Steuerungen” klicken und danach über “Variablensteuerungen” die beiden Variablen hinzufügen. Anschließend ist die Konfiguration dieses Skriptes schon abgeschlossen und Du kannst die Text-to-Speech Funktion über Fibaro nutzen. Außerdem musst Du die Variable Deines Webservers anpassen. Dafür musst Du die URL zu Deiner “alexa.php” eintragen.

Nun kannst Du erste Text-to-Speech-Ausgaben vornehmen. Dafür habe ich zwei verschiedene Szenen vorbereitet: Eine einfache, die zum Beispiel angibt, dass die Waschmachine fertig ist sowie eine komplexere für eine Statusansage.

Einfache Text-to-Speech (TTS) Szene

Für die Basisszene benötigst Du folgenden Code:

 fibaro:setGlobal('tts_alexa_device', 'schlafzimmer');
   fibaro:setGlobal('tts_alexa_text', 'Die Waschmaschine ist fertig!');

       fibaro:startScene(117);

Hier musst Du die ID Deiner Szene eingeben. In unserem Fall ist dies “117”.

Wenn Du die Szene speicherst und auf “Start” drückst, wird der Amazon Echo den Text ausgeben. Die Hilfsszene wird Dir zudem angeben, dass der Wunschtext ausgegeben wurde.

Den oben stehenden Code könntest Du auch in andere Szenen einfügen, bei denen Du Alexa ansprechen möchtest. Dafür müsstet Du nur die entsprechenden Werte anpassen.

Dynamische Ansage über Alexa

Eine komplexere Szene kann man über eine dynamische Ansage mit Alexa via Text-to-Speech realisieren. In unserem Fall geht es um den Status des Wohnzimmers, also eine Ansage darüber, ob beispielsweise die Rollladen geschlossen sind oder das Fenster geöffnet ist und wie die Temperatur im Raum ist.

--[[
%% properties
%% events
%% globals
tts_alexa_ansage
--]]
 
 
 
            if(fibaro:getGlobal('tts_alexa_ansage') == '0')
            then
                fibaro:debug('Wert wurde auf 0 gesetzt nichts machen!')
            else
 
                fibaro:debug('start');
                local encodeTemp = function(temp)
                    return temp:gsub("%.", ",")
                end
   
                local temp = fibaro:getValue(88,'value');
                local rolladen_status_int = tonumber(fibaro:getValue(62,'value'));
                local fenster_status_int = tonumber(fibaro:getValue(415,'value'));
       
               
   
                if(rolladen_status_int <= 90)
                then
                    rolladen_status = 'geöffnet';
                else
                    rolladen_status = 'geschlossen';
                end
   
                if(fenster_status_int == 0)
                then
                    fenster_status = 'geschlossen';
                else
                    fenster_status = 'geöffnet';
                end
   
       
                local text = 'Im Wohnzimmer sind es aktuell '..encodeTemp(temp)..' Grad Celsius. Die Rolladen sind '..rolladen_status..' und das Fenster ist '..fenster_status..'';
   
                fibaro:setGlobal('tts_alexa_device', 'schlafzimmer');
                fibaro:setGlobal('tts_alexa_text', text);
                fibaro:startScene(117);
                fibaro:setGlobal('tts_alexa_ansage', 0);
 
                fibaro:debug('ende');
            end

Info

Weitere Erklärungen zu den einzelnen Skripten findest Du im Video!

grafische Szene für TTSNeben der LUA-Szene benötigst Du auch eine grafische Szene. Wie Du diese genau anlegst, findest Du oben im Video erklärt sowie hier detailliert in einem dazu passenden Tutorial gezeigt.

Anschließend kannst Du alles speichern und über die Amazon-Alexa-Seite –> Smart Home –> Szenen die entsprechende Szene suchen. Danach kannst Du an Alexa den Sprachbefehl für die Statusansage erteilen. Amazons Sprachassistentin wird Dir dann die Statusmitteilung für den Status des Raumes – in unserem Fall dem Wohnzimmer – ausgeben. Natürlich könntest Du diese Szene noch erweitern mit zusätzlichen Werten, die Du ebenfalls in der Statusmitteilung enthalten haben möchtest.

Ralf

Im Jahre 2018 habe ich ein Haus gebaut und versuche, nach und nach smarte Produkte ins Haus zu integrieren. Ich freue mich, Euch die Smart Home Welt näherzubringen und gemeinsam mit Euch zu lernen.

Ähnliche Artikel

23 Kommentare

  1. Hallo Nico,
    sehr schönes und hilfreiches Tutorial. Ich habe auch soweit alles verstanden.
    Allerdings stellen sich mir noch folgende Fragen:
    Gibt es eine Möglichkeit immer den Dot antworten zu lassen der gerade meinen Sprachbefehl entgegen nimmt?
    Gibt es eine Möglichkeit an mehrere Dot´s die Sparachausgabe zu senden?
    Ist Dir bekannt ob das auch mit einem Sonos One funktioniert? Also Third Part Hardware?

    D A N K E

    Gruß
    Markus

    1. Hallo,

      vielen dank für deinen Kommentar um auf deine Fragen zu antworten:

      1. Gibt es eine Möglichkeit immer den Dot antworten zu lassen der gerade meinen Sprachbefehl entgegen nimmt?
      Aktuell leider nicht ich hatte mich aber heute morgen schon das selbe gefragt und mal geschaut technisch könnte man das sogar umsetzen über das Script. Man könnte über den Verlauf auf amazon.alexa den letzten befehlt lesen und dann da die Ausgabe machen lassen. Ich wollte mir das kommende Woche mal anschauen.

      2. Gibt es eine Möglichkeit an mehrere Dot´s die Sparachausgabe zu senden?
      nicht über einen Befehl das Alexa keine TTS befehle annimmt wenn man eine Multiroom gruppe anspricht. Aber du kannst den Befehl einfach zweimal rausschicken um bei meinem Lua beispiel zu bleiben:

      — Sende zu gerät ein
      fibaro:setGlobal(‘tts_alexa_device’, ‘schlafzimmer’);
      fibaro:setGlobal(‘tts_alexa_text’, text);
      fibaro:startScene(117);
      – Mache 2 Sekunden Pause
      fibaro:sleep(2000);
      fibaro:setGlobal(‘tts_alexa_device’, ‘wohnzimmer’);
      fibaro:setGlobal(‘tts_alexa_text’, text);
      fibaro:startScene(117);

      3. Ist Dir bekannt ob das auch mit einem Sonos One funktioniert? Also Third Part Hardware?
      Aufjedenfall geht das – ich habe aber selbst kein Sonos im Einsatz sondern Bose Soundtouch dazu hatte ich auch schonmal ein Tutorial gemacht wie man TTS darüber nutzt.
      https://www.intelligentes-haus.de/2018/05/16/bose-soundtouch-mit-smart-home-ansprechen-beispiel-fibaro/

      Leider kann ich das nicht für Sonos entwickeln da ich die Geräte nicht habe -> und sowas ohne Gerät zu Entwicklen ist quasi nicht möglich.

    1. Hallo,
      wie oben geschrieben wird es nicht möglich sein über eine anfrage mehrere geräte gleichzeitig anzusprechen. Da Amazon keine möglichkeit bietet Multiroom Gruppen anzusprechen. Du kannst aber wie oben geschrieben zwei HTTP Aufrufe direkt hintereinander machen und dann werden die auch auf beiden Geräte ausgegeben.

      1. Hallo Nico,

        wie wäre es wenn Du für die Geräte ein Array anlegst und das Ergebnis dann in die Variable “tts_alexa_device” schreibst. Den befehl zu doppeln geht zwar, nimmt man aber einen sich ändernden Status spricht die vierte Alexa erst wenn das Ereignis schon längst vorbei ist.
        Gruß
        Aleksanadar

        1. Hallo,

          wie oben geschrieben habe ich schon mit einer V2 angefangen – dauert aber nochwas. Das Problem bleibt aber das selbe -> Man kann nicht mehrere Geräte gleichzeitig ansprechen und wenn man Sie ohne kurze Pause anspricht – egal ob du jetzt über Lua – oder ich dann über PHP dann verschluckt Amazon die Befehle. Das heißt auch ich mache eine Pause von ca. 0,5 Sekunden wenn man im neuen Script mehrere Geräte anspricht.

          Ich habe das bei mir übrigens ganz gut in den Griff bekommen indem ich eine “Szene” bei mir gebaut habe die das immer ein wenig aussteuert -> Wenn in der Küche keine Bewegung seit x Minuten da auch keine Sprachausgabe sondern nur in den Räumen wo auch jemand ist.

  2. Hallo Nico. Danke für die Scripte. Frage : Wäre es möglich es so zu erweitern das mehrere Fenster oder Türen in einem abgefragt werden ? Den Zustand abzufragen bekomme ich hin, nur irgendwie weis ich nicht wie der Code aussehen muss das Alexa dann alle geöffneten Fenster in einem aufzählt . Sprich : zb. : Folgende Fenster sind noch geöffnet : Badezimmer ,Wohnzimmer ,Haustür und Kinderzimmer… Klar kann ich deinem Script jeweils neue Blöcke für Fenster usw. zufügen, aber dann sagt sie ja Haustür ist geöffnet und Wohnzimmer ist geöffnet und Terassentür ist geöffnet usw. Das ist etwas nervig… Ich weis nicht wie ich Alexa dazu bringe aufzuzählen… Habe ein ähnliches Script am HC laufen wo er alle Devices überprüft und dann eine Pop Nachricht aufklappt wo dann alle geöffneten Fenster aufgelistet werden… Ich hoffe man versteht was ich meine 🙂 Gruß

    1. Hallo,

      das geht natürlich: Ich habe bei einem anderen Projekt was sehr ähnliches gemacht und habe das gerade mal umgebaut:

      Bei device_ids_zone_1 musst du deine Fenster IDs der Sensoren eintragen

      –[[
      %% autostart
      %% properties
      %% weather
      %% events
      %% globals

      –]]

      local startSource = fibaro:getSourceTrigger();

      local device_ids_zone_1 = {39,415,387,708,39,48,51,124,127,133,136,139,419,466};

      local txt_message = ‘ Folgende Fenster sind geöffnet:’;

      for i, device_id in pairs( device_ids_zone_1 ) do
      if(tonumber(fibaro:getValue(device_id,’value’)) == 0)
      then
      –fibaro:debug(“Fenster Sensor: “..device_id..” Name: ” .. fibaro:getName(device_id)..” im Raum “..fibaro:getRoomName( fibaro:getRoomID(device_id) )..” ist geschlossen”)
      else

      –fibaro:debug(“Fenster Sensor: “..device_id..” Name: ” .. fibaro:getName(device_id)..” im Raum “..fibaro:getRoomName( fibaro:getRoomID(device_id) )..” ist geöffnet!”);

      txt_include = ”.. fibaro:getName(device_id)..’ ‘..fibaro:getRoomName( fibaro:getRoomID(device_id) )..’,’;

      txt_message = ”..txt_message..’ ‘..txt_include..”;

      end
      end

      fibaro:debug(txt_message);

        1. Hmm. So ganz bekomme ich den Code nicht ans laufen… Irgendwas scheint beim kopieren durcheinander zu kommen. zwei drei Sachen habe ich ändern können, nur bei den ” gibt er immer eine Fehlermeldung.

  3. Hallo,
    Ich habe das soweit am laufen mit der Sprachausgabe …jetzt möchte ich aber gerne das die Sprachausgabe nicht nur auf einem echo statt findt sondern auf mehreren.

    Wie ist das möglich habe schon ….

    fibaro:setGlobal(‘tts_alexa_device’, ‘raum1’);
    fibaro:setGlobal(‘tts_alexa_text’, ‘Die Waschmaschine ist fertig!’);

    fibaro:startScene(117);

    fibaro:setGlobal(‘tts_alexa_device’, ‘raum2’);
    fibaro:setGlobal(‘tts_alexa_text’, ‘Die Waschmaschine ist fertig!’);

    fibaro:startScene(117);

    versucht aber ohne Erfolg es wird nicht auf beiden gleichzeitig was gesagt sondern nur auf einem.

    Danke

  4. Hallo,

    ich erhalte folgenden Fehler:

    Benötigte Variablen sind angelegt
    [DEBUG] 23:45:44: Script wird gestartet!
    [DEBUG] 23:45:44: 2021-02-19 23:45:44.331836 [ error] Handshake error: certificate verify failed
    [DEBUG] 23:45:44: [ERROR] certificate verify failed

    Kann da jemand helfen?

  5. Hallo Nico,
    da ich eher Leihe bin wollte ich mal fragen wie das mit dem PHP Webserver ist, wie komme ich dahin um auf meine Alexa zu kommen?

  6. Hi Nico,
    Danke für den Beitrag – genau das will ich bei mir machen. Ich habe jedoch das Problem das ich keine HC2 benutze sondern eine HC3 und da ist das LUA etwas anders. Hast Du das vielleicht schon auf HC3 umgeschrieben? Wenn nicht – gibt es die Möglichkeit das Du das machst?
    Gruß
    Pawel

    1. Hallo Pawel,

      gleich vorneweg – Nico ist hier inzwischen leider nicht mehr tätig und wir haben aktuell leider selbst gar kein Fibaro Home Center mehr in Betrieb, da wir inzwischen ein relativ großes Gerätespektrum haben und viele Hersteller abdecken und unterstützen müssen.
      Wir setzen derzeit auf eine Homey Smart Home Zentrale mit Z-Wave und Zigbee-Unterstützung. Wir planen dazu auch ein paar Tutorials. Je nachdem, wie die Zeit es zulässt früher oder später..
      Zurück zum Home Center. Das HC2 ist aktuell noch die “ausgereiftere” Variante, wobei das HC3 inzwischen auch mehr und mehr Features erhält.

      Die virtuellen Geräte wurden beim HC3 im Gegensatz zum HC2 durch Quick App ersetzt und die LUA-Szenen komplett geändert auf Bedingungen und Trigger.

      So wie ich das gelesen habe, sollte man da inzwischen versuchen, Block Scenes zu verwenden.
      Diese kann man dann wohl in der Art anschließen ansteuern:


      CONDITIONS
      {
      conditions = { {
      id = 27,
      isTrigger = true,
      operator = "==",
      property = "sceneActivationEvent",
      type = "device",
      value = 1
      },
      {
      id = 27,
      isTrigger = true,
      operator = "==",
      property = "sceneActivationEvent",
      type = "device",
      value = 2
      } },
      operator = "any"
      }

      ACTIONS

      local sceneAktivierung = tonumber(json.encode(sourceTrigger.value))
      -- fibaro.debug("Scene1", sceneAktivierung)

      Anschließend kann man folgende Statements verwenden:

      if (sceneAktivierung == 1) then DO SOMETHING end
      if (sceneAktivierung == 2) then DO SOMETHING end

      Vielleicht ist jemand aus der Community schon so weit und hat das entsprechend umgesetzt. Dann kann ich das gerne oben im Artikel ergänzen.

      Viele Grüße und eine entspannte Woche!
      Ralf

      1. Hi Ralf,
        danke für schnelle Antwort.
        In dem Fibaro Forum (das meintest Du mit Community?) gibt es Lösungen für Sonos oder über eine Seite ijpuk….. was für mich keine Lösung ist da ich wieder jemanden Zugriff auf meine Alexa geben würde. Deswegen war die Lösung hier so super – alles lokal bei mir.
        Ich habe dort ( https://forum.fibaro.com/topic/54765-hc3-tts-on-alexa/ ) jetzt auch explizit angefragt und diese Seite verlinkt. Mal sehen ob jemand das konvertieren kann auf HC3 Lua.
        Gruß
        Pawel

  7. Ich habe die hier dargestellte Lösung für mein Fibaro HC3 lite in Verbindung mit einem Raspberry als WEB-Server verwendet. Hier mußte dann alle paar Wochen die Cookie Datei von der Alexa Webseite erneuert werden – Aber alles lief prima.
    Nun hat Amazon die wbeseite alexa.amzaon.com aber dicht gemacht.
    Gibt es da schon eine Lösung?

    Grüße
    Rolf

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Schaltfläche "Zurück zum Anfang"