Info: Alexa Amazon Echo Integration

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.

Find ich gut das hier was passiert… !!
Vielleicht hängst du dich hier mit ran. Es gibt zum Echo schein Thread mit Script.

Gruß
Christian

Hallo zusammen,

ein gleines Update in diesem Thread aber mit einfache rund großer Wirkung:

Gestern mein Echo bekommen!
Und hier die Integration OHNE externe URL oder einem zusatz Skill oder sonst wie.
Der Trick:

Echo kann mit Philips hue Reden im selben Netz.
Wir nehmen einen Hue Emulator mit Bridge und leiten die Befehle an einen IPS Hook weiter:

Hier kurz die Schritte:

Die HA Bridge auf einem Rechner im Netz Installieren:
[GitHub - bwssytems/ha-bridge: Home automation bridge that emulates a Philips Hue light system and can control other systems such as a Vera, Harmony Hub, Nest, MiLight bulbs or any other system that has an http/https/tcp/udp interface. This is a compact impl to run on small format computers. This is impl started from this project GitHub - armzilla/amazon-echo-ha-bridge: emulates philips hue api to other home automation gateways.

Geräte auf de HA Bridge einrichten und mit einer Webhook URL an IPS versehen
ON Url zb. http://IPS:8080/hook/hue/?d=stehlampewohnzimmer&stat=on](GitHub - armzilla/amazon-echo-ha-bridge: emulates philips hue api to other home automation gateways)

  1. Echo nach Geräten suchen lasen.

  2. Webook in IPS für /hue einrichten.

Beispielscript für den hook:


	$device = $_GET["d"];
	$stat   = ($_GET["stat"] == "on")? true: false;
	$dim    = intval(@$_GET["dim"]);
	$hue =  $device.":".$stat.":".$dim;
	echo $hue;
	IPS_LogMessage($_IPS['SELF'],$hue);

	switch(strtolower($device)){
	   case "stehlampe": zw_switchmode(33630 /*[Objekte\Funksteckdosen\Funksteckdose Strommesser EG Lampe greenwave]*/, $stat);
	                     break;
		case "kaffeemaschine": ZW_SwitchMode(48388 /*[Objekte\Funksteckdosen\Steckdose 1 (Kaffeemaschine)]*/,$stat);
	                     break;

		case "stehlampewohnzimmer": ZW_SwitchMode(47217 /*[Objekte\Funksteckdosen\Steckdose Dimmer 1 (Wohnzimmer Stehlampe)]*/,$stat);
											 if(!empty($dim)) ZW_DimSet(47217 /*[Objekte\Funksteckdosen\Steckdose Dimmer 1 (Wohnzimmer Stehlampe)]*/,$dim);
		break;
}

That’s it.

Wäre mal ein Grund ein Hue Emulator in IPS einzubauen und das native zu unterstützen.
Sourcen sind ja vorhanden.

Viel Erfolg - es ist GENIAL.

Hallo,

finde deinen Ansatz ohne dass ein Zugriff nach extern erfolgen muss sehr gut.

So in der Art wie die Philips Hue angesprochen wird müsste es direkt an die IPS gehen - das wäre sicherlich die beste Lösung…

Super Idee

Grüße Heinz

Hallo zusammen,

Ich glaube nicht, dass die HUE-Variante sehr viel sicherer ist und ohne Zugriff von extern funktioniert. Im der Konfig findet sich z.B.

--upnp.config.address=192.168.1.240 --server.port=8081

oder

--upnp.config.address=$(ip route get 8.8.8.8 | egrep -o '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\s*$')"]

Hier wird vermutlich eine Portweiterleitung auf den „HUE“-Dienst vorgenommen, ist zwar besser als IPS im Internet, aber schön ist es auch nicht …

Grüße

Andreas

Hi Andreas,

nein, da wird die IP des lokalen PCs angegeben. Die virtuelle Hue Bridge connected also imho nicht das Netz.
Und Echo fragt nur die lokalen HUE Bridge ab. (ich habe die Sourcen allerdings nicht durchforstet…)
Und das ich mein IPS nicht von außen erreichbar machen muß ist für mich der wichtigste Punkt überhaupt für die HueBridge Lösung. Insbesondere da die Sicherheit von IPS ja gerade recht kontrovers diskutiert wird.

Gruß Frank

Hallo Zusammen,

da ich mein Echo dot nun Samstag erhalten habe, versuchte ich gestern Abend mal mit Hilfe dieser Anleitung es in IPS zu integrieren. (Nicht per virtueller Hue Bridge)
Tja irgendwie habe ich es weder mit der Skill Testumgebung noch nach Aktivierung des eigenen Skills mit dem Echo selbst hinbekommen.
Den Skill habe ich, wie aus der Anleitung ersichtlich, erstellt.
So richtig weiß ich die Ursache nicht, eventuell kann mir jemand einen Tipp geben was ich vergessen haben könnte oder auf was ich besonders achten muss…
Ich habe unter Kern Instanzen IP-Symcon Connect aktiviert und den String „Open in Webfront“ auch im Skill eingetragen. Nach Serverneustart kam ich mit dem String auch von außen auf mein Webfront.
Habe dann Webhook hinzugefügt und als Ziel das Beispiel-Script angegeben, muss ich da eventuell auf etwas achten, mit dem Thema (Webhook) kenne ich mich leider gar nicht aus.
Die Nutzer-Id etc. hatte ich schon aus dem Protokoll, welches mir die Amazon Testumgebung vom Skill anzeigte, im Script eingetragen.
Letztendlich wurde das Script aber nie aufgerufen, habe gestern erst mal alles wieder gelöscht.
Da ich es eventuell heute Abend nochmal versuchen möchte bin ich nun für jeden Tipp dankbar…

Gruß André

Hallo,

habe gerade nochmal gelesen und glaube ich habe den Fehler gefunden!:wink:
Hatte zwar „xxxx.ipmagic.de/hook/echo/“ im Skill eigegeben aber den Hook „Echo1“ genannt :banghead:

Gruß André

Hallo,

so,…es war der Fehler wie gedacht!
Funktioniert jetzt, Licht etc. wird geschaltet allerdings meldet Alexa das bei der Kommunikation mit dem Skill ein Fehler aufgetreten ist. Sehe dann in der App unerwarteter Kommunikationsfehler darunter ist dann der „Request Identifier“ aufgelistet. Da scheint wohl die Antwort nicht zu passen…
Da komme ich jetzt auch nicht weiter, habe es wie oben im script,… jemand eine Idee?

Gruß André

@Stele99,

vielen Dank für die super Anleitung, sowie für die Scripte zur Integration!:slight_smile:
Inzwischen hab ich diese mit alternativen kombiniert, auf meine Bedingungen angepasst und es funktioniert bestens!

Nochmals vielen Dank für die Arbeit!

Gruß André

bekomme es einfach nicht ans laufen,
habt ihr noch was in den Bridge Settings geändert?

Hallo Heinz,

es gibt mehrere Dinge zu beachten:

  • bei mir lief die aktuellste Bridge Software nicht. Ich musste die Vorgängerversion nehmen (unter Win7).
  • Das Echo muss im gleichen LAN sein wie der PC mit der Bridge Software. Wars bei mir aufgrund meiner WLAN Konfig nicht. Routing alleine reicht nicht aus! Es MUSS dasselbe Netz sein.
  • Die IP mit der Du die Bridge startest, ist die IP des lokalen PCs / Rapsis auf dem Du die Bridge startest. Es ist nicht die IP des Echos.
  • Der angegebene Port muss frei sein. Wars bei mir auch nicht, da ich den Homematic manager auch auf dem PC hab, der belegt den Standard Port auch.
  • Java muß V8 sein.
  • Beim einlernen am Echo muss kein „knopf gedrückt“ werden. Es gibt in der Software keinen. Das geht einfach so.

Das ist das was mir so auf die schnelle aufgefallen ist.
Viel Erfolg!
Frank

EDIT: Typo

was habt ihr hier eingetragen?

Configuration Path and File data/habridge.config
Device DB Path and File data/device.db
UPNP IP Address 192.168.145.1
Web Server IP Address 0.0.0.0
Web Server Port 80
UPNP Response Port 50000

wenn ich was speichern will steht im log immer sowas

WARN Issue getting directory listing for backups in directory: data com.bwssystems.util.BackupHandler

WARN Error reading the file: data\device.db - Does not exist or is not readable. continuing… com.bwssystems.HABridge.dao.DeviceRepository

Hallo,

ich weiß nicht wie die V-Bridge arbeitet bzw. wie Echo sucht, da ich das ganze auch nur bis zum Test mit der Hue Bridge probiert hatte und dann doch über IP-Symcon Connect mit Skill gegangen bin, aber ich würde zur Sicherheit mal kurzfristig die Firewall vom PC abschalten. Zumindest bei der Verbindung zw. Harmony Hub und IP-Symcon war das ein Problem bei mir, so dass ich dort den Port freigeben musste.

Gruß André

so, hab jetzt mit openhab2 alles eingebunden bekommen und funktioniert super!
Woohoo darüber funktioniert auch endlich mal die Homebridge vernünftig!

Gibt es denn da schon ein fertiges Binding oder ist das noch eine Bastellösung?

André ich habe das gleiche Problem wie Du (There was a problem with the requested skills response) Könntest Du Dein funktionierendes Skript posten bzw. kurz berichten wie Du den Fehler beheben konntest ?

Beste Grüße

Artur

Wenn ein Skill nicht richtig geht, dann kann man das doch in der Developer Console bei Amazon einfach testen.
Dort gibt es - glaube ich den - zweitletzten Step in der Einrichtung / Änderung des Skills, wo man den Skill per ‚TEXT‘ testen kann.
Dort kann man auch die Response sehen.
Zur Not muss man in IPS mal eine Log schreiben des Scriptes das aufgerufen wird.

Im Log steht : „2016-11-28 15:55:54: Access denied, AppID or UserID wrong“

Ich habe das nochmals genau geprüft : die Login Daten stimmen trotzdem kommt der Fehler.

Anyway ich fang nochmal von vorne an

ALEXA Läuft jetzt bei mir :slight_smile:

Folgende Kleinigkeiten sind zu beachten :

1.) Der Pfad für die Logdatei passt nicht zum RASPI ist aber einfach zu ändern
2.) Amazon vergibt immer eine neue User ID wenn auf der Developer Seite etwas geändert wird