Schnittstelle für die Kommunikation mit HTTP Webservern: ESP8266, ESP32, Raspberry Pi, Arduino mit Ethernet Modul, PHP-Skript, WebSocket-Server.
Das ist eine Alternative zum Webhook von kostenpflichtigen IFTTT |
Grundfunktion: Nach dem Aufruf des Skill fragt Alexa „ich höre zu“. Sie sagen einen beliebigen Satz. Dieses Satz wird dann als GET-Parameter an, von Ihnen abgelegte URL, gesendet.
Der Ziel Server (Ihre Anwendung) analysiert die Wörter in dem gesprochenen Satz, macht Schaltvorgänge oder Messungen und antwortet mit einem Text, der dann von Alexa vorgelesen wird. Auf diese Weise können Befehle zu Ihrem Web Server transportiert werden und Antworten angesagt werden.
So funktioniert es: Besuchen Sie die Webseite https://esp8266-server.de/alexa/webhook/
Legen Sie die Trigger Wörter und Webadressen ihres Servers oder PHP-Skripts an. (Ihre Daten werden nur für Sie zugänglich.)
Trigger Wort: „Nachtlicht“
URL: „http://sg0f3t4jpcdrhntk1kf.myfritz.net:81/schalte.php?password=14631574&text="
Sie sagen "Alexa meine Steuerzentrale"
Alexa antwortet "ich höre zu"
Sie sagen "Nachtlicht 60%"
Dabei wird auf die Adresse http://sg0f3t4jpcdhntk1kf.myfritz.net:81/schalte.php die GET-Variablen übergeben: „password“ mit dem Inhalt "14631574" und "text" mit dem Inhalt „Nachtlicht 60%“.
Die Trigger Wörter bilden eine Weiche die zwischen mehreren URLs und damit zwischen Ihren Geräten umschaltet.
Wenn Sie nur einen einzigen Server benutzen, lassen Sie das Eingabefeld "Trigger Wort" frei. Dann werden alle Anfragen an diese Adresse gesendet.
Sie können auch die URL eines beliebigen Dokuments im WWW ohne Parameter angeben. Deren Textinhalt wird dann auch vorgelesen. Der Text muss Codierung UTF-8 haben.
Aktivierungswort ändern: Der Skill ist so konzipiert, dass Sie durch die Verwendung von Routinen-Funktion der Alexa Apps, das Aktivierungswort ersetzen durch eigene Phrase können. Richten Sie eine Routine für Webhook Skill unter Menü Routinen im Alexa App.
Ihre ESP8266 oder ESP32 müssen vom Internet erreichbar sein. Das heißt Portweiterleitung im Router einrichten und DynDNS (eventuell von der Fritzbox) nutzen. Sie können durch ein Domen mehrere ESP8266 / ESP32 Geräte zuhause erreichen in dem Sie die Geräte über verschiedene Ports ansprechen. Obwohl Ihr Echo Gerät im lokalen Netz angemeldet ist, befindet sich der Skill samt Datenbank im WWW, von dort gehen auch die Anfragen an Ihren Server.
Tragt Alexa Webhook :
Triggerwort: "kurzgeschichte"
URL: https://esp8266-server.de/alexa/webhook/kurzgeschichte.txt
"Alexa meine steuerzentrale" => "ich höre zu" => "erzähle eine Kurzgeschichte".
Die Textdatei hat keine HTML-Tags und ist UTF-8 kodiert.
Empfangene Text wird einfach als Text zurückgegeben und vorgelesen.
https://esp8266-server.de/alexa/webhook/webhookEcho.php?text=hallo welt
Tragen Sie die URL "https://esp8266-server.de/alexa/webhook/webhookEcho.php?text=" beim Alexa Webhook.
Hier der Inhalt der webhookEcho.php –Datei:
<?php
if (array_key_exists('text', $_GET)) echo $_GET['text'];
?>
Wenn GET-Parametr mit Namen "text" empfange, dann den Wert des GET-Parametrs "text" ausgeben.
Mit einem zusätzlichem Skill ist es möglich das ESP8266 die Interaktion startet.
Das heißt: Alexa kann unaufgefordert etwas ansagen oder vorlesen.
Die Aufgabe besteht darin, das "Alexa Webhook" skill nicht durch den Benutzer zu starten, sondern über eine API.
Dieses ist möglich durch Benutzung von Alexa Routinen und eines virtuellen Triggers.
"Webhook Routine Trigger" skill ist ein Smart Home Skill der virtuellen Türklingel erzeugt. Jede Türklingel kann als Trigger für eine Routine benutzt werden. Die Auslosung von Türklingel passiert über Aufruf einer URL.
ESP8266 muss als Klient diese API URL aufrufen.
Aktivieren Sie "Alexa Routine Trigger" skill. Erzeugen Sie eine Routine mit dem Auslöser "Trigger1" und als Ziel der Routine stellen" benutzerdefiniert"- ihren Text, mit dem sie normalerweise das Skill aufrufen.
Auf der Homepage vom "Webhook Routine Trigger" finden Sie die URL, die ihre Routine startet.
Jetzt können Sie vom Mikrocontroller über das Aktivierungslink die Routine und dadurch das Skill starten.
Schalten eines Relais mit Alexa Echo Gerät
"Alexa meine Steuerzentrale" => "Ich höre zu" => "Schalte das Licht ein".
Oder
"Alexa sage meine Steuerzentrale das Licht ausschalten".
Das Umschalten:
"Alexa meine Steuerzentrale" => "Ich höre zu" => "Bitte Licht umschalten" => "ausgeschaltet"
if ((server.arg("text").indexOf("aus"))>=0)
in dieser Zeile wird überprüft, ob im GET-Argument "text" das Wort "aus" vorhanden ist. Die Zeichenkette "aus" kann als einzige Wort oder teil eines anderes Wortes sein.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> const char* ssid = "xxxxxxx"; // WLAN-Name, const char* password = "xxxxxxxxxx"; // WLAN-Passwort #define RelaisPin D4 // Relais D4 ist an Build LED am ESP8266 Wemos angeschlossen #define TasterPin D7 // Aktiv Low (Taster zwischen TasterPin ung GND) int active_low = 1; // "0" Relais schaltet bei +5V , "1" Relais beim schaltet bei 0V ESP8266WebServer server(80);// Serverport hier einstellen int val = 0; // Hier wird der Schaltzustand gespeichert void setup() { pinMode(RelaisPin, OUTPUT); pinMode(TasterPin, INPUT_PULLUP); digitalWrite(RelaisPin, active_low); Serial.begin(115200); // Serielle Schnittstelle initialisieren Serial.println(""); // Neue Zeile Serial.println("Warte auf Verbindung"); // Mit Haus WLAN Verbinden WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); WiFi.hostname("Alexa-Steckdose"); // Unter diesen Namen wird WLAN-Gerät beim Router angezeigt // Warte auf verbindung while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Verbunden mit "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Bechandlung der Ereignissen anschliessen server.on("/", Ereignis_Index); server.onNotFound ( handleNotFound ); server.begin(); // Starte den Server Serial.println("HTTP Server gestartet"); } void loop() { server.handleClient(); if (!digitalRead(TasterPin)) // Wenn Taster betätigt "Signal 0" { val = !val; // Umschalten digitalWrite(RelaisPin, active_low ^ val); // Wenn active_low - Variable ist "1", das Zustand "val" wird invertiert Serial.println("Umschalten per Taster auf " + String(val)); delay(500); // Entprellung, Warten bis der Taster Kontakt sich beruhigt hat while (!digitalRead(TasterPin))server.handleClient(); // warten bis der Taster los gelassen wurde } } void Ereignis_Index() // Wird ausgeführt wenn "http://<ip address>/" aufgerufen wurde { Serial.print("HTTP Anfrage: "); Serial.println(server.arg("text")); String Antwort=""; // Hier speichern wir die Antwortansagege für Alexa if (server.args() > 0) // wenn Argumente im GET Anfrage vorhanden sind { if ((server.arg("text").indexOf("aus"))>=0) // prüfen ob GET Argument "Text" das Wort "aus" beinhltet z.B. AUSschalten { Serial.println("Aus"); val = 0; // Ausschalten digitalWrite(RelaisPin, active_low ^ val); } if ((server.arg("text").indexOf("ein"))>=0) // prüfen ob GET Argument "Text" das Wort "ein" beinhltet z.B. EINschalten { Serial.println("Ein"); val = 1; // Einschalten digitalWrite(RelaisPin, active_low ^ val); } if ((server.arg("text").indexOf("umschalten"))>=0) // prüfen ob GET Argument "Text" das Wort "umschalten" beinhltet { val = !val; // Umschalten Serial.println("Umschalten auf " + String(val)); if (val) Antwort="eingeschaltet"; // Beim umschalten sagt Alexa den Zustand an else Antwort="ausgeschaltet"; digitalWrite(RelaisPin, active_low ^ val); } server.sendHeader("Cache-Control", "no-cache"); // wichtig! damit Daten nicht aus dem Browser cach kommen server.send(200, "text/plain", Antwort); // Antwort wird vom Amazon Alexa Echo Gerät vorgelesen } else // wenn keine Argumente im GET Anfrage { Serial.println("Sende Index.html"); server.send(200, "text/html", "GET-Argument text=ein fehlt!"); } } void handleNotFound() { server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) } |
Hier hoch mal zum veranschaulichen der Kommunikation zwischen Amazon Alexa und dem Server.
Alexa Echo Gerät fügt nach dem "="- Zeichen die Spracheingabe des Benutzers.
Der ESP8266 / ESP32 oder Raspberry Pi -Server sucht nach bestimmten Worten und entschiedet was zu tun ist.
https://esp8266-server.de/alexa/webhook/webhooktest.php?text=wie ist die feuchtigkeit im wohnzimmer
https://esp8266-server.de/alexa/webhook/webhooktest.php?text=wie ist die temperatur im wohnzimmer
https://esp8266-server.de/alexa/webhook/webhooktest.php?text=bla bla
Bei dem Aufruf mit "bla bla" antwortet der PHP-Skript mit dem Fragezeichen am Ende. Alexa liest die Antwort und erwartet eine neue Eingabe.
Inhalt der webhooktest.php -Datei
<?php if (array_key_exists('text', $_GET)) { $text = $_GET['text']; if(strpos($text, 'temperatur')!==false) { echo 'Herzlich Willkommen beim Test Skript für Alexa Webhook. Du hast gerade nach Temperatur gefragt. Temperatur beträgt '. (rand(150, 28)/10) .' Grad'; } elseif (strpos($text, 'feuchtigkeit')!==false) { echo 'Die Feuchtigkeit beträgt '.rand(40, 90).'%'; } else { echo 'Du hast weder Temperatur noch Feuchtigkeit genannt. Was möchtest du den erfahren?'; } } ?>