Alexa Custom Skill Modul

Update: Bitte verwendet stattdessen jetzt dieses Modul:
Patami Alexa Skill Framework

Hallo zusammen,

Nachdem ich nun einige Wochen schon ein Amazon Echo Dot habe, und richtig begeistert bin, habe ich mit einige Skripte zum Handling der Anfragen von Alexa Custom Skills geschrieben.

Um die Funktionalität besser zu kapseln und auch anderen IP-Symcon Usern zur Verfügung zu stellen, habe ich eine Bibliothek mit einigen IP-Symcon PHP Modulen erstellt.

Eine Anleitung zur Installation und den Link zum Git-Repository findet ihr hier:
Browse Patami / IP-Symcon Modul - Alexa Skills - Braintower SCM

Über Rückmeldungen, Ergänzungen, Bugreports und Anregungen freue ich mich jetzt schon.

Viele Grüße,
Florian

Klingt gut! :slight_smile:

Aktuell hab ich ein Problem beim Abspeichern von Intent Schema und Sample Utterances. Amazon sagt:

„Error: There was a problem with your request: Unknown slot type ‚Information_Subjects‘ for slot ‚subject‘“

Ein bei der Übernahme von Braintower zerbrochenes „ü“ habe ich dabei schon repariert.

Ok, bin etwas weiter. Sehe ich es richtig, dass man im Interaction Model den Custom Slot Type Information_Subjects noch anlegen muss? Und vermutlich hat dieser diese Werte:

bibliotheken
module
instanzen
skripte
variablen

Richtig?

Bei „Alexa, frage Demo“ erhalte ich jetzt allerdings folgendes Feedback:


{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "Der angeforderte Skill konnte nicht ausgeführt werden weil der LaunchRequest Intent nicht konfiguriert ist."
    },
    "shouldEndSession": true
  },
  "sessionAttributes": {}
}

Ja gut, mit dem Custom Slot Type habe ich wohl richtig gelegen und dann habe ich noch beim WebHook unter „Diesen Inten ausführen, wenn der Skill ohne Kommando aufgerufen wird“ die Instanz „InformationSubjectResponse“ hinterlegt. Das scheint mir entsprechend deiner Beschreibung der richtige Eintrag. Ich erhalte dann aber auf „Frage Demo“ nur die Antwort „Ich weiß nicht, auf was du antwortest“. Wenn ich das Script richtig verstehe, dann müsste dort eigentlich „Ich kann Dir die Anzahl der Bibliotheken, Module, Instanzen, Skripte oder Variablen nennen.“ zurückgeliefert werden?

Cool, danke für die schnelle Rückmeldung!
Ich versuche mal eure Probleme zu reproduzieren und melde mich in Kürze wieder!

Das hat in der Tat in der Anleitung gefehlt. Es gibt im Git-Repository eine Textdatei, die die notwendigen Informationen enthält. Die Anleitung in der Readme habe ich korrigiert, jetzt ist das Anlegen des Slot Types enthalten.

Das konnte ich nicht nachvollziehen. Was meinst Du genau damit? Kannst Du bitte beschreiben, was Du genau tust?

Richtig, siehe meine erste Antwort. Die Anleitung ist korrigiert. Aber Du hast es schon richtig gemacht :slight_smile:

Hier hatte leider auch noch etwas in der Anleitung gefehlt, was ich ergänzt habe. Du musst auf der Konfigurationsseite des WebHooks den LaunchRequest Intent konfigurieren und dort auf den GetInformation Intent verweisen. Alexa sendet an den WebHook diese LaunchRequest Anfragen, wenn dem Skill kein Kommando übergeben wurde. Wenn Du nur „Alexa, frage Demo“ sagst, wird kein Kommando übergeben. Wenn Du „Alexa, frage Demo nach Informationen“ fragst, matched das hingegen gegen die Sample Utterances und ruft mit einem IntentRequest direkt GetInformation auf. Der Intent wird hier dann denselben Satz ausgeben, da bei dieser Anfrage immer noch der „subject“ Slot leer ist und der Intent diese Information dann von Dir abfragt.

Nein, das ist der falsche Intent. Siehe meine anderen Antworten. Aber für alle neuen (Beta-)Tester sollte es jetzt passen, die Anleitung habe ich gefixed.

Vielen herzlichen Dank für das zur Verfügung stellen von deinem Ansatz.

Ich habe mir das nur erstmal grob angeschaut.

Meine ersten Anmerkungen bzw. Beobachtungen:

[ul]
[li]das Aktion Skript kannst Du ja eigentlich auch gleich komplett anlegen, statt erst eines anzulegen und dann den Nutzer den Inhalt erneut reinkopieren zu lassen[/li][li]im Aktion Skript fehlt das ?> am Schluss[/li][li]nach dem Einrichten kommt bei mir als Rückmeldung auf einen LaunchIntent als Antwort Ich weis nicht auf was Du antwortest[/li][/ul]

Im Debug steht


Session controller                             Not set
Aktion                                         Forward to session controller
Forward to Session controller                  Session controller not set

Gerne :slight_smile:

Könnte ich tun, allerdings wird ein etwas einfacheres, aber dennoch funktionsfähiges Skript verwendet. Aus meiner Sicht macht es nicht so viel Sinn, jedes Mal das Demo Skript als Basis für ein neues Aktions-Skript zu verwenden.

Man könnte jedoch darüber nachdenken, einen eigenen Button zum Erstellen des Skriptes zu verwenden, um dem Benutzer die Arbeit abzunehmen. Im „manuellen Ansatz“ sehe ich jedoch den Vorteil, dass man die Zusammenhänge besser versteht.

Also :slight_smile:

