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:
Ü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
Neben 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.
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
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.
Hey Nico,
vielen Dank für die schnelle Antwort.
Ich werde es mal ausprobieren.
Gruß
Markus
Also die option mehrere Echos gleichzeitig anzusprechen währe toll.
Weiter so, super arbeit jungs 😀
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.
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
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.
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ß
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);
Hallo. Super ! Werde ich später direkt probieren. Vielen Dank
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.
Hallo super erklärt einfach Top Danke für dieses Tutorial.
Gerne mehr davon 🙂
Hallo, gibt es auch ein Tutorial, wie man ein Apple Homepod mit TTS über die Fibaro HC2 nutzen kann?
Hallo music4ever, nein, ein solches Tutorial gibt es bei uns bisher noch nicht. LG
is it possible to change the volume of the device where the TTS is going
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
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?
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?
Hi,
hier ist das schön beschrieben: https://iqhaus.de/tutorials/amazon-alexa-text-to-speech-tts-ubers-smart-home-nutzen/
Gruß
Pawel
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
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
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
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