CustomIntent mit Dialog

Begonnen von gregorv, 03 Oktober 2024, 10:54:24

Vorheriges Thema - Nächstes Thema

gregorv

Zitatfalls du nicht schneller bist.
vermutlich nicht - in den nächsten paar Tagen.
Ich möchte heute erst mal die geänderten Dateien zusammenfassen, meine 99_myUtils.pm aufräumen und eventuell aus den zwei CustomIntents (Blinds,BlindStopp) nur einen machen und ggf. ein paar screenshots machen. Bis zum Nachmittag häng ich die Dateien mal an.
Ich schau mir das mit SilentCancelation und auch SilentTimeout mal an. Das sollte man so ändern können, dass es über den 'normalen' Weg geht.



Beta-User

#31
Hmmm,
bin jetzt nochmal etwas intensiver über den Code gegangen und hab' noch den einen oder anderen Wackler gefunden.

M.E. müßte das angehängte (ungetestet, also nur, falls es sich laden läßt...) im Großen und Ganzen die Problemchen hier adressieren, allerdings etwas anders, als das hier diskutiert war, z.B., was das Durchreichen von "customData" angeht.

Mal sehen, ob ich über das WE zum Testen komme.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

gregorv

Hallo Beta-User,

ist ja schon fast alles drin! Aber es gibt leider noch einen Fehler (mag aber sein dass mein intent noch was liefern muss).
wenn ich die Rolladen Fahrt starte (Intent Blinds), dann hört Rhaspy zwar die Antworten, aber meldet zu allem IntentNotRecognized - selbst bei dem hotword, was ja keinen Intent startet - und beendet die session.

Nach dem Start von meinem Intent sehe ich im log mehrere Fehlermeldungen, wie:
ERROR: >ARRAY(0x61344a0)< returned by the RHASSPY ParseFn is invalid, notify the module maintainerLogauszug angehängt.

Ansonsten habe ich noch optional silent timeout in RHASSPY_DialogTimeout eingebaut.
statt:
respond( $hash, $data, getResponse( $hash, 'DefaultConfirmationTimeout' ) );eingefügt:
    my $response = ( defined $data->{customData} && defined $data->{customData}->{silent} ) ? 'SilentCancelConfirmation' : 'DefaultConfirmationTimeout';
    respond( $hash, $data, getResponse( $hash, $response ), undef, 0 );

und die WieBitte? Funktion hätte ich noch gerne drin (bei IntentNotRecognized). Sollte nur dann kommen, wenn z.B. ein spezielles customData vorhanden ist.
Könnte aber sein, dass das schon geht - komme ich wegen des Fehlers aber nicht hin.


JensS

Hier ist ganz schön was los. Ich hatte leider keinen Ansatz für das timeout in der Referenz gefunden.
Kann mir bitte jemand mit einer beispielhaften MQTT-Anweisung auf die Sprünge helfen? 
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Beta-User

Zitat von: JensS am 11 Oktober 2024, 19:30:40Ich hatte leider keinen Ansatz für das timeout in der Referenz gefunden.
Kann mir bitte jemand mit einer beispielhaften MQTT-Anweisung auf die Sprünge helfen?
Hmmm, das mit dem timeout ist m.E. mehrdeutig, und ich hatte heute morgen dann auch keine Zeit mehr, auch dazu noch was zu suchen bzw. zu schreiben. Jedenfalls:
- RHASSPY kennt eigene timeouts für "seine" Dialoge und verwaltet die auch intern. Das war das, was im ursprünglichen Code für CustomIntents mit "timeout" gemeint gewesen war.
- Wie das an Rhasspy ggf. _auch noch_ weitergegeben wird: Aktuell eine Wissenslücke bei mir... Kann sein, dass es jetzt funtioniert, weil/wenn man im return-HASH (-Teil) dann auch noch was weitergibt.
Bitte ggf. selbst mal schauen, ich komme zumindest an diesem WE eher nicht dazu.

Zitat von: gregorv am 11 Oktober 2024, 14:56:25Nach dem Start von meinem Intent sehe ich im log mehrere Fehlermeldungen, wie:
Hängt vermutlich an der Notation der Initialisierung des Arrays, müßte ggf. der Einfachheit halber auf die push-Variante umgestellt werden?

