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

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

Vorheriges Thema - Nächstes Thema

Thyraz

Zitat von: ahlermi am 12 September 2018, 07:21:35
das klappt.

Hab dir hier mal ne angepasste Version erstellt, die einiges loggen sollte.
Einfach wieder mit sudo python3 /opt/snips-volume/snips-volume.py starten.

Dann über das Fhem Modul versuchen die Lautstärke zu ändern.

Danach die Ausgabe hier posten.
Hoffe damit finden wir endlich woran es liegt...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

eurolift

Hallo Thyraz

Nach update läuft errorResponse nicht mehr.Ansonsten geniales Modul.
Achso kämpfe gerde mit Uhrzeitansage.Am besten hört sich es noch mit Status an.

Thyraz

Hi eurolift,

die Änderung wollte ich eigentlich erst später mit dem nächsten Update verkünden,
aber der Zwischenfix heute Morgen hat das nun schon aktiv geschaltet:

errorResponse wurde durch das Attribut response ersetzt.
Hier kann man bisher 3 verschiedene Keys setzen:
- DefaultError
- NoActiveMediaDevice
- DefaultConfirmation

Siehe aktualisierte Doku:
https://github.com/Thyraz/Snips-Fhem#attribute


Abfrage von Uhrzeit und Datum als Intent fehlt tatsächlich noch irgendwie als "Grundfunktionalität" des Moduls.
Habs mal zu den Todos dazu...
So richtig schön mit eigenen Fragen wäre das sonst nur mit nem Custom Intent möglich.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

ahlermi

Zitat von: Thyraz am 12 September 2018, 13:34:47
Hab dir hier mal ne angepasste Version erstellt, die einiges loggen sollte.
Einfach wieder mit sudo python3 /opt/snips-volume/snips-volume.py starten.

Dann über das Fhem Modul versuchen die Lautstärke zu ändern.

Danach die Ausgabe hier posten.
Hoffe damit finden wir endlich woran es liegt...

set Snips volume siteId="default" volume="77" ausgeführt, nix zu sehen

PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Thyraz

Langsam wirds kurios. ;)

Man sieht, dass er sich die richtigen Serverdaten holt und ebenso die siteId richtig bestimmt.
Es wird dann auch das on_connect Callback von der MQTT Library aufgerufen, da wir hier ja die Meldung "MQTT connected" ausgeben.
Er schafft es also auch wirklich sich zum Server zu verbinden.

Das Callback für ein eingehendes "hermes/sound/setvolume" Topic wird aber nie aufgerufen,
obwohl du den Befehl über FHEM abschickst.

Bleiben an sich noch folgende Möglichkeiten:
- FHEM schickt nichts ab
- Die verschickten Daten kommen nicht unbeschädigt an, so dass der MQTT Server oder das Snips-Volume Modul die Nachricht nicht verstehen.
- Das Python MQTT Modul bei dir hat irgendeinen Knacks weg

Kannst du dich mal lokal auf dem Snips Rechner mit mosquitto_sub zum MQTT Server verbinden und schauen ob da was reinkommt wenn du das Kommando von FHEM schickst?
Und auch ob das lesbar ist, oder irgendwelcher Kauderwelsch:


mosquitto_sub -v -h localhost -t hermes/sound/setvolume


Wenn ich dann über FHEM ein set Snips volume siteId="default" volume="100" schicke, kommt folgende Ausgabe im Terminalfenster:

hermes/sound/setvolume {"siteId":"default","volume":"100"}
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

marwal

Guten Abend Thyraz,

ZitatDann haben wir die Möglichkeit gefunden bei einem bereits installiertem Assistenten neue Begriffe zu den Slots hinzuzufügen.
Über eine MQTT Nachricht an Snips.

Ihr müsst euch also nicht mehr darum kümmern, dass Snips eure Geräte- und Raumbezeichnungen etc. kennt.
Das Modul übernimmt das durch den Befehl updateModel.

Das funktioniert aber nur, wenn das Snips Modul zum ASR-Inject installiert ist und der Service auf dem Rechner auch läuft.
Die Installation ist in der Doku im Kapitel Snips Installation -> Wichtig: ASR Injection installieren zu finden:
https://github.com/Thyraz/Snips-Fhem/blob/master/README.md#wichtig-asr-injection-installieren

Danach nochmal updateModel ausführen und erneut testen.

Klappt einwandfrei! Die gesprochenen Namen werden alle wunderbar erkannt!

Danke nochmal!

Martin

Thyraz

So, mal wieder eine neue Version:

Feature 1 hatten wir ja schon:

Attribut errorResponse gibt es nicht mehr, wird jetzt über Attribut response geregelt
Es können hierüber diverse Standardausgaben geändert oder stummgeschaltet werden.
Siehe Beschreibung hier: https://github.com/Thyraz/Snips-Fhem#attribute

