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

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

Vorheriges Thema - Nächstes Thema

kud

Danke für die Ausführung.
Wenn ich die App "forke" bekomme ich aber Deine Änderungen nicht mehr eingespielt. Hab ich das so richtig verstanden?

Thyraz

Ja, ich hoffe aber hier nur selten Änderungen machen zu müssen.
Und wenn, dann werde ich das hier schreiben und auch im Changelog im Post 1 vermerken.
Der Aufwand für dich wäre in dem Fall dieser:

in console.snips.ai den Device Slot öffnen und unten auf Export drücken.
Dann öffnet sich ein Fenster mit einem Textlisting das man sich rauskopieren kann.

Danach löschst du die geforkten Intents und die geforkte App aus deinem Acount.
Nun wieder die FHEM App runterladen (dann hast du den neusten Stand) und die Intents forken.
Dann in einem der Intents wieder auf Bearbeiten des Device Slots klicken.
Hier nun Import wählen und vorhin kopierten Text einfügen.

Danach kannst du den Assistenten mit Sam (oder durch herunterladen und manuell entpacken/kopieren) auf deiner Snips Installation aktualisieren.

Denke das sollte dann im Fall der Fälle in 2-3 Minuten erledigt sein.
Das gehört sicher auch noch in die Doku als Punkt "Assistent updaten"
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

Ok, die Sache wird doch noch einfacher. 8)

Habe gerade eben das hier entdeckt:
https://snips.gitbook.io/documentation/advanced-configuration/asr/dynamic-vocabulary

Man kann die Slots auch auf dem Zieldevice über MQTT Nachrichten um weitere Wörter erweiteren.
Der Assistent aktualisiert danach automatisch sein Sprachmodell.

Ich könnte also alle snipsNames (von Geräten im Raum Snips) sowie auch die roomNames über das Modul sammeln.
Dann könnte man über ein set mySnips updateIntentSlots o.Ä. einfach die Slots befüllen.

Dann müsste ihr überhaupt nichts mehr forken, was den Einrichtungsaufwand nochmal minimieren würde.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

MadMax

Hallo,

sehr geile Geile sache!
Ich bin begeistert, genau das habe ich gesucht.

Aber leider funktioniert dies nicht bei mir.
Snieps sagt immer das etwas schief gegangen ist.

Im Fehm Log steht.
2018.07.24 11:09:07 5: publish received for hermes/intent/MadMax:SetOnOff, {"sessionId":"c00588ca-245b-44b8-8313-9e385de51e1f","customData":null,"siteId":"default","input":"licht im wohnzimmer einschalten","intent":{"intentName":"MadMax:SetOnOff","probability":0.873276},"slots":[{"rawValue":"licht","value":{"kind":"Custom","value":"licht"},"range":{"start":0,"end":5},"entity":"de.fhem.Device","slotName":"Device"},{"rawValue":"wohnzimmer","value":{"kind":"Custom","value":"Wohnzimmer"},"range":{"start":9,"end":19},"entity":"de.fhem.Room","slotName":"Room"},{"rawValue":"einschalten","value":{"kind":"Custom","value":"an"},"range":{"start":20,"end":31},"entity":"de.fhem.OnOffValue","slotName":"Value"}]}
2018.07.24 11:09:07 5: received message '{"sessionId":"c00588ca-245b-44b8-8313-9e385de51e1f","customData":null,"siteId":"default","input":"licht im wohnzimmer einschalten","intent":{"intentName":"MadMax:SetOnOff","probability":0.873276},"slots":[{"rawValue":"licht","value":{"kind":"Custom","value":"licht"},"range":{"start":0,"end":5},"entity":"de.fhem.Device","slotName":"Device"},{"rawValue":"wohnzimmer","value":{"kind":"Custom","value":"Wohnzimmer"},"range":{"start":9,"end":19},"entity":"de.fhem.Room","slotName":"Room"},{"rawValue":"einschalten","value":{"kind":"Custom","value":"an"},"range":{"start":20,"end":31},"entity":"de.fhem.OnOffValue","slotName":"Value"}]}' for topic: hermes/intent/MadMax:SetOnOff
2018.07.24 11:09:07 5: Intent: SetOnOff
2018.07.24 11:09:07 5: Parsed value: licht for slot: Device
2018.07.24 11:09:07 5: Parsed value: Wohnzimmer for slot: Room
2018.07.24 11:09:07 5: Parsed value: an for slot: Value
2018.07.24 11:09:07 5: handleIntentSetOnOff called


