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
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.
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“…
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.
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!
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
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???
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.
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.
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 adaptiert?