Info: Alexa Amazon Echo Integration

Bei mir (und auch bei vielen anderen) lag das Problem bei einem script Fehler in IPS. Kommentiere einfach mal die letzten Änderungen aus bzw. lass nur den PHP Kern stehen und schau mal ob der Fehler noch auftaucht

Ja der Connect Dienst läuft da ich ihn für die Anwesenheitssteuerung benutze. Was meint ihr mit dem script? Finde ich ein angepasstes? Scheint mit dem original bei mir nicht zu funktionieren, da im Log auch irgendwie nicht applicationID und UserID auftauchen. Könntet ihr mal ein script reinstellen?
Danke

Wieso ist das ein Widerspruch? Dass es prinzipiell funktioniert, dass Echo mit anderen Geräten direkt kommunizieren kann, zeigt ja meine derzeitige Implementierung mit der emulierten Hue-Bridge.

Echo schickt die Sprachdaten ins Internet und bekommt das Ergebnis der Verarbeitung zurück. Dann konktaktiert Echo im LAN die Hue-Bridge (Zugriff von außen ist ausgeschlossen), anschließend ruft die Hue-Bridge den Webhook auf (Zugriff von außen ist ebenfalls ausgeschlossen). Die „Intelligenz“ (von der Sprachverarbeitung mal abgesehen) liegt hier also bei der Hue-Bridge, mit der Echo direkt kommunizieren kann.

Der gesamte Kommunikationsfluss lässt sich wunderbar im Netzwerktrace nachvollziehen:
Echo -> Amazon
Amazon -> Echo
Echo -> Hue-Bridge
Hue-Bridge -> IPS
Hue-Bridge -> Echo
Echo -> Hue-Bridge

Die Frage die sich mir stellt ist, ob Hue in der Funktionsweise eine Ausnahme ist, weil Amazon es von vornherein so unterstützt, oder ob man prinzipiell beliebige Smarthome-Skills erstellen kann, wo Echo irgendein Smarthome-Gateway im LAN kontaktiert und von dort aus die Webhooks aufgerufen werden?

Ich werde mir die genaue Funktionsweise von Echo und auch von der Variante OAuth2 und Symconn Connect irgendwann ansehen.
Im Moment fehlt mir aber leider die Zeit dazu, mich näher damit zu beschäftigen.

Moin,
bist Du Dir 100%ig sicher, dass Echo die Hue Bridge lokal kontaktiert? Ich dachte bisher, das würde übers Netz passieren.

Grüße,
Christoph

Dokumentiert ist dies zumindest von Amazon für einen Smart Home Skill anders. Ob es dennoch eine Möglichkeit gibt lässt sich dann wohl nur schwer rausbekommen da dies nicht offiziell dokumentiert ist. Wahrscheinlich stellt HUE hier eine Ausnahme dar, da ja dort auch eine feste Schnittstelle definiert ist. Bei einem Smart Home Skill ist das anderes da weis Amazon ja nicht wie die Daten genau weiterverarbeitet werden sollen. Das muss dann der Skill Developer festlegen.

Das dachte ich bisher auch aber wenn er einen Netztrace gemacht hat wird dies wohl stimmen.

Also die Erreichbarkeit von außen kann ich defintiv ausschließen. Hue-Bridge und IPS wurden durch Firewall nach außen hin abgeschottet, sämtliche URLs enthielten zudem außschließlich private IP-Adressen und die Ports, an denen Bridge, IPS und Echo hängen, wurden gespiegelt und dann getraced.

Die Kommunikation lief immer zwischen Echo - Amazon, Echo - Bridge und Bridge - IPS.
Die Bridge zeigt intern ebenfalls an, von wo die Anfragen kommen. Auch hier ausschließlich die IP des Echo.

Gruß
Slummi

Ich persönlich verstehe den ganzen Aufwand trotzdem nicht ob jetzt IP-Symcon über eine gesicherte Verbindung erreichbar ist oder eben Echo über das Internet erreichbar ist es stellt in beiden Fällen eine Verbindung von einem Gerät im LAN ins Internet dar. Da ist ist mir persönlich lieber es läuft über IP-Symcon da weis ich wenigstens wie und auf welche Weise das abgesichert ist.