mein Licht zum testen.

snipsMapping SetOnOff=state,valueOff=off,cmdOn=on,cmdOff=off,GetOnOff=off,valueOff=on
snipsName licht
snipsRoom wohnzimmer

habe ich was falsch, gemacht?

Gruß
Max
Lenovo M910Q Tiny Debian 12, FHEM 6.3, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

MadMax

Alles klar, Error in Front of Display...

das Device muss ja in den Raum Snips...

Sorry...

Aber echt super das ganze, danke
Lenovo M910Q Tiny Debian 12, FHEM 6.3, 2x Siemens Logo 0BA7, Homematic CCU3, Philips HUE, 5x SMA Wechselrichter, BYD HVM, SMA EVCharger, Daikin Wärmepumpe über CAN

Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/MadMax

Thyraz

#20
Wie verwenden die meisten von euch die Lichtsteuerung per Sprache?

Habt ihr mehrere per FHEM schaltbare Lampen in den Räumen?
Sollte sowas wie "Licht ausschalten" also mehrere Lampen  im aktuellen Raum deaktivieren?

Wenn ja, wäre "Licht" ja an sich kein einzelnes Device.
Man müsste also auch beim OnOff Intent noch "Gerätetypen" haben statt nur einzelne Geräte.

Ähnlich wie bei GetNumeric wo ich ja auch plane, dass Frage nach "Wie ist die Temperatur im Wohnzimmer" automatisch das Device mit dem passenden snipsMapping findet ohne das Gerät Thermometer nennen zu müssen.

Klar kann man sich da aktuell auch schon irgendwie behelfen (Dummy Licht anlegen, "Licht" als Namen im Snips Device-Slot hinzufügen, Alle Lichter per Notify abschalten wenn Dummy geschaltet wird).
Aber das ist ja schon recht umständlich.

Wenn das für euch Sinn macht / gewünscht ist, müsste ich noch einen 4ten Slot "Type" im SetOnOff Intent hinzufügen (bisher Device, Room, Value).
Hier dann mal als ersten Wert "Licht" hinzufügen und als Synonyme "Lampen, Lichter, Alle Lampen, Alle Lichter".

Dann wüsste ich, dass wenn der Slot Type (mit dem Wert Licht) statt der Slot Device belegt ist,
ich mir alle Geräte mit passendem snipsRoom und snipsMapping SetOnOff=state,cmdOn=on,cmdOff=off,type=Licht heraussuchen muss.

Ihr müsstet dann halt die App und Intents nochmal neu forken damit das auch bei euch klappt.

P.S. die Funktion eigene Intents mit Perl-Funktionen in einer 99_MyUtils.pm zu verknüpfen sollte soweit fertig sein. :)
Muss das nur noch heute Abend etwas ausführlicher testen und ne kleine Anleitung verfassen.
Dann stell ich die Version zum Download auf Github.
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

Hmm..

zZeit steuere ich meine Hues über Alexa und entsprechender Gruppierung zB. Wohnzimmer.
So gesehen macht der 4. Slot einen Sinn. Jedoch wenn Jemand einen kompletten Raum mit Licht und Schaltern ausschalten will geht das auch nicht.
Vielleicht wäre die Geschichte mit einem Notify doch flexibler.

Das mit dem Forken finde ich nicht besonders elegant. (besonders wenn man eigentlich den Ablauf bei Snips nocht nicht vollständig verstanden hat like me ;-)
Schicke wäre schon, wie von Dir angesprochen, wenn man die Devices von FHEM updaten könnte.


Thyraz

Zitat von: kud am 25 Juli 2018, 17:19:21
Jedoch wenn Jemand einen kompletten Raum mit Licht und Schaltern ausschalten will geht das auch nicht.

Du meinst wenn man zusätzlich zu den Lichtern noch Geräte ausschalten will?

Zitat von: kud am 25 Juli 2018, 17:19:21
Vielleicht wäre die Geschichte mit einem Notify doch flexibler.

