SNIPS: Sprachsteuerung (mittlerweile auch per Textcommands) über snips.ai

Begonnen von Thyraz, 21 Juli 2018, 20:28:48

Vorheriges Thema - Nächstes Thema

Neuhier

So, Alles auf 0 und neu hochgezogen.  8)
Jetzt hänge ich an der Zuordnung.
Könnte mal jemand einen Screenshot anhängen, wo ersichtlich ist, was z.B. in snipsIntents stehen muß?

Oder eine Beispielkonfiguration, nicht das aus dem GitHub, das bringt mich nicht weiter.
Stelle mich mal wieder schön blöd an, die grauen Zellen lassen langsam nach.  :-[

kud

Es muss nur SnipsRoom (Wohnzimmer), SnipsName(Thermometer) und SnipsMapping(GetNumeric:currentVal=temperature,type=Temperatur
GetNumeric:currentVal=humidity,type=Luftfeuchtigkeit) gefüllt sein.
SnipsIntent benutze ich zZ. noch gar nicht.

Neuhier

OK, Danke.
Habe hier
attr WH1080 snipsMapping GetNumeric:currentVal=temperature,part=1
attr WH1080 snipsName Temperatur
attr WH1080 snipsRoom Wetter


set Snips modelupdate durchgeführt.

"Hey Snips sage Wetter Temperatur"

Leider bekomme ich
lastIntentPayload

{"Type":"Temperatur","input":"temperatur","intent":"GetNumeric","probability":"0.936861","sessionId":"e2728130-56c5-4ede-acab-bc8682128a96","siteId":"default","type":"voice"}


nur "Es ist etwas schiefgegangen" zurück.

Thyraz

Zitat von: shilbert am 28 August 2018, 00:16:55
Du hast set <snipsDevice> say Dies ist ein Test implementiert. Kann man da ggf. noch den Namen eines Satelliten mitgeben ?

Stimmt, daran hab ich damals gar nicht gedacht.
Da wird immer siteId "default" übertragen.

Vorschläge für die Syntax?
set <snipsDevice> say siteId="schlafzimmer" text="bla bla"
So evtl?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

kud

Klingt richtig gut.
Kurze Frage zu "say".
In einem Notify lasse ich Snips sprechen my $snipsantwort = "Habe die Lautstärke auf $lautstaerkewert gestellt."; fhem("set Snips say $snipsantwort");
Snips sagt auch brav: "Habe die Lautstärke auf 80 gestellt.".."Eins"

Ist das der voiceResponse Wert  "1" ? Und warum wird dieser ausgesprochen?

Thyraz

Sehr gute Frage.

Habe "say" schon länger nicht mehr genutzt. Sehe im Code gerade nicht woher das kommen sollte.
Werde ich heute Abend mal testen.

Das Reading voiceResponse hat bei dir aber den Wert "1"?
Das sollte eigentlich die letzte Antwort sein, die Snips ausgegeben hat.

Dazu muss aber eigentlich vorher ein Intent von Snips reinkommen.

Falls das bei mir nicht passiert, brauch ich evtl. mal einen Mitschnitt vom MQTT und vom FHEM Log mit verbose 5 im Snips Modul...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

kud

Also das Ganze ist eine Quick und Dirty Lösung zur Umstellung der Lautstärke. Hier ist das "Gesamtkunstwerk".
Snips:.*Lautstärke.* {
my $stringzeile= ReadingsVal("Snips","lastIntentPayload",0) ;
my $startpos = index($stringzeile,"Value") ;
my $lautstaerkewert = substr($stringzeile,$startpos + 8,2);
my $lautprozent = "$lautstaerkewert%";
fhem("set SnipsVolume $lautstaerkewert");
system ("ssh remotecontrol\@192.168.1.157 amixer -c0 sset \'PCM\' $lautprozent");
my $snipsantwort = "Habe die Lautstärke auf $lautstaerkewert gestellt.";
fhem("set Snips say $snipsantwort");
}


Funktioniert...bis auf die "Eins"

Thyraz

Zitat von: Neuhier am 28 August 2018, 11:28:01
OK, Danke.
Habe hier
attr WH1080 snipsMapping GetNumeric:currentVal=temperature,part=1
attr WH1080 snipsName Temperatur
attr WH1080 snipsRoom Wetter


set Snips modelupdate durchgeführt.

"Hey Snips sage Wetter Temperatur"

Leider bekomme ich
lastIntentPayload

{"Type":"Temperatur","input":"temperatur","intent":"GetNumeric","probability":"0.936861","sessionId":"e2728130-56c5-4ede-acab-bc8682128a96","siteId":"default","type":"voice"}


nur "Es ist etwas schiefgegangen" zurück.

Mal der Reihe nach:

Temperatur ist kein guter Name für ein Gerät, Wetter evtl. auch nicht optimal für eine Ortsbezeichnung.
Erstens würde man das einen Menschen auch nicht so fragen: "Wie warm ist die Temperatur", oder "Wie ist die Temperatur von Temperatur im Wetter"
Zweitens ist Temperatur ein reserviertes Wort vom GetNumeric Intent um den Typ des zu lesenden Wertes zu bestimmen. Siehe hier unter GetNumeric -> Option type.
https://github.com/Thyraz/Snips-Fhem/blob/master/README.md#ger%C3%A4te-in-fhem-f%C3%BCr-snips-sichtbar-machen
Damit dürftest du Snips ziemlich verwirren. ;)