Dann versuche ich noch mal den Unterschied zu erklären.

Bisher ist mein IPS nur via IPSec-Tunnel ins LAN von außen erreichbar.
Bei IPSec sind die technischen Spezifikationen sowie die möglichen Schwachstellen hinlänglich bekannt, sodass ich unter der Voraussetzung, dass ich sichere Passwörter / Zertifikate in Verbindung mit entsprechenden Firewalls einsetze, ziemlich sicher sein kann, dass niemand unbefugt Zugriff auf mein LAN und damit auch mein IPS erlangt.

Bei Symcon Connect mache ich jedoch mein ganzes IPS für jedermann von außen erreichbar. Wer den FQDN kennt, hat als Hürde nur noch das Passwort des WebFronts oder der Verwaltungskonsole vor sich. Selbst wenn ich hier sichere Passwörter einsetze (was den normalen Zugang zum WebFront zusätzlich umständlich macht), kann ich nicht abschätzen, welche Schwachstellen IPS möglicherweise aufweist, die es einem Angreifer ermöglichen, darauf zuzugreifen.
Da die Verbreitung von IPS niemals an die eines allgemeinen Standards wie IPSec herankommen wird, wird die Sicherheit von IPS wohl auch niemals in der Tiefe analysiert werden, wie es bei IT-Sicherheitsstandards der Fall ist.

Würde IPS nur irgendwelche Lampen steuern, wäre es mir relativ egal, wie sicher es ist.
Wenn aber der Gebäudezutritt, Alarmanlage, Kameras etc. an so einem System hängen, dann ist es mir nicht mehr egal und ich öffne keine Hintertüren für mehr Komfort, wenn ich die Risiken nicht überblicken kann.

Um auf Echo zurückkommen, macht es für mich daher schon einen Unterschied, ob nur einige ausgewählte Webhooks aus dem LAN erreichbar sind, welche unkritische Funktionen wie die Beleuchtung steuern oder ob prinzipiell das ganze IPS von außen erreichbar ist und damit potenziell auch alle Funktionen.

Natürlich ist mir auch klar, dass es niemals eine hundertprozentige Sicherheit geben kann, aber man kann schon vorbeugen, indem man die Risiken vorher genau abschätzt.

Das Risiko, dass es jemand schafft, den IPSec-Tunnel zu knacken, in mein LAN einzudringen, anschließend IPS zu knacken und damit Zugriff auf alle Funktionen zu bekommen, ist für mich deutlich geringer, als das Risiko, dass jemand über einen (wenn auch schwer zu erratenden FQDN) Zugriff auf IPS erlangt, dort in Ruhe Kennwörter ausprobieren oder nach Schwachstellen suchen kann.

Ebenso ist das Risiko aus meiner Sicht ebenfalls gering, dass es jemand schafft von außen Echo zu hacken und dann Zugriff auf das gesamte LAN zu bekommen. Vermutlich würde man es dann eher schaffen, einen vermeintlichen Sprachbefehl einzuschleusen, der dann aber im Zweifelsfall nur einen der harmlosen Webhooks aufrufen kann.

Aber wie gesagt, ich habe bisher noch keine Zeit gehabt, um mich intensiver mit der Funktionsweise von Symcon Connect, Echo etc. auseinanderzusetzen. Meine Beurteilung basiert dementsprechend nur auf meinem momentanen Kenntnisstand. Möglicherweise komme ich ja bei genauerer Betrachtung der Funktionen zu anderen Erkenntnissen.

Das sollte ebenso mit TLS und AES eigentlich sicher sein.