Klar. Frei programmierbar ist immer flexibler, aber ein gewisser Grundstock an Funktionalität erwartet man auch irgendwie von einem Sprachassistenten.
Das "Alle Lampen aus" bekommen wahrscheinlich Siri und Alexa auch hin.
Aber ich stelle es mal zurück und grübel noch ein wenig darüber.

Zitat von: kud am 25 Juli 2018, 17:19:21
Das mit dem Forken finde ich nicht besonders elegant. (besonders wenn man eigentlich den Ablauf bei Snips nocht nicht vollständig verstanden hat like me ;-)
Schicke wäre schon, wie von Dir angesprochen, wenn man die Devices von FHEM updaten könnte.

Das kommt noch, aber am Wochenende geht es erstmal 2 Wochen in den Urlaub und davor wird das nichts mehr. ;)
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

#23
Ok, hier ist die neue Version zum Erstellen eigener Custom Intents.
Von Github downloaden, nach /opt/fhem/FHEM kopieren und dann ein reload 10_Snips.pm oder shutdown restart durchführen.

Das Ganze dient dazu, eigene Abfragen mit Snips erstellen zu können, die über das normale Schalten oder Nummern abfragen hinaus geht.
Auch die Möglichkeit Fragen natürlicher formulieren zu können ist ein weiterer Vorteil.

So lassen sich die Tage bis zur nächsten Restmüll-Leerung im Kalender sicher auch mit dem GetNumeric Intent ermitteln.
Die Frage dazu müsste aber reichlich komisch formuliert werden. (Wie hell ist der Restmüll wäre z.B. eine mögliche Variante  ;D)

Über einen eigenen Intent mit selbst definierten Beispielsätzen wäre hingegen so etwas möglich:
Hey Snips, wann wird der Restmüll abgeholt.


Als kleines Beispiel erstellen wir hier einen Intent der zwei Werte addieren kann.
Evtl. hilft dies auch ein wenig besser zu verstehen wie die Intents und auch Snips funktionieren.

Auf console.snips.ai:
Zitat
Create new app: Sprache "German", Name "CustomIntents"
Den eigenen Assistant auswählen, add App wählen -> My Apps -> Only show apps with actions deaktivieren -> Ap CustomIntents hinzufügen
(Die App bereits vor dem Erstellen des Intents zum Assistenten hinzuzufügen ist wichtig, sonst sind nicht alle Standard Slottypes wie z.B. snips/number verfügbar, hat mich einige Nerven gekostet das rauszufinden.)
CustomIntents -> Edit App
Create new Intent: Name "Calculation"
Add Slot: Name "Number1", Type "snips/number"
Add Slot: Name "Number2", Type "snips/number"
Add Slot: Name "Operator", Type Add Slot -> Name "Operator"

Im neuen Slottype auf Import und dort einfügen:

plus,
geteilt, geteilt durch
mal,
minus,


Close

Auf die 3 Punkte rechts neben Training Examples klicken -> Import Examples
Dort einfügen:

Was ist das Ergebnis von [5](Number1) [plus](Operator) [4](Number2)
Was ergibt [5](Number1) [plus](Operator) [4](Number2)
Was gibt [5](Number1) [plus](Operator) [4](Number2)
Was macht [5](Number1) [plus](Operator) [4](Number2)
Wieviel ist [5](Number1) [plus](Operator) [4](Number2)

Save drücken

Damit sind wir mit dem neuen Intent fertig und aktualisieren den Assistant auf dem Snips Rechner (runterladen/entpacken oder über sam install assistant).

Nun in Fhem im Snips Device das Attribut "snipsIntents" mit folgendem Inhalt füllen:

Calculation=snipsCalc(Number1,Operator,Number2)"


Danach in eurer 99_myUtils.pm eine neue sub einfügen:

# Calculation Intent
sub snipsCalc($$$) {
# Übergebene Parameter in Variablen speichern
my ($val1, $operator, $val2) = @_;

# Standardantwort festlegen
my $response = "Dafür muss ich nochmal in die Nachhilfe";

if ($operator eq "plus") {
# Antwort überschreiben mit dem Ergebnis
$response = "Das Ergebnis ist " . ($val1 + $val2);
}

# Antwort an das Snipsmodul übergeben
return $response;
}