Ich würde daher Folgendes Vorschlagen (ich gehe durch die Bezeichnung davon aus, dass "Wetter" kein Innentemperaturfühler ist):

attr WH1080 snipsName Thermometer
attr WH1080 snipsRoom Garten

Statt "Garten" wäre evtl. auch "Draußen" eine Option.

Das Mapping ist auch sehr minimalistisch.
Wenn du bei GetNumeric keinen Type angibst, weiß Snips nicht um was für eine Art von Wert es sich handelt.
Du kannst dann manche bequemeren Abfragen nicht verwenden.

Nehmen wir an du würdest dein bisheriges Mapping weiterverwenden, dann könntest du den Wert so abfragen:
Wie ist die Temperatur vom Thermometer im Garten oder Wie ist die Temperatur vom Thermometer draußen

Eine Abfrage der Temperatur ohne explizite Nennung des snipsNames bekommt das Modul nicht hin,
da es kein GetNumeric Mapping im passenden snipsRoom vom type Temperatur findet.
Erweiterst du das Mapping so:

attr WH1080 snipsMapping GetNumeric:currentVal=temperature,part=1,type=Temperatur

erlaubt dir Snips auch solche Fragen:
Temperatur Garten bzw. Temperatur draußen
Wie warm ist es im Garten
Wie ist die Temperatur im Garten

Das Gerät mit dem snipsName Thermometer findet das Modul dann selbstständig über das Mapping und den passenden snipsRoom.

Du kannst so auch mehrere Geräte mit dem snipsName "Thermometer" in verschiedenen snipsRooms haben.
Steht in dem Raum in dem die angesprochene Snips-Installation steht auch ein Thermometer, kann man die Fragen für dieses Thermometer sogar noch verkürzen:
Wie warm ist es
Temperatur

Hoffe das bringt etwas Licht ins Dunkel...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

Zitat von: kud am 28 August 2018, 12:20:40
Also das Ganze ist eine Quick und Dirty Lösung zur Umstellung der Lautstärke. Hier ist das "Gesamtkunstwerk".
...
Funktioniert...bis auf die "Eins"

Wie sieht denn der lastIntentPayload aus?
Bzw. was sagst du um die Lautstärke umzustellen?

Evtl. reagiert das Modul da irgendwie drauf und gibt eine 1 als Antwort zurück.
(Warum auch immer :P)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

jowe

@Thyraz: Wie wäre es, für die einzelnen Snips Devices eigene Geräte zu erstellen?
Nutzt du oder kennst du snips Web Admin? Da werden automatisch die snips devices erstellt und man kann per drop-down ein device auswählen und z.B. Services starten/stoppen etc.
Vielleicht kannst du ja auch im Modul analog per autocreate für jedes Snips Device ein neues Gerät erstellen? Das würde vermutlich das Multiroom-Thema deutlich einfacher machen. Das heißt die Textausgabe, das Stummschalten etc. kann ich direkt bei den einzelnen Devices und muss nicht immer über das zentrale Snips-Device gehen.

Thyraz

@Neuhier:
falls es dir eher um eine Art Wettervorhersage geht, könnte man das auch über den Status Intent machen, da es einen richtigen Wetter Intent zur Zeit nicht gibt.

Hier kommt einem Zugute, dass die reine Nennung des Gerätenamens auch den Status Intent triggert.
Gibst du einem Gerät also den snipsName "Wettervorhersage" oder "Wetterbericht", kannst du durch Hey Snips, Wettervorhersage den Response Text des Status Intent ausgeben lassen.

Hier kann man ja im Format [Device:Reading] Werte in den frei wählbaren Text der ausgegeben wird einfügen.
Damit lässt sich notfalls auch eine komplexere Ansage basteln.

Wenn man den Intent noch schöner ansprechen will als nur "Wettervorhersage", bleibt im Moment nur noch ein Custom Intent.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

Zitat von: jowe am 28 August 2018, 12:57:40
@Thyraz: Wie wäre es, für die einzelnen Snips Devices eigene Geräte zu erstellen?

Ja, für das say und ein paar andere Dinge würde das sicher schon Sinn machen.

Probleme die ich sehe:
- Wir sind mit Snips schon ein Client Modul von 00_MQTT.pm
Keine Ahnung ob das Konzept des zweistufigen Modells in FHEM noch weiter getrieben werden kann für eine dritte Ebene