Das Ganze ausführlich zu diskutieren macht sicher erst Sinn wenn OAuth in der Stable verfügbar ist und es hierzu auch eine Dokumentation gibt. OAuth als unsicher zu bezeichnen halte ich jedoch für absolut übertrieben und da müsste mir jemand erst mal die Quellen zeigen wo da Sicherheitslücken sind und verschlüsselt wird das auch alles mit SSL. Ein Wissen oder Erraten der Connect Adresse reicht in diesem Fall auch nicht aus da müsste dann auch noch der Token bekannt sein. Vergleiche das nicht damit das Du selber einen Webhook in IP-Symcon einrichtest und diesen über die Connect Adresse erreichbar machst. Da hast Du es dann selber in der Hand wie und ob Du überhaupt eine Autorisierung durchführst. In dem Fall gebe ich Dir vollkommen Recht wenn es sich um einen solchen Webhook handelt ist der User schon auf dem IP-Symcon Server und findet dann entweder gar keine Autorisierung vor oder aber eine schwache Sicherung die er eventuell aushebeln kann. Da würde es in der Tat reichen die Connect Adresse zu kennen. Daher gibt es ja aber OAuth und damit kommt der Angreifer ohne Token gar nicht erst zum eigenen IP-Symcon Server und ins LAN sondern bleibt am Server von IP-Symcon hängen. Das ist wie die Geldkarte ohne Geheimzahl.

Hallo Zusammen,
Habe seit gestern auch eine Echo die Verbindung zu IPS läuft auch die ersten Befehle funktionieren. Nur habe ich das Problem zum schalten des Befehles von Alexa muß man das Schlüsselwort „switch“ + Schlüsselwort sprechen.

Kann dieser Befehl im Alexa System übersetzten werden , auf ein Deutsches Wort . Habe bis jetzt noch keine Möglichkeit gefunden.

also einfach -> schalte Licht oder sage Temperatur

bis jetzt muss überall der switch Befehl gesprochen werden.

?:banghead:

PS : Soeben gefunden steht im IPS Programm toll 1 Stunde gelesen und nicht gefunden

Gruß aus Stuttgart
Thomas

Es ist eingenartig und eigentlich dachte ich ich wäre schon so weit…
Habe im Amazon einen Coustom Skill angelegt:

{ "intents": [
{ "intent": "DoCommand",
"slots": [ {
"name": "command",
"type": "symcon" } ] } ] }

schalte
schalte ein
schalte aus
status
licht
wohnzimmerlicht an
wohnzimmerlicht aus
DoCommand {command}

Den Rest wie in der Anleitung angelegt die ID herrausgefiltert… klappte bis hier auch alles

 <?
 /*
     Amazon Echo Interface / Webhook
 */

 // Debugging anschalten? --> Log wird mit Script ID im Log Ordner geschrieben.
 $CONF["debug"]              = true;
 $applicationIdValidation    = 'amzn1.ask.skill.f19b216b-a499-4e60-b271-9460a684dXXX'; // aus dem log herausfinden
 $userIdValidation           = 'amzn1.ask.account.AHCVEF2C4QK2QD2EWYZO73OQURC7AERQ5W6XEYH7REE7RW7SEYNVOKDXHRKYPCZIYTKS3FTASRVT3ONI5P2N2LYRFH35WFOJ2CMP2ERCG7NPTEZ6EDEZXPZ3T564476UAJO3ON3MHT636DNFBDK75HZGPCZUQCHAEUE2RW4O6M6P2PNFTBAL6S7FZZW52TINXVIASSG2CZXXXX'; //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("licht|wohnzimmerlicht an")){              LCN_SetIntensity(34769 /*[LCN Local Conrol Network\LCN Module\Modul 10 Raum Wohnzimmer\Ausgänge\Deckenbeleuchtung Ausgang 1]*/, 100, 0);$resp.="Licht an";}
if(WordProbe("licht|wohnzimmerlicht aus")){              LCN_SetIntensity(34769 /*[LCN Local Conrol Network\LCN Module\Modul 10 Raum Wohnzimmer\Ausgänge\Deckenbeleuchtung Ausgang 1]*/, 0, 0);$resp.="Licht aus";}

