Hallo zusammen,
nach einigen Informationen (auch hier im Forum) möchte ich Euch meine Amazon Echo Integration vorstellen:
Ich habe zwar noch keine hier, aber es gibt eine online-Version die perfekt funktioniert.
Amazon Developer Account anmelden
https://developer.amazon.com/edw/home.html#/skills/list
Unter Alexa einen Skill Anlegen
Erstmal einen Englischen anlegen (kann man später noch ‚verdeutschen‘).
Einen namen geben.
Invocation Name eingeben: Darauf hört Alexa später, z.B: myhome
–> Next
Intent Schema:
{ "intents": [
{ "intent": "DoCommand",
"slots": [ {
"name": "command",
"type": "LITERAL" } ] } ] }
Sample Utterances
DoCommand {script parameters|command}
–>NEXT
HTTPS Als Endpoint wählen.
Jetzt brauchen wir die symcon connect URL (Dazu wer noch nicht hat einen Symcon Connect Instanz in IPS aktivieren oder anlegen), doppelklick auf symcon connect instanz und open in webfront. dann url kopieren und wie folgt einfügen bei beiden(!) - wenn wir online testen möchten.
North America: https://.ipmagic.de/hook/echo/
Europe: https://.ipmagic.de/hook/echo/
Beide haken setzen (EU + NA)
–>NEXT
Certificate Endpoint (EU / NA) beide setzen auf:
(o) My development endpoint is a sub-domain of a domain that has a wildcard certificate from a certificate authority
→ NEXT
Wir springen kurz ins IPS:
Jetzt in IPS ein Script anlegen mit folgendem Inhalt:
<?
/*
Amazon Echo Interface / Webhook
*/
// Debugging anschalten? --> Log wird mit Script ID im Log Ordner geschrieben.
$CONF["debug"] = true;
$applicationIdValidation = 'amzn1.ask.skill.<SKILLID>'; // aus dem log herausfinden
$userIdValidation = 'amzn1.ask.account.<USERID>'; //aus dem log herausfinden
$echoServiceDomain = 'echo-api.amazon.com';
$found = false;
logentry("--------------------------- NEW REQUEST ---------------------------------");
logentry("SERVER ARRAY:");
logentry(print_r($_SERVER, true));
logentry("GET ARRAY:");
logentry(print_r($_GET, true));
logentry("POST ARRAY:");
logentry(print_r($_POST, true));
// Capture Amazon's POST JSON request:
$jsonRequest = file_get_contents('php://input');
$data = json_decode($jsonRequest, true);
logentry("JSON Object:");
logentry(print_r($data,true));
//
// Parse out key variables
//
$sessionId = @$data['session']['sessionId'];
$applicationId = @$data['session']['application']['applicationId'];
$userId = @$data['session']['user']['userId'];
$requestTimestamp = @$data['request']['timestamp'];
$command = @$data['request']['intent']['slots']['command']['value'];
$command = strtolower($command); // For the GUI
$requestType = $data['request']['type'];
if( ($applicationId != $applicationIdValidation) || ($userId != $userIdValidation) ){
logentry("Access denied, AppID or UserID wrong.");
header("HTTP/1.0 404 Not Found");
return;
}
#@list($script,$args) = explode(" ", $command);
logentry("Command recieved: $command");
$words = explode(" ", $command);
$resp="";
/* Customize your commands -------------------------------------------
if you want to enable multiple words e.g coffee or coffemachine use | between
the words. eg: "coffemachine|coffee on"
*/
# Lichter ---
#if(WordProbe("lights|light on")){ ZW_SwitchMode(47217 /*[Objekte\Funksteckdosen\Steckdose Dimmer 1 (Wohnzimmer Stehlampe)]*/,true);$resp.="";}
#if(WordProbe("lights|light off")){ ZW_SwitchMode(47217 /*[Objekte\Funksteckdosen\Steckdose Dimmer 1 (Wohnzimmer Stehlampe)]*/,false);$resp.="";}
# Jalousien
#if(WordProbe("alle jalousien schräg")){ IPS_RunScript(24265 /*[Scripts\Jalousien Scripte\Jalousien ALLE schrägstellen]*/);$resp.="";}
#if(WordProbe("alle jalousien auf|hoch|hochfahren")){IPS_RunScript(38846 /*[Scripts\Jalousien Scripte\Jalousien EG auf]*/); IPS_RunScript(11917 /*[Scripts\Jalousien Scripte\Jalousien OG auf]*/);$resp.="";}
#Geräte
#if(WordProbe("radio aus")){SEIR_SendCommand(15613 /*[Objekte\Sonstige Objekte\Verstärker]*/,"KEY_POWER"); $resp.="";}
#if(WordProbe("coffee|coffeemachine on")){ZW_SwitchMode(48388 /*[Objekte\Funksteckdosen\Steckdose 1 (Kaffeemaschine)]*/,true);$resp.="";}
#if(WordProbe("coffee|coffeemachine off")){ZW_SwitchMode(48388 /*[Objekte\Funksteckdosen\Steckdose 1 (Kaffeemaschine)]*/,false);$resp.="";}
# Abfragen ---
#if(WordProbe("temperature outside")){ $resp.= "Temperature outside is ".GetValueFormatted(42998 /*[Objekte\1Wire\Read1Wire über OWServer\1W_AussenNord]*/);}
logentry("Found command: $found");
if($found && $resp == "")$resp = "OK";
if(!$found) $resp = "Command not found. I understood: $command";
logentry("Response: $resp");
// Provide JSON response to echo.
header('Content-Type: application/json;charset=UTF-8');
// Determine whether or not to end this interaction with Alexa
$shouldEndSession = 'true';
$text = '{
"version" : "1.0",
"response" : {
"outputSpeech" : {
"type" : "PlainText",
"text" : "'.$resp.'"
},
"shouldEndSession" : '.$shouldEndSession.'
}
}';
// Response do Amazon Web Service (or GUI)
header('Content-Length: ' . strlen($text));
echo $text;
/*--------------------------------------------------------------------------*/
function WordProbe($wrd){
global $words, $found;
$wrd = strtolower($wrd);
$p = explode(" ", $wrd);
$cnt = 0;
foreach($p as $w){
// Mehrere Wörter prüfen
if(strpos($w, "|")){
// Mehre Optionen
$wa2 = explode("|",$w);
foreach($wa2 as $w2){
if(in_array($w2, $words)) $cnt++;
}
} else {
// EInzelwort
if(in_array($w, $words)) $cnt++;
}
}
if($cnt >= count($p)){
$found = true;
return true;
}else{
return false;
}
}
function logentry($msg = ""){
global $CONF;
$id = $_IPS['SELF'];
if($CONF["debug"])file_put_contents("../logs/".$id."_dbg.log", date('Y-m-d H:i:s').": ".$msg."
", FILE_APPEND);
}
?>
Jetzt mit dem WebHook Control noch einen Webhook auf dieses script mit kennung ‚echo‘ in IPS anlegen.
Zurück zur Amazon Sklill definition
Unter Service Simulator einen Befehl eingeben und den Ask knopf drücken.
Jetzt müsste vermutlich eine Fehlermeldung kommen.
Das Script muss jetzt in IPS angepasst werden:
Zurück zu IPS:
Im Log Ornder müsste eine Log Datei vorhanden 21694_dbg.log (script id im dateinamen entsprechend dem eben erstellten script).
In dieser LogDatei finden wir die Parameter die Echo übermittelt hat:
-applicationId
-userId
Beide Werte passen wir im Script entsprechend an und speichern das script.
Zurück zu der Einrichtung bei Amazon
Nochmals testen.
Jetzt müsste die Verbindung klappen.
wenn nicht nochmals alles genau prüfen.
—>NEXT
Weitere Felder entsprechend der Defintion ausfüllen und den Skill fertigstellen.
Nun auf echoism.io einmal mit amazon user anmelden und alexa irgendwas fragen. Wetter etc. (englisch).
Jetzt gehen wir auf https://alexa.amazon.de
Unter Settings müssten wir die echosim.io alexa finden.
Nun Links im Menü Skills auswählen dann oben rechts „your Skills“ wählen.
dort könnt Ihr den eben erstellen Skill aktivieren.
Bitte beachten - derzeit ist alles Englisch / Deutsch ist noch nicht frei.
Nun könnt ihr auf echosim.io mit dem invocation name IPS ansprechen:
„Alexa, ask myhome turn on lights“
→ die daten werden per Webhook an das script übermittelt.
Im mittleren Bereich des Scriptes könnt Ihr auswerten - dazu gibt es schon eine Funktion im script:
Alles ist derzeit auskommentiert.
if(WordProbe("lights|light on")){ ...}
Prüft ob alexa im command lights oder light und das wort on gesendet hat.
Es funktioniert bei mir tadellos und ich freu mich schon auf die deutsche Alexa.
Viel spass beim nachbasteln
PS:
nicht vergessen logging später wieder zu deaktivieren. Im log findet ihr alles, was alexa sendet.