- Ich hab mir das noch nie angeschaut und habe noch keine Ahnung wie das genau umzusetzen ist.  :P
Als Anfänger was die Programmierung von FHEM Modulen angeht, weiß ich nicht ob ich mir das momentan ans Bein binden will. ;)
Zumindest im Moment noch würde ich die Zeit lieber in neue Features stecken.
Ich notiere mir das mal für ruhigere Tage. Das wird sofern möglich sicher einiges an Einarbeitung erfordern.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

kud

Zitat von: Thyraz am 28 August 2018, 12:38:33
Wie sieht denn der lastIntentPayload aus?
Bzw. was sagst du um die Lautstärke umzustellen?
Hier der Payload:
{"Type":"Lautstärke","Value":"90","input":"lautstärke auf neunzig","intent":"SetNumeric","probability":"0.6616878","sessionId":"1771ec5c-2028-4f53-9f9f-2525b8e823ca","siteId":"default","type":"voice"}

Die Spracheingabe war in diesen Fall "Stelle die Lautstärke auf 90". Das Gleiche funktioniert auch bei "Stelle die Lautstärke auf 90%".
In beiden Fällen ist voiceResponse = 1

jowe

Ja, das ist ehrlich gesagt auch eher "nice to have". Im Prinzip funktioniert ja jetzt schon alles was ich brauche. Mit den customIntents lässt sich auch schon eine Menge anstellen.
Nur das Thema hotword toggleOff funktioniert bei mir leider nicht. Ich kann zwar mqtt Befehle an Snips absetzen, aber dieser Befehl hat keinerlei Auswirkungen auf die Hotword-Erkennung (bei anderen mqtt Befehlen an Snips funktioniert es). Ich behelfe mir gerade damit, per snips-web-admin den Hotword service zu stoppen.
Zum gestrigen Thema mit den Lichtfarben:
Ich habe Lightscenes-Devices für alle Lampen und alle Räume mit einheitlichen Namen erstellt. Also z.B. LS_LAMPENNAME  und LS_RAUMNAME. Dort habe ich einheitlich benannte scenes definiert, z.B. blau. Wenn ich jetzt per customIntent für einen Raum oder ein Device eine Farbe nenne, setzt mir mein Script das ganze um, ungefähr so: set LS_[Device] scene [intent]. Also z.B. set LS_Wohnzimmer scene blau
Das ist zwar eine weiter Abhängigkeit zu einem anderen Modul, aber würde dir meiner Meinung nach einigen Aufwand bei deinem Modul sparen. Das funktioniert mit sehr wenig Aufwand bei mir ziemlich gut.

Thyraz

Zitat von: kud am 28 August 2018, 13:53:23
Hier der Payload:
{"Type":"Lautstärke","Value":"90","input":"lautstärke auf neunzig","intent":"SetNumeric","probability":"0.6616878","sessionId":"1771ec5c-2028-4f53-9f9f-2525b8e823ca","siteId":"default","type":"voice"}

Die Spracheingabe war in diesen Fall "Stelle die Lautstärke auf 90". Das Gleiche funktioniert auch bei "Stelle die Lautstärke auf 90%".
In beiden Fällen ist voiceResponse = 1

Ok, damit kommt Licht ins Dunkel:

Du hast versucht das Attribut errorResponse auf einen Leerstring zu setzen, was FHEM dann leider automatisch mit einer 1 befüllt.
Ab jetzt ist deine Standard-Fehlerausgabe "1". :P

Wenn du die deaktivieren willst, muss du daher das Attribut errorResponse auf den Wert disabled setzen.


Zum Thema an sich: Ich würde auch nicht versuchen den Intent so fies fehlschlagen zu lassen um dann den responseString selbst auszuwerten.
Ich weiß nichtmal ob die Parameter darin wirklich immer in der gleichen Reihenfolge kommen.

Außerdem versucht Snips bei dem Satz ja die Lautstärke im aktuellen Raum zu regeln (Von einem Audio-Gerät, nicht von Snips selbst).
Sprich, wenn du irgendwann deine Anlage in Snips einbindest, wird er Befehl plötzlich zusätzlich noch die Anlage regeln. ;)

Erstell dir doch einen Dummy und gib ihm einen den snipsName "Snips" und snipsRoom wo Snips eben steht.
Dazu ein Mapping SetNumeric vom Type Lautstärke das den state vom Dummy setzt.

Dann kannst du über Lautstärke von Snips auf 20 den state ändern.

Nun noch ein Notify auf die Events vom Dummy und damit deinen SSH Code an Snips abfeuern, damit die Lautstärke sich ändert.
Wenn die currentVal Option zum zurücklesen des zuletzt gesetzten Werts im SetNumeric Mapping konfiguriert ist,
klappt auch Snips leiser oder Snips lauter.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...