Eigene NumericTypes
Ihr könnt nun eigene Types festlegen. Sei es nun der PH-Wert eures Teichs (;)) oder z.B. der Stromverbrauch eines Geräts.

Beispiel:
Zitat
snipsName Deckenlampe
snipsRoom Wohnzimmer
snipsMapping:

SetOnOff:cmdOn=on,cmdOff=off
GetOnOff:currentVal=pct,valueOff=0
SetNumeric:currentVal=pct,minVal=0,maxVal=99,map=percent,cmd=dim,step=30
GetNumeric:currentVal=pct,type=Helligkeit
GetNumeric:currentVal=power,type=Stromverbrauch


Hier wurde zum bestehenden GetNumeric Mapping zur Helligkeits-Steuerung ein weiteres hinzugefügt.
Der Type Stromverbrauch existiert ja bisher nicht und wird nachdem man das Mapping angelegt hat,
wieder über den Set-Befehl updateModel für Snips bekannt gemacht (ASR Inject).

Danach könnt ihr z.B. über Wie ist der Stromverbrauch der Deckenlampe im Wohnzimmer den Wert abfragen.

@tomster:
Wenn du das für den Teich umsetzen willst: Nach dem Ändern von snipsName, snipsRoom und snipsMapping am Besten den Assistenten neu installieren um die alten Wörter vom ASR Inject wieder loszuwerden und dann erst updateModel ausführen.
Sonst hast du nachher identische Werte in verschiedenen Slots. Zum Beispiel Type und Name (P H Wert), bzw. Name und Room (Teich).
Das dürfte schief gehen. ;)

Shortcuts
Angelehnt an Siri Shortcuts auf iOS oder Alexa Routinen.
Soll ermöglich auf einfache Weise (ohne Custom Intents) durch einen bestimmten Satz eine beliebige Aktion auszulösen.
Nachteil gegenüber einem Custom Intent ist dabei, dass der Satzbau nicht variable ist (Somit auch keine flexible Wertübergabe).

Es lassen sich damit aber eben ohne großen Aufwand eigene Abläufe definieren.

Beispiele wofür man das nutzen kann:
Hey Snips, wieviel Uhr ist es
Hey Snips, Stimmung gemütlich
Hey Snips, Stimmung hell
Hey Snips, sprenge den Rasen
Hey Snips, mach mir einen Kaffee


Definiert werden die Shortcuts im Attribut shortcuts des Snips Devices als ein Trigger=Cmd Eintrag pro Zeile.
Cmd kann dabei entweder ein FHEM Befehl wie set Lampe on, oder ein Perl-Ausdruck in geschweiften Klammern sein.
Die Perl Variante erlaubt es auch einen Text per return zurückzuliefern, der dann als Antwort ausgegeben wird.
In der Perl Variante kann außerdem über $ROOM auf den Raum zugegriffen werden, indem das Kommando eingesprochen wurde.

Hier mal noch zwei beispielhafte Zeilen für das shortcuts Attribut:

Wieviel Uhr ist es={return "es ist " . qx(date +%R);}
Stimmung hell={snipsSetSzene($ROOM,"hell")}


Die erste Zeile bastelt einfach die Anwort aus der aktuellen Uhrzeit zusammen, wodurch diese per TTS ausgegeben wird.
Die zweite Zeile ruft eine Funktion in meiner 99_myutils.pm auf, welche dann die entsprechende Szene im passenden Raum aktiviert.

Hier noch der Code der Funktion damit man sieht was hier passiert:

# Szenenwechsel über Snips
sub snipsSetSzene($$) {
my ($room, $scene) = @_;

if ($room eq "wohnzimmer") {
fhem("set LightsceneWohnzimmer scene $scene");
}

return "Szene $scene in raum $room aktiviert";
}


Achtung: Die Shortcuts Funktionalität ist im Moment noch etwas eingeschränkt durch die fehlende NLU-Inject Möglichkeit seitens Snips.
Dies betrifft vor allem sehr kurze Triggersätze.
Einzelne Worte klappen oft nicht, ab zwei Worten geht es meist.

Hintergrund:
ASR (Spracherkennung) bekommt über den Inject die Wörter mit und der Text wird dann verstanden.
NLU (Parser der den Sinn hinter dem erkannten Text erkennen soll) bekommt diese neuen Infos aber nicht mit.
Nennt man einen Trigger z.B. nur "hell" statt "Stimmung hell", blockt NLU das oft ab, wenn es das Wort nicht kennt.
In diesem Fall kommt der Failed "Dong" Sound und beim FHEM Modul kommt überhaupt kein erkannter Intent/Text an.

Dies sollte aber in Zukunft irgendwann nicht mehr gelten, da die Macher von Snips wohl schon an einer NLU-Inject Funktionalität testen.
Dann würde auch NLU den Sinn der neuen Wörter (zu welchem Intent und welchem Slot sie gehören) erkennen.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