Danach solltet ihr auf die Spracheingabe Was ist 4 plus 4 die Antwort Das Ergebnis ist 8 erhalten.

Noch ein Hinweis zum Erstellen eigener Intents:
Wählt als Beispielsätze eher ausführliche Sätze als allzu kurze Varianten (z.B. Schalte die Deckenlampe im Wohnzimmer aus).
Anhand der Beispielsätze erstellt Snips das Sprachmodell für den Assistenten.
Haben nun einige Intents Beispielsätze welche ausschließlich aus den Werten der einzelnen Slots bestehten (z.B. "Deckenlampe Wohnzimmer aus" was Device/Room/Value entspricht),
wird Snips irgendwann Probleme bekommen hier ein sinnvolles Modell zu kreieren.

Das merkt man daran, dass die Kurzformen in einigen Intents dann plötzlich nicht mehr funktionieren.
Gegenteilig zu dem was man vermuten würde, führt also gerade das Vermeiden der Kurzformen als Beispielsätze dazu,
dass die Kurzformen später alle einwandfrei funktionieren (Über die möglichen Werte der Slots erkennt Snips den Intent dann problemlos).

Das kommt die Tage auch noch in die Doku mit rein, heute Abend aber nicht mehr. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

der-Lolo

Wahrscheinlich kann man doch gut mit LightScene arbeiten, oder?

Zitat von: kud am 25 Juli 2018, 17:19:21
Hmm..

zZeit steuere ich meine Hues über Alexa und entsprechender Gruppierung zB. Wohnzimmer.
So gesehen macht der 4. Slot einen Sinn. Jedoch wenn Jemand einen kompletten Raum mit Licht und Schaltern ausschalten will geht das auch nicht.
Vielleicht wäre die Geschichte mit einem Notify doch flexibler.


mark79

Super Sache. Das mit den Restmüll werde ich am Wochenende mal probieren. :)

Ganze Räume schalte ich mit dem MSwitch Modul von Byte. Aber mit Lightscene würde das auch gehen.
Oder eine structure, wenn alle Geräte den selben state für on/off besitzen.

Zitat von: Thyraz am 25 Juli 2018, 22:17:10
Haben nun einige Intents Beispielsätze welche ausschließlich aus den Werten der einzelnen Slots bestehten (z.B. "Deckenlampe Wohnzimmer aus" was Device/Room/Value entspricht),
wird Snips irgendwann Probleme bekommen hier ein sinnvolles Modell zu kreieren.

Das merkt man daran, dass die Kurzformen in einigen Intents dann plötzlich nicht mehr funktionieren.
Gegenteilig zu dem was man vermuten würde, führt also gerade das Vermeiden der Kurzformen als Beispielsätze dazu,
dass die Kurzformen später alle einwandfrei funktionieren (Über die möglichen Werte der Slots erkennt Snips den Intent dann problemlos).
Mich hatte das schon gewundert, warum "hey snips, Wohnzimmer an" nicht funktionierte. Es kam immer, "da ist leider etwas schief gelaufen".

Ich musste es dann immer umformulieren, etwas so: "hey snips, schalte bitte das Wohnzimmer an", dann ging es.

Du meinst die Training Examples. Da habe ich auch kurze Sachen drin, wie:
Wohnzimmer an
Staubsauger an
Küche an

Aber auch etwas längere Sätze... heißt also, die kurzen wie oben, sollten lieber raus?
Stattdessen lieber längere Sätze mit verschiedenen Synonymen für an/aus bilden?

Muss man eigentlich beides formulieren für "an" und "aus", oder reicht es wenn man es nur für "an" hinterlegt?

Hast du eigentlich ein Timer umgesetzt? Die vorgefertigten Skills oder Apps gehen ja leider nicht, auf unserer Hardware. Habe zwei Module ausprobiert...
Das ist die meist genutzte Funktion bei uns, jedenfalls in der Küche...


Viele Grüße
Mark
Rock64 4GB mit Debian Strech, FHEM im LXC, Sonoff Switches/Touch, HM Thermostate, HMUART/Zigbee2MQTT@MapleCUN, ESP RGBWW Wifi Controller, ESP8266 Door Sensor/Briefkastenwächter, BT CSL Stick, BT iTags, Alexa, FireTV, RPi2 mit Kodi, Xiaomi Vacuum v1/Smarthome Komponenten