# Jalousien
#if(WordProbe("alle jalousien schräg")){         IPS_RunScript(24265);$resp.="";}
#if(WordProbe("alle jalousien auf|hoch|hochfahren")){IPS_RunScript(38846); IPS_RunScript(11917);$resp.="";}

#Geräte
#if(WordProbe("radio aus")){SEIR_SendCommand(15613,"KEY_POWER"); $resp.="";}
#if(WordProbe("coffee|coffeemachine on")){ZW_SwitchMode(48388,true);$resp.="";}
#if(WordProbe("coffee|coffeemachine off")){ZW_SwitchMode(48388,false);$resp.="";}

# Abfragen ---
#if(WordProbe("temperature outside")){           $resp.= "Temperature outside is ".GetValueFormatted(42998);}

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);
}


 
?> 

Das koriuse sowohl per Sprache auch per Simulator werden die Befehle ausgeführt sprich Licht schaltet ein und aus, allerding scheint irgendwas mir der Rückmeldung nicht zu stimmen. Nach der ausführung des Befehls beschwert sich Alexa über einen Fehler in der Kommunikation und im Simulator

The remote endpoint could not be called, or the response it returned was invalid.

Befehle werden Ausgeführt

Log:

017-02-02 19:29:44: --------------------------- NEW REQUEST ---------------------------------
2017-02-02 19:29:44: SERVER ARRAY:
2017-02-02 19:29:44: Array
(
    [PHP_AUTH_PW] => 
    [PHP_AUTH_USER] => 
    [DOCUMENT_ROOT] => /usr/share/symcon/webfront
    [REQUEST_METHOD] => POST
    [HTTP_ACCEPT_CHARSET] => utf-8
    [HTTP_ACCEPT] => application/json
    [HTTP_CONNECTION] => close
    [HTTP_X_FORWARDED_FOR] => XX.XX.XX.116
    [HTTP_HOST] => XXXXXXXXX.ipmagic.de
    [PHP_SELF] => /hook/echo
    [QUERY_STRING] => 
    [REQUEST_URI] => /hook/echo
    [REMOTE_ADDR] => 127.0.0.1
    [HOOK] => /hook/echo
    [HTTP_USER_AGENT] => Apache-HttpClient/UNAVAILABLE (Java/1.8.0_112)
    [SCRIPT_NAME] => /hook/echo
    [SERVER_PROTOCOL] => HTTP/1.0
    [REQUEST_TIME_FLOAT] => 1486060184,8498
    [REQUEST_TIME] => 1486060184
    [argv] => Array
        (
        )

    [argc] => 0
)

2017-02-02 19:29:44: GET ARRAY:
2017-02-02 19:29:44: Array
(
)

2017-02-02 19:29:44: POST ARRAY:
2017-02-02 19:29:44: Array
(
)

2017-02-02 19:29:44: JSON Object:
2017-02-02 19:29:44: Array
(
    [version] => 1.0
    [session] => Array
        (
            [new] => 1
            [sessionId] => SessionId.dcc3ddef-c2c3-418c-83f4-2501a09XXXX
            [application] => Array
                (
                    [applicationId] => amzn1.ask.skill.f19b216b-a499-4e60-b271-9460a684XXX
                )

            [attributes] => Array
                (
                )

            [user] => Array
                (
                    [userId] => amzn1.ask.account.AHCVEF2C4QK2QD2EWYZO73OQURC7AERQ5W6XEYH7REE7RW7SEYNVOKDXHRKYPCZIYTKS3FTASRVT3ONI5P2N2LYRFH35WFOJ2CMP2ERCG7NPTEZ6EDEZXPZ3T564476UAJO3ON3MHT636DNFBDK75HZGPCZUQCHAEUE2RW4O6M6P2PNFTBAL6S7FZZW52TINXVIASSG2CZXXXX
                )

        )

    [request] => Array
        (
            [type] => IntentRequest
            [requestId] => EdwRequestId.f19474a6-4454-4f27-845e-3923cd528XXX
            [timestamp] => 2017-02-02T18:29:44Z
            [locale] => de-DE
            [intent] => Array
                (
                    [name] => DoCommand
                    [slots] => Array
                        (
                            [command] => Array
                                (
                                    [name] => command
                                    [value] => wohnzimmerlicht an
                                )

                        )

                )

        )

)