Zitat von: gregorv am 11 Oktober 2024, 14:56:25Ansonsten habe ich noch optional silent timeout in RHASSPY_DialogTimeout eingebaut.
Klingt sinnvoll! Allerdings meine ich mich zu entsinnen, dass "customData" flacher Text sein muss, so dass der Code entweder nicht funktioniert oder nur dann, wenn man da was manipuliert. Von daher würde ich auf die Schnelle dazu neigen, customData mit "silentTimeout" (oder so) zu vergleichen, so dass man den Dialog damit wie beabsichtigt schließen kann, ohne was "regelwidrig" zu verbiegen. Da der Dialog dann fertig ist, wird der originale Inhalt ja nicht mehr benötigt, oder liege ich da falsch? (=Bitte mal im Code recherchieren)

Zitat von: gregorv am 11 Oktober 2024, 14:56:25und die WieBitte? Funktion hätte ich noch gerne drin (bei IntentNotRecognized). Sollte nur dann kommen, wenn z.B. ein spezielles customData vorhanden ist.
Könnte aber sein, dass das schon geht - komme ich wegen des Fehlers aber nicht hin.
Ist mir durchgerutscht, sorry.

Ein "Wie bitte" finde ich generell richtig, wenn grade ein Dialog mit dem Satelliten offen ist. Hintergrund (wieder lt. meiner evtl. falschen Erinnerung!): Da die anderen Intents deaktiviert sind, werden die Sätze zwar uU. erkannt, aber eben ohne passenden Intent geliefert, so dass das ggf. ein sogar recht häufiger Fall ist.