Thyraz

Zitat von: mark79 am 26 Juli 2018, 09:50:10
Super Sache. Das mit den Restmüll werde ich am Wochenende mal probieren. :)

Ich hab hier in der Doku auch nochmal was eingetragen dazu:
https://github.com/Thyraz/Snips-Fhem/blob/master/README.md#f%C3%BCr-fortgeschrittene-eigene-custom-intents-erstellen-und-in-fhem-darauf-reagieren


Zitat von: mark79 am 26 Juli 2018, 09:50:10
Mich hatte das schon gewundert, warum "hey snips, Wohnzimmer an" nicht funktionierte. Es kam immer, "da ist leider etwas schief gelaufen".

Ich musste es dann immer umformulieren, etwas so: "hey snips, schalte bitte das Wohnzimmer an", dann ging es.

Du meinst die Training Examples. Da habe ich auch kurze Sachen drin, wie:
Wohnzimmer an
Staubsauger an
Küche an

Ich hab die kurzen Sätze mittlerweile rausgeschmissen, nachdem ich das gemerkt habe.
Aber durch das Forken kommen die Änderungen halt nicht bei dir an.
Du müsstest an sich deine Devices (und evtl. Räume falls du die verändert hast) exportieren,
dann geforkte App und geforkte Intents aus deinem Account löschen (nicht nur aus dem Assistenten).

Da merkt man mal wieder wie bescheiden die aktuelle Lösung mit dem forken ist. ;)

Ob die Kurzformen nach Änderungen an den Beispielsätzen gehen kann man übrigens auch direkt auf snips.console.ai testen:
Einfach mal "Deckenlampe an" rechts in der Seitenleiste eingeben.
Im JSON Gebilde darunter sollte dann der Slot Device und der Slot Value entsprechend auftauchen.

Zitat von: mark79 am 26 Juli 2018, 09:50:10
Muss man eigentlich beides formulieren für "an" und "aus", oder reicht es wenn man es nur für "an" hinterlegt?
Nein, verschiedene Werte der Slots sind egal.
Es geht eher um Beispiele wie:
- Mache die Deckenlampe im Wohnzimmer aus
- Schalte die Deckenlampe im Wohnzimmer aus

Zitat
Hast du eigentlich ein Timer umgesetzt? Die vorgefertigten Skills oder Apps gehen ja leider nicht, auf unserer Hardware. Habe zwei Module ausprobiert...
Das ist die meist genutzte Funktion bei uns, jedenfalls in der Küche...

Vor lauter Programmieren am Modul hab ich noch nichtmal meine Geräte alle in Snips eingebunden. ;D

Aber das wäre ja auch eine hervorragende Übung für einen Custom Intent. ;)
Hey Snips, stelle einen Timer auf 6 Minuten
In der Perl Funktion ein AT oder Internal Timer starten und beim Zeitende ein Snip say Timer fertig ausführen. :)

edit: Wobei Timer stellen ja auch irgendwie eine Grundfunktionalität der meisten Assistenten ist.
Evtl. sollte ich das auch mal als Standard-Intent mit ins Modul aufnehmen.
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

Was mir gerade einfällt.

Ist es möglich über Snips eine Spracheingabe zu machen und NUR über FHEM (TTS oä.) ausgeben zu lassen?

Thyraz

Also das Snips TTS Modul überhaupt nicht zu verwenden, sondern alle Ausgaben des Snips Moduls auf ein FHEM TTS Modul umzuleiten?
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

#29
Zitat von: Thyraz am 26 Juli 2018, 12:01:45
Also das Snips TTS Modul überhaupt nicht zu verwenden, sondern alle Ausgaben des Snips Moduls auf ein FHEM TTS Modul umzuleiten?
Ja. Denn ich habe schon einen guten/lauten Lautsprecher am FHEM-Pi dran ;-)

Das wäre die Lösung hier zu Hause wo ich Internet habe. Im Garten sieht es anders aus. Da sollte ein Pi mit FHEM und Snips ohne Internetanbindung laufen.