ahlermi

Zitat von: ahlermi am 12 September 2018, 16:32:06
set Snips volume siteId="default" volume="77" ausgeführt, nix zu sehen


2018.09.13 07:19:41 5: set volume - value: siteId="default" volume="77"
2018.09.13 07:19:41 5: Params: siteId="default" volume="77"


nichts
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Thyraz

Moin ahlermi,

dann scheint FHEM tatsächlich nichts rauszuschicken.
Kannst du die Version mal einspielen?

Sollte mit verbose 5 auf dem Snips Device noch ein paar Zeilen mehr ins Log schreiben.
Am Besten auch mal das MQTT Device in Fhem, welches du für Snips eingerichtet hast noch auf verbose 5 setzen um zu sehen ob ggf. hier was beim senden schief geht.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

tomster

Die neue Version works like a charm! Vielsten Dank!
Und die Shortcuts finde ich genial! Ich meine aber, dass man die Shortcuts tunlichst in einem einzelnen Dummy-Device definieren sollte, um nicht durch Unübersichtlichkeit (attr in mehreren Devices) irgendwann soviele Shortcuts in den Devices verstreut hat, dass man sie nicht mehr findet...

ahlermi

Zitat von: ahlermi am 13 September 2018, 07:23:11

2018.09.13 07:19:41 5: set volume - value: siteId="default" volume="77"
2018.09.13 07:19:41 5: Params: siteId="default" volume="77"


nichts

2018.09.13 10:35:31 5: set volume - value: siteId="default" volume="77"
2018.09.13 10:35:31 5: Params: siteId="default" volume="77"
2018.09.13 10:35:31 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/10_SNIPS.pm line 1000.
2018.09.13 10:35:31 5: siteId:
2018.09.13 10:35:31 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/10_SNIPS.pm line 1001.
2018.09.13 10:35:31 5: volume:
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

tomster

Zitat von: ahlermi am 13 September 2018, 10:36:05
2018.09.13 10:35:31 5: set volume - value: siteId="default" volume="77"
2018.09.13 10:35:31 5: Params: siteId="default" volume="77"
2018.09.13 10:35:31 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/10_SNIPS.pm line 1000.
2018.09.13 10:35:31 5: siteId:
2018.09.13 10:35:31 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/10_SNIPS.pm line 1001.
2018.09.13 10:35:31 5: volume:

Schau Dir mal bitte die 10_SNIPS.pm mit nano oder vi auf dem Raspi (oder welchen Rechner Du auch immer verwendest) an. Ich trau mich fast wetten, dass es an Zeilenumbrüchen innerhalb des Codes liegt.

ahlermi

Ich habs im Griff, apt-get upgrade und reboot.

Nun kommt was an  :o

... zu früh gefreut, einstellen der Lautstärke klappt nicht


root@snips:~# systemctl stop snips-volume.service ; python3 /opt/snips-volume/snips-volume.py
MQTT Server:  localhost:1883
MQTT Host:  localhost
MQTT Port:  1883
Binding:  default@mqtt
SiteId:  default
MQTT connected
Received setvolume
Target SiteId:  default
Desired Volume:  77
Target SiteId matches SiteId of this device
Trying to adjust volume
No mastr mixer, fallback to PCM
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

Thyraz

Zitat von: tomster am 13 September 2018, 09:59:01
Die neue Version works like a charm! Vielsten Dank!
Und die Shortcuts finde ich genial! Ich meine aber, dass man die Shortcuts tunlichst in einem einzelnen Dummy-Device definieren sollte, um nicht durch Unübersichtlichkeit (attr in mehreren Devices) irgendwann soviele Shortcuts in den Devices verstreut hat, dass man sie nicht mehr findet...

@tomster freut mich, dass alles soweit funktioniert. :)
Waren doch einige Umbauten nötig, hab daher gestern noch fleißig getestet bis ich mir einigermaßen sicher war nichts Grundlegendes geschrottet zu haben. ;)

Zu den Shortcuts: Die sind ja gobal und nicht auf ein bestimmtes Device gemünzt.
Befinden sich also alle im Snips Device und nicht verstreut.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

micky0867

Zitat von: ahlermi am 11 September 2018, 13:13:35
Alsamixer stürzt ab wenn ich auf Soundkarte PS3Eye wechsle, wohl normal.

MQTT connected is eine Ausgaben.

Alles andere aus dem Log sind Eingaben.
Das lässt sich verhindern...
Dafür ist das Kernelmodul snd-usb-audio verantwortlich.
Mit dem Parameter ignore cntl_error=1 stürzt alsamixer bei mir nicht mehr ab.

modules.conf erweitern:
options snd-usb-audio ignore_ctl_error=1

Micky



Gesendet von meinem ONEPLUS A3003 mit Tapatalk