Dann war mir noch irgendwas im Kopf, das ich aus der Diskussion hier versehentlich nicht eingearbeitet hatte. Leider habe ich zwischenzeitlich vergessen, was das war :-[ ...   
Bewußt noch nicht drin ist der generalisierte "GetDate"-Intent, dafür war einfach keine Zeit. Falls jemand verstanden hat, wie ich das meine und Lust hat, Code zu liefern: Her damit!  ;D
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

gregorv

@Jens
ZitatHmmm, das mit dem timeout ist m.E. mehrdeutig
Soweit ich in den Logs gesehen habe, kommt von Rhasspy ein IntentNotRecognized, wenn die bei Rhasspy unter Kaldi eingestellte Maximum Duration: abgelaufen ist (!! der timeout kommt immmer nach der Hälfte der eingestellten Sekunden -> eingestellt 60 -> Timeout nach 30s). In fhem ist es eher störend, wenn der zuschlägt. fhem hat einen eigenen timeout nachdem auch als Grund für die Beendigung der session reason timeout gemeldet wird (und nicht IntentNotRecognized) Dieser fhem timeout wird mit der sub setDialogTimeout und da mit resetRegIntTimer (im Modul) eingestellt das installiert die Callback Funktion RHASSPY_DialogTimeout. Daher sollte der Rhasspy Kaldi timeout möglicht nicht 'reinpfuschen' -> also so groß, wie möglich einstellen werden (habe noch nicht gefunden, was das Maximum ist. Und NEIN, ein MQTT wird durch setDialogTimeout gar nicht gesendet, das ist fhem intern.

@Beta-User
ZitatHängt vermutlich an der Notation der Initialisierung des Arrays, müßte ggf. der Einfachheit halber auf die push-Variante umgestellt werden?
Da überforderst Du mich - so tief stecke ich in Perl nicht drin - eventuell weiß Jens das ?

entsinnen, dass "customData" flacher Text sein muss
Kann wohl beides sein. Beim Start einer session steht da immer die Bezeichnung der hotword Datei (Dateiname in /profiles/de/porcupine) als flacher Text drin. Zumindest bei mir.
Ich sende da mit meinem CustomIntent ein hash (innerhalb vom customData hash) und der wird von fhem klaglos bis zum Ende der Session behalten und man kann ihn beliebig verwenden.
Das habe ich übrigens von perplexity, der KI Suchmaschine, erfahren und ich hab keine Ahnung, wo die das her hat. Der kann man zwar nicht alles glauben, aber gibt ganz gute Tips und sogar fhem code Beispiele, aus denen man allerdings nur die Ideen übernehmen sollte. Bei Fehlern erklärt sie immer Tut mir leid... eingentlich wäre es logisch, dass die library existiert.
Alternativ wäre so etwas wie {xx:yy} im sentence möglich, aber dam muss man dann aufpassen wohin man das setzt, sonst macht fhem? aus yy den input Wert.

ZitatIst mir durchgerutscht, sorry.
Kein Problem. Hier noch mal der Code dazu:
# @@@ added by GV start - THIS keeps the session open speaking "please try again" after IntentNotRecognized - can repeatedly happen, but terminates with dialogue timeout
    $data->{requestType} = 'voice';                                                                                           # required, otherwise session open but no voice input possible
    my $intentFilter = $data_old->{'.ENABLED'} if defined $data_old->{'.ENABLED'} && ref $data_old->{'.ENABLED'} eq 'ARRAY';  # get intent filter(s)
    my @ca_strings;                                                                                                           # just copied from setDialogTimeout
    $intentFilter = split m{,}xms, $intentFilter if ref $intentFilter ne 'ARRAY';
    if (ref $intentFilter eq 'ARRAY') {
        for (@{$intentFilter}) {
            my $id = qq{$hash->{LANGUAGE}.$hash->{fhemId}:$_};
            push @ca_strings, $id;
        }
    }
    my $response = getResponse( $hash, 'RetryIntent');                                                                         # get retry response
    my $reaction = { text => $response,                                                                                        # hash to control respond() behaviour
                     intentFilter => [@ca_strings],
                     sendIntentNotRecognized => 'true', #'false',
                     customData => $data->{customData}
                   };
    respond( $hash, $data, $reaction);                                                                                         # keep session open and continue listening
    return $hash->{NAME};
# @@@ added by GV end
Vermutlich wird jetzt der Code einfacher. Wenn DATA jetzt komplett ist kann man den Intent Filter da rausholen und ggf. ein silent auch. silent hatte ich deshalb genommen, weil das für timeout und für cancel benötigt wird - um das ganz logisch zu machen, kann man auch silentCancel/silentRetry und silendTimeout einführen - wird Dir wahrscheinlich besser gefallen.

Beispiel in rhasspy-de.cfg:
"RetryIntent": "wiebitte?|wass?|bitte nochmal|hää?",
Gruß Gregor

Beta-User

#36
Zitat von: gregorv am 12 Oktober 2024, 00:13:03ein MQTT wird durch setDialogTimeout gar nicht gesendet, das ist fhem intern
Gut erklärt; genau da könnte man ggf. ja mal versuchsweise ansetzen.

Zitat von: gregorv am 12 Oktober 2024, 00:13:03Da überforderst Du mich - so tief stecke ich in Perl nicht drin - eventuell weiß Jens das ?
Ein einfaches diff hätte dir da vermutlich schon weiter geholfen (oder ein Texteditor für Win.* wie notepad++, falls diff nicht in den Bordmitteln ist):
#my @updatedList = [$hash->{NAME}];
    my @updatedList;
    push @updatedList $hash->{NAME};

Zitat von: gregorv am 12 Oktober 2024, 00:13:03um das ganz logisch zu machen, kann man auch silentCancel/silentRetry und silendTimeout
Habe das jetzt einfach so umbenannt, dass man einheitlich erkennen kann, dass mit "silence" geschlossen werden soll...


In der Funktion war wieder zwangsweise "voice" drin. Bitte sowas nicht machen, es gibt text-Type Satelliten, und es wäre angenehmer, wenn ich nicht ständig darauf hinweisen müsste... (Mir ist allerdings nicht klar, warum man das überhaupt noch braucht, weil "analyzeMQTT.." das jetzt per default und immer macht. Unterschiedliche Versionen? Bitte diff nutzen ;) .)

Hab's nochmal versucht zu konsolidieren, aber jetzt muss ich dringend was anderes machen ;D .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

JensS

#37
Danke für die Erläuterungen. CustumData muss tatsächlich "flacher Text" sein. Ein Array oder Hash müsste dann zerlegt werden.
Hier ein altes Beispiel, bei dem ich ein Wort buchstabiere und an eine Wiki-Sub schicke.

rhasspyIntents:
WIKI=WIKI(DATA)
Wikipedia=Wikipedia(DATA,Begriff)
ABC=ABC(DATA,Ch)

intentFilter=de.fhem:ABC='false'

sentences.ini:
[de.fhem:WIKI]
(bitte| ) schlage in der wikipedia nach

[de.fhem:ABC]
($de.fhem.ABC){Ch}
(suche){Ch}
(abbruch){Ch}
[font=Verdana, Arial, Helvetica, sans-serif]sub ABC{[/font]
sub ABC{
my $data = shift // return;
my $Buchstabe = shift // return;
my $SessionJSON = decode_json($data);
my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};
my $CustomData = $SessionJSON->{'customData'}.$Buchstabe;
if ($Buchstabe ne "suche"){
my $ReturnHash = {
sendIntentNotRecognized => q{true},
intentFilter => [qq{de.fhem:ABC}],
customData => $CustomData,
text => $Buchstabe
};
return $ReturnHash;
}
else{
$CustomData =~ s/WIKI de.fhem:ABC //g;
$CustomData =~ s/suche//g;
Wikipedia($data,$CustomData);
}
}

sub WIKI{
my $data = shift // return;
my $SessionJSON = decode_json($data);
my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};
my $ReturnHash = {
sendIntentNotRecognized => q{true},
intentFilter => [qq{de.fhem:ABC}],
customData => qq{WIKI de.fhem:ABC },
text => q{bitte buchstabiere}
};
return $ReturnHash;
}