2017-02-02 19:29:44: Command recieved: wohnzimmerlicht an
2017-02-02 19:29:45: Found command: 1
2017-02-02 19:29:45: Response:  Licht an

Vielleicht noch jemand nen Ansatz?

doch noch ne Fehlermeldung gefunden:

[request] => Array
(
[type] => SessionEndedRequest
[requestId] => amzn1.echo-api.request.047c0843-ba8e-4d99-a410-ce3b3XXXXX
[timestamp] => 2017-02-02T20:20:31Z
[locale] => de-DE
[reason] => ERROR
[error] => Array
(
[type] => INVALID_RESPONSE
[message] => An exception occurred while dispatching the request to the skill.
)

Die Rückmeldung ist auch mein Problem. Ich weiss nicht, wie ich da ansetzen muss.

Das Problem mit der Rückmeldung hatte ich auch.

Nemmt einfach mal die beiden Header anweisungen als Response weg…

Ich habe sie hier mal auskommentiert…
Es scheint dann zu reichen, dass man das Ergebnis einfach als Echo zurückgibt…

// 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;

Super Marc vielen Dank als kurze Rückmeldung das War es bei mir jetzt funktioniert es ohne fehlermeldung

Hallo,

Habe meine Skill als SmartHome mit der invocation „myhome“ in English angelegt. Soweit so gut. Ich kann auch über die Test Funktion Befehle auslösen. Symcon schaltet auch wie es soll und es kommt auch keine Fehlermeldung.

Der Skill taucht auch bei „meine Skills“ auf. Obwohl ich nicht „Submit for certification“ gemacht habe, sondern ihn nur gespeichert habe. Ich denke ich will ihn ja auch gar nicht zur Certificatioin veröffentlichen, oder?

Nur die Sprachsteuerung funktioniert irgendwie nicht.

Diesen Schritt habe ich nicht verstanden:

Nun auf echoism.io einmal mit amazon user anmelden und alexa irgendwas fragen. Wetter etc. (englisch).

Was ist das für eine Seite und wem gehört die? Warum soll ich das machen?

Sie meckert nicht bei der Invocation, aber es kommt trotzdem kein Befehl über die Sprachsteuerung an.

So sieht meine Auswertungszeile aus:

if(WordProbe(„bedroom on“)){HM_WriteValueBoolean(57357 /[Hardware\OG\Schlafzimmer\Schrankbeleuchtung]/, „STATE“, True);$resp.="";}

Wie gesagt mit dem Test funktioniert das.

Jemand eine Idee?

Hm, habe jetzt mal einen deutschen Skill angelegt und jetzt geht es.

Bin noch nicht ganz zufrieden.
Ich glaube man müsste den intent noch anpassen, damit man mehrere Slots sinnvoll kombinieren kann. Damit sollte sich die Erkennung verbessern lassen.

{ „intents“: [
{ „intent“: „DoCommand“,
„slots“: [
{
„name“: „raum“,
„type“: „raum“
}
{
„name“: „geraet“,
„type“: „geraet“ } ]
}
{
„name“: „befehl“,
„type“: „befehl“ } ]
}
] } ] }

Slot „raum“:
wohnzimmer
flur
küche

Slot „geraet“:
licht
rollladen

slot „befehl“:
auf
zu
an
aus

Code:
DoCommand {raum geraet befehl}

„Alexa, sag Symcon <raum> <gerät> <befehl>“

Meint ihr das würde so gehen?

Für eine richtige Spracherkennung sollte auf alle Fälle Custom Slot Types für jedes einzelne Element benutzt werden das erkannt werden soll. Füllwörter können dabei weggelassen werden.