In „Standard PHP“ ist es Best Practice, das schließende ?> Tag nicht zu verwenden, da nach diesem Tag folgende Zeichen (evtl. Leerzeilen) unter Umständen als HTML Text ausgegeben werden. Am Ende einer Datei wird das PHP-Skript-HTML-Tag automatisch implizit geschlossen.

Ich gehe davon aus, dass es in IP-Symcon’s PHP auch so ist, jedenfalls hatte ich noch nie Probleme damit.

Das ist der Grund, wieso das so ist. Ist also Absicht :slight_smile:

Ich vermute, dass Du den LaunchIntent auf den InformationSubjectResponse Intent und nicht auf den GetInformation Intent gesetzt hast.

Ich habe nun die Anleitung deutlich verbessert und auch Screenshots hinzugefügt.
Ich hoffe, es hilfe.

Hallo patami,
Dein Howto ist wirklich super gelungen, es lässt sich ganz einfach Punkt für Punkt abarbeiten, dafür ein großes Lob und ein dickes Danke meinerseits !!!

Ich habe alle bis zum Ende fehlerfrei hinbekommen doch leider hänge ich am Ende.
Ich kann die Seite
Amazon Alexa
leider nicht aufrufen, ich werde partu immer auf meinen Deutsche Seite / Account umgeleitet wo ich den Skill nicht auswählen kann ???

Hast du eine Erklärung für mich ???

Grüße Daniel

Das habe ich nie absichtlich getestet aber oft meckert IP-Symcon rum wenn kein ?> gesetzt wurde also würde imho es lieber setzten tut ja keinem weh.

Weglassen!
IPS braucht das nicht.
Im Gegenteil, IPS wirft ja Fehler wenn PHP eine Ausgabe erzeugt.
Michael

Wieder was dazugelernt :smiley:

OK gefunden - Im Account auf Skills und dann oben rechts auf „Ihre Skills“ dann taucht der Patami Demo Skill auf… so einfach hmmm

Nein habe ich nicht es ist die GetInformation Instanz gesetzt. Irgendeine Idee wie ich mit Debug dem Fehler näher auf die Schliche komme ich habe mir Deinen Quellcode noch nicht angeschaut.

Ich habe den Invocation name bei mir geändert vielleicht ist das ja die Ursache je nachdem was dein Code erwartet.

Ich habe in die Readme einen entsprechenden Hinweis aufgenommen, danke.

Den Invocation name zu ändern, sollte kein Problem sein. Er wird nirgendwo verwendet und auch im Request nicht von Amazon übergeben.

Lass uns es mal so versuchen:

  1. Aktiviere das Debugging der WebHook Instanz.
  2. Frage Alexa „Alexa, frage Demo“.
  3. Stelle hier im Forum die Ausgabe der Debug-Meldung „Incoming Request Data“ zur Verfügung.

Denk bitte daran, die applicationId und userId Felder zu zensieren, diese sind sicherheitsrelevant!

Anbei der Inhalt aus dem Debug Fenster auf den Standard Request „Alexa öffne zu Hause“ (zu Hause) ist der Invocation Name:


TXT: 19.02.2017 14:15:18.00 | Incoming Request Source IP | 72.21.217.77
TXT: 19.02.2017 14:15:18.00 | Incoming Request Data | {"version":"1.0","session":{"new":true,"sessionId":"SessionId.123456","application":{"applicationId":"amzn1.ask.skill.123456"},"attributes":{},"user":{"userId":"amzn1.ask.account.ABCDEFG"}},"request":{"type":"IntentRequest","requestId":"EdwRequestId.123456","timestamp":"2017-02-19T13:15:17Z","locale":"de-DE","intent":{"name":"InformationSubjectResponse","slots":{"subject":{"name":"subject","value":"öffne Hause"}}},"inDialog":false}}
TXT: 19.02.2017 14:15:18.00 |   Version Validation | 1.0
TXT: 19.02.2017 14:15:18.00 |    Locale Validation | de-DE
TXT: 19.02.2017 14:15:18.00 |    Locale Validation | German
TXT: 19.02.2017 14:15:18.00 | Request ID Validation | EdwRequestId.12345676
TXT: 19.02.2017 14:15:18.00 | Session ID Validation | SessionId.abcde
TXT: 19.02.2017 14:15:18.00 |   Session Attributes | []
TXT: 19.02.2017 14:15:18.00 | Application ID Validation | amzn1.ask.skill.123456789
TXT: 19.02.2017 14:15:18.00 |   User ID Validation | amzn1.ask.account.ABCDEFG
TXT: 19.02.2017 14:15:18.00 | Request Type Validation | IntentRequest
TXT: 19.02.2017 14:15:18.00 |    Intent Validation | InformationSubjectResponse
TXT: 19.02.2017 14:15:18.00 |    Intent Validation | Found intent instance 18147 (Geräte\Amazon Echo Alexa\Custom Skill\PHP Module Custom Demo\Alexa Custom Skill Intent InformationSubjectResponse)
TXT: 19.02.2017 14:15:18.00 | Intent Slots Validation | {"subject":{"name":"subject","value":"\u00f6ffne Hause"}}
TXT: 19.02.2017 14:15:18.00 | Merged Session Attributes | {"slots":{"subject":"\u00f6ffne Hause"}}
TXT: 19.02.2017 14:15:18.00 |     Intent Execution | Executing intent instance
TXT: 19.02.2017 14:15:18.00 | Outgoing Response Data | {"version":"1.0","response":{"outputSpeech":{"type":"PlainText","text":"Ich weiss nicht, auf was Du antwortest."},"shouldEndSession":true},"sessionAttributes":[]}

Es scheint so zu sein als das Dein Code das nicht als Launchrequest verarbeitet.