sub Wikipedia{
my $data = shift // return;
my $Begriff = shift // return;
my $SessionJSON = decode_json($data);
#my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};
#my $CustomData = $SessionJSON->{'customData'};
#my $Readingsstring = "$SiteID $SessionID $CustomData";
#fhem("setreading Rhasspy SessionID $Readingsstring");
$Begriff =~ s/ /_/g;
$Begriff =~ s/ä/%C3%A4/g;
$Begriff =~ s/ö/%C3%B6/g;
$Begriff =~ s/ü/%C3%BC/g;
$Begriff =~ s/ß/%E1%BA%9E/g;
my $ua = LWP::UserAgent->new();
my $response = $ua->get("https://de.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro&explaintext&redirects=1&titles=$Begriff");
my $content = $response->content;
my $ref = JSON->new->decode($content);
my ($jsonHash) = values %{ $ref->{'query'}->{'pages'} };
my $Response = $jsonHash->{'extract'};
$Response =~ s/\(/ /g;
$Response =~ s/\)/ /g;
$Response =~ s/\;/ /g;
$Response =~ s/\'/ /g;
$Response =~ s/\./ - /g;
$Response =~ s/\:/ /g;
$Response =~ s/\,/ /g;
$Response =~ s/\'/ /g;
$Response = lc $Response;
$Response = encode('utf-8',$Response);
return $Response;
}
Gern würde ich mich wieder mehr reinknien aber aktuell habe ich zuviele andere Verpflichtungen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

gregorv

ZitatGut erklärt; genau da könnte man ggf. ja mal versuchsweise ansetzen.
Zumindest könnnte man, wenn es denn geht, sicherstellen, dass der DialogTimeout nicht größer als die Kaldi Maximum Duration ist. Muss man aber vorsichtig sein, weil ein zu großer Wert für Maximum Duration den Timout plötzlich auf 15 Sekunden zurückspringen läßt (ich hatte mal 120 Sek. probiert - werde das Thema mal im Rhaspy Forum unterbringen)

ZitatEin einfaches diff hätte dir da vermutlich schon weiter geholfen
Das hatte ich sogar zuerst gamacht und diese Änderungen auch gesehen, aber nicht mit
ZitatInitialisierung des Arrays, müßte ggf. der Einfachheit halber auf die push-Variante
in Verbindung gebracht. Probiere ich mal.

überhaupt noch braucht, weil "analyzeMQTT.." Mein Lösungsansatz war noch der aus der früheren Modul Version und da ging es ohne das nicht. Teste ich auch.

@Jens
Zitatmuss tatsächlich "flacher Text" sein. Ein Array oder Hash müsste dann zerlegt werden
Mhhhh Bei customData sind, soweit ich weiß, die möglichen Werte ja flexibel. Wer das verwendet, muss daher vor dem Lesen immer erst prüfen, was da drin defined ist. Demnach sollte ein hash als Wert grundsätzlich keine Probleme machen.
Als Parameter, der im Modul abgefragt wird, hast Du aber Recht. Die beste Lösung wäre, dass ein Parameter auf root Ebene.
Ich habe daher den Parameter silent in die sub Define unter:
for (keys %{$h}) {
...              |      |
...sessionTimeout|silent|handleHotword|noChangeover|experimental|Babble|autoTraining)\z}xm;
eingetragen und kann den damit im return hash für CustomIntents verwenden. Die Abfragen im Modul Code ändere ich entspechend.

