Hallo an alle
Ich habe das Skript von 1007 umgeschrieben, um das Verständnis zu erleichtern und alle IPSLibrary-Elemente entfernt.
Das Skript läuft also so wie es ist ohne Abhängigkeiten.
Erstellt einen Ordner und erstellt ein Skript (Inhalt weiter unten). Es braucht noch 3 Variabeln: Alle String:
-CurrentTask (Zum Beispiel: GetPassword, damit das Skript weiss, wo es weitergeht,)
-Response (Beinhaltet die Antwort)
-SessionEnd (Session beenden oder nicht)
Ich habe einige request-Typen unterschieden:
-Spezielle Tasks,d ie vordefiniert sind, wie etwa die Abfrage eines Passwortes
-Fixe Befehle: Definierte Befehle, die nicht geparst werden müssen, wie „Abbrechen“ oder einfache Befehle, wie „schalte Fernseher“
-Geparste Befehle mit Wortsuche
Das Parsing ist lausig und würde mehr intelligenz ertragen, aber mein PHP ist nicht der Hammer.
Nehmt es als Einstiegshilfe. Feedback ist willkommen.
Dank an alle, deren Arbeit direkt oder indirekt Eingeflossen ist
<?
GLOBAL $applicationIdValidation;
GLOBAL $userIdValidation;
GLOBAL $echoServiceDomain;
GLOBAL $debug;
GLOBAL $logging;
GLOBAL $responseOID;
GLOBAL $sessionEndOID;
GLOBAL $currentTaskOID;
$debug = true;
$logging = true;
$responseOID = 43612 /*[Kommunikation\Amazon Echo\Response]*/;
$sessionEndOID = 56359 /*[Kommunikation\Amazon Echo\SessionEnd]*/;
$currentTaskOID = 31995 /*[Kommunikation\Amazon Echo\CurrentTask]*/;
// Debugging anschalten? --> Log wird mit Script ID im Log Ordner geschrieben.
$applicationIdValidation = 'amzn1.ask.skill.XXXXXXXX'; // aus dem log herausfinden
$userIdValidation = 'amzn1.ask.account.XXXXXXXX; //aus dem log herausfinden
$echoServiceDomain = 'echo-api.amazon.com';
// Capture Amazon's POST JSON request:
$jsonRequest = file_get_contents('php://input');
$data = json_decode($jsonRequest, true);
$sessionId = @$data['session']['sessionId'];
$applicationId = @$data['session']['application']['applicationId'];
$userId = @$data['session']['user']['userId'];
$newSession = @$data['session']['new'];
$requestTimestamp = @$data['request']['timestamp'];
$command = @$data['request']['intent']['slots']['command']['value'];
$requestType = @$data['request']['type'];
$command = strtolower($command); // For the GUI
Ips_LogMessage('ECHO',$command);
if( ($applicationId != $applicationIdValidation) || ($userId != $userIdValidation) ){
IPS_LogMessage('ECHO','Anwendungs- oder UserID-Fehler');
AnswerAmazon('Fehler bei der Anwendungs- oder User ID',1);
return;
}
//Alexas Anfrage ist ein HTTP POST
if ( $_SERVER['REQUEST_METHOD'] == 'GET' )
{
AnswerAmazon('Ein Fehler ist aufgetreten',true);
IPS_LogMessage('ECHO','GET-Request-Fehler');
}
// Fehler wenn Anfrage aelter als 60 Sekunden
$localTime = time();
$alexaTime = strtotime($requestTimestamp);
if ($localTime - $alexaTime > 60){
IPS_LogMessage('ECHO','Zeitstempelfehler : Local - ' . date("d.m.Y H:i",$localTime) . ' Alexa - ' . date("d.m.Y H:i",$alexaTime));
}
// Neue Session ?
if ( $newSession == 'true' ){
IPS_LogMessage('ECHO','New session');
SetValueString($sessionEndOID,0);
SetValueString($responseOID,'Ich habe Deine Anfrage nicht verstanden.');
SetValueString($currentTaskOID,'');
}
#@list($script,$args) = explode(" ", $command);
$spokenwords = explode(" ", $command);
//Handle special tasks
if (GetValueString($currentTaskOID)=='PasswordVerification'){
if ((in_array("sieben", $spokenwords )==true) && (in_array("neun", $spokenwords )==true)){
SetValueString($responseOID,'Die Alarmanlage wird ausgeschaltet.');
SetValueString($sessionEndOID,1);
SetValueString($currentTaskOID,'');
IPS_RunScriptWait(29053 /*[Sicherheit\Steuerung\Alarm - Aus]*/);
} else {
SetValueString($responseOID,'Das Passwort ist ungültig.');
SetValueString($sessionEndOID,0);
}
}
//Handle fix commands
if ($command =="abbrechen") {
SetValueString($responseOID,'Abgebrochen.');
SetValueString($sessionEndOID,1);
unset($spokenword);
SetValueString($currentTaskOID,'');
}
if ($command=='zeige überwachungskamera'){
SetValueString($responseOID,'Zeige Überwachungskamera.');
SetValueString($sessionEndOID,1);
unset($spokenword);
IPS_RunScriptWait(12927 /*[Server\Fernseher\Show Surveillance]*/);
}
if ($command=='zeige live t. v.'){
SetValueString($responseOID,'Zeige Live T.V.');
SetValueString($sessionEndOID,1);
unset($spokenword);
IPS_RunScriptWait(52732 /*[Server\Fernseher\Show LiveTV]*/);
}
//Handle everything else
if ((in_array("alarm", $spokenwords )==true) || (in_array("alarmanlage", $spokenwords ))==true){
if (in_array("status", $spokenwords )==true) {
if (GetValueBoolean(40578 /*[Sicherheit\Steuerung\Status]*/)==true) {
SetValueString($responseOID,'Die Alarmanlage ist eingeschaltet.');
}else{
SetValueString($responseOID,'Die Alarmanlage ist ausgeschaltet.');
}
SetValueString($sessionEndOID,1);
}
if ((in_array("schalte", $spokenwords )==true) && (in_array("aus", $spokenwords )==true)) {
SetValueString($responseOID,'Bitte nenne mir das Passwort');
SetValueString($sessionEndOID,0);
SetValueString($currentTaskOID,'PasswordVerification');
}
if ((in_array("schalte", $spokenwords )==true) && (in_array("ein", $spokenwords )==true)) {
SetValueString($responseOID,'Die Alarmanlage ist eingeschaltet');
SetValueString($sessionEndOID,1);
IPS_RunScriptWait(38129 /*[Sicherheit\Steuerung\Alarm - An]*/);
}
}
AnswerAmazon(GetValueString($responseOID),GetValueString($sessionEndOID));
function AnswerAmazon($Response, $EndSession = false) {
// Provide JSON response to echo.
header('Content-Type: application/json;charset=UTF-8');
$shouldEndSession = $EndSession ? 'true' : 'false';
$text = '{
"version" : "1.0",
"response" : {
"outputSpeech" : {
"type" : "PlainText",
"text" : "'.$Response.'"
},
"shouldEndSession" : '.$shouldEndSession.'
}
}';
// Response do Amazon Web Service (or GUI)
header('Content-Length: ' . strlen($text));
echo $text;
IPS_LogMessage('ECHO','JSON posted: '.$response);
}
?>