Welche Verbindungswörter/Füllwörter zur Zeit möglich sind bzw. wie eine Utterance aufgebaut sein sollte ist unter
supported-phrases-to-begin-a-conversation
beschrieben.

Ich mag ja das Skript von Seite 1. Ich dachte erst die Idee mit dem Modul und den links wäre besser, aber das Skript hat auch was, kann komplexer sein und scheint einfacher zu warten.

Für die deutsche Unterstützung und um die Erkennung zu verbessern habe ich versucht das Intent-Schema anzupassen und verschiedene Slots angelegt. Damit wären auch Füllwörter kein großes Problem mehr. Das hat jetzt aber leider den Nachteil, dass die Kommandos nicht mehr als einzelner String zurückkommen, sondern als Struktur mit den einzelnen Slots. Leider kann das Skript damit nicht umgehen.

Folgendes habe ich gemacht:

{ "intents": [
{ "intent": "DoCommand",
"slots": [ {
			"name": "rooms",
			"type": "rooms" 
			},
			{
			"name": "position",
			"type": "position" 
            },
          	{
			"name": "device",
			"type": "device" 
            },
          	{
			"name": "action",
			"type": "action" 
            }
         ] 
} ] 
}

rooms:

wohnzimmer
wohnen
flur
büro
arbeitszimmer
schlafzimmer
schlafen
küche
garten

position:

links
rechts
mitte
alle
tür
eingang
schrank
schrankwand
regal
tisch
fenster
couch
fluter
innen
drinnen
wohnzimmer
außen
draußen
garten
gäste

device:

lampe
licht
spots
led
LED
belüftung
lüftung
rollladen
jalousie
jalousien
beleuchtung
welan
diskstation
mülltermine

action:

stopp
halt
anhalten
wecken
starten
stoppen
vorlesen
an
ein
aus
schatten
abschatten
auf
öffnen
hoch
zu
schliessen
runter

Utterances:

DoCommand {rooms} {device} {position} {action}
DoCommand {rooms} {position} {device} {action}
DoCommand {rooms} {device} {action}
DoCommand {position} {device} {action}
DoCommand {device} {position} {action}
DoCommand {device} {action}
DoCommand {device} {position}
DoCommand {device}

Wenn ich jetzt damit eine Anfrage schicken, wird sie so codiert:

{
  "session": {
    "sessionId": "SessionId.xxxx",
    "application": {
      "applicationId": "amzn1.ask.skxxxxxxx"
    },
    "attributes": {},
    "user": {
      "userId": xxxx    },
    "new": true
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.44c870ea-547c-46b2-9279-xxxxxxx",
    "locale": "de-DE",
    "timestamp": "2017-02-19T14:28:00Z",
    "intent": {
      "name": "DoCommand",
      "slots": {
        "rooms": {
          "name": "rooms",
          "value": "wohnzimmer"
        },
        "action": {
          "name": "action",
          "value": "ein"
        },
        "position": {
          "name": "position",
          "value": "tisch"
        },
        "device": {
          "name": "device",
          "value": "lampe"
        }
      }
    }
  },
  "version": "1.0"
}

Leider kommt das Skript damit wie gesagt nicht klar.
Ich bin mit der Materie nicht fit genug, um mir hier selbst weiterzuhelfen. Am sinnvollsten wäre es sicher, wenn die WordProbe Funktion daraus wieder einen String bauen würde, so dass die bestehenden if-Abfragen weiterverwendet werden können (ich habe nämlich schon 50 Stück…).

Man müsste das Skript auf Seite 1 so umstricken, dass es mit beliebigen (definierbaren) Slots umgehen kann.
Definition: Slot1=rooms; Slot2=position, usw,

Der WordProbe Befehl müsste dann angepasst werden in der Art WordProbe(<Slot1>, <Slot2>, <Slot3>,…,<Slot n>).
Beispiel: WordProbe(„wohnzimmer|wohnen“, „“, „licht|lampe“, „ein|an“)

Kann mir hier jemand weiterhelfen?