gregorv

#39
@BetaUser
Da ist mal wieder bestätigt, warum ich hashes nicht mag - ich weiß nie so genau, was Perl daraus macht - bevorzuge eindeutig JSON aber das ist mit Perl ja kaum zu handhaben.
ZitatHängt vermutlich an der Notation der Initialisierung des Arrays, müßte ggf. der Einfachheit halber auf die push-Variante umgestellt werden?
Nee, war am Anfang, wo Du das erste Element in @updatedList reinschreibst. Das muss @updatedList = $hash->{NAME}; sein, also ohne []. push macht offenbar aus einer Variablen automatisch ein Array mit zwei Elementen. Hätte ich auch mit [] initialisiet.
weiter unten war noch ein push @updatedList, $hash->{NAME}; , wohl nur ein Schönheitsfehler - ich hab es sicherheitshalber auskommentiert
Die Fehlermeldung ist jetzt jedenfalls weg und die Funktion wieder da.

gregorv

Test ABBRUCH!
In der Modulversion verschwinden offenbar session data - nach längerer Suchzeit habe ich aufgegeben.
Verhalten ist: sobald die Stop session offen ist kommt auf alle Antworten (inclusive hotword) ein IntentNotRecognized und die Session wird silent geschlossen.
resetInput ist nicht mehr da und in $data fehlen Daten aus dem ursprünglichen return hash (sind auch im haupt hash nicht mehr da) und der Intenfilter ist auf  ["ConfirmAction","CancelAction"] geändert.


Mit der alten Modulversion werde ich weitermachen und dann nach und nach die Änderungen einbauen - mal sehen, ab wann es dann klemmt.

JensS

#41
Hab mir nochmal session_timeout angeschaut und keine Möglichkeit zur Änderung während der Laufzeit gefunden.
https://github.com/rhasspy/rhasspy-dialogue-hermes/blob/0d697cb1631880688fd484177f1cdf50351f4a3e/rhasspydialogue_hermes/__init__.py#L130

Um das umzusetzten, müsste einiges in Rhasspy selbst angepasst werden. In customData könnte man ein session_timeout unterbringen und in https://github.com/rhasspy/rhasspy-dialogue-hermes/blob/0d697cb1631880688fd484177f1cdf50351f4a3e/rhasspydialogue_hermes/__init__.py#L368 in eine neue Variable schreiben.

Dann müsste man nur noch die Variable als zusätzlichen Parameter bis zu https://github.com/rhasspy/rhasspy-dialogue-hermes/blob/0d697cb1631880688fd484177f1cdf50351f4a3e/rhasspydialogue_hermes/__init__.py#L773 schleusen und fertig.  8)

Meine Erfahrungen mit Codevorschlägen bei https://community.rhasspy.org sind aber eher ernüchternd...

Gruß Jens

p.s. Die einzige Möglichkeit zur Änderung von session_timeout liegt wohl aktuell darin, den Wert in supervisord.conf vor dem Programmaufruf anzupassen.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

gregorv

@Jens
ZitatcustomData könnte man ein session_timeout
ist schon drin und im Modul angepasst und funktioniert. Man sollte nur den Timeout in Rhasspy größer einstellen, sonst kommt nach dessen Ablauf IntentNotRecogized und die session wird früher beendet.
Mit der auch impementierten 'wiebitte?' Funktion im Modul wird die Session nicht beendet und nach dem 'wieBitte?' weiter auf ein gültiges Kommando gelauscht - bis eben zum fhem timeout.

JensS

Sorry, wo genau? 

@Beta-User
Gibt's eine Möglichkeit in rasppySpezials ein customData mitzuschicken?
Teste gerade eine simple Implementation im Code.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

gregorv

