Amazon Echo an Symcon anbinden inklusive Proxy

Hallo
Als Anregung wie ich es bei mir mal umgesetzt habe.
Basis ist das Script in Post 1.
Funktioniert einwandfrei fuer Licht,Temperaturen, Rolladen, Strom und mehr …
Es wird nach Schluesselwoerter gesucht und dann ein Script aufgerufen in
dem weiter Woerter ueberprueft werden.


	IPSUtils_Include ("AmazonEchoInclude.ips.php");

	$debug = true;
	
	if ( !isset($_SERVER['REQUEST_METHOD']) )
		return;
	
	$applicationIdValidation    = 'amzn1.ask.skill.****************';
	$userIdValidation           = 'amzn1.ask.account.**************';
	$echoServiceDomain          = 'echo-api.amazon.com';

	// Alexa POST JSON request
	$jsonRequest    = file_get_contents('php://input');
	$data           = json_decode($jsonRequest, true);

	AmazonEchoLogging("AmazonEcho json empfangen");
	AmazonEchoLogging($jsonRequest);

	$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'];
	$requestType        = @$data['request']['type'];

	$command            = strtolower($command); 

	
	//Alexas Anfrage ist ein HTTP POST
	if ( $_SERVER['REQUEST_METHOD'] == 'GET' )
		{
		fail('Fehler : HTTP GET erhalten');
		}

    // Fehler wenn ApplicationID
    if ($applicationId != $applicationIdValidation)
		fail('Fehlerhafte Application ID : ' . $applicationId);
	
    // Fehler wenn UserID falsch
    if ($userId != $userIdValidation)
		fail('Fehlerhafte User ID : ' . $userId);

    // Fehler wenn Anfrage aelter als 60 Sekunden
	$localTime = time();
	$alexaTime = strtotime($requestTimestamp);
    if ($localTime - $alexaTime > 60)
        fail('Zeitstempelfehler : Local - ' . date("d.m.Y H:i",$localTime) . ' Alexa - ' . date("d.m.Y H:i",$alexaTime));

	AmazonEchoLogging("AmazonEcho sagt : " . $command);

	if ( $debug ) IPS_LogMessage("Alexa sagt Kommando :", $command);

	$spokenWords = explode(' ', $command);
   
	// Wenn Satz angefangen, frage was ich tun soll und warten auf Antwort
	$request = false;
	if ($requestType == 'LaunchRequest')
		{
		respond("Was kann ich für dich tun ?",false);
		$request = true;
		}
	
	$response = "Ich habe : " .$command . " nicht verstanden";
	$found = false;
	
	// 'Licht Beispiel : Deckenlicht im ........ '
	if ( $found == false )
		if ( in_array('licht', $spokenWords) OR  in_array('decken', $spokenWords) 
				OR  in_array('lampe', $spokenWords) OR  in_array('deckenlicht', $spokenWords))
			{
			IPSUtils_Include ("AmazonEcho_Licht.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}

	// 'Temperatur Beispiel : Wie hoch ist die Temperatur ..... '
	if ( $found == false )
		if ( in_array('temperatur', $spokenWords) AND  in_array('hoch', $spokenWords))
			{
			IPSUtils_Include ("AmazonEcho_Temperatur.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}

	// 'Strom Beispiel : Wie hoch ist der Stromverbrauch .....'
	if ( $found == false )
		if ( in_array('stromverbrauch', $spokenWords) AND  in_array('hoch', $spokenWords))
			{
			IPSUtils_Include ("AmazonEcho_Strom.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}

	// 'Duft Beispiel : Pyramide im ...... '
	if ( $found == false )
		if ( in_array('duft', $spokenWords) OR  in_array('pyramide', $spokenWords) 
				OR  in_array('pyramiden', $spokenWords) )
			{
			IPSUtils_Include ("AmazonEcho_Duft.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}	

	// 'Modus Beispiel : Aktiviere Modus abwesend .... '
	if ( $found == false )
		if ( ( in_array('aktiviere', $spokenWords) OR  in_array('deaktiviere', $spokenWords) ) 
				AND  in_array('modus', $spokenWords) )
			{
			IPSUtils_Include ("AmazonEcho_Modus.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}	

	// 'Rollladen Beispiel : Fahre Rollladen im .......'
	if ( $found == false )
		if ( in_array('rollladen', $spokenWords) AND  in_array('fahre', $spokenWords))
			{
			IPSUtils_Include ("AmazonEcho_Rollladen.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}

	// 'Dreambox Beispiel : Receiver im ..........'
	if ( $found == false )
		if (  in_array('receiver', $spokenWords) OR  in_array('box', $spokenWords) 
				OR  in_array('fernseher', $spokenWords) )
			{
			IPSUtils_Include ("AmazonEcho_Dreambox.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}	

	// 'Schalte Beispiel : Schalte Computer ein ....... '
	if ( $found == false )
		if (  in_array('schalte', $spokenWords)  )
			{
			IPSUtils_Include ("AmazonEcho_Schalte.ips.php");
			$response = Kommandoauswertung($command);
			$found = true;
			}	

	AmazonEchoLogging("AmazonEcho Antwort : " . $response);

	if ( $request == false )
		respond($response,true);


Hallo 1007,

könntest Du mal die include Skripte auch dazulegen. Dann bräuchte ich das Rad nicht neu zu erfinden…
Wäre super!

Herzlichen Dank!

gros_ibou

Hallo
Mach ich heute nacht.
Hab noch einiges umgestellt, so das Alexa nachfragt wenn irgendwas
fehlt zB ein Raumname etc.

Gesendet von meinem iPad mit Tapatalk HD

Hallo
Hier im Anhang meine aktuelle Version mit einem Script zum Schalten von Geraeten.
Licht,Rolladen etc ist umfangreicher wegen Raum,Hoch,Runter,Prozent etc.

Das hier muss natuerlich fuer jeden angepasst werden.
$parantDataID ist eine vorhanden Kategorie. Variablen werden automatisch erstellt.

//******************************************************************************
//	AmazonEcho relevante Definitionen
//******************************************************************************
	
	$applicationIdValidation    = 'amzn1.ask.skill.*****************************';
	$userIdValidation           = 'amzn1.ask.account.***************************';
	$echoServiceDomain          = 'echo-api.amazon.com';

//******************************************************************************
//	IPSymcon relevante Definitionen
//******************************************************************************
	$debug   = true;
	$logging = true;

	$parentDataID = IPSUtil_ObjectIDByPath("Program.IPSLibrary.data.privat.AmazonEcho");

//******************************************************************************

AmazonEcho.zip (4.56 KB)

Cool! Danke!

gros_ibou

Hi Leute.

Mein Echo ist jetzt seit ein paar Tagen da und muss jetzt natürlich integriert werden.

Leider hakt es schon beim zweiten Schritt auf der Amazon Developer Seite.

Wenn ich die beiden txt Inhalte in die beiden Felder einfüge, kommt bei klick auf „Next“ für
Ewigkeitern die Meldung „Please wait while this Alexa skill is updated“…

Kennt voneuch jemand dieses Problem?

Hallo Leute,

kann mir jemand sagen wo ich die Daten für folgende Variable " $userIdValidation" finde?

Vielen Dank!

Gruß Axel

Hi Sven,
Problem hatte ich auch, lag bei mir am Internet Explorer. Mit Firefox und Chrome funktionierte es sofort.
Gruß
Georg

Hallo 1007,

habe mich mit deinen Echo Skripten beschäftig. Super gemacht, vielen Dank, man kann da viele Ideen rausholen. Und meine Alexa macht jetzt auch schon die ersten Aktionen… mal sehn was noch alles kommt.

Eine Anmerkung habe ich noch, so wie ich das sehe, dürfte Alexa nach den ausgeführten Aktionen immer noch mal auf einen Befehl warten. Denn der Parameter Endsession wird immer mit „FALSE“ ausgegeben.

Dein Code lautet:

//******************************************************************************
// Sende Antwort an Amazon
//******************************************************************************
function respond($Response, $endSession = false)

So wie ich das sehe wird an der Stelle noch mal das „false“ fest in die Funktion reingeschrieben. Also hier das „= false“ löschen. Dann erst greift das „true“ welches du in den anderen Skripten bei der letzten Aktion vorgibst.

Das hat allerdings axelroro auch schon in seiner Funktion ganz am Anfang drin, ggf. auch da noch mal prüfen, ob das nur zu Testzwecken mal drin war. Bei mir geht’s ohne jedenfalls besser.

Also bin gespannt was da in nächster Zeit noch so alles kommt. Vor allem ob es mal ein Skill gibt damit man das Stichwort nicht immer benötigt.

Grüße Helmut

Hallo
Ich weiss nicht welches Script du benutzt, aber Alexa schickt dir die ID mit
Sie wird in die $userID geschrieben.

$userId             = @$data['session']['user']['userId'];

Musst du mal mit IPS_Logmessage loggen.
Sieh so aus und danach 200 Zeichen.

'amzn1.ask.account.????????

Wenn du eine Ueberpruefung der UserID nicht willst kommentiere das aus.

    // Fehler wenn UserID falsch
    if ($userId != $userIdValidation)
		fail('Fehlerhafte User ID : ' . $userId);

Hallo
Das hab ich drin , wenn ich mal nur schreiben wuerde

respond("Hallo Welt");

wird die Session nicht beendet , da die Variable $endsession automatisch false ist.
Wenn ich den zweiten Parameter angebe wird immer der genommen.

Im Moment schreibe ich gerade ein Script fuer Lichtsteuerung
( Ein/ Aus , Dimme auf xx Prozent )
Wenn Interesse wuerde ich das posten.

Interesse besteht definitiv… mein Alexa Dot liegt bereits in der Packstation und wartet auf die Abholung :-).
Auf jeden Fall an dieser Stelle vielen Dank für deine tollen Scripte und die damit verbundene Mühe!

Viele Grüße aus dem Westerwald,
Markus

Ich bin ja nicht der Erst Ersteller . Siehe Post 1.
Hab das nur für mich mich ( sonstige ) angepasst.
Fragen sind willkommen.

Habe auch eine Testscript wo man nicht „reden“ muss um ein Script zu testen.

Hallo 1007,

vielen Dank für Deine Antwort.

Im ersten Beitrag wurde von einem Custom Skill ausgegangen.
Jetzt bin ich mir nicht sicher ob Deine Variante für einen Custom- oder für einen Smart-Home-Skill gedacht ist. Denn wenn ich es richtig verstehe kann man mit Deiner Variante die Geräte direkt ansprechen, was angeblich ja nur bei dem Smart-Home-Skill funktioniert.
Zur Zeit habe ich sowohl ein Custom- als auch ein Smart-Home-Skill eingerichtet.
Das Custom Skill funktioniert ansatzweise aber bei dem Smart-Home-Skill kommt noch nichts an.
Hier erscheint bei dem Test auf der Amazon Website folgende Fehlermeldung:

START RequestId: 16f918ee-bb2b-11e6-b537-e32131a9efdf Version: $LATEST
2016-12-05T20:40:42.496Z 16f918ee-bb2b-11e6-b537-e32131a9efdf Input: [object Object]
2016-12-05T20:40:42.497Z 16f918ee-bb2b-11e6-b537-e32131a9efdf TypeError: Cannot read property ‚namespace‘ of undefined
at exports.handler (/var/task/index.js:19:25)
END RequestId: 16f918ee-bb2b-11e6-b537-e32131a9efdf
REPORT RequestId: 16f918ee-bb2b-11e6-b537-e32131a9efdf Duration: 28.50 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 8 MB
Process exited before completing request

Gruß

Axel

Hallo zusammen!

Mit Spannung verfolge ich dieses Thema.
Inzwischen ist auch der zweite Dot eingetroffen und es geht an die Integration der IPS.

Hierzu gleich mal ne Frage: Habt ihr wirklich den Port 3777 der IPS einfach ins Netz gehängt??? :confused:
Ich bin dafür definitiv zu paranoid (trotz Passwort und allem) und würde daher gerne nur das /hook Verzeichniss freigeben.

Hierzu wäre z.B. ein reverse-proxy über Apache2 eine Möglichkeit, dieser kann ja sogar dann den oAuth2 part übernehmen (Final: OAuth 2.0 Form Post Response Mode) so dass man dann direkt die Smart Home Skill API nutzen könnte. :smiley:

Hat sich mit sowas schon mal jemand versucht?

Grüße,
Alex

PS:Wer nicht auf die Amazon Einladung warten möchte findet vielleicht hieran gefallen:
Tipps & Tricks: Amazon Echo oder Echo Dot ohne Einladung bestellen
Hat wunderbar funktioniert für das zweit- und dritt- Gerät. :wink:

Hallo,

mal etwas offTopic, aber für alle, die gerne schnell eine Alexa hätten hier ein Tip dazu:

Tipps & Tricks: Amazon Echo oder Echo Dot ohne Einladung bestellen

Ich habe das am Sonntag versucht, und es hat funktioniert. Mein Dot ist heute gekommen.

Gruß
Christian

Super !!! :D:D:D FREU !!! Habe es gleich mal versucht und laut Amazon sollte mein 2ter Dot am Donnerstag kommen :eek:

Ups, da hatten ja zwei den gleichen Gedanken, fast zur gleichen Zeit.
Ich hatte den Post über mir nicht gesehen, also sorry für den Doppelpost.

Gruß
Christian

Hallo,

ich versuche mich gerade an den Skripten von 1007. Da gibt es wohl noch mehr Stellen an denen die parentDataID verwendet wird.
Wenn ich den im Script verwendeten Pfad verwende bekomme ich nur eine Fehlermeldung, ansonsten hagelt es Fehler, weil er die Variablen nicht finden kann.

In den Skripten wurde alles mit der IPSLibrary erstellt. In so fern müssen die Scripte vermutlich dort korrekt eingebunden werden, auch was den Speicherort im Scriptverzeichnis angeht, oder?

Gruß
Christian

Alles zurück, ich habe es hinbekommen. Die Variablen müssen in einer Kategorie alleine stehen. Sorry.

Hallo Zusammen,

hat von euch wirklich schon jemand das Ganze im Zusammenspiel mit dem Echo am Laufen? Bei mir klappt der Web-Test wunderbar, mit dem Echo selber aber eher weniger… Ich habe das Gefühl das ein Smarthome-Skill deutlich besser wäre, und die FHEM-Kollegen haben das auch bereits am Laufen:
Alexa-Fhem – FHEMWiki

Jetzt ist nur die Frage: Wie bekommen wir das auf IP-Symcon :loveips: adaptiert?

Gruß,
Markus