ioBroker / ioBroker.iot

Connection for Alexa, IFTTT, Google Home and co
MIT License
72 stars 25 forks source link

Alexa custom skill gibt "Fill words" nicht weiter. #560

Open BenAhrdt opened 1 year ago

BenAhrdt commented 1 year ago

Der Custom skill liefert die "Fill words" nicht zurück, wenn einmal nichts gesagt wurde (innerhalb eines Dialogs).

To Reproduce

  1. Erstelle ein Skript, welches den dp "iot.x.smart.lastCommandObj" subscribt und auf diesen reagiert.
  2. parse den "dp.state.val" in die variable "input"
  3. frage auf "input.words" ab
  4. erstelle eine abfrage, welche den dp "iot.0.smart.lastResponse" mit folgendem Stringyfied json: (Nachdem die Ansage "Alexa, frage ioBroker er soll... {sessionId:input.sessionId, responseText :"Dein Text.", shouldEndSession:false}; erfolgt ist. => in den WORDS steht nun ["FILL WORDS","deine restliche Ansage"]
  5. Nach der Ausgabe erwartet der custom skill eine "Ansage". Sagt man nun nichts, so, hört Alexa auf zu zu hören.
  6. Sagt man nun wieder "Alexa, frage ioBroker er soll ..." => so steht in den WORDS ["er soll deine restliche Ansage"]

Hier startete man ja die Ansage von vorne und erwartet wieder das Array als ["FILL WORDS","deine restliche Ansage"] Es wird aber das Array so weiter behandelt, als würde man sich mitten im Dialog befinden.

Apollon77 commented 1 year ago

Ok, das ganze mal bitte praktisch als Beispiel und nicht "aussage " und "restliche aussage" und bitte mit iot Adapter Debug Log. Also Debug log iot, dann bitte aufschreiben (oder vllt aufnehmen und als audiodatei einstellen) was geau wie passiert mit einem praktischen beispiel

Apollon77 commented 1 year ago

oder hast Du nur eine falsche annahme?"Fillwords" entstehen immer bei einer "ersten anfrage" mit "sage iobroker ...." wenn das erste wort aus der Liste der "Füllwörter ohne weiter bedeutung" ist. (Wobei je anchdem was du sagtst "fill words" auch nicht da ist weil es ein valides "erstes wort nach "sage iobroker... "ist.

Um verschiedene sprachsessions zu untershceiden bitte die SessionId nutzen die mitgegeben wird

BenAhrdt commented 1 year ago

Ich denke schon, dass ich es richtig verstanden habe.

Ich sage: "Alexa, sage ioBroker er soll das Garagenlicht anmachen" Ergebnis in Words: ["FILL WORDS","das Garagenlicht anmachen"]

Frage kommt zurück: "Soll das Licht komplett oder nur das indirekte aktiviert werden?"

wenn man jetzt nichts sagt, dann geht Alexa aus dem "Zuhörmodus" heraus. Und die Session ist beendet. => Richtig?

Sage ich jetzt wieder: "Alexa, sage ioBroker er soll das Garagenlicht anmachen" Ergebnis in Words: ["er soll das Garagenlicht anmachen"]

Da es eine neue Session ist, erwarte ich eigentlich das Ergebnis wie vorher, nicht wie mitten in der Session, die vorher aktiv war.

Ist das verständlicher beschrieben?

Apollon77 commented 1 year ago

Ahh du wunderst dich also das er beim zweiten mal das "er" mitliefert und nicht "FILLWORDS" sagt? Dann sag ich malso ... freu dich och .. Ja hätte ich so nicht erwartet ...

Umd as technisch zu bewerten -> Debug Log vom iot Adapter bitte für genau diese Abfolge

BenAhrdt commented 1 year ago

OK, mache ich später. Ich frage ja in meinem Skript die "FILL WORDS" als einstieg ab und wenn man eben nicht die gleiche Frage wieder stellt, dann ist es eben nicht so toll :-D ...

Apollon77 commented 1 year ago

Dann ist das aber der denkfehler!! "Fillwords" ist nur ein Platzhalter für eine gruppe von "wörtern die keinen weiteren mehrwert für die Anfrage haben".

ein "frage iobroker wie spät es ist" gibt KEIN Fillword sondern "wie spät es ist" weil "wie" ein erlaubtes und wichtiges/eindeutiges Einstiegswort ist. Bitte im Forum das Konzept und vor allem ggf die Google Tabelle ansehen um zu verstehen wie die Logik funtioniert

Apollon77 commented 1 year ago

Die richtige Lösung ist die session id zu nehmen und sich so den "State" der kommunikation zu merken (und die session daten nach zeit x zu löschen wenn nichts neues kam).

BenAhrdt commented 1 year ago

Die Session Id, die dann kommt ist ja nicht die gleiche wie vorher, das checke ich ja schon.

BenAhrdt commented 1 year ago

Hier der Log: Log.txt

In dem Log ist auch zu sehen, dass wenn man nichts sagt, die Session beendet wird.

Und wie zu sehen ergibt "Alexa, sage ioBroker er soll etwas machen das array ["Fill Words","soll was machen"]

BenAhrdt commented 1 year ago

Ich habe mir die Liste schon angesehen und aus "er" macht der Adapter "Fill word"

BenAhrdt commented 1 year ago

Ich habe gerade noch einen Test gemacht: Alexa frage ioBroker nachdem Stromverbrauch. Ergebnis des words arrays: ["Fill Words","stromverbrauch"] daraufhin habe ich auf eine Frage nicht geantwortet und die gleiche eingabe wieder gesagt: Alexa frage ioBroker nach dem Stromverbrauch: Ergebnis: eine andere Session-ID und das Word Array: ["dem stromverbrauch"]

Vielleicht könnte der skill ja auch selbst merken, dass es eine abweichende SessionId ist und damit wieder "Fill Words" einsetzen. so wie es bei der 1. Anfrage auch war.

BenAhrdt commented 1 year ago

@Apollon77 Ich habe gerade gemerkt, dass er das Array wieder mit "Fill Words" befüllt, wenn man paar Sekunden wartet. Wenn man direkt nachdem Alexa in den Ruhemodus gegangen ist fragt, scheint sie dies noch nicht zu machen (aber sendet eine neue SessionId), aber wenn man 5s wartet und dann etwas sagt, dann ist es wieder komplett wie eine neue Anfrage (mit "Fill Words")

BenAhrdt commented 1 year ago

Es hat bestimmt einen Amazon Hintergrund, aber wenn es ein paar Sekunden nachdem Alexa nicht mehr zuhört geht, warum kann eigentlich nicht immer genau der Text, den man sagt übergeben werden?

oder das Wort „nach“ noch als Hauptwort hinzufügen? Ist das möglich?

Dann könnte man noch ziemlich viele Fragen erschlagen:

Alexa, frage ioBroker nach xyz.

Apollon77 commented 1 year ago

nach ) Füllwort ... warum brauchst du es als Hauptwort?, dann wäre "ob" das nächste und so weiter. Wir sind leider bei den Hauptwörtern sehr limitiert was die Anzahl angeht

BenAhrdt commented 1 year ago

OK, aber ich frage ja: Alexa, frage ioBroker nach dem Stromverbrauch ... und Alexa, frage ioBroker ob er das und das

Oderß Das ist doch ein normaler Satz.

BenAhrdt commented 1 year ago

@Apollon77 Ob habt ihr ja schon drin stehen: image

Wenn ich nun frage: Alexa, frage ioBroker ob alle türen geschlossen sind so erscheint das Words ARRAY: words":["Alle","türen geschlossen sind"] Wieso schreibt er jetzt nicht das "ob" mit da rein? weil alle auch ein Hauptwort ist?

Denn wenn ich Frgae: Alexa, frage ioBroker was gibt es heute so erscheint dieses Array words":["Was","gibt es heute"]