#44
@Beta-User
MEIN ENTWURF
Ich habe Deinen Code weitgehend eingearbeitet und habe die Bereiche, wo noch ToDos sind markiert '@@@@'. Sonstige Änerungen von mir sind mit @@@ gekennzeichnet. Die Funktion ist soweit in Ordnung (Schöheitsfehler im Log, die Ansage für DefaultCancelConfirmation kommt nicht und 'SilentCancelConfirmation' => q{}, fuktioniert doch nicht. Da die Funktionalität aber störungsfrei genutzt werden kann, habe ich die 10_RHASSPY.pm und die rhasspy-de.cfg mal zum Testen angehängt.
Neue Funktionen:
Ein CustomIntent kann nach Absetzen eines FHEM Befehls auf weitere Anweisungen warten.
Anweisungen (auch Geräusche), die nicht zum IntentFilter passen, werden mit 'wie bitte?' oder so quittert und die Anweisung kann korrekt wiederholt werden.
Der Dialog wird so lange offen gehalten bis ein einstellbarer sessionTimeout abgelaufen ist.
Sagt man währen der Wartezeiten ein beliebiges 'hotword' wird sofort eine neue Session gestartet und ein anderes Kommando kann abgesetzt werden.
Die 'Warte-Session' wird, je nach Einstellung, ohne Ansage beendet.

Steuerung:
Abbrechen eines bestehenden Dialges und sofort neues Kommando aktivieren (ist für alle Dialoge möglich):
Im betreffenden Sentence in Rhasspy das optionale Wort [porcupine:{resetInput}] einfügen. Oder als zusätzliches Word (der|die|das|porcupine:{resetInput}) anhängen. Dieses 'Hotword' kann ein beliebiges Wort sein, auch unterschiedlich für jeden Sentence
Auch ist das bei jedem Sentence möglich, bei dem eine Rückfrage erfolgen könnte. Es wird dadurch kein neuer Intent gestartet, sondern auf 'höherer' Ebene abgefangen.

Weiteres funktioniert nur bei einem CustomIntent, weil Daten zur Steuerung im 'return' als hash übergeben werden müssen:

Maximale Dauer des Dialoges: "sessionTimeout"=> int, Int ist ein numerischer Wert z.B. AttrNum($name,'drive-up-time-to-open', 30) , also die Zeit, die bestimmter ein Rollladen zum Hochfahren benötigt.
Wichtig ist, die in Rhasspy eingestellte Zeit unter Maximum Duration: (unter STT) auf einen großen Wert einzustellen UND ! oben ist dazu ein Fehler beschrieben.

'WieBitte' Funktion, falls Rhasspy in der Dialog Zeit ein IntentNotRecognized erkennt (Geräusch, falsches Kommando, ...)
Dafür sind folgende Einstellungen nötig:
° "what"=>"true", aktiviert die Rückfrage (die man ignorieren kann) und der Dialog bleibt offen. Das kann auch mehrfach (während der Dialogzeit) vorkommen.
   In der Datei rhasspy-de.cfg kann man eigene Wünsche konfigurieren z.B. "RetryIntent": "wiebitte?|waaas:|bitte nochmal|häääh:",
° "intentFilter"=>["BlindStop"], muss nicht sein, ist aber sehr sinnvoll. Sonst kann man ggf. die Rollladen-Fahrt nicht mehr anhalten. BlindStop kann natürlich ein
   beliebiger Intent sein und es können auch mehrere Intents angegeben werden.
° "silent"=>int, - wobei int ein binär kodierter Wert ist, mit dem eine stumme Ausgabe an mehreren Stellen eingestellt werden kann.
   Im Moment funktioniert ohnehin nur 2, was SilentTimeout entspricht und dafür sorgt, dass die Ansage nach Ablauf des Dialoges unterdrückt wird.
   Mögliche andere Werte sind SilentIntentNotRecognized = 1 und SilentCancel = 4 bzw Kombinationen davon durch Addition (z.B SilentTimeout und SilentCancel entspricht 6)
° mit dem bereits bekannten Parameter "text":"gestartet" legt man die Antwort fest. Ich erwähne das hier nur, weil die so kurz wie möglich sein sollte
   sonst ist der Rollladen schon unten, bevor man Stop sagen kann

Beispiel beim Einsatz als Rollladensteuerung (da werde ich noch ein BeispielIntent zu liefern):
Sage 'Rollladen im Arbeitszummer zu' -> Antwort:'gestartet'. Nun gibt mehere Möglichkeiten:
1. Sage 'Stop', -> Antwort:'Rollladen angehalten'
2. Es fällt der Schlüssel auf den Boden man Hüstelt oder sag Mülleimer -> Antwort 'Wie bitte' -> anschließend sage 'Anhalten'  -> Antwort 'Rollladen angehalten'
3. Sage das Hotword -> Rhasspy reagiert als habe er das 'Wake Word' gehört (mit Abspielen der wav Datei unter Rhasspy Wake WAV) und ein beliebiges anderes Kommando kann gegeben werden.